@iota-uz/sdk 0.4.44 → 0.5.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.
- package/LICENSE +21 -0
- package/README.md +11 -142
- package/dist/client-host/applet.d.ts +52 -0
- package/dist/client-host/applet.d.ts.map +1 -0
- package/dist/client-host/applet.js +24 -0
- package/dist/client-host/cache.d.ts +15 -0
- package/dist/client-host/cache.d.ts.map +1 -0
- package/dist/client-host/cache.js +27 -0
- package/dist/client-host/errors.d.ts +16 -0
- package/dist/client-host/errors.d.ts.map +1 -0
- package/dist/client-host/errors.js +45 -0
- package/dist/client-host/identity.d.ts +21 -0
- package/dist/client-host/identity.d.ts.map +1 -0
- package/dist/client-host/identity.js +28 -0
- package/dist/client-host/index.d.ts +11 -0
- package/dist/client-host/index.d.ts.map +1 -0
- package/dist/client-host/index.js +10 -0
- package/dist/client-host/portals.d.ts +30 -0
- package/dist/client-host/portals.d.ts.map +1 -0
- package/dist/client-host/portals.js +149 -0
- package/dist/client-host/protocol.d.ts +2 -0
- package/dist/client-host/protocol.d.ts.map +1 -0
- package/dist/client-host/protocol.js +2 -0
- package/dist/client-host/route.d.ts +29 -0
- package/dist/client-host/route.d.ts.map +1 -0
- package/dist/client-host/route.js +32 -0
- package/dist/client-host/rpc.d.ts +46 -0
- package/dist/client-host/rpc.d.ts.map +1 -0
- package/dist/client-host/rpc.js +90 -0
- package/dist/client-host/streaming.d.ts +43 -0
- package/dist/client-host/streaming.d.ts.map +1 -0
- package/dist/client-host/streaming.js +141 -0
- package/dist/client-host/transport.d.ts +26 -0
- package/dist/client-host/transport.d.ts.map +1 -0
- package/dist/client-host/transport.js +53 -0
- package/dist/lens/CascadePanel-DqOZFdR-.js +512 -0
- package/dist/lens/ChartDataEquivalent-BFDdHoQn.js +52 -0
- package/dist/lens/ChartHost-Bl2lxIqU.js +68 -0
- package/dist/lens/ChartPanel-CTIp_4YE.js +720 -0
- package/dist/lens/CoveragePanel-DZZWkjSv.js +131 -0
- package/dist/lens/DashboardPanels.d.ts +36 -0
- package/dist/lens/DashboardPanels.d.ts.map +1 -0
- package/dist/lens/GaugePanel-BcNdd_Wj.js +43 -0
- package/dist/lens/LensDashboard.d.ts +21 -0
- package/dist/lens/LensDashboard.d.ts.map +1 -0
- package/dist/lens/MapPanel-6sI_Ei9L.js +178 -0
- package/dist/lens/MetricFlowPanel-LzqevSPs.js +70 -0
- package/dist/lens/MetricHierarchyPanel-h6tJqRPg.js +72 -0
- package/dist/lens/MetricRelationshipPanel-CgckUvvJ.js +54 -0
- package/dist/lens/PrintReport-DJv4Rm_U.js +1351 -0
- package/dist/lens/TablePanel-Dh6bXlwM.js +619 -0
- package/dist/lens/adapter-zBDC8hbZ.js +29093 -0
- package/dist/lens/breakpoints.d.ts +37 -0
- package/dist/lens/breakpoints.d.ts.map +1 -0
- package/dist/lens/charts/adapter.d.ts +157 -0
- package/dist/lens/charts/adapter.d.ts.map +1 -0
- package/dist/lens/charts/echarts/adapter.d.ts +9 -0
- package/dist/lens/charts/echarts/adapter.d.ts.map +1 -0
- package/dist/lens/charts/echarts/distributions.d.ts +9 -0
- package/dist/lens/charts/echarts/distributions.d.ts.map +1 -0
- package/dist/lens/charts/echarts/events.d.ts +7 -0
- package/dist/lens/charts/echarts/events.d.ts.map +1 -0
- package/dist/lens/charts/echarts/options.d.ts +163 -0
- package/dist/lens/charts/echarts/options.d.ts.map +1 -0
- package/dist/lens/charts/echarts/theme.d.ts +49 -0
- package/dist/lens/charts/echarts/theme.d.ts.map +1 -0
- package/dist/lens/charts/echarts/tooltip.d.ts +79 -0
- package/dist/lens/charts/echarts/tooltip.d.ts.map +1 -0
- package/dist/lens/charts/index.d.ts +9 -0
- package/dist/lens/charts/index.d.ts.map +1 -0
- package/dist/lens/charts/keys.d.ts +8 -0
- package/dist/lens/charts/keys.d.ts.map +1 -0
- package/dist/lens/charts/overlays.d.ts +134 -0
- package/dist/lens/charts/overlays.d.ts.map +1 -0
- package/dist/lens/charts/palette.d.ts +54 -0
- package/dist/lens/charts/palette.d.ts.map +1 -0
- package/dist/lens/charts/scales.d.ts +26 -0
- package/dist/lens/charts/scales.d.ts.map +1 -0
- package/dist/lens/charts/shares.d.ts +44 -0
- package/dist/lens/charts/shares.d.ts.map +1 -0
- package/dist/lens/charts/text.d.ts +23 -0
- package/dist/lens/charts/text.d.ts.map +1 -0
- package/dist/lens/contract/index.d.ts +4 -0
- package/dist/lens/contract/index.d.ts.map +1 -0
- package/dist/lens/contract/palette.d.ts +13 -0
- package/dist/lens/contract/palette.d.ts.map +1 -0
- package/dist/lens/contract/schemas.d.ts +132 -0
- package/dist/lens/contract/schemas.d.ts.map +1 -0
- package/dist/lens/contract/types.d.ts +788 -0
- package/dist/lens/contract/types.d.ts.map +1 -0
- package/dist/lens/controls/Calendar.d.ts +24 -0
- package/dist/lens/controls/Calendar.d.ts.map +1 -0
- package/dist/lens/controls/CompareFilterControl.d.ts +23 -0
- package/dist/lens/controls/CompareFilterControl.d.ts.map +1 -0
- package/dist/lens/controls/FacetFilterMenu.d.ts +29 -0
- package/dist/lens/controls/FacetFilterMenu.d.ts.map +1 -0
- package/dist/lens/controls/FilterBar.d.ts +30 -0
- package/dist/lens/controls/FilterBar.d.ts.map +1 -0
- package/dist/lens/controls/PeriodFilterControl.d.ts +50 -0
- package/dist/lens/controls/PeriodFilterControl.d.ts.map +1 -0
- package/dist/lens/controls/SegmentedFilterControl.d.ts +22 -0
- package/dist/lens/controls/SegmentedFilterControl.d.ts.map +1 -0
- package/dist/lens/controls/facetOptions.d.ts +33 -0
- package/dist/lens/controls/facetOptions.d.ts.map +1 -0
- package/dist/lens/controls/index.d.ts +6 -0
- package/dist/lens/controls/index.d.ts.map +1 -0
- package/dist/lens/controls/model.d.ts +181 -0
- package/dist/lens/controls/model.d.ts.map +1 -0
- package/dist/lens/drillPrefetch-Bs-6Oyxa.js +68 -0
- package/dist/lens/element.d.ts +12 -0
- package/dist/lens/element.d.ts.map +1 -0
- package/dist/lens/explore/ContextMiniChart.d.ts +18 -0
- package/dist/lens/explore/ContextMiniChart.d.ts.map +1 -0
- package/dist/lens/explore/DrillOverlay.d.ts +66 -0
- package/dist/lens/explore/DrillOverlay.d.ts.map +1 -0
- package/dist/lens/explore/ExplorePanel.d.ts +8 -0
- package/dist/lens/explore/ExplorePanel.d.ts.map +1 -0
- package/dist/lens/explore/FocusContextHeader.d.ts +20 -0
- package/dist/lens/explore/FocusContextHeader.d.ts.map +1 -0
- package/dist/lens/explore/LensSelector.d.ts +17 -0
- package/dist/lens/explore/LensSelector.d.ts.map +1 -0
- package/dist/lens/explore/SourceDataDisclosure.d.ts +15 -0
- package/dist/lens/explore/SourceDataDisclosure.d.ts.map +1 -0
- package/dist/lens/explore/actions.d.ts +22 -0
- package/dist/lens/explore/actions.d.ts.map +1 -0
- package/dist/lens/explore/focusModel.d.ts +55 -0
- package/dist/lens/explore/focusModel.d.ts.map +1 -0
- package/dist/lens/explore/index.d.ts +9 -0
- package/dist/lens/explore/index.d.ts.map +1 -0
- package/dist/lens/explore/model.d.ts +59 -0
- package/dist/lens/explore/model.d.ts.map +1 -0
- package/dist/lens/export-B0U20F4u.js +57 -0
- package/dist/lens/icons.d.ts +103 -0
- package/dist/lens/icons.d.ts.map +1 -0
- package/dist/lens/idlePrefetch-Bi4Wk1uR.js +80 -0
- package/dist/lens/index-C45DAO6w.js +10883 -0
- package/dist/lens/index-CspKnSQn.js +11 -0
- package/dist/lens/index.d.ts +7 -0
- package/dist/lens/index.d.ts.map +1 -0
- package/dist/lens/index.js +17 -0
- package/dist/lens/install-3GLgv_LN.js +2028 -0
- package/dist/lens/install-B5oSx3pv.js +233 -0
- package/dist/lens/install-DT0AQkUj.js +1490 -0
- package/dist/lens/install-DyXK20dR.js +307 -0
- package/dist/lens/keys-DenV5HsJ.js +12 -0
- package/dist/lens/listSearch.d.ts +12 -0
- package/dist/lens/listSearch.d.ts.map +1 -0
- package/dist/lens/metricViews-QvoFHVdh.js +170 -0
- package/dist/lens/panels/CascadePanel.d.ts +138 -0
- package/dist/lens/panels/CascadePanel.d.ts.map +1 -0
- package/dist/lens/panels/ChartDataEquivalent.d.ts +23 -0
- package/dist/lens/panels/ChartDataEquivalent.d.ts.map +1 -0
- package/dist/lens/panels/ChartHost.d.ts +14 -0
- package/dist/lens/panels/ChartHost.d.ts.map +1 -0
- package/dist/lens/panels/ChartPanel.d.ts +29 -0
- package/dist/lens/panels/ChartPanel.d.ts.map +1 -0
- package/dist/lens/panels/CopyValueButton.d.ts +15 -0
- package/dist/lens/panels/CopyValueButton.d.ts.map +1 -0
- package/dist/lens/panels/CoveragePanel.d.ts +17 -0
- package/dist/lens/panels/CoveragePanel.d.ts.map +1 -0
- package/dist/lens/panels/ExportMenu.d.ts +12 -0
- package/dist/lens/panels/ExportMenu.d.ts.map +1 -0
- package/dist/lens/panels/GaugePanel.d.ts +6 -0
- package/dist/lens/panels/GaugePanel.d.ts.map +1 -0
- package/dist/lens/panels/InfoTip.d.ts +50 -0
- package/dist/lens/panels/InfoTip.d.ts.map +1 -0
- package/dist/lens/panels/MapPanel.d.ts +17 -0
- package/dist/lens/panels/MapPanel.d.ts.map +1 -0
- package/dist/lens/panels/MetricFlowPanel.d.ts +6 -0
- package/dist/lens/panels/MetricFlowPanel.d.ts.map +1 -0
- package/dist/lens/panels/MetricHierarchyPanel.d.ts +6 -0
- package/dist/lens/panels/MetricHierarchyPanel.d.ts.map +1 -0
- package/dist/lens/panels/MetricRelationshipPanel.d.ts +14 -0
- package/dist/lens/panels/MetricRelationshipPanel.d.ts.map +1 -0
- package/dist/lens/panels/PanelExportMenu.d.ts +5 -0
- package/dist/lens/panels/PanelExportMenu.d.ts.map +1 -0
- package/dist/lens/panels/PanelFrame.d.ts +42 -0
- package/dist/lens/panels/PanelFrame.d.ts.map +1 -0
- package/dist/lens/panels/PanelOverlay.d.ts +19 -0
- package/dist/lens/panels/PanelOverlay.d.ts.map +1 -0
- package/dist/lens/panels/QualityChip.d.ts +51 -0
- package/dist/lens/panels/QualityChip.d.ts.map +1 -0
- package/dist/lens/panels/ShareSliceButton.d.ts +3 -0
- package/dist/lens/panels/ShareSliceButton.d.ts.map +1 -0
- package/dist/lens/panels/Skeleton.d.ts +67 -0
- package/dist/lens/panels/Skeleton.d.ts.map +1 -0
- package/dist/lens/panels/StatPanel.d.ts +52 -0
- package/dist/lens/panels/StatPanel.d.ts.map +1 -0
- package/dist/lens/panels/StatValueTicker.d.ts +27 -0
- package/dist/lens/panels/StatValueTicker.d.ts.map +1 -0
- package/dist/lens/panels/TablePanel.d.ts +19 -0
- package/dist/lens/panels/TablePanel.d.ts.map +1 -0
- package/dist/lens/panels/WaterfallPlot.d.ts +51 -0
- package/dist/lens/panels/WaterfallPlot.d.ts.map +1 -0
- package/dist/lens/panels/actions.d.ts +75 -0
- package/dist/lens/panels/actions.d.ts.map +1 -0
- package/dist/lens/panels/context.d.ts +32 -0
- package/dist/lens/panels/context.d.ts.map +1 -0
- package/dist/lens/panels/data.d.ts +95 -0
- package/dist/lens/panels/data.d.ts.map +1 -0
- package/dist/lens/panels/kinds.d.ts +4 -0
- package/dist/lens/panels/kinds.d.ts.map +1 -0
- package/dist/lens/panels/metricViews.d.ts +79 -0
- package/dist/lens/panels/metricViews.d.ts.map +1 -0
- package/dist/lens/panels/registry.d.ts +45 -0
- package/dist/lens/panels/registry.d.ts.map +1 -0
- package/dist/lens/panels/useIsClamped.d.ts +16 -0
- package/dist/lens/panels/useIsClamped.d.ts.map +1 -0
- package/dist/lens/panels/useMenuButton.d.ts +68 -0
- package/dist/lens/panels/useMenuButton.d.ts.map +1 -0
- package/dist/lens/prefetch-Dov5CBoH.js +74 -0
- package/dist/lens/prefetchPanels-B7bIY0bM.js +31 -0
- package/dist/lens/print/PrintReport.d.ts +12 -0
- package/dist/lens/print/PrintReport.d.ts.map +1 -0
- package/dist/lens/print/footnotes.d.ts +29 -0
- package/dist/lens/print/footnotes.d.ts.map +1 -0
- package/dist/lens/print/formula.d.ts +9 -0
- package/dist/lens/print/formula.d.ts.map +1 -0
- package/dist/lens/print/narrative.d.ts +41 -0
- package/dist/lens/print/narrative.d.ts.map +1 -0
- package/dist/lens/print/outline.d.ts +94 -0
- package/dist/lens/print/outline.d.ts.map +1 -0
- package/dist/lens/print/palette.d.ts +23 -0
- package/dist/lens/print/palette.d.ts.map +1 -0
- package/dist/lens/print/quality.d.ts +32 -0
- package/dist/lens/print/quality.d.ts.map +1 -0
- package/dist/lens/print/units.d.ts +23 -0
- package/dist/lens/print/units.d.ts.map +1 -0
- package/dist/lens/print/values.d.ts +28 -0
- package/dist/lens/print/values.d.ts.map +1 -0
- package/dist/lens/print-CwcB0fug.js +216 -0
- package/dist/lens/runtime/clipboard.d.ts +11 -0
- package/dist/lens/runtime/clipboard.d.ts.map +1 -0
- package/dist/lens/runtime/document.d.ts +9 -0
- package/dist/lens/runtime/document.d.ts.map +1 -0
- package/dist/lens/runtime/drawer.d.ts +21 -0
- package/dist/lens/runtime/drawer.d.ts.map +1 -0
- package/dist/lens/runtime/drill.d.ts +54 -0
- package/dist/lens/runtime/drill.d.ts.map +1 -0
- package/dist/lens/runtime/drillPrefetch.d.ts +22 -0
- package/dist/lens/runtime/drillPrefetch.d.ts.map +1 -0
- package/dist/lens/runtime/export.d.ts +21 -0
- package/dist/lens/runtime/export.d.ts.map +1 -0
- package/dist/lens/runtime/filters.d.ts +51 -0
- package/dist/lens/runtime/filters.d.ts.map +1 -0
- package/dist/lens/runtime/focusTrap.d.ts +4 -0
- package/dist/lens/runtime/focusTrap.d.ts.map +1 -0
- package/dist/lens/runtime/format.d.ts +81 -0
- package/dist/lens/runtime/format.d.ts.map +1 -0
- package/dist/lens/runtime/idlePrefetch.d.ts +35 -0
- package/dist/lens/runtime/idlePrefetch.d.ts.map +1 -0
- package/dist/lens/runtime/index.d.ts +15 -0
- package/dist/lens/runtime/index.d.ts.map +1 -0
- package/dist/lens/runtime/navigate.d.ts +12 -0
- package/dist/lens/runtime/navigate.d.ts.map +1 -0
- package/dist/lens/runtime/navigation.d.ts +77 -0
- package/dist/lens/runtime/navigation.d.ts.map +1 -0
- package/dist/lens/runtime/overlayContainer.d.ts +24 -0
- package/dist/lens/runtime/overlayContainer.d.ts.map +1 -0
- package/dist/lens/runtime/panel.d.ts +47 -0
- package/dist/lens/runtime/panel.d.ts.map +1 -0
- package/dist/lens/runtime/panelImage.d.ts +28 -0
- package/dist/lens/runtime/panelImage.d.ts.map +1 -0
- package/dist/lens/runtime/prefetch.d.ts +48 -0
- package/dist/lens/runtime/prefetch.d.ts.map +1 -0
- package/dist/lens/runtime/prefetchPanels.d.ts +17 -0
- package/dist/lens/runtime/prefetchPanels.d.ts.map +1 -0
- package/dist/lens/runtime/print.d.ts +50 -0
- package/dist/lens/runtime/print.d.ts.map +1 -0
- package/dist/lens/runtime/provider.d.ts +195 -0
- package/dist/lens/runtime/provider.d.ts.map +1 -0
- package/dist/lens/runtime/query.d.ts +32 -0
- package/dist/lens/runtime/query.d.ts.map +1 -0
- package/dist/lens/runtime/recovery.d.ts +26 -0
- package/dist/lens/runtime/recovery.d.ts.map +1 -0
- package/dist/lens/runtime/snapshotLease.d.ts +2 -0
- package/dist/lens/runtime/snapshotLease.d.ts.map +1 -0
- package/dist/lens/runtime/theme.d.ts +4 -0
- package/dist/lens/runtime/theme.d.ts.map +1 -0
- package/dist/lens/runtime/url.d.ts +23 -0
- package/dist/lens/runtime/url.d.ts.map +1 -0
- package/dist/lens/scales-DKkoQGtJ.js +195 -0
- package/dist/lens/snapshotLease-LjBaqKs-.js +14 -0
- package/dist/lens/style.css +1 -0
- package/dist/lens/visualRegression.d.ts +2 -0
- package/dist/lens/visualRegression.d.ts.map +1 -0
- package/dist/sdk-identity.cjs +6 -0
- package/dist/sdk-identity.d.ts +4 -0
- package/dist/sdk-identity.js +4 -0
- package/dist/sdk-identity.json +5 -0
- package/package.json +22 -123
- package/assets/fonts/Actay/Actay-Regular.otf +0 -0
- package/assets/fonts/Actay/Actay-RegularItalic.otf +0 -0
- package/assets/fonts/Actay/ActayCondensed-Thin.otf +0 -0
- package/assets/fonts/Actay/ActayCondensed-ThinItalic.otf +0 -0
- package/assets/fonts/Actay/ActayWide-Bold.otf +0 -0
- package/assets/fonts/Actay/ActayWide-BoldItalic.otf +0 -0
- package/assets/fonts/Gilroy/Gilroy-Black.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-BlackItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Bold.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-BoldItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Extrabold.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-ExtraboldItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Heavy.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-HeavyItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Light.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-LightItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Medium.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-MediumItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Regular.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-RegularItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Semibold.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-SemiboldItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-Thin.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-ThinItalic.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-UltraLight.woff2 +0 -0
- package/assets/fonts/Gilroy/Gilroy-UltraLightItalic.woff2 +0 -0
- package/assets/fonts/Inter.var.woff2 +0 -0
- package/dist/applet/core.cjs +0 -412
- package/dist/applet/core.cjs.map +0 -1
- package/dist/applet/core.d.cts +0 -187
- package/dist/applet/core.d.ts +0 -187
- package/dist/applet/core.mjs +0 -396
- package/dist/applet/core.mjs.map +0 -1
- package/dist/applet/devtools.cjs +0 -147
- package/dist/applet/devtools.cjs.map +0 -1
- package/dist/applet/devtools.d.cts +0 -7
- package/dist/applet/devtools.d.ts +0 -7
- package/dist/applet/devtools.mjs +0 -144
- package/dist/applet/devtools.mjs.map +0 -1
- package/dist/applet/host.cjs +0 -397
- package/dist/applet/host.cjs.map +0 -1
- package/dist/applet/host.d.cts +0 -42
- package/dist/applet/host.d.ts +0 -42
- package/dist/applet/host.mjs +0 -392
- package/dist/applet/host.mjs.map +0 -1
- package/dist/applet/vite.cjs +0 -219
- package/dist/applet/vite.cjs.map +0 -1
- package/dist/applet/vite.d.cts +0 -99
- package/dist/applet/vite.d.ts +0 -99
- package/dist/applet/vite.mjs +0 -203
- package/dist/applet/vite.mjs.map +0 -1
- package/dist/applet-runtime/index.cjs +0 -890
- package/dist/applet-runtime/index.cjs.map +0 -1
- package/dist/applet-runtime/index.d.cts +0 -191
- package/dist/applet-runtime/index.d.ts +0 -191
- package/dist/applet-runtime/index.mjs +0 -876
- package/dist/applet-runtime/index.mjs.map +0 -1
- package/dist/bichat/index.cjs +0 -20896
- package/dist/bichat/index.cjs.map +0 -1
- package/dist/bichat/index.css +0 -618
- package/dist/bichat/index.css.map +0 -1
- package/dist/bichat/index.d.cts +0 -4522
- package/dist/bichat/index.d.ts +0 -4522
- package/dist/bichat/index.mjs +0 -20724
- package/dist/bichat/index.mjs.map +0 -1
- package/dist/bichat/styles.css +0 -774
- package/dist/bichat/tailwind.cjs +0 -103
- package/dist/bichat/tailwind.cjs.map +0 -1
- package/dist/bichat/tailwind.d.cts +0 -21
- package/dist/bichat/tailwind.d.ts +0 -21
- package/dist/bichat/tailwind.mjs +0 -95
- package/dist/bichat/tailwind.mjs.map +0 -1
- package/dist/fonts/Actay/Actay-Regular.otf +0 -0
- package/dist/fonts/Actay/Actay-RegularItalic.otf +0 -0
- package/dist/fonts/Actay/ActayCondensed-Thin.otf +0 -0
- package/dist/fonts/Actay/ActayCondensed-ThinItalic.otf +0 -0
- package/dist/fonts/Actay/ActayWide-Bold.otf +0 -0
- package/dist/fonts/Actay/ActayWide-BoldItalic.otf +0 -0
- package/dist/fonts/Gilroy/Gilroy-Black.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-BlackItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Bold.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-BoldItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Extrabold.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-ExtraboldItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Heavy.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-HeavyItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Light.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-LightItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Medium.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-MediumItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Regular.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-RegularItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Semibold.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-SemiboldItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-Thin.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-ThinItalic.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-UltraLight.woff2 +0 -0
- package/dist/fonts/Gilroy/Gilroy-UltraLightItalic.woff2 +0 -0
- package/dist/fonts/Inter.var.woff2 +0 -0
- package/dist/index-Cs_xWkhC.d.cts +0 -84
- package/dist/index-Cs_xWkhC.d.ts +0 -84
- package/dist/index.cjs +0 -777
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -7
- package/dist/index.d.ts +0 -7
- package/dist/index.mjs +0 -755
- package/dist/index.mjs.map +0 -1
- package/dist/rpc-fh942_dj.d.cts +0 -31
- package/dist/rpc-fh942_dj.d.ts +0 -31
- package/tailwind/compiled.css +0 -2
- package/tailwind/create-config.cjs +0 -90
- package/tailwind/iota.css +0 -1195
- package/tailwind/main.css +0 -2
- package/tailwind/sdk-content.cjs +0 -177
- package/tailwind/sdk-theme.cjs +0 -120
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../ui/src/bichat/context/IotaContext.tsx","../../ui/src/bichat/hooks/useTranslation.ts","../../ui/src/bichat/components/ChartCard.tsx","../../ui/src/bichat/components/TableExportButton.tsx","../../ui/src/bichat/utils/citationProcessor.ts","../../ui/src/bichat/utils/chartSpec.ts","../../ui/src/bichat/utils/markdownMath.ts","../../ui/src/bichat/components/TableWithExport.tsx","../../ui/src/bichat/components/CodeBlock.tsx","../../ui/src/bichat/components/MarkdownRenderer.tsx","../../ui/src/bichat/utils/RateLimiter.ts","../../ui/src/bichat/types/index.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/bichat/utils/errorDisplay.ts","../../ui/src/bichat/utils/queueStorage.ts","../../ui/src/bichat/utils/debugModeStorage.ts","../../ui/src/bichat/utils/reasoningEffortStorage.ts","../../ui/src/bichat/utils/debugTrace.ts","../../ui/src/bichat/context/chatHelpers.ts","../../ui/src/bichat/machine/selectors.ts","../../ui/src/bichat/utils/assistantTurnState.ts","../../ui/src/bichat/machine/hitlLifecycle.ts","../../ui/src/bichat/machine/ChatMachine.ts","../../ui/src/bichat/context/ChatContext.tsx","../../ui/src/bichat/components/ChatHeader.tsx","../../ui/src/bichat/hooks/useBranding.ts","../../ui/src/bichat/components/UserAvatar.tsx","../../ui/src/bichat/components/AvatarStack.tsx","../../ui/src/bichat/utils/dateFormatting.ts","../../ui/src/bichat/utils/fileUtils.ts","../../ui/src/bichat/components/AttachmentGrid.tsx","../../ui/src/bichat/hooks/useFocusTrap.ts","../../ui/src/bichat/hooks/useModalLock.ts","../../ui/src/bichat/components/InlineDialog.tsx","../../ui/src/bichat/components/ImageModal.tsx","../../ui/src/bichat/components/UserMessage.tsx","../../ui/src/bichat/components/UserTurnView.tsx","../../ui/src/bichat/components/AssistantTurnView.tsx","../../ui/src/bichat/components/CodeOutputsPanel.tsx","../../ui/src/bichat/components/StreamingCursor.tsx","../../ui/src/bichat/components/AssistantMessage.tsx","../../ui/src/bichat/components/InteractiveTableCard.tsx","../../ui/src/bichat/utils/columnTypes.ts","../../ui/src/bichat/hooks/useDataTable.ts","../../ui/src/bichat/components/DataTableHeader.tsx","../../ui/src/bichat/components/DataTableCell.tsx","../../ui/src/bichat/components/DataTableToolbar.tsx","../../ui/src/bichat/components/DataTableFooter.tsx","../../ui/src/bichat/components/FullscreenOverlay.tsx","../../ui/src/bichat/components/TabbedTableGroup.tsx","../../ui/src/bichat/components/TabBar.tsx","../../ui/src/bichat/components/TabbedChartGroup.tsx","../../ui/src/bichat/components/SourcesPanel.tsx","../../ui/src/bichat/components/DownloadCard.tsx","../../ui/src/bichat/components/InlineQuestionForm.tsx","../../ui/src/bichat/components/RetryActionArea.tsx","../../ui/src/bichat/utils/debugMetrics.ts","../../ui/src/bichat/components/DebugPanel.tsx","../../ui/src/bichat/components/SystemMessage.tsx","../../ui/src/bichat/components/TurnBubble.tsx","../../ui/src/bichat/animations/variants.ts","../../ui/src/bichat/components/TypingIndicator.tsx","../../ui/src/bichat/components/ActivityTrace.tsx","../../ui/src/bichat/utils/toolLabels.ts","../../ui/src/bichat/utils/activitySteps.ts","../../ui/src/bichat/components/ScrollToBottomButton.tsx","../../ui/src/bichat/components/DateSeparator.tsx","../../ui/src/bichat/utils/markdownStream.ts","../../ui/src/bichat/hooks/useKeyboardShortcuts.ts","../../ui/src/bichat/hooks/useMessageListScroll.ts","../../ui/src/bichat/components/MessageList.tsx","../../ui/src/bichat/components/MessageQueueList.tsx","../../ui/src/bichat/components/MessageInput.tsx","../../ui/src/bichat/components/CompactionDoodle.tsx","../../ui/src/bichat/components/WelcomeContent.tsx","../../ui/src/bichat/components/Alert.tsx","../../ui/src/bichat/components/ArchiveBanner.tsx","../../ui/src/bichat/components/ChatSession.tsx","../../ui/src/bichat/components/SessionArtifactsPanel.tsx","../../ui/src/bichat/components/SessionArtifactList.tsx","../../ui/src/bichat/utils/artifactHelpers.ts","../../ui/src/bichat/components/SessionArtifactPreviewModal.tsx","../../ui/src/bichat/components/SessionArtifactPreview.tsx","../../ui/src/bichat/utils/tableSpec.ts","../../ui/src/bichat/components/SessionMembersModal.tsx","../../ui/src/bichat/components/ConfirmModal.tsx","../../ui/src/bichat/components/StreamError.tsx","../../ui/src/bichat/components/ModelSelector.tsx","../../ui/src/bichat/index.ts","../../ui/src/bichat/components/EmptyState.tsx","../../ui/src/bichat/components/EditableText.tsx","../../ui/src/bichat/components/SearchInput.tsx","../../ui/src/bichat/components/Skeleton.tsx","../../ui/src/bichat/components/LoadingSpinner.tsx","../../ui/src/bichat/components/Toast.tsx","../../ui/src/bichat/components/ToastContainer.tsx","../../ui/src/bichat/components/PermissionGuard.tsx","../../ui/src/bichat/components/ErrorBoundary.tsx","../../ui/src/bichat/components/SessionSkeleton.tsx","../../ui/src/bichat/hooks/useLongPress.ts","../../ui/src/bichat/components/TouchContextMenu.tsx","../../ui/src/bichat/components/SessionItem.tsx","../../ui/src/bichat/components/DateGroupHeader.tsx","../../ui/src/bichat/components/UserFilter.tsx","../../ui/src/bichat/components/AllChatsList.tsx","../../ui/src/bichat/components/Sidebar.tsx","../../ui/src/bichat/hooks/useToast.ts","../../ui/src/bichat/utils/sessionGrouping.ts","../../ui/src/bichat/components/ArchivedChatList.tsx","../../ui/src/bichat/components/SkipLink.tsx","../../ui/src/bichat/hooks/useSidebarState.ts","../../ui/src/bichat/components/BiChatLayout.tsx","../../ui/src/bichat/components/MessageActions.tsx","../../ui/src/bichat/components/AttachmentPreview.tsx","../../ui/src/bichat/components/AttachmentUpload.tsx","../../ui/src/bichat/components/ScreenReaderAnnouncer.tsx","../../ui/src/bichat/components/QuestionForm.tsx","../../ui/src/bichat/components/QuestionStep.tsx","../../ui/src/bichat/components/ConfirmationStep.tsx","../../ui/src/bichat/utils/questionFormUtils.ts","../../ui/src/bichat/primitives/Slot.tsx","../../ui/src/bichat/primitives/Turn.tsx","../../ui/src/bichat/primitives/Avatar.tsx","../../ui/src/bichat/primitives/Bubble.tsx","../../ui/src/bichat/primitives/ActionButton.tsx","../../ui/src/applet-core/hooks/useStreaming.ts","../../ui/src/bichat/hooks/useStreaming.ts","../../ui/src/bichat/hooks/useActiveRuns.ts","../../ui/src/bichat/hooks/useImageGallery.ts","../../ui/src/bichat/hooks/useAutoScroll.ts","../../ui/src/bichat/hooks/useMessageActions.ts","../../ui/src/bichat/hooks/useAttachments.ts","../../ui/src/bichat/hooks/useMarkdownCopy.ts","../../ui/src/bichat/hooks/useScrollToBottom.ts","../../ui/src/bichat/hooks/useHttpDataSourceConfigFromApplet.ts","../../ui/src/bichat/hooks/useBichatRouter.ts","../../ui/src/bichat/config/ConfigContext.tsx","../../ui/src/bichat/theme/themes.ts","../../ui/src/bichat/theme/ThemeProvider.tsx","../../ui/src/bichat/api/csrf.ts","../../ui/src/bichat/data/mappers.ts","../../ui/src/bichat/data/SessionManager.ts","../../ui/src/bichat/utils/sseParser.ts","../../ui/src/bichat/utils/eventNames.ts","../../ui/src/bichat/data/openManagedEventSource.ts","../../ui/src/bichat/data/AttachmentUploader.ts","../../ui/src/bichat/data/MessageTransport.ts","../../ui/src/bichat/data/ArtifactManager.ts","../../ui/src/bichat/data/HttpDataSource.ts","../../ui/src/bichat/utils/textBlocks.ts"],"names":["jsx","useContext","createContext","useCallback","key","useId","useState","useRef","useMemo","useEffect","jsxs","ApexCharts","ReactApexChart","Fragment","DownloadSimple","TableExportButton","memo","FileXls","isRecord","TableWithExport","sendMessage","MemoizedCodeBlock","useSyncExternalStore","Check","Copy","SyntaxHighlighter","vscDarkPlus","vs","MemoizedMarkdownRenderer","Children","isValidElement","Suspense","CodeBlock","ReactMarkdown","remarkGfm","remarkMath","rehypeKatex","lazy","MessageRole","STORAGE_PREFIX","getStreamStatus","finalSessionId","differenceInMinutes","differenceInHours","differenceInDays","format","ImageIcon","FilePdf","FileCsv","FileDoc","FileCode","FileText","File","ChartBar","X","React","focusableElements","MagnifyingGlassMinus","MagnifyingGlassPlus","ArrowCounterClockwise","ArrowClockwise","ArrowsIn","ImageBroken","CaretLeft","CaretRight","PencilSimple","Download","DataTableHeader","HeaderCell","CaretUp","CaretDown","Menu","MenuButton","DotsThreeVertical","MenuItems","MenuItem","DataTableCell","createPortal","DataTableToolbar","Popover","PopoverButton","Columns","PopoverPanel","ArrowsOut","StatRow","DataTableFooter","InteractiveTableCard","MagnifyingGlass","motion","TabbedTableGroup","INLINE_CLASS","FULLSCREEN_CLASS","TabbedChartGroup","isMultiSelect","ChatCircleDots","PencilSimpleLine","ArrowLeft","PaperPlaneTilt","ArrowRight","RetryActionArea","Warning","XCircle","CheckCircle","CircleNotch","Timer","Lightning","Stack","ArrowUp","ArrowDown","Database","Bug","ArrowSquareOut","Wrench","MarkdownRenderer","COPY_FEEDBACK_MS","defaultClassNames","mergeClassNames","AnimatePresence","ArrowsClockwise","Brain","ClockCounterClockwise","formatDuration","MotionConfig","isToday","isYesterday","isSameDay","CaretUpDown","forwardRef","useImperativeHandle","Paperclip","Stop","PaperPlaneRight","Lightbulb","useReducedMotion","Info","Archive","Spinner","TableIcon","Code","Package","WarningCircle","SpinnerGap","FloppyDisk","Trash","Plus","UsersThree","Crown","UserPlus","ArrowsCounterClockwise","ShareNetwork","Sidebar","sizeClasses","prefersReducedMotion","gapClasses","Transition","hasPermission","Component","useMotionValue","useTransform","ArrowUUpLeft","Bookmark","DotsThree","startOfDay","sessions","ChatCircle","Gear","Users","List","CaretLineLeft","CaretLineRight","cloneElement","useStreaming","pending","fileArray","removed","readString","normalizeQuestionType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * IOTA SDK integration context provider\n * Consumes server-side context from window.__APPLET_CONTEXT__ or accepts it as a prop.\n */\n\nimport { createContext, useContext, ReactNode } from 'react';\nimport type { IotaContext as IotaContextType } from '../types/iota';\n\nconst IotaContext = createContext<IotaContextType | null>(null);\n\ninterface IotaContextProviderProps {\n /**\n * Explicit context object. When provided, the window global is not read.\n * Useful for tests, Storybook, or apps that manage their own context.\n */\n context?: IotaContextType\n children: ReactNode\n}\n\nexport function IotaContextProvider({ context, children }: IotaContextProviderProps) {\n // Prefer explicit prop; fall back to window global\n const resolved = context ?? (typeof window !== 'undefined' ? window.__APPLET_CONTEXT__ : undefined);\n\n if (!resolved) {\n throw new Error('APPLET_CONTEXT not found. Pass a `context` prop or ensure the server injected context into window.__APPLET_CONTEXT__.');\n }\n\n return (\n <IotaContext.Provider value={resolved}>\n {children}\n </IotaContext.Provider>\n );\n}\n\nexport function useIotaContext(): IotaContextType {\n const context = useContext(IotaContext);\n if (!context) {\n throw new Error('useIotaContext must be used within IotaContextProvider');\n }\n return context;\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(permission: string): boolean {\n const context = typeof window !== 'undefined' ? window.__APPLET_CONTEXT__ : undefined;\n if (!context) {\n return false;\n }\n return context.user.permissions.includes(permission);\n}\n","/**\n * Translation hook using locale from IotaContext\n */\n\nimport { useCallback } from 'react';\nimport { useIotaContext } from '../context/IotaContext';\n\nexport function useTranslation() {\n const { locale } = useIotaContext();\n const { translations, language } = locale;\n\n /**\n * Translate a key with optional parameter interpolation\n * @param key - Translation key (e.g., 'bichat.title')\n * @param params - Optional parameters for interpolation (e.g., { name: 'John' })\n * @returns Translated string\n */\n const t = useCallback(\n (key: string, params?: Record<string, string | number | boolean>): string => {\n const raw = translations[key];\n let text = typeof raw === 'string' && raw.trim() ? raw : key;\n\n // Simple interpolation: replace {{key}} with params[key]\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n const value = params[paramKey];\n text = text.replace(new RegExp(`{{${paramKey}}}`, 'g'), String(value));\n });\n }\n\n return text.trim() ? text : key;\n },\n [translations]\n );\n\n return {\n t,\n locale: language,\n };\n}\n","/**\n * ChartCard Component\n * Renders chart visualizations using ApexCharts\n *\n * Supports multiple chart types: line, bar, pie, area, donut\n * Includes PNG export functionality and responsive styling\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport ReactApexChart from 'react-apexcharts';\nimport ApexCharts, { ApexOptions } from 'apexcharts';\nimport { DownloadSimple } from '@phosphor-icons/react';\nimport type { ChartData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\n/** External container control. When provided, the card runs in embedded mode. */\nexport interface ChartCardHost {\n isFullscreen: boolean\n}\n\ninterface ChartCardProps {\n chartData: ChartData\n onExportError?: (error: string) => void\n /** When provided, the card runs in embedded mode — strips outer chrome, fills container height in fullscreen. */\n host?: ChartCardHost\n}\n\ninterface InlineTooltipState {\n left: number\n top: number\n label: string\n seriesName: string\n value: string\n}\n\ninterface HoverEventLike {\n target?: EventTarget | null\n clientX?: number\n clientY?: number\n}\n\n// Default color palette if none provided\nconst DEFAULT_COLORS = ['#6366f1', '#06b6d4', '#f59e0b', '#ef4444', '#8b5cf6'];\nconst TOOLTIP_X_PADDING = 12;\nconst TOOLTIP_Y_PADDING = 8;\nconst TOOLTIP_CURSOR_Y_OFFSET = 12;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction getEventClientValue(event: unknown, key: 'clientX' | 'clientY'): number | null {\n if (!event || typeof event !== 'object') {\n return null;\n }\n\n const value = (event as HoverEventLike)[key];\n return typeof value === 'number' ? value : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction cloneDeep<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((item) => cloneDeep(item)) as T;\n }\n if (isRecord(value)) {\n const out: Record<string, unknown> = {};\n Object.entries(value).forEach(([k, v]) => {\n out[k] = cloneDeep(v);\n });\n return out as T;\n }\n return value;\n}\n\nfunction detectCurrencyHint(text: string): string | null {\n const codeMatch = text.match(/\\b(USD|EUR|GBP|JPY|CHF|AUD|CAD|NZD|CNY|INR|RUB|UZS)\\b/i);\n if (codeMatch) {return codeMatch[1].toUpperCase();}\n if (text.includes('$')) {return 'USD';}\n if (text.includes('EUR') || text.includes('€')) {return 'EUR';}\n if (text.includes('GBP') || text.includes('£')) {return 'GBP';}\n if (text.includes('JPY') || text.includes('¥')) {return 'JPY';}\n return null;\n}\n\nfunction extractYValues(\n chartType: ChartData['chartType'],\n series: ChartData['series'],\n richSeries?: unknown\n): number[] {\n if (chartType === 'pie' || chartType === 'donut') {\n if (Array.isArray(richSeries)) {\n return richSeries.filter((v): v is number => typeof v === 'number' && Number.isFinite(v));\n }\n return series[0]?.data || [];\n }\n return series.flatMap((s) => s.data).filter((v): v is number => Number.isFinite(v));\n}\n\nfunction createMoneyFormatter(\n title: string,\n seriesNames: string[],\n yValues: number[]\n): ((value: number) => string) | null {\n if (yValues.length === 0) {return null;}\n const textSignals = [title, ...seriesNames].join(' ');\n const currencyHint = detectCurrencyHint(textSignals);\n const monetaryKeywords =\n /\\b(revenue|sales|amount|price|cost|profit|income|expense|balance|payment|salary|budget|currency|premium)\\b/i.test(\n textSignals\n ) || /[$€£¥]/.test(textSignals);\n if (!monetaryKeywords && !currencyHint) {return null;}\n\n const currency = currencyHint || 'USD';\n const maxFractionDigits = yValues.some((value) => Math.abs(value) < 1) ? 4 : 2;\n try {\n const formatter = new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: maxFractionDigits,\n });\n return (value: number): string => formatter.format(value);\n } catch {\n const fallback = new Intl.NumberFormat(undefined, { maximumFractionDigits: maxFractionDigits });\n return (value: number): string => fallback.format(value);\n }\n}\n\nfunction applyMoneyFormatting(\n options: ApexOptions,\n formatter: ((value: number) => string) | null\n): ApexOptions {\n if (!formatter) {return options;}\n\n const next: ApexOptions = { ...options };\n const yaxis = next.yaxis;\n if (Array.isArray(yaxis)) {\n next.yaxis = yaxis.map((axis) => ({\n ...axis,\n labels: {\n ...(axis?.labels || {}),\n formatter: axis?.labels?.formatter || ((value: number) => formatter(value)),\n },\n }));\n } else {\n next.yaxis = {\n ...(yaxis || {}),\n labels: {\n ...(yaxis?.labels || {}),\n formatter: yaxis?.labels?.formatter || ((value: number) => formatter(value)),\n },\n };\n }\n const tooltipY = next.tooltip?.y;\n const tooltipYObject = !Array.isArray(tooltipY) && isRecord(tooltipY) ? tooltipY : {};\n const existingFormatter =\n !Array.isArray(tooltipY) && isRecord(tooltipY) && typeof tooltipY.formatter === 'function'\n ? tooltipY.formatter\n : undefined;\n\n next.tooltip = {\n ...(next.tooltip || {}),\n y: {\n ...tooltipYObject,\n formatter: existingFormatter || ((value: number) => formatter(value)),\n },\n };\n return next;\n}\n\n/**\n * ChartCard renders a single chart visualization with optional PNG export.\n */\nexport function ChartCard({ chartData, onExportError, host }: ChartCardProps) {\n const { t } = useTranslation();\n const chartId = useId().replace(/:/g, '_');\n const [isExporting, setIsExporting] = useState(false);\n const [useInlineTooltip, setUseInlineTooltip] = useState(false);\n const [inlineTooltip, setInlineTooltip] = useState<InlineTooltipState | null>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n\n const { chartType, title, series, labels, colors, height = 350 } = chartData;\n const richOptions = useMemo(\n () => (isRecord(chartData.options) ? cloneDeep(chartData.options) : null),\n [chartData.options]\n );\n const chartLabels = useMemo(\n () => (labels ?? []).filter((label): label is string => label !== null),\n [labels]\n );\n\n const hasValidData =\n series && series.length > 0 && series.some((s) => s.data && s.data.length > 0);\n\n useEffect(() => {\n const rootNode = cardRef.current?.getRootNode();\n const inShadowRoot =\n typeof ShadowRoot !== 'undefined' && rootNode instanceof ShadowRoot;\n setUseInlineTooltip(chartType === 'bar' && inShadowRoot);\n }, [chartType]);\n\n useEffect(() => {\n if (!useInlineTooltip) {\n setInlineTooltip(null);\n }\n }, [useInlineTooltip]);\n\n const apexSeries = useMemo(() => {\n if (richOptions && Array.isArray(richOptions.series)) {\n if (chartType === 'pie' || chartType === 'donut') {\n const numeric = richOptions.series.filter((v): v is number => typeof v === 'number' && Number.isFinite(v));\n if (numeric.length > 0) {return numeric;}\n } else {\n const mapped = richOptions.series\n .filter((item): item is { name?: unknown; data: unknown[] } => isRecord(item) && Array.isArray(item.data))\n .map((item, idx) => ({\n name: typeof item.name === 'string' && item.name.trim() ? item.name : `Series ${idx + 1}`,\n data: item.data.map((v) => (typeof v === 'number' && Number.isFinite(v) ? v : null)),\n }))\n .filter((item) => item.data.some((v) => v !== null));\n if (mapped.length > 0) {return mapped;}\n }\n }\n\n return chartType === 'pie' || chartType === 'donut'\n ? series[0]?.data ?? []\n : series.map((s) => ({ name: s.name, data: s.data }));\n }, [chartType, series, richOptions]);\n\n const xaxisConfig = useMemo(() => {\n if (chartType === 'pie' || chartType === 'donut') {return {};}\n if (richOptions && isRecord(richOptions.xaxis)) {\n return richOptions.xaxis;\n }\n return { categories: chartLabels };\n }, [chartType, chartLabels, richOptions]);\n\n const labelsConfig = useMemo(() => {\n if (chartType !== 'pie' && chartType !== 'donut') {return [];}\n if (richOptions && Array.isArray(richOptions.labels)) {\n const fromOptions = richOptions.labels.filter((v): v is string => typeof v === 'string');\n if (fromOptions.length > 0) {return fromOptions;}\n }\n return chartLabels;\n }, [chartType, chartLabels, richOptions]);\n\n const handleDataPointMouseEnter = useCallback(\n (event: unknown, _chartContext: unknown, config: { seriesIndex?: number; dataPointIndex?: number }) => {\n if (!useInlineTooltip || chartType !== 'bar' || !cardRef.current) {\n return;\n }\n\n const target =\n (event &&\n typeof event === 'object' &&\n 'target' in event &&\n (event as { target?: Element | null }).target?.closest('.apexcharts-bar-area')) ||\n null;\n\n if (!(target instanceof SVGGraphicsElement)) {\n return;\n }\n\n const seriesIndex = typeof config?.seriesIndex === 'number' ? config.seriesIndex : 0;\n const dataPointIndex = typeof config?.dataPointIndex === 'number' ? config.dataPointIndex : -1;\n if (dataPointIndex < 0) {\n return;\n }\n\n const cardRect = cardRef.current.getBoundingClientRect();\n const barRect = target.getBoundingClientRect();\n const rawValue = series?.[seriesIndex]?.data?.[dataPointIndex] ?? target.getAttribute('val') ?? '';\n const value =\n typeof rawValue === 'number' && Number.isFinite(rawValue)\n ? rawValue.toLocaleString()\n : String(rawValue);\n const label = chartLabels[dataPointIndex] || '';\n const seriesName = series?.[seriesIndex]?.name || 'Value';\n\n const cursorX = getEventClientValue(event, 'clientX');\n const cursorY = getEventClientValue(event, 'clientY');\n const fallbackLeft = barRect.left - cardRect.left + barRect.width / 2;\n const fallbackTop = barRect.top - cardRect.top - TOOLTIP_Y_PADDING;\n const maxLeft = Math.max(cardRect.width - TOOLTIP_X_PADDING, TOOLTIP_X_PADDING);\n const maxTop = Math.max(cardRect.height - TOOLTIP_Y_PADDING, TOOLTIP_Y_PADDING);\n\n const left = clamp(\n cursorX !== null ? cursorX - cardRect.left : fallbackLeft,\n TOOLTIP_X_PADDING,\n maxLeft\n );\n const top = clamp(\n cursorY !== null ? cursorY - cardRect.top - TOOLTIP_CURSOR_Y_OFFSET : fallbackTop,\n TOOLTIP_Y_PADDING,\n maxTop\n );\n\n setInlineTooltip({ left, top, label, seriesName, value });\n },\n [chartLabels, chartType, series, useInlineTooltip]\n );\n\n const handleMouseLeave = useCallback(() => {\n setInlineTooltip(null);\n }, []);\n\n const options: ApexOptions = useMemo(() => {\n const base = richOptions\n ? (richOptions as ApexOptions)\n : ({\n plotOptions: {\n bar: { columnWidth: '60%' },\n },\n legend: { position: 'bottom', horizontalAlign: 'center' },\n dataLabels: { enabled: chartType === 'pie' || chartType === 'donut' },\n stroke: {\n curve: 'smooth',\n width: chartType === 'line' || chartType === 'area' ? 2 : 0,\n },\n fill: { opacity: chartType === 'area' ? 0.4 : 1 },\n grid: {\n borderColor: 'var(--bichat-color-chart-grid, rgba(148, 163, 184, 0.15))',\n strokeDashArray: 3,\n },\n } as ApexOptions);\n\n const yValues = extractYValues(chartType, series, richOptions?.series);\n const moneyFormatter = createMoneyFormatter(\n title,\n series.map((s) => s.name),\n yValues\n );\n\n const next: ApexOptions = {\n ...base,\n chart: {\n ...(base.chart || {}),\n id: chartId,\n type: chartType as 'line' | 'bar' | 'area' | 'pie' | 'donut',\n toolbar: {\n ...(base.chart?.toolbar || {}),\n show: false,\n },\n animations: {\n ...(base.chart?.animations || {}),\n enabled: false,\n },\n fontFamily: 'inherit',\n ...(useInlineTooltip\n ? {\n events: {\n dataPointMouseEnter: handleDataPointMouseEnter,\n mouseLeave: handleMouseLeave,\n },\n }\n : {}),\n },\n tooltip: {\n ...(base.tooltip || {}),\n enabled: !useInlineTooltip,\n followCursor: true,\n },\n title: {\n ...(base.title || {}),\n text: title,\n align: base.title?.align || 'left',\n style: { fontSize: '14px', fontWeight: 600, ...(base.title?.style || {}) },\n },\n colors: colors?.length ? colors : (base.colors && base.colors.length ? base.colors : DEFAULT_COLORS),\n xaxis: xaxisConfig,\n labels: labelsConfig,\n };\n\n if (chartData.logarithmic && chartType !== 'pie' && chartType !== 'donut') {\n if (Array.isArray(next.yaxis)) {\n next.yaxis = next.yaxis.map((axis) => ({ ...axis, logarithmic: true }));\n } else {\n next.yaxis = { ...(next.yaxis || {}), logarithmic: true };\n }\n }\n\n return applyMoneyFormatting(next, moneyFormatter);\n }, [richOptions, chartType, series, title, chartId, useInlineTooltip, handleDataPointMouseEnter, handleMouseLeave, colors, xaxisConfig, labelsConfig, chartData.logarithmic]);\n\n if (!hasValidData) {\n return (\n <div className=\"rounded-xl border border-gray-200/80 bg-white p-4 shadow-sm dark:border-gray-700/60 dark:bg-gray-800\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {title && <span className=\"font-medium\">{title}: </span>}\n {t('BiChat.Chart.NoData')}\n </p>\n </div>\n );\n }\n\n const handleExportPNG = async () => {\n setIsExporting(true);\n\n try {\n const chart = ApexCharts.getChartByID(chartId);\n if (!chart) {\n const msg = 'Chart instance not available';\n console.error(msg);\n onExportError?.(msg);\n return;\n }\n const result = await chart.dataURI({ scale: 2 });\n\n if (!('imgURI' in result)) {\n const msg = 'Unexpected dataURI result format';\n console.error(msg);\n onExportError?.(msg);\n return;\n }\n\n const link = document.createElement('a');\n link.href = result.imgURI;\n link.download = `${title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}_chart.png`;\n link.click();\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Failed to export chart';\n console.error('Failed to export chart:', error);\n onExportError?.(msg);\n } finally {\n setIsExporting(false);\n }\n };\n\n const fillHeight = host?.isFullscreen ?? false;\n const cardClassName = host\n ? `group/chart relative w-full min-w-0 overflow-hidden${fillHeight ? ' flex flex-col flex-1' : ''}`\n : 'group/chart relative rounded-xl border border-gray-200/80 bg-white p-4 shadow-sm transition-shadow duration-200 hover:shadow dark:border-gray-700/60 dark:bg-gray-800';\n const chartHeight = fillHeight\n ? '100%'\n : isRecord(options.chart) && typeof options.chart.height === 'number' ? options.chart.height : height;\n\n return (\n <div\n ref={cardRef}\n className={cardClassName}\n onMouseLeave={handleMouseLeave}\n >\n <div className={fillHeight ? 'flex-1 min-h-0 p-4' : undefined}>\n <ReactApexChart\n options={options}\n series={apexSeries}\n type={chartType}\n width=\"100%\"\n height={chartHeight}\n />\n </div>\n {useInlineTooltip && inlineTooltip && (\n <div\n className=\"pointer-events-none absolute z-20\"\n style={{\n left: `${inlineTooltip.left}px`,\n top: `${inlineTooltip.top}px`,\n transform: 'translate(-50%, -100%)',\n }}\n >\n <div className=\"min-w-[140px] overflow-hidden rounded-md border border-gray-200 bg-white text-xs text-gray-700 shadow-md dark:border-gray-600 dark:bg-gray-900 dark:text-gray-200\">\n {inlineTooltip.label && (\n <div className=\"border-b border-gray-200 px-2.5 py-1.5 font-medium dark:border-gray-600\">\n {inlineTooltip.label}\n </div>\n )}\n <div className=\"flex items-center gap-2 px-2.5 py-1.5\">\n <span className=\"h-2 w-2 rounded-full bg-primary-600\" />\n <span>\n {inlineTooltip.seriesName}: <strong>{inlineTooltip.value}</strong>\n </span>\n </div>\n </div>\n </div>\n )}\n <div className=\"flex justify-end pt-2\">\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={isExporting}\n className=\"inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-gray-400 opacity-0 transition-all duration-150 hover:bg-gray-100 hover:text-gray-600 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 group-hover/chart:opacity-100 disabled:opacity-50 dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n title={t('BiChat.Chart.Download')}\n >\n {isExporting ? (\n <span className=\"text-gray-500 dark:text-gray-400\">{t('BiChat.Chart.Exporting')}</span>\n ) : (\n <>\n <DownloadSimple className=\"h-3.5 w-3.5\" weight=\"bold\" />\n <span>{t('BiChat.Chart.DownloadPNG')}</span>\n </>\n )}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * TableExportButton Component\n * Small inline button for exporting markdown tables to Excel\n */\n\nimport { memo } from 'react';\nimport { FileXls } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface TableExportButtonProps {\n /** Click handler for export action */\n onClick: () => void\n /** Whether the button should be disabled */\n disabled?: boolean\n /** Export button label (defaults to \"Export\") */\n label?: string\n /** Disabled tooltip text */\n disabledTooltip?: string\n}\n\nexport const TableExportButton = memo(function TableExportButton({\n onClick,\n disabled = false,\n label,\n disabledTooltip,\n}: TableExportButtonProps) {\n const { t } = useTranslation();\n const resolvedLabel = label ?? t('BiChat.Export');\n const resolvedDisabledTooltip = disabledTooltip ?? t('BiChat.Common.PleaseWait');\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"cursor-pointer inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-green-700 dark:text-green-400 hover:text-green-800 dark:hover:text-green-300 disabled:text-gray-400 disabled:cursor-not-allowed transition-colors rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={resolvedLabel}\n title={disabled ? resolvedDisabledTooltip : resolvedLabel}\n >\n <FileXls size={16} weight=\"fill\" />\n <span>{resolvedLabel}</span>\n </button>\n );\n});\n","/**\n * Citation Processing Utility\n *\n * Transforms OpenAI citations from raw markers (e.g., ≡cite≡turn0search2≡)\n * to formatted inline citation markers (e.g., [1], [2]).\n *\n * Process:\n * 1. Sort citations by startIndex (descending) to process from end to start\n * 2. Replace character ranges [startIndex, endIndex] with numbered markers\n * 3. Return processed content with clean inline citation references\n */\n\nimport type { Citation } from '../types';\n\nexport interface ProcessedContent {\n /** Content with citation markers replaced by [1], [2], etc. */\n content: string\n /** Citations array with their display indices */\n citations: Array<Citation & { displayIndex: number }>\n}\n\n/**\n * Process message content to replace raw citation markers with formatted inline citations\n *\n * @param content - Raw message content with potential citation markers\n * @param citations - Array of citations with startIndex/endIndex positions\n * @returns Processed content with clean citation markers and indexed citations\n *\n * @example\n * ```ts\n * const result = processCitations(\n * \"Tesla reported $28B ≡cite≡turn0search2≡ revenue\",\n * [{ startIndex: 20, endIndex: 42, title: \"...\", url: \"...\", type: \"url_citation\" }]\n * )\n * // result.content = \"Tesla reported $28B [1] revenue\"\n * // result.citations = [{ ..., displayIndex: 1 }]\n * ```\n */\nexport function processCitations(\n content: string,\n citations: Citation[] | null | undefined\n): ProcessedContent {\n // If no citations, return content as-is\n if (!citations || citations.length === 0) {\n return { content, citations: [] };\n }\n\n // Sort citations by startIndex (descending) to process from end to start\n // This prevents index shifting issues when replacing text\n const sortedCitations = [...citations].sort((a, b) => b.startIndex - a.startIndex);\n\n let processedContent = content;\n const processedCitations: Array<Citation & { displayIndex: number }> = [];\n\n // Process each citation from end to start\n sortedCitations.forEach((citation, index) => {\n const { startIndex, endIndex } = citation;\n\n // Validate indices\n if (startIndex < 0 || endIndex > processedContent.length || startIndex >= endIndex) {\n console.warn('[citationProcessor] Invalid citation indices:', {\n startIndex,\n endIndex,\n contentLength: processedContent.length,\n });\n return;\n }\n\n // Calculate display index (1-based, in original order)\n const displayIndex = citations.length - index;\n\n // Replace the citation marker range with [N]\n const before = processedContent.slice(0, startIndex);\n const after = processedContent.slice(endIndex);\n processedContent = `${before}[${displayIndex}]${after}`;\n\n // Store citation with its display index\n processedCitations.unshift({\n ...citation,\n displayIndex,\n });\n });\n\n return {\n content: processedContent,\n citations: processedCitations,\n };\n}\n","/**\n * Shared chart spec parsing for draw_chart tool output and artifact metadata.\n * Used by SessionArtifactPreview, HttpDataSource (turn.charts), and MarkdownRenderer (code blocks).\n */\n\nimport type { ChartData, ChartSeries } from '../types';\n\nexport const SUPPORTED_CHART_TYPES = new Set<ChartData['chartType']>([\n 'line',\n 'bar',\n 'area',\n 'pie',\n 'donut',\n]);\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction cloneValue<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item)) as T;\n }\n if (isRecord(value)) {\n const out: Record<string, unknown> = {};\n Object.entries(value).forEach(([key, nested]) => {\n out[key] = cloneValue(nested);\n });\n return out as T;\n }\n return value;\n}\n\nfunction toStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {return undefined;}\n const result = value\n .map((item) => {\n if (typeof item === 'string') {return item;}\n if (typeof item === 'number' && Number.isFinite(item)) {return String(item);}\n return null;\n })\n .filter((item): item is string => typeof item === 'string');\n return result.length > 0 ? result : undefined;\n}\n\nfunction toChartSeriesFromApex(value: unknown): ChartSeries[] | null {\n if (!Array.isArray(value) || value.length === 0) {\n return null;\n }\n\n const result: ChartSeries[] = [];\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n if (!isRecord(item) || !Array.isArray(item.data)) {\n return null;\n }\n\n const data: number[] = [];\n for (const point of item.data) {\n if (typeof point === 'number' && Number.isFinite(point)) {\n data.push(point);\n continue;\n }\n if (isRecord(point) && typeof point.y === 'number' && Number.isFinite(point.y)) {\n data.push(point.y);\n continue;\n }\n return null;\n }\n\n if (data.length === 0) {\n return null;\n }\n\n const fallbackName = `Series ${i + 1}`;\n const name = typeof item.name === 'string' && item.name.trim() ? item.name : fallbackName;\n result.push({ name, data });\n }\n\n return result.length > 0 ? result : null;\n}\n\nfunction normalizeChartType(value: unknown): ChartData['chartType'] | null {\n if (typeof value !== 'string') {return null;}\n const normalized = value.trim().toLowerCase();\n if (SUPPORTED_CHART_TYPES.has(normalized as ChartData['chartType'])) {\n return normalized as ChartData['chartType'];\n }\n return null;\n}\n\nfunction readLogarithmicFromOptions(options: Record<string, unknown>): boolean | undefined {\n const yaxis = options.yaxis;\n if (isRecord(yaxis) && typeof yaxis.logarithmic === 'boolean') {\n return yaxis.logarithmic;\n }\n if (Array.isArray(yaxis)) {\n for (const axis of yaxis) {\n if (isRecord(axis) && typeof axis.logarithmic === 'boolean') {\n if (axis.logarithmic) {return true;}\n }\n }\n }\n return undefined;\n}\n\nfunction parseApexChartDataFromSpec(\n spec: Record<string, unknown>,\n fallbackTitle: string\n): ChartData | null {\n const options = isRecord(spec.options) ? spec.options : spec;\n const chart = isRecord(options.chart) ? options.chart : undefined;\n const chartType = normalizeChartType(chart?.type);\n if (!chartType) {return null;}\n\n const titleRaw = isRecord(options.title) ? options.title.text : options.title;\n const title = typeof titleRaw === 'string' && titleRaw.trim() ? titleRaw : fallbackTitle;\n\n const seriesRaw = options.series;\n let series: ChartSeries[] | null = null;\n if (chartType === 'pie' || chartType === 'donut') {\n if (Array.isArray(seriesRaw)) {\n const numeric = seriesRaw.filter((point): point is number => typeof point === 'number' && Number.isFinite(point));\n if (numeric.length > 0) {\n series = [{ name: title, data: numeric }];\n } else {\n series = toChartSeriesFromApex(seriesRaw);\n }\n }\n } else {\n series = toChartSeriesFromApex(seriesRaw);\n }\n if (!series) {return null;}\n\n const labels =\n toStringArray(options.labels) ||\n (isRecord(options.xaxis) ? toStringArray(options.xaxis.categories) : undefined);\n\n const colors = toStringArray(options.colors);\n const height =\n chart && typeof chart.height === 'number' && Number.isFinite(chart.height)\n ? chart.height\n : undefined;\n const logarithmic = readLogarithmicFromOptions(options);\n\n return {\n chartType,\n title,\n series,\n labels,\n colors,\n height,\n options: cloneValue(options),\n logarithmic,\n };\n}\n\n/**\n * Parses a chart spec object (Apex options at top-level or under `options`) into ChartData.\n */\nexport function parseChartDataFromSpec(\n spec: Record<string, unknown>,\n fallbackTitle = 'Chart'\n): ChartData | null {\n return parseApexChartDataFromSpec(spec, fallbackTitle);\n}\n\n/**\n * Parses a JSON string as a chart spec (e.g. from a ```chart or ```json code block).\n */\nexport function parseChartDataFromJsonString(\n json: string,\n fallbackTitle = 'Chart'\n): ChartData | null {\n const trimmed = json.trim();\n if (!trimmed) {return null;}\n\n let spec: unknown;\n try {\n spec = JSON.parse(trimmed);\n } catch {\n return null;\n }\n\n if (!isRecord(spec)) {return null;}\n return parseChartDataFromSpec(spec, fallbackTitle);\n}\n","/**\n * Normalizes common LaTeX delimiters used by LLMs into remark-math compatible\n * delimiters while preserving fenced and inline code sections.\n *\n * Supported conversions:\n * - \\[ ... \\] -> $$ ... $$\n * - \\( ... \\) -> $ ... $\n */\nexport function normalizeLatexDelimiters(markdown: string): string {\n if (!markdown || !hasLatexDelimiters(markdown)) {\n return markdown;\n }\n\n const lines = markdown.split('\\n');\n let inFence = false;\n let fenceMarker = '';\n const output: string[] = [];\n\n for (const line of lines) {\n const fence = parseFenceLine(line);\n if (fence) {\n if (!inFence) {\n inFence = true;\n fenceMarker = fence;\n } else if (fence[0] === fenceMarker[0] && fence.length >= fenceMarker.length) {\n inFence = false;\n fenceMarker = '';\n }\n output.push(line);\n continue;\n }\n\n if (inFence) {\n output.push(line);\n continue;\n }\n\n output.push(rewriteOutsideInlineCode(line));\n }\n\n return output.join('\\n');\n}\n\nfunction hasLatexDelimiters(markdown: string): boolean {\n return markdown.includes('\\\\[') || markdown.includes('\\\\]') || markdown.includes('\\\\(') || markdown.includes('\\\\)');\n}\n\nfunction parseFenceLine(line: string): string | null {\n const match = line.match(/^\\s*(`{3,}|~{3,})/);\n return match ? match[1] : null;\n}\n\nfunction rewriteOutsideInlineCode(line: string): string {\n const segments = line.split(/(`+[^`]*`+)/g);\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (segment.startsWith('`') && segment.endsWith('`')) {\n continue;\n }\n segments[i] = segment\n .replace(/\\\\\\[/g, () => '$$')\n .replace(/\\\\\\]/g, () => '$$')\n .replace(/\\\\\\(/g, '$')\n .replace(/\\\\\\)/g, '$');\n }\n return segments.join('');\n}\n","/**\n * TableWithExport Component\n * Wraps markdown tables with an export button that sends a message to export the table\n */\n\nimport { memo, useCallback, type ReactNode } from 'react';\nimport { TableExportButton } from './TableExportButton';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface TableWithExportProps {\n /** The table content to render */\n children: ReactNode\n /** Function to send a message (from chat context) */\n sendMessage?: (content: string) => void\n /** Whether sending is disabled (loading or streaming) */\n disabled?: boolean\n /** Custom export message to send */\n exportMessage?: string\n /** Export button label */\n exportLabel?: string\n}\n\nexport const TableWithExport = memo(function TableWithExport({\n children,\n sendMessage,\n disabled = false,\n exportMessage,\n exportLabel,\n}: TableWithExportProps) {\n const { t } = useTranslation();\n const resolvedExportMessage = exportMessage ?? t('BiChat.ExportTableToExcel');\n const resolvedExportLabel = exportLabel ?? t('BiChat.Export');\n const handleExport = useCallback(() => {\n sendMessage?.(resolvedExportMessage);\n }, [sendMessage, resolvedExportMessage]);\n\n return (\n <>\n <div className=\"markdown-table-wrapper overflow-x-auto\">\n <table className=\"markdown-table w-full border-collapse\">{children}</table>\n </div>\n {sendMessage && (\n <div className=\"flex justify-end mt-1\">\n <TableExportButton onClick={handleExport} disabled={disabled} label={resolvedExportLabel} />\n </div>\n )}\n </>\n );\n});\n","/**\n * CodeBlock Component\n * Syntax highlighted code blocks with copy functionality and dark mode support\n */\n\nimport { useState, useEffect, useRef, useSyncExternalStore, memo } from 'react';\nimport { Copy, Check } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { vscDarkPlus, vs } from 'react-syntax-highlighter/dist/esm/styles/prism';\n\ninterface CodeBlockProps {\n /** Programming language for syntax highlighting */\n language: string\n /** Code content to display */\n value: string\n /** Whether to render as inline code */\n inline?: boolean\n /** Copy button label (defaults to \"Copy\") */\n copyLabel?: string\n /** Copied confirmation label (defaults to \"Copied!\") */\n copiedLabel?: string\n}\n\n// Module-level singleton dark mode detection — shared across all CodeBlock instances\nconst darkModeStore = (() => {\n let current =\n typeof document !== 'undefined' &&\n (document.documentElement.classList.contains('dark') ||\n (!document.documentElement.classList.contains('light') &&\n window.matchMedia('(prefers-color-scheme: dark)').matches));\n const listeners = new Set<() => void>();\n\n function check() {\n const next =\n typeof document !== 'undefined' &&\n (document.documentElement.classList.contains('dark') ||\n (!document.documentElement.classList.contains('light') &&\n window.matchMedia('(prefers-color-scheme: dark)').matches));\n if (next !== current) {\n current = next;\n listeners.forEach((fn) => fn());\n }\n }\n\n if (typeof document !== 'undefined') {\n const observer = new MutationObserver(check);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', check);\n }\n\n return {\n subscribe: (fn: () => void) => {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n },\n getSnapshot: () => current,\n getServerSnapshot: () => false,\n };\n})();\n\nfunction useDarkMode() {\n return useSyncExternalStore(darkModeStore.subscribe, darkModeStore.getSnapshot, darkModeStore.getServerSnapshot);\n}\n\n// Language aliases for normalization\nconst languageMap: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n jsx: 'jsx',\n tsx: 'tsx',\n py: 'python',\n rb: 'ruby',\n yml: 'yaml',\n yaml: 'yaml',\n sh: 'bash',\n bash: 'bash',\n json: 'json',\n xml: 'xml',\n html: 'html',\n css: 'css',\n sql: 'sql',\n go: 'go',\n java: 'java',\n cpp: 'cpp',\n c: 'c',\n csharp: 'csharp',\n php: 'php',\n};\n\nfunction normalizeLanguage(lang: string): string {\n if (!lang) {return 'text';}\n return languageMap[lang.toLowerCase()] || lang.toLowerCase();\n}\n\nfunction CodeBlock({\n language,\n value,\n inline,\n copyLabel,\n copiedLabel,\n}: CodeBlockProps) {\n const { t } = useTranslation();\n const resolvedCopyLabel = copyLabel ?? t('BiChat.Message.Copy');\n const resolvedCopiedLabel = copiedLabel ?? t('BiChat.Message.Copied');\n const [copied, setCopied] = useState(false);\n const [copyFailed, setCopyFailed] = useState(false);\n const isDarkMode = useDarkMode();\n const copyTimeoutRef = useRef<number | null>(null);\n const copyFailedTimeoutRef = useRef<number | null>(null);\n\n const normalizedLanguage = normalizeLanguage(language);\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (copyTimeoutRef.current !== null) {\n clearTimeout(copyTimeoutRef.current);\n }\n if (copyFailedTimeoutRef.current !== null) {\n clearTimeout(copyFailedTimeoutRef.current);\n }\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setCopyFailed(false);\n // Clear any existing timeout before setting a new one\n if (copyTimeoutRef.current !== null) {\n clearTimeout(copyTimeoutRef.current);\n }\n copyTimeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n copyTimeoutRef.current = null;\n }, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n setCopyFailed(true);\n if (copyFailedTimeoutRef.current !== null) {\n clearTimeout(copyFailedTimeoutRef.current);\n }\n copyFailedTimeoutRef.current = window.setTimeout(() => {\n setCopyFailed(false);\n copyFailedTimeoutRef.current = null;\n }, 2000);\n }\n };\n\n // Inline code styling\n if (inline) {\n return (\n <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 rounded text-sm font-mono\">\n {value}\n </code>\n );\n }\n\n // Code block with syntax highlighting\n return (\n <div className=\"relative group my-4 rounded-lg overflow-hidden border border-gray-300 dark:border-gray-700\">\n {/* Language label and copy button */}\n <div className=\"flex items-center justify-between px-4 py-2 bg-gray-100 dark:bg-gray-800 border-b border-gray-300 dark:border-gray-700\">\n <span className=\"text-xs text-gray-600 dark:text-gray-400 font-medium uppercase\">\n {normalizedLanguage}\n </span>\n <button\n onClick={handleCopy}\n className={`text-xs transition-colors flex items-center gap-1.5 ${\n copyFailed\n ? 'text-red-500 dark:text-red-400'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white'\n }`}\n title={resolvedCopyLabel}\n aria-live=\"polite\"\n >\n {copied ? (\n <>\n <Check size={16} className=\"w-4 h-4\" />\n <span>{resolvedCopiedLabel}</span>\n </>\n ) : (\n <>\n <Copy size={16} className=\"w-4 h-4\" />\n <span>{copyFailed ? t('BiChat.Message.CopyFailed') : resolvedCopyLabel}</span>\n </>\n )}\n </button>\n </div>\n\n {/* Code content */}\n <SyntaxHighlighter\n language={normalizedLanguage}\n style={isDarkMode ? vscDarkPlus : vs}\n customStyle={{\n margin: 0,\n borderRadius: 0,\n fontSize: '0.875rem',\n lineHeight: '1.5',\n padding: '1rem',\n }}\n showLineNumbers={false}\n wrapLines={true}\n codeTagProps={{\n style: {\n fontFamily: '\"JetBrains Mono\", \"Fira Code\", \"Menlo\", monospace',\n },\n }}\n >\n {value}\n </SyntaxHighlighter>\n </div>\n );\n}\n\nconst MemoizedCodeBlock = memo(CodeBlock);\nMemoizedCodeBlock.displayName = 'CodeBlock';\n\nexport { MemoizedCodeBlock as CodeBlock };\nexport default MemoizedCodeBlock;\n","/**\n * MarkdownRenderer Component\n * Renders markdown with syntax highlighting, citations, and table export\n *\n * Features:\n * - Lazy-loaded CodeBlock for bundle optimization\n * - Citation processing (converts raw markers to numbered references)\n * - Table export functionality\n * - Custom CSS class names for styling flexibility\n * - GFM (GitHub Flavored Markdown) support\n */\n\nimport { memo, lazy, Suspense, useMemo, Children, isValidElement, type ReactNode } from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { processCitations } from '../utils/citationProcessor';\nimport { parseChartDataFromJsonString } from '../utils/chartSpec';\nimport { normalizeLatexDelimiters } from '../utils/markdownMath';\nimport type { Citation } from '../types';\nimport { TableWithExport } from './TableWithExport';\nimport { ChartCard } from './ChartCard';\nimport { useTranslation } from '../hooks/useTranslation';\n\n// Lazy load CodeBlock for bundle optimization\nconst CodeBlock = lazy(() => import('./CodeBlock').then((module) => ({ default: module.CodeBlock })));\n\ninterface MarkdownRendererProps {\n /** Markdown content to render */\n content: string\n /** Optional citations to process and display */\n citations?: Citation[] | null\n /** Optional function to send messages (enables table export) */\n sendMessage?: (content: string) => void\n /** Whether message sending is disabled */\n sendDisabled?: boolean\n /** Copy button label for code blocks */\n copyLabel?: string\n /** Copied confirmation label for code blocks */\n copiedLabel?: string\n /** Export button label for tables */\n exportLabel?: string\n}\n\ninterface CodeProps {\n inline?: boolean\n className?: string\n children?: React.ReactNode\n node?: {\n position?: {\n start?: { line?: number }\n end?: { line?: number }\n }\n }\n}\n\nconst INLINE_TAGS = new Set([\n 'a',\n 'abbr',\n 'b',\n 'br',\n 'code',\n 'em',\n 'i',\n 'img',\n 'kbd',\n 'mark',\n 's',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'u',\n]);\n\nfunction hasBlockChildren(children: ReactNode): boolean {\n return Children.toArray(children).some((child) => {\n if (!isValidElement(child)) {\n return false;\n }\n\n if (typeof child.type === 'string') {\n if (!INLINE_TAGS.has(child.type)) {\n return true;\n }\n\n return hasBlockChildren((child.props as { children?: ReactNode }).children);\n }\n\n // Non-DOM React components can render block nodes (e.g. lazy CodeBlock).\n return true;\n });\n}\n\nfunction MarkdownRenderer({\n content,\n citations,\n sendMessage,\n sendDisabled = false,\n copyLabel,\n copiedLabel,\n exportLabel,\n}: MarkdownRendererProps) {\n const { t } = useTranslation();\n const resolvedCopyLabel = copyLabel ?? t('BiChat.Message.Copy');\n const resolvedCopiedLabel = copiedLabel ?? t('BiChat.Message.Copied');\n const resolvedExportLabel = exportLabel ?? t('BiChat.Export');\n // Process citations to replace raw markers with [1], [2], etc.\n const processed = useMemo(() => {\n return processCitations(content, citations);\n }, [content, citations]);\n const normalizedContent = useMemo(() => normalizeLatexDelimiters(processed.content), [processed.content]);\n\n const components: Components = useMemo(\n () => ({\n // Remove <pre> wrapper for code blocks - CodeBlock provides its own container\n pre: ({ children }) => <>{children}</>,\n code({ inline, className, children, node }: CodeProps) {\n const match = /language-(\\w+)/.exec(className || '');\n const language = match ? match[1] : '';\n const value = String(children).replace(/\\n$/, '');\n\n // Some react-markdown versions may omit `inline`.\n // In that case, infer inline code conservatively from content shape.\n const hasLineBreak = value.includes('\\n');\n const startLine = node?.position?.start?.line;\n const endLine = node?.position?.end?.line;\n const spansSingleLine = startLine !== undefined && endLine !== undefined && startLine === endLine;\n const inferredInline = !className && !hasLineBreak && (spansSingleLine || startLine === undefined || endLine === undefined);\n const isInline = inline === true || (inline !== false && inferredInline);\n\n if (isInline) {\n return (\n <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 rounded text-sm font-mono\">\n {value}\n </code>\n );\n }\n\n const lang = language.toLowerCase();\n const chartData =\n lang === 'chart'\n ? parseChartDataFromJsonString(value, 'Chart')\n : lang === 'json' && value.includes('\"chartType\"')\n ? parseChartDataFromJsonString(value, 'Chart')\n : null;\n\n if (chartData) {\n return (\n <div className=\"my-4\">\n <ChartCard chartData={chartData} />\n </div>\n );\n }\n\n // Block code - rendered outside of <p> context due to pre handler above\n return (\n <Suspense\n fallback={\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\">\n <code className=\"text-sm font-mono\">{value}</code>\n </pre>\n }\n >\n <CodeBlock\n language={language}\n value={value}\n inline={false}\n copyLabel={resolvedCopyLabel}\n copiedLabel={resolvedCopiedLabel}\n />\n </Suspense>\n );\n },\n p: ({ children }) => {\n if (hasBlockChildren(children)) {\n return <div className=\"markdown-p my-2\">{children}</div>;\n }\n\n return <p className=\"markdown-p my-2\">{children}</p>;\n },\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"markdown-link text-[var(--bichat-color-accent)] underline decoration-[var(--bichat-color-accent)] decoration-from-font hover:text-[var(--bichat-color-accent-hover)] hover:decoration-[var(--bichat-color-accent-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-color-accent)] focus-visible:ring-offset-2 rounded\"\n >\n {children}\n </a>\n ),\n h1: ({ children }) => <h1 className=\"markdown-h1 text-2xl font-bold mt-6 mb-3\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"markdown-h2 text-xl font-bold mt-5 mb-2\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"markdown-h3 text-lg font-semibold mt-4 mb-2\">{children}</h3>,\n h4: ({ children }) => <h4 className=\"markdown-h4 text-base font-semibold mt-3 mb-1\">{children}</h4>,\n h5: ({ children }) => <h5 className=\"markdown-h5 text-sm font-semibold mt-2 mb-1\">{children}</h5>,\n h6: ({ children }) => <h6 className=\"markdown-h6 text-sm font-medium mt-2 mb-1\">{children}</h6>,\n ul: ({ children }) => <ul className=\"markdown-ul list-disc list-inside my-2 space-y-1\">{children}</ul>,\n ol: ({ children }) => <ol className=\"markdown-ol list-decimal list-inside my-2 space-y-1\">{children}</ol>,\n li: ({ children }) => <li className=\"markdown-li\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"markdown-blockquote border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-2 italic text-gray-600 dark:text-gray-400\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <TableWithExport\n sendMessage={sendMessage}\n disabled={sendDisabled}\n exportLabel={resolvedExportLabel}\n >\n {children}\n </TableWithExport>\n ),\n thead: ({ children }) => (\n <thead className=\"markdown-thead bg-gray-100 dark:bg-gray-800\">{children}</thead>\n ),\n tbody: ({ children }) => <tbody className=\"markdown-tbody\">{children}</tbody>,\n tr: ({ children }) => (\n <tr className=\"markdown-tr border-b border-gray-200 dark:border-gray-700\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"markdown-th px-3 py-2 text-left text-sm font-semibold text-gray-700 dark:text-gray-300\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"markdown-td px-3 py-2 text-sm text-gray-600 dark:text-gray-400\">{children}</td>\n ),\n hr: () => <hr className=\"markdown-hr my-4 border-gray-200 dark:border-gray-700\" />,\n strong: ({ children }) => <strong className=\"markdown-strong font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"markdown-em italic\">{children}</em>,\n }),\n [resolvedCopyLabel, resolvedCopiedLabel, resolvedExportLabel, sendMessage, sendDisabled],\n );\n\n return (\n <div className=\"markdown-content\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[[rehypeKatex, { strict: 'ignore', throwOnError: false, output: 'mathml' }]]}\n components={components}\n >\n {normalizedContent}\n </ReactMarkdown>\n </div>\n );\n}\n\nconst MemoizedMarkdownRenderer = memo(MarkdownRenderer);\nMemoizedMarkdownRenderer.displayName = 'MarkdownRenderer';\n\nexport { MemoizedMarkdownRenderer as MarkdownRenderer };\nexport default MemoizedMarkdownRenderer;\n","/**\n * Per-session rate limiter\n * Prevents excessive requests within a time window\n */\n\nexport interface RateLimiterConfig {\n maxRequests: number\n windowMs: number\n}\n\nexport class RateLimiter {\n private timestamps: number[] = [];\n private maxRequests: number;\n private windowMs: number;\n\n constructor(config: RateLimiterConfig) {\n this.maxRequests = config.maxRequests;\n this.windowMs = config.windowMs;\n }\n\n /**\n * Check if a request can be made\n * Updates internal state if request is allowed\n */\n canMakeRequest(): boolean {\n const now = Date.now();\n\n // Remove timestamps outside the current window\n this.timestamps = this.timestamps.filter(t => now - t < this.windowMs);\n\n // Check if limit exceeded\n if (this.timestamps.length >= this.maxRequests) {\n return false;\n }\n\n // Add current timestamp\n this.timestamps.push(now);\n return true;\n }\n\n /**\n * Get milliseconds until next request is allowed\n * Returns 0 if request can be made immediately\n */\n getTimeUntilNextRequest(): number {\n if (this.timestamps.length < this.maxRequests) {\n return 0;\n }\n\n const now = Date.now();\n const oldestTimestamp = this.timestamps[0];\n const timeElapsed = now - oldestTimestamp;\n const timeRemaining = this.windowMs - timeElapsed;\n\n return Math.max(0, timeRemaining);\n }\n\n /**\n * Reset the rate limiter state\n */\n reset(): void {\n this.timestamps = [];\n }\n}\n","/**\n * Type definitions for BI-Chat UI components\n */\n\n// ============================================================================\n// Session Types\n// ============================================================================\n\nexport interface Session {\n id: string;\n title: string;\n status: \"active\" | \"archived\";\n pinned: boolean;\n createdAt: string;\n updatedAt: string;\n owner?: SessionUser;\n isGroup?: boolean;\n memberCount?: number;\n access?: SessionAccess;\n}\n\nexport interface SessionAccess {\n role: \"owner\" | \"editor\" | \"viewer\" | \"read_all\" | \"none\";\n source: \"owner\" | \"member\" | \"permission\" | \"none\";\n canRead: boolean;\n canWrite: boolean;\n canManageMembers: boolean;\n}\n\n// ============================================================================\n// Turn-Based Architecture Types\n// ============================================================================\n\n/**\n * A conversation turn groups a user message with its assistant response.\n * This provides a cleaner mental model than flat message lists.\n */\nexport interface ConversationTurn {\n id: string;\n sessionId: string;\n userTurn: UserTurn;\n assistantTurn?: AssistantTurn;\n createdAt: string;\n}\n\n/**\n * Content of a user's message in a conversation turn\n */\nexport interface UserTurn {\n id: string;\n content: string;\n attachments: Attachment[];\n author?: SessionUser;\n createdAt: string;\n}\n\n/**\n * Assistant turn lifecycle used by renderers to distinguish completed output\n * from HITL checkpoints that require user input.\n */\nexport type AssistantTurnLifecycle = \"complete\" | \"waiting_for_human_input\";\n\n/**\n * Content of an assistant's response in a conversation turn\n */\nexport interface AssistantTurn {\n id: string;\n role: MessageRole;\n content: string;\n explanation?: string;\n citations: Citation[];\n toolCalls?: ToolCall[];\n charts?: ChartData[];\n renderTables?: RenderTableData[];\n artifacts: Artifact[];\n codeOutputs: CodeOutput[];\n lifecycle: AssistantTurnLifecycle;\n debug?: DebugTrace;\n createdAt: string;\n}\n\n// ============================================================================\n// Message Role Enum\n// ============================================================================\n\n/**\n * Role of a message in a conversation\n */\nexport enum MessageRole {\n User = \"user\",\n Assistant = \"assistant\",\n System = \"system\",\n Tool = \"tool\",\n}\n\n// ============================================================================\n// Tool Call Types\n// ============================================================================\n\n/**\n * A tool/function call made by the assistant\n */\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: string;\n result?: string;\n error?: string;\n durationMs?: number;\n}\n\n// ============================================================================\n// Citation Types\n// ============================================================================\n\n/**\n * Citation with position information for inline replacement\n */\nexport interface Citation {\n id: string;\n /** Type of citation (e.g., \"url_citation\") */\n type: string;\n /** Title of the cited source */\n title: string;\n /** URL of the cited source */\n url: string;\n /** Starting character index in the message content where this citation is referenced */\n startIndex: number;\n /** Ending character index in the message content where this citation is referenced */\n endIndex: number;\n /** Optional excerpt from the source */\n excerpt?: string;\n}\n\nexport interface Attachment {\n id?: string;\n clientKey: string;\n uploadId?: number;\n filename: string;\n mimeType: string;\n sizeBytes: number;\n base64Data?: string;\n url?: string;\n preview?: string;\n}\n\n// Image attachment with preview for MessageInput\nexport type ImageAttachment = Attachment & {\n base64Data: string;\n preview: string;\n};\n\n// ============================================================================\n// Code Interpreter Output Types\n// ============================================================================\n\n/**\n * Output from code interpreter tool\n */\nexport interface CodeOutput {\n type: \"image\" | \"text\" | \"error\";\n content: string;\n /** File metadata for downloadable outputs */\n filename?: string;\n mimeType?: string;\n sizeBytes?: number;\n}\n\n// ============================================================================\n// Message Queue Types\n// ============================================================================\n\n/**\n * Queued message for offline/loading state\n */\nexport interface QueuedMessage {\n content: string;\n attachments: Attachment[];\n}\n\n// ============================================================================\n// Chart Types (ApexCharts format)\n// ============================================================================\n\n/**\n * Chart visualization data for ApexCharts\n */\nexport interface ChartData {\n /** Type of chart: line, bar, pie, area, or donut */\n chartType: \"line\" | \"bar\" | \"area\" | \"pie\" | \"donut\";\n /** Chart title displayed above the chart */\n title: string;\n /** Data series (multiple allowed for line/bar/area, single for pie/donut) */\n series: ChartSeries[];\n /** X-axis category labels or segment labels for pie/donut */\n labels?: string[];\n /** Hex color codes for series (e.g., '#4CAF50') */\n colors?: string[];\n /** Chart height in pixels */\n height?: number;\n /** Optional original Apex options (used by richer renderers) */\n options?: Record<string, unknown>;\n /** Optional logarithmic Y-axis hint */\n logarithmic?: boolean;\n}\n\n/**\n * A single data series in a chart\n */\nexport interface ChartSeries {\n /** Display name for this series */\n name: string;\n /** Numeric data values */\n data: number[];\n}\n\nexport interface RenderTableExport {\n url: string;\n filename: string;\n rowCount?: number;\n fileSizeKB?: number;\n}\n\nexport interface RenderTableData {\n id: string;\n title?: string;\n query: string;\n columns: string[];\n columnTypes?: string[];\n headers: string[];\n rows: unknown[][];\n totalRows: number;\n pageSize: number;\n truncated: boolean;\n truncatedReason?: string;\n export?: RenderTableExport;\n exportPrompt?: string;\n}\n\nexport interface Artifact {\n type: \"excel\" | \"pdf\";\n filename: string;\n url: string;\n sizeReadable?: string;\n rowCount?: number;\n description?: string;\n}\n\nexport interface SessionArtifact {\n id: string;\n sessionId: string;\n messageId?: string;\n uploadId?: number;\n type: string;\n name: string;\n description?: string;\n mimeType?: string;\n url?: string;\n sizeBytes: number;\n metadata?: Record<string, unknown>;\n createdAt: string;\n}\n\n// ============================================================================\n// HITL (Human-in-the-Loop) Question Types\n// ============================================================================\n\nexport interface PendingQuestion {\n id: string;\n turnId: string;\n agentName?: string;\n questions: Question[];\n status:\n | \"PENDING\"\n | \"ANSWER_SUBMITTED\"\n | \"REJECT_SUBMITTED\"\n | \"ANSWER_RESUME_FAILED\"\n | \"REJECT_RESUME_FAILED\"\n | \"ANSWERED\"\n | \"REJECTED\"\n | \"CANCELLED\";\n}\n\nexport interface Question {\n id: string;\n text: string;\n type: \"SINGLE_CHOICE\" | \"MULTIPLE_CHOICE\";\n options?: QuestionOption[];\n required?: boolean;\n}\n\nexport interface QuestionOption {\n id: string;\n label: string;\n value: string;\n}\n\n/**\n * Answer data for a single question, including predefined options and custom \"Other\" text.\n */\nexport interface QuestionAnswerData {\n /** Selected predefined options (option IDs) */\n options: string[];\n /** Custom text entered for an \"Other\" answer; mutually exclusive with options */\n customText?: string;\n}\n\n/**\n * Map of question IDs to answer data.\n * Supports both multi-select options and custom \"Other\" text input.\n */\nexport interface QuestionAnswers {\n [questionId: string]: QuestionAnswerData;\n}\n\n// ---------------------------------------------------------------------------\n// Activity Trace — ephemeral state during streaming\n// ---------------------------------------------------------------------------\n\n/**\n * A single step in the ephemeral activity trace shown during streaming.\n * Steps represent thinking, tool calls, or sub-agent delegations.\n */\nexport interface ActivityStep {\n id: string;\n type: \"thinking\" | \"tool\" | \"agent_delegation\";\n toolName: string;\n /** Raw tool arguments JSON string (used for label interpolation, e.g., delegation agent name). */\n arguments?: string;\n agentName?: string;\n status: \"active\" | \"completed\" | \"failed\";\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n error?: string;\n}\n\n// ---------------------------------------------------------------------------\n// StreamEvent — discriminated union for type-safe stream handling\n// ---------------------------------------------------------------------------\n\nexport type StreamEvent =\n | { type: \"content\"; content: string }\n | { type: \"thinking\"; content: string }\n | { type: \"tool_start\"; tool: StreamToolPayload }\n | { type: \"tool_end\"; tool: StreamToolPayload }\n | { type: \"usage\"; usage: DebugUsage }\n | { type: \"user_message\"; sessionId: string }\n | { type: \"interrupt\"; interrupt: StreamInterruptPayload; sessionId?: string }\n | { type: \"text_block_end\"; seq: number }\n | { type: \"done\"; sessionId?: string; generationMs?: number }\n | { type: \"error\"; error: string };\n\n/** Partial state when resuming a stream after refresh */\nexport interface StreamSnapshotPayload {\n partialContent?: string;\n partialMetadata?: Record<string, unknown>;\n}\n\n/** Active stream status for a session (from GET /stream/status) */\nexport interface StreamStatus {\n active: boolean;\n runId?: string;\n snapshot?: StreamSnapshotPayload;\n startedAt?: number;\n}\n\nexport interface AsyncRunAccepted {\n accepted: true;\n operation: \"question_submit\" | \"question_reject\" | \"session_compact\";\n sessionId: string;\n runId: string;\n startedAt: number;\n}\n\n/**\n * @deprecated Use `StreamEvent` instead. `StreamChunk` is kept for backwards\n * compatibility but the flat all-optional shape is unsound.\n */\nexport interface StreamChunk {\n type:\n | \"chunk\"\n | \"content\"\n | \"thinking\"\n | \"tool_start\"\n | \"tool_end\"\n | \"usage\"\n | \"done\"\n | \"error\"\n | \"user_message\"\n | \"interrupt\"\n | \"snapshot\"\n | \"stream_started\"\n | \"text_block_end\";\n content?: string;\n error?: string;\n sessionId?: string;\n usage?: DebugUsage;\n tool?: StreamToolPayload;\n interrupt?: StreamInterruptPayload;\n generationMs?: number;\n timestamp?: number;\n snapshot?: StreamSnapshotPayload;\n /** Set when type is 'stream_started'; client should store for refresh-safe resume */\n runId?: string;\n /**\n * Zero-based ordinal of the assistant text segment that just ended.\n * Populated only when type === \"text_block_end\". Used to split the\n * accumulated assistant content into distinct blocks interleaved with\n * tool_call UI (text → tool → text → tool → final_text).\n */\n textBlockSeq?: number;\n}\n\n/**\n * Per-tenant active-run status event. Delivered via the\n * GET /bi-chat/stream/active-runs SSE endpoint. The first batch after\n * connect carries `event === \"snapshot\"` for each currently-running\n * session; subsequent rows carry `event === \"update\"` as runs\n * transition (queued → streaming → completed / cancelled / failed).\n */\nexport interface ActiveRunDelivery {\n event: \"snapshot\" | \"update\";\n sessionId: string;\n runId: string;\n status: \"queued\" | \"streaming\" | \"completed\" | \"cancelled\" | \"failed\";\n updatedAt: number;\n}\n\nexport interface StreamInterruptPayload {\n checkpointId: string;\n agentName?: string;\n questions: StreamInterruptQuestion[];\n}\n\nexport interface StreamInterruptQuestion {\n id: string;\n text: string;\n type: string;\n options: Array<{ id: string; label: string }>;\n}\n\nexport interface DebugUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n cachedTokens?: number;\n cost?: number;\n}\n\nexport interface StreamToolPayload {\n callId?: string;\n name: string;\n arguments?: string;\n result?: string;\n error?: string;\n durationMs?: number;\n agentName?: string;\n}\n\nexport interface DebugTrace {\n schemaVersion?: string;\n startedAt?: string;\n completedAt?: string;\n generationMs?: number;\n usage?: DebugUsage;\n tools: StreamToolPayload[];\n attempts?: DebugGeneration[];\n spans?: DebugSpan[];\n events?: DebugEvent[];\n traceId?: string;\n traceUrl?: string;\n sessionId?: string;\n thinking?: string;\n observationReason?: string;\n}\n\nexport interface DebugGeneration {\n id?: string;\n requestId?: string;\n model?: string;\n provider?: string;\n finishReason?: string;\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n cachedTokens?: number;\n cost?: number;\n latencyMs?: number;\n input?: string;\n output?: string;\n thinking?: string;\n observationReason?: string;\n startedAt?: string;\n completedAt?: string;\n toolCalls?: StreamToolPayload[];\n}\n\nexport interface DebugSpan {\n id?: string;\n parentId?: string;\n generationId?: string;\n name?: string;\n type?: string;\n status?: string;\n level?: string;\n callId?: string;\n toolName?: string;\n input?: string;\n output?: string;\n error?: string;\n durationMs?: number;\n startedAt?: string;\n completedAt?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DebugEvent {\n id?: string;\n name?: string;\n type?: string;\n level?: string;\n message?: string;\n reason?: string;\n spanId?: string;\n generationId?: string;\n timestamp?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DebugLimits {\n policyMaxTokens: number;\n modelMaxTokens: number;\n effectiveMaxTokens: number;\n completionReserveTokens: number;\n}\n\nexport interface SessionDebugUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n turnsWithUsage: number;\n latestPromptTokens: number;\n latestCompletionTokens: number;\n latestTotalTokens: number;\n}\n\nexport interface SendMessageOptions {\n debugMode?: boolean;\n replaceFromMessageID?: string;\n reasoningEffort?: string;\n model?: string;\n /**\n * Client-generated idempotency key. Duplicate sends sharing the same\n * requestId within the backend's dedupe window (~30 min) converge on\n * a single server-side run. Omit to disable dedupe for a particular\n * send; the data source auto-generates one per call otherwise.\n */\n requestId?: string;\n}\n\n// ============================================================================\n// Data Source Interface\n// ============================================================================\n\nexport interface SessionListResult {\n sessions: Session[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface SessionUser {\n id: string;\n firstName: string;\n lastName: string;\n initials: string;\n}\n\nexport interface SessionMember {\n user: SessionUser;\n role: \"owner\" | \"editor\" | \"viewer\";\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SessionGroup {\n name: string;\n sessions: Session[];\n}\n\n// Re-export split interfaces for consumers that only need a subset\nexport type {\n SessionStore,\n MessageTransport,\n ArtifactStore,\n AdminStore,\n} from \"./data-source\";\n\n/**\n * Full data source interface for BiChat.\n *\n * Combines session CRUD, message transport, and optional artifact/admin\n * methods. Existing implementations satisfy this without changes.\n *\n * For new code, prefer the focused interfaces (`SessionStore`,\n * `MessageTransport`, `ArtifactStore`, `AdminStore`) when you only need a\n * subset of capabilities.\n */\nexport interface ChatDataSource {\n // Core operations\n createSession(): Promise<Session>;\n fetchSession(id: string): Promise<{\n session: Session;\n turns: ConversationTurn[];\n pendingQuestion?: PendingQuestion | null;\n } | null>;\n fetchSessionArtifacts?(\n sessionId: string,\n options?: { limit?: number; offset?: number },\n ): Promise<{\n artifacts: SessionArtifact[];\n hasMore?: boolean;\n nextOffset?: number;\n }>;\n uploadSessionArtifacts?(\n sessionId: string,\n files: File[],\n ): Promise<{ artifacts: SessionArtifact[] }>;\n renameSessionArtifact?(\n artifactId: string,\n name: string,\n description?: string,\n ): Promise<SessionArtifact>;\n deleteSessionArtifact?(artifactId: string): Promise<void>;\n sendMessage(\n sessionId: string,\n content: string,\n attachments?: Attachment[],\n signal?: AbortSignal,\n options?: SendMessageOptions,\n ): AsyncGenerator<StreamChunk>;\n clearSessionHistory(sessionId: string): Promise<{\n success: boolean;\n deletedMessages: number;\n deletedArtifacts: number;\n }>;\n compactSessionHistory(sessionId: string): Promise<AsyncRunAccepted>;\n submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers,\n ): Promise<{\n success: boolean;\n data?: AsyncRunAccepted;\n error?: string;\n }>;\n rejectPendingQuestion(\n sessionId: string,\n ): Promise<{ success: boolean; data?: AsyncRunAccepted; error?: string }>;\n /**\n * Stops the active stream for the given session. No partial assistant message is persisted.\n * Optional for backward compatibility with data sources that do not support stop.\n */\n stopGeneration?(sessionId: string): Promise<void>;\n /**\n * Returns active stream status for the session (for refresh-safe resume).\n * Optional; if absent, no resume/passive flow is used.\n */\n getStreamStatus?(sessionId: string): Promise<StreamStatus | null>;\n /**\n * Resumes an active stream: delivers snapshot then new chunks. Use when getStreamStatus\n * reported active and the client has the same-browser run marker.\n * Optional; if absent, resume is not supported.\n */\n resumeStream?(\n sessionId: string,\n runId: string,\n onChunk: (chunk: StreamChunk) => void,\n signal?: AbortSignal,\n ): Promise<void>;\n /**\n * Tail a run via native EventSource against GET /stream/events. Honours\n * Last-Event-ID for auto-reconnect on wifi drops / tab sleep. Prefer\n * over resumeStream when connecting to a run that was started by\n * another tab (same request_id) or that needs to survive a reload\n * via cursor-based replay. Optional; data sources that don't\n * implement it fall back to resumeStream.\n */\n subscribeRunEvents?(\n sessionId: string,\n runId: string,\n options: {\n lastEventId?: string;\n onChunk: (chunk: StreamChunk) => void;\n onError?: (event: Event) => void;\n signal?: AbortSignal;\n },\n ): Promise<void>;\n /**\n * Subscribe to the per-tenant active-run fan-out\n * (GET /stream/active-runs). Emits one \"snapshot\" event per\n * currently-running session on connect, then live \"update\" deltas.\n * Optional; data sources that don't implement it fall back to\n * per-session polling via getStreamStatus.\n */\n subscribeActiveRuns?(options: {\n onEvent: (event: ActiveRunDelivery) => void;\n onError?: (event: Event) => void;\n signal?: AbortSignal;\n }): Promise<void>;\n // Session management\n listSessions(options?: {\n limit?: number;\n offset?: number;\n includeArchived?: boolean;\n }): Promise<SessionListResult>;\n archiveSession(sessionId: string): Promise<Session>;\n unarchiveSession(sessionId: string): Promise<Session>;\n pinSession(sessionId: string): Promise<Session>;\n unpinSession(sessionId: string): Promise<Session>;\n deleteSession(sessionId: string): Promise<void>;\n renameSession(sessionId: string, title: string): Promise<Session>;\n regenerateSessionTitle(sessionId: string): Promise<Session>;\n\n // Organization-wide features (optional)\n listUsers?(): Promise<SessionUser[]>;\n listAllSessions?(options?: {\n limit?: number;\n offset?: number;\n includeArchived?: boolean;\n userId?: string | null;\n }): Promise<{\n sessions: Session[];\n total: number;\n hasMore: boolean;\n }>;\n listSessionMembers?(sessionId: string): Promise<SessionMember[]>;\n addSessionMember?(\n sessionId: string,\n userId: string,\n role: \"editor\" | \"viewer\",\n ): Promise<void>;\n updateSessionMemberRole?(\n sessionId: string,\n userId: string,\n role: \"editor\" | \"viewer\",\n ): Promise<void>;\n removeSessionMember?(sessionId: string, userId: string): Promise<void>;\n}\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n// ============================================================================\n// Split Context Value Types\n// ============================================================================\n\nexport interface ChatSessionStateValue {\n session: Session | null;\n currentSessionId?: string;\n fetching: boolean;\n error: string | null;\n errorRetryable: boolean;\n debugMode: boolean;\n sessionDebugUsage: SessionDebugUsage;\n debugLimits: DebugLimits | null;\n reasoningEffort: string | undefined;\n reasoningEffortOptions: string[] | undefined;\n model: string | undefined;\n setError: (error: string | null) => void;\n retryFetchSession: () => void;\n setReasoningEffort: (effort: string) => void;\n setModel: (model: string | undefined) => void;\n}\n\nexport interface ChatMessagingStateValue {\n turns: ConversationTurn[];\n streamingContent: string;\n isStreaming: boolean;\n streamError: string | null;\n streamErrorRetryable: boolean;\n loading: boolean;\n pendingQuestion: PendingQuestion | null;\n codeOutputs: CodeOutput[];\n isCompacting: boolean;\n compactionSummary: string | null;\n /** Bumped when artifacts should be refetched (e.g. tool_end for artifact-producing tools). */\n artifactsInvalidationTrigger: number;\n /** Ephemeral reasoning/thinking content, cleared when final answer arrives. */\n thinkingContent: string;\n /** Ephemeral activity steps (tools, thinking, delegations), cleared on done. */\n activeSteps: ActivityStep[];\n showActivityTrace: boolean;\n showTypingIndicator: boolean;\n sendMessage: (content: string, attachments?: Attachment[]) => Promise<void>;\n handleRegenerate?: (turnId: string, model?: string) => Promise<void>;\n handleEdit?: (turnId: string, newContent: string) => Promise<void>;\n handleCopy: (text: string) => Promise<void>;\n handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void;\n handleRejectPendingQuestion: () => Promise<void>;\n retryLastMessage: () => Promise<void>;\n clearStreamError: () => void;\n cancel: () => void;\n setCodeOutputs: (outputs: CodeOutput[]) => void;\n}\n\nexport interface ChatInputStateValue {\n message: string;\n inputError: string | null;\n messageQueue: QueuedMessage[];\n setMessage: (message: string) => void;\n setInputError: (error: string | null) => void;\n handleSubmit: (\n e: { preventDefault: () => void },\n attachments?: Attachment[],\n ) => void;\n handleUnqueue: () => { content: string; attachments: Attachment[] } | null;\n enqueueMessage: (content: string, attachments: Attachment[]) => boolean;\n removeQueueItem: (index: number) => void;\n updateQueueItem: (index: number, content: string) => void;\n}\n\n// ============================================================================\n// Combined Context Value (backwards compatible)\n// ============================================================================\n\nexport interface ChatSessionContextValue\n extends ChatSessionStateValue,\n ChatMessagingStateValue,\n ChatInputStateValue {\n /**\n * @deprecated Use `retryLastMessage` from `ChatMessagingStateValue` instead.\n * This field is not populated by the current ChatMachine-based provider and\n * will always be `undefined` at runtime.\n */\n handleRetry?: () => Promise<void>;\n}\n\n// Translations\nexport type Translations = Record<string, string>;\n\n// Branding\nexport interface ExamplePrompt {\n category: string;\n text: string;\n icon: string;\n}\n\nexport interface BrandingConfig {\n appName: string;\n logoUrl?: string;\n theme?: {\n primary?: string;\n secondary?: string;\n accent?: string;\n };\n welcome?: {\n title?: string;\n description?: string;\n examplePrompts?: ExamplePrompt[];\n };\n colors?: {\n primary?: string;\n secondary?: string;\n accent?: string;\n };\n logo?: {\n src?: string;\n alt?: string;\n };\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') {return false;}\n\n const url = new URL(window.location.href);\n if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1';\n } catch {\n return false;\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string;\n details?: unknown;\n cause?: unknown;\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message);\n this.name = 'AppletRPCException';\n this.code = args.code;\n this.details = args.details;\n this.cause = args.cause;\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n });\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n });\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n });\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>;\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n });\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n });\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n });\n\n return json.result as TResult;\n } catch (err) {\n let rpcErr: unknown = err;\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n });\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n });\n throw rpcErr;\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>;\n }\n\n return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') {return;}\n\n if (!shouldEnableAppletDevtools()) {return;}\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return Math.max(0, Math.round(now - startedAt));\n}\n","/**\n * Error display utilities for structured RPC error handling.\n * Distinguishes permission-denied errors (amber styling) from generic errors (red styling).\n */\n\nimport { AppletRPCException } from '../../applet-host';\n\nexport interface RPCErrorDisplay {\n title: string\n description: string\n isPermissionDenied: boolean\n}\n\nexport interface NormalizedRPCError extends RPCErrorDisplay {\n code: string\n retryable: boolean\n userMessage: string\n isTimeout: boolean\n isOffline: boolean\n isCanceled: boolean\n isNotFound: boolean\n}\n\n/**\n * Check whether an error represents a permission-denied / forbidden response.\n */\nexport function isPermissionDeniedError(error: unknown): boolean {\n if (!error) {return false;}\n\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n if (msg.includes('forbidden') || msg.includes('permission denied')) {return true;}\n }\n\n if (typeof error === 'object' && error !== null) {\n const obj = error as Record<string, unknown>;\n\n // RPC error shape: { code: 'forbidden' } or { status: 403 }\n if (obj.code === 'forbidden' || obj.code === 403) {return true;}\n if (obj.status === 403) {return true;}\n if (obj.statusCode === 403) {return true;}\n\n // Nested response: { response: { status: 403 } }\n if (typeof obj.response === 'object' && obj.response !== null) {\n const resp = obj.response as Record<string, unknown>;\n if (resp.status === 403) {return true;}\n }\n }\n\n if (typeof error === 'string') {\n const lower = error.toLowerCase();\n if (lower.includes('forbidden') || lower.includes('permission denied')) {return true;}\n }\n\n return false;\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {return undefined;}\n const obj = error as Record<string, unknown>;\n\n if (typeof obj.status === 'number') {return obj.status;}\n if (typeof obj.statusCode === 'number') {return obj.statusCode;}\n\n if (typeof obj.details === 'object' && obj.details !== null) {\n const details = obj.details as Record<string, unknown>;\n if (typeof details.status === 'number') {return details.status;}\n if (typeof details.statusCode === 'number') {return details.statusCode;}\n }\n\n if (typeof obj.response === 'object' && obj.response !== null) {\n const response = obj.response as Record<string, unknown>;\n if (typeof response.status === 'number') {return response.status;}\n }\n\n return undefined;\n}\n\nfunction isOfflineNow(): boolean {\n return typeof navigator !== 'undefined' && navigator.onLine === false;\n}\n\nfunction inferErrorCode(error: unknown): string {\n if (isOfflineNow()) {return 'offline';}\n\n if (error instanceof AppletRPCException) {\n const code = String(error.code || '').toLowerCase().trim();\n if (code) {return code;}\n }\n\n if (typeof error === 'object' && error !== null) {\n const obj = error as Record<string, unknown>;\n if (typeof obj.code === 'string' && obj.code.trim() !== '') {\n return obj.code.toLowerCase();\n }\n if (typeof obj.error === 'string' && obj.error.trim() !== '') {\n return obj.error.toLowerCase();\n }\n }\n\n const status = extractStatus(error);\n if (status === 401 || status === 403) {return 'forbidden';}\n if (status === 404) {return 'not_found';}\n if (status === 408) {return 'timeout';}\n if (status === 413) {return 'payload_too_large';}\n if (status === 429) {return 'rate_limited';}\n if (status && status >= 500) {return 'server_error';}\n if (status && status >= 400) {return 'bad_request';}\n\n let message = '';\n if (error instanceof Error) {message = error.message;}\n if (!message && typeof error === 'string') {message = error;}\n const lower = message.toLowerCase();\n\n if (lower.includes('timeout') || lower.includes('timed out')) {return 'timeout';}\n if (lower.includes('abort') || lower.includes('cancel')) {return 'aborted';}\n if (lower.includes('forbidden') || lower.includes('permission denied')) {return 'forbidden';}\n if (lower.includes('not found') || lower.includes('session not found')) {return 'not_found';}\n if (lower.includes('payload too large') || lower.includes('request too large') || lower.includes('413')) {return 'payload_too_large';}\n if (lower.includes('network') || lower.includes('failed to fetch')) {return 'network_error';}\n\n return 'unknown';\n}\n\nfunction describeCode(code: string, fallbackTitle: string): { title: string; description: string; retryable: boolean } {\n switch (code) {\n case 'offline':\n return {\n title: 'You are offline',\n description: 'Check your internet connection and try again.',\n retryable: true,\n };\n case 'timeout':\n return {\n title: 'Request timed out',\n description: 'The request took too long. Please try again.',\n retryable: true,\n };\n case 'aborted':\n return {\n title: 'Request canceled',\n description: 'The request was canceled before completion.',\n retryable: true,\n };\n case 'forbidden':\n return {\n title: 'Access denied',\n description: 'Your account does not have permission for this action.',\n retryable: false,\n };\n case 'not_found':\n return {\n title: 'Not found',\n description: 'The requested resource could not be found.',\n retryable: false,\n };\n case 'payload_too_large':\n return {\n title: 'Attachment too large',\n description: 'The uploaded payload exceeds allowed limits. Reduce file size and retry.',\n retryable: false,\n };\n case 'invalid_request':\n case 'validation':\n case 'bad_request':\n return {\n title: 'Invalid request',\n description: 'The request could not be processed. Review the input and try again.',\n retryable: false,\n };\n case 'rate_limited':\n return {\n title: 'Too many requests',\n description: 'Please wait a moment before trying again.',\n retryable: true,\n };\n case 'http_error':\n case 'server_error':\n return {\n title: 'Server error',\n description: 'The server failed to process this request. Please retry shortly.',\n retryable: true,\n };\n case 'network_error':\n return {\n title: 'Network error',\n description: 'A network issue interrupted the request. Please try again.',\n retryable: true,\n };\n default:\n return {\n title: fallbackTitle,\n description: 'Something went wrong. Please try again.',\n retryable: true,\n };\n }\n}\n\nexport function normalizeRPCError(error: unknown, fallbackTitle: string): NormalizedRPCError {\n const code = inferErrorCode(error);\n const base = describeCode(code, fallbackTitle);\n const permissionDenied = code === 'forbidden' || isPermissionDeniedError(error);\n\n let description = base.description;\n if (error instanceof AppletRPCException && typeof error.message === 'string' && error.message.trim() !== '' && base.title === fallbackTitle) {\n description = error.message;\n } else if (error instanceof Error && error.message && code === 'unknown') {\n description = error.message;\n }\n\n return {\n code,\n title: base.title,\n description,\n userMessage: description || base.title,\n retryable: base.retryable,\n isPermissionDenied: permissionDenied,\n isTimeout: code === 'timeout',\n isOffline: code === 'offline',\n isCanceled: code === 'aborted',\n isNotFound: code === 'not_found',\n };\n}\n\n/**\n * Convert an unknown error into a structured display object.\n */\nexport function toErrorDisplay(error: unknown, fallbackTitle: string): RPCErrorDisplay {\n const normalized = normalizeRPCError(error, fallbackTitle);\n return {\n title: normalized.title,\n description: normalized.description,\n isPermissionDenied: normalized.isPermissionDenied,\n };\n}\n","import type { QueuedMessage } from '../types';\n\nconst STORAGE_PREFIX = 'bichat.queue.';\nconst MAX_BYTES = 512 * 1024; // 512KB safety limit for sessionStorage payloads\n\nfunction key(sessionId: string): string {\n return `${STORAGE_PREFIX}${sessionId}`;\n}\n\nfunction safeSerialize(queue: QueuedMessage[]): string | null {\n try {\n const json = JSON.stringify(queue);\n if (json.length > MAX_BYTES) {return null;}\n return json;\n } catch {\n return null;\n }\n}\n\nexport function saveQueue(sessionId: string, queue: QueuedMessage[]) {\n if (typeof window === 'undefined') {return;}\n if (!sessionId || sessionId === 'new') {return;}\n\n try {\n if (!queue || queue.length === 0) {\n window.sessionStorage.removeItem(key(sessionId));\n return;\n }\n\n const serialized = safeSerialize(queue);\n if (!serialized) {return;}\n\n window.sessionStorage.setItem(key(sessionId), serialized);\n } catch {\n // ignore storage errors (quota, privacy mode)\n }\n}\n\nexport function loadQueue(sessionId: string): QueuedMessage[] {\n if (typeof window === 'undefined') {return [];}\n if (!sessionId || sessionId === 'new') {return [];}\n\n try {\n const raw = window.sessionStorage.getItem(key(sessionId));\n if (!raw) {return [];}\n\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {return [];}\n\n // Minimal validation\n return parsed\n .map((item) => {\n const obj = item as Record<string, unknown>;\n return {\n content: typeof obj?.content === 'string' ? obj.content : '',\n attachments: Array.isArray(obj?.attachments) ? obj.attachments : [],\n } satisfies QueuedMessage;\n })\n .filter((m) => m.content.trim() !== '' || (m.attachments?.length ?? 0) > 0);\n } catch {\n return [];\n }\n}\n\nexport function clearQueue(sessionId: string) {\n if (typeof window === 'undefined') {return;}\n if (!sessionId || sessionId === 'new') {return;}\n try {\n window.sessionStorage.removeItem(key(sessionId));\n } catch {\n // ignore\n }\n}\n\n","const STORAGE_PREFIX = 'bichat.debug.';\n\nfunction key(sessionId: string): string {\n return `${STORAGE_PREFIX}${sessionId}`;\n}\n\nfunction isPersistableSessionId(sessionId: string): boolean {\n return Boolean(sessionId && sessionId !== 'new');\n}\n\nexport function saveDebugMode(sessionId: string, enabled: boolean): void {\n if (typeof window === 'undefined') {return;}\n if (!isPersistableSessionId(sessionId)) {return;}\n\n try {\n if (enabled) {\n window.sessionStorage.setItem(key(sessionId), '1');\n return;\n }\n window.sessionStorage.removeItem(key(sessionId));\n } catch {\n // ignore storage errors (quota, privacy mode)\n }\n}\n\nexport function loadDebugMode(sessionId: string): boolean {\n if (typeof window === 'undefined') {return false;}\n if (!isPersistableSessionId(sessionId)) {return false;}\n\n try {\n return window.sessionStorage.getItem(key(sessionId)) === '1';\n } catch {\n return false;\n }\n}\n","const STORAGE_KEY = 'bichat.reasoningEffort';\n\nexport function saveReasoningEffort(effort: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n window.sessionStorage.setItem(STORAGE_KEY, effort);\n } catch {\n // ignore storage errors (quota, privacy mode)\n }\n}\n\nexport function loadReasoningEffort(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n try {\n return window.sessionStorage.getItem(STORAGE_KEY);\n } catch {\n return null;\n }\n}\n\nexport function clearReasoningEffort(): void {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n window.sessionStorage.removeItem(STORAGE_KEY);\n } catch {\n // ignore storage errors (quota, privacy mode)\n }\n}\n","import type { ConversationTurn, DebugTrace, SessionDebugUsage } from '../types';\n\nexport function hasMeaningfulUsage(trace?: DebugTrace['usage']): boolean {\n if (!trace) {return false;}\n return (\n trace.promptTokens > 0 ||\n trace.completionTokens > 0 ||\n trace.totalTokens > 0 ||\n (trace.cachedTokens ?? 0) > 0 ||\n (trace.cost ?? 0) > 0\n );\n}\n\nexport function hasDebugTrace(trace: DebugTrace): boolean {\n return (\n trace.tools.length > 0 ||\n (trace.attempts?.length ?? 0) > 0 ||\n (trace.spans?.length ?? 0) > 0 ||\n (trace.events?.length ?? 0) > 0 ||\n hasMeaningfulUsage(trace.usage) ||\n !!trace.generationMs ||\n !!trace.traceId ||\n !!trace.traceUrl ||\n !!trace.thinking\n );\n}\n\nexport function getSessionDebugUsage(turns: ConversationTurn[]): SessionDebugUsage {\n let promptTokens = 0;\n let completionTokens = 0;\n let totalTokens = 0;\n let turnsWithUsage = 0;\n let latestPromptTokens = 0;\n let latestCompletionTokens = 0;\n let latestTotalTokens = 0;\n\n for (const turn of turns) {\n const usage = turn.assistantTurn?.debug?.usage;\n if (!hasMeaningfulUsage(usage) || !usage) {\n continue;\n }\n\n turnsWithUsage++;\n promptTokens += usage.promptTokens;\n completionTokens += usage.completionTokens;\n totalTokens += usage.totalTokens;\n latestPromptTokens = usage.promptTokens;\n latestCompletionTokens = usage.completionTokens;\n latestTotalTokens = usage.totalTokens;\n }\n\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n turnsWithUsage,\n latestPromptTokens,\n latestCompletionTokens,\n latestTotalTokens,\n };\n}\n\n","/**\n * Pure helper functions for the ChatContext provider.\n * Extracted to keep the main provider file focused on state and handlers.\n */\n\nimport {\n MessageRole,\n type ConversationTurn,\n type Attachment,\n type DebugLimits,\n} from '../types';\n\n/** Tool names that produce persisted artifacts; must match server ArtifactHandler. */\nexport const ARTIFACT_TOOL_NAMES = new Set([\n 'code_interpreter',\n 'draw_chart',\n 'export_query_to_excel',\n 'export_data_to_excel',\n 'export_to_pdf',\n]);\n\nexport function generateTempId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nexport function createPendingTurn(\n sessionId: string,\n content: string,\n attachments: Attachment[] = []\n): ConversationTurn {\n const now = new Date().toISOString();\n return {\n id: generateTempId('turn'),\n sessionId,\n userTurn: {\n id: generateTempId('user'),\n content,\n attachments,\n createdAt: now,\n },\n createdAt: now,\n };\n}\n\nexport function createCompactedSystemTurn(sessionId: string, summary: string): ConversationTurn {\n const now = new Date().toISOString();\n return {\n id: generateTempId('turn'),\n sessionId,\n userTurn: {\n id: generateTempId('user'),\n content: '',\n attachments: [],\n createdAt: now,\n },\n assistantTurn: {\n id: generateTempId('assistant'),\n role: MessageRole.System,\n content: summary,\n citations: [],\n artifacts: [],\n codeOutputs: [],\n lifecycle: 'complete',\n createdAt: now,\n },\n createdAt: now,\n };\n}\n\nexport type SlashCommandName = '/clear' | '/debug' | '/compact'\n\nexport interface ParsedSlashCommand {\n name: SlashCommandName\n hasArgs: boolean\n}\n\nexport function parseSlashCommand(input: string): ParsedSlashCommand | null {\n const trimmed = input.trim();\n if (!trimmed.startsWith('/')) {return null;}\n\n const parts = trimmed.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) {return null;}\n\n const candidate = parts[0].toLowerCase();\n if (candidate !== '/clear' && candidate !== '/debug' && candidate !== '/compact') {\n return null;\n }\n\n return {\n name: candidate,\n hasArgs: parts.length > 1,\n };\n}\n\nexport function readDebugLimitsFromGlobalContext(): DebugLimits | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const limits = window.__APPLET_CONTEXT__?.extensions?.debug?.limits;\n if (!limits) {\n return null;\n }\n\n const {\n policyMaxTokens,\n modelMaxTokens,\n effectiveMaxTokens,\n completionReserveTokens,\n } = limits;\n\n if (\n typeof policyMaxTokens !== 'number' ||\n typeof modelMaxTokens !== 'number' ||\n typeof effectiveMaxTokens !== 'number' ||\n typeof completionReserveTokens !== 'number'\n ) {\n return null;\n }\n\n return {\n policyMaxTokens,\n modelMaxTokens,\n effectiveMaxTokens,\n completionReserveTokens,\n };\n}\n\nexport function readReasoningEffortOptionsFromGlobalContext(): string[] | undefined {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const opts = window.__APPLET_CONTEXT__?.extensions?.llm?.reasoningEffortOptions;\n if (!Array.isArray(opts) || opts.length === 0) {\n return undefined;\n }\n\n const filtered = opts.filter((o: unknown): o is string => typeof o === 'string');\n if (filtered.length === 0) {\n return undefined;\n }\n\n return filtered;\n}\n","/**\n * Snapshot derivation helpers for the ChatMachine.\n *\n * These are pure functions that derive public snapshots from internal state.\n */\n\nimport { getSessionDebugUsage } from '../utils/debugTrace';\nimport type { ChatMachineState, SessionSnapshot, MessagingSnapshot, InputSnapshot } from './types';\n\nexport function deriveDebugMode(state: ChatMachineState): boolean {\n const key = state.session.currentSessionId || 'new';\n return state.session.debugModeBySession[key] ?? false;\n}\n\nexport function deriveSessionSnapshot(\n state: ChatMachineState,\n methods: Pick<SessionSnapshot, 'setError' | 'retryFetchSession' | 'setReasoningEffort' | 'setModel'>\n): SessionSnapshot {\n return {\n session: state.session.session,\n currentSessionId: state.session.currentSessionId,\n fetching: state.session.fetching,\n error: state.session.error,\n errorRetryable: state.session.errorRetryable,\n debugMode: deriveDebugMode(state),\n sessionDebugUsage: getSessionDebugUsage(state.messaging.turns),\n debugLimits: state.session.debugLimits,\n reasoningEffort: state.session.reasoningEffort,\n reasoningEffortOptions: state.session.reasoningEffortOptions,\n model: state.session.model,\n setError: methods.setError,\n retryFetchSession: methods.retryFetchSession,\n setReasoningEffort: methods.setReasoningEffort,\n setModel: methods.setModel,\n };\n}\n\nexport function deriveMessagingSnapshot(\n state: ChatMachineState,\n methods: Pick<\n MessagingSnapshot,\n | 'sendMessage'\n | 'handleRegenerate'\n | 'handleEdit'\n | 'handleCopy'\n | 'handleSubmitQuestionAnswers'\n | 'handleRejectPendingQuestion'\n | 'retryLastMessage'\n | 'clearStreamError'\n | 'cancel'\n | 'setCodeOutputs'\n >\n): MessagingSnapshot {\n const {\n turns, loading, isStreaming, streamingContent, isCompacting,\n streamError, streamErrorRetryable, pendingQuestion, codeOutputs,\n artifactsInvalidationTrigger, thinkingContent, activeSteps,\n generationInProgress,\n } = state.messaging;\n\n // ---------------------------------------------------------------------------\n // Activity indicator visibility\n //\n // UX phases during a streaming response:\n //\n // Phase | ActivityTrace | TypingIndicator\n // -------------------|:---:|:---:\n // Waiting | - | visible (message sent, no events yet)\n // Tool execution | vis | visible (tool events arriving, no content)\n // Streaming | - | - (content flowing, all tools done)\n // Streaming + tools | vis | - (content flowing, new tool starts)\n // ---------------------------------------------------------------------------\n\n const hasAnySteps = activeSteps.length > 0;\n const hasActiveSteps = activeSteps.some(s => s.status === 'active');\n\n // Before content: show if any steps exist (including completed).\n // After content starts: show only if a tool is still actively running.\n const showActivityTrace = !isCompacting && isStreaming\n && (streamingContent ? hasActiveSteps : hasAnySteps);\n\n const showTypingIndicator = !isCompacting && !thinkingContent && !streamingContent\n && (loading || (isStreaming && hasAnySteps));\n\n return {\n turns,\n streamingContent,\n isStreaming,\n streamError,\n streamErrorRetryable,\n loading,\n pendingQuestion,\n codeOutputs,\n isCompacting,\n compactionSummary: null,\n artifactsInvalidationTrigger,\n thinkingContent,\n activeSteps,\n generationInProgress,\n showActivityTrace,\n showTypingIndicator,\n ...methods,\n };\n}\n\nexport function deriveInputSnapshot(\n state: ChatMachineState,\n methods: Pick<\n InputSnapshot,\n | 'setMessage'\n | 'setInputError'\n | 'handleSubmit'\n | 'handleUnqueue'\n | 'enqueueMessage'\n | 'removeQueueItem'\n | 'updateQueueItem'\n >\n): InputSnapshot {\n return {\n message: state.input.message,\n inputError: state.input.inputError,\n messageQueue: state.input.messageQueue,\n ...methods,\n };\n}\n","import type { AssistantTurn } from '../types';\n\nexport function isEmptyAssistantTurn(turn: AssistantTurn): boolean {\n if (turn.content.trim().length > 0) {return false;}\n if ((turn.explanation?.trim().length ?? 0) > 0) {return false;}\n if ((turn.citations?.length ?? 0) > 0) {return false;}\n if ((turn.toolCalls?.length ?? 0) > 0) {return false;}\n if ((turn.charts?.length ?? 0) > 0) {return false;}\n if ((turn.renderTables?.length ?? 0) > 0) {return false;}\n if ((turn.artifacts?.length ?? 0) > 0) {return false;}\n if ((turn.codeOutputs?.length ?? 0) > 0) {return false;}\n if (turn.debug) {return false;}\n return true;\n}\n\nexport function isPlaceholderWaitingAssistantTurn(turn: AssistantTurn): boolean {\n return turn.lifecycle === 'waiting_for_human_input' && isEmptyAssistantTurn(turn);\n}\n\nexport function shouldRenderInlineRetry(turn: AssistantTurn, canRegenerate: boolean): boolean {\n if (!canRegenerate) {return false;}\n if (turn.lifecycle === 'waiting_for_human_input') {return false;}\n return isEmptyAssistantTurn(turn);\n}\n","import type {\n AssistantTurnLifecycle,\n ConversationTurn,\n PendingQuestion,\n StreamInterruptPayload,\n} from \"../types\";\nimport { MessageRole } from \"../types\";\nimport { isPlaceholderWaitingAssistantTurn } from \"../utils/assistantTurnState\";\n\nexport function normalizeQuestionType(\n rawType: unknown,\n): \"SINGLE_CHOICE\" | \"MULTIPLE_CHOICE\" {\n const normalized = String(rawType || \"\")\n .trim()\n .toUpperCase()\n .replace(/[\\s-]+/g, \"_\");\n return normalized === \"MULTIPLE_CHOICE\" ? \"MULTIPLE_CHOICE\" : \"SINGLE_CHOICE\";\n}\n\nexport function isOpenQuestionStatus(\n status: PendingQuestion[\"status\"] | undefined,\n): boolean {\n return (\n status === \"PENDING\" ||\n status === \"ANSWER_SUBMITTED\" ||\n status === \"REJECT_SUBMITTED\" ||\n status === \"ANSWER_RESUME_FAILED\" ||\n status === \"REJECT_RESUME_FAILED\"\n );\n}\n\nexport function shouldPromptForHumanInput(\n status: PendingQuestion[\"status\"] | undefined,\n): boolean {\n return (\n status === \"PENDING\" ||\n status === \"ANSWER_RESUME_FAILED\" ||\n status === \"REJECT_RESUME_FAILED\"\n );\n}\n\nexport function pendingQuestionFromInterrupt(\n interrupt: StreamInterruptPayload | undefined,\n fallbackTurnId: string,\n): PendingQuestion | null {\n if (!interrupt) {\n return null;\n }\n\n const checkpointId = interrupt.checkpointId?.trim();\n if (!checkpointId) {\n return null;\n }\n\n const questions = Array.isArray(interrupt.questions)\n ? interrupt.questions\n .filter((question) => !!question && typeof question.id === \"string\")\n .map((question) => ({\n id: question.id,\n text: typeof question.text === \"string\" ? question.text : \"\",\n type: normalizeQuestionType(question.type),\n options: Array.isArray(question.options)\n ? question.options\n .filter((option) => !!option && typeof option.id === \"string\")\n .map((option) => ({\n id: option.id,\n label: typeof option.label === \"string\" ? option.label : \"\",\n value: option.id,\n }))\n : [],\n }))\n : [];\n\n return {\n id: checkpointId,\n turnId: fallbackTurnId,\n agentName: interrupt.agentName,\n questions,\n status: \"PENDING\",\n };\n}\n\nexport function resolvePendingQuestionTurnIndex(\n turns: ConversationTurn[],\n pendingQuestion: PendingQuestion | null,\n): number {\n if (\n !pendingQuestion ||\n !isOpenQuestionStatus(pendingQuestion.status) ||\n turns.length === 0\n ) {\n return -1;\n }\n\n const pendingTurnId = pendingQuestion.turnId?.trim();\n if (pendingTurnId) {\n const explicitMatch = turns.findIndex(\n (turn) =>\n turn.id === pendingTurnId ||\n turn.userTurn.id === pendingTurnId ||\n turn.assistantTurn?.id === pendingTurnId,\n );\n if (explicitMatch !== -1) {\n return explicitMatch;\n }\n }\n\n for (let i = turns.length - 1; i >= 0; i--) {\n if (turns[i].assistantTurn) {\n return i;\n }\n }\n\n return turns.length - 1;\n}\n\nexport function applyTurnLifecycleForPendingQuestion(\n turns: ConversationTurn[],\n pendingQuestion: PendingQuestion | null,\n): ConversationTurn[] {\n const pendingIndex = resolvePendingQuestionTurnIndex(turns, pendingQuestion);\n if (turns.length === 0) {\n return turns;\n }\n\n let changed = false;\n const nextTurns = turns.map((turn, index) => {\n const shouldWaitForInput = pendingIndex === index;\n const desiredLifecycle: AssistantTurnLifecycle = shouldWaitForInput\n ? shouldPromptForHumanInput(pendingQuestion?.status)\n ? \"waiting_for_human_input\"\n : \"complete\"\n : \"complete\";\n\n if (!turn.assistantTurn) {\n if (!shouldWaitForInput || !pendingQuestion) {\n return turn;\n }\n changed = true;\n return {\n ...turn,\n assistantTurn: {\n id: `${pendingQuestion.id}-assistant`,\n role: MessageRole.Assistant,\n content: \"\",\n citations: [],\n artifacts: [],\n codeOutputs: [],\n lifecycle: desiredLifecycle,\n createdAt: turn.createdAt,\n },\n };\n }\n\n if (\n !shouldWaitForInput &&\n isPlaceholderWaitingAssistantTurn(turn.assistantTurn)\n ) {\n changed = true;\n return {\n ...turn,\n assistantTurn: undefined,\n };\n }\n\n if (turn.assistantTurn.lifecycle === desiredLifecycle) {\n return turn;\n }\n\n changed = true;\n return {\n ...turn,\n assistantTurn: {\n ...turn.assistantTurn,\n lifecycle: desiredLifecycle,\n },\n };\n });\n\n return changed ? nextTurns : turns;\n}\n","/**\n * ChatMachine — framework-agnostic state machine for BiChat.\n *\n * Owns all async logic that was previously in ChatContext.tsx:\n * - Session fetch (with race-condition guards)\n * - Message sending + streaming\n * - Slash commands (/debug, /clear, /compact)\n * - HITL question submission / rejection\n * - Message queue (auto-drain)\n * - Rate limiting\n * - Abort / cancel\n *\n * Zero React dependency. Designed for `useSyncExternalStore`:\n * three subscribe/getSnapshot pairs map to the existing 3-context split.\n */\n\nimport type {\n ChatDataSource,\n ConversationTurn,\n CodeOutput,\n Attachment,\n PendingQuestion,\n QuestionAnswers,\n SendMessageOptions,\n SessionDebugUsage,\n ActivityStep,\n} from \"../types\";\nimport { MessageRole } from \"../types\";\nimport type { RateLimiter } from \"../utils/RateLimiter\";\nimport { normalizeRPCError } from \"../utils/errorDisplay\";\nimport { loadQueue, saveQueue } from \"../utils/queueStorage\";\nimport { loadDebugMode, saveDebugMode } from \"../utils/debugModeStorage\";\nimport {\n clearReasoningEffort,\n loadReasoningEffort,\n saveReasoningEffort,\n} from \"../utils/reasoningEffortStorage\";\nimport { getSessionDebugUsage } from \"../utils/debugTrace\";\nimport {\n ARTIFACT_TOOL_NAMES,\n createPendingTurn,\n createCompactedSystemTurn,\n generateTempId,\n parseSlashCommand,\n readDebugLimitsFromGlobalContext,\n readReasoningEffortOptionsFromGlobalContext,\n type ParsedSlashCommand,\n} from \"../context/chatHelpers\";\nimport type {\n ChatMachineConfig,\n ChatMachineState,\n SessionSnapshot,\n MessagingSnapshot,\n InputSnapshot,\n LastSendAttempt,\n} from \"./types\";\nimport {\n deriveSessionSnapshot,\n deriveMessagingSnapshot,\n deriveInputSnapshot,\n deriveDebugMode,\n} from \"./selectors\";\nimport {\n applyTurnLifecycleForPendingQuestion,\n isOpenQuestionStatus,\n pendingQuestionFromInterrupt,\n} from \"./hitlLifecycle\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Listener = () => void;\n\nconst MAX_QUEUE_SIZE = 5;\nconst RUN_MARKER_PREFIX = \"bichat.run.\";\n/** Interval (ms) for polling stream status when another tab has an active generation. */\nconst PASSIVE_POLL_INTERVAL_MS = 2000;\n\nfunction getRunMarkerKey(sessionId: string): string {\n return `${RUN_MARKER_PREFIX}${sessionId}`;\n}\n\nfunction setRunMarker(sessionId: string, runId: string): void {\n if (typeof window === \"undefined\" || !sessionId || sessionId === \"new\") {\n return;\n }\n try {\n window.sessionStorage.setItem(getRunMarkerKey(sessionId), runId);\n } catch {\n // ignore\n }\n}\n\nfunction getRunMarker(sessionId: string): string | null {\n if (typeof window === \"undefined\" || !sessionId || sessionId === \"new\") {\n return null;\n }\n try {\n return window.sessionStorage.getItem(getRunMarkerKey(sessionId));\n } catch {\n return null;\n }\n}\n\nfunction clearRunMarker(sessionId: string): void {\n if (typeof window === \"undefined\" || !sessionId || sessionId === \"new\") {\n return;\n }\n try {\n window.sessionStorage.removeItem(getRunMarkerKey(sessionId));\n } catch {\n // ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// ChatMachine\n// ---------------------------------------------------------------------------\n\nexport class ChatMachine {\n // ── Config ──────────────────────────────────────────────────────────────\n private dataSource: ChatDataSource;\n private rateLimiter: RateLimiter;\n private onSessionCreated?: (sessionId: string) => void;\n\n // ── Internal state ──────────────────────────────────────────────────────\n private state: ChatMachineState;\n\n // ── Refs (mutable, no subscription) ─────────────────────────────────────\n private abortController: AbortController | null = null;\n private lastSendAttempt: LastSendAttempt | null = null;\n /** Prevents fetchSession effect from clobbering state while stream is active. */\n private sendingSessionId: string | null = null;\n /**\n * Monotonic counter bumped on every real session switch. An async op (send\n * stream, post-stream sync, queue drain, resume, HITL) captures it at start\n * and re-checks before writing to the single shared `state.messaging`; a stale\n * epoch means the user navigated to a different session, so the write is\n * dropped instead of bleeding into / clobbering the now-visible session.\n */\n private viewEpoch = 0;\n private fetchCancelled = false;\n private disposed = false;\n private reasoningEffortOptions: string[] | null = null;\n private reasoningEffortOptionSet: Set<string> | null = null;\n /** Memoized sessionDebugUsage — avoids unnecessary session re-renders during streaming. */\n private lastSessionDebugUsage: SessionDebugUsage | null = null;\n /** Interval handle for passive polling when another tab has an active stream. */\n private passivePollingId: ReturnType<typeof setInterval> | null = null;\n\n // ── Listeners ───────────────────────────────────────────────────────────\n private sessionListeners = new Set<Listener>();\n private messagingListeners = new Set<Listener>();\n private inputListeners = new Set<Listener>();\n\n // ── Snapshot caches (for useSyncExternalStore identity stability) ───────\n private cachedSessionSnapshot: SessionSnapshot | null = null;\n private cachedMessagingSnapshot: MessagingSnapshot | null = null;\n private cachedInputSnapshot: InputSnapshot | null = null;\n private sessionSnapshotVersion = 0;\n private messagingSnapshotVersion = 0;\n private inputSnapshotVersion = 0;\n private lastSessionSnapshotVersion = -1;\n private lastMessagingSnapshotVersion = -1;\n private lastInputSnapshotVersion = -1;\n\n // ── Bound method references (stable identity) ──────────────────────────\n readonly setError: (error: string | null) => void;\n readonly retryFetchSession: () => void;\n readonly sendMessage: (\n content: string,\n attachments?: Attachment[],\n ) => Promise<void>;\n readonly handleRegenerate: (turnId: string, model?: string) => Promise<void>;\n readonly handleEdit: (turnId: string, newContent: string) => Promise<void>;\n readonly handleCopy: (text: string) => Promise<void>;\n readonly handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void;\n readonly handleRejectPendingQuestion: () => Promise<void>;\n readonly retryLastMessage: () => Promise<void>;\n readonly clearStreamError: () => void;\n readonly cancel: () => void;\n readonly setCodeOutputs: (outputs: CodeOutput[]) => void;\n readonly setMessage: (message: string) => void;\n readonly setInputError: (error: string | null) => void;\n readonly handleSubmit: (\n e: { preventDefault: () => void },\n attachments?: Attachment[],\n ) => void;\n readonly handleUnqueue: () => {\n content: string;\n attachments: Attachment[];\n } | null;\n readonly enqueueMessage: (\n content: string,\n attachments: Attachment[],\n ) => boolean;\n readonly removeQueueItem: (index: number) => void;\n readonly updateQueueItem: (index: number, content: string) => void;\n readonly setReasoningEffort: (effort: string) => void;\n readonly setModel: (model: string | undefined) => void;\n\n constructor(config: ChatMachineConfig) {\n this.dataSource = config.dataSource;\n this.rateLimiter = config.rateLimiter;\n this.onSessionCreated = config.onSessionCreated;\n this.reasoningEffortOptions = this.buildReasoningEffortOptions();\n this.reasoningEffortOptionSet = this.reasoningEffortOptions\n ? new Set(this.reasoningEffortOptions)\n : null;\n const initialReasoningEffort = this.sanitizeReasoningEffort(\n loadReasoningEffort() || undefined,\n );\n if (!initialReasoningEffort) {\n clearReasoningEffort();\n }\n\n this.state = {\n session: {\n currentSessionId: undefined,\n session: null,\n fetching: false,\n error: null,\n errorRetryable: false,\n debugModeBySession: {},\n debugLimits: readDebugLimitsFromGlobalContext(),\n reasoningEffort: initialReasoningEffort,\n reasoningEffortOptions: this.reasoningEffortOptions ?? undefined,\n model: undefined,\n },\n messaging: {\n turns: [],\n streamingContent: \"\",\n isStreaming: false,\n streamError: null,\n streamErrorRetryable: false,\n loading: false,\n pendingQuestion: null,\n codeOutputs: [],\n isCompacting: false,\n artifactsInvalidationTrigger: 0,\n thinkingContent: \"\",\n activeSteps: [],\n generationInProgress: false,\n },\n input: {\n message: \"\",\n inputError: null,\n messageQueue: [],\n },\n };\n\n // Bind all public methods once (stable references)\n this.setError = this._setError.bind(this);\n this.retryFetchSession = this._retryFetchSession.bind(this);\n this.sendMessage = this._sendMessage.bind(this);\n this.handleRegenerate = this._handleRegenerate.bind(this);\n this.handleEdit = this._handleEdit.bind(this);\n this.handleCopy = this._handleCopy.bind(this);\n this.handleSubmitQuestionAnswers =\n this._handleSubmitQuestionAnswers.bind(this);\n this.handleRejectPendingQuestion =\n this._handleRejectPendingQuestion.bind(this);\n this.retryLastMessage = this._retryLastMessage.bind(this);\n this.clearStreamError = this._clearStreamError.bind(this);\n this.cancel = this._cancel.bind(this);\n this.setCodeOutputs = this._setCodeOutputs.bind(this);\n this.setMessage = this._setMessage.bind(this);\n this.setInputError = this._setInputError.bind(this);\n this.handleSubmit = this._handleSubmit.bind(this);\n this.handleUnqueue = this._handleUnqueue.bind(this);\n this.enqueueMessage = this._enqueueMessage.bind(this);\n this.removeQueueItem = this._removeQueueItem.bind(this);\n this.updateQueueItem = this._updateQueueItem.bind(this);\n this.setReasoningEffort = this._setReasoningEffort.bind(this);\n this.setModel = this._setModel.bind(this);\n }\n\n private buildReasoningEffortOptions(): string[] | null {\n const options = readReasoningEffortOptionsFromGlobalContext();\n if (!options || options.length === 0) {\n return null;\n }\n return options;\n }\n\n // Keep outbound payloads constrained to server-declared options.\n private sanitizeReasoningEffort(\n effort: string | undefined,\n ): string | undefined {\n if (\n !effort ||\n !this.reasoningEffortOptionSet ||\n this.reasoningEffortOptionSet.size === 0\n ) {\n return undefined;\n }\n return this.reasoningEffortOptionSet.has(effort) ? effort : undefined;\n }\n\n // =====================================================================\n // Lifecycle\n // =====================================================================\n\n /**\n * Set the active session ID. Triggers fetch when transitioning to a real\n * session, or resets state for 'new'/undefined.\n */\n setSessionId(id: string | undefined): void {\n if (this.disposed) {\n return;\n }\n const prev = this.state.session.currentSessionId;\n if (id === prev) {\n return;\n }\n\n // A different session is being shown. Invalidate any in-flight send/stream\n // for the previous session so its chunks, post-stream sync, and queue drain\n // can't write into this new view, and cancel the network stream + old poll.\n this.viewEpoch++;\n this.abortController?.abort();\n this.sendingSessionId = null;\n this._stopPassivePolling();\n\n // Clear the previous session's transient streaming state so it doesn't bleed\n // into the new view. Persisted turns/pendingQuestion are loaded by the fetch\n // below; a background run for the new session is re-detected by its status\n // check and re-sets these as needed.\n this._updateMessaging({\n streamingContent: \"\",\n thinkingContent: \"\",\n activeSteps: [],\n isStreaming: false,\n loading: false,\n generationInProgress: false,\n streamError: null,\n streamErrorRetryable: false,\n });\n\n this.state.session.currentSessionId = id;\n this._hydrateDebugModeForSession(id);\n this._notifySession();\n\n // Reset queue for new session\n if (!id || id === \"new\") {\n this._updateInput({ messageQueue: [] });\n } else {\n this._updateInput({ messageQueue: loadQueue(id) });\n }\n\n this._fetchSessionIfNeeded();\n }\n\n /**\n * Update mutable config that may change across parent re-renders.\n * Called from the React provider's useEffect to keep the machine in sync.\n */\n updateConfig(\n config: Pick<ChatMachineConfig, \"dataSource\" | \"onSessionCreated\">,\n ): void {\n this.dataSource = config.dataSource;\n this.onSessionCreated = config.onSessionCreated;\n }\n\n dispose(): void {\n this.disposed = true;\n this.fetchCancelled = true;\n this._stopPassivePolling();\n this.abortController?.abort();\n this.sessionListeners.clear();\n this.messagingListeners.clear();\n this.inputListeners.clear();\n }\n\n // =====================================================================\n // Subscribe / getSnapshot (for useSyncExternalStore)\n // =====================================================================\n\n subscribeSession = (listener: Listener): (() => void) => {\n this.sessionListeners.add(listener);\n return () => {\n this.sessionListeners.delete(listener);\n };\n };\n\n getSessionSnapshot = (): SessionSnapshot => {\n if (this.lastSessionSnapshotVersion !== this.sessionSnapshotVersion) {\n this.cachedSessionSnapshot = deriveSessionSnapshot(this.state, {\n setError: this.setError,\n retryFetchSession: this.retryFetchSession,\n setReasoningEffort: this.setReasoningEffort,\n setModel: this.setModel,\n });\n this.lastSessionSnapshotVersion = this.sessionSnapshotVersion;\n }\n return this.cachedSessionSnapshot!;\n };\n\n subscribeMessaging = (listener: Listener): (() => void) => {\n this.messagingListeners.add(listener);\n return () => {\n this.messagingListeners.delete(listener);\n };\n };\n\n getMessagingSnapshot = (): MessagingSnapshot => {\n if (this.lastMessagingSnapshotVersion !== this.messagingSnapshotVersion) {\n this.cachedMessagingSnapshot = deriveMessagingSnapshot(this.state, {\n sendMessage: this.sendMessage,\n handleRegenerate: this.handleRegenerate,\n handleEdit: this.handleEdit,\n handleCopy: this.handleCopy,\n handleSubmitQuestionAnswers: this.handleSubmitQuestionAnswers,\n handleRejectPendingQuestion: this.handleRejectPendingQuestion,\n retryLastMessage: this.retryLastMessage,\n clearStreamError: this.clearStreamError,\n cancel: this.cancel,\n setCodeOutputs: this.setCodeOutputs,\n });\n this.lastMessagingSnapshotVersion = this.messagingSnapshotVersion;\n }\n return this.cachedMessagingSnapshot!;\n };\n\n subscribeInput = (listener: Listener): (() => void) => {\n this.inputListeners.add(listener);\n return () => {\n this.inputListeners.delete(listener);\n };\n };\n\n getInputSnapshot = (): InputSnapshot => {\n if (this.lastInputSnapshotVersion !== this.inputSnapshotVersion) {\n this.cachedInputSnapshot = deriveInputSnapshot(this.state, {\n setMessage: this.setMessage,\n setInputError: this.setInputError,\n handleSubmit: this.handleSubmit,\n handleUnqueue: this.handleUnqueue,\n enqueueMessage: this.enqueueMessage,\n removeQueueItem: this.removeQueueItem,\n updateQueueItem: this.updateQueueItem,\n });\n this.lastInputSnapshotVersion = this.inputSnapshotVersion;\n }\n return this.cachedInputSnapshot!;\n };\n\n // =====================================================================\n // Private — state updates + notification\n // =====================================================================\n\n private _updateSession(patch: Partial<typeof this.state.session>): void {\n Object.assign(this.state.session, patch);\n this._notifySession();\n }\n\n private _notifySession(): void {\n this.sessionSnapshotVersion++;\n for (const fn of this.sessionListeners) {\n fn();\n }\n }\n\n private _updateMessaging(patch: Partial<typeof this.state.messaging>): void {\n Object.assign(this.state.messaging, patch);\n this._notifyMessaging();\n // sessionDebugUsage is derived from turns — only notify session listeners\n // when the derived usage actually changes (avoids re-renders during streaming).\n if (\"turns\" in patch) {\n const newUsage = getSessionDebugUsage(this.state.messaging.turns);\n if (!sessionDebugUsageEqual(this.lastSessionDebugUsage, newUsage)) {\n this.lastSessionDebugUsage = newUsage;\n this._notifySession();\n }\n }\n }\n\n private _notifyMessaging(): void {\n this.messagingSnapshotVersion++;\n for (const fn of this.messagingListeners) {\n fn();\n }\n }\n\n private _updateInput(patch: Partial<typeof this.state.input>): void {\n Object.assign(this.state.input, patch);\n // Only persist queue to sessionStorage when it actually changed\n if (\"messageQueue\" in patch) {\n this._persistQueue();\n }\n this._notifyInput();\n }\n\n private _notifyInput(): void {\n this.inputSnapshotVersion++;\n for (const fn of this.inputListeners) {\n fn();\n }\n }\n\n private _persistQueue(): void {\n const sid = this.state.session.currentSessionId;\n if (!sid || sid === \"new\") {\n return;\n }\n saveQueue(sid, this.state.input.messageQueue);\n }\n\n /**\n * True while `epoch` is still the active view — i.e. the machine has not been\n * disposed and no session switch has happened since `epoch` was captured.\n * Async ops gate their writes to the shared messaging state on this.\n */\n private _isCurrentEpoch(epoch: number): boolean {\n return !this.disposed && this.viewEpoch === epoch;\n }\n\n /** A send can't start while generating, mid-resume, or with an open question. */\n private _isBlockedForSend(): boolean {\n return (\n this.state.messaging.loading ||\n this.state.messaging.generationInProgress ||\n isOpenQuestionStatus(this.state.messaging.pendingQuestion?.status)\n );\n }\n\n /**\n * Send the next queued message, but only if we still own the view (`epoch`)\n * and nothing is blocking (an in-flight generation or an open question). The\n * item is dequeued optimistically and restored to the front if it turns out we\n * can't send when the deferred tick fires — so a queued message is never\n * silently dropped.\n */\n private _drainQueueIfReady(epoch: number): void {\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n const queue = this.state.input.messageQueue;\n if (queue.length === 0 || this._isBlockedForSend()) {\n return;\n }\n const next = queue[0];\n this._updateInput({ messageQueue: queue.slice(1) });\n // Defer to avoid a reentrant send within the current call stack.\n setTimeout(() => {\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (this._isBlockedForSend()) {\n // Became blocked between dequeue and now — put it back, don't drop it.\n this._updateInput({\n messageQueue: [next, ...this.state.input.messageQueue],\n });\n return;\n }\n this._sendMessageCore(next.content, next.attachments);\n }, 0);\n }\n\n private _setDebugModeForSession(sessionId: string, enabled: boolean): void {\n const nextDebugModeBySession = { ...this.state.session.debugModeBySession };\n if (enabled) {\n nextDebugModeBySession[sessionId] = true;\n } else {\n delete nextDebugModeBySession[sessionId];\n }\n\n this._updateSession({ debugModeBySession: nextDebugModeBySession });\n saveDebugMode(sessionId, enabled);\n }\n\n private _hydrateDebugModeForSession(sessionId: string | undefined): void {\n if (!sessionId || sessionId === \"new\") {\n return;\n }\n if (this.state.session.debugModeBySession[sessionId] === true) {\n return;\n }\n if (!loadDebugMode(sessionId)) {\n return;\n }\n\n this._updateSession({\n debugModeBySession: {\n ...this.state.session.debugModeBySession,\n [sessionId]: true,\n },\n });\n }\n\n private _setReasoningEffort(effort: string): void {\n const next = this.sanitizeReasoningEffort(effort);\n this._updateSession({ reasoningEffort: next });\n if (next) {\n saveReasoningEffort(next);\n return;\n }\n clearReasoningEffort();\n }\n\n private _setModel(model: string | undefined): void {\n this._updateSession({ model });\n }\n\n // =====================================================================\n // Private — session fetch\n // =====================================================================\n\n private _fetchSessionIfNeeded(): void {\n const id = this.state.session.currentSessionId;\n if (!id || id === \"new\") {\n this._updateSession({\n session: null,\n fetching: false,\n error: null,\n errorRetryable: false,\n });\n this._updateMessaging({\n turns: [],\n pendingQuestion: null,\n });\n this._updateInput({ inputError: null });\n return;\n }\n\n // Skip while stream is managing this session\n if (this.sendingSessionId === id) {\n return;\n }\n\n this.fetchCancelled = false;\n this._updateSession({ fetching: true, error: null, errorRetryable: false });\n this._updateInput({ inputError: null });\n\n const fetchId = id;\n this.dataSource\n .fetchSession(fetchId)\n .then((result) => {\n if (this.fetchCancelled || this.disposed) {\n return;\n }\n if (this.state.session.currentSessionId !== fetchId) {\n return;\n }\n if (this.sendingSessionId === fetchId) {\n return;\n }\n\n if (result) {\n this._updateSession({ session: result.session, fetching: false });\n this._setTurnsFromFetch(result.turns, result.pendingQuestion || null);\n this._checkStreamStatusAndResumeOrPoll(fetchId);\n } else {\n this._updateSession({ error: \"Session not found\", fetching: false });\n }\n })\n .catch((err) => {\n if (this.fetchCancelled || this.disposed) {\n return;\n }\n if (this.state.session.currentSessionId !== fetchId) {\n return;\n }\n if (this.sendingSessionId === fetchId) {\n return;\n }\n const normalized = normalizeRPCError(err, \"Failed to load session\");\n this._updateSession({\n error: normalized.userMessage,\n errorRetryable: normalized.retryable,\n fetching: false,\n });\n });\n }\n\n /**\n * Sets turns from fetch, preserving pending user-only turns if server hasn't caught up.\n * Applies `turns` + optional `pendingQuestion` in a single messaging update to avoid\n * transient intermediate UI states between separate notifications.\n */\n private _setTurnsFromFetch(\n fetchedTurns: ConversationTurn[],\n pendingQuestion?: PendingQuestion | null,\n ): void {\n if (!Array.isArray(fetchedTurns)) {\n console.warn(\n \"[ChatMachine] Ignoring malformed turns payload from fetchSession\",\n );\n return;\n }\n const prev = this.state.messaging.turns;\n const localPartialTurn = prev\n .slice()\n .reverse()\n .find((turn) => turn.assistantTurn?.id.startsWith(\"assistant-partial-\"));\n if (localPartialTurn) {\n if (fetchedTurns.length === 0) {\n fetchedTurns = prev;\n } else {\n const correspondingIndex = fetchedTurns.findIndex(\n (turn, index) =>\n turn.userTurn.id === localPartialTurn.userTurn.id ||\n (index === fetchedTurns.length - 1 &&\n turn.userTurn.content === localPartialTurn.userTurn.content),\n );\n if (correspondingIndex >= 0) {\n if (!fetchedTurns[correspondingIndex].assistantTurn) {\n fetchedTurns = fetchedTurns.map((turn, index) =>\n index === correspondingIndex\n ? { ...turn, assistantTurn: localPartialTurn.assistantTurn }\n : turn,\n );\n }\n } else {\n fetchedTurns = [...fetchedTurns, localPartialTurn];\n }\n }\n }\n const hasPendingUserOnly =\n prev.length > 0 && !prev[prev.length - 1].assistantTurn;\n const patch: Partial<typeof this.state.messaging> = {};\n const effectivePendingQuestion =\n pendingQuestion === undefined\n ? this.state.messaging.pendingQuestion\n : pendingQuestion;\n\n if (pendingQuestion !== undefined) {\n patch.pendingQuestion = pendingQuestion;\n }\n\n if (hasPendingUserOnly && (!fetchedTurns || fetchedTurns.length === 0)) {\n const lifecycleTurns = applyTurnLifecycleForPendingQuestion(\n prev,\n effectivePendingQuestion,\n );\n if (lifecycleTurns !== prev) {\n patch.turns = lifecycleTurns;\n }\n if (Object.keys(patch).length > 0) {\n this._updateMessaging(patch);\n }\n return; // keep optimistic turn\n }\n\n patch.turns = applyTurnLifecycleForPendingQuestion(\n fetchedTurns ?? prev,\n effectivePendingQuestion,\n );\n this._updateMessaging(patch);\n }\n\n /**\n * After fetch: if backend has an active stream, either resume (same-browser) or poll (passive).\n */\n private _checkStreamStatusAndResumeOrPoll(sessionId: string): void {\n if (!this.dataSource.getStreamStatus || !this.dataSource.resumeStream) {\n return;\n }\n this.dataSource\n .getStreamStatus(sessionId)\n .then((status) => {\n if (this.fetchCancelled || this.disposed) {\n return;\n }\n if (this.state.session.currentSessionId !== sessionId) {\n return;\n }\n if (this.sendingSessionId === sessionId) {\n return;\n }\n if (!status?.active || !status.runId) {\n this._updateMessaging({ generationInProgress: false });\n return;\n }\n const storedRunId = getRunMarker(sessionId);\n if (storedRunId === status.runId) {\n this._runResumeStream(sessionId, status.runId).catch(() => {\n clearRunMarker(sessionId);\n this._updateMessaging({ generationInProgress: false });\n });\n } else {\n this._updateMessaging({ generationInProgress: true });\n this._startPassivePolling(sessionId);\n }\n })\n .catch(() => {\n this._updateMessaging({ generationInProgress: false });\n });\n }\n\n private _stopPassivePolling(): void {\n if (this.passivePollingId) {\n clearInterval(this.passivePollingId);\n this.passivePollingId = null;\n }\n }\n\n private _startPassivePolling(sessionId: string): void {\n this._stopPassivePolling();\n this.passivePollingId = setInterval(() => {\n if (this.disposed || this.state.session.currentSessionId !== sessionId) {\n this._stopPassivePolling();\n return;\n }\n this.dataSource\n .getStreamStatus?.(sessionId)\n .then((status) => {\n if (!status?.active) {\n this._stopPassivePolling();\n this._updateMessaging({ generationInProgress: false });\n this.dataSource\n .fetchSession(sessionId)\n .then((result) => {\n if (\n this.state.session.currentSessionId === sessionId &&\n result\n ) {\n this._setTurnsFromFetch(\n result.turns,\n result.pendingQuestion ?? null,\n );\n }\n })\n .catch((err) => {\n console.error(\n \"[ChatMachine] fetchSession after stream inactive:\",\n err,\n );\n });\n }\n })\n .catch((err) => {\n console.error(\"[ChatMachine] getStreamStatus:\", err);\n });\n }, PASSIVE_POLL_INTERVAL_MS);\n }\n\n private async _runResumeStream(\n sessionId: string,\n runId: string,\n ): Promise<void> {\n if (this.sendingSessionId !== null) {\n return;\n }\n this.sendingSessionId = sessionId;\n const controller = new AbortController();\n this.abortController = controller;\n const epoch = this.viewEpoch;\n this._updateMessaging({ isStreaming: true });\n\n let accumulatedContent = \"\";\n try {\n let terminalError: Error | null = null;\n await this.dataSource.resumeStream!(\n sessionId,\n runId,\n (chunk) => {\n // Stop writing resumed chunks into the view if the user navigated away.\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (\n chunk.type === \"snapshot\" &&\n chunk.snapshot?.partialContent !== undefined\n ) {\n accumulatedContent = chunk.snapshot.partialContent;\n this._updateMessaging({ streamingContent: accumulatedContent });\n } else if (\n (chunk.type === \"content\" || chunk.type === \"chunk\") &&\n chunk.content\n ) {\n accumulatedContent += chunk.content;\n this._updateMessaging({ streamingContent: accumulatedContent });\n } else if (chunk.type === \"thinking\" && chunk.content) {\n this._handleThinkingChunk(chunk.content);\n } else if (chunk.type === \"tool_start\" && chunk.tool) {\n this._handleToolStart(chunk.tool);\n } else if (chunk.type === \"tool_end\" && chunk.tool) {\n this._handleToolEnd(chunk.tool);\n } else if (chunk.type === \"error\") {\n terminalError = new Error(chunk.error || \"Stream error\");\n }\n },\n controller.signal,\n );\n if (terminalError) {\n throw terminalError;\n }\n clearRunMarker(sessionId);\n await this._syncSessionFromServer(sessionId, true, epoch);\n } catch (err) {\n if (\n this._isCurrentEpoch(epoch) &&\n !(err instanceof Error && err.name === \"AbortError\")\n ) {\n this._preservePartialAssistant(accumulatedContent);\n const normalized = normalizeRPCError(err, \"Failed to resume stream\");\n this._updateMessaging({\n streamError: normalized.userMessage,\n streamErrorRetryable: normalized.retryable,\n });\n }\n throw err;\n } finally {\n if (this.abortController === controller) {\n this.abortController = null;\n }\n if (this._isCurrentEpoch(epoch)) {\n this.sendingSessionId = null;\n this._updateMessaging({\n isStreaming: false,\n loading: false,\n streamingContent: \"\",\n thinkingContent: \"\",\n activeSteps: [],\n generationInProgress: false,\n });\n }\n }\n }\n\n private async _resumeAcceptedRunOrPoll(\n sessionId: string,\n runId: string,\n ): Promise<void> {\n setRunMarker(sessionId, runId);\n try {\n await this._runResumeStream(sessionId, runId);\n } catch (err) {\n if (this.disposed) {\n return;\n }\n console.warn(\n \"[ChatMachine] resumeStream failed, switching to status polling fallback:\",\n err,\n );\n\n const getStreamStatus = this.dataSource.getStreamStatus;\n const status = getStreamStatus\n ? await getStreamStatus(sessionId).catch(() => null)\n : null;\n if (!status?.active) {\n clearRunMarker(sessionId);\n await this._syncSessionFromServer(sessionId, true).catch(() => {});\n this._updateMessaging({ generationInProgress: false });\n return;\n }\n\n setRunMarker(sessionId, status.runId ?? runId);\n this._updateMessaging({\n isStreaming: false,\n loading: false,\n generationInProgress: true,\n });\n this._startPassivePolling(sessionId);\n }\n }\n\n // =====================================================================\n // Private — actions\n // =====================================================================\n\n private _setError(error: string | null): void {\n this._updateSession({\n error,\n errorRetryable: false,\n });\n }\n\n private _retryFetchSession(): void {\n this._fetchSessionIfNeeded();\n }\n\n private _clearStreamError(): void {\n this._updateMessaging({\n streamError: null,\n streamErrorRetryable: false,\n });\n }\n\n private _notifySessionsUpdated(reason: string, sessionId?: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n window.dispatchEvent(\n new CustomEvent(\"bichat:sessions-updated\", {\n detail: { reason, sessionId },\n }),\n );\n }\n\n private _cancel(): void {\n if (this.abortController) {\n const sessionId =\n this.sendingSessionId ?? this.state.session.currentSessionId;\n if (sessionId && sessionId !== \"new\") {\n clearRunMarker(sessionId);\n if (this.dataSource.stopGeneration) {\n this.dataSource.stopGeneration(sessionId).catch(() => {\n // Non-fatal; local abort still stops the stream\n });\n }\n }\n this.abortController.abort();\n this.abortController = null;\n this._updateMessaging({\n isStreaming: false,\n loading: false,\n streamingContent: \"\",\n thinkingContent: \"\",\n activeSteps: [],\n });\n }\n }\n\n private _setCodeOutputs(outputs: CodeOutput[]): void {\n this._updateMessaging({ codeOutputs: outputs });\n }\n\n private _setMessage(message: string): void {\n this._updateInput({ message });\n }\n\n private _setInputError(error: string | null): void {\n this._updateInput({ inputError: error });\n }\n\n // ── Slash commands ──────────────────────────────────────────────────────\n\n private async _executeSlashCommand(\n command: ParsedSlashCommand,\n ): Promise<boolean> {\n if (command.hasArgs) {\n this._updateInput({ inputError: \"BiChat.Slash.ErrorNoArguments\" });\n return true;\n }\n\n this._updateSession({ error: null, errorRetryable: false });\n this._updateInput({ inputError: null });\n this._clearStreamError();\n\n if (command.name === \"/debug\") {\n const debugMode = deriveDebugMode(this.state);\n const key = this.state.session.currentSessionId || \"new\";\n const nextDebugMode = !debugMode;\n this._setDebugModeForSession(key, nextDebugMode);\n\n if (\n nextDebugMode &&\n this.state.session.currentSessionId &&\n this.state.session.currentSessionId !== \"new\"\n ) {\n try {\n const result = await this.dataSource.fetchSession(\n this.state.session.currentSessionId,\n );\n if (result) {\n this._updateSession({ session: result.session });\n this._setTurnsFromFetch(\n result.turns,\n result.pendingQuestion || null,\n );\n }\n } catch (err) {\n console.error(\"Failed to refresh session for debug mode:\", err);\n }\n }\n\n this._updateInput({ message: \"\" });\n return true;\n }\n\n const curSessionId = this.state.session.currentSessionId;\n if (!curSessionId || curSessionId === \"new\") {\n this._updateInput({ inputError: \"BiChat.Slash.ErrorSessionRequired\" });\n return true;\n }\n\n if (command.name === \"/clear\") {\n this._updateInput({ message: \"\" });\n this._updateMessaging({ loading: true, streamingContent: \"\" });\n\n try {\n await this.dataSource.clearSessionHistory(curSessionId);\n const result = await this.dataSource.fetchSession(curSessionId);\n if (result) {\n this._updateSession({ session: result.session });\n this._setTurnsFromFetch(result.turns, result.pendingQuestion || null);\n } else {\n this._setTurnsFromFetch([], null);\n }\n this._updateMessaging({ codeOutputs: [] });\n } catch (err) {\n const normalized = normalizeRPCError(\n err,\n \"Failed to clear session history\",\n );\n this._updateInput({ inputError: normalized.userMessage });\n } finally {\n this._updateMessaging({ loading: false, isStreaming: false });\n }\n return true;\n }\n\n if (command.name === \"/compact\") {\n this._updateInput({ message: \"\" });\n this._updateMessaging({\n loading: true,\n isCompacting: true,\n streamingContent: \"\",\n });\n\n try {\n const accepted =\n await this.dataSource.compactSessionHistory(curSessionId);\n if (!accepted.runId) {\n throw new Error(\"Async compaction run metadata is missing\");\n }\n this._updateMessaging({\n turns: applyTurnLifecycleForPendingQuestion(\n [\n createCompactedSystemTurn(\n curSessionId,\n \"Compacting conversation history...\",\n ),\n ],\n null,\n ),\n pendingQuestion: null,\n });\n await this._resumeAcceptedRunOrPoll(curSessionId, accepted.runId);\n if (!this.state.messaging.generationInProgress) {\n const result = await this.dataSource.fetchSession(curSessionId);\n if (result) {\n this._updateSession({ session: result.session });\n this._setTurnsFromFetch(\n result.turns,\n result.pendingQuestion || null,\n );\n } else {\n this._setTurnsFromFetch([], null);\n }\n this._updateMessaging({ codeOutputs: [] });\n }\n } catch (err) {\n const normalized = normalizeRPCError(\n err,\n \"Failed to compact session history\",\n );\n this._updateInput({ inputError: normalized.userMessage });\n } finally {\n this._updateMessaging({\n isCompacting: false,\n loading: false,\n isStreaming: false,\n });\n }\n return true;\n }\n\n this._updateInput({ inputError: \"BiChat.Slash.ErrorUnknownCommand\" });\n return true;\n }\n\n private _insertOptimisticTurn(\n prevTurns: ConversationTurn[],\n tempTurn: ConversationTurn,\n replaceFromMessageID?: string,\n ): void {\n if (!replaceFromMessageID) {\n this._updateMessaging({ turns: [...prevTurns, tempTurn] });\n return;\n }\n\n const idx = prevTurns.findIndex(\n (turn) => turn.userTurn.id === replaceFromMessageID,\n );\n if (idx === -1) {\n console.warn(\n `[ChatMachine] replaceFromMessageID \"${replaceFromMessageID}\" not found; appending as new turn`,\n );\n this._updateMessaging({ turns: [...prevTurns, tempTurn] });\n return;\n }\n\n this._updateMessaging({ turns: [...prevTurns.slice(0, idx), tempTurn] });\n }\n\n private async _resolveSendSession(\n currentSessionId: string | undefined,\n debugMode: boolean,\n ): Promise<{\n activeSessionId: string | undefined;\n shouldNavigateAfter: boolean;\n }> {\n let activeSessionId = currentSessionId;\n let shouldNavigateAfter = false;\n\n if (!activeSessionId || activeSessionId === \"new\") {\n const result = await this.dataSource.createSession();\n if (result) {\n const createdSessionID = result.id;\n activeSessionId = createdSessionID;\n this._updateSession({ currentSessionId: createdSessionID });\n if (debugMode) {\n this._setDebugModeForSession(createdSessionID, true);\n }\n shouldNavigateAfter = true;\n }\n }\n\n return { activeSessionId, shouldNavigateAfter };\n }\n\n private async _syncSessionFromServer(\n sessionId: string,\n allowEmptyTurns = false,\n epoch?: number,\n ): Promise<void> {\n const fetchResult = await this.dataSource.fetchSession(sessionId);\n if (!fetchResult) {\n return;\n }\n // The user may have switched sessions while the fetch was in flight; don't\n // overwrite the now-visible session with this one's data.\n if (epoch !== undefined && !this._isCurrentEpoch(epoch)) {\n return;\n }\n\n this._updateSession({ session: fetchResult.session });\n this._setTurnsFromFetch(\n allowEmptyTurns ? fetchResult.turns ?? [] : fetchResult.turns,\n fetchResult.pendingQuestion || null,\n );\n }\n\n private async _runSendStream(params: {\n activeSessionId: string | undefined;\n content: string;\n attachments: Attachment[];\n debugMode: boolean;\n replaceFromMessageID?: string;\n reasoningEffort?: string;\n model?: string;\n tempTurnId: string;\n controller: AbortController;\n epoch: number;\n onContent: (content: string) => void;\n }): Promise<{\n createdSessionId?: string;\n sessionFetched: boolean;\n stopped?: boolean;\n }> {\n const {\n activeSessionId,\n content,\n attachments,\n debugMode,\n replaceFromMessageID,\n reasoningEffort,\n model,\n tempTurnId,\n controller,\n epoch,\n onContent,\n } = params;\n\n let accumulatedContent = \"\";\n let createdSessionId: string | undefined;\n let sessionFetched = false;\n let currentRunId: string | undefined;\n this._updateMessaging({ isStreaming: true });\n\n for await (const chunk of this.dataSource.sendMessage(\n activeSessionId || \"new\",\n content,\n attachments,\n controller.signal,\n {\n debugMode,\n replaceFromMessageID,\n reasoningEffort,\n model,\n },\n )) {\n // Stop if the send was cancelled or the user navigated to another session.\n if (controller.signal.aborted || !this._isCurrentEpoch(epoch)) {\n break;\n }\n\n if (chunk.type === \"stream_started\" && chunk.runId) {\n currentRunId = chunk.runId;\n if (activeSessionId && activeSessionId !== \"new\") {\n setRunMarker(activeSessionId, chunk.runId);\n }\n }\n\n if (\n (chunk.type === \"chunk\" || chunk.type === \"content\") &&\n chunk.content\n ) {\n accumulatedContent += chunk.content;\n onContent(accumulatedContent);\n this._updateMessaging({ streamingContent: accumulatedContent });\n } else if (chunk.type === \"thinking\" && chunk.content) {\n this._handleThinkingChunk(chunk.content);\n } else if (chunk.type === \"tool_start\" && chunk.tool) {\n this._handleToolStart(chunk.tool);\n } else if (chunk.type === \"tool_end\" && chunk.tool) {\n this._handleToolEnd(chunk.tool);\n } else if (chunk.type === \"error\") {\n throw new Error(chunk.error || \"Stream error\");\n } else if (chunk.type === \"interrupt\") {\n if (chunk.sessionId) {\n createdSessionId = chunk.sessionId;\n }\n\n const pendingFromInterrupt = pendingQuestionFromInterrupt(\n chunk.interrupt,\n tempTurnId,\n );\n if (pendingFromInterrupt) {\n this._updateMessaging({\n pendingQuestion: pendingFromInterrupt,\n turns: applyTurnLifecycleForPendingQuestion(\n this.state.messaging.turns,\n pendingFromInterrupt,\n ),\n });\n }\n\n if (!sessionFetched) {\n sessionFetched = true;\n const finalSessionId = createdSessionId || activeSessionId;\n if (finalSessionId && finalSessionId !== \"new\") {\n await this._syncSessionFromServer(finalSessionId, false, epoch);\n }\n }\n } else if (chunk.type === \"done\") {\n if (chunk.sessionId) {\n createdSessionId = chunk.sessionId;\n }\n if (!sessionFetched) {\n sessionFetched = true;\n const finalSessionId = createdSessionId || activeSessionId;\n if (finalSessionId && finalSessionId !== \"new\") {\n await this._syncSessionFromServer(finalSessionId, false, epoch);\n }\n }\n } else if (chunk.type === \"user_message\" && chunk.sessionId) {\n createdSessionId = chunk.sessionId;\n if (currentRunId && createdSessionId) {\n setRunMarker(createdSessionId, currentRunId);\n }\n }\n }\n\n const finalSessionId = createdSessionId || activeSessionId;\n if (finalSessionId && finalSessionId !== \"new\") {\n clearRunMarker(finalSessionId);\n }\n\n const stopped = controller.signal.aborted;\n return { createdSessionId, sessionFetched, stopped };\n }\n\n private async _ensureSessionSyncAfterStream(\n activeSessionId: string | undefined,\n createdSessionId: string | undefined,\n sessionFetched: boolean,\n epoch: number,\n ): Promise<void> {\n if (sessionFetched) {\n return;\n }\n\n const finalSessionId = createdSessionId || activeSessionId;\n if (!finalSessionId || finalSessionId === \"new\") {\n return;\n }\n\n try {\n await this._syncSessionFromServer(finalSessionId, true, epoch);\n } catch (fetchErr) {\n console.error(\"Failed to fetch session after stream:\", fetchErr);\n }\n }\n\n private _finalizeSuccessfulSend(\n targetSessionId: string | undefined,\n shouldNavigateAfter: boolean,\n ): void {\n if (targetSessionId && targetSessionId !== \"new\") {\n this._notifySessionsUpdated(\"message_sent\", targetSessionId);\n }\n if (shouldNavigateAfter && targetSessionId && targetSessionId !== \"new\") {\n this._notifySessionsUpdated(\"session_created\", targetSessionId);\n if (this.onSessionCreated) {\n this.onSessionCreated(targetSessionId);\n }\n }\n this._clearStreamError();\n this.lastSendAttempt = null;\n }\n\n private _handleSendError(\n err: unknown,\n content: string,\n tempTurn: ConversationTurn,\n epoch: number,\n partialAssistantContent: string,\n ): boolean {\n // The user navigated to a different session while this send was failing —\n // none of the recovery writes (input restore, turn keep, error banner)\n // belong to the now-visible session, so drop them.\n if (!this._isCurrentEpoch(epoch)) {\n return false;\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n // Soft-cancel (user stop / unmount): drop the optimistic turn and return\n // the prompt to the input so they can edit and resend.\n this._updateInput({ message: content });\n this._clearStreamError();\n this._updateMessaging({\n turns: this.state.messaging.turns.filter(\n (turn) => turn.id !== tempTurn.id,\n ),\n });\n const sessionId =\n this.sendingSessionId ?? this.state.session.currentSessionId;\n if (sessionId && sessionId !== \"new\") {\n this._syncSessionFromServer(sessionId, true, epoch).catch(() => {});\n }\n return false;\n }\n\n const normalized = normalizeRPCError(err, \"Failed to send message\");\n // Genuine error: KEEP the optimistic user turn in history. Removing it would\n // collapse a brand-new chat back to the welcome screen (showWelcome is gated\n // on `!session && turns.length === 0`) and silently drop the message the user\n // just sent. Instead the turn stays, the error banner + Retry let them\n // re-send, and Retry replaces this turn (via replaceFromMessageID) rather\n // than appending a duplicate. The prompt lives in the turn, so the input is\n // cleared.\n if (this.lastSendAttempt) {\n this.lastSendAttempt = {\n ...this.lastSendAttempt,\n options: {\n ...this.lastSendAttempt.options,\n replaceFromMessageID: tempTurn.userTurn.id,\n },\n };\n }\n this._updateInput({ message: \"\", inputError: null });\n const turns = this._preservePartialAssistant(\n partialAssistantContent,\n tempTurn.id,\n );\n this._updateMessaging({\n turns,\n streamError: normalized.userMessage,\n streamErrorRetryable: normalized.retryable,\n });\n console.error(\"Send message error:\", err);\n return false;\n }\n\n private _preservePartialAssistant(\n content: string,\n targetTurnId?: string,\n ): ConversationTurn[] {\n if (content.trim() === \"\") {\n return this.state.messaging.turns;\n }\n\n let targetIndex = targetTurnId\n ? this.state.messaging.turns.findIndex((turn) => turn.id === targetTurnId)\n : -1;\n if (!targetTurnId) {\n for (let i = this.state.messaging.turns.length - 1; i >= 0; i--) {\n if (!this.state.messaging.turns[i].assistantTurn) {\n targetIndex = i;\n break;\n }\n }\n }\n if (targetIndex < 0) {\n return this.state.messaging.turns;\n }\n\n const turns = this.state.messaging.turns.map((turn, index) =>\n index === targetIndex\n ? {\n ...turn,\n assistantTurn: {\n id: generateTempId(\"assistant-partial\"),\n role: MessageRole.Assistant,\n content,\n citations: [],\n artifacts: [],\n codeOutputs: [],\n lifecycle: \"complete\" as const,\n createdAt: new Date().toISOString(),\n },\n }\n : turn,\n );\n this._updateMessaging({ turns });\n return turns;\n }\n\n // ── Send message ────────────────────────────────────────────────────────\n\n /**\n * Public entry point (no options). Calls _sendMessageCore internally.\n */\n private async _sendMessage(\n content: string,\n attachments: Attachment[] = [],\n ): Promise<void> {\n return this._sendMessageCore(content, attachments);\n }\n\n /**\n * Internal entry point with options (for regenerate/edit).\n */\n private async _sendMessageDirect(\n content: string,\n attachments: Attachment[],\n options?: SendMessageOptions,\n ): Promise<void> {\n return this._sendMessageCore(content, attachments, options);\n }\n\n /**\n * Core send-message logic. Handles slash commands, rate limiting, streaming,\n * session creation, optimistic turns, and auto-queue-drain.\n */\n private async _sendMessageCore(\n content: string,\n attachments: Attachment[] = [],\n options?: SendMessageOptions,\n ): Promise<void> {\n if (this.disposed) {\n return;\n }\n if (\n !content.trim() ||\n this.state.messaging.loading ||\n isOpenQuestionStatus(this.state.messaging.pendingQuestion?.status)\n ) {\n return;\n }\n\n const trimmedContent = content.trim();\n if (trimmedContent.startsWith(\"/\")) {\n const maybeCommand = parseSlashCommand(content);\n if (!maybeCommand) {\n this._updateInput({ inputError: \"BiChat.Slash.ErrorUnknownCommand\" });\n return;\n }\n if (attachments.length > 0) {\n this._updateInput({ inputError: \"BiChat.Slash.ErrorNoAttachments\" });\n return;\n }\n await this._executeSlashCommand(maybeCommand);\n return;\n }\n\n if (!this.rateLimiter.canMakeRequest()) {\n const timeUntilNext = this.rateLimiter.getTimeUntilNextRequest();\n const seconds = Math.ceil(timeUntilNext / 1000);\n this._updateInput({\n inputError: `Rate limit exceeded. Please wait ${seconds} seconds before sending another message.`,\n });\n return;\n }\n\n this._updateInput({ message: \"\", inputError: null });\n this._updateSession({ error: null, errorRetryable: false });\n this._clearStreamError();\n this._updateMessaging({\n loading: true,\n streamingContent: \"\",\n });\n\n const controller = new AbortController();\n this.abortController = controller;\n const epoch = this.viewEpoch;\n\n const curSessionId = this.state.session.currentSessionId;\n const curDebugMode = deriveDebugMode(this.state);\n const replaceFromMessageID = options?.replaceFromMessageID;\n const tempTurn = createPendingTurn(\n curSessionId || \"new\",\n content,\n attachments,\n );\n this.lastSendAttempt = { content, attachments, options };\n\n const prevTurns = this.state.messaging.turns;\n this._insertOptimisticTurn(prevTurns, tempTurn, replaceFromMessageID);\n\n let shouldDrainQueue = true;\n let partialAssistantContent = \"\";\n\n try {\n const { activeSessionId, shouldNavigateAfter } =\n await this._resolveSendSession(curSessionId, curDebugMode);\n\n // Lock: prevent fetch-session from clobbering state\n this.sendingSessionId = activeSessionId || null;\n\n const { createdSessionId, sessionFetched, stopped } =\n await this._runSendStream({\n activeSessionId,\n content,\n attachments,\n debugMode: curDebugMode,\n replaceFromMessageID,\n reasoningEffort: this.sanitizeReasoningEffort(\n this.state.session.reasoningEffort,\n ),\n model: this.state.session.model,\n tempTurnId: tempTurn.id,\n controller,\n epoch,\n onContent: (streamedContent) => {\n partialAssistantContent = streamedContent;\n },\n });\n\n // If the user switched sessions mid-stream, every write below would land\n // in the now-visible session — skip them all (the stream is already\n // aborted; server state is intact and reloads when they return).\n if (!this._isCurrentEpoch(epoch)) {\n // nothing to do\n } else if (stopped) {\n this._updateMessaging({\n turns: this.state.messaging.turns.filter(\n (turn) => turn.id !== tempTurn.id,\n ),\n });\n this._updateInput({ message: content });\n this._clearStreamError();\n const syncId = createdSessionId || activeSessionId;\n if (syncId && syncId !== \"new\") {\n await this._syncSessionFromServer(syncId, true, epoch).catch(\n () => {},\n );\n }\n } else {\n await this._ensureSessionSyncAfterStream(\n activeSessionId,\n createdSessionId,\n sessionFetched,\n epoch,\n );\n const targetSessionId = createdSessionId || activeSessionId;\n this._finalizeSuccessfulSend(targetSessionId, shouldNavigateAfter);\n }\n } catch (err) {\n shouldDrainQueue = this._handleSendError(\n err,\n content,\n tempTurn,\n epoch,\n partialAssistantContent,\n );\n } finally {\n // Only reset the shared streaming state if we still own the view; a\n // session switch (or a newer send) must not have its state clobbered.\n if (this._isCurrentEpoch(epoch)) {\n this._updateMessaging({\n loading: false,\n streamingContent: \"\",\n isStreaming: false,\n thinkingContent: \"\",\n activeSteps: [],\n });\n this.sendingSessionId = null;\n }\n // Don't null a newer send's controller.\n if (this.abortController === controller) {\n this.abortController = null;\n }\n\n // Auto-drain the queue — only into the same session/view this send\n // belonged to, and only when nothing is blocking.\n if (shouldDrainQueue) {\n this._drainQueueIfReady(epoch);\n }\n }\n }\n\n // ── Ephemeral activity trace helpers ─────────────────────────────────\n\n private _handleThinkingChunk(content: string): void {\n const THINKING_BUFFER_LIMIT = 500;\n const prev = this.state.messaging.thinkingContent;\n let updated = prev + content;\n if (updated.length > THINKING_BUFFER_LIMIT) {\n updated = updated.slice(-THINKING_BUFFER_LIMIT);\n }\n this._updateMessaging({ thinkingContent: updated });\n\n // Upsert a \"thinking\" step if not already active\n const steps = this.state.messaging.activeSteps;\n const existing = steps.find(\n (s) => s.type === \"thinking\" && s.status === \"active\",\n );\n if (!existing) {\n const step: ActivityStep = {\n id: `thinking-${Date.now()}`,\n type: \"thinking\",\n toolName: \"thinking\",\n status: \"active\",\n startedAt: Date.now(),\n };\n this._updateMessaging({ activeSteps: [...steps, step] });\n }\n }\n\n private _handleToolStart(tool: {\n callId?: string;\n name: string;\n arguments?: string;\n agentName?: string;\n }): void {\n // Mark any active thinking step as completed (model moved to tool execution)\n let steps = this.state.messaging.activeSteps.map((s) =>\n s.type === \"thinking\" && s.status === \"active\"\n ? { ...s, status: \"completed\" as const, completedAt: Date.now() }\n : s,\n );\n\n const isAgentDelegation = tool.name === \"task\";\n const step: ActivityStep = {\n id:\n tool.callId ||\n `tool-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n type: isAgentDelegation ? \"agent_delegation\" : \"tool\",\n toolName: tool.name,\n arguments: tool.arguments,\n agentName: tool.agentName,\n status: \"active\",\n startedAt: Date.now(),\n };\n\n steps = [...steps, step];\n this._updateMessaging({ activeSteps: steps });\n }\n\n private _handleToolEnd(tool: {\n callId?: string;\n name: string;\n durationMs?: number;\n agentName?: string;\n }): void {\n const steps = [...this.state.messaging.activeSteps];\n const idx = steps.findIndex(\n (s) => s.status === \"active\" && this._matchStep(s, tool),\n );\n if (idx !== -1) {\n steps[idx] = {\n ...steps[idx],\n status: \"completed\" as const,\n completedAt: Date.now(),\n durationMs: tool.durationMs,\n };\n }\n this._updateMessaging({ activeSteps: steps });\n\n // Artifact invalidation\n if (tool.name && ARTIFACT_TOOL_NAMES.has(tool.name)) {\n this._updateMessaging({\n artifactsInvalidationTrigger:\n this.state.messaging.artifactsInvalidationTrigger + 1,\n });\n }\n }\n\n /** Match a step to a tool_end event. Use callId when present; fall back to name + agentName. */\n private _matchStep(\n step: ActivityStep,\n tool: { callId?: string; name: string; agentName?: string },\n ): boolean {\n // When the backend provides a callId, use it exclusively — no fallback.\n if (tool.callId) {\n return step.id === tool.callId;\n }\n return step.toolName === tool.name && step.agentName === tool.agentName;\n }\n\n // ── Retry ───────────────────────────────────────────────────────────────\n\n private async _retryLastMessage(): Promise<void> {\n const lastAttempt = this.lastSendAttempt;\n if (!lastAttempt || this.state.messaging.loading) {\n return;\n }\n this._clearStreamError();\n this._updateInput({ inputError: null });\n await this._sendMessageDirect(\n lastAttempt.content,\n lastAttempt.attachments,\n lastAttempt.options,\n );\n }\n\n // ── Regenerate / Edit ───────────────────────────────────────────────────\n\n private async _handleRegenerate(\n turnId: string,\n model?: string,\n ): Promise<void> {\n const curSessionId = this.state.session.currentSessionId;\n if (!curSessionId || curSessionId === \"new\") {\n return;\n }\n\n const turn = this.state.messaging.turns.find((t) => t.id === turnId);\n if (!turn) {\n return;\n }\n\n if (model && model !== this.state.session.model) {\n this._setModel(model);\n }\n\n this._updateSession({ error: null, errorRetryable: false });\n // _sendMessageDirect delegates to _sendMessageCore which handles all errors internally\n await this._sendMessageDirect(\n turn.userTurn.content,\n turn.userTurn.attachments,\n {\n replaceFromMessageID: turn.userTurn.id,\n },\n );\n }\n\n private async _handleEdit(turnId: string, newContent: string): Promise<void> {\n const curSessionId = this.state.session.currentSessionId;\n if (!curSessionId || curSessionId === \"new\") {\n this._updateInput({ message: newContent });\n this._updateMessaging({\n turns: this.state.messaging.turns.filter((t) => t.id !== turnId),\n });\n return;\n }\n\n const turn = this.state.messaging.turns.find((t) => t.id === turnId);\n if (!turn) {\n this._updateSession({\n error: \"Failed to edit message\",\n errorRetryable: false,\n });\n return;\n }\n\n this._updateSession({ error: null, errorRetryable: false });\n // _sendMessageDirect delegates to _sendMessageCore which handles all errors internally\n await this._sendMessageDirect(newContent, turn.userTurn.attachments, {\n replaceFromMessageID: turn.userTurn.id,\n });\n }\n\n private async _handleCopy(text: string): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) {\n return;\n }\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // Clipboard write can fail if page doesn't have focus (Permissions Policy)\n }\n }\n\n // ── HITL ────────────────────────────────────────────────────────────────\n\n private async _handleSubmitQuestionAnswers(\n answers: QuestionAnswers,\n ): Promise<void> {\n const curSessionId = this.state.session.currentSessionId;\n const curPendingQuestion = this.state.messaging.pendingQuestion;\n if (!curSessionId || !curPendingQuestion) {\n return;\n }\n\n const epoch = this.viewEpoch;\n this._updateMessaging({ loading: true });\n this._updateSession({ error: null, errorRetryable: false });\n const previousPendingQuestion = curPendingQuestion;\n\n try {\n const result = await this.dataSource.submitQuestionAnswers(\n curSessionId,\n previousPendingQuestion.id,\n answers,\n );\n // Bail on dispose or a session switch — writes below belong to this session.\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n\n if (result.success) {\n this._updateMessaging({\n pendingQuestion: {\n ...previousPendingQuestion,\n status: \"ANSWER_SUBMITTED\",\n },\n turns: applyTurnLifecycleForPendingQuestion(\n this.state.messaging.turns,\n {\n ...previousPendingQuestion,\n status: \"ANSWER_SUBMITTED\",\n },\n ),\n });\n if (result.data) {\n await this._resumeAcceptedRunOrPoll(curSessionId, result.data.runId);\n if (!this.state.messaging.generationInProgress) {\n const fetchResult =\n await this.dataSource.fetchSession(curSessionId);\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (fetchResult) {\n this._updateSession({ session: fetchResult.session });\n this._setTurnsFromFetch(\n fetchResult.turns,\n fetchResult.pendingQuestion || null,\n );\n } else {\n this._updateSession({\n error: \"Failed to load updated session\",\n errorRetryable: true,\n });\n }\n }\n } else if (curSessionId !== \"new\") {\n const fetchResult = await this.dataSource.fetchSession(curSessionId);\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (fetchResult) {\n this._updateSession({ session: fetchResult.session });\n this._setTurnsFromFetch(\n fetchResult.turns,\n fetchResult.pendingQuestion || null,\n );\n } else {\n this._updateSession({\n error: \"Failed to load updated session\",\n errorRetryable: true,\n });\n }\n }\n } else {\n this._updateSession({\n error: result.error || \"Failed to submit answers\",\n errorRetryable: false,\n });\n }\n } catch (err) {\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n const normalized = normalizeRPCError(err, \"Failed to submit answers\");\n this._updateSession({\n error: normalized.userMessage,\n errorRetryable: normalized.retryable,\n });\n } finally {\n if (this._isCurrentEpoch(epoch)) {\n this._updateMessaging({ loading: false });\n // The question is resolved and generation finished — resume any queued\n // messages that were stranded while the question was open.\n if (!this.state.session.error) {\n this._drainQueueIfReady(epoch);\n }\n }\n }\n }\n\n private async _handleRejectPendingQuestion(): Promise<void> {\n const curSessionId = this.state.session.currentSessionId;\n const curPendingQuestion = this.state.messaging.pendingQuestion;\n if (!curSessionId || !curPendingQuestion) {\n return;\n }\n\n const epoch = this.viewEpoch;\n try {\n const result = await this.dataSource.rejectPendingQuestion(curSessionId);\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (result.success) {\n const submittedQuestion = {\n ...curPendingQuestion,\n status: \"REJECT_SUBMITTED\" as const,\n };\n this._updateMessaging({\n pendingQuestion: submittedQuestion,\n turns: applyTurnLifecycleForPendingQuestion(\n this.state.messaging.turns,\n submittedQuestion,\n ),\n });\n if (result.data) {\n await this._resumeAcceptedRunOrPoll(curSessionId, result.data.runId);\n if (\n !this.state.messaging.generationInProgress &&\n curSessionId !== \"new\"\n ) {\n const fetchResult =\n await this.dataSource.fetchSession(curSessionId);\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (fetchResult) {\n this._updateSession({ session: fetchResult.session });\n this._setTurnsFromFetch(\n fetchResult.turns,\n fetchResult.pendingQuestion || null,\n );\n } else {\n this._updateSession({\n error: \"Failed to load updated session\",\n errorRetryable: true,\n });\n }\n }\n } else if (curSessionId !== \"new\") {\n const fetchResult = await this.dataSource.fetchSession(curSessionId);\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n if (fetchResult) {\n this._updateSession({ session: fetchResult.session });\n this._setTurnsFromFetch(\n fetchResult.turns,\n fetchResult.pendingQuestion || null,\n );\n }\n }\n } else {\n this._updateSession({\n error: result.error || \"Failed to reject question\",\n errorRetryable: false,\n });\n }\n } catch (err) {\n if (!this._isCurrentEpoch(epoch)) {\n return;\n }\n const normalized = normalizeRPCError(err, \"Failed to reject question\");\n this._updateSession({\n error: normalized.userMessage,\n errorRetryable: normalized.retryable,\n });\n } finally {\n // Question resolved — resume any messages queued while it was open.\n if (this._isCurrentEpoch(epoch) && !this.state.session.error) {\n this._drainQueueIfReady(epoch);\n }\n }\n }\n\n // ── Input / queue ───────────────────────────────────────────────────────\n\n private _handleSubmit(\n e: { preventDefault: () => void },\n attachments: Attachment[] = [],\n ): void {\n e.preventDefault();\n const msg = this.state.input.message;\n if (!msg.trim() && attachments.length === 0) {\n return;\n }\n this._updateInput({ inputError: null });\n this._clearStreamError();\n\n const convertedAttachments: Attachment[] = attachments.map((att) => ({\n clientKey: att.clientKey || crypto.randomUUID(),\n id: att.id,\n uploadId: att.uploadId,\n filename: att.filename,\n mimeType: att.mimeType,\n sizeBytes: att.sizeBytes,\n base64Data: att.base64Data,\n url: att.url,\n preview: att.preview,\n }));\n\n // Queue if currently generating\n if (this.state.messaging.loading) {\n const ok = this._enqueueMessage(msg.trim(), convertedAttachments);\n if (ok) {\n this._updateInput({ message: \"\" });\n }\n return;\n }\n\n this._sendMessage(msg.trim(), convertedAttachments);\n }\n\n private _handleUnqueue(): {\n content: string;\n attachments: Attachment[];\n } | null {\n const queue = this.state.input.messageQueue;\n if (queue.length === 0) {\n return null;\n }\n\n const last = queue[queue.length - 1];\n this._updateInput({ messageQueue: queue.slice(0, -1) });\n return { content: last.content, attachments: last.attachments };\n }\n\n private _enqueueMessage(content: string, attachments: Attachment[]): boolean {\n if (this.state.input.messageQueue.length >= MAX_QUEUE_SIZE) {\n this._updateInput({ inputError: \"BiChat.Input.QueueFull\" });\n return false;\n }\n this._updateInput({\n messageQueue: [\n ...this.state.input.messageQueue,\n { content, attachments },\n ],\n });\n return true;\n }\n\n private _removeQueueItem(index: number): void {\n this._updateInput({\n messageQueue: this.state.input.messageQueue.filter((_, i) => i !== index),\n });\n }\n\n private _updateQueueItem(index: number, content: string): void {\n this._updateInput({\n messageQueue: this.state.input.messageQueue.map((item, i) =>\n i === index ? { ...item, content } : item,\n ),\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sessionDebugUsageEqual(\n a: SessionDebugUsage | null,\n b: SessionDebugUsage,\n): boolean {\n if (!a) {\n return false;\n }\n return (\n a.promptTokens === b.promptTokens &&\n a.completionTokens === b.completionTokens &&\n a.totalTokens === b.totalTokens &&\n a.turnsWithUsage === b.turnsWithUsage &&\n a.latestPromptTokens === b.latestPromptTokens &&\n a.latestCompletionTokens === b.latestCompletionTokens &&\n a.latestTotalTokens === b.latestTotalTokens\n );\n}\n","/**\n * Chat session context provider and hooks.\n *\n * Thin React wrapper around ChatMachine. All async logic (session fetch,\n * streaming, HITL, slash commands, queue, rate limiting) lives in the\n * framework-agnostic ChatMachine class.\n *\n * Split into 3 focused contexts to minimize re-renders:\n * - ChatSessionContext: session lifecycle (session, fetching, error, debug)\n * - ChatMessagingContext: turns + streaming + tool interactions\n * - ChatInputContext: input form state (message, inputError, queue)\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useRef,\n useSyncExternalStore,\n type ReactNode,\n} from 'react';\nimport type {\n ChatDataSource,\n ChatSessionStateValue,\n ChatMessagingStateValue,\n ChatInputStateValue,\n} from '../types';\nimport { RateLimiter, type RateLimiterConfig } from '../utils/RateLimiter';\nimport { ChatMachine } from '../machine/ChatMachine';\n\n// ---------------------------------------------------------------------------\n// Internal context — holds the machine instance\n// ---------------------------------------------------------------------------\n\nconst MachineCtx = createContext<ChatMachine | null>(null);\n\n// ---------------------------------------------------------------------------\n// Provider props\n// ---------------------------------------------------------------------------\n\nexport interface ChatSessionProviderProps {\n dataSource: ChatDataSource\n sessionId?: string\n /**\n * External rate limiter instance. Captured once at mount — changing this prop\n * after initial render has no effect. For most cases, use `rateLimitConfig`\n * instead and let the provider create the limiter internally.\n */\n rateLimiter?: RateLimiter\n /**\n * Configuration for the built-in rate limiter (ignored when `rateLimiter` is\n * provided). Captured once at mount — changing after initial render has no effect.\n */\n rateLimitConfig?: RateLimiterConfig\n /**\n * Called when the machine creates a new session (e.g. on first message in a\n * \"new chat\"). Use this to navigate your SPA router to the new session URL.\n */\n onSessionCreated?: (sessionId: string) => void\n children: ReactNode\n}\n\nconst DEFAULT_RATE_LIMIT_CONFIG: RateLimiterConfig = {\n maxRequests: 20,\n windowMs: 60000,\n};\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function ChatSessionProvider({\n dataSource,\n sessionId,\n rateLimiter: externalRateLimiter,\n rateLimitConfig,\n onSessionCreated,\n children,\n}: ChatSessionProviderProps) {\n // Create machine once (stable across re-renders)\n const machineRef = useRef<ChatMachine | null>(null);\n if (!machineRef.current) {\n machineRef.current = new ChatMachine({\n dataSource,\n rateLimiter:\n externalRateLimiter ||\n new RateLimiter(rateLimitConfig || DEFAULT_RATE_LIMIT_CONFIG),\n onSessionCreated,\n });\n }\n const machine = machineRef.current;\n\n // Sync mutable config (dataSource, onSessionCreated) on every render\n useEffect(() => {\n machine.updateConfig({ dataSource, onSessionCreated });\n }, [machine, dataSource, onSessionCreated]);\n\n // Sync sessionId prop → machine\n useEffect(() => {\n machine.setSessionId(sessionId);\n }, [machine, sessionId]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n machine.dispose();\n };\n }, [machine]);\n\n return (\n <MachineCtx.Provider value={machine}>\n {children}\n </MachineCtx.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Private helper\n// ---------------------------------------------------------------------------\n\nfunction useMachine(): ChatMachine {\n const machine = useContext(MachineCtx);\n if (!machine) {\n throw new Error('Chat hooks must be used within ChatSessionProvider');\n }\n return machine;\n}\n\n// ---------------------------------------------------------------------------\n// Public hooks (same signatures as before)\n// ---------------------------------------------------------------------------\n\nexport function useChatSession(): ChatSessionStateValue {\n const machine = useMachine();\n return useSyncExternalStore(\n machine.subscribeSession,\n machine.getSessionSnapshot,\n machine.getSessionSnapshot, // SSR fallback\n );\n}\n\nexport function useChatMessaging(): ChatMessagingStateValue {\n const machine = useMachine();\n return useSyncExternalStore(\n machine.subscribeMessaging,\n machine.getMessagingSnapshot,\n machine.getMessagingSnapshot,\n );\n}\n\n/** Returns messaging context or null when outside ChatSessionProvider. */\nexport function useOptionalChatMessaging(): ChatMessagingStateValue | null {\n const machine = useContext(MachineCtx);\n // Can't call useSyncExternalStore conditionally, so guard with machine presence\n const snapshot = useSyncExternalStore(\n machine ? machine.subscribeMessaging : noopSubscribe,\n machine ? machine.getMessagingSnapshot : nullSnapshot,\n machine ? machine.getMessagingSnapshot : nullSnapshot,\n );\n return machine ? snapshot : null;\n}\n\nexport function useChatInput(): ChatInputStateValue {\n const machine = useMachine();\n return useSyncExternalStore(\n machine.subscribeInput,\n machine.getInputSnapshot,\n machine.getInputSnapshot,\n );\n}\n\n// Helpers for useOptionalChatMessaging (must call hooks unconditionally)\nfunction noopSubscribe(): () => void { return () => {}; }\nfunction nullSnapshot(): null { return null; }\n","/**\n * Chat header component\n * Displays session title, controls, and group chat indicators.\n *\n * Supports customization via:\n * - logoSlot: Custom logo component\n * - actionsSlot: Custom action buttons\n * - members / onMembersClick: Avatar stack for group chats\n * - Translations for \"New Chat\", \"Archived\", etc.\n */\n\nimport { ReactNode } from 'react';\nimport { Session } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useBranding } from '../hooks/useBranding';\nimport { AvatarStack } from './AvatarStack';\n\ninterface ChatHeaderProps {\n session: Session | null\n onBack?: () => void\n readOnly?: boolean\n /** Custom logo component to display */\n logoSlot?: ReactNode\n /** Custom action buttons */\n actionsSlot?: ReactNode\n /** Members to display in avatar stack for group chats */\n members?: Array<{ firstName: string; lastName: string; initials?: string }>\n /** Callback when avatar stack is clicked (to open members modal) */\n onMembersClick?: () => void\n}\n\nexport function ChatHeader({ session, onBack, readOnly, logoSlot, actionsSlot, members, onMembersClick }: ChatHeaderProps) {\n const { t } = useTranslation();\n const branding = useBranding();\n\n const BackButton = onBack ? (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"cursor-pointer p-2 hover:bg-gray-100 dark:hover:bg-gray-700 active:bg-gray-200 dark:active:bg-gray-600 rounded-lg transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={t('BiChat.Chat.GoBack')}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n ) : null;\n\n const Logo = logoSlot || (branding.logoUrl ? (\n <img src={branding.logoUrl} alt={branding.appName} className=\"h-6 w-auto\" />\n ) : null);\n\n if (!session) {\n return (\n <header className=\"bichat-header border-b border-gray-200 dark:border-gray-700 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">\n {t('BiChat.Chat.NewChat')}\n </h1>\n </div>\n {actionsSlot && <div className=\"flex items-center gap-2\">{actionsSlot}</div>}\n </div>\n </header>\n );\n }\n\n const resolvedSessionTitle = session.title?.trim() || t('BiChat.Chat.NewChat');\n const isGroupSession = Boolean(session.isGroup || (session.memberCount && session.memberCount > 1));\n const memberCount = session.memberCount ?? 0;\n\n // Avatar stack: use provided members or empty array\n const stackUsers = members && members.length > 0 ? members : [];\n\n return (\n <header className=\"bichat-header border-b border-gray-200 dark:border-gray-700 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {BackButton}\n {Logo}\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2.5\">\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)] truncate\">{resolvedSessionTitle}</h1>\n {session.pinned && (\n <svg\n className=\"w-4 h-4 text-[var(--bichat-primary)] flex-shrink-0\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n role=\"img\"\n aria-label={t('BiChat.Chat.Pinned')}\n >\n <path d=\"M10 2a1 1 0 011 1v1.323l3.954 1.582 1.599-.8a1 1 0 01.894 1.79l-1.233.616 1.738 5.42a1 1 0 01-.285 1.05A3.989 3.989 0 0115 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.715-5.349L11 6.477V16h2a1 1 0 110 2H7a1 1 0 110-2h2V6.477L6.237 7.582l1.715 5.349a1 1 0 01-.285 1.05A3.989 3.989 0 015 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.738-5.42-1.233-.617a1 1 0 01.894-1.788l1.599.799L9 4.323V3a1 1 0 011-1z\" />\n </svg>\n )}\n {isGroupSession && stackUsers.length > 0 && (\n <AvatarStack\n users={stackUsers}\n max={3}\n size=\"xs\"\n onClick={onMembersClick}\n className=\"flex-shrink-0\"\n />\n )}\n </div>\n {isGroupSession && memberCount > 0 && (\n <p className=\"text-xs text-gray-600 dark:text-gray-400 mt-0.5\">\n {memberCount === 1\n ? t('BiChat.Chat.OneMember')\n : t('BiChat.Chat.MemberCount').replace('{{count}}', String(memberCount))}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {readOnly && (\n <span className=\"px-2 py-1 text-xs bg-amber-100 dark:bg-amber-900/30 text-amber-800 dark:text-amber-200 rounded\">\n {t('BiChat.Chat.ReadOnly')}\n </span>\n )}\n {session.status === 'archived' && (\n <span className=\"px-2 py-1 text-xs bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded\">\n {t('BiChat.Chat.Archived')}\n </span>\n )}\n {actionsSlot}\n </div>\n </div>\n </header>\n );\n}\n","/**\n * Branding hook for UI customization.\n *\n * Provides access to branding configuration injected from the backend\n * via window.__APPLET_CONTEXT__.extensions.branding\n */\n\nimport { useMemo } from 'react';\nimport { useIotaContext } from '../context/IotaContext';\nimport type { BrandingConfig, ExamplePrompt } from '../types';\nimport { useTranslation } from './useTranslation';\n\n/**\n * Default example prompts when none are configured.\n */\nconst defaultExamplePrompts: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n text: 'Show me sales trends for the last quarter',\n icon: 'chart-bar',\n },\n {\n category: 'Reports',\n text: 'Generate a summary of recent activity',\n icon: 'file-text',\n },\n {\n category: 'Insights',\n text: 'What are the top performing items?',\n icon: 'lightbulb',\n },\n];\n\n/**\n * Hook to access branding configuration.\n *\n * Returns merged branding with fallbacks to defaults and translations.\n */\nexport function useBranding() {\n const context = useIotaContext();\n const { t } = useTranslation();\n\n const branding = useMemo((): BrandingConfig => {\n const customBranding = context.extensions?.branding || {};\n\n // Get example prompts with category translations\n let examplePrompts = customBranding.welcome?.examplePrompts;\n if (!examplePrompts || examplePrompts.length === 0) {\n // Use defaults with translated categories\n examplePrompts = defaultExamplePrompts.map((p) => ({\n ...p,\n category: t(`category.${p.category.toLowerCase().replace(/\\s+/g, '')}`) || p.category,\n }));\n }\n\n return {\n appName: customBranding.appName || 'BiChat',\n logoUrl: customBranding.logoUrl,\n welcome: {\n title: customBranding.welcome?.title || t('BiChat.Welcome.Title'),\n description: customBranding.welcome?.description || t('BiChat.Welcome.Description'),\n examplePrompts,\n },\n theme: customBranding.theme,\n };\n }, [context.extensions?.branding, t]);\n\n return branding;\n}\n\n/**\n * Hook to access feature flags.\n */\nexport function useFeatureFlags() {\n const context = useIotaContext();\n\n return useMemo(\n () => ({\n vision: context.extensions?.features?.vision ?? false,\n webSearch: context.extensions?.features?.webSearch ?? false,\n codeInterpreter: context.extensions?.features?.codeInterpreter ?? false,\n multiAgent: context.extensions?.features?.multiAgent ?? false,\n }),\n [context.extensions?.features]\n );\n}\n","/**\n * UserAvatar Component\n * Displays user initials with deterministic color from a color palette\n */\n\nimport { memo } from 'react';\n\nexport interface UserAvatarProps {\n /** User's first name */\n firstName: string\n /** User's last name */\n lastName: string\n /** Override initials (defaults to first letters of first and last name) */\n initials?: string\n /** Avatar size */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Generate a consistent color index from a string\n * Uses simple hash function for deterministic color selection\n */\nfunction hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\n/**\n * Color palette using hex values for inline styles.\n * Inline styles ensure colors render correctly in portaled content\n * (e.g. Headless UI dropdowns) outside the shadow DOM.\n */\nconst colorPalette = [\n { bg: '#3b82f6', text: '#ffffff' }, // blue-500\n { bg: '#22c55e', text: '#111827' }, // green-500 (light bg)\n { bg: '#a855f7', text: '#ffffff' }, // purple-500\n { bg: '#ec4899', text: '#ffffff' }, // pink-500\n { bg: '#6366f1', text: '#ffffff' }, // indigo-500\n { bg: '#14b8a6', text: '#111827' }, // teal-500 (light bg)\n { bg: '#f97316', text: '#ffffff' }, // orange-500\n { bg: '#06b6d4', text: '#111827' }, // cyan-500 (light bg)\n { bg: '#f59e0b', text: '#111827' }, // amber-500 (light bg)\n { bg: '#84cc16', text: '#111827' }, // lime-500 (light bg)\n];\n\n/**\n * Size configurations\n */\nconst sizeClasses = {\n xs: 'w-6 h-6 text-[10px]',\n sm: 'w-8 h-8 text-xs',\n md: 'w-10 h-10 text-sm',\n lg: 'w-12 h-12 text-base',\n};\n\nfunction UserAvatar({\n firstName,\n lastName,\n initials: providedInitials,\n size = 'md',\n className = '',\n}: UserAvatarProps) {\n // Generate initials if not provided\n const derivedInitials = (() => {\n const firstChar = firstName?.trim()?.charAt(0) || '';\n const lastChar = lastName?.trim()?.charAt(0) || '';\n const combined = `${firstChar}${lastChar}`.trim();\n return combined || 'U';\n })();\n\n const initials = (providedInitials?.trim() || derivedInitials).toUpperCase();\n\n // Select color based on full name hash (deterministic)\n const fullName = `${firstName}${lastName}`;\n const colorIndex = hashString(fullName) % colorPalette.length;\n const colors = colorPalette[colorIndex];\n\n return (\n <div\n className={`\n ${sizeClasses[size]}\n ${className}\n rounded-full\n flex\n items-center\n justify-center\n font-semibold\n flex-shrink-0\n select-none\n `}\n style={{ backgroundColor: colors.bg, color: colors.text }}\n aria-label={`${firstName} ${lastName}`}\n title={`${firstName} ${lastName}`}\n >\n {initials}\n </div>\n );\n}\n\nconst MemoizedUserAvatar = memo(UserAvatar);\nMemoizedUserAvatar.displayName = 'UserAvatar';\n\nexport { MemoizedUserAvatar as UserAvatar };\nexport default MemoizedUserAvatar;\n","/**\n * AvatarStack Component\n * Displays overlapping user avatars with an overflow \"+N\" indicator.\n * Used in ChatHeader and SessionItem for group chat visualization.\n */\n\nimport { memo } from 'react';\nimport { UserAvatar } from './UserAvatar';\n\nexport interface AvatarStackProps {\n /** List of users to display */\n users: Array<{ firstName: string; lastName: string; initials?: string }>\n /** Maximum avatars to show before \"+N\" (default: 3) */\n max?: number\n /** Avatar size */\n size?: 'xs' | 'sm'\n /** Click handler — makes the stack interactive */\n onClick?: () => void\n /** Additional CSS classes */\n className?: string\n}\n\nconst overlapClasses = {\n xs: '-ml-1.5',\n sm: '-ml-2',\n} as const;\n\nconst badgeSizeClasses = {\n xs: 'w-6 h-6 text-[10px]',\n sm: 'w-8 h-8 text-xs',\n} as const;\n\nfunction AvatarStackInner({\n users,\n max = 3,\n size = 'sm',\n onClick,\n className = '',\n}: AvatarStackProps) {\n const visible = users.slice(0, max);\n const overflow = users.length - max;\n\n const interactive = typeof onClick === 'function';\n const overlap = overlapClasses[size];\n const badgeSize = badgeSizeClasses[size];\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (interactive && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick!();\n }\n };\n\n return (\n <div\n className={`inline-flex items-center ${interactive ? 'cursor-pointer transition-opacity hover:opacity-80' : ''} ${className}`}\n onClick={interactive ? onClick : undefined}\n onKeyDown={interactive ? handleKeyDown : undefined}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-label={interactive ? `${users.length} members` : undefined}\n >\n {visible.map((user, i) => (\n <div\n key={`${user.firstName}-${user.lastName}-${i}`}\n className={`${i > 0 ? overlap : ''} ring-2 ring-white dark:ring-gray-900 rounded-full`}\n style={{ zIndex: visible.length - i }}\n >\n <UserAvatar\n firstName={user.firstName}\n lastName={user.lastName}\n initials={user.initials}\n size={size}\n />\n </div>\n ))}\n {overflow > 0 && (\n <div\n className={`${overlap} ${badgeSize} rounded-full bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300 font-medium flex items-center justify-center flex-shrink-0 ring-2 ring-white dark:ring-gray-900`}\n style={{ zIndex: 0 }}\n >\n +{overflow}\n </div>\n )}\n </div>\n );\n}\n\nconst AvatarStack = memo(AvatarStackInner);\nAvatarStack.displayName = 'AvatarStack';\n\nexport { AvatarStack };\nexport default AvatarStack;\n","/**\n * Date formatting utilities using date-fns\n */\n\nimport { differenceInMinutes, differenceInHours, differenceInDays, format } from 'date-fns';\n\n/**\n * Format a date as relative time (e.g., \"5m ago\", \"2h ago\")\n * Falls back to HH:mm format for dates older than 24 hours\n *\n * Accepts an optional `t` function for i18n. Translation keys used:\n * - BiChat.RelativeTime.JustNow\n * - BiChat.RelativeTime.MinutesAgo (receives `{count}`)\n * - BiChat.RelativeTime.HoursAgo (receives `{count}`)\n * - BiChat.RelativeTime.DaysAgo (receives `{count}`)\n *\n * If no `t` function is provided, falls back to English defaults.\n */\nexport function formatRelativeTime(\n date: string | Date,\n t?: (key: string, params?: Record<string, string | number>) => string\n): string {\n const messageDate = new Date(date);\n const now = new Date();\n\n const diffMins = differenceInMinutes(now, messageDate);\n const diffHours = differenceInHours(now, messageDate);\n const diffDays = differenceInDays(now, messageDate);\n\n if (diffMins < 1) {\n return t ? t('BiChat.RelativeTime.JustNow') : 'Just now';\n }\n if (diffMins < 60) {\n return t ? t('BiChat.RelativeTime.MinutesAgo', { count: diffMins }) : `${diffMins}m ago`;\n }\n if (diffHours < 24) {\n return t ? t('BiChat.RelativeTime.HoursAgo', { count: diffHours }) : `${diffHours}h ago`;\n }\n if (diffDays <= 7) {\n return t ? t('BiChat.RelativeTime.DaysAgo', { count: diffDays }) : `${diffDays}d ago`;\n }\n\n return format(messageDate, 'HH:mm');\n}\n","/**\n * File Utilities\n * Validation, conversion, and formatting for file attachments\n */\n\nconst MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024; // 20MB\n\nconst ALLOWED_MIME_TYPES = new Set<string>([\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'text/csv',\n 'text/tab-separated-values',\n 'text/plain',\n 'text/markdown',\n 'application/json',\n 'application/xml',\n 'text/xml',\n 'application/yaml',\n 'text/yaml',\n 'application/x-yaml',\n 'text/x-yaml',\n 'text/log',\n]);\n\nconst ALLOWED_EXTENSIONS = new Set<string>([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.csv',\n '.tsv',\n '.txt',\n '.md',\n '.json',\n '.xml',\n '.yaml',\n '.yml',\n '.log',\n]);\n\nexport const ATTACHMENT_ACCEPT_ATTRIBUTE = Array.from(ALLOWED_EXTENSIONS).join(',');\n\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType.toLowerCase().startsWith('image/');\n}\n\n/**\n * Validates a file against size and type constraints\n * @throws Error if validation fails\n */\nexport function validateAttachmentFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n const mimeType = file.type.toLowerCase();\n const fileName = file.name || 'file';\n const extensionMatch = /\\.(\\w+)$/.exec(fileName.toLowerCase());\n const extension = extensionMatch ? `.${extensionMatch[1]}` : '';\n\n const mimeAllowed = mimeType !== '' && ALLOWED_MIME_TYPES.has(mimeType);\n const extensionAllowed = extension !== '' && ALLOWED_EXTENSIONS.has(extension);\n\n if (!mimeAllowed && !extensionAllowed) {\n throw new Error(`Invalid file type: ${mimeType || extension || 'unknown'}`);\n }\n\n if (file.size > maxSizeBytes) {\n const sizeMB = (file.size / 1024 / 1024).toFixed(1);\n const maxSizeMB = (maxSizeBytes / 1024 / 1024).toFixed(0);\n throw new Error(`File too large: ${sizeMB}MB exceeds ${maxSizeMB}MB limit`);\n }\n}\n\n/**\n * Backward-compatible image validator used by older components/stories.\n */\nexport function validateImageFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n validateAttachmentFile(file, maxSizeBytes);\n if (!isImageMimeType(file.type)) {\n throw new Error(`Invalid file type: ${file.type}. Only image files are allowed.`);\n }\n}\n\n/**\n * Encode an ArrayBuffer to a base64 string.\n */\nfunction encodeArrayBuffer(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n const chunkSize = 0x8000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode(...chunk);\n }\n return btoa(binary);\n}\n\nfunction readWithFileReaderArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result instanceof ArrayBuffer) {\n resolve(reader.result);\n return;\n }\n reject(new Error('Unexpected reader result'));\n };\n reader.onerror = () => reject(reader.error ?? new Error('FileReader failed'));\n reader.onabort = () => reject(new Error('File read was aborted'));\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction readWithFileReaderDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n return;\n }\n reject(new Error('Unexpected reader result'));\n };\n reader.onerror = () => reject(reader.error ?? new Error('FileReader failed'));\n reader.onabort = () => reject(new Error('File read was aborted'));\n reader.readAsDataURL(file);\n });\n}\n\nasync function readFileBuffer(file: File): Promise<ArrayBuffer> {\n try {\n return await new Response(file).arrayBuffer();\n } catch {\n // Fall through to native/file-reader strategies for drag/drop edge cases.\n }\n\n try {\n return await file.arrayBuffer();\n } catch {\n return readWithFileReaderArrayBuffer(file);\n }\n}\n\nfunction extractBase64FromDataUrl(dataUrl: string): string {\n const commaIndex = dataUrl.indexOf(',');\n if (commaIndex < 0 || commaIndex === dataUrl.length - 1) {\n throw new Error('Invalid data URL');\n }\n return dataUrl.slice(commaIndex + 1);\n}\n\n/**\n * Converts a file to base64 string (without data URL prefix).\n * Prefers FileReader data URLs, then falls back to buffer-based encoding.\n */\nexport async function convertToBase64(file: File): Promise<string> {\n try {\n const dataUrl = await readWithFileReaderDataUrl(file);\n return extractBase64FromDataUrl(dataUrl);\n } catch {\n try {\n const buffer = await readFileBuffer(file);\n return encodeArrayBuffer(buffer);\n } catch (err) {\n const details = err instanceof Error ? ` (${err.message})` : '';\n throw new Error(`Failed to read file: ${file.name}${details}`);\n }\n }\n}\n\n/**\n * Creates a data URL from base64 string and MIME type\n */\nexport function createDataUrl(base64: string, mimeType: string): string {\n return `data:${mimeType};base64,${base64}`;\n}\n\n/**\n * Formats file size in human-readable format\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) {return `${bytes} B`;}\n if (bytes < 1024 * 1024) {return `${(bytes / 1024).toFixed(1)} KB`;}\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\n/**\n * Validates multiple files don't exceed count limit\n * @throws Error if count exceeds limit\n */\nexport function validateFileCount(currentCount: number, newCount: number, maxCount: number = 10): void {\n const total = currentCount + newCount;\n if (total > maxCount) {\n throw new Error(`Cannot attach more than ${maxCount} files (attempting to add ${total})`);\n }\n}\n\n// ─── Shared file visual metadata ──────────────────────────────────────────────\n\nimport {\n File,\n FileCode,\n FileCsv,\n FileDoc,\n FilePdf,\n FileText,\n FileXls,\n Image as ImageIcon,\n ChartBar,\n} from '@phosphor-icons/react';\n\nexport interface FileVisual {\n /** Phosphor icon component */\n icon: typeof File\n /** Tailwind text-color classes for the icon (light + dark) */\n iconColor: string\n /** Tailwind background classes for the icon container (light + dark) */\n bgColor: string\n /** Short label (PDF, CSV, XLS, etc.) */\n label: string\n}\n\n/**\n * Resolves visual metadata (icon, colors, label) for a file based on\n * its MIME type and/or filename. Single source of truth used by\n * AttachmentGrid, SessionArtifactList, DownloadCard, etc.\n */\nexport function getFileVisual(mimeType?: string, filename?: string): FileVisual {\n const mime = (mimeType || '').toLowerCase();\n const name = (filename || '').toLowerCase();\n\n // Images\n if (mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name)) {\n return {\n icon: ImageIcon,\n iconColor: 'text-violet-600 dark:text-violet-400',\n bgColor: 'bg-violet-100 dark:bg-violet-900/40',\n label: 'IMG',\n };\n }\n\n // PDF\n if (mime.includes('pdf') || name.endsWith('.pdf')) {\n return {\n icon: FilePdf,\n iconColor: 'text-red-500 dark:text-red-400',\n bgColor: 'bg-red-100 dark:bg-red-900/40',\n label: 'PDF',\n };\n }\n\n // Excel / spreadsheet\n if (\n mime === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n mime.includes('excel') ||\n mime.includes('spreadsheet') ||\n /\\.xlsx?$/.test(name)\n ) {\n return {\n icon: FileXls,\n iconColor: 'text-emerald-600 dark:text-emerald-400',\n bgColor: 'bg-emerald-100 dark:bg-emerald-900/40',\n label: 'XLS',\n };\n }\n\n // CSV / TSV\n if (mime.includes('csv') || mime.includes('tab-separated') || /\\.(csv|tsv)$/.test(name)) {\n return {\n icon: FileCsv,\n iconColor: 'text-emerald-600 dark:text-emerald-400',\n bgColor: 'bg-emerald-100 dark:bg-emerald-900/40',\n label: 'CSV',\n };\n }\n\n // Word documents\n if (mime.includes('wordprocessingml') || mime.includes('msword') || /\\.docx?$/.test(name)) {\n return {\n icon: FileDoc,\n iconColor: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-100 dark:bg-blue-900/40',\n label: 'DOC',\n };\n }\n\n // Code / structured data (JSON, XML, YAML, etc.)\n if (\n mime.includes('json') || mime.includes('xml') || mime.includes('yaml') ||\n mime.includes('javascript') || mime.includes('typescript') ||\n /\\.(json|xml|ya?ml|js|ts)$/.test(name)\n ) {\n const l = mime.includes('json') || name.endsWith('.json') ? 'JSON'\n : mime.includes('xml') || name.endsWith('.xml') ? 'XML'\n : mime.includes('yaml') || /\\.ya?ml$/.test(name) ? 'YAML'\n : 'CODE';\n return {\n icon: FileCode,\n iconColor: 'text-violet-500 dark:text-violet-400',\n bgColor: 'bg-violet-100 dark:bg-violet-900/40',\n label: l,\n };\n }\n\n // Plain text / markdown / log\n if (mime.startsWith('text/') || /\\.(txt|md|log)$/.test(name)) {\n return {\n icon: FileText,\n iconColor: 'text-gray-500 dark:text-gray-400',\n bgColor: 'bg-gray-100 dark:bg-gray-800',\n label: 'TEXT',\n };\n }\n\n // Fallback\n return {\n icon: File,\n iconColor: 'text-gray-400 dark:text-gray-500',\n bgColor: 'bg-gray-100 dark:bg-gray-800',\n label: (mime.split('/')[1] || 'FILE').toUpperCase().slice(0, 4),\n };\n}\n\n/** Chart-specific visual (not mime-based, used for artifact type = 'chart') */\nexport const CHART_VISUAL: FileVisual = {\n icon: ChartBar,\n iconColor: 'text-indigo-600 dark:text-indigo-400',\n bgColor: 'bg-indigo-100 dark:bg-indigo-900/40',\n label: 'CHART',\n};\n","/**\n * AttachmentGrid Component\n * Displays image and non-image attachments as compact horizontal cards.\n */\n\nimport React, { useMemo, useState } from 'react';\nimport { X, Image as ImageIcon } from '@phosphor-icons/react';\nimport { formatFileSize, getFileVisual } from '../utils/fileUtils';\nimport type { Attachment } from '../types';\n\ninterface AttachmentGridProps {\n attachments: Attachment[]\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n className?: string\n readonly?: boolean\n maxDisplay?: number\n maxCapacity?: number\n emptyMessage?: string\n showCount?: boolean\n /** Number of files currently being processed (shows shimmer placeholders) */\n pendingCount?: number\n}\n\nfunction isImageAttachment(attachment: Attachment): boolean {\n return attachment.mimeType.toLowerCase().startsWith('image/');\n}\n\nfunction resolveImagePreview(attachment: Attachment): string {\n if (attachment.preview) {\n return attachment.preview;\n }\n if (!isImageAttachment(attachment)) {\n return '';\n }\n if (attachment.base64Data) {\n if (attachment.base64Data.startsWith('data:')) {\n return attachment.base64Data;\n }\n return `data:${attachment.mimeType};base64,${attachment.base64Data}`;\n }\n return attachment.url || '';\n}\n\n/* ── Shared card styles ─────────────────────────────── */\n\nconst CARD_CLS = [\n 'group relative flex items-center gap-2.5 rounded-xl',\n 'border border-gray-200/80 dark:border-gray-700/60',\n 'bg-white dark:bg-gray-800/60',\n 'px-2.5 py-2',\n 'transition-all duration-150',\n].join(' ');\n\nfunction RemoveButton({ index, onRemove, filename }: { index: number; onRemove: (i: number) => void; filename: string }) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onRemove(index); }}\n className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md opacity-0 group-hover:opacity-100 transition-all duration-150 cursor-pointer focus-visible:outline-none focus-visible:opacity-100\"\n aria-label={`Remove ${filename}`}\n >\n <X size={14} weight=\"bold\" />\n </button>\n );\n}\n\n/* ── Shimmer placeholder ───────────────────────────── */\n\nfunction ShimmerCard() {\n const shimmerStyle = {\n background: 'linear-gradient(110deg, transparent 30%, rgba(255,255,255,0.4) 50%, transparent 70%)',\n backgroundSize: '250% 100%',\n animation: 'attachmentShimmer 1.5s ease-in-out infinite',\n };\n\n return (\n <div className={CARD_CLS} style={{ pointerEvents: 'none' }}>\n <div className=\"flex-shrink-0 w-10 h-10 rounded-lg bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n <div className=\"w-full h-full\" style={shimmerStyle} />\n </div>\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-3.5 w-28 rounded bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n <div className=\"w-full h-full\" style={shimmerStyle} />\n </div>\n <div className=\"h-3 w-16 rounded bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n <div className=\"w-full h-full\" style={shimmerStyle} />\n </div>\n </div>\n <style>{`\n @keyframes attachmentShimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -60% 0; }\n }\n `}</style>\n </div>\n );\n}\n\n/* ── Image card ──────────────────────────────────────── */\n\ninterface ImageItemProps {\n attachment: Attachment\n index: number\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n}\n\nfunction ImageItem({ attachment, index, onRemove, onView }: ImageItemProps) {\n const previewSrc = resolveImagePreview(attachment);\n const hasPreview = previewSrc !== '';\n const [imgFailed, setImgFailed] = useState(false);\n\n const thumbnail =\n hasPreview && !imgFailed ? (\n <img\n src={previewSrc}\n alt={attachment.filename}\n onError={() => setImgFailed(true)}\n className=\"w-10 h-10 rounded-lg object-cover bg-gray-100 dark:bg-gray-700\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-10 h-10 rounded-lg bg-violet-100 dark:bg-violet-900/40\">\n <ImageIcon size={20} weight=\"duotone\" className=\"text-violet-600 dark:text-violet-400\" />\n </div>\n );\n\n return (\n <div className={CARD_CLS}>\n {hasPreview && !imgFailed && onView ? (\n <button\n type=\"button\"\n onClick={() => onView(index)}\n className=\"flex-shrink-0 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-lg hover:opacity-80 transition-opacity\"\n aria-label={`View ${attachment.filename}`}\n >\n {thumbnail}\n </button>\n ) : (\n <div className=\"flex-shrink-0\">{thumbnail}</div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <span className=\"block text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n {attachment.filename}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </span>\n </div>\n\n {onRemove && <RemoveButton index={index} onRemove={onRemove} filename={attachment.filename} />}\n </div>\n );\n}\n\n/* ── File card (non-image) ──────────────────────────── */\n\ninterface FileCardProps {\n attachment: Attachment\n index: number\n onRemove?: (index: number) => void\n}\n\nfunction FileCard({ attachment, index, onRemove }: FileCardProps) {\n const visual = getFileVisual(attachment.mimeType, attachment.filename);\n const Icon = visual.icon;\n\n return (\n <div className={CARD_CLS}>\n <div className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor}`}>\n <Icon size={20} weight=\"duotone\" className={visual.iconColor} />\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <span className=\"block text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n {attachment.filename}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </span>\n </div>\n\n {onRemove && <RemoveButton index={index} onRemove={onRemove} filename={attachment.filename} />}\n </div>\n );\n}\n\n/* ── Memoization ───────────────────────────────────── */\n\nconst attachmentEq = (a: Attachment, b: Attachment) =>\n a.clientKey === b.clientKey &&\n a.id === b.id &&\n a.filename === b.filename &&\n a.preview === b.preview &&\n a.base64Data === b.base64Data &&\n a.url === b.url;\n\nconst MemoizedImageItem = React.memo(ImageItem, (prev, next) =>\n attachmentEq(prev.attachment, next.attachment) &&\n prev.index === next.index &&\n prev.onRemove === next.onRemove &&\n prev.onView === next.onView\n);\n\nconst MemoizedFileCard = React.memo(FileCard, (prev, next) =>\n attachmentEq(prev.attachment, next.attachment) &&\n prev.index === next.index &&\n prev.onRemove === next.onRemove\n);\n\n/* ── Grid ──────────────────────────────────────────── */\n\nfunction AttachmentGrid({\n attachments,\n onRemove,\n onView,\n className = '',\n readonly = false,\n maxDisplay,\n maxCapacity = 10,\n emptyMessage = 'No files attached',\n showCount = false,\n pendingCount = 0,\n}: AttachmentGridProps) {\n const displayedAttachments = useMemo(\n () =>\n maxDisplay && attachments.length > maxDisplay\n ? attachments.slice(0, maxDisplay)\n : attachments,\n [attachments, maxDisplay]\n );\n\n const isAtMaxCapacity = attachments.length >= maxCapacity;\n const hasContent = displayedAttachments.length > 0 || pendingCount > 0;\n\n if (!hasContent) {\n if (!showCount) {return null;}\n return (\n <div className=\"text-center text-gray-500 dark:text-gray-400 py-4\">{emptyMessage}</div>\n );\n }\n\n const isEditable = !readonly && !!onRemove;\n\n return (\n <div className={`space-y-2 ${className}`}>\n {showCount && (\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n {displayedAttachments.length} file{displayedAttachments.length !== 1 ? 's' : ''} attached\n </div>\n )}\n\n <div className=\"grid gap-2\">\n {displayedAttachments.map((attachment, index) => {\n const isImage = isImageAttachment(attachment) && resolveImagePreview(attachment);\n return isImage ? (\n <MemoizedImageItem\n key={attachment.clientKey}\n attachment={attachment}\n index={index}\n onRemove={isEditable ? onRemove : undefined}\n onView={onView}\n />\n ) : (\n <MemoizedFileCard\n key={attachment.clientKey}\n attachment={attachment}\n index={index}\n onRemove={isEditable ? onRemove : undefined}\n />\n );\n })}\n\n {/* Shimmer placeholders for files being processed */}\n {Array.from({ length: pendingCount }).map((_, i) => (\n <ShimmerCard key={`pending-${i}`} />\n ))}\n </div>\n\n {maxDisplay && attachments.length > maxDisplay && (\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n +{attachments.length - maxDisplay} more\n </div>\n )}\n\n {isAtMaxCapacity && isEditable && (\n <div className=\"text-xs text-amber-600 dark:text-amber-400\">\n Maximum {maxCapacity} files\n </div>\n )}\n </div>\n );\n}\n\nconst MemoizedAttachmentGrid = React.memo(AttachmentGrid);\nMemoizedAttachmentGrid.displayName = 'AttachmentGrid';\n\nexport { MemoizedAttachmentGrid as AttachmentGrid };\nexport default MemoizedAttachmentGrid;\n","import { useEffect, RefObject } from 'react';\n\n/**\n * Resolve the element that actually holds focus, piercing shadow boundaries.\n *\n * Inside a shadow tree `document.activeElement` collapses to the shadow *host*\n * (the custom element), so it never equals an inner control. Reading\n * `activeElement` from the container's own root — and then descending through\n * any nested shadow roots — yields the real focused element. Without this the\n * Tab wrap-around comparisons below never match when BiChat is embedded in its\n * shadow-DOM host, silently disabling the trap.\n */\nfunction deepActiveElement(root: DocumentOrShadowRoot): HTMLElement | null {\n let active = root.activeElement;\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement;\n }\n return active instanceof HTMLElement ? active : null;\n}\n\n/**\n * Hook to trap focus within a container (for modals, sidebars)\n * Ensures Tab and Shift+Tab cycle through focusable elements only\n *\n * @param containerRef - React ref to the container element\n * @param isActive - Whether the focus trap is currently active\n * @param restoreFocusOnDeactivate - Element to restore focus to when deactivated\n *\n * @example\n * const modalRef = useRef<HTMLDivElement>(null)\n * useFocusTrap(modalRef, isOpen)\n */\nexport function useFocusTrap(\n containerRef: RefObject<HTMLElement | null>,\n isActive: boolean,\n restoreFocusOnDeactivate?: HTMLElement | null\n) {\n useEffect(() => {\n if (!isActive || !containerRef.current) {return;}\n\n const container = containerRef.current;\n const root = container.getRootNode() as unknown as DocumentOrShadowRoot;\n const previouslyFocused = deepActiveElement(root);\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n const selector = [\n 'button:not([disabled])',\n '[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ');\n\n return Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n };\n\n // Move focus inside on activation. Honour an explicit [data-autofocus]\n // target (e.g. a confirm/cancel button) and otherwise fall back to the\n // first focusable. Captured previouslyFocused above first, so focus can be\n // restored to the trigger on deactivate.\n const focusableElements = getFocusableElements();\n const initialTarget =\n container.querySelector<HTMLElement>('[data-autofocus]') ??\n focusableElements[0];\n initialTarget?.focus();\n\n // Handle Tab key to cycle focus\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') {return;}\n\n const focusableElements = getFocusableElements();\n if (focusableElements.length === 0) {return;}\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n const active = deepActiveElement(root);\n\n if (e.shiftKey) {\n // Shift+Tab: cycle backwards\n if (active === firstElement) {\n e.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab: cycle forwards\n if (active === lastElement) {\n e.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleTabKey);\n\n // Cleanup and restore focus\n return () => {\n container.removeEventListener('keydown', handleTabKey);\n\n // Restore focus to previously focused element or custom element\n if (restoreFocusOnDeactivate) {\n restoreFocusOnDeactivate.focus();\n } else if (previouslyFocused) {\n previouslyFocused.focus();\n }\n };\n }, [containerRef, isActive, restoreFocusOnDeactivate]);\n}\n","import { useEffect } from 'react';\n\n/**\n * Hook to prevent background page scroll while a modal/overlay is open.\n *\n * Locks `document.body` overflow and compensates for the removed scrollbar so\n * the page behind the modal doesn't shift sideways. A module-level reference\n * count keeps the lock stable when several modals overlap (only the first lock\n * stores/applies styles; only the last release restores them) — closing one\n * dialog while another is still open never unlocks prematurely.\n *\n * @param isOpen - Whether the modal is currently open\n *\n * @example\n * useModalLock(isOpen)\n */\n\n// Shared across all hook instances so overlapping locks ref-count correctly.\nlet lockCount = 0;\nlet restorePreviousStyles: (() => void) | null = null;\n\nfunction applyBodyLock(): void {\n const body = document.body;\n const previousOverflow = body.style.overflow;\n const previousPaddingRight = body.style.paddingRight;\n\n // The scrollbar disappears once overflow is hidden; pad by its width so the\n // layout stays put. Zero when the page has no vertical scrollbar.\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n const currentPadding =\n parseFloat(window.getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${currentPadding + scrollbarWidth}px`;\n }\n\n restorePreviousStyles = () => {\n body.style.overflow = previousOverflow;\n body.style.paddingRight = previousPaddingRight;\n };\n}\n\nexport function useModalLock(isOpen: boolean) {\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n if (lockCount === 0) {\n applyBodyLock();\n }\n lockCount += 1;\n\n return () => {\n lockCount -= 1;\n if (lockCount === 0 && restorePreviousStyles) {\n restorePreviousStyles();\n restorePreviousStyles = null;\n }\n };\n }, [isOpen]);\n}\n","/**\n * InlineDialog — portal-free dialog components for Shadow DOM environments.\n *\n * Headless UI Dialog forcibly portals to document.body, escaping Shadow DOM\n * and losing all scoped styles. These components render inline so they stay\n * inside the shadow root and inherit its CSS.\n *\n * API mirrors Headless UI Dialog for minimal migration effort.\n */\n\nimport {\n createContext,\n useEffect,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { useModalLock } from '../hooks/useModalLock';\n\n// ---------------------------------------------------------------------------\n// Context — passes onClose from InlineDialog to descendants\n// ---------------------------------------------------------------------------\n\nconst DialogContext = createContext<(() => void) | null>(null);\n\n// ---------------------------------------------------------------------------\n// InlineDialog\n// ---------------------------------------------------------------------------\n\ninterface InlineDialogProps {\n open: boolean\n onClose: () => void\n className?: string\n children: ReactNode\n}\n\nexport function InlineDialog({ open, onClose, className, children }: InlineDialogProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Lock background scroll + trap/restore focus. useFocusTrap resolves the\n // focused element across the shadow boundary (document.activeElement collapses\n // to the host here), so the trap actually holds inside BiChat's shadow DOM.\n useModalLock(open);\n useFocusTrap(containerRef, open);\n\n // Escape closes the dialog. Listening on the container keeps it scoped to this\n // dialog (focus is trapped inside) and avoids global key collisions.\n useEffect(() => {\n if (!open) {\n return;\n }\n const container = containerRef.current;\n if (!container) {\n return;\n }\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n container.addEventListener('keydown', handler as EventListener);\n return () => container.removeEventListener('keydown', handler as EventListener);\n }, [open, onClose]);\n\n if (!open) {\n return null;\n }\n\n return (\n <DialogContext.Provider value={onClose}>\n {/* onClick closes dialog when clicking outside the Panel (Panel stops propagation) */}\n <div\n ref={containerRef}\n className={className}\n onClick={onClose}\n tabIndex={-1}\n >\n {children}\n </div>\n </DialogContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// InlineDialogBackdrop — purely visual overlay\n// ---------------------------------------------------------------------------\n\nexport function InlineDialogBackdrop(props: HTMLAttributes<HTMLDivElement>) {\n return <div aria-hidden=\"true\" {...props} />;\n}\n\n// ---------------------------------------------------------------------------\n// InlineDialogPanel — auto-focus + stops click propagation\n// ---------------------------------------------------------------------------\n\nexport function InlineDialogPanel({\n children,\n onClick,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n // Initial focus (including [data-autofocus]) is owned by InlineDialog's\n // useFocusTrap, so the panel no longer self-focuses — that previously stole\n // focus before the trap could record the trigger to restore to on close.\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={(e) => {\n e.stopPropagation();\n onClick?.(e);\n }}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// InlineDialogTitle / InlineDialogDescription — semantic wrappers\n// ---------------------------------------------------------------------------\n\nexport function InlineDialogTitle(props: HTMLAttributes<HTMLHeadingElement>) {\n return <h2 {...props} />;\n}\n\nexport function InlineDialogDescription(props: HTMLAttributes<HTMLParagraphElement>) {\n return <p {...props} />;\n}\n","/**\n * ImageModal Component\n * Full-screen image viewer with gallery navigation, zoom, and pan.\n * Uses the shadow-DOM-safe InlineDialog (NOT Headless UI Dialog, which portals\n * to document.body, escapes the shadow root, and loses all scoped Tailwind).\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { InlineDialog, InlineDialogBackdrop, InlineDialogPanel } from './InlineDialog';\nimport {\n X,\n CaretLeft,\n CaretRight,\n ArrowClockwise,\n ArrowCounterClockwise,\n ImageBroken,\n MagnifyingGlassPlus,\n MagnifyingGlassMinus,\n ArrowsIn,\n} from '@phosphor-icons/react';\nimport type { ImageAttachment } from '../types';\nimport { createDataUrl, formatFileSize } from '../utils/fileUtils';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ImageModalProps {\n isOpen: boolean\n onClose: () => void\n attachment: ImageAttachment\n allAttachments?: ImageAttachment[]\n currentIndex?: number\n onNavigate?: (direction: 'prev' | 'next') => void\n}\n\nfunction ToolbarButton({\n onClick,\n disabled,\n 'aria-label': ariaLabel,\n children,\n}: {\n onClick: () => void\n disabled?: boolean\n 'aria-label': string\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"cursor-pointer flex items-center justify-center w-8 h-8 rounded-full text-white/70 hover:text-white hover:bg-white/10 transition-colors disabled:text-white/20 disabled:cursor-not-allowed disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\"\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n}\n\ninterface ViewerToolbarProps {\n scale: number\n zoomPercent: number\n isTransformed: boolean\n onZoomIn: () => void\n onZoomOut: () => void\n onRotateLeft: () => void\n onRotateRight: () => void\n onReset: () => void\n t: (key: string) => string\n}\n\nfunction ViewerToolbar({\n scale,\n zoomPercent,\n isTransformed,\n onZoomIn,\n onZoomOut,\n onRotateLeft,\n onRotateRight,\n onReset,\n t,\n}: ViewerToolbarProps) {\n return (\n <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 z-20 flex items-center gap-0.5 bg-black/50 backdrop-blur-xl rounded-full px-1.5 py-1.5 border border-white/10 shadow-2xl\">\n <ToolbarButton onClick={onZoomOut} disabled={scale <= MIN_SCALE} aria-label={t('BiChat.Image.ZoomOut')}>\n <MagnifyingGlassMinus size={16} weight=\"bold\" />\n </ToolbarButton>\n\n <span className=\"text-xs text-white/60 tabular-nums font-medium min-w-[3.5rem] text-center select-none\">\n {zoomPercent}%\n </span>\n\n <ToolbarButton onClick={onZoomIn} disabled={scale >= MAX_SCALE} aria-label={t('BiChat.Image.ZoomIn')}>\n <MagnifyingGlassPlus size={16} weight=\"bold\" />\n </ToolbarButton>\n\n <div className=\"w-px h-4 bg-white/15 mx-1\" />\n\n <ToolbarButton onClick={onRotateLeft} aria-label={t('BiChat.Image.RotateLeft')}>\n <ArrowCounterClockwise size={16} weight=\"bold\" />\n </ToolbarButton>\n\n <ToolbarButton onClick={onRotateRight} aria-label={t('BiChat.Image.RotateRight')}>\n <ArrowClockwise size={16} weight=\"bold\" />\n </ToolbarButton>\n\n {isTransformed && (\n <>\n <div className=\"w-px h-4 bg-white/15 mx-1\" />\n <ToolbarButton onClick={onReset} aria-label={t('BiChat.Image.ResetZoom')}>\n <ArrowsIn size={16} weight=\"bold\" />\n </ToolbarButton>\n </>\n )}\n </div>\n );\n}\n\nconst MIN_SCALE = 0.25;\nconst MAX_SCALE = 5;\nconst ZOOM_STEP = 0.25;\n\nfunction ImageModal({\n isOpen,\n onClose,\n attachment,\n allAttachments,\n currentIndex = 0,\n onNavigate,\n}: ImageModalProps) {\n const { t } = useTranslation();\n const [isImageLoaded, setIsImageLoaded] = useState(false);\n const [imageError, setImageError] = useState(false);\n const [retryKey, setRetryKey] = useState(0);\n\n // Zoom, pan & rotation state\n const [scale, setScale] = useState(1);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [rotation, setRotation] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const positionRef = useRef({ x: 0, y: 0 });\n const scaleRef = useRef(1);\n const imageAreaRef = useRef<HTMLDivElement>(null);\n\n const hasMultipleImages = allAttachments && allAttachments.length > 1;\n const canNavigatePrev = hasMultipleImages && currentIndex > 0;\n const canNavigateNext =\n hasMultipleImages && currentIndex < (allAttachments?.length || 1) - 1;\n const isZoomed = scale > 1;\n const isTransformed = isZoomed || rotation !== 0;\n\n // Keep refs in sync for event handlers\n useEffect(() => { scaleRef.current = scale; }, [scale]);\n useEffect(() => { positionRef.current = position; }, [position]);\n\n const rotateLeft = useCallback(() => {\n setRotation((r) => ((r - 90) % 360 + 360) % 360);\n }, []);\n const rotateRight = useCallback(() => {\n setRotation((r) => (r + 90) % 360);\n }, []);\n\n // Keyboard navigation + zoom shortcuts\n useEffect(() => {\n if (!isOpen) {return;}\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft' && onNavigate && canNavigatePrev) {\n onNavigate('prev');\n } else if (e.key === 'ArrowRight' && onNavigate && canNavigateNext) {\n onNavigate('next');\n } else if (e.key === '+' || e.key === '=') {\n setScale(s => Math.min(s + ZOOM_STEP, MAX_SCALE));\n } else if (e.key === '-') {\n setScale(s => Math.max(s - ZOOM_STEP, MIN_SCALE));\n if (scaleRef.current - ZOOM_STEP <= 1) {setPosition({ x: 0, y: 0 });}\n } else if (e.key === '0') {\n setScale(1);\n setPosition({ x: 0, y: 0 });\n setRotation(0);\n } else if (e.key === 'r' && !e.shiftKey) {\n rotateRight();\n } else if (e.key === 'R' || (e.key === 'r' && e.shiftKey)) {\n rotateLeft();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onNavigate, canNavigatePrev, canNavigateNext, rotateLeft, rotateRight]);\n\n // Reset state on attachment change\n useEffect(() => {\n setIsImageLoaded(false);\n setImageError(false);\n setScale(1);\n setPosition({ x: 0, y: 0 });\n setRotation(0);\n }, [attachment]);\n\n // Mouse wheel zoom (needs native listener for preventDefault on passive)\n useEffect(() => {\n const el = imageAreaRef.current;\n if (!el || !isOpen) {return;}\n\n const handler = (e: WheelEvent) => {\n const delta = e.deltaY > 0 ? -ZOOM_STEP : ZOOM_STEP;\n const current = scaleRef.current;\n const newScale = Math.min(Math.max(current + delta, MIN_SCALE), MAX_SCALE);\n if (newScale === current) {return;}\n e.preventDefault();\n setScale(newScale);\n if (newScale <= 1) {setPosition({ x: 0, y: 0 });}\n };\n\n el.addEventListener('wheel', handler, { passive: false });\n return () => el.removeEventListener('wheel', handler);\n }, [isOpen]);\n\n const handleRetry = useCallback(() => {\n setImageError(false);\n setIsImageLoaded(false);\n setRetryKey((k) => k + 1);\n }, []);\n\n // Zoom controls\n const zoomIn = useCallback(() => {\n setScale(s => Math.min(s + ZOOM_STEP, MAX_SCALE));\n }, []);\n\n const zoomOut = useCallback(() => {\n setScale(s => Math.max(s - ZOOM_STEP, MIN_SCALE));\n if (scaleRef.current - ZOOM_STEP <= 1) {setPosition({ x: 0, y: 0 });}\n }, []);\n\n const resetZoom = useCallback(() => {\n setScale(1);\n setPosition({ x: 0, y: 0 });\n setRotation(0);\n }, []);\n\n // Double-click to toggle between fit and 2x zoom (reset rotation when returning to 1x for consistency with resetZoom and '0' key)\n const handleDoubleClick = useCallback(() => {\n const current = scaleRef.current;\n if (current !== 1) {\n setScale(1);\n setPosition({ x: 0, y: 0 });\n setRotation(0);\n } else {\n setScale(2);\n }\n }, []);\n\n // Drag to pan (when zoomed)\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (scaleRef.current <= 1) {return;}\n e.preventDefault();\n setIsDragging(true);\n dragStartRef.current = {\n x: e.clientX - positionRef.current.x,\n y: e.clientY - positionRef.current.y,\n };\n }, []);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDragging) {return;}\n setPosition({\n x: e.clientX - dragStartRef.current.x,\n y: e.clientY - dragStartRef.current.y,\n });\n }, [isDragging]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // Click background to close (only when not zoomed; rotation alone does not block close)\n const handleBackdropClick = useCallback((e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isZoomed) {\n onClose();\n }\n }, [isZoomed, onClose]);\n\n const previewUrl =\n attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType);\n\n const zoomPercent = Math.round(scale * 100);\n\n return (\n <InlineDialog open={isOpen} onClose={onClose} className=\"relative z-[99999]\">\n <InlineDialogBackdrop\n className=\"fixed inset-0 bg-black/90 backdrop-blur-sm\"\n style={{ zIndex: 99999 }}\n />\n\n <InlineDialogPanel\n className=\"fixed inset-0 flex flex-col\"\n style={{ zIndex: 100000 }}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n {/* ── Header ── */}\n <div className=\"flex items-center px-5 py-3 shrink-0\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {hasMultipleImages && (\n <span className=\"text-xs text-white/50 tabular-nums whitespace-nowrap font-medium\">\n {currentIndex + 1} / {allAttachments?.length}\n </span>\n )}\n <span className=\"text-sm text-white/90 truncate font-medium\">{attachment.filename}</span>\n <span className=\"text-xs text-white/40 whitespace-nowrap\">\n {formatFileSize(attachment.sizeBytes)}\n </span>\n </div>\n </div>\n\n {/* ── Image area ── */}\n <div\n ref={imageAreaRef}\n className=\"relative flex-1 flex items-center justify-center min-h-0 px-4 pb-4\"\n onClick={handleBackdropClick}\n style={{ cursor: isZoomed ? (isDragging ? 'grabbing' : 'grab') : 'default' }}\n >\n {/* ── Floating close button ── */}\n <button\n onClick={onClose}\n className=\"absolute top-3 right-5 z-30 cursor-pointer flex items-center justify-center w-10 h-10 rounded-full bg-black/50 hover:bg-black/70 backdrop-blur-md text-white/80 hover:text-white border border-white/10 transition-all duration-200 shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\"\n aria-label={t('BiChat.Image.Close')}\n type=\"button\"\n >\n <X size={20} weight=\"bold\" />\n </button>\n\n {/* Loading spinner */}\n {!isImageLoaded && !imageError && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-8 h-8 border-2 border-white/20 border-t-white/60 rounded-full animate-spin\" />\n <span className=\"text-xs text-white/40\">{t('BiChat.Loading')}</span>\n </div>\n </div>\n )}\n\n {/* Error state */}\n {imageError && (\n <div role=\"alert\" className=\"flex flex-col items-center justify-center text-center max-w-xs\">\n <div className=\"flex items-center justify-center w-16 h-16 rounded-2xl bg-white/5 border border-white/10 mb-5\">\n <ImageBroken size={28} className=\"text-white/30\" weight=\"duotone\" />\n </div>\n <p className=\"text-sm font-medium text-white/70 mb-1\">{t('BiChat.Image.FailedToLoad')}</p>\n <p className=\"text-xs text-white/30 mb-5 truncate max-w-full\">{attachment.filename}</p>\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"cursor-pointer inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white/80 bg-white/10 hover:bg-white/15 border border-white/10 rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\"\n aria-label={t('BiChat.Image.Retry')}\n >\n <ArrowClockwise size={16} weight=\"bold\" />\n {t('BiChat.Retry.Label')}\n </button>\n </div>\n )}\n\n {/* Image */}\n <img\n key={retryKey}\n src={previewUrl}\n alt={attachment.filename}\n className={[\n 'relative z-0 max-w-[85vw] max-h-[calc(100vh-160px)] object-contain select-none rounded-lg',\n 'transition-opacity duration-300 ease-out',\n isImageLoaded ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n style={{\n transform: `translate(${position.x}px, ${position.y}px) scale(${scale}) rotate(${rotation}deg)`,\n transformOrigin: 'center center',\n transition: isDragging\n ? 'opacity 0.3s ease-out'\n : 'transform 0.2s ease-out, opacity 0.3s ease-out',\n }}\n onLoad={() => setIsImageLoaded(true)}\n onError={() => setImageError(true)}\n onMouseDown={handleMouseDown}\n onDoubleClick={handleDoubleClick}\n loading=\"lazy\"\n draggable={false}\n />\n\n {/* ── Navigation arrows ── */}\n {hasMultipleImages && (\n <>\n <button\n onClick={() => onNavigate?.('prev')}\n disabled={!canNavigatePrev || !isImageLoaded || imageError}\n className={[\n 'absolute left-4 top-1/2 -translate-y-1/2 z-20',\n 'flex items-center justify-center w-11 h-11 rounded-full',\n 'transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30',\n canNavigatePrev && isImageLoaded && !imageError\n ? 'cursor-pointer bg-black/40 hover:bg-black/60 backdrop-blur-md text-white/80 hover:text-white shadow-lg border border-white/10'\n : 'bg-black/20 text-white/20 cursor-not-allowed',\n ].join(' ')}\n aria-label={t('BiChat.Image.Previous')}\n type=\"button\"\n >\n <CaretLeft size={20} weight=\"bold\" />\n </button>\n\n <button\n onClick={() => onNavigate?.('next')}\n disabled={!canNavigateNext || !isImageLoaded || imageError}\n className={[\n 'absolute right-4 top-1/2 -translate-y-1/2 z-20',\n 'flex items-center justify-center w-11 h-11 rounded-full',\n 'transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30',\n canNavigateNext && isImageLoaded && !imageError\n ? 'cursor-pointer bg-black/40 hover:bg-black/60 backdrop-blur-md text-white/80 hover:text-white shadow-lg border border-white/10'\n : 'bg-black/20 text-white/20 cursor-not-allowed',\n ].join(' ')}\n aria-label={t('BiChat.Image.Next')}\n type=\"button\"\n >\n <CaretRight size={20} weight=\"bold\" />\n </button>\n </>\n )}\n\n {/* ── Zoom toolbar ── */}\n {isImageLoaded && !imageError && (\n <ViewerToolbar\n scale={scale}\n zoomPercent={zoomPercent}\n isTransformed={isTransformed}\n onZoomIn={zoomIn}\n onZoomOut={zoomOut}\n onRotateLeft={rotateLeft}\n onRotateRight={rotateRight}\n onReset={resetZoom}\n t={t}\n />\n )}\n </div>\n </InlineDialogPanel>\n </InlineDialog>\n );\n}\n\nexport { ImageModal };\nexport default ImageModal;\n","/**\n * UserMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for user messages\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo, type ReactNode } from 'react';\nimport { Check, Copy, PencilSimple } from '@phosphor-icons/react';\nimport { formatRelativeTime } from '../utils/dateFormatting';\nimport AttachmentGrid from './AttachmentGrid';\nimport ImageModal from './ImageModal';\nimport type { Attachment, ImageAttachment, UserTurn } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot Props Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UserMessageAvatarSlotProps {\n /** Default initials */\n initials: string\n}\n\nexport interface UserMessageContentSlotProps {\n /** Message content text */\n content: string\n}\n\nexport interface UserMessageAttachmentsSlotProps {\n /** Message attachments */\n attachments: Attachment[]\n /** Handler to open image viewer */\n onView: (index: number) => void\n}\n\nexport interface UserMessageActionsSlotProps {\n /** Copy content to clipboard */\n onCopy: () => void\n /** Edit message (if available) */\n onEdit?: () => void\n /** Formatted timestamp */\n timestamp: string\n /** Whether copy action is available */\n canCopy: boolean\n /** Whether edit action is available */\n canEdit: boolean\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UserMessageSlots {\n /** Custom avatar renderer */\n avatar?: ReactNode | ((props: UserMessageAvatarSlotProps) => ReactNode)\n /** Custom content renderer */\n content?: ReactNode | ((props: UserMessageContentSlotProps) => ReactNode)\n /** Custom attachments renderer */\n attachments?: ReactNode | ((props: UserMessageAttachmentsSlotProps) => ReactNode)\n /** Custom actions renderer */\n actions?: ReactNode | ((props: UserMessageActionsSlotProps) => ReactNode)\n}\n\nexport interface UserMessageClassNames {\n /** Root container */\n root?: string\n /** Inner content wrapper */\n wrapper?: string\n /** Avatar container */\n avatar?: string\n /** Message bubble */\n bubble?: string\n /** Content text */\n content?: string\n /** Attachments container */\n attachments?: string\n /** Actions container */\n actions?: string\n /** Action button */\n actionButton?: string\n /** Timestamp */\n timestamp?: string\n}\n\nexport interface UserMessageProps {\n /** User turn data */\n turn: UserTurn\n /** Turn ID for edit operations */\n turnId?: string\n /** User initials for avatar */\n initials?: string\n /** Optional sender name for shared/group chats */\n authorName?: string\n /** Slot overrides */\n slots?: UserMessageSlots\n /** Class name overrides */\n classNames?: UserMessageClassNames\n /** Copy handler */\n onCopy?: (content: string) => Promise<void> | void\n /** Edit handler */\n onEdit?: (turnId: string, newContent: string) => void\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n /** Whether edit action should be available */\n allowEdit?: boolean\n}\n\nconst COPY_FEEDBACK_MS = 2000;\n\n/* -------------------------------------------------------------------------------------------------\n * Default Styles\n * -----------------------------------------------------------------------------------------------*/\n\nconst defaultClassNames: Required<UserMessageClassNames> = {\n root: 'flex gap-3 justify-end group',\n wrapper: 'flex-1 min-w-0 flex flex-col items-end max-w-[var(--bichat-bubble-max-width)]',\n avatar: 'flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-sm',\n bubble: 'bg-primary-600 text-white rounded-2xl rounded-br-sm px-4 py-3 shadow-sm',\n content: 'text-sm whitespace-pre-wrap break-words leading-relaxed',\n attachments: 'mb-2 w-full',\n actions: 'flex items-center gap-1 mt-2',\n actionButton: 'cursor-pointer p-2 min-h-[44px] min-w-[44px] flex items-center justify-center text-gray-500 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 rounded-md transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n timestamp: 'text-xs text-gray-400 dark:text-gray-500 mr-1',\n};\n\nfunction mergeClassNames(\n defaults: Required<UserMessageClassNames>,\n overrides?: UserMessageClassNames\n): Required<UserMessageClassNames> {\n if (!overrides) {return defaults;}\n return {\n root: overrides.root ?? defaults.root,\n wrapper: overrides.wrapper ?? defaults.wrapper,\n avatar: overrides.avatar ?? defaults.avatar,\n bubble: overrides.bubble ?? defaults.bubble,\n content: overrides.content ?? defaults.content,\n attachments: overrides.attachments ?? defaults.attachments,\n actions: overrides.actions ?? defaults.actions,\n actionButton: overrides.actionButton ?? defaults.actionButton,\n timestamp: overrides.timestamp ?? defaults.timestamp,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * EditForm Sub-component\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditFormProps {\n draftContent: string\n onDraftChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void\n onSave: () => void\n onCancel: () => void\n onKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void\n textareaRef: React.Ref<HTMLTextAreaElement>\n disabled: boolean\n originalContent: string\n t: (key: string) => string\n}\n\nfunction EditForm({ draftContent, onDraftChange, onSave, onCancel, onKeyDown, textareaRef, disabled, originalContent, t }: EditFormProps) {\n return (\n <div className=\"space-y-3\">\n <textarea\n ref={textareaRef}\n value={draftContent}\n onChange={onDraftChange}\n onKeyDown={onKeyDown}\n className=\"w-full min-h-[60px] max-h-[300px] resize-none rounded-xl border border-white/20 bg-white/[0.08] px-3.5 py-2.5 text-sm text-white leading-relaxed outline-none focus:bg-white/[0.12] focus:border-white/30 focus:ring-1 focus:ring-white/20 transition-all duration-200\"\n aria-label={t('BiChat.Message.EditMessage')}\n rows={1}\n />\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-[11px] text-white/30 select-none hidden sm:inline\">\n Esc · {typeof navigator !== 'undefined' && /mac|iphone|ipad/i.test(\n (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform\n ?? navigator?.platform\n ?? ''\n ) ? '⌘' : 'Ctrl'}+Enter\n </span>\n <div className=\"flex items-center gap-2 ml-auto\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"cursor-pointer px-3 py-1.5 rounded-lg text-white/60 hover:text-white hover:bg-white/10 transition-colors text-sm\"\n >\n {t('BiChat.Message.Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={onSave}\n className=\"cursor-pointer px-4 py-1.5 rounded-lg bg-white text-primary-700 font-medium text-sm hover:bg-white/90 transition-all shadow-sm disabled:opacity-40 disabled:cursor-not-allowed disabled:shadow-none\"\n disabled={disabled || !draftContent.trim() || draftContent === originalContent}\n >\n {t('BiChat.Message.Save')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * -----------------------------------------------------------------------------------------------*/\n\nexport function UserMessage({\n turn,\n turnId,\n initials = 'U',\n authorName,\n slots,\n classNames: classNameOverrides,\n onCopy,\n onEdit,\n hideAvatar = false,\n hideActions = false,\n hideTimestamp = false,\n allowEdit = true,\n}: UserMessageProps) {\n const { t } = useTranslation();\n const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [draftContent, setDraftContent] = useState('');\n const [isCopied, setIsCopied] = useState(false);\n const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const editTextareaRef = useRef<HTMLTextAreaElement>(null);\n const bubbleRef = useRef<HTMLDivElement>(null);\n const classes = mergeClassNames(defaultClassNames, classNameOverrides);\n\n useEffect(() => {\n return () => {\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current);\n copyFeedbackTimeoutRef.current = null;\n }\n };\n }, []);\n\n // Reset edit state when the turn changes\n useEffect(() => {\n setIsEditing(false);\n setDraftContent('');\n }, [turnId]);\n\n // Auto-focus textarea when entering edit mode\n useEffect(() => {\n if (isEditing && editTextareaRef.current) {\n const textarea = editTextareaRef.current;\n textarea.focus();\n textarea.selectionStart = textarea.value.length;\n textarea.selectionEnd = textarea.value.length;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 300)}px`;\n }\n }, [isEditing]);\n\n // Click-outside to cancel edit\n useEffect(() => {\n if (!isEditing) {return;}\n\n const handleMouseDown = (e: MouseEvent) => {\n if (bubbleRef.current && !bubbleRef.current.contains(e.target as Node)) {\n setIsEditing(false);\n setDraftContent('');\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [isEditing]);\n\n const normalizedAttachments: Attachment[] = useMemo(\n () =>\n turn.attachments.map((attachment) => {\n if (!attachment.mimeType.startsWith('image/')) {\n return attachment;\n }\n\n if (attachment.preview) {\n return attachment;\n }\n if (attachment.base64Data) {\n if (attachment.base64Data.startsWith('data:')) {\n return {\n ...attachment,\n preview: attachment.base64Data,\n };\n }\n return {\n ...attachment,\n preview: `data:${attachment.mimeType};base64,${attachment.base64Data}`,\n };\n }\n if (attachment.url) {\n return {\n ...attachment,\n preview: attachment.url,\n };\n }\n return attachment;\n }),\n [turn.attachments],\n );\n\n const { imageAttachments, imageIndexByAttachmentIndex } = useMemo(() => {\n const images: ImageAttachment[] = [];\n const indexMap = new Map<number, number>();\n normalizedAttachments.forEach((attachment, index) => {\n if (!attachment.mimeType.startsWith('image/')) {\n return;\n }\n if (!attachment.preview && !attachment.url) {\n return;\n }\n indexMap.set(index, images.length);\n images.push({\n ...attachment,\n base64Data: attachment.base64Data || '',\n preview: attachment.preview || attachment.url || '',\n });\n });\n return { imageAttachments: images, imageIndexByAttachmentIndex: indexMap };\n }, [normalizedAttachments]);\n\n const handleCopyClick = useCallback(async () => {\n try {\n if (onCopy) {\n await onCopy(turn.content);\n } else {\n await navigator.clipboard.writeText(turn.content);\n }\n\n setIsCopied(true);\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current);\n }\n copyFeedbackTimeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n copyFeedbackTimeoutRef.current = null;\n }, COPY_FEEDBACK_MS);\n } catch (err) {\n setIsCopied(false);\n console.error('Failed to copy:', err);\n }\n }, [onCopy, turn.content]);\n\n const handleEditClick = useCallback(() => {\n if (onEdit && turnId) {\n setDraftContent(turn.content);\n setIsEditing(true);\n }\n }, [onEdit, turnId, turn.content]);\n\n const handleEditCancel = useCallback(() => {\n setIsEditing(false);\n setDraftContent('');\n }, []);\n\n const handleEditSave = useCallback(() => {\n if (!onEdit || !turnId) {return;}\n const newContent = draftContent;\n if (!newContent.trim()) {return;}\n if (newContent === turn.content) {\n setIsEditing(false);\n return;\n }\n onEdit(turnId, newContent);\n setIsEditing(false);\n }, [onEdit, turnId, draftContent, turn.content]);\n\n const handleEditKeyDown = useCallback((e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n handleEditCancel();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleEditSave();\n }\n }, [handleEditCancel, handleEditSave]);\n\n const handleDraftChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setDraftContent(e.target.value);\n const el = e.target;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, 300)}px`;\n }, []);\n\n const handleNavigate = useCallback(\n (direction: 'prev' | 'next') => {\n if (selectedImageIndex === null) {return;}\n\n if (direction === 'prev' && selectedImageIndex > 0) {\n setSelectedImageIndex(selectedImageIndex - 1);\n } else if (direction === 'next' && selectedImageIndex < imageAttachments.length - 1) {\n setSelectedImageIndex(selectedImageIndex + 1);\n }\n },\n [selectedImageIndex, imageAttachments.length]\n );\n\n const currentAttachment =\n selectedImageIndex !== null ? imageAttachments[selectedImageIndex] : null;\n\n const timestamp = formatRelativeTime(turn.createdAt, t);\n\n // Slot props\n const avatarSlotProps: UserMessageAvatarSlotProps = { initials };\n const contentSlotProps: UserMessageContentSlotProps = { content: turn.content };\n const attachmentsSlotProps: UserMessageAttachmentsSlotProps = {\n attachments: normalizedAttachments,\n onView: (index) => {\n const imageIndex = imageIndexByAttachmentIndex.get(index);\n if (imageIndex === undefined) {\n return;\n }\n setSelectedImageIndex(imageIndex);\n },\n };\n const actionsSlotProps: UserMessageActionsSlotProps = {\n onCopy: handleCopyClick,\n onEdit: onEdit && turnId && allowEdit ? handleEditClick : undefined,\n timestamp,\n canCopy: true,\n canEdit: !!onEdit && !!turnId && allowEdit,\n };\n\n // Render helpers\n const renderSlot = <T,>(\n slot: ReactNode | ((props: T) => ReactNode) | undefined,\n props: T,\n defaultContent: ReactNode\n ): ReactNode => {\n if (slot === undefined) {return defaultContent;}\n if (typeof slot === 'function') {return slot(props);}\n return slot;\n };\n\n return (\n <div className={classes.root}>\n <div className={classes.wrapper}>\n {authorName && (\n <span\n id={`${turn.id}-author`}\n role=\"note\"\n aria-label={authorName}\n className=\"mb-1 px-1 text-[11px] text-right text-gray-500 dark:text-gray-400\"\n >\n {authorName}\n </span>\n )}\n {/* Attachments */}\n {normalizedAttachments.length > 0 && (\n <div className={classes.attachments}>\n {renderSlot(\n slots?.attachments,\n attachmentsSlotProps,\n <AttachmentGrid\n attachments={normalizedAttachments}\n onView={attachmentsSlotProps.onView}\n />\n )}\n </div>\n )}\n\n {/* Message bubble */}\n {turn.content && (\n <div\n ref={bubbleRef}\n className={classes.bubble}\n aria-describedby={authorName ? `${turn.id}-author` : undefined}\n >\n <div className={classes.content}>\n {isEditing ? (\n <EditForm\n draftContent={draftContent}\n onDraftChange={handleDraftChange}\n onSave={handleEditSave}\n onCancel={handleEditCancel}\n onKeyDown={handleEditKeyDown}\n textareaRef={editTextareaRef}\n disabled={false}\n originalContent={turn.content}\n t={t}\n />\n ) : (\n renderSlot(slots?.content, contentSlotProps, turn.content)\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n {!hideActions && (\n <div className={`${classes.actions} ${isCopied ? 'opacity-100' : ''}`}>\n {renderSlot(\n slots?.actions,\n actionsSlotProps,\n <>\n {!hideTimestamp && <span className={classes.timestamp}>{timestamp}</span>}\n\n <button\n onClick={handleCopyClick}\n className={`cursor-pointer ${classes.actionButton} ${isCopied ? 'text-green-600 dark:text-green-400' : ''}`}\n aria-label={t('BiChat.Message.CopyMessage')}\n title={isCopied ? t('BiChat.Message.Copied') : t('BiChat.Message.Copy')}\n data-copied={isCopied ? 'true' : undefined}\n >\n {isCopied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} weight=\"regular\" />}\n </button>\n\n {onEdit && turnId && allowEdit && (\n <button\n onClick={handleEditClick}\n className={`cursor-pointer ${classes.actionButton}`}\n aria-label={t('BiChat.Message.EditMessage')}\n title={t('BiChat.Message.EditMessage')}\n disabled={isEditing}\n >\n <PencilSimple size={14} weight=\"regular\" />\n </button>\n )}\n </>\n )}\n </div>\n )}\n </div>\n\n {/* Avatar */}\n {!hideAvatar && (\n <div className={classes.avatar}>\n {renderSlot(slots?.avatar, avatarSlotProps, initials)}\n </div>\n )}\n\n {/* Image modal */}\n {currentAttachment && (\n <ImageModal\n isOpen={selectedImageIndex !== null}\n onClose={() => setSelectedImageIndex(null)}\n attachment={currentAttachment}\n allAttachments={imageAttachments}\n currentIndex={selectedImageIndex ?? 0}\n onNavigate={handleNavigate}\n />\n )}\n </div>\n );\n}\n\nexport default UserMessage;\n","/**\n * UserTurnView Component (Layer 4 - Backward Compatible)\n * Displays user messages with attachments, image modal, and actions\n *\n * Uses turn-based architecture - receives a ConversationTurn and displays\n * the userTurn content.\n *\n * For more customization, use the UserMessage component directly with slots.\n */\n\nimport { useChatMessaging } from '../context/ChatContext';\nimport { UserMessage, type UserMessageSlots, type UserMessageClassNames } from './UserMessage';\nimport type { ConversationTurn } from '../types';\n\nexport interface UserTurnViewProps {\n /** The conversation turn containing the user message */\n turn: ConversationTurn\n /** Slot overrides for customization */\n slots?: UserMessageSlots\n /** Class name overrides */\n classNames?: UserMessageClassNames\n /** User initials for avatar */\n initials?: string\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n /** Whether edit action should be available */\n allowEdit?: boolean\n /** Show sender identity label above the message bubble */\n showAuthorName?: boolean\n}\n\nexport function UserTurnView({\n turn,\n slots,\n classNames,\n initials,\n hideAvatar,\n hideActions,\n hideTimestamp,\n allowEdit,\n showAuthorName = false,\n}: UserTurnViewProps) {\n const { handleEdit, handleCopy } = useChatMessaging();\n const author = turn.userTurn.author;\n const fullName = [author?.firstName || '', author?.lastName || ''].join(' ').trim();\n const authorName = showAuthorName && fullName.length > 0 ? fullName : undefined;\n const resolvedInitials = initials ?? author?.initials ?? 'U';\n\n return (\n <UserMessage\n turn={turn.userTurn}\n turnId={turn.id}\n initials={resolvedInitials}\n authorName={authorName}\n slots={slots}\n classNames={classNames}\n onCopy={handleCopy}\n onEdit={handleEdit}\n hideAvatar={hideAvatar}\n hideActions={hideActions}\n hideTimestamp={hideTimestamp}\n allowEdit={allowEdit}\n />\n );\n}\n\nexport default UserTurnView;\n","/**\n * AssistantTurnView Component (Layer 4 - Backward Compatible)\n * Displays assistant messages with markdown, charts, sources, downloads, code outputs, and streaming cursor\n *\n * Uses turn-based architecture - receives a ConversationTurn and displays\n * the assistantTurn content.\n *\n * For more customization, use the AssistantMessage component directly with slots.\n */\n\nimport { useMemo } from 'react';\nimport { useChatSession, useChatMessaging } from '../context/ChatContext';\nimport { useIotaContext } from '../context/IotaContext';\nimport {\n AssistantMessage,\n type AssistantMessageSlots,\n type AssistantMessageClassNames,\n type RegenerateModelOption,\n} from './AssistantMessage';\nimport { SystemMessage } from './SystemMessage';\nimport type { ConversationTurn } from '../types';\n\nexport interface AssistantTurnViewProps {\n /** The conversation turn containing the assistant response */\n turn: ConversationTurn\n /** When true, this is the last turn in the list (Regenerate button shown only on last assistant message) */\n isLastTurn?: boolean\n /** Whether the response is currently being streamed */\n isStreaming?: boolean\n /** Slot overrides for customization */\n slots?: AssistantMessageSlots\n /** Class name overrides */\n classNames?: AssistantMessageClassNames\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n /** Whether regenerate action should be available */\n allowRegenerate?: boolean\n}\n\nexport function AssistantTurnView({\n turn,\n isLastTurn = false,\n isStreaming = false,\n slots,\n classNames,\n hideAvatar,\n hideActions,\n hideTimestamp,\n allowRegenerate = true,\n}: AssistantTurnViewProps) {\n const { debugMode } = useChatSession();\n const { handleCopy, handleRegenerate, pendingQuestion, sendMessage, loading } = useChatMessaging();\n const iotaContext = useIotaContext();\n const regenerateModels = useMemo<RegenerateModelOption[] | undefined>(() => {\n const models = iotaContext.extensions?.llm?.models;\n if (!models || models.length < 2) {return undefined;}\n return models.map((m) => ({ id: m.id, label: m.label }));\n }, [iotaContext.extensions?.llm?.models]);\n\n const assistantTurn = turn.assistantTurn;\n if (!assistantTurn) {return null;}\n\n if (assistantTurn.role === 'system') {\n return (\n <SystemMessage\n content={assistantTurn.content}\n createdAt={assistantTurn.createdAt}\n onCopy={handleCopy}\n hideActions={hideActions}\n hideTimestamp={hideTimestamp}\n />\n );\n }\n\n return (\n <AssistantMessage\n turn={assistantTurn}\n turnId={turn.id}\n isLastTurn={isLastTurn}\n isStreaming={isStreaming}\n pendingQuestion={pendingQuestion}\n slots={slots}\n classNames={classNames}\n onCopy={handleCopy}\n onRegenerate={allowRegenerate ? handleRegenerate : undefined}\n regenerateModels={allowRegenerate ? regenerateModels : undefined}\n onSendMessage={sendMessage}\n sendDisabled={loading || isStreaming}\n hideAvatar={hideAvatar}\n hideActions={hideActions}\n hideTimestamp={hideTimestamp}\n showDebug={debugMode}\n />\n );\n}\n\nexport default AssistantTurnView;\n","/**\n * CodeOutputsPanel Component\n * Displays code interpreter outputs (images, text, errors)\n *\n * Output types:\n * - image: Base64-encoded image data (content is base64 string, mimeType specifies format)\n * - text: Plain text output from code execution\n * - error: Error messages from failed code execution\n */\n\nimport { Download } from '@phosphor-icons/react';\nimport type { CodeOutput } from '../types';\nimport { formatFileSize } from '../utils/fileUtils';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface CodeOutputsPanelProps {\n outputs: CodeOutput[]\n}\n\nfunction toBase64(str: string): string {\n // btoa() only supports Latin1; this converts UTF-8 bytes to a binary string first.\n const bytes = new TextEncoder().encode(str);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction CodeOutputsPanel({ outputs }: CodeOutputsPanelProps) {\n const { t } = useTranslation();\n if (!outputs || outputs.length === 0) {return null;}\n\n return (\n <div className=\"mb-2 p-3 bg-gray-50 dark:bg-gray-900/50 rounded-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 mb-2\">\n {t('BiChat.CodeOutput.Title')}\n </div>\n <div className=\"space-y-2\">\n {outputs.map((output, index) => (\n <div key={index}>\n {output.type === 'image' && (\n <div className=\"relative group\">\n <img\n src={\n output.content.startsWith('data:')\n ? output.content\n : `data:${output.mimeType || 'image/png'};base64,${output.content}`\n }\n alt={output.filename || t('BiChat.CodeOutput.CodeOutput')}\n className=\"max-w-full rounded border border-gray-300 dark:border-gray-600\"\n />\n {/* File info overlay */}\n {output.filename && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <div className=\"flex items-center justify-between text-white text-xs\">\n <span className=\"truncate\">{output.filename}</span>\n {output.sizeBytes && (\n <span className=\"text-gray-300\">{formatFileSize(output.sizeBytes)}</span>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n {output.type === 'text' && (\n <div>\n <pre className=\"text-xs bg-white dark:bg-gray-800 p-2 rounded overflow-x-auto border border-gray-200 dark:border-gray-700\">\n <code className=\"text-gray-900 dark:text-gray-100\">{output.content}</code>\n </pre>\n {/* File download link */}\n {output.filename && (\n <div className=\"flex items-center gap-2 mt-1 text-xs\">\n <a\n href={`data:${output.mimeType || 'text/plain'};base64,${toBase64(output.content)}`}\n download={output.filename}\n className=\"flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline\"\n >\n <Download size={12} weight=\"bold\" />\n {output.filename}\n </a>\n {output.sizeBytes && (\n <span className=\"text-gray-500 dark:text-gray-400\">\n ({formatFileSize(output.sizeBytes)})\n </span>\n )}\n </div>\n )}\n </div>\n )}\n {output.type === 'error' && (\n <div className=\"text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800\">\n <div className=\"font-semibold mb-1\">{t('BiChat.Error.Label')}</div>\n <pre className=\"whitespace-pre-wrap\">{output.content}</pre>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport { CodeOutputsPanel };\nexport default CodeOutputsPanel;\n","/**\n * StreamingCursor Component\n * Animated cursor shown during AI response streaming\n */\n\nimport { useTranslation } from '../hooks/useTranslation';\n\nfunction StreamingCursor() {\n const { t } = useTranslation();\n return (\n <span\n className=\"inline-block w-1.5 h-4 ml-0.5 bg-primary-600 dark:bg-primary-500 animate-pulse\"\n aria-label={t('BiChat.Common.AITyping')}\n />\n );\n}\n\nexport { StreamingCursor };\nexport default StreamingCursor;\n","/**\n * AssistantMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for assistant messages\n */\n\nimport {\n useState,\n useCallback,\n lazy,\n Suspense,\n useRef,\n useEffect,\n type ReactNode,\n} from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\nimport {\n Check,\n Copy,\n ArrowsClockwise,\n CaretRight,\n Lightning,\n Brain,\n} from \"@phosphor-icons/react\";\nimport { formatRelativeTime } from \"../utils/dateFormatting\";\nimport CodeOutputsPanel from \"./CodeOutputsPanel\";\nimport StreamingCursor from \"./StreamingCursor\";\nimport { ChartCard } from \"./ChartCard\";\nimport { InteractiveTableCard } from \"./InteractiveTableCard\";\nimport { TabbedTableGroup } from \"./TabbedTableGroup\";\nimport { TabbedChartGroup } from \"./TabbedChartGroup\";\nimport { SourcesPanel } from \"./SourcesPanel\";\nimport { DownloadCard } from \"./DownloadCard\";\nimport { InlineQuestionForm } from \"./InlineQuestionForm\";\nimport { RetryActionArea } from \"./RetryActionArea\";\nimport type {\n AssistantTurn,\n Citation,\n ChartData,\n Artifact,\n CodeOutput,\n PendingQuestion,\n RenderTableData,\n} from \"../types\";\nimport { DebugPanel } from \"./DebugPanel\";\nimport { useTranslation } from \"../hooks/useTranslation\";\nimport { shouldRenderInlineRetry } from \"../utils/assistantTurnState\";\n\nconst MarkdownRenderer = lazy(() =>\n import(\"./MarkdownRenderer\").then((module) => ({\n default: module.MarkdownRenderer,\n })),\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Slot Props Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AssistantMessageAvatarSlotProps {\n /** Default text */\n text: string;\n}\n\nexport interface AssistantMessageContentSlotProps {\n /** Message content (markdown) */\n content: string;\n /** Citations */\n citations?: Citation[];\n /** Whether streaming is active */\n isStreaming: boolean;\n}\n\nexport interface AssistantMessageSourcesSlotProps {\n /** Citations to display */\n citations: Citation[];\n}\n\nexport interface AssistantMessageChartsSlotProps {\n /** Chart data array */\n charts: ChartData[];\n}\n\nexport interface AssistantMessageCodeOutputsSlotProps {\n /** Code execution outputs */\n outputs: CodeOutput[];\n}\n\nexport interface AssistantMessageTablesSlotProps {\n /** Interactive table payloads */\n tables: RenderTableData[];\n}\n\nexport interface AssistantMessageArtifactsSlotProps {\n /** Downloadable artifacts */\n artifacts: Artifact[];\n}\n\nexport interface AssistantMessageActionsSlotProps {\n /** Copy content to clipboard */\n onCopy: () => void;\n /** Regenerate response, optionally with a specific model id */\n onRegenerate?: (model?: string) => void;\n /** Available models that can be picked for regenerate */\n regenerateModels?: RegenerateModelOption[];\n /** Formatted timestamp */\n timestamp: string;\n /** Whether copy action is available */\n canCopy: boolean;\n /** Whether regenerate action is available */\n canRegenerate: boolean;\n}\n\nexport interface RegenerateModelOption {\n /** Model id passed to onRegenerate */\n id: string;\n /** Translation key (or label) shown in the picker */\n label: string;\n}\n\nexport interface AssistantMessageExplanationSlotProps {\n /** Explanation content (markdown) */\n explanation: string;\n /** Whether expanded */\n isExpanded: boolean;\n /** Toggle expansion */\n onToggle: () => void;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AssistantMessageSlots {\n /** Custom avatar renderer */\n avatar?: ReactNode | ((props: AssistantMessageAvatarSlotProps) => ReactNode);\n /** Custom content renderer */\n content?:\n | ReactNode\n | ((props: AssistantMessageContentSlotProps) => ReactNode);\n /** Custom sources renderer */\n sources?:\n | ReactNode\n | ((props: AssistantMessageSourcesSlotProps) => ReactNode);\n /** Custom charts renderer */\n charts?: ReactNode | ((props: AssistantMessageChartsSlotProps) => ReactNode);\n /** Custom code outputs renderer */\n codeOutputs?:\n | ReactNode\n | ((props: AssistantMessageCodeOutputsSlotProps) => ReactNode);\n /** Custom table renderer */\n tables?: ReactNode | ((props: AssistantMessageTablesSlotProps) => ReactNode);\n /** Custom artifacts renderer */\n artifacts?:\n | ReactNode\n | ((props: AssistantMessageArtifactsSlotProps) => ReactNode);\n /** Custom actions renderer */\n actions?:\n | ReactNode\n | ((props: AssistantMessageActionsSlotProps) => ReactNode);\n /** Custom explanation renderer */\n explanation?:\n | ReactNode\n | ((props: AssistantMessageExplanationSlotProps) => ReactNode);\n}\n\nexport interface AssistantMessageClassNames {\n /** Root container */\n root?: string;\n /** Inner content wrapper */\n wrapper?: string;\n /** Avatar container */\n avatar?: string;\n /** Message bubble */\n bubble?: string;\n /** Code outputs container */\n codeOutputs?: string;\n /** Charts container */\n charts?: string;\n /** Tables container */\n tables?: string;\n /** Artifacts container */\n artifacts?: string;\n /** Sources container */\n sources?: string;\n /** Explanation container */\n explanation?: string;\n /** Actions container */\n actions?: string;\n /** Action button */\n actionButton?: string;\n /** Timestamp */\n timestamp?: string;\n}\n\nexport interface AssistantMessageProps {\n /** Assistant turn data */\n turn: AssistantTurn;\n /** Turn ID for regenerate operations */\n turnId?: string;\n /** When true, this is the last turn (Regenerate button shown only on last assistant message) */\n isLastTurn?: boolean;\n /** Whether response is being streamed */\n isStreaming?: boolean;\n /** Pending question for HITL */\n pendingQuestion?: PendingQuestion | null;\n /** Slot overrides */\n slots?: AssistantMessageSlots;\n /** Class name overrides */\n classNames?: AssistantMessageClassNames;\n /** Copy handler */\n onCopy?: (content: string) => Promise<void> | void;\n /** Regenerate handler. The optional `model` argument is the id chosen from the\n * Fast/Deep picker; when omitted the current session model is used. */\n onRegenerate?: (turnId: string, model?: string) => Promise<void> | void;\n /** Models offered when the user clicks the regenerate button. When two or more\n * options are provided a Fast/Deep picker is shown; otherwise regenerate is\n * triggered immediately with the active model. */\n regenerateModels?: RegenerateModelOption[];\n /** Send message handler (for markdown links) */\n onSendMessage?: (content: string) => void;\n /** Whether sending is disabled */\n sendDisabled?: boolean;\n /** Hide avatar */\n hideAvatar?: boolean;\n /** Hide actions */\n hideActions?: boolean;\n /** Hide timestamp */\n hideTimestamp?: boolean;\n /** Show debug panel */\n showDebug?: boolean;\n}\n\ntype AssistantRenderMode =\n | \"content\"\n | \"hitl_form\"\n | \"hitl_resuming\"\n | \"hitl_waiting\"\n | \"retry\"\n | \"empty\";\n\nconst COPY_FEEDBACK_MS = 2000;\n\n/* -------------------------------------------------------------------------------------------------\n * Default Styles\n * -----------------------------------------------------------------------------------------------*/\n\nconst defaultClassNames: Required<AssistantMessageClassNames> = {\n root: \"flex min-w-0 gap-3 group\",\n wrapper:\n \"flex-1 w-full min-w-0 flex flex-col gap-3 max-w-[var(--bichat-bubble-assistant-max-width,85%)]\",\n avatar:\n \"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs\",\n bubble:\n \"bg-white dark:bg-gray-800 rounded-2xl rounded-bl-sm px-4 py-3 shadow-sm\",\n codeOutputs: \"\",\n charts: \"mb-1 w-full\",\n tables: \"mb-1 flex flex-col gap-3 min-w-0\",\n artifacts: \"mb-1 flex flex-wrap gap-2\",\n sources: \"\",\n explanation: \"mt-4 border-t border-gray-100 dark:border-gray-700 pt-4\",\n actions: \"flex items-center gap-1\",\n actionButton:\n \"cursor-pointer p-2 min-h-[44px] min-w-[44px] flex items-center justify-center text-gray-500 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 rounded-md transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\",\n timestamp: \"text-xs text-gray-400 dark:text-gray-500 mr-1\",\n};\n\nfunction mergeClassNames(\n defaults: Required<AssistantMessageClassNames>,\n overrides?: AssistantMessageClassNames,\n): Required<AssistantMessageClassNames> {\n if (!overrides) {\n return defaults;\n }\n return {\n root: overrides.root ?? defaults.root,\n wrapper: overrides.wrapper ?? defaults.wrapper,\n avatar: overrides.avatar ?? defaults.avatar,\n bubble: overrides.bubble ?? defaults.bubble,\n codeOutputs: overrides.codeOutputs ?? defaults.codeOutputs,\n charts: overrides.charts ?? defaults.charts,\n tables: overrides.tables ?? defaults.tables,\n artifacts: overrides.artifacts ?? defaults.artifacts,\n sources: overrides.sources ?? defaults.sources,\n explanation: overrides.explanation ?? defaults.explanation,\n actions: overrides.actions ?? defaults.actions,\n actionButton: overrides.actionButton ?? defaults.actionButton,\n timestamp: overrides.timestamp ?? defaults.timestamp,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * -----------------------------------------------------------------------------------------------*/\n\nexport function AssistantMessage({\n turn,\n turnId,\n isLastTurn = false,\n isStreaming = false,\n pendingQuestion,\n slots,\n classNames: classNameOverrides,\n onCopy,\n onRegenerate,\n regenerateModels,\n onSendMessage,\n sendDisabled = false,\n hideAvatar = false,\n hideActions = false,\n hideTimestamp = false,\n showDebug = false,\n}: AssistantMessageProps) {\n const { t } = useTranslation();\n const [explanationExpanded, setExplanationExpanded] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [showRegenPicker, setShowRegenPicker] = useState(false);\n const regenPickerRef = useRef<HTMLDivElement | null>(null);\n const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const classes = mergeClassNames(defaultClassNames, classNameOverrides);\n const isSystemMessage = turn.role === \"system\";\n const avatarClassName = isSystemMessage\n ? \"flex-shrink-0 w-8 h-8 rounded-full bg-gray-500 dark:bg-gray-600 flex items-center justify-center text-white font-medium text-xs\"\n : classes.avatar;\n const bubbleClassName = isSystemMessage\n ? \"bg-gray-50 dark:bg-gray-900/40 rounded-2xl px-4 py-3 shadow-sm\"\n : classes.bubble;\n\n useEffect(() => {\n return () => {\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current);\n copyFeedbackTimeoutRef.current = null;\n }\n };\n }, []);\n\n const hasContent = turn.content?.trim().length > 0;\n const hasExplanation = !!turn.explanation?.trim();\n const isAwaitingHumanInput = turn.lifecycle === \"waiting_for_human_input\";\n const pendingQuestionStatus = pendingQuestion?.status;\n const pendingQuestionMatchesTurn =\n !!pendingQuestion &&\n (pendingQuestionStatus === \"PENDING\" ||\n pendingQuestionStatus === \"ANSWER_SUBMITTED\" ||\n pendingQuestionStatus === \"REJECT_SUBMITTED\" ||\n pendingQuestionStatus === \"ANSWER_RESUME_FAILED\" ||\n pendingQuestionStatus === \"REJECT_RESUME_FAILED\") &&\n (pendingQuestion.turnId === turnId ||\n pendingQuestion.turnId === turn.id ||\n (!pendingQuestion.turnId && isLastTurn));\n const hasPendingQuestion = pendingQuestionMatchesTurn && !!pendingQuestion;\n const showQuestionForm =\n hasPendingQuestion &&\n (pendingQuestionStatus === \"PENDING\" ||\n pendingQuestionStatus === \"ANSWER_RESUME_FAILED\" ||\n pendingQuestionStatus === \"REJECT_RESUME_FAILED\");\n const showResumeState =\n hasPendingQuestion &&\n (pendingQuestionStatus === \"ANSWER_SUBMITTED\" ||\n pendingQuestionStatus === \"REJECT_SUBMITTED\");\n const hasCodeOutputs = !!turn.codeOutputs?.length;\n const hasChart = !!turn.charts?.length;\n const hasTables = !!turn.renderTables?.length;\n const hasArtifacts = !!turn.artifacts?.length;\n const hasDebug = showDebug && !!turn.debug;\n const hasAnyRenderedContent =\n hasContent ||\n hasExplanation ||\n hasCodeOutputs ||\n hasChart ||\n hasTables ||\n hasArtifacts ||\n hasDebug;\n const canRegenerate =\n !!onRegenerate && !!turnId && !isSystemMessage && isLastTurn;\n const showInlineRetry =\n shouldRenderInlineRetry(turn, canRegenerate) && !hasAnyRenderedContent;\n const renderMode: AssistantRenderMode = showQuestionForm\n ? \"hitl_form\"\n : showResumeState\n ? \"hitl_resuming\"\n : isAwaitingHumanInput\n ? \"hitl_waiting\"\n : hasAnyRenderedContent\n ? \"content\"\n : showInlineRetry\n ? \"retry\"\n : \"empty\";\n\n const handleCopyClick = useCallback(async () => {\n try {\n if (onCopy) {\n await onCopy(turn.content);\n } else {\n await navigator.clipboard.writeText(turn.content);\n }\n\n setIsCopied(true);\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current);\n }\n copyFeedbackTimeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n copyFeedbackTimeoutRef.current = null;\n }, COPY_FEEDBACK_MS);\n } catch (err) {\n setIsCopied(false);\n console.error(\"Failed to copy:\", err);\n }\n }, [onCopy, turn.content]);\n\n const hasRegenChoices = (regenerateModels?.length ?? 0) >= 2;\n\n const handleRegenerateClick = useCallback(async () => {\n if (!onRegenerate || !turnId) {\n return;\n }\n if (hasRegenChoices) {\n setShowRegenPicker((prev) => !prev);\n return;\n }\n await onRegenerate(turnId);\n }, [onRegenerate, turnId, hasRegenChoices]);\n\n const handleRegenerateWithModel = useCallback(\n async (modelId: string) => {\n setShowRegenPicker(false);\n if (onRegenerate && turnId) {\n await onRegenerate(turnId, modelId);\n }\n },\n [onRegenerate, turnId],\n );\n\n // Close picker on outside click / Escape.\n useEffect(() => {\n if (!showRegenPicker) {\n return;\n }\n const handlePointer = (e: MouseEvent | TouchEvent) => {\n const root = regenPickerRef.current;\n if (!root) {return;}\n // Use composedPath so the check works across shadow DOM boundaries\n // (BiChat is hosted inside a shadow root; e.target gets retargeted to\n // the shadow host and `root.contains(target)` is always false).\n const path =\n typeof e.composedPath === \"function\" ? e.composedPath() : [];\n const insideViaPath = path.includes(root);\n const insideViaContains = root.contains(e.target as Node);\n if (!insideViaPath && !insideViaContains) {\n setShowRegenPicker(false);\n }\n };\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setShowRegenPicker(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointer);\n document.addEventListener(\"touchstart\", handlePointer);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointer);\n document.removeEventListener(\"touchstart\", handlePointer);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [showRegenPicker]);\n\n const timestamp = formatRelativeTime(turn.createdAt, t);\n\n // Slot props\n const avatarSlotProps: AssistantMessageAvatarSlotProps = {\n text: isSystemMessage ? \"SYS\" : \"AI\",\n };\n const contentSlotProps: AssistantMessageContentSlotProps = {\n content: turn.content,\n citations: turn.citations,\n isStreaming,\n };\n const sourcesSlotProps: AssistantMessageSourcesSlotProps = {\n citations: turn.citations || [],\n };\n const chartsSlotProps: AssistantMessageChartsSlotProps = {\n charts: turn.charts || [],\n };\n const codeOutputsSlotProps: AssistantMessageCodeOutputsSlotProps = {\n outputs: turn.codeOutputs || [],\n };\n const tablesSlotProps: AssistantMessageTablesSlotProps = {\n tables: turn.renderTables || [],\n };\n const artifactsSlotProps: AssistantMessageArtifactsSlotProps = {\n artifacts: turn.artifacts || [],\n };\n const actionsSlotProps: AssistantMessageActionsSlotProps = {\n onCopy: handleCopyClick,\n onRegenerate: canRegenerate\n ? (model) => {\n if (!onRegenerate || !turnId) {\n return;\n }\n if (model) {\n void handleRegenerateWithModel(model);\n } else {\n void handleRegenerateClick();\n }\n }\n : undefined,\n regenerateModels,\n timestamp,\n canCopy: hasContent,\n canRegenerate,\n };\n const explanationSlotProps: AssistantMessageExplanationSlotProps = {\n explanation: turn.explanation || \"\",\n isExpanded: explanationExpanded,\n onToggle: () => setExplanationExpanded(!explanationExpanded),\n };\n\n // Render helpers\n const renderSlot = <T,>(\n slot: ReactNode | ((props: T) => ReactNode) | undefined,\n props: T,\n defaultContent: ReactNode,\n ): ReactNode => {\n if (slot === undefined) {\n return defaultContent;\n }\n if (typeof slot === \"function\") {\n return slot(props);\n }\n return slot;\n };\n\n return (\n <div className={classes.root}>\n {/* Avatar */}\n {!hideAvatar && (\n <div className={avatarClassName}>\n {renderSlot(\n slots?.avatar,\n avatarSlotProps,\n isSystemMessage ? \"SYS\" : \"AI\",\n )}\n </div>\n )}\n\n <div className={classes.wrapper}>\n {/* Inline recovery for empty assistant responses */}\n <AnimatePresence>\n {showInlineRetry && (\n <RetryActionArea\n key=\"inline-retry\"\n onRetry={() => {\n void handleRegenerateClick();\n }}\n />\n )}\n </AnimatePresence>\n\n {/* Code outputs */}\n {turn.codeOutputs && turn.codeOutputs.length > 0 && (\n <div className={classes.codeOutputs}>\n {renderSlot(\n slots?.codeOutputs,\n codeOutputsSlotProps,\n <CodeOutputsPanel outputs={turn.codeOutputs} />,\n )}\n </div>\n )}\n\n {/* Charts */}\n {turn.charts && turn.charts.length > 0 && (\n <div className={classes.charts}>\n {renderSlot(\n slots?.charts,\n chartsSlotProps,\n turn.charts.length === 1 ? (\n <ChartCard chartData={turn.charts[0]} />\n ) : (\n <TabbedChartGroup charts={turn.charts} />\n ),\n )}\n </div>\n )}\n\n {/* Interactive tables */}\n {turn.renderTables && turn.renderTables.length > 0 && (\n <div className={classes.tables}>\n {renderSlot(\n slots?.tables,\n tablesSlotProps,\n turn.renderTables.length === 1 ? (\n <InteractiveTableCard\n table={turn.renderTables[0]}\n onSendMessage={onSendMessage}\n sendDisabled={sendDisabled || isStreaming}\n />\n ) : (\n <TabbedTableGroup\n tables={turn.renderTables}\n onSendMessage={onSendMessage}\n sendDisabled={sendDisabled || isStreaming}\n />\n ),\n )}\n </div>\n )}\n\n {/* Message bubble */}\n {hasContent && (\n <div className={bubbleClassName}>\n {renderSlot(\n slots?.content,\n contentSlotProps,\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500\">\n <div className=\"w-4 h-4 border-2 border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n {t(\"BiChat.Common.Loading\")}\n </div>\n }\n >\n <MarkdownRenderer\n content={turn.content}\n citations={turn.citations}\n sendMessage={onSendMessage}\n sendDisabled={sendDisabled || isStreaming}\n />\n </Suspense>,\n )}\n\n {/* Streaming cursor */}\n {isStreaming && <StreamingCursor />}\n\n {/* Sources panel */}\n {turn.citations && turn.citations.length > 0 && (\n <div className={classes.sources}>\n {renderSlot(\n slots?.sources,\n sourcesSlotProps,\n <SourcesPanel citations={turn.citations} />,\n )}\n </div>\n )}\n\n {/* Explanation section */}\n {hasExplanation && (\n <div className={classes.explanation}>\n {renderSlot(\n slots?.explanation,\n explanationSlotProps,\n <>\n <button\n type=\"button\"\n onClick={() =>\n setExplanationExpanded(!explanationExpanded)\n }\n className=\"cursor-pointer flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-md p-1 -m-1\"\n aria-expanded={explanationExpanded}\n >\n <CaretRight\n size={16}\n weight=\"bold\"\n className={`transition-transform duration-150 ${\n explanationExpanded ? \"rotate-90\" : \"\"\n }`}\n />\n <span className=\"font-medium\">\n {t(\"BiChat.Assistant.Explanation\")}\n </span>\n </button>\n {explanationExpanded && (\n <div className=\"pt-3 text-sm text-gray-600 dark:text-gray-400\">\n <Suspense\n fallback={<div>{t(\"BiChat.Common.Loading\")}</div>}\n >\n <MarkdownRenderer content={turn.explanation!} />\n </Suspense>\n </div>\n )}\n </>,\n )}\n </div>\n )}\n\n {showDebug && <DebugPanel trace={turn.debug} />}\n </div>\n )}\n\n {/* Artifacts */}\n {turn.artifacts && turn.artifacts.length > 0 && (\n <div className={classes.artifacts}>\n {renderSlot(\n slots?.artifacts,\n artifactsSlotProps,\n turn.artifacts.map((artifact, index) => (\n <DownloadCard\n key={`${artifact.filename}-${index}`}\n artifact={artifact}\n />\n )),\n )}\n </div>\n )}\n\n {/* HITL waiting state */}\n {renderMode === \"hitl_waiting\" && (\n <div className=\"animate-slide-up rounded-2xl border border-primary-200 dark:border-primary-700/40 bg-gradient-to-b from-primary-50/70 to-white dark:from-primary-900/20 dark:to-gray-900/80 shadow-sm p-4\">\n <p className=\"text-sm font-medium text-primary-700 dark:text-primary-300\">\n {t(\"BiChat.InlineQuestion.InputNeeded\")}\n </p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n {t(\"BiChat.InlineQuestion.WaitingForDetails\")}\n </p>\n </div>\n )}\n\n {renderMode === \"hitl_resuming\" && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"animate-slide-up flex items-center gap-2 rounded-xl border border-emerald-100/80 bg-emerald-50/60 px-3 py-2 text-xs text-emerald-800 dark:border-emerald-900/60 dark:bg-emerald-950/20 dark:text-emerald-200\"\n >\n <span\n className=\"inline-flex h-2 w-2 flex-shrink-0 rounded-full bg-emerald-500 animate-pulse\"\n aria-hidden=\"true\"\n />\n <span className=\"font-medium\">\n {pendingQuestion?.status === \"REJECT_SUBMITTED\"\n ? t(\"BiChat.InlineQuestion.DismissalSubmitted\")\n : t(\"BiChat.InlineQuestion.AnswerSubmitted\")}\n </span>\n <span\n className=\"text-emerald-400/80 dark:text-emerald-500/80\"\n aria-hidden=\"true\"\n >\n •\n </span>\n <span className=\"text-emerald-700/80 dark:text-emerald-300/80\">\n {t(\"BiChat.InlineQuestion.ResumeInProgress\")}\n </span>\n </div>\n )}\n\n {/* HITL question form */}\n {renderMode === \"hitl_form\" && pendingQuestion && (\n <InlineQuestionForm pendingQuestion={pendingQuestion} />\n )}\n\n {/* Actions */}\n {hasContent && !hideActions && (\n <div\n className={`${classes.actions} ${isCopied ? \"opacity-100\" : \"\"}`}\n >\n {renderSlot(\n slots?.actions,\n actionsSlotProps,\n <>\n {!hideTimestamp && (\n <span className={classes.timestamp}>{timestamp}</span>\n )}\n\n {showDebug && turn.debug?.attempts?.[0]?.model && (\n <span className=\"inline-flex items-center gap-0.5 rounded px-1 py-0.5 text-[10px] font-medium leading-none text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800\">\n {turn.debug.attempts[0].model}\n </span>\n )}\n\n <button\n onClick={handleCopyClick}\n className={`cursor-pointer ${classes.actionButton} ${\n isCopied ? \"text-green-600 dark:text-green-400\" : \"\"\n }`}\n aria-label={t(\"BiChat.Message.CopyMessage\")}\n title={\n isCopied\n ? t(\"BiChat.Message.Copied\")\n : t(\"BiChat.Message.Copy\")\n }\n >\n {isCopied ? (\n <Check size={14} weight=\"bold\" />\n ) : (\n <Copy size={14} weight=\"regular\" />\n )}\n </button>\n\n {canRegenerate && (\n <div ref={regenPickerRef} className=\"relative inline-flex\">\n <button\n onClick={handleRegenerateClick}\n className={`cursor-pointer ${classes.actionButton} ${\n showRegenPicker\n ? \"bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-200\"\n : \"\"\n }`}\n aria-label={t(\"BiChat.Message.Regenerate\")}\n title={t(\"BiChat.Message.Regenerate\")}\n aria-haspopup={hasRegenChoices ? \"menu\" : undefined}\n aria-expanded={\n hasRegenChoices ? showRegenPicker : undefined\n }\n >\n <ArrowsClockwise size={14} weight=\"regular\" />\n </button>\n {hasRegenChoices && showRegenPicker && (\n <div\n role=\"menu\"\n aria-label={t(\"BiChat.Message.Regenerate\")}\n className=\"animate-slide-up absolute left-0 top-full z-20 mt-1 flex flex-col gap-0.5 rounded-lg border border-gray-200 bg-white p-1 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\n >\n {regenerateModels!.map((m, i) => {\n const isFast = i === 0;\n const Icon = isFast ? Lightning : Brain;\n const accent = isFast\n ? \"text-amber-600 dark:text-amber-400\"\n : \"text-blue-600 dark:text-blue-400\";\n return (\n <button\n key={m.id}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n void handleRegenerateWithModel(m.id);\n }}\n className=\"flex items-center gap-2 whitespace-nowrap rounded-md px-2.5 py-1.5 text-xs font-medium text-gray-700 transition-colors duration-150 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <Icon\n size={14}\n weight=\"fill\"\n className={accent}\n />\n <span>{t(m.label)}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </>,\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default AssistantMessage;\n","import { memo, useCallback, useState } from 'react';\nimport { MagnifyingGlass } from '@phosphor-icons/react';\nimport type { RenderTableData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useDataTable, type DataTableOptions } from '../hooks/useDataTable';\nimport { TableExportButton } from './TableExportButton';\nimport { DataTableHeader } from './DataTableHeader';\nimport { DataTableCell } from './DataTableCell';\nimport { DataTableToolbar } from './DataTableToolbar';\nimport { DataTableFooter } from './DataTableFooter';\nimport { FullscreenOverlay } from './FullscreenOverlay';\n\nconst FULL_WIDTH_CLASS = 'w-full min-w-0 max-w-full';\n\nfunction getPageNumbers(current: number, total: number): (number | 'ellipsis')[] {\n if (total <= 7) {return Array.from({ length: total }, (_, i) => i + 1);}\n const pages: (number | 'ellipsis')[] = [1];\n const left = Math.max(2, current - 1);\n const right = Math.min(total - 1, current + 1);\n if (left > 2) {pages.push('ellipsis');}\n for (let i = left; i <= right; i++) {pages.push(i);}\n if (right < total - 1) {pages.push('ellipsis');}\n pages.push(total);\n return pages;\n}\n\nfunction PaginationButton({\n onClick,\n disabled,\n active,\n children,\n ...rest\n}: {\n onClick: () => void\n disabled?: boolean\n active?: boolean\n children: React.ReactNode\n 'aria-label'?: string\n 'aria-current'?: 'page'\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={`min-w-[1.5rem] cursor-pointer rounded px-1.5 py-0.5 text-xs font-medium transition-colors ${\n active\n ? 'bg-blue-600 text-white'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700'\n } disabled:cursor-not-allowed disabled:opacity-40`}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\n/** External container control. When provided, the card runs in embedded mode. */\nexport interface TableCardHost {\n onToggleFullscreen: () => void\n isFullscreen: boolean\n}\n\ninterface InteractiveTableCardProps {\n table: RenderTableData\n onSendMessage?: (content: string) => void\n sendDisabled?: boolean\n options?: DataTableOptions\n /** When provided, the card runs in embedded mode — strips outer chrome, hides header, delegates fullscreen to the host. */\n host?: TableCardHost\n}\n\nexport const InteractiveTableCard = memo(function InteractiveTableCard({\n table,\n onSendMessage,\n sendDisabled = false,\n options,\n host,\n}: InteractiveTableCardProps) {\n const { t } = useTranslation();\n const dt = useDataTable(table, options);\n\n const canExportViaPrompt = !!onSendMessage && !!table.exportPrompt;\n const exportDisabled = sendDisabled || (!table.export?.url && !canExportViaPrompt);\n\n const handleExport = useCallback(() => {\n if (table.export?.url) {\n try {\n const parsed = new URL(table.export.url, window.location.origin);\n if (!['http:', 'https:', 'blob:'].includes(parsed.protocol)) {\n console.warn('[InteractiveTableCard] Blocked export URL with unsafe protocol:', parsed.protocol);\n return;\n }\n } catch {\n console.warn('[InteractiveTableCard] Blocked malformed export URL');\n return;\n }\n const link = document.createElement('a');\n link.href = table.export.url;\n link.download = table.export.filename || 'table_export.xlsx';\n link.rel = 'noopener noreferrer';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n return;\n }\n\n if (canExportViaPrompt && table.exportPrompt) {\n onSendMessage?.(table.exportPrompt);\n }\n }, [canExportViaPrompt, onSendMessage, table.export, table.exportPrompt]);\n\n const handleCellCopy = useCallback(\n (text: string) => {\n navigator.clipboard.writeText(text).catch(() => {\n /* clipboard API unavailable */\n });\n },\n [],\n );\n\n const handleCopyTable = useCallback(() => {\n const tsv = dt.getTableAsTSV();\n navigator.clipboard.writeText(tsv).catch(() => {\n /* clipboard API unavailable */\n });\n }, [dt]);\n\n const [internalFullscreen, setInternalFullscreen] = useState(false);\n const isFullscreen = host ? host.isFullscreen : internalFullscreen;\n const toggleFullscreen = host ? host.onToggleFullscreen : () => setInternalFullscreen((v) => !v);\n\n const [hoveredRow, setHoveredRow] = useState<number | null>(null);\n\n const rowBg = (rowIndex: number): string =>\n hoveredRow === rowIndex\n ? 'bg-gray-100 dark:bg-gray-800/40'\n : rowIndex % 2 === 1 ? 'bg-gray-50 dark:bg-gray-900' : 'bg-white dark:bg-gray-900';\n\n const hasHiddenColumns = dt.columns.some((c) => !c.visible);\n const from = dt.totalFilteredRows === 0 ? 0 : (dt.page - 1) * dt.pageSize + 1;\n const to = Math.min(dt.page * dt.pageSize, dt.totalFilteredRows);\n const loadedRowsCount = table.rows.length;\n const reportedRowsCount = Math.max(table.totalRows || 0, loadedRowsCount);\n\n const renderToolbar = () => (\n <DataTableToolbar\n columns={dt.columns}\n searchQuery={dt.searchQuery}\n onSearchChange={dt.setSearchQuery}\n onToggleColumnVisibility={dt.toggleColumnVisibility}\n onResetColumnVisibility={dt.resetColumnVisibility}\n hasHiddenColumns={hasHiddenColumns}\n sort={dt.sort}\n onClearSort={dt.clearSort}\n onCopyTable={handleCopyTable}\n isFullscreen={isFullscreen}\n onToggleFullscreen={toggleFullscreen}\n />\n );\n\n const renderHeader = () => (\n <header className=\"flex flex-wrap items-center justify-between gap-2 border-b border-gray-200 px-3 py-2 dark:border-gray-700\">\n <div className=\"min-w-0\">\n <h4 className=\"truncate text-sm font-semibold text-gray-900 dark:text-gray-100\">\n {table.title || t('BiChat.Table.QueryResults')}\n </h4>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {dt.totalFilteredRows === loadedRowsCount\n ? loadedRowsCount === reportedRowsCount\n ? loadedRowsCount === 1\n ? t('BiChat.Table.OneRowLoaded')\n : t('BiChat.Table.RowsLoaded', { count: String(loadedRowsCount) })\n : t('BiChat.DataTable.FilteredRows', {\n filtered: String(loadedRowsCount),\n total: String(reportedRowsCount),\n })\n : t('BiChat.DataTable.FilteredRows', {\n filtered: String(dt.totalFilteredRows),\n total: String(loadedRowsCount),\n })}\n {table.truncated ? ` ${t('BiChat.Table.TruncatedSuffix')}` : ''}\n </p>\n </div>\n\n <TableExportButton\n onClick={handleExport}\n disabled={exportDisabled}\n label={t('BiChat.Table.ExportToExcel')}\n disabledTooltip={sendDisabled ? t('BiChat.Table.PleaseWait') : t('BiChat.Table.ExportUnavailable')}\n />\n </header>\n );\n\n const renderTable = (scrollClass: string) => (\n <div className={`${FULL_WIDTH_CLASS} ${scrollClass}`}>\n <table className=\"min-w-full border-collapse text-sm\">\n <DataTableHeader\n tableId={table.id}\n columns={dt.visibleColumns}\n sort={dt.sort}\n onToggleSort={dt.toggleSort}\n onColumnResize={dt.setColumnWidth}\n onToggleVisibility={dt.toggleColumnVisibility}\n onSendMessage={onSendMessage}\n sendDisabled={sendDisabled}\n showRowNumbers\n />\n <tbody>\n {dt.pageRows.map((row, rowIndex) => (\n <tr\n key={`${table.id}-row-${rowIndex}`}\n className={`border-b border-gray-100 dark:border-gray-800 ${rowBg(rowIndex)}`}\n onMouseEnter={() => setHoveredRow(rowIndex)}\n onMouseLeave={() => setHoveredRow(null)}\n >\n <td className={`sticky left-0 z-[2] w-10 px-2 py-2 text-right text-xs tabular-nums text-gray-400 dark:text-gray-500 select-none ${rowBg(rowIndex)}`}>\n {(dt.page - 1) * dt.pageSize + rowIndex + 1}\n </td>\n {dt.visibleColumns.map((col, colIdx) => (\n <DataTableCell\n key={`${table.id}-cell-${rowIndex}-${col.index}`}\n formatted={dt.formatCell(row[col.index], col.index)}\n alignment={dt.getCellAlignment(col.index)}\n onCopy={handleCellCopy}\n isSticky={colIdx === 0}\n stickyClassName={`sticky left-[2.5rem] z-[1] ${rowBg(rowIndex)}`}\n />\n ))}\n </tr>\n ))}\n {dt.pageRows.length === 0 && (\n <tr>\n <td\n colSpan={dt.visibleColumns.length + 1}\n className=\"px-3 py-10 text-center\"\n >\n {dt.searchQuery ? (\n <div className=\"flex flex-col items-center gap-2\">\n <MagnifyingGlass size={32} className=\"text-gray-300 dark:text-gray-600\" weight=\"duotone\" />\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n {t('BiChat.DataTable.NoMatchingRows')}\n </p>\n <button\n type=\"button\"\n onClick={() => dt.setSearchQuery('')}\n className=\"cursor-pointer text-xs font-medium text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\"\n >\n {t('BiChat.DataTable.ClearSearchAction')}\n </button>\n </div>\n ) : (\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('BiChat.Table.NoRows')}\n </span>\n )}\n </td>\n </tr>\n )}\n </tbody>\n <DataTableFooter\n visibleColumns={dt.visibleColumns}\n stats={dt.columnStats}\n showRowNumbers\n />\n </table>\n </div>\n );\n\n const renderPagination = (idPrefix: string) => (\n <footer className=\"flex flex-wrap items-center justify-between gap-2 border-t border-gray-200 px-3 py-2 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('BiChat.Table.Showing', {\n from: String(from),\n to: String(to),\n total: String(dt.totalFilteredRows),\n })}\n </div>\n <label className=\"text-xs text-gray-500 dark:text-gray-400\" htmlFor={`${idPrefix}-page-size`}>\n {t('BiChat.Table.RowsLabel')}\n </label>\n <select\n id={`${idPrefix}-page-size`}\n value={dt.pageSize}\n onChange={(event) => dt.setPageSize(Number(event.target.value))}\n className=\"rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200\"\n >\n {dt.pageSizeOptions.map((option) => (\n <option key={`${idPrefix}-size-${option}`} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n <nav className=\"flex items-center gap-1\" aria-label=\"Pagination\">\n <PaginationButton\n onClick={() => dt.setPage(1)}\n disabled={dt.page <= 1}\n aria-label={t('BiChat.DataTable.FirstPage')}\n >\n «\n </PaginationButton>\n <PaginationButton\n onClick={() => dt.setPage(Math.max(1, dt.page - 1))}\n disabled={dt.page <= 1}\n aria-label={t('BiChat.Table.Prev')}\n >\n ‹\n </PaginationButton>\n {getPageNumbers(dt.page, dt.totalPages).map((item, i) =>\n item === 'ellipsis' ? (\n <span key={`ellipsis-${i}`} className=\"px-1 text-xs text-gray-400\" aria-hidden>\n …\n </span>\n ) : (\n <PaginationButton\n key={item}\n onClick={() => dt.setPage(item)}\n active={item === dt.page}\n aria-current={item === dt.page ? 'page' : undefined}\n >\n {item}\n </PaginationButton>\n ),\n )}\n <PaginationButton\n onClick={() => dt.setPage(Math.min(dt.totalPages, dt.page + 1))}\n disabled={dt.page >= dt.totalPages}\n aria-label={t('BiChat.Table.Next')}\n >\n ›\n </PaginationButton>\n <PaginationButton\n onClick={() => dt.setPage(dt.totalPages)}\n disabled={dt.page >= dt.totalPages}\n aria-label={t('BiChat.DataTable.LastPage')}\n >\n »\n </PaginationButton>\n </nav>\n </footer>\n );\n\n const renderTruncationNotice = () =>\n table.truncated ? (\n <p className=\"border-t border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-700 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-300\">\n {t('BiChat.Table.TruncatedNotice')}\n </p>\n ) : null;\n\n const fillHeight = host?.isFullscreen ?? false;\n\n const sectionClassName = host\n ? `${FULL_WIDTH_CLASS} overflow-hidden${fillHeight ? ' flex flex-col flex-1' : ''}`\n : `${FULL_WIDTH_CLASS} rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40 overflow-hidden`;\n\n return (\n <>\n <section className={sectionClassName}>\n {renderToolbar()}\n {!host && renderHeader()}\n {renderTable(fillHeight ? 'flex-1 overflow-auto' : 'max-h-[420px] overflow-auto')}\n {renderPagination(table.id)}\n {renderTruncationNotice()}\n </section>\n\n {/* Standalone fullscreen — only when not hosted */}\n {!host && isFullscreen && (\n <FullscreenOverlay\n title={table.title || t('BiChat.Table.QueryResults')}\n onClose={() => setInternalFullscreen(false)}\n closeLabel={t('BiChat.DataTable.Collapse')}\n >\n {renderToolbar()}\n {renderHeader()}\n {renderTable('flex-1 overflow-auto')}\n {renderPagination(`${table.id}-fs`)}\n {renderTruncationNotice()}\n </FullscreenOverlay>\n )}\n </>\n );\n});\n","export type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'url' | 'null'\n\nexport interface FormattedCell {\n display: string\n raw: unknown\n type: ColumnType\n isNull: boolean\n}\n\nconst URL_PATTERN = /^https?:\\/\\//i;\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?)?)?$/;\nconst MAX_SAMPLE = 20;\n\n// Long integers (phone numbers, IDs) lose meaning when formatted with thousand\n// separators and may exceed the safe integer range.\nfunction isLongInteger(v: unknown): boolean {\n if (typeof v === 'number') {return Number.isInteger(v) && Math.abs(v) >= 1e9;}\n if (typeof v === 'string') {return /^\\d{10,}$/.test(v.trim());}\n return false;\n}\n\nexport function inferColumnType(values: unknown[], backendHint?: string): ColumnType {\n const nonNull = values.filter((v) => v !== null && v !== undefined);\n const sample = nonNull.slice(0, MAX_SAMPLE);\n\n // Override backend 'number' hint when all values look like identifiers (phone numbers, IDs).\n if (backendHint === 'number' && sample.length > 0 && sample.every(isLongInteger)) {\n return 'string';\n }\n\n if (backendHint) {\n switch (backendHint) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'date':\n return 'date';\n default:\n return 'string';\n }\n }\n\n if (nonNull.length === 0) {return 'null';}\n\n if (sample.every((v) => typeof v === 'number' || (typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v))))) {\n if (sample.every(isLongInteger)) {\n return 'string';\n }\n return 'number';\n }\n\n if (sample.every((v) => typeof v === 'boolean' || v === 'true' || v === 'false')) {\n return 'boolean';\n }\n\n if (sample.every((v) => typeof v === 'string' && ISO_DATE_PATTERN.test(v))) {\n return 'date';\n }\n\n if (sample.length > 0 && sample.every((v) => typeof v === 'string' && URL_PATTERN.test(v))) {\n return 'url';\n }\n\n return 'string';\n}\n\nexport function formatCellValue(value: unknown, type: ColumnType): FormattedCell {\n if (value === null || value === undefined) {\n return { display: 'NULL', raw: value, type, isNull: true };\n }\n\n switch (type) {\n case 'number': {\n const num = typeof value === 'number' ? value : Number(value);\n if (!isFinite(num)) {\n return { display: String(value), raw: value, type, isNull: false };\n }\n // Large integers (≥10 digits) are typically identifiers (phone numbers, IDs)\n // — display without thousand separators to preserve readability.\n if (Number.isInteger(num) && Math.abs(num) >= 1e9) {\n return { display: String(num), raw: value, type, isNull: false };\n }\n const display = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 6,\n }).format(num);\n return { display, raw: value, type, isNull: false };\n }\n\n case 'boolean': {\n const bool = typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true';\n return { display: bool ? 'true' : 'false', raw: value, type, isNull: false };\n }\n\n case 'date': {\n const str = String(value);\n const date = new Date(str);\n if (isNaN(date.getTime())) {\n return { display: str, raw: value, type, isNull: false };\n }\n const now = new Date();\n const sameCalendarDay = date.toDateString() === now.toDateString();\n let display: string;\n if (sameCalendarDay) {\n display = date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n } else {\n const diffDays = Math.abs(now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24);\n if (diffDays < 365) {\n display = date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n } else {\n display = date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n }\n }\n return { display, raw: value, type, isNull: false };\n }\n\n case 'url': {\n return { display: String(value), raw: value, type, isNull: false };\n }\n\n default: {\n const str = typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n return { display: str, raw: value, type, isNull: false };\n }\n }\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { RenderTableData } from '../types';\nimport { type ColumnType, type FormattedCell, inferColumnType, formatCellValue } from '../utils/columnTypes';\n\nexport interface ColumnMeta {\n index: number\n name: string\n header: string\n type: ColumnType\n width: number | null\n visible: boolean\n}\n\nexport interface SortState {\n columnIndex: number\n direction: 'asc' | 'desc'\n}\n\nexport interface ColumnStats {\n sum: number\n avg: number\n min: number\n max: number\n count: number\n nullCount: number\n}\n\nexport interface DataTableOptions {\n defaultPageSize?: number\n enableSearch?: boolean\n enableSort?: boolean\n enableResize?: boolean\n enableColumnVisibility?: boolean\n}\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50, 100, 200];\n\nexport interface UseDataTableReturn {\n columns: ColumnMeta[]\n visibleColumns: ColumnMeta[]\n\n page: number\n pageSize: number\n totalPages: number\n totalFilteredRows: number\n pageSizeOptions: number[]\n pageRows: unknown[][]\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n\n sort: SortState | null\n toggleSort: (columnIndex: number) => void\n clearSort: () => void\n\n searchQuery: string\n setSearchQuery: (query: string) => void\n\n columnStats: Map<number, ColumnStats>\n\n toggleColumnVisibility: (columnIndex: number) => void\n resetColumnVisibility: () => void\n\n setColumnWidth: (columnIndex: number, width: number) => void\n\n formatCell: (value: unknown, columnIndex: number) => FormattedCell\n getCellAlignment: (columnIndex: number) => 'left' | 'right'\n\n getTableAsTSV: () => string\n}\n\nexport function useDataTable(\n table: RenderTableData,\n options?: DataTableOptions,\n): UseDataTableReturn {\n const defaultPageSize = Math.min(Math.max(table.pageSize || options?.defaultPageSize || 25, 1), 200);\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(defaultPageSize);\n const [sort, setSort] = useState<SortState | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [columnVisibility, setColumnVisibility] = useState<Map<number, boolean>>(new Map());\n const [columnWidths, setColumnWidths] = useState<Map<number, number>>(new Map());\n\n // Reset state when table identity changes\n useEffect(() => {\n setPage(1);\n setPageSize(Math.min(Math.max(table.pageSize || options?.defaultPageSize || 25, 1), 200));\n setSort(null);\n setSearchQuery('');\n setColumnVisibility(new Map());\n setColumnWidths(new Map());\n }, [table.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Type inference depends only on table data\n const columnTypes = useMemo(() => {\n return table.columns.map((_, index) => {\n const backendHint = table.columnTypes?.[index];\n const columnValues = table.rows.map((row) => row[index]);\n return inferColumnType(columnValues, backendHint);\n });\n }, [table.columns, table.rows, table.columnTypes]);\n\n // Column metadata: types + width/visibility\n const columns: ColumnMeta[] = useMemo(() => {\n return table.columns.map((name, index) => ({\n index,\n name,\n header: table.headers[index] || name,\n type: columnTypes[index],\n width: columnWidths.get(index) ?? null,\n visible: columnVisibility.get(index) ?? true,\n }));\n }, [table.columns, table.headers, columnTypes, columnWidths, columnVisibility]);\n\n const visibleColumns = useMemo(() => columns.filter((c) => c.visible), [columns]);\n\n // Apply search filter\n const searchFilteredRows = useMemo(() => {\n if (!searchQuery.trim()) {return table.rows;}\n const query = searchQuery.toLowerCase();\n const visibleIndices = new Set(visibleColumns.map((c) => c.index));\n return table.rows.filter((row) =>\n row.some((cell, i) => {\n if (!visibleIndices.has(i)) {return false;}\n if (cell === null || cell === undefined) {return false;}\n return String(cell).toLowerCase().includes(query);\n }),\n );\n }, [table.rows, searchQuery, visibleColumns]);\n\n // Apply sort\n const sortedRows = useMemo(() => {\n if (!sort) {return searchFilteredRows;}\n\n const col = columns[sort.columnIndex];\n if (!col) {return searchFilteredRows;}\n\n const sorted = [...searchFilteredRows];\n const colIdx = sort.columnIndex;\n const dir = sort.direction === 'asc' ? 1 : -1;\n\n sorted.sort((a, b) => {\n const aVal = a[colIdx];\n const bVal = b[colIdx];\n\n // Nulls always last\n const aNull = aVal === null || aVal === undefined;\n const bNull = bVal === null || bVal === undefined;\n if (aNull && bNull) {return 0;}\n if (aNull) {return 1;}\n if (bNull) {return -1;}\n\n switch (col.type) {\n case 'number': {\n const aNum = typeof aVal === 'number' ? aVal : Number(aVal);\n const bNum = typeof bVal === 'number' ? bVal : Number(bVal);\n if (isNaN(aNum) && isNaN(bNum)) {return 0;}\n if (isNaN(aNum)) {return 1;}\n if (isNaN(bNum)) {return -1;}\n return (aNum - bNum) * dir;\n }\n case 'date': {\n const aTime = new Date(String(aVal)).getTime();\n const bTime = new Date(String(bVal)).getTime();\n if (isNaN(aTime) && isNaN(bTime)) {return 0;}\n if (isNaN(aTime)) {return 1;}\n if (isNaN(bTime)) {return -1;}\n return (aTime - bTime) * dir;\n }\n case 'boolean': {\n const aBool = aVal === true || aVal === 'true' ? 1 : 0;\n const bBool = bVal === true || bVal === 'true' ? 1 : 0;\n return (aBool - bBool) * dir;\n }\n default: {\n return String(aVal).localeCompare(String(bVal)) * dir;\n }\n }\n });\n\n return sorted;\n }, [searchFilteredRows, sort, columns]);\n\n const totalFilteredRows = sortedRows.length;\n\n // Compute stats on filtered numeric columns (visible columns only)\n const columnStats = useMemo<Map<number, ColumnStats>>(() => {\n const stats = new Map<number, ColumnStats>();\n for (const col of visibleColumns) {\n if (col.type !== 'number') {continue;}\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n let count = 0;\n let nullCount = 0;\n\n for (const row of sortedRows) {\n const val = row[col.index];\n if (val === null || val === undefined) {\n nullCount++;\n continue;\n }\n const num = typeof val === 'number' ? val : Number(val);\n if (isNaN(num)) {continue;}\n sum += num;\n min = Math.min(min, num);\n max = Math.max(max, num);\n count++;\n }\n\n if (count > 0) {\n stats.set(col.index, {\n sum,\n avg: sum / count,\n min,\n max,\n count,\n nullCount,\n });\n }\n }\n return stats;\n }, [visibleColumns, sortedRows]);\n\n // Pagination\n const totalPages = Math.max(1, Math.ceil(totalFilteredRows / pageSize));\n\n useEffect(() => {\n setPage((prev) => Math.min(prev, totalPages));\n }, [totalPages]);\n\n const pageRows = useMemo(() => {\n const start = (page - 1) * pageSize;\n return sortedRows.slice(start, start + pageSize);\n }, [page, pageSize, sortedRows]);\n\n const pageSizeOptions = useMemo(() => {\n const set = new Set([...PAGE_SIZE_OPTIONS, defaultPageSize]);\n return [...set].sort((a, b) => a - b);\n }, [defaultPageSize]);\n\n // Reset page on search/sort change\n useEffect(() => {\n setPage(1);\n }, [searchQuery, sort]);\n\n // Actions\n const toggleSort = useCallback(\n (columnIndex: number) => {\n if (options?.enableSort === false) {return;}\n setSort((prev) => {\n if (!prev || prev.columnIndex !== columnIndex) {\n return { columnIndex, direction: 'asc' };\n }\n if (prev.direction === 'asc') {\n return { columnIndex, direction: 'desc' };\n }\n return null;\n });\n },\n [options?.enableSort],\n );\n\n const handleSetSearchQuery = useCallback(\n (query: string) => {\n if (options?.enableSearch === false) {return;}\n setSearchQuery(query);\n },\n [options?.enableSearch],\n );\n\n const toggleColumnVisibility = useCallback(\n (columnIndex: number) => {\n if (options?.enableColumnVisibility === false) {return;}\n const numColumns = table.columns.length;\n setColumnVisibility((prev) => {\n const next = new Map(prev);\n const currentlyVisible = prev.get(columnIndex) ?? true;\n if (currentlyVisible) {\n let visibleCount = 0;\n for (let i = 0; i < numColumns; i++) {\n if (prev.get(i) ?? true) {visibleCount++;}\n }\n if (visibleCount <= 1) {return prev;}\n }\n next.set(columnIndex, !currentlyVisible);\n return next;\n });\n },\n [options?.enableColumnVisibility, table.columns.length],\n );\n\n const resetColumnVisibility = useCallback(() => {\n setColumnVisibility(new Map());\n }, []);\n\n const setColumnWidthCb = useCallback(\n (columnIndex: number, width: number) => {\n if (options?.enableResize === false) {return;}\n setColumnWidths((prev) => {\n const next = new Map(prev);\n next.set(columnIndex, Math.max(60, width));\n return next;\n });\n },\n [options?.enableResize],\n );\n\n const formatCell = useCallback(\n (value: unknown, columnIndex: number): FormattedCell => {\n const type = columnTypes[columnIndex] ?? 'string';\n return formatCellValue(value, type);\n },\n [columnTypes],\n );\n\n const getCellAlignment = useCallback(\n (columnIndex: number): 'left' | 'right' => {\n return columnTypes[columnIndex] === 'number' ? 'right' : 'left';\n },\n [columnTypes],\n );\n\n const clearSort = useCallback(() => setSort(null), []);\n\n const handleSetPageSize = useCallback(\n (size: number) => {\n setPageSize(size);\n setPage(1);\n },\n [],\n );\n\n const getTableAsTSV = useCallback((): string => {\n const escape = (v: string) => v.replace(/[\\t\\r\\n]/g, ' ');\n const visCols = columns.filter((c) => c.visible);\n const headerRow = visCols.map((c) => escape(c.header)).join('\\t');\n const dataRows = sortedRows.map((row) =>\n visCols.map((c) => {\n const val = row[c.index];\n if (val === null || val === undefined) {return '';}\n return escape(String(val));\n }).join('\\t'),\n );\n return [headerRow, ...dataRows].join('\\n');\n }, [columns, sortedRows]);\n\n return {\n columns,\n visibleColumns,\n\n page,\n pageSize,\n totalPages,\n totalFilteredRows,\n pageSizeOptions,\n pageRows,\n setPage,\n setPageSize: handleSetPageSize,\n\n sort,\n toggleSort,\n clearSort,\n\n searchQuery,\n setSearchQuery: handleSetSearchQuery,\n\n columnStats,\n\n toggleColumnVisibility,\n resetColumnVisibility,\n\n setColumnWidth: setColumnWidthCb,\n\n formatCell,\n getCellAlignment,\n\n getTableAsTSV,\n };\n}\n","import { memo, useCallback, useEffect, useRef } from 'react';\nimport { CaretUp, CaretDown, DotsThreeVertical } from '@phosphor-icons/react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport type { ColumnMeta, SortState } from '../hooks/useDataTable';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst MIN_COLUMN_WIDTH = 40;\n\ninterface DataTableHeaderProps {\n tableId: string\n columns: ColumnMeta[]\n sort: SortState | null\n onToggleSort: (columnIndex: number) => void\n onColumnResize: (columnIndex: number, width: number) => void\n onToggleVisibility: (columnIndex: number) => void\n onSendMessage?: (content: string) => void\n sendDisabled?: boolean\n showRowNumbers?: boolean\n}\n\nexport const DataTableHeader = memo(function DataTableHeader({\n tableId,\n columns,\n sort,\n onToggleSort,\n onColumnResize,\n onToggleVisibility,\n onSendMessage,\n sendDisabled,\n showRowNumbers,\n}: DataTableHeaderProps) {\n return (\n <thead className=\"sticky top-0 z-10 bg-gray-100 dark:bg-gray-800\">\n <tr className=\"border-b border-gray-200 dark:border-gray-700\">\n {showRowNumbers && (\n <th scope=\"col\" className=\"sticky left-0 z-20 w-10 bg-gray-100 px-2 py-2 text-right text-xs font-medium text-gray-400 dark:bg-gray-800 dark:text-gray-500 select-none\">\n #\n </th>\n )}\n {columns.map((col, colIdx) => (\n <HeaderCell\n key={`${tableId}-header-${col.index}`}\n column={col}\n sort={sort}\n onToggleSort={onToggleSort}\n onColumnResize={onColumnResize}\n onToggleVisibility={onToggleVisibility}\n onSendMessage={onSendMessage}\n sendDisabled={sendDisabled}\n isFirstColumn={colIdx === 0 && !!showRowNumbers}\n />\n ))}\n </tr>\n </thead>\n );\n});\n\ninterface HeaderCellProps {\n column: ColumnMeta\n sort: SortState | null\n onToggleSort: (columnIndex: number) => void\n onColumnResize: (columnIndex: number, width: number) => void\n onToggleVisibility: (columnIndex: number) => void\n onSendMessage?: (content: string) => void\n sendDisabled?: boolean\n isFirstColumn?: boolean\n}\n\nconst HeaderCell = memo(function HeaderCell({\n column,\n sort,\n onToggleSort,\n onColumnResize,\n onToggleVisibility,\n onSendMessage,\n sendDisabled,\n isFirstColumn,\n}: HeaderCellProps) {\n const { t } = useTranslation();\n const thRef = useRef<HTMLTableCellElement>(null);\n const resizeTeardownRef = useRef<(() => void) | null>(null);\n const isActive = sort?.columnIndex === column.index;\n const direction = isActive ? sort.direction : null;\n\n useEffect(() => {\n return () => {\n resizeTeardownRef.current?.();\n resizeTeardownRef.current = null;\n };\n }, []);\n\n const handleResizeStart = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const th = thRef.current;\n if (!th) {return;}\n\n const startX = e.clientX;\n const startWidth = th.offsetWidth;\n const pointerId = e.pointerId;\n const target = e.currentTarget as Element;\n\n const onMove = (moveEvent: PointerEvent) => {\n const delta = moveEvent.clientX - startX;\n const newWidth = Math.max(MIN_COLUMN_WIDTH, startWidth + delta);\n onColumnResize(column.index, newWidth);\n };\n\n const teardown = () => {\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n document.removeEventListener('pointercancel', onUp);\n resizeTeardownRef.current = null;\n try {\n target.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n };\n\n const onUp = () => teardown();\n\n resizeTeardownRef.current = teardown;\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n document.addEventListener('pointercancel', onUp);\n try {\n target.setPointerCapture(pointerId);\n } catch {\n // ignore\n }\n },\n [column.index, onColumnResize],\n );\n\n return (\n <th\n ref={thRef}\n scope=\"col\"\n aria-sort={direction === 'asc' ? 'ascending' : direction === 'desc' ? 'descending' : 'none'}\n className={`group relative select-none whitespace-nowrap border-r border-transparent px-3 py-2 text-left font-semibold text-gray-700 dark:text-gray-200 ${\n isFirstColumn ? 'sticky left-[2.5rem] z-20 bg-gray-100 dark:bg-gray-800' : ''\n }`}\n style={column.width ? { width: column.width, minWidth: column.width } : undefined}\n >\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-1 hover:text-gray-900 dark:hover:text-white\"\n onClick={() => onToggleSort(column.index)}\n aria-label={t('BiChat.DataTable.SortBy', { column: column.header })}\n >\n <span>{column.header}</span>\n {direction === 'asc' && <CaretUp size={12} weight=\"bold\" />}\n {direction === 'desc' && <CaretDown size={12} weight=\"bold\" />}\n {!direction && (\n <span className=\"w-3 opacity-0 transition-opacity group-hover:opacity-40\">\n <CaretUp size={12} />\n </span>\n )}\n </button>\n\n {onSendMessage && (\n <Menu>\n <MenuButton\n className=\"ml-auto rounded p-0.5 opacity-0 transition-opacity hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-700\"\n aria-label={t('BiChat.DataTable.ColumnActions')}\n >\n <DotsThreeVertical size={14} />\n </MenuButton>\n <MenuItems\n anchor=\"bottom end\"\n className=\"z-50 min-w-[180px] rounded-lg border border-gray-200 bg-white py-1 text-sm shadow-lg dark:border-gray-700 dark:bg-gray-800 [--anchor-gap:4px]\"\n >\n <MenuItem>\n {({ focus }) => (\n <button\n type=\"button\"\n className={`w-full px-3 py-1.5 text-left ${focus ? 'bg-gray-100 dark:bg-gray-700' : ''} text-gray-700 dark:text-gray-200`}\n disabled={sendDisabled}\n onClick={() => onSendMessage(t('BiChat.DataTable.Prompt.SummarizeColumn', { column: column.header }))}\n >\n {t('BiChat.DataTable.SummarizeColumn')}\n </button>\n )}\n </MenuItem>\n <MenuItem>\n {({ focus }) => (\n <button\n type=\"button\"\n className={`w-full px-3 py-1.5 text-left ${focus ? 'bg-gray-100 dark:bg-gray-700' : ''} text-gray-700 dark:text-gray-200`}\n disabled={sendDisabled}\n onClick={() =>\n onSendMessage(t('BiChat.DataTable.Prompt.UniqueValues', { column: column.header }))\n }\n >\n {t('BiChat.DataTable.UniqueValues')}\n </button>\n )}\n </MenuItem>\n <div className=\"my-1 border-t border-gray-200 dark:border-gray-700\" />\n <MenuItem>\n {({ focus }) => (\n <button\n type=\"button\"\n className={`w-full px-3 py-1.5 text-left ${focus ? 'bg-gray-100 dark:bg-gray-700' : ''} text-gray-700 dark:text-gray-200`}\n onClick={() => onToggleVisibility(column.index)}\n >\n {t('BiChat.DataTable.HideColumn')}\n </button>\n )}\n </MenuItem>\n </MenuItems>\n </Menu>\n )}\n </div>\n\n {/* Resize handle */}\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={t('BiChat.DataTable.ResizeColumn')}\n className=\"absolute right-0 top-0 h-full w-1 cursor-col-resize opacity-0 transition-opacity hover:bg-blue-400 hover:opacity-100 group-hover:opacity-40\"\n onPointerDown={handleResizeStart}\n />\n </th>\n );\n});\n","import { memo, useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Copy, Check } from '@phosphor-icons/react';\nimport type { FormattedCell } from '../utils/columnTypes';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DataTableCellProps {\n formatted: FormattedCell\n alignment: 'left' | 'right'\n onCopy?: (value: string) => void\n isSticky?: boolean\n stickyClassName?: string\n}\n\ntype CellRenderer = (props: {\n formatted: FormattedCell\n tooltipRef: React.Ref<HTMLSpanElement>\n onMouseEnter: () => void\n onMouseLeave: () => void\n}) => ReactNode\n\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:'];\n\nfunction safeHref(input: string): string {\n if (!input || typeof input !== 'string') {return '#';}\n try {\n const url = new URL(input, 'https://example.com');\n return SAFE_URL_PROTOCOLS.includes(url.protocol) ? url.href : '#';\n } catch {\n return '#';\n }\n}\n\nconst cellRenderers: Record<string, CellRenderer> = {\n boolean: ({ formatted }) => (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${\n formatted.raw === true\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-red-100 text-red-600 dark:bg-red-900/30 dark:text-red-400'\n }`}\n >\n {formatted.display}\n </span>\n ),\n url: ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => {\n const href = safeHref(formatted.display);\n if (href === '#') {\n return (\n <span\n ref={tooltipRef}\n className=\"block max-w-[420px] truncate text-gray-700 dark:text-gray-300\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {formatted.display}\n </span>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 underline hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\"\n onClick={(e) => e.stopPropagation()}\n >\n <span\n ref={tooltipRef}\n className=\"block max-w-[420px] truncate\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {formatted.display}\n </span>\n </a>\n );\n },\n number: ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => (\n <span\n ref={tooltipRef}\n className=\"block font-mono text-gray-700 dark:text-gray-300 tabular-nums\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {formatted.display}\n </span>\n ),\n date: ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => (\n <span\n ref={tooltipRef}\n className=\"block text-gray-700 dark:text-gray-300\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {formatted.display}\n </span>\n ),\n};\n\nconst defaultRenderer: CellRenderer = ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => (\n <span\n ref={tooltipRef}\n className=\"block max-w-[420px] truncate text-gray-700 dark:text-gray-300\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {formatted.display}\n </span>\n);\n\nexport const DataTableCell = memo(function DataTableCell({\n formatted,\n alignment,\n onCopy,\n isSticky,\n stickyClassName,\n}: DataTableCellProps) {\n const { t } = useTranslation();\n const [copied, setCopied] = useState(false);\n const copyTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const handleCopy = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (!onCopy) {return;}\n const text = formatted.isNull ? '' : String(formatted.raw ?? formatted.display);\n onCopy(text);\n clearTimeout(copyTimerRef.current);\n setCopied(true);\n copyTimerRef.current = setTimeout(() => setCopied(false), 2000);\n }, [onCopy, formatted]);\n\n const [hovered, setHovered] = useState(false);\n\n const tooltipRef = useRef<HTMLSpanElement>(null);\n const [tooltip, setTooltip] = useState<{ x: number; y: number } | null>(null);\n const tooltipTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const handleMouseEnter = useCallback(() => {\n const el = tooltipRef.current;\n if (!el || el.scrollWidth <= el.clientWidth) {return;}\n tooltipTimerRef.current = setTimeout(() => {\n const rect = el.getBoundingClientRect();\n setTooltip({\n x: rect.left + rect.width / 2,\n y: rect.bottom + 4,\n });\n }, 300);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n clearTimeout(tooltipTimerRef.current);\n setTooltip(null);\n }, []);\n\n useEffect(() => {\n return () => {\n clearTimeout(tooltipTimerRef.current);\n clearTimeout(copyTimerRef.current);\n };\n }, []);\n\n const hasOverflow = formatted.type === 'string' || formatted.type === 'url' || formatted.type === 'date' || formatted.type === 'number';\n const tooltipContent = formatted.isNull ? null : (formatted.type === 'number' || formatted.type === 'date') ? String(formatted.raw) : formatted.display;\n\n const rendererProps = { formatted, tooltipRef, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave };\n\n const showCopyButton = onCopy && (hovered || copied) && !formatted.isNull;\n\n return (\n <td\n className={`relative px-3 py-2 align-top ${alignment === 'right' ? 'text-right' : 'text-left'} ${isSticky ? stickyClassName ?? '' : ''}`}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {formatted.isNull ? (\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">—</span>\n ) : (\n (cellRenderers[formatted.type] ?? defaultRenderer)(rendererProps)\n )}\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`absolute top-1 right-1 cursor-pointer rounded p-0.5 transition-colors ${\n copied\n ? 'text-green-600 dark:text-green-400'\n : 'text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300'\n }`}\n aria-label={copied ? t('BiChat.Message.Copied') : t('BiChat.DataTable.Copy')}\n >\n {copied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} />}\n </button>\n )}\n {tooltip && hasOverflow && tooltipContent && createPortal(\n <div\n className=\"pointer-events-none fixed max-w-[400px] rounded-lg bg-gray-900 px-3 py-2 text-xs text-white shadow-lg break-words dark:bg-gray-700\"\n style={{\n zIndex: 100001,\n left: Math.min(tooltip.x, window.innerWidth - 420),\n top: tooltip.y,\n transform: 'translateX(-50%)',\n }}\n >\n {tooltipContent}\n </div>,\n document.body,\n )}\n </td>\n );\n});\n","import { memo, useCallback, useEffect, useState, useRef } from 'react';\nimport { ArrowsIn, ArrowsOut, CaretUp, CaretDown, Columns, Copy, X, Check } from '@phosphor-icons/react';\nimport { Popover, PopoverButton, PopoverPanel } from '@headlessui/react';\nimport type { ColumnMeta, SortState } from '../hooks/useDataTable';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DataTableToolbarProps {\n columns: ColumnMeta[]\n searchQuery: string\n onSearchChange: (query: string) => void\n onToggleColumnVisibility: (columnIndex: number) => void\n onResetColumnVisibility: () => void\n hasHiddenColumns: boolean\n sort?: SortState | null\n onClearSort?: () => void\n onCopyTable?: () => void\n isFullscreen?: boolean\n onToggleFullscreen?: () => void\n}\n\nexport const DataTableToolbar = memo(function DataTableToolbar({\n columns,\n searchQuery,\n onSearchChange,\n onToggleColumnVisibility,\n onResetColumnVisibility,\n hasHiddenColumns,\n sort,\n onClearSort,\n onCopyTable,\n isFullscreen,\n onToggleFullscreen,\n}: DataTableToolbarProps) {\n const { t } = useTranslation();\n const [searchFocused, setSearchFocused] = useState(false);\n const [copied, setCopied] = useState(false);\n const copyTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n return () => {\n if (copyTimerRef.current !== undefined) {\n clearTimeout(copyTimerRef.current);\n copyTimerRef.current = undefined;\n }\n };\n }, []);\n\n const handleSearchClear = useCallback(() => {\n onSearchChange('');\n }, [onSearchChange]);\n\n const handleCopy = useCallback(() => {\n onCopyTable?.();\n clearTimeout(copyTimerRef.current);\n setCopied(true);\n copyTimerRef.current = setTimeout(() => setCopied(false), 2000);\n }, [onCopyTable]);\n\n const hasSearch = searchQuery.length > 0;\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-gray-200 px-3 py-2 dark:border-gray-700\">\n {/* Search */}\n <div className={`relative flex items-center transition-all ${searchFocused || hasSearch ? 'w-48' : 'w-32'}`}>\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n onFocus={() => setSearchFocused(true)}\n onBlur={() => setSearchFocused(false)}\n placeholder={t('BiChat.DataTable.Search')}\n className=\"w-full rounded-md border border-gray-300 bg-white py-1 pl-2 pr-7 text-xs text-gray-700 placeholder-gray-400 focus:border-blue-400 focus:outline-none dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:placeholder-gray-500\"\n aria-label={t('BiChat.DataTable.SearchRows')}\n />\n {hasSearch && (\n <button\n type=\"button\"\n onClick={handleSearchClear}\n className=\"absolute right-1.5 cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\n aria-label={t('BiChat.DataTable.ClearSearch')}\n >\n <X size={12} />\n </button>\n )}\n </div>\n\n {/* Column visibility */}\n <Popover className=\"relative\">\n <PopoverButton\n className={`flex cursor-pointer items-center gap-1 rounded-md border px-2 py-1 text-xs transition-colors ${\n hasHiddenColumns\n ? 'border-blue-300 bg-blue-50 text-blue-700 dark:border-blue-600 dark:bg-blue-900/20 dark:text-blue-400'\n : 'border-gray-300 text-gray-600 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-800'\n }`}\n aria-label={t('BiChat.DataTable.ToggleColumns')}\n >\n <Columns size={14} />\n <span>{t('BiChat.DataTable.Columns')}</span>\n </PopoverButton>\n <PopoverPanel\n anchor=\"bottom start\"\n className=\"z-50 mt-1 max-h-72 min-w-[200px] overflow-auto rounded-lg border border-gray-200 bg-white py-1.5 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\n >\n {hasHiddenColumns && (\n <>\n <button\n type=\"button\"\n className=\"w-full px-3 py-1.5 text-left text-xs font-medium text-blue-600 hover:bg-gray-50 dark:text-blue-400 dark:hover:bg-gray-700\"\n onClick={onResetColumnVisibility}\n >\n {t('BiChat.DataTable.ShowAllColumns')}\n </button>\n <div className=\"my-1 border-t border-gray-200 dark:border-gray-700\" />\n </>\n )}\n {columns.map((col) => (\n <button\n key={col.index}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={col.visible}\n className=\"flex w-full cursor-pointer items-center gap-2.5 px-3 py-1.5 text-left text-xs text-gray-700 hover:bg-gray-50 dark:text-gray-200 dark:hover:bg-gray-700/60\"\n onClick={() => onToggleColumnVisibility(col.index)}\n >\n <span\n aria-hidden=\"true\"\n className={`flex h-4 w-4 shrink-0 items-center justify-center rounded transition-colors ${\n col.visible\n ? 'bg-blue-600 text-white'\n : 'border border-gray-300 bg-white dark:border-gray-500 dark:bg-gray-700'\n }`}\n >\n {col.visible && <Check size={11} weight=\"bold\" />}\n </span>\n <span className=\"truncate\">{col.header}</span>\n </button>\n ))}\n </PopoverPanel>\n </Popover>\n\n {/* Copy table */}\n {onCopyTable && (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`flex cursor-pointer items-center gap-1 rounded-md border px-2 py-1 text-xs transition-colors ${\n copied\n ? 'border-green-300 bg-green-50 text-green-700 dark:border-green-600 dark:bg-green-900/20 dark:text-green-400'\n : 'border-gray-300 text-gray-600 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-800'\n }`}\n aria-label={t('BiChat.DataTable.CopyTable')}\n >\n {copied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} />}\n <span>{copied ? t('BiChat.Message.Copied') : t('BiChat.DataTable.Copy')}</span>\n </button>\n )}\n\n {/* Expand/collapse */}\n {onToggleFullscreen && (\n <button\n type=\"button\"\n onClick={onToggleFullscreen}\n className=\"flex cursor-pointer items-center gap-1 rounded-md border border-gray-300 px-2 py-1 text-xs text-gray-600 transition-colors hover:bg-gray-50 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-800\"\n aria-label={isFullscreen ? t('BiChat.DataTable.Collapse') : t('BiChat.DataTable.Expand')}\n >\n {isFullscreen ? <ArrowsIn size={14} /> : <ArrowsOut size={14} />}\n <span>{isFullscreen ? t('BiChat.DataTable.Collapse') : t('BiChat.DataTable.Expand')}</span>\n </button>\n )}\n\n {/* Sort indicator pill */}\n {sort && onClearSort && (\n <span className=\"inline-flex items-center gap-1 rounded-full border border-blue-200 bg-blue-50 px-2 py-0.5 text-xs text-blue-700 dark:border-blue-700 dark:bg-blue-900/20 dark:text-blue-400\">\n <span>{t('BiChat.DataTable.SortedBy', { column: columns.find((c) => c.index === sort.columnIndex)?.header ?? '' })}</span>\n {sort.direction === 'asc' ? <CaretUp size={10} weight=\"bold\" /> : <CaretDown size={10} weight=\"bold\" />}\n <button\n type=\"button\"\n onClick={onClearSort}\n className=\"ml-0.5 cursor-pointer rounded-full p-0.5 hover:bg-blue-200 dark:hover:bg-blue-800\"\n aria-label={t('BiChat.DataTable.ClearSort')}\n >\n <X size={10} />\n </button>\n </span>\n )}\n </div>\n );\n});\n","import { memo } from 'react';\nimport type { ColumnMeta, ColumnStats } from '../hooks/useDataTable';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DataTableFooterProps {\n visibleColumns: ColumnMeta[]\n stats: Map<number, ColumnStats>\n showRowNumbers?: boolean\n}\n\nfunction formatStat(value: number): string {\n return new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }).format(value);\n}\n\ninterface StatRowProps {\n label: string\n visibleColumns: ColumnMeta[]\n stats: Map<number, ColumnStats>\n getValue: (s: ColumnStats) => number\n showRowNumbers?: boolean\n odd?: boolean\n}\n\nconst StatRow = memo(function StatRow({\n label,\n visibleColumns,\n stats,\n getValue,\n showRowNumbers,\n odd,\n}: StatRowProps) {\n const zebra = odd ? 'bg-gray-100 dark:bg-gray-800' : 'bg-gray-50 dark:bg-gray-900';\n return (\n <tr className={zebra}>\n <td\n colSpan={showRowNumbers ? 2 : 1}\n className={`sticky left-0 z-20 px-3 py-1.5 text-left text-xs font-medium text-gray-500 dark:text-gray-400 select-none ${zebra}`}\n >\n {label}\n </td>\n {visibleColumns.map((col, colIdx) => {\n if (colIdx === 0 && showRowNumbers) {return null;}\n const s = stats.get(col.index);\n return (\n <td\n key={col.index}\n className={`px-3 py-1.5 text-xs ${\n col.type === 'number' ? 'text-right' : 'text-left'\n } text-gray-600 dark:text-gray-300`}\n >\n {s ? (\n <span className=\"font-mono tabular-nums font-medium\">\n {formatStat(getValue(s))}\n </span>\n ) : null}\n </td>\n );\n })}\n </tr>\n );\n});\n\nexport const DataTableFooter = memo(function DataTableFooter({\n visibleColumns,\n stats,\n showRowNumbers,\n}: DataTableFooterProps) {\n const { t } = useTranslation();\n\n if (stats.size === 0) {return null;}\n\n return (\n <tfoot className=\"sticky bottom-0 z-10 border-t-2 border-gray-300 dark:border-gray-600\">\n <StatRow\n label={t('BiChat.DataTable.StatsSum')}\n visibleColumns={visibleColumns}\n stats={stats}\n getValue={(s) => s.sum}\n showRowNumbers={showRowNumbers}\n />\n <StatRow\n label={t('BiChat.DataTable.StatsAvg')}\n visibleColumns={visibleColumns}\n stats={stats}\n getValue={(s) => s.avg}\n showRowNumbers={showRowNumbers}\n odd\n />\n <StatRow\n label={t('BiChat.DataTable.StatsMin')}\n visibleColumns={visibleColumns}\n stats={stats}\n getValue={(s) => s.min}\n showRowNumbers={showRowNumbers}\n />\n <StatRow\n label={t('BiChat.DataTable.StatsMax')}\n visibleColumns={visibleColumns}\n stats={stats}\n getValue={(s) => s.max}\n showRowNumbers={showRowNumbers}\n odd\n />\n </tfoot>\n );\n});\n","/**\n * Shadow-DOM-safe fullscreen overlay.\n *\n * Headless UI Dialog portals to document.body which escapes the shadow DOM\n * boundary and loses Tailwind styles. This component stays inline within\n * the shadow tree.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { useModalLock } from '../hooks/useModalLock';\n\ninterface FullscreenOverlayProps {\n title: string\n onClose: () => void\n closeLabel: string\n children: React.ReactNode\n}\n\nexport function FullscreenOverlay({ title, onClose, closeLabel, children }: FullscreenOverlayProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n // Lock background scroll + trap focus inside the panel (and restore it to the\n // trigger on close). Mounted == open for this overlay, so both stay active.\n useModalLock(true);\n useFocusTrap(panelRef, true);\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onCloseRef.current();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, []);\n\n return (\n <div className=\"fixed inset-0\" style={{ zIndex: 99999 }}>\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\"\n onClick={onClose}\n aria-hidden\n />\n {/* Panel */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n tabIndex={-1}\n className=\"absolute inset-4 flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl outline-none dark:border-gray-700 dark:bg-gray-900\"\n >\n <button\n type=\"button\"\n onClick={onClose}\n className=\"absolute right-3 top-3 z-10 cursor-pointer rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n aria-label={closeLabel}\n >\n <X size={18} weight=\"bold\" />\n </button>\n {children}\n </div>\n </div>\n );\n}\n","/**\n * TabbedTableGroup — wraps multiple InteractiveTableCards behind a tab bar.\n *\n * When an assistant turn produces 2+ tables, this component replaces the\n * default vertical stack with a compact tabbed card that occupies 1x space.\n *\n * Tables are rendered once and never remount — the wrapper toggles between\n * inline and fullscreen CSS so useDataTable state (search, sort, page) is\n * preserved across all transitions.\n */\n\nimport { useState, useMemo, useCallback, useEffect, useRef, memo } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport type { RenderTableData } from '../types';\nimport type { TableCardHost } from './InteractiveTableCard';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { TabBar } from './TabBar';\nimport { InteractiveTableCard } from './InteractiveTableCard';\n\nexport interface TabbedTableGroupProps {\n tables: RenderTableData[]\n onSendMessage?: (content: string) => void\n sendDisabled?: boolean\n}\n\nconst INLINE_CLASS = 'w-full min-w-0 rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40 overflow-hidden';\nconst FULLSCREEN_CLASS = 'fixed inset-4 flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900';\n\nexport const TabbedTableGroup = memo(function TabbedTableGroup({\n tables,\n onSendMessage,\n sendDisabled = false,\n}: TabbedTableGroupProps) {\n const { t } = useTranslation();\n const [activeTabId, setActiveTabId] = useState(tables[0]?.id ?? '');\n const [isFullscreen, setIsFullscreen] = useState(false);\n const containerRef = useRef<HTMLElement>(null);\n\n const toggleFullscreen = useCallback(() => setIsFullscreen((v) => !v), []);\n\n // Escape key + focus management for fullscreen\n useEffect(() => {\n if (!isFullscreen) {return;}\n containerRef.current?.focus();\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n setIsFullscreen(false);\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [isFullscreen]);\n\n const tabs = useMemo(\n () =>\n tables.map((table, i) => ({\n id: table.id,\n label: `${table.title || `${t('BiChat.Table.QueryResults')} ${i + 1}`} (${Math.max(table.totalRows || 0, table.rows.length)})`,\n })),\n [tables, t],\n );\n\n const host = useMemo<TableCardHost>(\n () => ({ onToggleFullscreen: toggleFullscreen, isFullscreen }),\n [toggleFullscreen, isFullscreen],\n );\n\n // Guard against empty or stale activeTabId\n const resolvedActiveId = tabs.some((tab) => tab.id === activeTabId)\n ? activeTabId\n : tabs[0]?.id ?? '';\n\n if (tables.length === 0) {return null;}\n\n return (\n <>\n {/* Backdrop — only when fullscreen */}\n {isFullscreen && (\n <div\n className=\"fixed inset-0 bg-black/60 backdrop-blur-sm\"\n style={{ zIndex: 99998 }}\n onClick={toggleFullscreen}\n aria-hidden\n />\n )}\n\n <section\n ref={containerRef}\n tabIndex={isFullscreen ? -1 : undefined}\n className={isFullscreen ? FULLSCREEN_CLASS : INLINE_CLASS}\n style={isFullscreen ? { zIndex: 99999 } : undefined}\n >\n {/* Close button — fullscreen only */}\n {isFullscreen && (\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n className=\"absolute right-3 top-3 z-10 cursor-pointer rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n aria-label={t('BiChat.DataTable.Collapse')}\n >\n <X size={18} weight=\"bold\" />\n </button>\n )}\n\n <TabBar\n tabs={tabs}\n activeTab={resolvedActiveId}\n onTabChange={setActiveTabId}\n compact={isFullscreen}\n />\n\n {tables.map((table) => {\n const isActive = table.id === resolvedActiveId;\n return (\n <div\n key={table.id}\n id={`${table.id}-panel`}\n role=\"tabpanel\"\n aria-labelledby={table.id}\n hidden={!isActive}\n className={isActive && isFullscreen ? 'flex-1 flex flex-col min-h-0' : isActive ? undefined : 'hidden'}\n >\n <InteractiveTableCard\n table={table}\n onSendMessage={onSendMessage}\n sendDisabled={sendDisabled}\n host={host}\n />\n </div>\n );\n })}\n </section>\n </>\n );\n});\n","/**\n * TabBar Component\n * Horizontal tabs with animated indicator for switching between views\n * Generic: accepts any set of tabs via props\n */\n\nimport { memo, useId, useRef, useCallback } from 'react';\nimport { motion } from 'framer-motion';\n\ninterface TabBarProps {\n tabs: Array<{ id: string; label: string }>\n activeTab: string\n onTabChange: (tabId: string) => void\n /** Tighter padding for space-constrained contexts like fullscreen overlays. */\n compact?: boolean\n}\n\nfunction TabBar({ tabs, activeTab, onTabChange, compact = false }: TabBarProps) {\n const instanceId = useId();\n const tablistRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const currentIndex = tabs.findIndex((tab) => tab.id === activeTab);\n if (currentIndex < 0) {return;}\n\n let nextIndex: number | null = null;\n\n switch (e.key) {\n case 'ArrowRight':\n e.preventDefault();\n nextIndex = (currentIndex + 1) % tabs.length;\n break;\n case 'ArrowLeft':\n e.preventDefault();\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n break;\n case 'Home':\n e.preventDefault();\n nextIndex = 0;\n break;\n case 'End':\n e.preventDefault();\n nextIndex = tabs.length - 1;\n break;\n }\n\n if (nextIndex !== null) {\n onTabChange(tabs[nextIndex].id);\n // Focus the newly activated tab button\n const tablist = tablistRef.current;\n if (tablist) {\n const buttons = tablist.querySelectorAll<HTMLElement>('[role=\"tab\"]');\n buttons[nextIndex]?.focus();\n }\n }\n },\n [tabs, activeTab, onTabChange]\n );\n\n if (tabs.length === 0) {\n return null;\n }\n\n return (\n <div\n ref={tablistRef}\n className={`flex justify-center gap-1 border-b border-gray-200 dark:border-gray-700 ${compact ? 'px-3 pt-2 pb-1' : 'px-4 pt-4 pb-2'}`}\n role=\"tablist\"\n onKeyDown={handleKeyDown}\n >\n {tabs.map((tab) => (\n <TabButton\n key={tab.id}\n id={tab.id}\n label={tab.label}\n isActive={activeTab === tab.id}\n onClick={() => onTabChange(tab.id)}\n layoutId={instanceId + '-tab'}\n compact={compact}\n />\n ))}\n </div>\n );\n}\n\ninterface TabButtonProps {\n id: string\n label: string\n isActive: boolean\n onClick: () => void\n layoutId: string\n compact?: boolean\n}\n\nfunction TabButton({ id, label, isActive, onClick, layoutId, compact }: TabButtonProps) {\n return (\n <button\n id={id}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`${id}-panel`}\n tabIndex={isActive ? 0 : -1}\n onClick={onClick}\n className={`\n cursor-pointer relative rounded-t-lg font-medium transition-smooth focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n ${compact ? 'px-3 py-1.5 text-xs' : 'px-4 py-2 text-sm'}\n ${\n isActive\n ? 'text-primary-700 dark:text-primary-400'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'\n }\n `}\n >\n {label}\n\n {/* Active indicator */}\n {isActive && (\n <motion.div\n layoutId={layoutId}\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary-600 dark:bg-primary-500\"\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n />\n )}\n </button>\n );\n}\n\nconst MemoizedTabBar = memo(TabBar);\nMemoizedTabBar.displayName = 'TabBar';\n\nexport { MemoizedTabBar as TabBar };\nexport default MemoizedTabBar;\n","/**\n * TabbedChartGroup — wraps multiple ChartCards behind a tab bar.\n *\n * When an assistant turn produces 2+ charts, this component replaces the\n * default vertical stack with a compact tabbed card that occupies 1x space.\n *\n * Charts are rendered once and never remount — the wrapper toggles between\n * inline and fullscreen CSS so ApexCharts state is preserved across all\n * transitions.\n */\n\nimport { useState, useMemo, useCallback, useEffect, useRef, memo } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport type { ChartData } from '../types';\nimport type { ChartCardHost } from './ChartCard';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { TabBar } from './TabBar';\nimport { ChartCard } from './ChartCard';\n\nexport interface TabbedChartGroupProps {\n charts: ChartData[]\n}\n\nconst INLINE_CLASS = 'w-full min-w-0 rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40 overflow-hidden';\nconst FULLSCREEN_CLASS = 'fixed inset-4 flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900';\n\nexport const TabbedChartGroup = memo(function TabbedChartGroup({\n charts,\n}: TabbedChartGroupProps) {\n const { t } = useTranslation();\n const [activeTabId, setActiveTabId] = useState('chart-0');\n const [isFullscreen, setIsFullscreen] = useState(false);\n const containerRef = useRef<HTMLElement>(null);\n const fullscreenTriggerRef = useRef<HTMLElement | null>(null);\n\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen((v) => {\n if (!v) {\n fullscreenTriggerRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }\n return !v;\n });\n }, []);\n\n // Escape key + focus management for fullscreen\n useEffect(() => {\n if (!isFullscreen) {return;}\n containerRef.current?.focus();\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n setIsFullscreen(false);\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [isFullscreen]);\n\n // Restore focus to trigger when exiting fullscreen\n useEffect(() => {\n if (!isFullscreen && fullscreenTriggerRef.current) {\n const el = fullscreenTriggerRef.current;\n fullscreenTriggerRef.current = null;\n if (typeof el.focus === 'function') {el.focus();}\n }\n }, [isFullscreen]);\n\n const tabs = useMemo(\n () =>\n charts.map((chart, i) => ({\n id: `chart-${i}`,\n label: chart.title || `${t('BiChat.Chart.Title')} ${i + 1}`,\n })),\n [charts, t],\n );\n\n const host = useMemo<ChartCardHost>(\n () => ({ isFullscreen }),\n [isFullscreen],\n );\n\n // Guard against stale activeTabId\n const resolvedActiveId = tabs.some((tab) => tab.id === activeTabId)\n ? activeTabId\n : tabs[0]?.id ?? '';\n\n if (charts.length === 0) {return null;}\n\n return (\n <>\n {/* Backdrop — only when fullscreen */}\n {isFullscreen && (\n <div\n className=\"fixed inset-0 bg-black/60 backdrop-blur-sm\"\n style={{ zIndex: 99998 }}\n onClick={toggleFullscreen}\n aria-hidden\n />\n )}\n\n <section\n ref={containerRef}\n tabIndex={isFullscreen ? -1 : undefined}\n className={isFullscreen ? FULLSCREEN_CLASS : INLINE_CLASS}\n style={isFullscreen ? { zIndex: 99999 } : undefined}\n >\n {/* Close button — fullscreen only */}\n {isFullscreen && (\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n className=\"absolute right-3 top-3 z-10 cursor-pointer rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n aria-label={t('BiChat.DataTable.Collapse')}\n >\n <X size={18} weight=\"bold\" />\n </button>\n )}\n\n <TabBar\n tabs={tabs}\n activeTab={resolvedActiveId}\n onTabChange={setActiveTabId}\n compact={isFullscreen}\n />\n\n {charts.map((chart, i) => {\n const tabId = `chart-${i}`;\n const isActive = tabId === resolvedActiveId;\n return (\n <div\n key={tabId}\n id={`${tabId}-panel`}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n hidden={!isActive}\n className={isActive && isFullscreen ? 'flex-1 flex flex-col min-h-0' : isActive ? undefined : 'hidden'}\n >\n <ChartCard\n chartData={chart}\n host={host}\n />\n </div>\n );\n })}\n </section>\n </>\n );\n});\n","/**\n * SourcesPanel component\n * Grok-inspired collapsible citations panel.\n * Collapsed: compact pill with overlapping domain circles + count.\n * Expanded: card panel with source titles, excerpts, and domain badges.\n */\n\nimport { useState, useCallback } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport type { Citation } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface SourcesPanelProps {\n citations: Citation[]\n}\n\n/* ── Helpers ─────────────────────────────────────────────────────────────── */\n\nfunction extractDomain(url: string): string {\n try {\n return new URL(url).hostname.replace(/^www\\./, '');\n } catch {\n return '';\n }\n}\n\nconst PALETTE = [\n '#c0392b', '#d35400', '#f39c12', '#27ae60',\n '#16a085', '#2980b9', '#8e44ad', '#d63384',\n];\n\nfunction domainColor(domain: string): string {\n let h = 0;\n for (let i = 0; i < domain.length; i++) {h = domain.charCodeAt(i) + ((h << 5) - h);}\n return PALETTE[Math.abs(h) % PALETTE.length];\n}\n\n/* ── Component ───────────────────────────────────────────────────────────── */\n\nexport function SourcesPanel({ citations }: SourcesPanelProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n\n if (!citations?.length) {return null;}\n\n const domains = [...new Set(\n citations.filter(c => c.url).map(c => extractDomain(c.url)).filter(Boolean),\n )];\n const previewDomains = domains.slice(0, 5);\n\n /* ── Collapsed pill ─────────────────────────────────────────────────── */\n if (!isOpen) {\n return (\n <div className=\"mt-3\">\n <button\n type=\"button\"\n onClick={open}\n className=\"cursor-pointer inline-flex items-center gap-2 rounded-full px-3 py-1.5\n bg-gray-50 hover:bg-gray-100 dark:bg-gray-700/50 dark:hover:bg-gray-600/60\n border border-gray-200/70 dark:border-gray-600/40\n transition-colors duration-150\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-primary,theme(colors.blue.500))]/40\"\n >\n {previewDomains.length > 0 && (\n <span className=\"flex -space-x-1.5\">\n {previewDomains.map((domain, i) => (\n <span\n key={domain}\n className=\"relative w-5 h-5 rounded-full flex items-center justify-center text-[8px] font-bold text-white\n ring-2 ring-white dark:ring-gray-800 select-none\"\n style={{ backgroundColor: domainColor(domain), zIndex: previewDomains.length - i }}\n aria-hidden=\"true\"\n >\n {domain[0]?.toUpperCase()}\n </span>\n ))}\n </span>\n )}\n <span className=\"text-xs font-medium text-gray-600 dark:text-gray-300 tabular-nums\">\n {citations.length} {t(citations.length === 1 ? 'BiChat.Sources.Source' : 'BiChat.Sources.Sources')}\n </span>\n </button>\n </div>\n );\n }\n\n /* ── Expanded panel ─────────────────────────────────────────────────── */\n return (\n <div className=\"mt-3 rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/90 shadow-sm overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-gray-100\">\n {t('BiChat.Sources.Title')}\n </span>\n <button\n type=\"button\"\n onClick={close}\n className=\"cursor-pointer flex items-center justify-center w-7 h-7 rounded-full\n text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300\n hover:bg-gray-100 dark:hover:bg-gray-700\n transition-colors duration-150\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-primary)]/40\"\n aria-label={t('BiChat.Sources.Close')}\n >\n <X size={14} weight=\"bold\" />\n </button>\n </div>\n\n {/* Source list */}\n <div className=\"max-h-80 overflow-y-auto\">\n {citations.map((citation, index) => {\n const domain = citation.url ? extractDomain(citation.url) : '';\n\n const cardContent = (\n <>\n <h4 className=\"text-sm font-medium leading-snug text-[var(--bichat-color-accent,theme(colors.blue.600))] dark:text-blue-400\">\n {citation.title || t('BiChat.Sources.SourceN', { n: String(index + 1) })}\n </h4>\n {citation.excerpt && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400 line-clamp-2 leading-relaxed\">\n {citation.excerpt}\n </p>\n )}\n {domain && (\n <div className=\"flex items-center gap-1.5 mt-1.5\">\n <span\n className=\"w-4 h-4 rounded-full flex items-center justify-center text-[7px] font-bold text-white flex-shrink-0 select-none\"\n style={{ backgroundColor: domainColor(domain) }}\n aria-hidden=\"true\"\n >\n {domain[0]?.toUpperCase()}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate\">\n {domain}\n </span>\n </div>\n )}\n </>\n );\n\n const cardClass = 'block px-4 py-3 border-t border-gray-100 dark:border-gray-700/50';\n\n if (citation.url) {\n return (\n <a\n key={citation.id}\n href={citation.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${cardClass} hover:bg-gray-50 dark:hover:bg-gray-700/40 transition-colors duration-100\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--bichat-primary)]/40`}\n >\n {cardContent}\n </a>\n );\n }\n\n return (\n <div key={citation.id} className={cardClass}>\n {cardContent}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * DownloadCard component\n * File-download card for artifacts (Excel, PDF)\n * with type-specific icon, metadata, and download action.\n */\n\nimport { DownloadSimple } from '@phosphor-icons/react';\nimport type { Artifact } from '../types';\nimport { getFileVisual } from '../utils/fileUtils';\n\ninterface DownloadCardProps {\n artifact: Artifact\n}\n\nconst MIME_BY_TYPE: Record<string, string> = {\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n pdf: 'application/pdf',\n};\n\nexport function DownloadCard({ artifact }: DownloadCardProps) {\n const { type, filename, url, sizeReadable, rowCount, description } = artifact;\n const visual = getFileVisual(MIME_BY_TYPE[type], filename);\n const Icon = visual.icon;\n\n return (\n <a\n href={url}\n download={filename}\n className={[\n 'group/dl flex items-center gap-2.5 rounded-xl',\n 'border border-gray-200/80 dark:border-gray-700/60',\n 'bg-white dark:bg-gray-800/60',\n 'px-2.5 py-2',\n 'transition-all duration-150',\n 'hover:border-gray-300 dark:hover:border-gray-600',\n 'hover:shadow-sm',\n 'hover:-translate-y-px active:translate-y-0',\n ].join(' ')}\n >\n {/* File type icon */}\n <div className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor}`}>\n <Icon size={20} weight=\"duotone\" className={visual.iconColor} />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n {filename}\n </span>\n <span className=\"flex-shrink-0 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider rounded bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400\">\n {visual.label}\n </span>\n </div>\n {(sizeReadable || rowCount !== undefined) && (\n <div className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n {sizeReadable && <span>{sizeReadable}</span>}\n {sizeReadable && rowCount !== undefined && (\n <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n )}\n {rowCount !== undefined && (\n <span>{rowCount.toLocaleString()} rows</span>\n )}\n </div>\n )}\n {description && (\n <p className=\"mt-0.5 text-[11px] text-gray-400 dark:text-gray-500 line-clamp-1\">\n {description}\n </p>\n )}\n </div>\n\n {/* Download arrow */}\n <div className=\"flex-shrink-0 p-1 text-gray-400 dark:text-gray-500 group-hover/dl:text-gray-600 dark:group-hover/dl:text-gray-300 transition-colors duration-150\">\n <DownloadSimple\n size={16}\n weight=\"bold\"\n className=\"transition-transform duration-200 group-hover/dl:translate-y-0.5\"\n />\n </div>\n </a>\n );\n}\n","/**\n * InlineQuestionForm component\n * Handles HITL (Human-in-the-Loop) questions from the AI agent\n *\n * Supports multiple questions with multi-step navigation:\n * - SINGLE_CHOICE: Clickable option cards (radio) + always-present \"Other\" text input\n * - MULTIPLE_CHOICE: Clickable option cards (checkbox) + always-present \"Other\" text input\n */\n\nimport { useState, useCallback } from \"react\";\nimport {\n ArrowLeft,\n ArrowRight,\n Check,\n ChatCircleDots,\n PencilSimpleLine,\n PaperPlaneTilt,\n X,\n} from \"@phosphor-icons/react\";\nimport { PendingQuestion, QuestionAnswers } from \"../types\";\nimport { useChatMessaging } from \"../context/ChatContext\";\nimport { useTranslation } from \"../hooks/useTranslation\";\n\ninterface InlineQuestionFormProps {\n pendingQuestion: PendingQuestion;\n}\n\nexport function InlineQuestionForm({\n pendingQuestion,\n}: InlineQuestionFormProps) {\n const { handleSubmitQuestionAnswers, handleRejectPendingQuestion, loading } =\n useChatMessaging();\n const { t } = useTranslation();\n const [currentStep, setCurrentStep] = useState(0);\n const [answers, setAnswers] = useState<QuestionAnswers>({});\n const [otherTexts, setOtherTexts] = useState<Record<string, string>>({});\n\n const questions = Array.isArray(pendingQuestion.questions)\n ? pendingQuestion.questions\n : [];\n const currentQuestion = questions[currentStep];\n const isLastStep = currentStep === questions.length - 1;\n const isFirstStep = currentStep === 0;\n const totalSteps = questions.length;\n const isFailedRetry =\n pendingQuestion.status === \"ANSWER_RESUME_FAILED\" ||\n pendingQuestion.status === \"REJECT_RESUME_FAILED\";\n\n // Get current answer for the current question\n const currentAnswer = answers[currentQuestion?.id];\n const currentOtherText = otherTexts[currentQuestion?.id] || \"\";\n\n const handleOptionChange = useCallback(\n (optionID: string, checked: boolean) => {\n if (!currentQuestion) {\n return;\n }\n const questionId = currentQuestion.id;\n const existingAnswer = answers[questionId] || { options: [] };\n const isOtherOption = optionID === \"__other__\";\n const isMultiSelect = currentQuestion.type === \"MULTIPLE_CHOICE\";\n\n // \"Other\" is mutually exclusive with predefined options.\n if (isOtherOption) {\n setAnswers({\n ...answers,\n [questionId]: {\n options: [],\n customText: checked ? currentOtherText : undefined,\n },\n });\n return;\n }\n\n let newOptions: string[];\n if (isMultiSelect) {\n // Multi-select: toggle option\n if (!checked) {\n newOptions = existingAnswer.options.filter((o) => o !== optionID);\n } else if (existingAnswer.options.includes(optionID)) {\n newOptions = existingAnswer.options;\n } else {\n newOptions = [...existingAnswer.options, optionID];\n }\n } else {\n // Single-select: replace selection (radio)\n newOptions = checked ? [optionID] : [];\n }\n\n setAnswers({\n ...answers,\n [questionId]: {\n options: newOptions,\n customText: undefined,\n },\n });\n },\n [currentQuestion, answers, currentOtherText],\n );\n\n const handleOtherTextChange = useCallback(\n (text: string) => {\n if (!currentQuestion) {\n return;\n }\n const questionId = currentQuestion.id;\n setOtherTexts({ ...otherTexts, [questionId]: text });\n\n // Update the answer with custom text (\"Other\" is selected when customText is set)\n setAnswers({\n ...answers,\n [questionId]: {\n options: [],\n customText: text,\n },\n });\n },\n [currentQuestion, answers, otherTexts],\n );\n\n const isCurrentAnswerValid = (): boolean => {\n if (!currentQuestion) {\n return false;\n }\n\n const answer = answers[currentQuestion.id];\n const required = currentQuestion.required ?? true;\n\n if (!answer) {\n return !required;\n }\n\n const hasOptionSelection = answer.options.length > 0;\n const hasOtherSelected = answer.customText !== undefined;\n const hasOtherText = (answer.customText?.trim().length ?? 0) > 0;\n\n if (!hasOptionSelection && !hasOtherSelected) {\n return !required;\n }\n\n if (hasOptionSelection) {\n return true;\n }\n\n // \"Other\" selected: require non-empty text if required\n return !required || hasOtherText;\n };\n\n const handleNext = () => {\n if (!isCurrentAnswerValid()) {\n return;\n }\n\n if (isLastStep) {\n handleSubmitQuestionAnswers(answers);\n } else {\n setCurrentStep(currentStep + 1);\n }\n };\n\n const handleBack = () => {\n if (!isFirstStep) {\n setCurrentStep(currentStep - 1);\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n handleNext();\n };\n\n if (!currentQuestion) {\n return (\n <div className=\"animate-slide-up rounded-2xl border border-amber-200 dark:border-amber-700/50 bg-gradient-to-b from-amber-50/70 to-white dark:from-amber-950/20 dark:to-gray-900/80 shadow-sm overflow-hidden p-4\">\n <p className=\"text-sm font-medium text-gray-800 dark:text-gray-200\">\n {t(\"BiChat.Error.SomethingWentWrong\")}\n </p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n {t(\"BiChat.Error.UnexpectedError\")}\n </p>\n <div className=\"mt-3\">\n <button\n type=\"button\"\n onClick={handleRejectPendingQuestion}\n disabled={loading}\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-lg bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-40\"\n >\n <X size={14} weight=\"bold\" />\n {t(\"BiChat.InlineQuestion.Dismiss\")}\n </button>\n </div>\n </div>\n );\n }\n\n const isMultiSelect = currentQuestion.type === \"MULTIPLE_CHOICE\";\n const options = (currentQuestion.options || [])\n .filter((option) => Boolean(option && typeof option.label === \"string\"))\n .map((option, index) => ({\n id: option.id || `${currentQuestion.id}-option-${index}`,\n label: option.label,\n value:\n option.value || option.id || `${currentQuestion.id}-option-${index}`,\n }));\n const isOtherSelected = currentAnswer?.customText !== undefined;\n const canProceed = isCurrentAnswerValid();\n\n return (\n <div className=\"animate-slide-up rounded-2xl border border-gray-200 dark:border-gray-700/50 bg-gradient-to-b from-primary-50/80 to-white dark:from-primary-950/30 dark:to-gray-900/80 shadow-sm overflow-hidden\">\n <form onSubmit={handleSubmit}>\n {/* Header bar */}\n <div className=\"flex items-center gap-2.5 px-4 pt-4 pb-3\">\n <div className=\"flex items-center justify-center w-7 h-7 rounded-lg bg-primary-100 dark:bg-primary-900/40\">\n <ChatCircleDots\n className=\"w-4 h-4 text-primary-600 dark:text-primary-400\"\n weight=\"fill\"\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-primary-600 dark:text-primary-400\">\n {t(\"BiChat.InlineQuestion.InputNeeded\")}\n </span>\n {totalSteps > 1 && (\n <span className=\"text-[11px] tabular-nums text-gray-400 dark:text-gray-500\">\n {currentStep + 1}/{totalSteps}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleRejectPendingQuestion}\n disabled={loading}\n className=\"cursor-pointer p-1 rounded-md text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors disabled:opacity-40\"\n aria-label={t(\"BiChat.InlineQuestion.Dismiss\")}\n >\n <X size={16} weight=\"bold\" />\n </button>\n </div>\n\n {isFailedRetry && (\n <div className=\"mx-4 mb-3 rounded-xl border border-amber-200 dark:border-amber-700/40 bg-amber-50/80 dark:bg-amber-950/20 px-3 py-2\">\n <p className=\"text-xs font-medium text-amber-800 dark:text-amber-300\">\n Continuing after your last response failed.\n </p>\n <p className=\"mt-1 text-xs text-amber-700/80 dark:text-amber-200/80\">\n Review the answer and submit again, or dismiss the question if you\n want to skip it.\n </p>\n </div>\n )}\n\n {/* Progress dots for multi-step */}\n {totalSteps > 1 && (\n <div className=\"flex items-center gap-1.5 px-4 pb-3\">\n {questions.map((_, index) => {\n const isCompleted = index < currentStep;\n const isCurrent = index === currentStep;\n return (\n <div\n key={index}\n className={[\n \"h-1 rounded-full transition-all duration-300\",\n isCurrent\n ? \"flex-[2] bg-primary-500 dark:bg-primary-400\"\n : \"flex-1\",\n isCompleted\n ? \"bg-primary-400 dark:bg-primary-500\"\n : !isCurrent\n ? \"bg-gray-200 dark:bg-gray-700\"\n : \"\",\n ].join(\" \")}\n />\n );\n })}\n </div>\n )}\n\n {/* Question text */}\n <div className=\"px-4 pb-3\">\n <p className=\"text-[15px] leading-relaxed text-gray-800 dark:text-gray-200\">\n {currentQuestion.text}\n </p>\n {isMultiSelect && (\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n {t(\"BiChat.InlineQuestion.SelectAllThatApply\")}\n </p>\n )}\n </div>\n\n {/* Options as clickable cards */}\n <div className=\"px-4 pb-2 space-y-1.5\">\n {options.map((option) => {\n const isSelected =\n currentAnswer?.options.includes(option.id) || false;\n return (\n <label\n key={option.id}\n className={[\n \"group/opt flex items-center gap-3 px-3 py-2.5 rounded-xl cursor-pointer\",\n \"border transition-all duration-150\",\n isSelected\n ? \"border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 shadow-sm\"\n : \"border-transparent hover:border-gray-200 dark:hover:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800/50\",\n ].join(\" \")}\n >\n {/* Custom indicator */}\n <span\n className={[\n \"flex-shrink-0 flex items-center justify-center w-5 h-5 transition-all duration-150\",\n isMultiSelect ? \"rounded-md\" : \"rounded-full\",\n isSelected\n ? \"bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 text-white shadow-sm\"\n : \"border-2 border-gray-300 dark:border-gray-600 group-hover/opt:border-gray-400 dark:group-hover/opt:border-gray-500\",\n ].join(\" \")}\n >\n {isSelected && <Check size={12} weight=\"bold\" />}\n </span>\n <input\n type={isMultiSelect ? \"checkbox\" : \"radio\"}\n name={`question-${currentQuestion.id}`}\n value={option.value}\n checked={isSelected}\n onChange={(e) =>\n handleOptionChange(option.id, e.target.checked)\n }\n className=\"sr-only\"\n />\n <span\n className={[\n \"text-sm transition-colors duration-150\",\n isSelected\n ? \"text-gray-900 dark:text-gray-100 font-medium\"\n : \"text-gray-700 dark:text-gray-300\",\n ].join(\" \")}\n >\n {option.label}\n </span>\n </label>\n );\n })}\n\n {/* \"Other\" option */}\n <label\n className={[\n \"group/opt flex items-center gap-3 px-3 py-2.5 rounded-xl cursor-pointer\",\n \"border transition-all duration-150\",\n isOtherSelected\n ? \"border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 shadow-sm\"\n : \"border-transparent hover:border-gray-200 dark:hover:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800/50\",\n ].join(\" \")}\n >\n <span\n className={[\n \"flex-shrink-0 flex items-center justify-center w-5 h-5 transition-all duration-150\",\n isMultiSelect ? \"rounded-md\" : \"rounded-full\",\n isOtherSelected\n ? \"bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 text-white shadow-sm\"\n : \"border-2 border-gray-300 dark:border-gray-600 group-hover/opt:border-gray-400 dark:group-hover/opt:border-gray-500\",\n ].join(\" \")}\n >\n {isOtherSelected && <PencilSimpleLine size={11} weight=\"bold\" />}\n </span>\n <input\n type={isMultiSelect ? \"checkbox\" : \"radio\"}\n name={`question-${currentQuestion.id}`}\n value=\"__other__\"\n checked={isOtherSelected}\n onChange={(e) =>\n handleOptionChange(\"__other__\", e.target.checked)\n }\n className=\"sr-only\"\n />\n <span\n className={[\n \"text-sm transition-colors duration-150\",\n isOtherSelected\n ? \"text-gray-900 dark:text-gray-100 font-medium\"\n : \"text-gray-700 dark:text-gray-300\",\n ].join(\" \")}\n >\n {t(\"BiChat.InlineQuestion.OtherOption\")}\n </span>\n </label>\n\n {/* Other text input — always visible, typing auto-selects \"Other\" */}\n <div className=\"pl-8 pr-1 pb-1\">\n <input\n type=\"text\"\n value={currentOtherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n placeholder={t(\"BiChat.InlineQuestion.TypeYourAnswer\")}\n className=\"w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500/40 focus:border-primary-400 dark:focus:border-primary-600 transition-shadow\"\n />\n </div>\n </div>\n\n {/* Footer with navigation */}\n <div className=\"flex items-center justify-between gap-2 px-4 pt-2 pb-4\">\n <div>\n {!isFirstStep && (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"cursor-pointer flex items-center gap-1 px-2.5 py-1.5 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\n >\n <ArrowLeft size={14} weight=\"bold\" />\n {t(\"BiChat.InlineQuestion.Back\")}\n </button>\n )}\n </div>\n\n <button\n type=\"submit\"\n disabled={loading || !canProceed}\n className={[\n \"flex items-center gap-1.5 px-4 py-2 text-sm font-medium rounded-xl transition-all duration-150\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2\",\n canProceed\n ? \"cursor-pointer bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm hover:shadow\"\n : \"bg-gray-100 dark:bg-gray-800 text-gray-400 dark:text-gray-600 cursor-not-allowed\",\n ].join(\" \")}\n >\n {isLastStep ? (\n <>\n {t(\"BiChat.Submit\")}\n <PaperPlaneTilt size={14} weight=\"fill\" />\n </>\n ) : (\n <>\n {t(\"BiChat.InlineQuestion.Next\")}\n <ArrowRight size={14} weight=\"bold\" />\n </>\n )}\n </button>\n </div>\n </form>\n </div>\n );\n}\n","/**\n * RetryActionArea Component\n * Displays a retry action area inline where the assistant message would appear\n * (typically after an interrupted request or connection loss)\n *\n * Styled to match assistant message positioning (left-aligned) so users see\n * the retry button contextually in the conversation flow.\n */\n\nimport { memo } from 'react';\nimport { motion } from 'framer-motion';\nimport { ArrowClockwise, Warning } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface RetryActionAreaProps {\n /** Callback when retry button is clicked */\n onRetry: () => void\n}\n\nexport const RetryActionArea = memo(function RetryActionArea({\n onRetry,\n}: RetryActionAreaProps) {\n const { t } = useTranslation();\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -6 }}\n transition={{ duration: 0.15 }}\n className=\"flex justify-start\"\n >\n <div\n className=\"flex flex-col gap-2.5 px-4 py-3 rounded-xl border border-gray-200 dark:border-gray-700\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <div className=\"flex items-center gap-2.5\">\n <Warning\n className=\"w-4 h-4 text-amber-500 dark:text-amber-400 flex-shrink-0\"\n weight=\"fill\"\n />\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('BiChat.Retry.Subtitle')}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"self-start inline-flex items-center gap-1.5 px-2.5 py-1 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n >\n <ArrowClockwise size={14} />\n {t('BiChat.Retry.Button')}\n </button>\n </div>\n </motion.div>\n );\n});\n\nexport default RetryActionArea;\n","import type { DebugUsage } from '../types';\n\nexport function formatGenerationDuration(generationMs: number): string {\n return generationMs > 1000 ? `${(generationMs / 1000).toFixed(2)}s` : `${generationMs}ms`;\n}\n\nexport function formatDuration(durationMs: number): string {\n return durationMs > 1000 ? `${(durationMs / 1000).toFixed(2)}s` : `${durationMs}ms`;\n}\n\nexport function calculateCompletionTokensPerSecond(\n usage?: DebugUsage,\n generationMs?: number\n): number | null {\n if (!usage || !generationMs || generationMs <= 0 || usage.completionTokens <= 0) {\n return null;\n }\n\n return usage.completionTokens / (generationMs / 1000);\n}\n\nexport function calculateContextUsagePercent(\n promptTokens: number,\n effectiveMaxTokens?: number\n): number | null {\n if (!effectiveMaxTokens || effectiveMaxTokens <= 0 || promptTokens <= 0) {\n return null;\n }\n\n return (promptTokens / effectiveMaxTokens) * 100;\n}\n","/**\n * DebugPanel Component\n * Debug trace viewer with metric chips, expandable tool calls,\n * and terminal-inspired code blocks.\n *\n * Debug UI is English-only (developer-facing) — no i18n.\n */\n\nimport { useState, useRef, useEffect, useCallback, type ReactNode } from 'react';\nimport {\n Bug,\n Timer,\n Lightning,\n Wrench,\n CaretDown,\n CheckCircle,\n XCircle,\n Copy,\n Check,\n CircleNotch,\n ArrowUp,\n ArrowDown,\n Stack,\n Database,\n ArrowSquareOut,\n} from '@phosphor-icons/react';\nimport type { DebugTrace, StreamToolPayload } from '../types';\nimport { hasMeaningfulUsage, hasDebugTrace } from '../utils/debugTrace';\nimport {\n calculateCompletionTokensPerSecond,\n formatDuration,\n formatGenerationDuration,\n} from '../utils/debugMetrics';\n\nexport interface DebugPanelProps {\n trace?: DebugTrace\n}\n\n// ─── CopyPill ───────────────────────────────────────────────\n\ninterface UseCopyFeedbackResult {\n copied: boolean\n copy: (text: string) => Promise<void>\n}\n\nfunction useCopyFeedback(): UseCopyFeedbackResult {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | number | null>(null);\n\n const copy = useCallback(async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n if (timerRef.current !== null) {window.clearTimeout(timerRef.current);}\n timerRef.current = window.setTimeout(() => {\n setCopied(false);\n timerRef.current = null;\n }, 2000);\n } catch (err) {\n console.error('Copy failed:', err);\n }\n }, []);\n\n useEffect(() => () => {\n if (timerRef.current !== null) {window.clearTimeout(timerRef.current);}\n }, []);\n\n return { copied, copy };\n}\n\nfunction CopyPill({ text }: { text: string }) {\n const { copied, copy } = useCopyFeedback();\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n await copy(text);\n };\n\n return (\n <button\n onClick={handleCopy}\n className={[\n 'flex items-center gap-1 px-2 py-0.5 rounded-md text-[10px] font-medium',\n 'transition-all duration-200',\n copied\n ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-600 dark:text-emerald-400'\n : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700/50',\n ].join(' ')}\n >\n {copied ? <Check size={10} weight=\"bold\" /> : <Copy size={10} />}\n <span>{copied ? 'Copied!' : 'Copy'}</span>\n </button>\n );\n}\n\n// ─── InlineCopyButton ────────────────────────────────────────\n\nfunction InlineCopyButton({ text }: { text: string }) {\n const { copied, copy } = useCopyFeedback();\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n await copy(text);\n };\n\n return (\n <button\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy'}\n className={[\n 'flex-shrink-0 p-1 rounded transition-colors duration-150',\n copied\n ? 'text-emerald-500 dark:text-emerald-400'\n : 'text-gray-300 dark:text-gray-600 hover:text-gray-500 dark:hover:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700/40',\n ].join(' ')}\n >\n {copied ? <Check size={11} weight=\"bold\" /> : <Copy size={11} />}\n </button>\n );\n}\n\n// ─── MetricChip ─────────────────────────────────────────────\n\ninterface MetricChipProps {\n icon: ReactNode\n value: string\n label: string\n}\n\nfunction MetricChip({ icon, value, label }: MetricChipProps) {\n return (\n <span className=\"inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-gray-50 dark:bg-gray-800/40 text-[11px] tabular-nums\">\n {icon}\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{value}</span>\n <span className=\"text-gray-400 dark:text-gray-500\">{label}</span>\n </span>\n );\n}\n\n// ─── ToolCard ───────────────────────────────────────────────\n\nfunction ToolCard({ tool }: { tool: StreamToolPayload }) {\n const [expanded, setExpanded] = useState(false);\n\n const hasResult = !!tool.result && !tool.error;\n const hasError = !!tool.error;\n\n const status = hasError\n ? {\n icon: <XCircle size={12} weight=\"fill\" />,\n pillBg: 'bg-red-50 dark:bg-red-950/30',\n pillText: 'text-red-500 dark:text-red-400',\n borderColor: 'border-l-red-400 dark:border-l-red-500',\n }\n : hasResult\n ? {\n icon: <CheckCircle size={12} weight=\"fill\" />,\n pillBg: 'bg-emerald-50 dark:bg-emerald-950/30',\n pillText: 'text-emerald-500 dark:text-emerald-400',\n borderColor: 'border-l-emerald-400 dark:border-l-emerald-500',\n }\n : {\n icon: <CircleNotch size={12} weight=\"bold\" className=\"animate-spin\" />,\n pillBg: 'bg-gray-100 dark:bg-gray-800',\n pillText: 'text-gray-400 dark:text-gray-500',\n borderColor: 'border-l-gray-300 dark:border-l-gray-600',\n };\n\n return (\n <div\n className={[\n 'rounded-lg overflow-hidden',\n 'border border-gray-200/60 dark:border-gray-700/40',\n 'border-l-2', status.borderColor,\n 'bg-white dark:bg-gray-800/50',\n 'transition-all duration-150',\n ].join(' ')}\n >\n {/* Header */}\n <button\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n aria-label={`${tool.name} — ${hasError ? 'error' : hasResult ? 'success' : 'pending'}`}\n className=\"w-full flex items-center gap-2.5 px-3 py-2.5 hover:bg-gray-50/60 dark:hover:bg-gray-700/20 transition-colors cursor-pointer\"\n >\n {/* Status pill */}\n <span className={`flex items-center justify-center w-5 h-5 rounded-full ${status.pillBg} ${status.pillText}`}>\n {status.icon}\n </span>\n\n {/* Tool name */}\n <span className=\"flex-1 min-w-0 text-left font-mono text-xs font-medium text-gray-800 dark:text-gray-200 truncate\">\n {tool.name}\n </span>\n\n {/* Duration chip */}\n {tool.durationMs !== undefined && (\n <span className=\"flex-shrink-0 px-2 py-0.5 rounded-full bg-gray-100 dark:bg-gray-700/60 text-[10px] font-mono font-medium text-gray-500 dark:text-gray-400 tabular-nums\">\n {formatDuration(tool.durationMs)}\n </span>\n )}\n\n {/* Chevron */}\n <CaretDown\n size={12}\n weight=\"bold\"\n className={[\n 'flex-shrink-0 text-gray-300 dark:text-gray-600',\n 'transition-transform duration-200',\n expanded ? 'rotate-180' : '',\n ].join(' ')}\n />\n </button>\n\n {/* Expandable content — CSS grid animation for smooth height */}\n <div\n className={[\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n ].join(' ')}\n >\n <div className=\"overflow-hidden min-h-0\">\n <div className=\"px-3 pb-3 pt-1 space-y-2\">\n {/* Arguments — terminal-style dark code block */}\n {tool.arguments && (\n <div className=\"rounded-lg bg-[#1a1b26] dark:bg-gray-950 overflow-hidden ring-1 ring-gray-800/10 dark:ring-white/5\">\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-[#1e1f2e] dark:bg-gray-900/80 border-b border-white/5\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-gray-500\">\n Arguments\n </span>\n <CopyPill text={tool.arguments} />\n </div>\n <pre className=\"p-3 text-[11px] font-mono text-gray-300 overflow-x-auto max-h-60 overflow-y-auto whitespace-pre-wrap break-all leading-relaxed\">\n {tool.arguments}\n </pre>\n </div>\n )}\n\n {/* Result — terminal-style dark code block */}\n {tool.result && (\n <div className=\"rounded-lg bg-[#1a1b26] dark:bg-gray-950 overflow-hidden ring-1 ring-gray-800/10 dark:ring-white/5\">\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-[#1e1f2e] dark:bg-gray-900/80 border-b border-white/5\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-gray-500\">\n Result\n </span>\n <CopyPill text={tool.result} />\n </div>\n <pre className=\"p-3 text-[11px] font-mono text-gray-300 overflow-x-auto max-h-60 overflow-y-auto whitespace-pre-wrap break-all leading-relaxed\">\n {tool.result}\n </pre>\n </div>\n )}\n\n {/* Error — red-tinted dark block */}\n {tool.error && (\n <div className=\"rounded-lg bg-red-950/80 dark:bg-red-950/40 overflow-hidden ring-1 ring-red-800/20\">\n <div className=\"px-3 py-1.5 border-b border-red-800/20\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-red-400\">\n Error\n </span>\n </div>\n <pre className=\"p-3 text-[11px] font-mono text-red-300 overflow-x-auto whitespace-pre-wrap break-all leading-relaxed\">\n {tool.error}\n </pre>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── DebugPanel ─────────────────────────────────────────────\n\nexport function DebugPanel({ trace }: DebugPanelProps) {\n const hasData = !!trace && hasDebugTrace(trace);\n const traceID = trace?.traceId?.trim() || '';\n const traceURL = trace?.traceUrl?.trim() || '';\n const safeTraceURL = (() => {\n if (!traceURL) {return '';}\n try {\n const parsed = new URL(traceURL);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {return '';}\n return parsed.toString();\n } catch {\n return '';\n }\n })();\n\n const tokensPerSecond = calculateCompletionTokensPerSecond(trace?.usage, trace?.generationMs);\n\n // Build metric list from available data\n const metrics: MetricChipProps[] = [];\n\n if (hasData && trace) {\n if (trace.generationMs !== undefined) {\n metrics.push({\n icon: <Timer size={12} weight=\"duotone\" className=\"text-amber-500 dark:text-amber-400\" />,\n value: formatGenerationDuration(trace.generationMs),\n label: 'generation',\n });\n }\n if (tokensPerSecond !== null) {\n metrics.push({\n icon: <Lightning size={12} weight=\"fill\" className=\"text-orange-500 dark:text-orange-400\" />,\n value: `${tokensPerSecond.toFixed(1)}/s`,\n label: 'tok/s',\n });\n }\n if (hasMeaningfulUsage(trace.usage) && trace.usage) {\n metrics.push(\n {\n icon: <Stack size={12} weight=\"duotone\" className=\"text-violet-500 dark:text-violet-400\" />,\n value: trace.usage.totalTokens.toLocaleString(),\n label: 'total',\n },\n {\n icon: <ArrowUp size={12} weight=\"bold\" className=\"text-blue-500 dark:text-blue-400\" />,\n value: trace.usage.promptTokens.toLocaleString(),\n label: 'prompt',\n },\n {\n icon: <ArrowDown size={12} weight=\"bold\" className=\"text-indigo-500 dark:text-indigo-400\" />,\n value: trace.usage.completionTokens.toLocaleString(),\n label: 'completion',\n },\n );\n if (trace.usage.cachedTokens !== undefined && trace.usage.cachedTokens > 0) {\n metrics.push({\n icon: <Database size={12} weight=\"duotone\" className=\"text-pink-500 dark:text-pink-400\" />,\n value: trace.usage.cachedTokens.toLocaleString(),\n label: 'cached',\n });\n }\n }\n }\n\n return (\n <div className=\"mt-4 pt-4 border-t border-gray-100 dark:border-gray-700/50\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"flex items-center justify-center w-6 h-6 rounded-lg bg-gray-100 dark:bg-gray-800\">\n <Bug size={14} weight=\"duotone\" className=\"text-gray-500 dark:text-gray-400\" />\n </div>\n <h3 className=\"text-[11px] uppercase tracking-widest font-semibold text-gray-400 dark:text-gray-500\">\n Debug\n </h3>\n </div>\n {hasData && trace && (\n <CopyPill text={JSON.stringify(trace, null, 2)} />\n )}\n </div>\n\n {hasData && trace ? (\n <div className=\"space-y-4\">\n {(traceID || trace.sessionId) && (\n <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/40 px-3 py-2 space-y-1.5\">\n {traceID && (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"flex-shrink-0 text-[10px] uppercase tracking-wider text-gray-400 dark:text-gray-500 w-14\">Trace</span>\n <span className=\"flex-1 min-w-0 font-mono text-[11px] text-gray-700 dark:text-gray-300 truncate\" title={traceID}>{traceID}</span>\n <InlineCopyButton text={traceID} />\n </div>\n )}\n {trace.sessionId && (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"flex-shrink-0 text-[10px] uppercase tracking-wider text-gray-400 dark:text-gray-500 w-14\">Session</span>\n <span className=\"flex-1 min-w-0 font-mono text-[11px] text-gray-700 dark:text-gray-300 truncate\" title={trace.sessionId}>{trace.sessionId}</span>\n <InlineCopyButton text={trace.sessionId} />\n </div>\n )}\n {safeTraceURL && (\n <div className=\"flex items-center gap-2 min-w-0 pt-0.5\">\n <span className=\"flex-shrink-0 w-14\" />\n <a\n href={safeTraceURL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Open in Langfuse\"\n className=\"inline-flex items-center gap-1.5 text-[11px] font-medium text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-150\"\n >\n <ArrowSquareOut size={11} weight=\"bold\" />\n <span>Open in Langfuse</span>\n </a>\n </div>\n )}\n </div>\n )}\n\n {(trace.thinking || trace.observationReason) && (\n <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/40 p-3 space-y-2\">\n {trace.observationReason && (\n <div className=\"text-[11px] text-amber-700 dark:text-amber-300\">\n Observation: <span className=\"font-mono\">{trace.observationReason}</span>\n </div>\n )}\n {trace.thinking && (\n <div>\n <div className=\"text-[10px] uppercase tracking-wider text-gray-500 dark:text-gray-400 mb-1\">Reasoning</div>\n <pre className=\"p-2 rounded bg-gray-100 dark:bg-gray-900 text-[11px] whitespace-pre-wrap break-words text-gray-700 dark:text-gray-200\">\n {trace.thinking}\n </pre>\n </div>\n )}\n </div>\n )}\n\n {((trace.attempts && trace.attempts.length > 0) ||\n (trace.spans && trace.spans.length > 0) ||\n (trace.events && trace.events.length > 0)) && (\n <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/40 p-3 space-y-2\">\n <div className=\"text-[10px] uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n Trace Graph\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {!!trace.attempts?.length && (\n <span className=\"px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-[10px] text-gray-700 dark:text-gray-300\">\n attempts: {trace.attempts.length}\n </span>\n )}\n {!!trace.spans?.length && (\n <span className=\"px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-[10px] text-gray-700 dark:text-gray-300\">\n spans: {trace.spans.length}\n </span>\n )}\n {!!trace.events?.length && (\n <span className=\"px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-[10px] text-gray-700 dark:text-gray-300\">\n events: {trace.events.length}\n </span>\n )}\n </div>\n {trace.attempts?.[trace.attempts.length - 1] && (\n <div className=\"text-[11px] text-gray-700 dark:text-gray-300\">\n {[\n trace.attempts[trace.attempts.length - 1].model,\n trace.attempts[trace.attempts.length - 1].provider,\n trace.attempts[trace.attempts.length - 1].finishReason,\n ]\n .filter(Boolean)\n .join(' • ')}\n </div>\n )}\n </div>\n )}\n\n {/* Metric chips */}\n {metrics.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {metrics.map((m, i) => (\n <MetricChip key={i} {...m} />\n ))}\n </div>\n )}\n\n {/* Tool calls */}\n {trace.tools.length > 0 && (\n <div>\n <div className=\"flex items-center gap-2 mb-2.5\">\n <Wrench size={13} weight=\"duotone\" className=\"text-gray-400 dark:text-gray-500\" />\n <span className=\"text-[11px] font-medium text-gray-500 dark:text-gray-400\">\n Tool Calls\n </span>\n <span className=\"px-1.5 py-0.5 rounded-full bg-gray-100 dark:bg-gray-800 text-[10px] font-mono font-medium text-gray-500 dark:text-gray-400 tabular-nums\">\n {trace.tools.length}\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {trace.tools.map((tool, idx) => (\n <ToolCard key={`${tool.callId || tool.name}-${idx}`} tool={tool} />\n ))}\n </div>\n </div>\n )}\n\n </div>\n ) : (\n <p className=\"text-xs text-gray-400 dark:text-gray-500 italic\">\n Debug info unavailable\n </p>\n )}\n </div>\n );\n}\n\nexport default DebugPanel;\n","import { useCallback, useEffect, useRef, useState, lazy, Suspense } from 'react';\nimport { CaretDown, Check, Copy, ClockCounterClockwise } from '@phosphor-icons/react';\nimport { formatRelativeTime } from '../utils/dateFormatting';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst MarkdownRenderer = lazy(() =>\n import('./MarkdownRenderer').then((module) => ({ default: module.MarkdownRenderer }))\n);\n\nconst COPY_FEEDBACK_MS = 2000;\nconst COLLAPSED_HEIGHT = 160;\n\ninterface SystemMessageProps {\n content: string\n createdAt: string\n onCopy?: (content: string) => Promise<void> | void\n hideActions?: boolean\n hideTimestamp?: boolean\n}\n\nexport function SystemMessage({\n content,\n createdAt,\n onCopy,\n hideActions = false,\n hideTimestamp = false,\n}: SystemMessageProps) {\n const { t } = useTranslation();\n const [isCopied, setIsCopied] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined);\n const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n return () => {\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current);\n copyFeedbackTimeoutRef.current = null;\n }\n };\n }, []);\n\n useEffect(() => {\n const node = contentRef.current;\n if (!node) {return;}\n\n const measure = () => {\n const scrollH = node.scrollHeight;\n setContentHeight(scrollH);\n if (!isExpanded) {\n setIsExpandable(scrollH > COLLAPSED_HEIGHT + 1);\n }\n };\n\n measure();\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }\n\n window.addEventListener('resize', measure);\n return () => window.removeEventListener('resize', measure);\n }, [content, isExpanded]);\n\n const handleCopyClick = useCallback(async () => {\n try {\n if (onCopy) {\n await onCopy(content);\n } else {\n await navigator.clipboard.writeText(content);\n }\n\n setIsCopied(true);\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current);\n }\n copyFeedbackTimeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n copyFeedbackTimeoutRef.current = null;\n }, COPY_FEEDBACK_MS);\n } catch {\n setIsCopied(false);\n }\n }, [content, onCopy]);\n\n const timestamp = formatRelativeTime(createdAt, t);\n\n const resolvedHeight = isExpanded ? contentHeight : COLLAPSED_HEIGHT;\n\n return (\n <div className=\"flex justify-center\">\n <div className=\"w-full max-w-3xl px-2 sm:px-4\">\n <div className=\"relative overflow-hidden rounded-xl border border-gray-200/80 dark:border-gray-700/60 bg-gradient-to-b from-gray-50/80 to-gray-100/40 dark:from-gray-800/40 dark:to-gray-900/30 shadow-[0_1px_3px_rgba(0,0,0,0.04)] dark:shadow-[0_1px_3px_rgba(0,0,0,0.2)]\">\n {/* Top accent line */}\n <div className=\"absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-gray-300/40 dark:via-gray-600/20 to-transparent\" />\n\n {/* Header */}\n <div className=\"flex items-center gap-2 px-4 pt-3 pb-2\">\n <div className=\"flex items-center gap-1.5 text-gray-400 dark:text-gray-500\">\n <ClockCounterClockwise size={13} weight=\"bold\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-wider\">\n {t('BiChat.System.ConversationSummary')}\n </span>\n </div>\n\n <div className=\"flex-1\" />\n\n {!hideActions && !hideTimestamp && (\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500 tabular-nums\">\n {timestamp}\n </span>\n )}\n\n {!hideActions && (\n <button\n onClick={handleCopyClick}\n className={`\n cursor-pointer -mr-1 p-1 rounded-md transition-all duration-150\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n ${isCopied\n ? 'text-green-600 dark:text-green-400'\n : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-200/50 dark:hover:bg-gray-700/40'\n }\n `}\n aria-label={t('BiChat.Message.CopyMessage')}\n title={isCopied ? t('BiChat.Message.Copied') : t('BiChat.Message.Copy')}\n >\n {isCopied ? <Check size={13} weight=\"bold\" /> : <Copy size={13} weight=\"regular\" />}\n </button>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"mx-4 border-t border-gray-200/60 dark:border-gray-700/40\" />\n\n {/* Content area */}\n <div className=\"relative\">\n <div\n ref={contentRef}\n className=\"px-4 pt-3 text-[13px] leading-relaxed text-gray-600 dark:text-gray-400 overflow-hidden transition-[max-height] duration-300 ease-in-out\"\n style={{ maxHeight: resolvedHeight ? `${resolvedHeight}px` : undefined }}\n >\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500 py-2\">\n <div className=\"w-3.5 h-3.5 border-[1.5px] border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n <span className=\"text-xs\">{t('BiChat.System.LoadingSummary')}</span>\n </div>\n }\n >\n <MarkdownRenderer content={content} sendDisabled />\n </Suspense>\n </div>\n\n {/* Fade overlay when collapsed */}\n {isExpandable && !isExpanded && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-20 bg-gradient-to-t from-gray-100/95 via-gray-100/60 to-transparent dark:from-gray-900/95 dark:via-gray-900/50\" />\n )}\n </div>\n\n {/* Expand/collapse toggle */}\n {isExpandable && (\n <div className=\"relative px-4 pb-3 pt-1 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n className=\"cursor-pointer group/toggle inline-flex items-center gap-1 px-3 py-1 rounded-full text-[11px] font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-200/60 dark:hover:bg-gray-700/50 transition-colors duration-150\"\n >\n <span>{isExpanded ? t('BiChat.System.ShowLess') : t('BiChat.System.ShowMore')}</span>\n <CaretDown\n size={11}\n weight=\"bold\"\n className={`transition-transform duration-300 ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n </div>\n )}\n\n {/* Bottom spacing when not expandable */}\n {!isExpandable && <div className=\"pb-3\" />}\n </div>\n </div>\n </div>\n );\n}\n\nexport default SystemMessage;\n","/**\n * TurnBubble component (Layer 4 - Backward Compatible)\n * Container for a conversation turn (user message + assistant response)\n *\n * Renders both the user's message and the assistant's response in a single\n * visual grouping. If the assistant hasn't responded yet, only shows user message.\n *\n * For primitive-level control, use Turn from '@iota-uz/sdk/bichat/primitives'\n */\n\nimport { type ReactNode } from 'react';\nimport type { ConversationTurn } from '../types';\nimport { UserTurnView, type UserTurnViewProps } from './UserTurnView';\nimport { AssistantTurnView, type AssistantTurnViewProps } from './AssistantTurnView';\nimport type { UserMessageSlots, UserMessageClassNames } from './UserMessage';\nimport type { AssistantMessageSlots, AssistantMessageClassNames } from './AssistantMessage';\n\nexport interface TurnBubbleClassNames {\n /** Root container */\n root?: string\n /** User turn wrapper */\n userTurn?: string\n /** Assistant turn wrapper */\n assistantTurn?: string\n}\n\nexport interface TurnBubbleProps {\n /** The conversation turn containing user and optional assistant content */\n turn: ConversationTurn\n /** When true, this turn is the last in the list (e.g. Regenerate shows only on last assistant message) */\n isLastTurn?: boolean\n /** Custom render function for user turn (full control) */\n renderUserTurn?: (turn: ConversationTurn) => ReactNode\n /** Custom render function for assistant turn (full control) */\n renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n /** Props passed to UserTurnView (when not using custom renderer) */\n userTurnProps?: Omit<UserTurnViewProps, 'turn'>\n /** Props passed to AssistantTurnView (when not using custom renderer) */\n assistantTurnProps?: Omit<AssistantTurnViewProps, 'turn'>\n /** Slots for user message customization */\n userMessageSlots?: UserMessageSlots\n /** Slots for assistant message customization */\n assistantMessageSlots?: AssistantMessageSlots\n /** Class names for user message */\n userMessageClassNames?: UserMessageClassNames\n /** Class names for assistant message */\n assistantMessageClassNames?: AssistantMessageClassNames\n /** Class names for turn bubble container */\n classNames?: TurnBubbleClassNames\n /** Whether assistant response is streaming */\n isStreaming?: boolean\n}\n\nconst defaultClassNames: Required<TurnBubbleClassNames> = {\n root: 'space-y-4 min-w-0',\n userTurn: '',\n assistantTurn: '',\n};\n\nexport function TurnBubble({\n turn,\n isLastTurn = false,\n renderUserTurn,\n renderAssistantTurn,\n userTurnProps,\n assistantTurnProps,\n userMessageSlots,\n assistantMessageSlots,\n userMessageClassNames,\n assistantMessageClassNames,\n classNames,\n isStreaming = false,\n}: TurnBubbleProps) {\n const classes = {\n root: classNames?.root ?? defaultClassNames.root,\n userTurn: classNames?.userTurn ?? defaultClassNames.userTurn,\n assistantTurn: classNames?.assistantTurn ?? defaultClassNames.assistantTurn,\n };\n const userContent = typeof turn.userTurn?.content === 'string' ? turn.userTurn.content : '';\n const isSystemSummaryTurn =\n userContent.trim() === '' && turn.assistantTurn?.role === 'system';\n\n return (\n <div className={classes.root} data-turn-id={turn.id}>\n {/* User message */}\n {!isSystemSummaryTurn && (\n <div className={classes.userTurn}>\n {renderUserTurn ? (\n renderUserTurn(turn)\n ) : (\n <UserTurnView\n turn={turn}\n slots={userMessageSlots}\n classNames={userMessageClassNames}\n {...userTurnProps}\n />\n )}\n </div>\n )}\n\n {/* Assistant response (if available) */}\n {turn.assistantTurn && (\n <div className={classes.assistantTurn}>\n {renderAssistantTurn ? (\n renderAssistantTurn(turn)\n ) : (\n <AssistantTurnView\n turn={turn}\n isLastTurn={isLastTurn}\n isStreaming={isStreaming}\n slots={assistantMessageSlots}\n classNames={assistantMessageClassNames}\n {...assistantTurnProps}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default TurnBubble;\n","/**\n * Framer Motion animation variants for BiChat UI\n * Subtle, professional animations for enterprise applications\n *\n * Reduced-motion handling: Framer Motion's built-in `<MotionConfig reducedMotion=\"user\">`\n * or the `useReducedMotion()` hook handle OS-level accessibility preferences reactively.\n * Variant objects declare their intended durations; Framer suppresses them automatically.\n */\n\n/**\n * Fade in animation\n */\nexport const fadeInVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Fade in with subtle slide up\n */\nexport const fadeInUpVariants = {\n initial: { opacity: 0, y: 8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n y: 8,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Scale fade for modals and popups\n */\nexport const scaleFadeVariants = {\n initial: { opacity: 0, scale: 0.98 },\n animate: {\n opacity: 1,\n scale: 1,\n transition: { duration: 0.15 },\n },\n exit: {\n opacity: 0,\n scale: 0.98,\n transition: { duration: 0.1 },\n },\n};\n\n/**\n * Modal backdrop\n */\nexport const backdropVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: { duration: 0.15 },\n },\n exit: {\n opacity: 0,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Button press feedback\n */\nexport const buttonVariants = {\n tap: {\n scale: 0.98,\n },\n};\n\n/**\n * Stagger container for lists\n */\nexport const staggerContainerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.03,\n delayChildren: 0.05,\n },\n },\n};\n\n/**\n * List item animation\n */\nexport const listItemVariants = {\n initial: { opacity: 0, x: -8 },\n animate: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n x: -8,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Message entrance animation\n */\nexport const messageVariants = {\n initial: {\n opacity: 0,\n y: 8,\n },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Container for staggered messages\n */\nexport const messageContainerVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n delayChildren: 0.05,\n },\n },\n};\n\n/**\n * Typing indicator dots\n */\nexport const typingDotVariants = {\n initial: { opacity: 0.4 },\n animate: {\n opacity: [0.4, 1, 0.4],\n transition: {\n duration: 1,\n repeat: Infinity,\n ease: 'easeInOut',\n },\n },\n};\n\n/**\n * Verb transition for typing indicator\n * Smooth slide-up animation for rotating text\n */\nexport const verbTransitionVariants = {\n initial: {\n y: 16,\n opacity: 0,\n },\n animate: {\n y: 0,\n opacity: 1,\n transition: {\n duration: 0.2,\n ease: 'easeOut',\n },\n },\n exit: {\n y: -16,\n opacity: 0,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Floating button (scroll to bottom, etc.)\n */\nexport const floatingButtonVariants = {\n initial: {\n opacity: 0,\n scale: 0.9,\n },\n animate: {\n opacity: 1,\n scale: 1,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n scale: 0.9,\n transition: { duration: 0.15 },\n },\n};\n\n/**\n * Dropdown menu\n */\nexport const dropdownVariants = {\n initial: { opacity: 0, y: -4 },\n animate: {\n opacity: 1,\n y: 0,\n transition: { duration: 0.15 },\n },\n exit: {\n opacity: 0,\n y: -4,\n transition: { duration: 0.1 },\n },\n};\n\n/**\n * Session item with subtle slide-right on hover\n */\nexport const sessionItemVariants = {\n initial: { opacity: 0, x: -20 },\n animate: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.3 },\n },\n hover: {\n x: 4,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n x: -20,\n transition: { duration: 0.2 },\n },\n};\n\n/**\n * Error/alert message slide-in\n */\nexport const errorMessageVariants = {\n initial: { opacity: 0, y: -10, height: 0 },\n animate: {\n opacity: 1,\n y: 0,\n height: 'auto',\n transition: {\n duration: 0.3,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n y: -10,\n height: 0,\n transition: { duration: 0.2 },\n },\n};\n","/**\n * TypingIndicator Component\n * Displays rotating verbs with shimmer animation to show AI is thinking/processing.\n * Verbs are configurable via props. When not provided, defaults are pulled from translations.\n */\n\nimport { useState, useEffect, useMemo, memo } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { verbTransitionVariants } from '../animations/variants';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface TypingIndicatorProps {\n /** Custom thinking verbs to rotate through */\n verbs?: string[]\n /** Verb rotation interval in ms (defaults to 3000) */\n rotationInterval?: number\n /** Additional CSS classes */\n className?: string\n}\n\n// Translation keys for default thinking verbs\nconst THINKING_KEYS = [\n 'BiChat.Thinking.Thinking',\n 'BiChat.Thinking.Processing',\n 'BiChat.Thinking.Analyzing',\n 'BiChat.Thinking.Synthesizing',\n 'BiChat.Thinking.Computing',\n 'BiChat.Thinking.WorkingOnIt',\n];\n\n// Check if user prefers reduced motion\nconst prefersReducedMotion = () => {\n if (typeof window === 'undefined') {return false;}\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n};\n\n// Random selector without immediate repeat\nconst getRandomVerb = (verbs: string[], current: string): string => {\n const available = verbs.filter((v) => v !== current);\n if (available.length === 0) {\n return current || verbs[0] || '';\n }\n return available[Math.floor(Math.random() * available.length)];\n};\n\nfunction TypingIndicator({\n verbs: verbsProp,\n rotationInterval = 3000,\n className = '',\n}: TypingIndicatorProps) {\n const { t } = useTranslation();\n\n const verbs = useMemo(() => {\n if (verbsProp) {return verbsProp;}\n return THINKING_KEYS.map((key) => t(key));\n }, [verbsProp, t]);\n\n const [verb, setVerb] = useState(() => verbs[Math.floor(Math.random() * verbs.length)]);\n\n useEffect(() => {\n if (prefersReducedMotion()) {return;}\n\n const interval = setInterval(() => {\n setVerb((prev) => getRandomVerb(verbs, prev));\n }, rotationInterval);\n\n return () => clearInterval(interval);\n }, [verbs, rotationInterval]);\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex items-center gap-2.5 text-gray-500 dark:text-gray-400 ${className}`}\n >\n <div className=\"flex items-center gap-1\" aria-hidden=\"true\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:0ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:150ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:300ms]\" />\n </div>\n <div className=\"overflow-hidden h-6 relative\">\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={verb}\n variants={verbTransitionVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n className=\"text-sm bichat-thinking-shimmer block\"\n aria-label={t('BiChat.Thinking.AriaLabel', { verb })}\n >\n {verb}...\n </motion.span>\n </AnimatePresence>\n </div>\n </div>\n );\n}\n\nconst MemoizedTypingIndicator = memo(TypingIndicator);\nMemoizedTypingIndicator.displayName = 'TypingIndicator';\n\nexport { MemoizedTypingIndicator as TypingIndicator };\nexport default MemoizedTypingIndicator;\n","/**\n * ActivityTrace — ephemeral activity indicator during AI streaming.\n *\n * Replaces the generic TypingIndicator with a rich, animated trace showing:\n * - Thinking/reasoning content from the model\n * - Tool execution steps with localized labels\n * - Sub-agent delegation with nested child steps\n *\n * All content is ephemeral — it disappears when the final answer arrives.\n */\n\nimport { memo, useMemo, useState } from 'react';\nimport { motion, AnimatePresence, MotionConfig } from 'framer-motion';\nimport { CaretRight, XCircle } from '@phosphor-icons/react';\nimport type { ActivityStep } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { getToolLabel } from '../utils/toolLabels';\nimport { groupSteps } from '../utils/activitySteps';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDuration(ms: number): string {\n return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(1)}s`;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface ActivityTraceProps {\n thinkingContent: string\n activeSteps: ActivityStep[]\n /** Consumer tool label prefix (e.g. 'Ali.Tools') for custom tool translations. */\n toolLabelPrefix?: string\n className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\nfunction ActivityTraceInner({\n thinkingContent,\n activeSteps,\n toolLabelPrefix,\n className = '',\n}: ActivityTraceProps) {\n const { t } = useTranslation();\n\n // Hooks must be called unconditionally (React rules of hooks)\n const { topLevel, agentGroups } = useMemo(() => groupSteps(activeSteps), [activeSteps]);\n\n const hasContent = thinkingContent || activeSteps.length > 0;\n if (!hasContent) {return null;}\n\n const hasActiveSteps = activeSteps.some((s) => s.status === 'active');\n\n return (\n <MotionConfig reducedMotion=\"user\">\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex gap-3 ${className}`}\n >\n {/* AI avatar */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs\">\n AI\n </div>\n\n {/* Trace content */}\n <div className=\"flex-1 max-w-[85%] space-y-2\">\n {/* Thinking bubble */}\n <AnimatePresence>\n {thinkingContent && (\n <motion.div\n key=\"thinking-bubble\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className=\"overflow-hidden\"\n >\n <ThinkingBubble content={thinkingContent} />\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Activity steps */}\n <div className=\"space-y-1\">\n <AnimatePresence initial={false}>\n {topLevel.map((step) => (\n <StepItem\n key={step.id}\n step={step}\n t={t}\n toolLabelPrefix={toolLabelPrefix}\n />\n ))}\n </AnimatePresence>\n\n {/* Agent groups (sub-agent tool calls) */}\n <AnimatePresence initial={false}>\n {agentGroups.map(([agentName, steps]) => (\n <AgentGroup\n key={agentName}\n agentName={agentName}\n steps={steps}\n t={t}\n toolLabelPrefix={toolLabelPrefix}\n />\n ))}\n </AnimatePresence>\n\n {/* Typing shimmer while tools are running */}\n {hasActiveSteps && !thinkingContent && (\n <div className=\"flex items-center gap-1.5 pt-0.5\" aria-hidden=\"true\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:0ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:150ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:300ms]\" />\n </div>\n )}\n </div>\n </div>\n </div>\n </MotionConfig>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ThinkingBubble\n// ---------------------------------------------------------------------------\n\nfunction ThinkingBubble({ content }: { content: string }) {\n // Show last 2 lines of thinking, truncated\n const truncated = useMemo(() => {\n const lines = content.trim().split('\\n');\n const last = lines.slice(-2).join('\\n');\n return last.length > 200 ? '…' + last.slice(-200) : last;\n }, [content]);\n\n return (\n <div className=\"flex items-start gap-2 text-sm text-gray-500 dark:text-gray-400\">\n <span className=\"inline-block w-2 h-2 mt-1.5 rounded-full bg-primary-400 animate-pulse shrink-0\" />\n <div className=\"min-w-0 overflow-hidden\">\n <span className=\"font-medium bichat-thinking-shimmer\">\n {truncated}\n </span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// StepItem\n// ---------------------------------------------------------------------------\n\ninterface StepItemProps {\n step: ActivityStep\n t: (key: string, params?: Record<string, string | number | boolean>) => string\n toolLabelPrefix?: string\n}\n\nfunction StepItem({ step, t, toolLabelPrefix }: StepItemProps) {\n const label = useMemo(\n () =>\n step.type === 'thinking'\n ? t('BiChat.Thinking.Thinking')\n : getToolLabel(t, step.toolName, step.arguments, toolLabelPrefix),\n [step.type, step.toolName, step.arguments, t, toolLabelPrefix]\n );\n\n const isCompleted = step.status === 'completed';\n const isFailed = step.status === 'failed';\n const duration = step.durationMs != null ? formatDuration(step.durationMs) : null;\n\n return (\n <motion.div\n layout\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -8 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className={`flex items-center gap-2 text-sm transition-colors duration-200 ${\n isFailed\n ? 'text-red-500 dark:text-red-400'\n : isCompleted\n ? 'text-gray-400 dark:text-gray-500'\n : 'text-gray-600 dark:text-gray-300'\n }`}\n aria-label={`${label}, ${isFailed ? 'failed' : isCompleted ? 'completed' : 'in progress'}`}\n >\n <StatusIndicator status={step.status} />\n <span className={isCompleted || isFailed ? '' : 'font-medium'}>{label}</span>\n {step.error && (\n <span\n className=\"text-xs text-red-400 truncate max-w-[200px]\"\n title={step.error}\n >\n {step.error}\n </span>\n )}\n {duration && (\n <motion.span\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"text-xs text-gray-400 dark:text-gray-500 tabular-nums\"\n >\n {duration}\n </motion.span>\n )}\n </motion.div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// AgentGroup\n// ---------------------------------------------------------------------------\n\ninterface AgentGroupProps {\n agentName: string\n steps: ActivityStep[]\n t: (key: string, params?: Record<string, string | number | boolean>) => string\n toolLabelPrefix?: string\n}\n\nfunction AgentGroup({ agentName, steps, t, toolLabelPrefix }: AgentGroupProps) {\n const [collapsed, setCollapsed] = useState(false);\n const completedCount = steps.filter((s) => s.status === 'completed').length;\n\n return (\n <motion.div\n layout\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2 }}\n className=\"ml-4 pl-3 border-l-2 border-primary-200 dark:border-primary-800 space-y-1\"\n >\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n className=\"flex items-center gap-1 text-xs font-medium text-primary-600 dark:text-primary-400 cursor-pointer hover:text-primary-700 dark:hover:text-primary-300 transition-colors\"\n aria-expanded={!collapsed}\n >\n <CaretRight\n size={12}\n weight=\"bold\"\n className={`shrink-0 transition-transform duration-150 ${collapsed ? '' : 'rotate-90'}`}\n />\n <span>\n {agentName}\n {collapsed && (\n <span className=\"ml-1 text-gray-400 dark:text-gray-500\">\n ({completedCount}/{steps.length})\n </span>\n )}\n </span>\n </button>\n {!collapsed && (\n <AnimatePresence initial={false}>\n {steps.map((step) => (\n <StepItem key={step.id} step={step} t={t} toolLabelPrefix={toolLabelPrefix} />\n ))}\n </AnimatePresence>\n )}\n </motion.div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// StatusIndicator\n// ---------------------------------------------------------------------------\n\nfunction StatusIndicator({ status }: { status: ActivityStep['status'] }) {\n if (status === 'failed') {\n return (\n <motion.div\n initial={{ scale: 0.5, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 400, damping: 20 }}\n className=\"shrink-0\"\n >\n <XCircle size={14} weight=\"fill\" className=\"text-red-500 dark:text-red-400\" />\n </motion.div>\n );\n }\n\n if (status === 'completed') {\n return (\n <motion.svg\n initial={{ scale: 0.5, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 400, damping: 20 }}\n className=\"w-3.5 h-3.5 text-green-500 dark:text-green-400 shrink-0\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3 8.5L6.5 12L13 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </motion.svg>\n );\n }\n\n return (\n <span className=\"relative flex h-3.5 w-3.5 shrink-0 items-center justify-center\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary-400 opacity-50 motion-reduce:animate-none\" />\n <span className=\"relative inline-flex h-2 w-2 rounded-full bg-primary-500\" />\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Export\n// ---------------------------------------------------------------------------\n\nexport const ActivityTrace = memo(ActivityTraceInner);\nActivityTrace.displayName = 'ActivityTrace';\n","/**\n * Tool label resolution for the Activity Trace.\n *\n * Convention: `BiChat.Tools.{toolName}` for SDK-provided tools.\n * Upstream consumers can extend with their own prefix (e.g., `Ali.Tools.{customTool}`).\n */\n\ntype TranslateFn = (key: string, params?: Record<string, string | number | boolean>) => string\n\nconst ACRONYMS = new Set(['sql', 'kb', 'pdf', 'api', 'csv', 'http', 'url', 'id']);\n\nfunction humanizeToolName(name: string): string {\n return name\n .split('_')\n .map((word) => (ACRONYMS.has(word) ? word.toUpperCase() : word.charAt(0).toUpperCase() + word.slice(1)))\n .join(' ');\n}\n\n/**\n * Resolve a human-readable label for a tool invocation.\n *\n * Lookup order:\n * 1. Consumer prefix (if provided), e.g. `Ali.Tools.custom_tool`\n * 2. SDK default prefix `BiChat.Tools.{name}`\n * 3. Fallback: humanise the raw tool name\n */\nexport function getToolLabel(\n t: TranslateFn,\n name: string,\n args?: string,\n prefix?: string\n): string {\n // 1. Consumer prefix\n if (prefix) {\n const key = `${prefix}.${name}`;\n const label = t(key, parseToolParams(name, args));\n if (label !== key) {return label;}\n }\n\n // 2. SDK default\n const sdkKey = `BiChat.Tools.${name}`;\n const sdkLabel = t(sdkKey, parseToolParams(name, args));\n if (sdkLabel !== sdkKey) {return sdkLabel;}\n\n // 3. Humanise fallback\n return humanizeToolName(name);\n}\n\n/**\n * Extract interpolation params from tool arguments for specific tools.\n */\nfunction parseToolParams(\n name: string,\n args?: string\n): Record<string, string> | undefined {\n if (name === 'task' && args) {\n try {\n const parsed = JSON.parse(args) as Record<string, unknown>;\n return { agent: String(parsed.description ?? parsed.subagent_type ?? 'specialist') };\n } catch {\n return { agent: 'specialist' };\n }\n }\n return undefined;\n}\n","/**\n * Utility functions for activity step processing.\n */\n\nimport type { ActivityStep } from '../types';\n\n/**\n * Group activity steps by agent — top-level steps (no agentName) and\n * agent groups (keyed by agentName).\n */\nexport function groupSteps(steps: ActivityStep[]): {\n topLevel: ActivityStep[]\n agentGroups: [string, ActivityStep[]][]\n} {\n const topLevel: ActivityStep[] = [];\n const agentMap = new Map<string, ActivityStep[]>();\n\n for (const step of steps) {\n if (step.agentName) {\n const group = agentMap.get(step.agentName) || [];\n group.push(step);\n agentMap.set(step.agentName, group);\n } else {\n topLevel.push(step);\n }\n }\n\n const agentGroups = Array.from(agentMap.entries());\n return { topLevel, agentGroups };\n}\n","/**\n * ScrollToBottomButton Component\n * Floating button to scroll chat to bottom, shown when user scrolls up\n */\n\nimport { ArrowDown } from '@phosphor-icons/react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ScrollToBottomButtonProps {\n show: boolean\n onClick: () => void\n unreadCount?: number\n disabled?: boolean\n /** When set, renders a pill-style button with this label (e.g. \"New messages\") */\n label?: string\n}\n\nfunction ScrollToBottomButton({\n show,\n onClick,\n unreadCount = 0,\n disabled = false,\n label,\n}: ScrollToBottomButtonProps) {\n const { t } = useTranslation();\n return (\n <AnimatePresence>\n {show && (\n <div\n className=\"absolute bottom-8 z-10 pointer-events-none\"\n style={{ left: '50%', transform: 'translateX(-50%)' }}\n >\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={`pointer-events-auto cursor-pointer shadow-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 active:bg-gray-100 dark:active:bg-gray-600 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900 disabled:opacity-40 disabled:cursor-not-allowed ${\n label\n ? 'flex items-center gap-1.5 px-4 py-2 rounded-full bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 hover:bg-primary-700 dark:hover:bg-primary-600 active:bg-primary-800 dark:active:bg-primary-700'\n : 'p-2.5 rounded-full bg-white dark:bg-gray-800'\n }`}\n aria-label={label || t('BiChat.Common.ScrollToBottom')}\n >\n {label ? (\n <>\n <span className=\"text-sm font-medium text-white\">{label}</span>\n <ArrowDown size={16} weight=\"bold\" className=\"text-white\" />\n </>\n ) : (\n <div className=\"relative\">\n <ArrowDown size={18} weight=\"bold\" className=\"text-gray-700 dark:text-gray-300\" />\n\n {/* Unread count badge */}\n {unreadCount > 0 && (\n <span\n className=\"absolute -top-2 -right-2 min-w-[18px] h-[18px] bg-primary-600 dark:bg-primary-500 text-white text-xs font-semibold rounded-full flex items-center justify-center px-1\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </div>\n )}\n </motion.button>\n </div>\n )}\n </AnimatePresence>\n );\n}\n\nexport { ScrollToBottomButton };\nexport default ScrollToBottomButton;\n","/**\n * DateSeparator Component\n * Renders a centered date label with horizontal divider lines.\n * Shows \"Today\", \"Yesterday\", or a formatted date for older messages.\n */\n\nimport { useMemo } from 'react';\nimport { isToday, isYesterday, format } from 'date-fns';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DateSeparatorProps {\n date: Date\n}\n\nexport function DateSeparator({ date }: DateSeparatorProps) {\n const { t } = useTranslation();\n\n const label = useMemo(() => {\n if (isToday(date)) {return t('BiChat.DateGroup.Today');}\n if (isYesterday(date)) {return t('BiChat.DateGroup.Yesterday');}\n return format(date, 'MMM d');\n }, [date, t]);\n\n return (\n <div className=\"flex items-center gap-3 py-2 select-none\" aria-label={label}>\n <div className=\"h-px flex-1 bg-gray-200 dark:bg-gray-700\" />\n <span className=\"text-[11px] font-medium text-gray-400 dark:text-gray-500 uppercase tracking-wide\">\n {label}\n </span>\n <div className=\"h-px flex-1 bg-gray-200 dark:bg-gray-700\" />\n </div>\n );\n}\n\nexport default DateSeparator;\n","/**\n * Normalizes partially-streamed markdown so that react-markdown\n * can render it without layout artifacts (e.g. an unclosed code fence\n * turning the rest of the message into a code block).\n *\n * Called on every streaming content update — kept intentionally cheap (O(lines)).\n */\nexport function normalizeStreamingMarkdown(text: string): string {\n // Track unclosed code fences.\n // A code fence opens with ≥3 backticks at line start and closes with\n // the same (or more) backticks on its own line.\n const lines = text.split('\\n');\n let inCodeBlock = false;\n let fenceTicks = '';\n\n for (const line of lines) {\n const trimmed = line.trimStart();\n const fenceMatch = trimmed.match(/^(`{3,})/);\n if (fenceMatch) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n fenceTicks = fenceMatch[1];\n } else if (trimmed.startsWith(fenceTicks) && trimmed.slice(fenceTicks.length).trim() === '') {\n inCodeBlock = false;\n fenceTicks = '';\n }\n }\n }\n\n if (inCodeBlock) {\n text += '\\n' + fenceTicks;\n }\n\n return text;\n}\n","import { useEffect } from 'react';\n\nexport interface ShortcutConfig {\n key: string\n ctrl?: boolean\n shift?: boolean\n alt?: boolean\n meta?: boolean\n callback: () => void\n preventDefault?: boolean\n description?: string\n}\n\n/**\n * Hook for managing global keyboard shortcuts\n * Automatically handles modifier keys and input field exclusion\n *\n * @param shortcuts - Array of keyboard shortcut configurations\n *\n * @example\n * useKeyboardShortcuts([\n * { key: 'k', ctrl: true, callback: () => focusSearch(), description: 'Focus search' },\n * { key: '?', callback: () => setShowHelp(true), description: 'Show keyboard shortcuts' },\n * ])\n */\nexport function useKeyboardShortcuts(shortcuts: ShortcutConfig[]) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ignore if user is typing in input/textarea/contenteditable\n const target = e.target as HTMLElement;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target.isContentEditable\n ) {\n // Allow some shortcuts even in inputs (like Escape)\n const allowInInput = shortcuts.find(s =>\n s.key.toLowerCase() === e.key.toLowerCase() &&\n s.key.toLowerCase() === 'escape'\n );\n if (!allowInInput) {\n return;\n }\n }\n\n // Find matching shortcut\n const matchingShortcut = shortcuts.find((s) => {\n const keyMatches = e.key.toLowerCase() === s.key.toLowerCase();\n const modMatches = s.meta\n ? e.metaKey && !e.ctrlKey\n : s.ctrl\n ? e.ctrlKey || e.metaKey\n : !e.ctrlKey && !e.metaKey;\n const shiftMatches = s.shift ? e.shiftKey : !e.shiftKey;\n const altMatches = s.alt ? e.altKey : !e.altKey;\n\n return keyMatches && modMatches && shiftMatches && altMatches;\n });\n\n if (matchingShortcut) {\n if (matchingShortcut.preventDefault !== false) {\n e.preventDefault();\n }\n matchingShortcut.callback();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [shortcuts]);\n}\n","/**\n * useMessageListScroll — scroll management for the MessageList.\n *\n * Owns: auto-scroll, initial-session scroll, scroll-to-bottom button,\n * unread-count tracking, and the End-key shortcut.\n */\n\nimport { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { useKeyboardShortcuts, type ShortcutConfig } from './useKeyboardShortcuts';\n\nconst NEAR_BOTTOM_PX = 150;\n\nexport interface MessageListScrollOptions {\n /** Current session id — triggers initial scroll on change. */\n currentSessionId: string | undefined\n /** True while session data is loading. */\n fetching: boolean\n /** Number of conversation turns (triggers auto-scroll). */\n turnsLength: number\n /** Current streaming content (controls instant vs smooth scroll). */\n streamingContent: string\n}\n\nexport interface MessageListScrollReturn {\n containerRef: React.RefObject<HTMLDivElement>\n messagesEndRef: React.RefObject<HTMLDivElement>\n showScrollButton: boolean\n unreadCount: number\n handleScrollToBottom: () => void\n}\n\nexport function useMessageListScroll({\n currentSessionId,\n fetching,\n turnsLength,\n streamingContent,\n}: MessageListScrollOptions): MessageListScrollReturn {\n const containerRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const initialScrollSessionRef = useRef<string | undefined>(undefined);\n const prevTurnsLengthRef = useRef(turnsLength);\n const isAutoScrollRef = useRef(true);\n\n const [showScrollButton, setShowScrollButton] = useState(false);\n const [unreadCount, setUnreadCount] = useState(0);\n\n // -- Core scroll helper ---------------------------------------------------\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {\n const container = containerRef.current;\n if (container) {\n container.scrollTo({ top: container.scrollHeight, behavior });\n return;\n }\n messagesEndRef.current?.scrollIntoView({ behavior });\n }, []);\n\n // -- Auto-scroll on new turns / streaming ---------------------------------\n\n useEffect(() => {\n if (!isAutoScrollRef.current) {return;}\n scrollToBottom(streamingContent ? 'auto' : 'smooth');\n }, [turnsLength, streamingContent, scrollToBottom]);\n\n // -- Initial scroll when opening a session --------------------------------\n\n useEffect(() => {\n if (fetching || !currentSessionId || currentSessionId === 'new') {return;}\n if (initialScrollSessionRef.current === currentSessionId) {return;}\n\n const runInitialScroll = () => {\n scrollToBottom('auto');\n setShowScrollButton(false);\n isAutoScrollRef.current = true;\n };\n\n requestAnimationFrame(() => requestAnimationFrame(runInitialScroll));\n const t1 = setTimeout(runInitialScroll, 80);\n const t2 = setTimeout(runInitialScroll, 200);\n const t3 = setTimeout(runInitialScroll, 400);\n\n initialScrollSessionRef.current = currentSessionId;\n return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); };\n }, [currentSessionId, fetching, turnsLength, scrollToBottom]);\n\n // -- Scroll detection — button visibility + auto-scroll flag --------------\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {return;}\n\n const onScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const nearBottom = scrollHeight - scrollTop - clientHeight < NEAR_BOTTOM_PX;\n isAutoScrollRef.current = nearBottom;\n setShowScrollButton(!nearBottom);\n if (nearBottom) {setUnreadCount(0);}\n };\n\n container.addEventListener('scroll', onScroll);\n return () => container.removeEventListener('scroll', onScroll);\n }, []);\n\n // -- Unread tracking when scrolled up -------------------------------------\n\n useEffect(() => {\n const prev = prevTurnsLengthRef.current;\n prevTurnsLengthRef.current = turnsLength;\n if (turnsLength > prev && showScrollButton) {\n setUnreadCount(c => c + (turnsLength - prev));\n }\n }, [turnsLength, showScrollButton]);\n\n // -- End-key shortcut -----------------------------------------------------\n\n const shortcuts = useMemo<ShortcutConfig[]>(() => [{\n key: 'End',\n callback: () => { scrollToBottom('smooth'); setUnreadCount(0); },\n description: 'Scroll to bottom',\n }], [scrollToBottom]);\n useKeyboardShortcuts(shortcuts);\n\n // -- Public callback for the button ---------------------------------------\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom('smooth');\n setUnreadCount(0);\n }, [scrollToBottom]);\n\n return { containerRef, messagesEndRef, showScrollButton, unreadCount, handleScrollToBottom };\n}\n","/**\n * MessageList — displays conversation turns with auto-scroll and grouping.\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\n */\n\nimport { useMemo, ReactNode, lazy, Suspense, Fragment } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { useChatSession, useChatMessaging } from '../context/ChatContext';\nimport { ConversationTurn } from '../types';\nimport { TurnBubble } from './TurnBubble';\nimport { TypingIndicator } from './TypingIndicator';\nimport { ActivityTrace } from './ActivityTrace';\nimport StreamingCursor from './StreamingCursor';\nimport ScrollToBottomButton from './ScrollToBottomButton';\nimport { DateSeparator } from './DateSeparator';\nimport { normalizeStreamingMarkdown } from '../utils/markdownStream';\nimport { useMessageListScroll } from '../hooks/useMessageListScroll';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { isSameDay } from 'date-fns';\n\n// Eagerly start loading the chunk so it's ready before streaming begins\nconst markdownImport = import('./MarkdownRenderer');\nconst MarkdownRenderer = lazy(() =>\n markdownImport.then((m) => ({ default: m.MarkdownRenderer }))\n);\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction MessageListSkeleton() {\n return (\n <div className=\"space-y-6\" aria-hidden=\"true\">\n <div className=\"flex justify-end\">\n <div className=\"w-3/5 max-w-md rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n <div className=\"flex gap-3\">\n <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse shrink-0\" />\n <div className=\"w-4/5 max-w-lg rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-5/6 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-3/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n <div className=\"flex justify-end\">\n <div className=\"w-2/5 max-w-xs rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n </div>\n );\n}\n\nfunction StreamingBubble({ content, normalizedContent }: { content: string; normalizedContent: string }) {\n return (\n <div className=\"flex min-w-0 gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs\">\n AI\n </div>\n <div className=\"flex-1 min-w-0 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-2xl rounded-bl-sm px-4 py-3 text-gray-900 dark:text-gray-100\" style={{ maxWidth: 'var(--bichat-bubble-assistant-max-width, 85%)' }}>\n <Suspense\n fallback={\n <div className=\"prose prose-sm max-w-none dark:prose-invert whitespace-pre-wrap\">\n {content}\n </div>\n }\n >\n <MarkdownRenderer content={normalizedContent} sendDisabled />\n </Suspense>\n <StreamingCursor />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MessageList\n// ---------------------------------------------------------------------------\n\ninterface MessageListProps {\n renderUserTurn?: (turn: ConversationTurn) => ReactNode\n renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n /** Host-owned workflow/artifact placed in the scrollable conversation history. */\n historyArtifactSlot?: ReactNode\n thinkingVerbs?: string[]\n readOnly?: boolean\n}\n\nexport function MessageList({\n renderUserTurn,\n renderAssistantTurn,\n historyArtifactSlot,\n thinkingVerbs,\n readOnly,\n}: MessageListProps) {\n const { t } = useTranslation();\n const { session, currentSessionId, fetching } = useChatSession();\n const {\n turns, streamingContent, isStreaming,\n thinkingContent, activeSteps,\n showActivityTrace, showTypingIndicator,\n } = useChatMessaging();\n\n const { containerRef, messagesEndRef, showScrollButton, unreadCount, handleScrollToBottom } =\n useMessageListScroll({ currentSessionId, fetching, turnsLength: turns.length, streamingContent });\n\n const normalizedStreaming = useMemo(\n () => (streamingContent ? normalizeStreamingMarkdown(streamingContent) : ''),\n [streamingContent],\n );\n const showAuthorNames = Boolean(session?.isGroup);\n\n const showEphemeral = showActivityTrace || showTypingIndicator;\n\n return (\n <div className=\"relative flex-1 min-w-0 min-h-0\">\n <div ref={containerRef} className=\"h-full overflow-y-auto overflow-x-hidden px-4 py-6\">\n <div className=\"mx-auto w-full min-w-0 space-y-6\">\n {fetching && turns.length === 0 && <MessageListSkeleton />}\n\n {turns.map((turn, index) => {\n const turnDate = new Date(turn.createdAt);\n const prevDate = index > 0 ? new Date(turns[index - 1].createdAt) : null;\n const showDateSeparator = !!prevDate && !isSameDay(turnDate, prevDate);\n const isLast = index === turns.length - 1;\n const userTurnProps = {\n allowEdit: readOnly ? false : isLast,\n showAuthorName: showAuthorNames,\n };\n\n return (\n <Fragment key={turn.id}>\n {showDateSeparator && <DateSeparator date={turnDate} />}\n <TurnBubble\n turn={turn}\n isLastTurn={isLast}\n renderUserTurn={renderUserTurn}\n renderAssistantTurn={renderAssistantTurn}\n userTurnProps={userTurnProps}\n assistantTurnProps={readOnly ? { allowRegenerate: false } : undefined}\n />\n </Fragment>\n );\n })}\n\n {historyArtifactSlot && (\n <div className=\"min-w-0\" data-bichat-history-artifact>\n {historyArtifactSlot}\n </div>\n )}\n\n {isStreaming && streamingContent && (\n <StreamingBubble content={streamingContent} normalizedContent={normalizedStreaming} />\n )}\n\n <AnimatePresence>\n {showEphemeral && (\n <motion.div\n key=\"activity-trace\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n >\n {showActivityTrace && (\n <ActivityTrace thinkingContent={thinkingContent} activeSteps={activeSteps} />\n )}\n {showTypingIndicator && <TypingIndicator verbs={thinkingVerbs} />}\n </motion.div>\n )}\n </AnimatePresence>\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n\n <ScrollToBottomButton\n show={showScrollButton}\n onClick={handleScrollToBottom}\n unreadCount={unreadCount}\n label={isStreaming && showScrollButton ? t('BiChat.ScrollToBottom.NewMessages') : undefined}\n />\n </div>\n );\n}\n","/**\n * MessageQueueList Component\n * Shows stacked queued messages above the input with remove/edit capabilities\n */\n\nimport { useState, useCallback } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { X, PencilSimple, Check, ArrowCounterClockwise } from '@phosphor-icons/react';\nimport type { QueuedMessage } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface MessageQueueListProps {\n queue: QueuedMessage[]\n onRemove: (index: number) => void\n onUpdate: (index: number, content: string) => void\n}\n\nexport function MessageQueueList({ queue, onRemove, onUpdate }: MessageQueueListProps) {\n const { t } = useTranslation();\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\n const [editValue, setEditValue] = useState('');\n\n const startEdit = useCallback((index: number) => {\n setEditingIndex(index);\n setEditValue(queue[index].content);\n }, [queue]);\n\n const saveEdit = useCallback(() => {\n if (editingIndex === null) {return;}\n const trimmed = editValue.trim();\n if (trimmed) {\n onUpdate(editingIndex, trimmed);\n }\n setEditingIndex(null);\n setEditValue('');\n }, [editingIndex, editValue, onUpdate]);\n\n const cancelEdit = useCallback(() => {\n setEditingIndex(null);\n setEditValue('');\n }, []);\n\n if (queue.length === 0) {return null;}\n\n return (\n <div className=\"mb-3 space-y-1.5\">\n <div className=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <span className=\"font-medium\">{t('BiChat.Input.QueuedMessages', { count: queue.length })}</span>\n </div>\n <AnimatePresence initial={false}>\n {queue.map((item, index) => (\n <motion.div\n key={`queue-${index}-${item.content.slice(0, 20)}`}\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.15 }}\n className=\"overflow-hidden\"\n >\n <div className=\"flex items-start gap-2 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-2 text-sm\">\n <span className=\"flex-shrink-0 mt-0.5 w-5 h-5 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 flex items-center justify-center text-[10px] font-bold\">\n {index + 1}\n </span>\n {editingIndex === index ? (\n <div className=\"flex-1 min-w-0 flex flex-col gap-1.5\">\n <textarea\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); saveEdit(); }\n if (e.key === 'Escape') {cancelEdit();}\n }}\n className=\"w-full resize-none rounded border border-primary-300 dark:border-primary-600 bg-transparent px-2 py-1 text-sm text-gray-900 dark:text-white outline-none focus:ring-1 focus:ring-primary-500\"\n rows={1}\n autoFocus\n />\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={saveEdit}\n className=\"cursor-pointer inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-primary-700 dark:text-primary-300 bg-primary-50 dark:bg-primary-900/30 hover:bg-primary-100 dark:hover:bg-primary-900/50 rounded transition-colors\"\n >\n <Check size={12} weight=\"bold\" />\n {t('BiChat.Message.Save')}\n </button>\n <button\n type=\"button\"\n onClick={cancelEdit}\n className=\"cursor-pointer inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <ArrowCounterClockwise size={12} />\n {t('BiChat.Message.Cancel')}\n </button>\n </div>\n </div>\n ) : (\n <p className=\"flex-1 min-w-0 text-gray-700 dark:text-gray-300 truncate\">\n {item.content}\n {item.attachments.length > 0 && (\n <span className=\"ml-1.5 text-gray-400 dark:text-gray-500\">\n +{item.attachments.length} {t('BiChat.Input.AttachFiles').toLowerCase()}\n </span>\n )}\n </p>\n )}\n {editingIndex !== index && (\n <div className=\"flex items-center gap-0.5 flex-shrink-0\">\n <button\n type=\"button\"\n onClick={() => startEdit(index)}\n className=\"cursor-pointer p-1 text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n aria-label={t('BiChat.Input.EditQueueItem')}\n title={t('BiChat.Input.EditQueueItem')}\n >\n <PencilSimple size={14} />\n </button>\n <button\n type=\"button\"\n onClick={() => onRemove(index)}\n className=\"cursor-pointer p-1 text-gray-400 dark:text-gray-500 hover:text-red-500 dark:hover:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 rounded transition-colors\"\n aria-label={t('BiChat.Input.RemoveQueueItem')}\n title={t('BiChat.Input.RemoveQueueItem')}\n >\n <X size={14} />\n </button>\n </div>\n )}\n </div>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n","/**\n * MessageInput Component\n * Advanced input with file upload, drag-drop, keyboard shortcuts, and message queuing\n * Clean, professional design\n */\n\nimport { useState, useRef, useEffect, useCallback, forwardRef, useImperativeHandle, useMemo } from 'react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { Paperclip, PaperPlaneRight, X, Bug, ArrowUp, ArrowDown, Stack, Stop, Brain, CaretUpDown, Check } from '@phosphor-icons/react';\nimport AttachmentGrid from './AttachmentGrid';\nimport { MessageQueueList } from './MessageQueueList';\nimport ImageModal from './ImageModal';\nimport {\n ATTACHMENT_ACCEPT_ATTRIBUTE,\n convertToBase64,\n createDataUrl,\n isImageMimeType,\n validateAttachmentFile,\n validateFileCount,\n} from '../utils/fileUtils';\nimport { calculateContextUsagePercent } from '../utils/debugMetrics';\nimport type { Attachment, ImageAttachment, DebugLimits, QueuedMessage, SessionDebugUsage } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface MessageInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport interface MessageInputProps {\n message: string\n loading: boolean\n isStreaming?: boolean\n fetching?: boolean\n disabled?: boolean\n commandError?: string | null\n debugMode?: boolean\n debugSessionUsage?: SessionDebugUsage\n debugLimits?: DebugLimits | null\n messageQueue?: QueuedMessage[]\n onClearCommandError?: () => void\n onMessageChange: (value: string) => void\n onSubmit: (e: React.FormEvent, attachments: Attachment[]) => void\n onCancelStreaming?: () => void\n onUnqueue?: () => { content: string; attachments: Attachment[] } | null\n onRemoveQueueItem?: (index: number) => void\n onUpdateQueueItem?: (index: number, content: string) => void\n placeholder?: string\n maxFiles?: number\n maxFileSize?: number\n containerClassName?: string\n formClassName?: string\n reasoningEffortOptions?: string[]\n reasoningEffort?: string\n onReasoningEffortChange?: (effort: string) => void\n}\n\n/* -------------------------------------------------------------------------------------------------\n * DebugStatsPanel Sub-component\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DebugStatsPanelProps {\n debugSessionUsage?: SessionDebugUsage\n debugLimits?: DebugLimits | null\n}\n\n/** Debug stats are English-only (developer-facing) — no i18n. */\nfunction DebugStatsPanel({ debugSessionUsage, debugLimits }: DebugStatsPanelProps) {\n const formatTokens = (value: number): string => new Intl.NumberFormat().format(value);\n const latestPromptTokens = debugSessionUsage?.latestPromptTokens ?? 0;\n const sessionTotalTokens = debugSessionUsage?.totalTokens ?? 0;\n const sessionPromptTokens = debugSessionUsage?.promptTokens ?? 0;\n const sessionCompletionTokens = debugSessionUsage?.completionTokens ?? 0;\n const hasUsage = (debugSessionUsage?.turnsWithUsage ?? 0) > 0;\n const policyMaxTokens = debugLimits?.policyMaxTokens ?? 0;\n const modelMaxTokens = debugLimits?.modelMaxTokens ?? 0;\n const effectiveMaxTokens = debugLimits?.effectiveMaxTokens ?? 0;\n const contextPercentValue = calculateContextUsagePercent(latestPromptTokens, effectiveMaxTokens);\n const contextPercent = contextPercentValue !== null ? contextPercentValue.toFixed(1) : null;\n const contextPercentNumber = parseFloat(contextPercent || '0');\n const contextBarColor =\n contextPercentNumber > 75\n ? '#ef4444'\n : contextPercentNumber > 50\n ? '#f59e0b'\n : '#10b981';\n\n return (\n <div className=\"mb-2 space-y-1.5 text-xs\">\n {/* Debug badge */}\n <span className=\"inline-flex items-center gap-1.5 px-2 py-0.5 bg-amber-100 dark:bg-amber-900/40 text-amber-700 dark:text-amber-300 rounded-full font-medium text-[10px]\">\n <span className=\"relative flex h-1.5 w-1.5\" aria-hidden=\"true\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-amber-400 opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-1.5 w-1.5 bg-amber-500\" />\n </span>\n <Bug size={10} />\n Debug\n </span>\n\n {/* Stats container */}\n <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/30 px-3 py-2 space-y-2\">\n {hasUsage ? (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] tabular-nums\">\n <span className=\"inline-flex items-center gap-1 text-gray-500 dark:text-gray-400\">\n <ArrowUp size={10} weight=\"bold\" className=\"text-blue-500 dark:text-blue-400\" />\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(sessionPromptTokens)}</span>\n prompt\n </span>\n <span className=\"inline-flex items-center gap-1 text-gray-500 dark:text-gray-400\">\n <ArrowDown size={10} weight=\"bold\" className=\"text-indigo-500 dark:text-indigo-400\" />\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(sessionCompletionTokens)}</span>\n completion\n </span>\n <span className=\"inline-flex items-center gap-1 text-gray-500 dark:text-gray-400\">\n <Stack size={10} weight=\"bold\" className=\"text-violet-500 dark:text-violet-400\" />\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(sessionTotalTokens)}</span>\n total\n </span>\n </div>\n ) : (\n <p className=\"text-[11px] text-gray-400 dark:text-gray-500 text-center py-0.5\">\n Session usage unavailable\n </p>\n )}\n\n {debugLimits && (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] tabular-nums text-gray-500 dark:text-gray-400\">\n <span>\n Policy max{' '}\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(policyMaxTokens)}</span>\n </span>\n <span>\n Model max{' '}\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(modelMaxTokens)}</span>\n </span>\n <span>\n Effective{' '}\n <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(effectiveMaxTokens)}</span>\n </span>\n </div>\n )}\n\n {effectiveMaxTokens > 0 && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n Context usage\n </span>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-[10px] text-gray-400 dark:text-gray-500 tabular-nums\">\n {formatTokens(latestPromptTokens)} / {formatTokens(effectiveMaxTokens)}\n </span>\n {contextPercent && (\n <span className={[\n 'px-1.5 py-0.5 rounded-full text-[10px] font-semibold tabular-nums',\n contextPercentNumber > 75\n ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400'\n : contextPercentNumber > 50\n ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-600 dark:text-amber-400'\n : 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-600 dark:text-emerald-400',\n ].join(' ')}>\n {contextPercent}%\n </span>\n )}\n </div>\n </div>\n <div className=\"h-1.5 rounded-full bg-gray-200/80 dark:bg-gray-700/50 overflow-hidden\">\n <div\n className=\"h-full rounded-full transition-all duration-700 ease-out\"\n style={{\n width: contextPercent ? `${Math.min(parseFloat(contextPercent), 100)}%` : '0%',\n backgroundColor: contextBarColor,\n }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningEffortSelector Sub-component\n * -----------------------------------------------------------------------------------------------*/\n\nconst EFFORT_LABEL_KEYS: Record<string, string> = {\n low: 'BiChat.Input.ReasoningEffortLow',\n medium: 'BiChat.Input.ReasoningEffortMedium',\n high: 'BiChat.Input.ReasoningEffortHigh',\n xhigh: 'BiChat.Input.ReasoningEffortXHigh',\n};\n\ninterface ReasoningEffortSelectorProps {\n options: string[]\n value?: string\n onChange: (effort: string) => void\n disabled?: boolean\n}\n\nfunction ReasoningEffortSelector({ options, value, onChange, disabled }: ReasoningEffortSelectorProps) {\n const { t } = useTranslation();\n const selected = value || options[1] || options[0];\n const label = t('BiChat.Input.ReasoningEffort');\n const selectedLabel = t(EFFORT_LABEL_KEYS[selected] ?? selected);\n\n return (\n <Menu as=\"div\" className=\"relative flex-shrink-0 self-center\">\n <MenuButton\n disabled={disabled}\n className={[\n 'cursor-pointer inline-flex h-8 items-center gap-1.5 rounded-xl border border-gray-200/80 dark:border-gray-600/70',\n 'bg-white dark:bg-gray-800 px-2.5 text-[11px] font-medium leading-none text-gray-700 dark:text-gray-200',\n 'shadow-sm transition-colors hover:border-gray-300 hover:bg-white dark:hover:border-gray-500 dark:hover:bg-gray-800',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500/20',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n ].join(' ')}\n aria-label={label}\n title={`${label}: ${selectedLabel}`}\n >\n <Brain size={14} weight=\"duotone\" className=\"text-primary-600 dark:text-primary-400\" />\n <span className=\"max-w-[72px] truncate\">{selectedLabel}</span>\n <CaretUpDown size={12} className=\"text-gray-400 dark:text-gray-500\" />\n </MenuButton>\n\n <MenuItems\n anchor=\"top end\"\n className=\"isolate z-30 min-w-[148px] rounded-xl border border-gray-200 bg-white p-1 shadow-xl ring-1 ring-black/5 dark:border-gray-700 dark:bg-gray-900 dark:ring-white/10 [--anchor-gap:8px]\"\n >\n {options.map((opt) => {\n const optionLabel = t(EFFORT_LABEL_KEYS[opt] ?? opt);\n const isSelected = opt === selected;\n\n return (\n <MenuItem key={opt}>\n {({ focus }) => (\n <button\n type=\"button\"\n onClick={() => onChange(opt)}\n className={[\n 'flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-[11px] font-medium transition-colors',\n focus\n ? 'bg-primary-50 text-primary-700 dark:bg-primary-950/40 dark:text-primary-200'\n : 'text-gray-700 dark:text-gray-200',\n ].join(' ')}\n >\n <span className=\"flex-1 truncate\">{optionLabel}</span>\n {isSelected && (\n <Check size={12} weight=\"bold\" className=\"text-primary-600 dark:text-primary-400\" />\n )}\n </button>\n )}\n </MenuItem>\n );\n })}\n </MenuItems>\n </Menu>\n );\n}\n\nconst MAX_FILES_DEFAULT = 10;\nconst MAX_FILE_SIZE_DEFAULT = 20 * 1024 * 1024; // 20MB\nconst MAX_HEIGHT = 192; // 12 lines approx\n\nexport const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(\n (\n {\n message,\n loading,\n isStreaming = false,\n fetching = false,\n disabled = false,\n commandError = null,\n debugMode = false,\n debugSessionUsage,\n debugLimits = null,\n messageQueue = [],\n onClearCommandError,\n onMessageChange,\n onSubmit,\n onCancelStreaming,\n onUnqueue,\n onRemoveQueueItem,\n onUpdateQueueItem,\n placeholder: placeholderOverride,\n maxFiles = MAX_FILES_DEFAULT,\n maxFileSize = MAX_FILE_SIZE_DEFAULT,\n containerClassName,\n formClassName,\n reasoningEffortOptions,\n reasoningEffort,\n onReasoningEffortChange,\n },\n ref\n ) => {\n const { t } = useTranslation();\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isFocused, setIsFocused] = useState(false);\n const [commandListDismissed, setCommandListDismissed] = useState(false);\n const [activeCommandIndex, setActiveCommandIndex] = useState(0);\n const [isComposing, setIsComposing] = useState(false);\n const [dropSuccess, setDropSuccess] = useState(false);\n const [pendingFileCount, setPendingFileCount] = useState(0);\n const [viewingImageIndex, setViewingImageIndex] = useState<number | null>(null);\n\n // Use override or translation\n const placeholder = placeholderOverride || t('BiChat.Input.Placeholder');\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const formRef = useRef<HTMLFormElement>(null);\n const commandItemRefs = useRef<Array<HTMLLIElement | null>>([]);\n const didAutoFocusRef = useRef(false);\n const isSlashMode = message.trimStart().startsWith('/');\n const commandQuery = message.trimStart().slice(1).split(/\\s+/)[0]?.toLowerCase() || '';\n\n const slashCommands = useMemo(\n () => [\n { name: '/clear', description: t('BiChat.Slash.ClearDescription') },\n { name: '/debug', description: t('BiChat.Slash.DebugDescription') },\n { name: '/compact', description: t('BiChat.Slash.CompactDescription') },\n ],\n [t]\n );\n const filteredCommands = useMemo(\n () =>\n slashCommands.filter((cmd) =>\n cmd.name.slice(1).startsWith(commandQuery)\n ),\n [commandQuery, slashCommands]\n );\n const isCommandListVisible = isSlashMode && !commandListDismissed && !loading && !disabled;\n\n useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) {return;}\n\n textarea.style.height = 'auto';\n const newHeight = Math.min(textarea.scrollHeight, MAX_HEIGHT);\n textarea.style.height = `${newHeight}px`;\n }, [message]);\n\n useEffect(() => {\n if (didAutoFocusRef.current || loading || disabled || fetching) {return;}\n\n const frame = requestAnimationFrame(() => {\n textareaRef.current?.focus();\n didAutoFocusRef.current = true;\n });\n\n return () => cancelAnimationFrame(frame);\n }, [loading, disabled, fetching]);\n\n useEffect(() => {\n if (!error) {return;}\n const timer = setTimeout(() => setError(null), 5000);\n return () => clearTimeout(timer);\n }, [error]);\n\n useEffect(() => {\n if (isSlashMode) {\n setCommandListDismissed(false);\n }\n }, [isSlashMode, message]);\n\n useEffect(() => {\n if (!isCommandListVisible) {return;}\n\n const handleOutsideClick = (event: MouseEvent) => {\n if (!containerRef.current) {return;}\n if (event.target instanceof Node && !containerRef.current.contains(event.target)) {\n setCommandListDismissed(true);\n }\n };\n\n document.addEventListener('mousedown', handleOutsideClick);\n return () => document.removeEventListener('mousedown', handleOutsideClick);\n }, [isCommandListVisible]);\n\n useEffect(() => {\n setActiveCommandIndex(0);\n }, [commandQuery]);\n\n useEffect(() => {\n if (filteredCommands.length === 0) {\n setActiveCommandIndex(0);\n return;\n }\n\n setActiveCommandIndex((prev) => {\n if (prev < 0) {return 0;}\n if (prev >= filteredCommands.length) {return filteredCommands.length - 1;}\n return prev;\n });\n }, [filteredCommands.length]);\n\n useEffect(() => {\n if (!isCommandListVisible || filteredCommands.length === 0) {return;}\n commandItemRefs.current[activeCommandIndex]?.scrollIntoView({\n block: 'nearest',\n });\n }, [activeCommandIndex, filteredCommands.length, isCommandListVisible]);\n\n const handleFileSelect = async (files: FileList | File[] | null): Promise<boolean> => {\n if (!files) {return false;}\n const selectedFiles = Array.isArray(files) ? files : Array.from(files);\n if (selectedFiles.length === 0) {return false;}\n\n try {\n validateFileCount(attachments.length, selectedFiles.length, maxFiles);\n\n // Extract and validate all files synchronously before any async work.\n // This ensures File objects are captured while the DataTransfer is still valid.\n const fileArray: File[] = [];\n for (let i = 0; i < selectedFiles.length; i++) {\n const file = selectedFiles[i];\n validateAttachmentFile(file, maxFileSize);\n fileArray.push(file);\n }\n\n // Show shimmer placeholders while processing\n setPendingFileCount(fileArray.length);\n\n // Read all files in parallel\n const base64Results = await Promise.all(fileArray.map(convertToBase64));\n\n const newAttachments: Attachment[] = fileArray.map((file, i) => {\n const attachment: Attachment = {\n clientKey: crypto.randomUUID(),\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data: base64Results[i],\n };\n if (isImageMimeType(file.type)) {\n attachment.preview = createDataUrl(base64Results[i], file.type);\n }\n return attachment;\n });\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n setPendingFileCount(0);\n setError(null);\n return true;\n } catch (err) {\n setPendingFileCount(0);\n setError(err instanceof Error ? err.message : 'Failed to process attachments');\n return false;\n }\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFileSelect(e.target.files);\n e.target.value = '';\n };\n\n useImperativeHandle(ref, () => ({\n focus: () => textareaRef.current?.focus(),\n clear: () => {\n onMessageChange('');\n setAttachments([]);\n setError(null);\n },\n }));\n\n const handleRemoveAttachment = (index: number) => {\n setAttachments((prev) => prev.filter((_, i) => i !== index));\n setError(null);\n };\n\n // ── Image lightbox ──────────────────────────────────\n const imageAttachments = useMemo(\n () => attachments.filter((a): a is ImageAttachment =>\n a.mimeType.startsWith('image/') && !!(a.base64Data && a.preview)\n ),\n [attachments]\n );\n\n const handleViewAttachment = useCallback((index: number) => {\n const attachment = attachments[index];\n if (!attachment || !attachment.mimeType.startsWith('image/')) {return;}\n const imgIdx = imageAttachments.findIndex((a) => a.filename === attachment.filename && a.preview === attachment.preview);\n if (imgIdx >= 0) {setViewingImageIndex(imgIdx);}\n }, [attachments, imageAttachments]);\n\n const handleImageNavigate = useCallback((direction: 'prev' | 'next') => {\n setViewingImageIndex((prev) => {\n if (prev === null) {return null;}\n const len = imageAttachments.length;\n if (len <= 0) {return null;}\n const newIndex = Math.max(0, Math.min(len - 1, prev + (direction === 'prev' ? -1 : 1)));\n return newIndex;\n });\n }, [imageAttachments.length]);\n\n useEffect(() => {\n setViewingImageIndex((prev) => {\n if (imageAttachments.length === 0) {return null;}\n if (prev != null && (prev < 0 || prev >= imageAttachments.length)) {\n return Math.max(0, Math.min(prev, imageAttachments.length - 1));\n }\n return prev;\n });\n }, [imageAttachments.length]);\n\n // ── Paste-to-attach ─────────────────────────────────\n const handlePaste = useCallback((e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const items = Array.from(e.clipboardData.items);\n const imageFiles = items\n .filter((item) => item.kind === 'file' && item.type.startsWith('image/'))\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null);\n\n if (imageFiles.length > 0) {\n e.preventDefault();\n handleFileSelect(imageFiles);\n }\n }, [attachments.length, maxFiles, maxFileSize]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n const itemFiles = Array.from(e.dataTransfer.items || [])\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null);\n const droppedFiles = itemFiles.length > 0 ? itemFiles : Array.from(e.dataTransfer.files || []);\n const ok = await handleFileSelect(droppedFiles);\n if (ok) {\n setDropSuccess(true);\n setTimeout(() => setDropSuccess(false), 1500);\n }\n };\n\n const submitCommandSelection = (command: string) => {\n onMessageChange(command);\n setCommandListDismissed(true);\n setActiveCommandIndex(0);\n requestAnimationFrame(() => {\n formRef.current?.requestSubmit();\n });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n\n if (isCommandListVisible) {\n if (e.key === 'Tab') {\n e.preventDefault();\n if (filteredCommands.length > 0) {\n onMessageChange(filteredCommands[activeCommandIndex].name);\n setCommandListDismissed(true);\n }\n return;\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (filteredCommands.length > 0) {\n setActiveCommandIndex((prev) => (prev + 1) % filteredCommands.length);\n }\n return;\n }\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (filteredCommands.length > 0) {\n setActiveCommandIndex((prev) =>\n prev === 0 ? filteredCommands.length - 1 : prev - 1\n );\n }\n return;\n }\n\n if (e.key === 'Escape') {\n e.preventDefault();\n setCommandListDismissed(true);\n return;\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (filteredCommands.length > 0) {\n submitCommandSelection(filteredCommands[activeCommandIndex].name);\n return;\n }\n handleFormSubmit(e as unknown as React.FormEvent);\n return;\n }\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (message.trim() || attachments.length > 0) {\n handleFormSubmit(e as unknown as React.FormEvent);\n }\n }\n\n if (e.key === 'Escape') {\n if (isDragging) {\n setIsDragging(false);\n } else if (isSlashMode) {\n setCommandListDismissed(true);\n } else {\n textareaRef.current?.blur();\n }\n }\n\n if (e.key === 'ArrowUp' && !message.trim() && onUnqueue) {\n const unqueued = onUnqueue();\n if (unqueued) {\n onMessageChange(unqueued.content);\n setAttachments(unqueued.attachments);\n }\n }\n };\n\n const handleFormSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (isComposing) {return;}\n if (disabled || (!message.trim() && attachments.length === 0)) {\n return;\n }\n\n setCommandListDismissed(true);\n onSubmit(e, attachments);\n setAttachments([]);\n setError(null);\n };\n\n const canSubmit = !disabled && (message.trim() || attachments.length > 0);\n const visibleError = error || commandError;\n const visibleErrorText = visibleError ? t(visibleError) : '';\n const resolvedReasoningEffort = reasoningEffortOptions && reasoningEffortOptions.length > 0\n ? reasoningEffortOptions.includes(reasoningEffort ?? '')\n ? reasoningEffort\n : reasoningEffortOptions[1] || reasoningEffortOptions[0]\n : undefined;\n\n useEffect(() => {\n if (!onReasoningEffortChange || !reasoningEffortOptions?.length) {return;}\n if (!resolvedReasoningEffort || resolvedReasoningEffort === reasoningEffort) {\n return;\n }\n onReasoningEffortChange(resolvedReasoningEffort);\n }, [reasoningEffort, onReasoningEffortChange, reasoningEffortOptions, resolvedReasoningEffort]);\n\n const defaultContainerClassName = \"shrink-0 px-4 pt-4 pb-6\";\n\n return (\n <div\n ref={containerRef}\n className={containerClassName ?? defaultContainerClassName}\n >\n <form ref={formRef} onSubmit={handleFormSubmit} className={formClassName ?? \"mx-auto\"}>\n {/* Error display */}\n {visibleError && (\n <div className=\"mb-3 flex items-start gap-2.5 px-3 py-2.5 bg-red-50 dark:bg-red-950/40 border border-red-200/80 dark:border-red-900/60 rounded-xl text-sm shadow-sm\">\n <div className=\"flex-shrink-0 mt-0.5 flex items-center justify-center w-5 h-5 rounded-full bg-red-100 dark:bg-red-900/40\">\n <X size={10} className=\"text-red-600 dark:text-red-400\" weight=\"bold\" />\n </div>\n <span className=\"flex-1 text-red-700 dark:text-red-300 text-xs leading-relaxed\">{visibleErrorText}</span>\n <button\n type=\"button\"\n onClick={() => {\n setError(null);\n onClearCommandError?.();\n }}\n className=\"cursor-pointer flex-shrink-0 p-0.5 text-red-400 dark:text-red-500 hover:text-red-600 dark:hover:text-red-300 hover:bg-red-100 dark:hover:bg-red-900/40 rounded-md transition-colors\"\n aria-label={t('BiChat.Input.DismissError')}\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Message queue list */}\n {messageQueue.length > 0 && onRemoveQueueItem && onUpdateQueueItem && (\n <MessageQueueList\n queue={messageQueue}\n onRemove={onRemoveQueueItem}\n onUpdate={onUpdateQueueItem}\n />\n )}\n\n {debugMode && (\n <DebugStatsPanel\n debugSessionUsage={debugSessionUsage}\n debugLimits={debugLimits}\n />\n )}\n\n {/* Attachment preview */}\n {(attachments.length > 0 || pendingFileCount > 0) && (\n <div className=\"mb-3\">\n <AttachmentGrid\n attachments={attachments}\n onRemove={handleRemoveAttachment}\n onView={handleViewAttachment}\n pendingCount={pendingFileCount}\n />\n </div>\n )}\n\n {/* Input container with drag-drop */}\n <div\n className=\"relative\"\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Drag overlay */}\n {isDragging && (\n <div className=\"absolute inset-0 z-10 bg-primary-50/95 dark:bg-primary-900/90 border-2 border-dashed border-primary-400 rounded-2xl flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-800 flex items-center justify-center\">\n <Paperclip size={20} className=\"text-primary-600 dark:text-primary-400\" />\n </div>\n <span className=\"text-sm text-primary-700 dark:text-primary-300 font-medium\">\n {t('BiChat.Input.DropFiles')}\n </span>\n </div>\n </div>\n )}\n\n {/* Drop success feedback */}\n {dropSuccess && (\n <div className=\"absolute inset-0 z-10 bg-green-50/95 dark:bg-green-900/90 border-2 border-green-400 rounded-2xl flex items-center justify-center animate-pulse pointer-events-none\">\n <span className=\"text-sm text-green-700 dark:text-green-300 font-medium\">\n {t('BiChat.Input.FilesAdded')}\n </span>\n </div>\n )}\n\n {/* Input container - using inline Tailwind classes */}\n <div\n className={`flex items-center gap-2 rounded-2xl p-2 sm:p-3 bg-white dark:bg-gray-800 border shadow-sm transition-all duration-150 ${\n isFocused\n ? 'border-primary-400 dark:border-primary-500 ring-2 ring-primary-500/20 dark:ring-primary-500/25 shadow-[0_0_0_3px_rgba(37,99,235,0.08)]'\n : 'border-gray-300 dark:border-gray-600 hover:border-gray-300 dark:hover:border-gray-600 hover:shadow-md'\n }`}\n >\n {/* Attach button */}\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || disabled || attachments.length >= maxFiles}\n className=\"cursor-pointer flex-shrink-0 self-center p-2 text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n aria-label={t('BiChat.Input.AttachFiles')}\n title={t('BiChat.Input.AttachFiles')}\n >\n <Paperclip size={20} />\n </button>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={ATTACHMENT_ACCEPT_ATTRIBUTE}\n multiple\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-label={t('BiChat.Input.FileInput')}\n />\n\n {/* Textarea */}\n <div className=\"flex-1 self-stretch flex items-center\">\n <textarea\n ref={textareaRef}\n value={message}\n onChange={(e) => {\n onMessageChange(e.target.value);\n onClearCommandError?.();\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={(e) => {\n setIsFocused(false);\n if (!containerRef.current) {return;}\n if (!e.relatedTarget || !containerRef.current.contains(e.relatedTarget)) {\n setCommandListDismissed(true);\n }\n }}\n placeholder={placeholder}\n className=\"resize-none bg-transparent border-none outline-none px-1 py-2 w-full text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 text-sm leading-relaxed\"\n style={{ maxHeight: `${MAX_HEIGHT}px` }}\n rows={1}\n disabled={disabled}\n aria-busy={loading}\n aria-label={t('BiChat.Input.MessageInput')}\n />\n </div>\n\n {/* Reasoning effort selector */}\n {reasoningEffortOptions && reasoningEffortOptions.length > 0 && onReasoningEffortChange && (\n <ReasoningEffortSelector\n options={reasoningEffortOptions}\n value={resolvedReasoningEffort}\n onChange={onReasoningEffortChange}\n disabled={disabled || loading}\n />\n )}\n\n {/* Submit/cancel button slot */}\n {isStreaming && onCancelStreaming ? (\n <button\n type=\"button\"\n onClick={onCancelStreaming}\n disabled={disabled || fetching}\n className=\"cursor-pointer flex-shrink-0 self-center p-2 rounded-lg bg-gray-900 hover:bg-gray-800 active:bg-black active:scale-95 text-white shadow-sm transition-all dark:bg-gray-100 dark:hover:bg-gray-200 dark:active:bg-white dark:text-gray-900 disabled:opacity-40 disabled:cursor-not-allowed\"\n aria-label={t('BiChat.Common.Cancel')}\n title={t('BiChat.Common.Cancel')}\n >\n <Stop size={18} weight=\"fill\" />\n </button>\n ) : (\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"cursor-pointer flex-shrink-0 self-center p-2 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 active:scale-95 text-white shadow-sm transition-all disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary-600\"\n aria-label={loading ? t('BiChat.Input.Processing') : t('BiChat.Input.SendMessage')}\n >\n {loading ? (\n <div className=\"w-[18px] h-[18px] border-2 border-white/60 border-t-transparent rounded-full animate-spin\" />\n ) : (\n <PaperPlaneRight size={18} weight=\"fill\" />\n )}\n </button>\n )}\n </div>\n\n {/* Keyboard hint */}\n {isFocused && !message && !loading && (\n <span className=\"hidden sm:block absolute -bottom-5 left-14 text-[10px] text-gray-400 dark:text-gray-500 select-none animate-fade-in\">\n {t('BiChat.Input.ShiftEnterHint')}\n </span>\n )}\n\n {isCommandListVisible && (\n <div className=\"absolute left-0 right-0 bottom-full mb-1.5 z-20 overflow-hidden rounded-lg border border-gray-200/70 bg-white/98 shadow-md backdrop-blur-xl dark:border-gray-700/70 dark:bg-gray-900/98 dark:shadow-black/20\">\n {filteredCommands.length > 0 ? (\n <ul role=\"listbox\" aria-label={t('BiChat.Slash.CommandsList')} className=\"py-1 px-1\">\n {filteredCommands.map((command, index) => {\n const isActive = index === activeCommandIndex;\n return (\n <li\n key={command.name}\n role=\"option\"\n aria-selected={isActive}\n ref={(node) => {\n commandItemRefs.current[index] = node;\n }}\n onMouseEnter={() => setActiveCommandIndex(index)}\n onMouseDown={(e) => {\n e.preventDefault();\n submitCommandSelection(command.name);\n }}\n className={`cursor-pointer flex items-baseline gap-2 rounded-md px-2 py-1.5 transition-colors duration-75 ${\n isActive\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n >\n <span className=\"text-xs font-medium font-mono text-gray-800 dark:text-gray-200 shrink-0\">\n <span className=\"text-gray-400 dark:text-gray-500\">/</span>{command.name.slice(1)}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate\">\n {command.description}\n </span>\n </li>\n );\n })}\n </ul>\n ) : (\n <div className=\"px-3 py-2.5 text-center\">\n <p className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n {t('BiChat.Slash.NoMatches')}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Image lightbox */}\n {viewingImageIndex !== null &&\n viewingImageIndex >= 0 &&\n viewingImageIndex < imageAttachments.length && (\n <ImageModal\n isOpen\n onClose={() => setViewingImageIndex(null)}\n attachment={imageAttachments[viewingImageIndex]}\n allAttachments={imageAttachments}\n currentIndex={viewingImageIndex}\n onNavigate={handleImageNavigate}\n />\n )}\n </form>\n </div>\n );\n }\n);\n\nMessageInput.displayName = 'MessageInput';\n","import { motion } from 'framer-motion';\n\ninterface CompactionDoodleProps {\n title: string\n subtitle: string\n}\n\nexport function CompactionDoodle({ title, subtitle }: CompactionDoodleProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: 8, scale: 0.96 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 4, scale: 0.98 }}\n transition={{ type: 'spring', stiffness: 400, damping: 28 }}\n className=\"flex items-center gap-2.5 rounded-xl border border-gray-200/70 bg-white/95 px-3.5 py-2 shadow-sm backdrop-blur-sm dark:border-gray-700/50 dark:bg-gray-800/95\"\n >\n <div className=\"relative flex h-5 w-5 items-center justify-center\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary-400/30\" />\n <span className=\"relative inline-flex h-2 w-2 rounded-full bg-primary-500\" />\n </div>\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"text-xs font-medium text-gray-700 dark:text-gray-200\">{title}</span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">{subtitle}</span>\n </div>\n </motion.div>\n );\n}\n\nexport default CompactionDoodle;\n","/**\n * WelcomeContent Component\n * Landing page shown when starting a new chat session\n * Clean, professional design for enterprise BI applications\n */\n\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { ChartBar, FileText, Lightbulb, type Icon } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ExamplePrompt {\n category: string\n icon: Icon\n text: string\n}\n\ninterface WelcomeContentProps {\n onPromptSelect?: (prompt: string) => void\n title?: string\n description?: string\n disabled?: boolean\n /** Custom prompts to replace the default i18n prompts. Icons cycle from defaults if not provided. */\n prompts?: Array<{ category: string; text: string; icon?: Icon }>\n}\n\n/** Default prompt definitions with i18n keys and English fallbacks. */\nconst PROMPT_DEFS = [\n { categoryKey: 'BiChat.Welcome.Prompt1Category', textKey: 'BiChat.Welcome.Prompt1Text', icon: ChartBar, defaultCategory: 'Data Analysis', defaultText: 'Show me a summary of key metrics' },\n { categoryKey: 'BiChat.Welcome.Prompt2Category', textKey: 'BiChat.Welcome.Prompt2Text', icon: FileText, defaultCategory: 'Reports', defaultText: 'Generate a report for the current period' },\n { categoryKey: 'BiChat.Welcome.Prompt3Category', textKey: 'BiChat.Welcome.Prompt3Text', icon: Lightbulb, defaultCategory: 'Insights', defaultText: 'What trends can you identify in the data?' },\n] as const;\n\nconst PROMPT_STYLES: { badge: string; icon: string }[] = [\n {\n badge: 'bg-sky-50 text-sky-600 ring-sky-600/10 dark:bg-sky-400/10 dark:text-sky-400 dark:ring-sky-400/20',\n icon: 'text-sky-500 dark:text-sky-400',\n },\n {\n badge: 'bg-teal-50 text-teal-600 ring-teal-600/10 dark:bg-teal-400/10 dark:text-teal-400 dark:ring-teal-400/20',\n icon: 'text-teal-500 dark:text-teal-400',\n },\n {\n badge: 'bg-amber-50 text-amber-600 ring-amber-600/10 dark:bg-amber-400/10 dark:text-amber-400 dark:ring-amber-400/20',\n icon: 'text-amber-500 dark:text-amber-400',\n },\n];\n\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.08,\n delayChildren: 0.05\n }\n }\n};\n\nconst reducedContainerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0,\n delayChildren: 0\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, y: 12 },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.3,\n ease: [0.4, 0, 0.2, 1]\n }\n }\n};\n\nconst reducedItemVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0\n }\n }\n};\n\n/** Resolve a translation key, falling back to a default if the key is not translated. */\nfunction tOr(t: (key: string) => string, key: string, defaultValue: string): string {\n const v = t(key);\n return v !== key ? v : defaultValue;\n}\n\nconst DEFAULT_ICONS: Icon[] = PROMPT_DEFS.map((d) => d.icon);\n\nfunction WelcomeContent({\n onPromptSelect,\n title,\n description,\n disabled = false,\n prompts: customPrompts,\n}: WelcomeContentProps) {\n const { t } = useTranslation();\n const shouldReduceMotion = useReducedMotion();\n const resolvedTitle = title || '';\n const resolvedDescription = description || '';\n\n const prompts: ExamplePrompt[] = customPrompts?.length\n ? customPrompts.map((p, i) => ({\n category: p.category,\n text: p.text,\n icon: p.icon ?? DEFAULT_ICONS[i % DEFAULT_ICONS.length],\n }))\n : PROMPT_DEFS.map((def) => ({\n category: tOr(t, def.categoryKey, def.defaultCategory),\n text: tOr(t, def.textKey, def.defaultText),\n icon: def.icon,\n }));\n\n const handlePromptClick = (prompt: string) => {\n if (onPromptSelect && !disabled) {\n onPromptSelect(prompt);\n }\n };\n\n const activeContainerVariants = shouldReduceMotion ? reducedContainerVariants : containerVariants;\n const activeItemVariants = shouldReduceMotion ? reducedItemVariants : itemVariants;\n\n return (\n <motion.div\n className=\"relative w-full max-w-5xl mx-auto px-6 text-center\"\n variants={activeContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {resolvedTitle && (\n <motion.h1\n className=\"relative text-2xl sm:text-3xl font-semibold text-gray-900 dark:text-white mb-4\"\n variants={activeItemVariants}\n >\n {resolvedTitle}\n </motion.h1>\n )}\n\n {resolvedDescription && (\n <motion.p\n className=\"text-base text-gray-500 dark:text-gray-400 mb-10 max-w-2xl mx-auto leading-relaxed\"\n variants={activeItemVariants}\n >\n {resolvedDescription}\n </motion.p>\n )}\n\n {/* Example prompts */}\n <motion.div variants={activeItemVariants}>\n <div className=\"flex items-center gap-4 mb-5\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent to-gray-200 dark:to-gray-700/70\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-[0.12em] text-gray-400 dark:text-gray-500 select-none\">\n {t('BiChat.Welcome.QuickStart')}\n </span>\n <div className=\"h-px flex-1 bg-gradient-to-l from-transparent to-gray-200 dark:to-gray-700/70\" />\n </div>\n\n <div className={`grid gap-3 ${prompts.length <= 2 ? 'sm:grid-cols-2' : 'sm:grid-cols-2 lg:grid-cols-3'}`}>\n {prompts.map((prompt, index) => {\n const style = PROMPT_STYLES[index % PROMPT_STYLES.length];\n return (\n <motion.button\n key={index}\n onClick={() => handlePromptClick(prompt.text)}\n disabled={disabled}\n className=\"cursor-pointer group flex flex-col items-start text-left p-4 rounded-xl bg-white dark:bg-gray-800/80 border border-gray-200/80 dark:border-gray-700/60 hover:border-gray-300 dark:hover:border-gray-600 hover:bg-gray-50/80 dark:hover:bg-gray-700/30 shadow-sm hover:shadow-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-primary-500/40 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed\"\n variants={activeItemVariants}\n whileHover={disabled || shouldReduceMotion ? {} : { y: -3 }}\n whileTap={disabled || shouldReduceMotion ? {} : { scale: 0.98 }}\n aria-label={`${prompt.category}: ${prompt.text}`}\n >\n <div className=\"mb-3 flex items-center gap-2\">\n <prompt.icon\n size={16}\n weight=\"duotone\"\n className={style?.icon ?? 'text-gray-500'}\n />\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-[11px] font-medium ring-1 ring-inset ${style?.badge ?? 'bg-gray-100 text-gray-600 ring-gray-500/10'}`}\n >\n {prompt.category}\n </span>\n </div>\n\n <p className=\"text-[13px] text-gray-700 dark:text-gray-200 leading-relaxed group-hover:text-gray-900 dark:group-hover:text-white transition-colors duration-200\">\n {prompt.text}\n </p>\n </motion.button>\n );\n })}\n </div>\n </motion.div>\n </motion.div>\n );\n}\n\nexport { WelcomeContent };\nexport default WelcomeContent;\n","/**\n * Alert Component\n * Standardized error/success/warning/info messages with retry capability\n */\n\nimport { memo } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { X, Warning, CheckCircle, Info, XCircle } from '@phosphor-icons/react';\nimport { errorMessageVariants } from '../animations/variants';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport type AlertVariant = 'error' | 'success' | 'warning' | 'info'\n\ninterface AlertProps {\n variant?: AlertVariant\n message: string\n title?: string\n onDismiss?: () => void\n onRetry?: () => void\n show?: boolean\n dismissible?: boolean\n}\n\nconst variantStyles = {\n error: {\n container: 'border-red-200 bg-red-50 dark:bg-red-900/20',\n title: 'text-red-800 dark:text-red-300',\n message: 'text-red-700 dark:text-red-400',\n icon: 'text-red-600 dark:text-red-400',\n button: 'text-red-400 hover:text-red-600 dark:hover:text-red-300',\n retryButton: 'bg-red-600 dark:bg-red-700 hover:bg-red-700 dark:hover:bg-red-800 text-white',\n Icon: XCircle,\n },\n success: {\n container: 'border-emerald-200 bg-emerald-50 dark:bg-emerald-900/20',\n title: 'text-emerald-800 dark:text-emerald-300',\n message: 'text-emerald-700 dark:text-emerald-400',\n icon: 'text-emerald-600 dark:text-emerald-400',\n button: 'text-emerald-400 hover:text-emerald-600 dark:hover:text-emerald-300',\n retryButton: 'bg-emerald-600 dark:bg-emerald-700 hover:bg-emerald-700 dark:hover:bg-emerald-800 text-white',\n Icon: CheckCircle,\n },\n warning: {\n container: 'border-amber-200 bg-amber-50 dark:bg-amber-900/20',\n title: 'text-amber-800 dark:text-amber-300',\n message: 'text-amber-700 dark:text-amber-400',\n icon: 'text-amber-600 dark:text-amber-400',\n button: 'text-amber-400 hover:text-amber-600 dark:hover:text-amber-300',\n retryButton: 'bg-amber-600 dark:bg-amber-700 hover:bg-amber-700 dark:hover:bg-amber-800 text-white',\n Icon: Warning,\n },\n info: {\n container: 'border-blue-200 bg-blue-50 dark:bg-blue-900/20',\n title: 'text-blue-800 dark:text-blue-300',\n message: 'text-blue-700 dark:text-blue-400',\n icon: 'text-blue-600 dark:text-blue-400',\n button: 'text-blue-400 hover:text-blue-600 dark:hover:text-blue-300',\n retryButton: 'bg-blue-600 dark:bg-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800 text-white',\n Icon: Info,\n },\n};\n\nfunction Alert({\n variant = 'info',\n message,\n title,\n onDismiss,\n onRetry,\n show = true,\n dismissible = true,\n}: AlertProps) {\n const { t } = useTranslation();\n const styles = variantStyles[variant];\n const IconComponent = styles.Icon;\n\n return (\n <AnimatePresence>\n {show && (\n <motion.div\n variants={errorMessageVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n className={`border-t border ${styles.container} px-4 py-3`}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <div className=\"w-full flex items-start justify-between px-4\">\n <div className=\"flex items-start gap-3 flex-1\">\n {/* Icon */}\n <IconComponent size={20} className={`w-5 h-5 ${styles.icon} flex-shrink-0 mt-0.5`} />\n\n {/* Content */}\n <div className=\"flex-1\">\n {title && <p className={`text-sm ${styles.title} font-medium`}>{title}</p>}\n <p className={`text-sm ${styles.message} ${title ? 'mt-1' : ''}`}>{message}</p>\n\n {/* Retry Button */}\n {onRetry && (\n <button\n onClick={onRetry}\n className={`mt-2 text-xs px-3 py-1.5 rounded ${styles.retryButton} transition-colors font-medium`}\n >\n {t('BiChat.Chat.Retry')}\n </button>\n )}\n </div>\n </div>\n\n {/* Dismiss Button */}\n {dismissible && onDismiss && (\n <button\n onClick={onDismiss}\n className={`${styles.button} transition-colors flex-shrink-0`}\n aria-label={t('BiChat.Chat.DismissNotification')}\n >\n <X size={20} className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nexport default memo(Alert);\n","/**\n * Archive Banner Component\n * Displays when a chat session is archived and provides a restore button\n */\n\nimport { memo, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Archive, Spinner } from '@phosphor-icons/react';\nimport { errorMessageVariants } from '../animations/variants';\nimport Alert from './Alert';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ArchiveBannerProps {\n show?: boolean\n onRestore?: () => Promise<void>\n restoring?: boolean\n onRestoreComplete?: () => void\n}\n\nfunction ArchiveBanner({\n show = true,\n onRestore,\n restoring = false,\n onRestoreComplete,\n}: ArchiveBannerProps) {\n const { t } = useTranslation();\n const [error, setError] = useState<string | null>(null);\n\n const handleRestore = async () => {\n try {\n setError(null);\n if (onRestore) {\n await onRestore();\n }\n if (onRestoreComplete) {\n onRestoreComplete();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : t('BiChat.Archive.RestoreFailed');\n setError(message);\n }\n };\n\n return (\n <>\n <AnimatePresence>\n {show && (\n <motion.div\n variants={errorMessageVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n className=\"border-t border border-blue-200 bg-blue-50 dark:bg-blue-900/20 px-4 py-3\"\n role=\"region\"\n aria-label={t('BiChat.Archive.Banner')}\n >\n <div className=\"w-full flex items-start justify-between px-4\">\n <div className=\"flex items-start gap-3 flex-1\">\n {/* Icon */}\n <Archive size={20} className=\"w-5 h-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5\" />\n\n {/* Content */}\n <div className=\"flex-1\">\n <p className=\"text-sm text-blue-700 dark:text-blue-400\">\n {t('BiChat.Archive.Archived')}\n </p>\n </div>\n </div>\n\n {/* Restore Button */}\n <button\n onClick={handleRestore}\n disabled={restoring}\n className=\"ml-2 flex-shrink-0 px-3 py-1.5 text-xs font-medium bg-blue-600 dark:bg-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800 text-white rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1.5\"\n aria-label={t('BiChat.Archive.Restore')}\n >\n {restoring ? (\n <>\n <Spinner size={16} className=\"w-4 h-4 animate-spin\" />\n {t('BiChat.Archive.Restoring')}\n </>\n ) : (\n t('BiChat.Archive.Restore')\n )}\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Error Alert */}\n {error && (\n <Alert\n variant=\"error\"\n message={error}\n title={t('BiChat.Archive.RestoreFailed')}\n onDismiss={() => setError(null)}\n dismissible\n />\n )}\n </>\n );\n}\n\nexport default memo(ArchiveBanner);\n","/**\n * Main ChatSession component\n * Composes ChatHeader, MessageList, and MessageInput\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\n *\n * Supports customization via slots:\n * - headerSlot: Custom content above the message list\n * - welcomeSlot: Replace the default welcome screen for new chats\n * - historyArtifactSlot: Host-owned workflow/artifact rendered in chat history\n * - logoSlot: Custom logo in the header\n * - actionsSlot: Custom action buttons in the header\n */\n\nimport { ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { Sidebar, ShareNetwork } from '@phosphor-icons/react';\nimport { ChatSessionProvider, useChatSession, useChatMessaging, useChatInput } from '../context/ChatContext';\nimport { ChatDataSource, ConversationTurn, type SessionUser } from '../types';\nimport { RateLimiter } from '../utils/RateLimiter';\nimport { ChatHeader } from './ChatHeader';\nimport { MessageList } from './MessageList';\nimport { MessageInput } from './MessageInput';\nimport CompactionDoodle from './CompactionDoodle';\nimport WelcomeContent from './WelcomeContent';\nimport ArchiveBanner from './ArchiveBanner';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { SessionArtifactsPanel } from './SessionArtifactsPanel';\nimport { SessionMembersModal } from './SessionMembersModal';\nimport Alert from './Alert';\nimport { StreamError } from './StreamError';\nimport { isOpenQuestionStatus } from '../machine/hitlLifecycle';\n\ninterface ChatSessionProps {\n dataSource: ChatDataSource\n sessionId?: string\n /** Optional rate limiter to throttle sendMessage */\n rateLimiter?: RateLimiter\n /**\n * Called when a new session is created (e.g. on first message in a \"new\n * chat\"). Use this to navigate your SPA router to the new session URL.\n */\n onSessionCreated?: (sessionId: string) => void\n /** Alias for isReadOnly (preferred) */\n readOnly?: boolean\n isReadOnly?: boolean\n /** Custom render function for user turns */\n renderUserTurn?: (turn: ConversationTurn) => ReactNode\n /** Custom render function for assistant turns */\n renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n className?: string\n /** Custom content to display as header */\n headerSlot?: ReactNode\n /** Custom welcome screen component (replaces default WelcomeContent) */\n welcomeSlot?: ReactNode\n /**\n * Host-owned durable content rendered as part of the scrollable conversation\n * history after persisted turns (for example, a workflow or task artifact).\n */\n historyArtifactSlot?: ReactNode\n /** Custom logo for the header */\n logoSlot?: ReactNode\n /** Custom action buttons for the header */\n actionsSlot?: ReactNode\n /** Custom content rendered above the message input (e.g., model selector) */\n inputHeaderSlot?: ReactNode\n /** Callback when user navigates back */\n onBack?: () => void\n /** Custom verbs for the typing indicator (e.g. ['Thinking', 'Analyzing', ...]) */\n thinkingVerbs?: string[]\n /** Callback invoked after an archived session is restored (e.g. to navigate or refresh) */\n onSessionRestored?: (sessionId: string) => void\n /** Enables the built-in right-side artifacts panel for persisted session artifacts */\n showArtifactsPanel?: boolean\n /** Initial expanded state for artifacts panel when no persisted preference exists */\n artifactsPanelDefaultExpanded?: boolean\n /** localStorage key for artifacts panel expanded/collapsed state */\n artifactsPanelStorageKey?: string\n}\n\nconst ARTIFACTS_PANEL_WIDTH_DEFAULT = 352;\nconst ARTIFACTS_PANEL_WIDTH_MIN = 280;\nconst ARTIFACTS_PANEL_WIDTH_MAX = 560;\n\nfunction ChatSessionCore({\n dataSource,\n readOnly,\n isReadOnly,\n renderUserTurn,\n renderAssistantTurn,\n className = '',\n headerSlot,\n welcomeSlot,\n historyArtifactSlot,\n logoSlot,\n actionsSlot,\n inputHeaderSlot,\n onBack,\n thinkingVerbs,\n onSessionRestored,\n showArtifactsPanel = false,\n artifactsPanelDefaultExpanded = false,\n artifactsPanelStorageKey = 'bichat.artifacts-panel.expanded',\n}: Omit<ChatSessionProps, 'sessionId'>) {\n const { t } = useTranslation();\n const {\n session,\n fetching,\n error,\n errorRetryable,\n debugMode,\n sessionDebugUsage,\n debugLimits,\n currentSessionId,\n setError,\n retryFetchSession,\n reasoningEffort,\n setReasoningEffort,\n reasoningEffortOptions,\n } =\n useChatSession();\n const {\n turns,\n loading,\n isStreaming,\n cancel,\n streamError,\n streamErrorRetryable,\n isCompacting,\n retryLastMessage,\n clearStreamError,\n pendingQuestion,\n } = useChatMessaging();\n const {\n inputError,\n message,\n setMessage,\n setInputError,\n handleSubmit,\n messageQueue,\n handleUnqueue,\n removeQueueItem,\n updateQueueItem,\n } = useChatInput();\n\n const isArchived = session?.status === 'archived';\n const accessReadOnly = session?.access ? !session.access.canWrite : false;\n const effectiveReadOnly = Boolean(readOnly ?? isReadOnly) || isArchived || accessReadOnly;\n const composerDisabled = isOpenQuestionStatus(pendingQuestion?.status);\n const [restoring, setRestoring] = useState(false);\n const handleRestore = useCallback(async () => {\n if (!session?.id) {return;}\n setRestoring(true);\n try {\n await dataSource.unarchiveSession(session.id);\n retryFetchSession();\n window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n detail: { reason: 'restored', sessionId: session.id },\n }));\n onSessionRestored?.(session.id);\n } finally {\n setRestoring(false);\n }\n }, [dataSource, onSessionRestored, retryFetchSession, session?.id]);\n\n const [artifactsPanelExpanded, setArtifactsPanelExpanded] = useState(\n artifactsPanelDefaultExpanded\n );\n const [membersModalOpen, setMembersModalOpen] = useState(false);\n const [headerMembers, setHeaderMembers] = useState<SessionUser[] | null>(null);\n const [artifactsPanelWidth, setArtifactsPanelWidth] = useState(ARTIFACTS_PANEL_WIDTH_DEFAULT);\n const [isResizingArtifactsPanel, setIsResizingArtifactsPanel] = useState(false);\n const layoutContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!showArtifactsPanel) {\n return;\n }\n\n let nextValue = artifactsPanelDefaultExpanded;\n if (typeof window !== 'undefined') {\n const stored = window.localStorage.getItem(artifactsPanelStorageKey);\n if (stored !== null) {\n nextValue = stored === 'true';\n }\n }\n\n setArtifactsPanelExpanded(nextValue);\n }, [artifactsPanelDefaultExpanded, artifactsPanelStorageKey, showArtifactsPanel]);\n\n useEffect(() => {\n if (!showArtifactsPanel) {return;}\n if (typeof window === 'undefined') {return;}\n try {\n const raw = window.localStorage.getItem(`${artifactsPanelStorageKey}.width`);\n if (raw !== null) {\n const n = Number.parseInt(raw, 10);\n if (Number.isFinite(n) && n >= ARTIFACTS_PANEL_WIDTH_MIN && n <= ARTIFACTS_PANEL_WIDTH_MAX) {\n setArtifactsPanelWidth(n);\n }\n }\n } catch {\n // ignore\n }\n }, [artifactsPanelStorageKey, showArtifactsPanel]);\n\n // Load full member list for header avatar stack when session and listSessionMembers are available\n useEffect(() => {\n if (!session?.id || !dataSource.listSessionMembers) {\n setHeaderMembers(null);\n return;\n }\n let cancelled = false;\n dataSource.listSessionMembers(session.id).then((members) => {\n if (!cancelled) {\n setHeaderMembers(members.map((m) => m.user));\n }\n }).catch(() => {\n if (!cancelled) {\n setHeaderMembers(null);\n }\n });\n return () => { cancelled = true; };\n }, [session?.id, dataSource.listSessionMembers]);\n\n const handleArtifactsResizeStart = useCallback(() => {\n setIsResizingArtifactsPanel(true);\n }, []);\n\n const handleArtifactsResizeKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const step = e.shiftKey ? 40 : 20;\n let nextWidth: number | null = null;\n\n if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n nextWidth = Math.min(ARTIFACTS_PANEL_WIDTH_MAX, artifactsPanelWidth + step);\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n nextWidth = Math.max(ARTIFACTS_PANEL_WIDTH_MIN, artifactsPanelWidth - step);\n } else if (e.key === 'Home') {\n nextWidth = ARTIFACTS_PANEL_WIDTH_MIN;\n } else if (e.key === 'End') {\n nextWidth = ARTIFACTS_PANEL_WIDTH_MAX;\n }\n\n if (nextWidth !== null) {\n e.preventDefault();\n setArtifactsPanelWidth(nextWidth);\n try {\n window.localStorage.setItem(`${artifactsPanelStorageKey}.width`, String(nextWidth));\n } catch {\n // ignore\n }\n }\n },\n [artifactsPanelWidth, artifactsPanelStorageKey],\n );\n\n const lastPanelWidthRef = useRef(artifactsPanelWidth);\n lastPanelWidthRef.current = artifactsPanelWidth;\n\n useEffect(() => {\n if (!isResizingArtifactsPanel) {return;}\n\n const move = (e: MouseEvent) => {\n const el = layoutContainerRef.current;\n if (!el) {return;}\n const rect = el.getBoundingClientRect();\n const w = rect.right - e.clientX;\n const clamped = Math.min(ARTIFACTS_PANEL_WIDTH_MAX, Math.max(ARTIFACTS_PANEL_WIDTH_MIN, w));\n setArtifactsPanelWidth(clamped);\n };\n\n const up = () => {\n setIsResizingArtifactsPanel(false);\n try {\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(\n `${artifactsPanelStorageKey}.width`,\n String(lastPanelWidthRef.current)\n );\n }\n } catch {\n // ignore\n }\n };\n\n document.addEventListener('mousemove', move, { passive: true });\n document.addEventListener('mouseup', up);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n return () => {\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', up);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, [isResizingArtifactsPanel, artifactsPanelStorageKey]);\n\n if (fetching && turns.length === 0 && !session) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"text-gray-500 dark:text-gray-400\">{t('BiChat.Input.Processing')}</div>\n </div>\n );\n }\n\n // Show welcome screen for new sessions with no turns\n const showWelcome = !session && turns.length === 0;\n const activeSessionId =\n session?.id ||\n (currentSessionId && currentSessionId !== 'new'\n ? currentSessionId\n : undefined);\n\n const supportsArtifactsPanel = typeof dataSource.fetchSessionArtifacts === 'function';\n const showArtifactsControls = Boolean(showArtifactsPanel && supportsArtifactsPanel && activeSessionId);\n const shouldRenderArtifactsPanel = Boolean(\n showArtifactsControls && artifactsPanelExpanded && !showWelcome && activeSessionId\n );\n\n const handlePromptSelect = (prompt: string) => {\n setMessage(prompt);\n };\n\n const handleToggleArtifactsPanel = () => {\n const nextValue = !artifactsPanelExpanded;\n setArtifactsPanelExpanded(nextValue);\n\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(artifactsPanelStorageKey, nextValue ? 'true' : 'false');\n if (nextValue) {\n window.dispatchEvent(new CustomEvent('bichat:artifacts-panel-expanded', { detail: { expanded: true } }));\n }\n }\n };\n\n const canShowShareButton = Boolean(\n session?.access?.canManageMembers\n && dataSource.listUsers\n && dataSource.listSessionMembers\n && dataSource.addSessionMember\n && dataSource.updateSessionMemberRole\n && dataSource.removeSessionMember\n );\n\n const shareButton = canShowShareButton ? (\n <button\n type=\"button\"\n onClick={() => setMembersModalOpen(true)}\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-gray-500 transition-all duration-150 hover:bg-gray-100 hover:text-gray-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200\"\n aria-label={t('BiChat.Share.Title')}\n title={t('BiChat.Share.Title')}\n >\n <ShareNetwork className=\"h-4 w-4\" />\n {t('BiChat.Share.Button')}\n </button>\n ) : null;\n\n const headerActions = (\n <>\n {shareButton}\n {showArtifactsControls && (\n <button\n type=\"button\"\n onClick={handleToggleArtifactsPanel}\n className={[\n 'inline-flex cursor-pointer items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n artifactsPanelExpanded\n ? 'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-950/30 dark:text-primary-300 dark:hover:bg-primary-900/40'\n : 'text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200',\n ].join(' ')}\n aria-label={artifactsPanelExpanded ? t('BiChat.Artifacts.ToggleHide') : t('BiChat.Artifacts.ToggleShow')}\n aria-expanded={artifactsPanelExpanded}\n title={artifactsPanelExpanded ? t('BiChat.Artifacts.ToggleHide') : t('BiChat.Artifacts.ToggleShow')}\n >\n <Sidebar className=\"h-4 w-4\" weight={artifactsPanelExpanded ? 'duotone' : 'regular'} />\n {t('BiChat.Artifacts.Title')}\n </button>\n )}\n {actionsSlot}\n </>\n );\n\n return (\n <main\n className={`flex min-w-0 min-h-0 flex-1 flex-col overflow-hidden bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {headerSlot || (\n <ChatHeader\n session={session}\n onBack={onBack}\n readOnly={effectiveReadOnly}\n logoSlot={logoSlot}\n actionsSlot={headerActions}\n members={headerMembers ?? (session?.owner ? [session.owner] : undefined)}\n onMembersClick={canShowShareButton ? () => setMembersModalOpen(true) : undefined}\n />\n )}\n {error && (\n <Alert\n variant={errorRetryable ? 'warning' : 'error'}\n title={t('BiChat.Error.Generic')}\n message={error}\n onDismiss={() => setError(null)}\n onRetry={errorRetryable ? retryFetchSession : undefined}\n />\n )}\n\n <div\n ref={layoutContainerRef}\n // overflow-clip (not overflow-hidden): an overflow-hidden box is still a\n // scroll container, so focusing a control near the bottom (e.g. a radio\n // in the inline question form) lets the browser scroll this box to\n // reveal it — and with no scrollbar the chat is shoved off-screen with\n // no way back (blank until refresh). overflow-clip clips without\n // creating a scroll container, so it cannot be scrolled on focus.\n className=\"relative flex min-h-0 flex-1 overflow-clip\"\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n {showWelcome ? (\n <div className=\"flex flex-1 flex-col overflow-auto\">\n <div className=\"flex flex-1 items-center justify-center px-4 py-8\">\n <div className=\"w-full max-w-5xl\">\n {welcomeSlot || (\n <WelcomeContent onPromptSelect={handlePromptSelect} disabled={loading || composerDisabled} />\n )}\n {streamError && (\n <div className=\"px-6 pt-4\">\n <StreamError\n error={streamError}\n compact\n onRetry={streamErrorRetryable ? () => void retryLastMessage() : undefined}\n onDismiss={clearStreamError}\n />\n </div>\n )}\n {!effectiveReadOnly && inputHeaderSlot}\n {!effectiveReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n isStreaming={isStreaming}\n fetching={fetching}\n commandError={inputError}\n onClearCommandError={() => setInputError(null)}\n debugMode={debugMode}\n debugSessionUsage={sessionDebugUsage}\n debugLimits={debugLimits}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n onRemoveQueueItem={removeQueueItem}\n onUpdateQueueItem={updateQueueItem}\n onCancelStreaming={cancel}\n containerClassName=\"pt-6 px-6\"\n formClassName=\"mx-auto\"\n disabled={composerDisabled}\n reasoningEffortOptions={reasoningEffortOptions}\n reasoningEffort={reasoningEffort}\n onReasoningEffortChange={setReasoningEffort}\n />\n )}\n <p className=\"mt-4 pb-1 text-center text-xs text-gray-500 dark:text-gray-400\">\n {t('BiChat.Welcome.Disclaimer')}\n </p>\n </div>\n </div>\n </div>\n ) : (\n <>\n {isArchived && (\n <ArchiveBanner\n show\n onRestore={handleRestore}\n restoring={restoring}\n />\n )}\n <MessageList\n renderUserTurn={renderUserTurn}\n renderAssistantTurn={renderAssistantTurn}\n historyArtifactSlot={historyArtifactSlot}\n thinkingVerbs={thinkingVerbs}\n readOnly={effectiveReadOnly}\n />\n <AnimatePresence>\n {isCompacting && (\n <div className=\"flex justify-center px-4 pb-2\">\n <CompactionDoodle\n title={t('BiChat.Slash.CompactingTitle')}\n subtitle={t('BiChat.Slash.CompactingSubtitle')}\n />\n </div>\n )}\n </AnimatePresence>\n {streamError && (\n <div className=\"px-4 pb-2\">\n <StreamError\n error={streamError}\n compact\n onRetry={streamErrorRetryable ? () => void retryLastMessage() : undefined}\n onDismiss={clearStreamError}\n />\n </div>\n )}\n {!effectiveReadOnly && inputHeaderSlot}\n {!effectiveReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n isStreaming={isStreaming}\n fetching={fetching}\n commandError={inputError}\n onClearCommandError={() => setInputError(null)}\n debugMode={debugMode}\n debugSessionUsage={sessionDebugUsage}\n debugLimits={debugLimits}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n onRemoveQueueItem={removeQueueItem}\n onUpdateQueueItem={updateQueueItem}\n onCancelStreaming={cancel}\n disabled={composerDisabled}\n reasoningEffortOptions={reasoningEffortOptions}\n reasoningEffort={reasoningEffort}\n onReasoningEffortChange={setReasoningEffort}\n />\n )}\n </>\n )}\n </div>\n\n {/* Desktop: persistent slot with animated width so main content expands in sync */}\n <motion.div\n className=\"hidden lg:flex lg:min-h-0 shrink-0 overflow-hidden\"\n animate={{\n width: shouldRenderArtifactsPanel && activeSessionId ? artifactsPanelWidth : 0,\n }}\n transition={\n isResizingArtifactsPanel\n ? { duration: 0 }\n : { type: 'spring', stiffness: 320, damping: 32 }\n }\n >\n {shouldRenderArtifactsPanel && activeSessionId && (\n <motion.div\n className=\"flex min-h-0\"\n style={{ width: artifactsPanelWidth }}\n initial={{ x: '100%' }}\n animate={{ x: 0 }}\n transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n >\n <div\n role=\"separator\"\n tabIndex={0}\n aria-label={t('BiChat.Artifacts.Resize')}\n aria-orientation=\"vertical\"\n aria-valuenow={artifactsPanelWidth}\n aria-valuemin={ARTIFACTS_PANEL_WIDTH_MIN}\n aria-valuemax={ARTIFACTS_PANEL_WIDTH_MAX}\n onMouseDown={handleArtifactsResizeStart}\n onKeyDown={handleArtifactsResizeKeyDown}\n className=\"relative flex shrink-0 cursor-col-resize touch-none items-center justify-center w-2 transition-colors lg:flex group/resize after:absolute after:inset-y-0 after:left-0 after:w-0.5 after:bg-gray-300 dark:after:bg-gray-600 after:transition-colors group-hover/resize:after:bg-primary-400 dark:group-hover/resize:after:bg-primary-500 focus-visible:outline-none focus-visible:after:bg-primary-500 dark:focus-visible:after:bg-primary-400\"\n >\n <span className=\"absolute h-10 w-1.5 cursor-col-resize rounded-full bg-gray-400 transition-colors group-hover/resize:bg-primary-400 dark:bg-gray-500 dark:group-hover/resize:bg-primary-500\" />\n </div>\n <SessionArtifactsPanel\n dataSource={dataSource}\n sessionId={activeSessionId}\n isStreaming={isStreaming}\n allowDrop={!effectiveReadOnly}\n className=\"min-h-0 min-w-0 flex-1\"\n />\n </motion.div>\n )}\n </motion.div>\n\n <AnimatePresence>\n {shouldRenderArtifactsPanel && activeSessionId && (\n <motion.div\n key=\"artifacts-mobile\"\n className=\"fixed inset-0 z-40 flex lg:hidden\"\n initial={{ x: '100%' }}\n animate={{ x: 0 }}\n exit={{ x: '100%' }}\n transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <motion.button\n type=\"button\"\n className=\"cursor-pointer flex-1 bg-black/40\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={handleToggleArtifactsPanel}\n aria-label={t('BiChat.Common.Close')}\n />\n <SessionArtifactsPanel\n dataSource={dataSource}\n sessionId={activeSessionId}\n isStreaming={isStreaming}\n allowDrop={!effectiveReadOnly}\n className=\"flex h-full w-full max-w-sm min-h-0\"\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n {canShowShareButton && (\n <SessionMembersModal\n isOpen={membersModalOpen}\n sessionId={session?.id}\n dataSource={dataSource}\n onClose={() => setMembersModalOpen(false)}\n />\n )}\n </main>\n );\n}\n\nexport function ChatSession(props: ChatSessionProps) {\n const { dataSource, sessionId, rateLimiter, onSessionCreated, ...coreProps } = props;\n\n return (\n <ChatSessionProvider\n dataSource={dataSource}\n sessionId={sessionId}\n rateLimiter={rateLimiter}\n onSessionCreated={onSessionCreated}\n >\n <ChatSessionCore dataSource={dataSource} {...coreProps} />\n </ChatSessionProvider>\n );\n}\n\nexport type { ChatSessionProps };\n","import { type ChangeEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Paperclip, Plus } from '@phosphor-icons/react';\nimport type { ChatDataSource, SessionArtifact } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useOptionalChatMessaging } from '../context/ChatContext';\nimport { SessionArtifactList } from './SessionArtifactList';\nimport { SessionArtifactPreviewModal } from './SessionArtifactPreviewModal';\n\ninterface SessionArtifactsPanelProps {\n dataSource: ChatDataSource\n sessionId: string\n isStreaming: boolean\n allowDrop?: boolean\n className?: string\n /** When provided, used instead of useChatMessaging().artifactsInvalidationTrigger (allows use outside SDK ChatSessionProvider). */\n artifactsInvalidationTrigger?: number\n}\n\nconst PAGE_SIZE = 50;\n\nfunction mergeArtifacts(existing: SessionArtifact[], incoming: SessionArtifact[]): SessionArtifact[] {\n const merged = [...existing];\n const existingIds = new Set(existing.map((artifact) => artifact.id));\n\n for (const artifact of incoming) {\n if (existingIds.has(artifact.id)) {\n continue;\n }\n merged.push(artifact);\n existingIds.add(artifact.id);\n }\n\n return merged;\n}\n\nexport function SessionArtifactsPanel({\n dataSource,\n sessionId,\n isStreaming,\n allowDrop = true,\n className = '',\n artifactsInvalidationTrigger: artifactsInvalidationTriggerProp,\n}: SessionArtifactsPanelProps) {\n const { t } = useTranslation();\n const messaging = useOptionalChatMessaging();\n const artifactsInvalidationTrigger =\n typeof artifactsInvalidationTriggerProp === 'number'\n ? artifactsInvalidationTriggerProp\n : messaging?.artifactsInvalidationTrigger ?? 0;\n\n const [fetching, setFetching] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [artifacts, setArtifacts] = useState<SessionArtifact[]>([]);\n const [previewArtifactID, setPreviewArtifactID] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [dropSuccess, setDropSuccess] = useState(false);\n\n const requestSeq = useRef(0);\n const hasLoadedRef = useRef(false);\n const prevStreamingRef = useRef(isStreaming);\n const artifactsRef = useRef<SessionArtifact[]>([]);\n const nextOffsetRef = useRef(0);\n const dragDepthRef = useRef(0);\n const dropSuccessTimerRef = useRef<number | null>(null);\n\n const canFetchArtifacts = typeof dataSource.fetchSessionArtifacts === 'function';\n const canDropFiles = allowDrop && typeof dataSource.uploadSessionArtifacts === 'function';\n\n const tRef = useRef(t);\n tRef.current = t;\n\n const fetchArtifacts = useCallback(\n async (opts: { reset: boolean; manual: boolean }) => {\n if (!canFetchArtifacts || !dataSource.fetchSessionArtifacts) {\n setFetching(false);\n setRefreshing(false);\n setLoadingMore(false);\n setArtifacts([]);\n setError(null);\n setHasMore(false);\n nextOffsetRef.current = 0;\n return;\n }\n\n const requestID = ++requestSeq.current;\n const offset = opts.reset ? 0 : nextOffsetRef.current;\n\n if (!hasLoadedRef.current || opts.reset) {\n if (opts.manual && hasLoadedRef.current) {\n setRefreshing(true);\n } else {\n setFetching(true);\n }\n } else {\n setLoadingMore(true);\n }\n setError(null);\n\n try {\n const response = await dataSource.fetchSessionArtifacts(sessionId, {\n limit: PAGE_SIZE,\n offset,\n });\n if (requestID !== requestSeq.current) {\n return;\n }\n\n const page = [...(response.artifacts || [])].sort(\n (a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt)\n );\n\n const nextList = opts.reset ? page : mergeArtifacts(artifactsRef.current, page);\n\n setArtifacts(nextList);\n artifactsRef.current = nextList;\n hasLoadedRef.current = true;\n\n const resolvedHasMore = Boolean(response.hasMore);\n const resolvedNextOffset =\n typeof response.nextOffset === 'number'\n ? response.nextOffset\n : offset + page.length;\n\n setHasMore(resolvedHasMore);\n nextOffsetRef.current = resolvedNextOffset;\n } catch (err) {\n if (requestID !== requestSeq.current) {\n return;\n }\n setError(err instanceof Error ? err.message : tRef.current('BiChat.Artifacts.FailedToLoad'));\n } finally {\n if (requestID === requestSeq.current) {\n setFetching(false);\n setRefreshing(false);\n setLoadingMore(false);\n }\n }\n },\n [canFetchArtifacts, dataSource, sessionId]\n );\n\n useEffect(() => {\n hasLoadedRef.current = false;\n setFetching(true);\n setRefreshing(false);\n setLoadingMore(false);\n setError(null);\n setArtifacts([]);\n artifactsRef.current = [];\n setPreviewArtifactID(null);\n setHasMore(false);\n nextOffsetRef.current = 0;\n void fetchArtifacts({ reset: true, manual: false });\n }, [fetchArtifacts, sessionId]);\n\n useEffect(() => {\n const wasStreaming = prevStreamingRef.current;\n if (wasStreaming && !isStreaming) {\n void fetchArtifacts({ reset: true, manual: false });\n }\n prevStreamingRef.current = isStreaming;\n }, [fetchArtifacts, isStreaming]);\n\n useEffect(() => {\n if (artifactsInvalidationTrigger > 0 && sessionId && canFetchArtifacts) {\n void fetchArtifacts({ reset: true, manual: false });\n }\n }, [artifactsInvalidationTrigger, sessionId, canFetchArtifacts, fetchArtifacts]);\n\n const visibilityFetchRef = useRef(fetchArtifacts);\n visibilityFetchRef.current = fetchArtifacts;\n const sessionIdRef = useRef(sessionId);\n sessionIdRef.current = sessionId;\n const canFetchRef = useRef(canFetchArtifacts);\n canFetchRef.current = canFetchArtifacts;\n\n useEffect(() => {\n const handler = () => {\n if (\n document.visibilityState === 'visible' &&\n sessionIdRef.current &&\n canFetchRef.current\n ) {\n void visibilityFetchRef.current({ reset: true, manual: false });\n }\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, []);\n\n const previewArtifact = useMemo(\n () => artifacts.find((artifact) => artifact.id === previewArtifactID) ?? null,\n [artifacts, previewArtifactID]\n );\n\n const clearDropSuccessTimer = useCallback(() => {\n if (dropSuccessTimerRef.current === null) {return;}\n window.clearTimeout(dropSuccessTimerRef.current);\n dropSuccessTimerRef.current = null;\n }, []);\n\n useEffect(() => {\n return () => {\n clearDropSuccessTimer();\n };\n }, [clearDropSuccessTimer]);\n\n const setDropSuccessState = useCallback(() => {\n setDropSuccess(true);\n clearDropSuccessTimer();\n dropSuccessTimerRef.current = window.setTimeout(() => {\n setDropSuccess(false);\n dropSuccessTimerRef.current = null;\n }, 1400);\n }, [clearDropSuccessTimer]);\n\n const hasDragFiles = useCallback((e: React.DragEvent): boolean => {\n return Array.from(e.dataTransfer.types || []).includes('Files');\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (!canDropFiles || !hasDragFiles(e)) {return;}\n e.preventDefault();\n e.stopPropagation();\n dragDepthRef.current += 1;\n setIsDragging(true);\n }, [canDropFiles, hasDragFiles]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n if (!canDropFiles || !hasDragFiles(e)) {return;}\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, [canDropFiles, hasDragFiles]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n if (!canDropFiles || !hasDragFiles(e)) {return;}\n e.preventDefault();\n e.stopPropagation();\n dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n if (dragDepthRef.current === 0) {\n setIsDragging(false);\n }\n }, [canDropFiles, hasDragFiles]);\n\n const handleDrop = useCallback(async (e: React.DragEvent) => {\n if (!canDropFiles || !dataSource.uploadSessionArtifacts || !hasDragFiles(e)) {return;}\n e.preventDefault();\n e.stopPropagation();\n dragDepthRef.current = 0;\n setIsDragging(false);\n\n const itemFiles = Array.from(e.dataTransfer.items || [])\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null);\n const droppedFiles = itemFiles.length > 0 ? itemFiles : Array.from(e.dataTransfer.files || []);\n\n if (droppedFiles.length === 0) {return;}\n try {\n const result = await dataSource.uploadSessionArtifacts(sessionId, droppedFiles);\n if ((result.artifacts || []).length > 0) {\n setDropSuccessState();\n void fetchArtifacts({ reset: true, manual: false });\n }\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : tRef.current('BiChat.Artifacts.FailedToLoad'));\n }\n }, [canDropFiles, dataSource, fetchArtifacts, hasDragFiles, sessionId, setDropSuccessState]);\n\n const canRenameArtifacts = typeof dataSource.renameSessionArtifact === 'function';\n const canDeleteArtifacts = typeof dataSource.deleteSessionArtifact === 'function';\n\n const handleRenameArtifact = useCallback(\n async (artifact: SessionArtifact, name: string) => {\n if (!dataSource.renameSessionArtifact) {\n return;\n }\n const updatedArtifact = await dataSource.renameSessionArtifact(\n artifact.id,\n name,\n artifact.description || ''\n );\n setArtifacts((prev) => {\n const next = prev.map((item) => (item.id === updatedArtifact.id ? updatedArtifact : item));\n artifactsRef.current = next;\n return next;\n });\n },\n [dataSource]\n );\n\n const canDeleteArtifact = useCallback((artifact: SessionArtifact): boolean => {\n return artifact.type === 'attachment' && !artifact.messageId;\n }, []);\n\n const handleDeleteArtifact = useCallback(\n async (artifact: SessionArtifact) => {\n if (!dataSource.deleteSessionArtifact || !canDeleteArtifact(artifact)) {\n return;\n }\n await dataSource.deleteSessionArtifact(artifact.id);\n setArtifacts((prev) => {\n const next = prev.filter((item) => item.id !== artifact.id);\n artifactsRef.current = next;\n return next;\n });\n setPreviewArtifactID((current) => (current === artifact.id ? null : current));\n },\n [canDeleteArtifact, dataSource]\n );\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleAttachClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n const handleFileInputChange = useCallback(\n async (e: ChangeEvent<HTMLInputElement>) => {\n if (!dataSource.uploadSessionArtifacts || !e.target.files?.length) {return;}\n const files = Array.from(e.target.files);\n try {\n const result = await dataSource.uploadSessionArtifacts(sessionId, files);\n if ((result.artifacts || []).length > 0) {\n setDropSuccessState();\n void fetchArtifacts({ reset: true, manual: false });\n }\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : tRef.current('BiChat.Artifacts.FailedToLoad'));\n } finally {\n // Reset input so same file can be re-selected\n e.target.value = '';\n }\n },\n [dataSource, fetchArtifacts, sessionId, setDropSuccessState]\n );\n\n return (\n <aside\n className={[\n 'relative flex min-w-0 flex-1 flex-col border-l border-gray-200 bg-white dark:border-gray-700/80 dark:bg-gray-900',\n isDragging ? 'bg-primary-50/40 dark:bg-primary-950/20' : '',\n className,\n ].join(' ')}\n aria-label={t('BiChat.Artifacts.Title')}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {(isDragging || dropSuccess) && (\n <div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center bg-white/85 dark:bg-gray-900/85\">\n <div\n className={[\n 'mx-4 flex w-full max-w-xs flex-col items-center gap-2 rounded-xl border-2 border-dashed px-4 py-6 text-center',\n dropSuccess\n ? 'border-emerald-400 bg-emerald-50 text-emerald-700 dark:border-emerald-500 dark:bg-emerald-950/30 dark:text-emerald-300'\n : 'border-primary-400 bg-primary-50 text-primary-700 dark:border-primary-500 dark:bg-primary-950/30 dark:text-primary-300',\n ].join(' ')}\n >\n <Paperclip className=\"h-5 w-5\" weight=\"bold\" />\n <span className=\"text-sm font-medium\">\n {dropSuccess ? t('BiChat.Input.FilesAdded') : t('BiChat.Input.DropFiles')}\n </span>\n </div>\n </div>\n )}\n\n <header className=\"flex items-center justify-between border-b border-gray-200 px-3 py-2 dark:border-gray-700/80\">\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold text-gray-900 dark:text-gray-100\">\n {t('BiChat.Artifacts.Title')} ({artifacts.length})\n </h2>\n </div>\n {canDropFiles && (\n <>\n <button\n type=\"button\"\n onClick={handleAttachClick}\n className=\"ml-2 flex-shrink-0 rounded-md p-1.5 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:text-gray-500 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n aria-label={t('BiChat.Artifacts.AttachFiles')}\n title={t('BiChat.Artifacts.AttachFiles')}\n >\n <Plus className=\"h-4 w-4\" weight=\"bold\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={handleFileInputChange}\n aria-label={t('BiChat.Artifacts.AttachFiles')}\n />\n </>\n )}\n </header>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 py-3\">\n {fetching ? (\n <div className=\"flex h-full items-center justify-center text-sm text-gray-500 dark:text-gray-400\">\n {t('BiChat.Artifacts.Loading')}\n </div>\n ) : error ? (\n <div className=\"space-y-3 rounded-lg border border-red-200 bg-red-50 p-3 dark:border-red-900/70 dark:bg-red-950/30\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-300\">{t('BiChat.Artifacts.FailedToLoad')}</p>\n <p className=\"text-xs text-red-700 dark:text-red-400\">{error}</p>\n <button\n type=\"button\"\n onClick={() => {\n void fetchArtifacts({ reset: true, manual: true });\n }}\n className=\"cursor-pointer rounded-md border border-red-300 px-2 py-1 text-xs font-medium text-red-700 hover:bg-red-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400/50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40\"\n >\n {t('BiChat.Alert.Retry')}\n </button>\n </div>\n ) : !canFetchArtifacts ? (\n <div className=\"rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-900/70 dark:bg-amber-950/30 dark:text-amber-200\">\n {t('BiChat.Artifacts.Unsupported')}\n </div>\n ) : (\n <>\n <SessionArtifactList\n artifacts={artifacts}\n selectedArtifactId={previewArtifactID || undefined}\n onSelect={(artifact) => setPreviewArtifactID(artifact.id)}\n />\n\n {hasMore && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => {\n void fetchArtifacts({ reset: false, manual: true });\n }}\n disabled={loadingMore || refreshing || fetching}\n className=\"cursor-pointer rounded-md border border-gray-200 px-3 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n {loadingMore ? t('BiChat.Artifacts.LoadingMore') : t('BiChat.Artifacts.LoadMore')}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n\n <SessionArtifactPreviewModal\n isOpen={previewArtifact !== null}\n artifact={previewArtifact}\n onClose={() => setPreviewArtifactID(null)}\n canRename={canRenameArtifacts}\n canDelete={Boolean(previewArtifact && canDeleteArtifacts && canDeleteArtifact(previewArtifact))}\n onRename={canRenameArtifacts ? handleRenameArtifact : undefined}\n onDelete={canDeleteArtifacts ? handleDeleteArtifact : undefined}\n />\n </aside>\n );\n}\n","import { type ReactNode, useState, useMemo } from 'react';\nimport {\n ChartBar,\n Code,\n FileCsv,\n Image as ImageIcon,\n Package,\n Table as TableIcon,\n} from '@phosphor-icons/react';\nimport type { SessionArtifact } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { formatFileSize, getFileVisual, CHART_VISUAL, type FileVisual } from '../utils/fileUtils';\nimport { getArtifactName, isImageArtifact } from '../utils/artifactHelpers';\n\ninterface SessionArtifactListProps {\n artifacts: SessionArtifact[]\n selectedArtifactId?: string\n onSelect: (artifact: SessionArtifact) => void\n}\n\nconst TYPE_LABEL_KEYS: Record<string, string> = {\n chart: 'BiChat.Artifacts.GroupCharts',\n table: 'BiChat.Artifacts.GroupTables',\n code_output: 'BiChat.Artifacts.GroupCodeOutputs',\n export: 'BiChat.Artifacts.GroupExports',\n attachment: 'BiChat.Artifacts.GroupAttachments',\n other: 'BiChat.Artifacts.GroupOther',\n};\n\nfunction getGroupIcon(type: string): ReactNode {\n const cls = 'h-3.5 w-3.5';\n switch (type) {\n case 'chart':\n return <ChartBar className={cls} weight=\"bold\" />;\n case 'table':\n return <TableIcon className={cls} weight=\"bold\" />;\n case 'code_output':\n return <Code className={cls} weight=\"bold\" />;\n case 'export':\n return <FileCsv className={cls} weight=\"bold\" />;\n case 'attachment':\n return <ImageIcon className={cls} weight=\"bold\" />;\n default:\n return <Package className={cls} weight=\"bold\" />;\n }\n}\n\nfunction ImageThumbnail({ src, alt }: { src: string; alt: string }) {\n const [failed, setFailed] = useState(false);\n if (failed) {\n return (\n <div className=\"w-full aspect-video rounded-lg bg-violet-50 dark:bg-violet-900/30 flex items-center justify-center\">\n <ImageIcon className=\"h-6 w-6 text-violet-400 dark:text-violet-500\" weight=\"duotone\" />\n </div>\n );\n }\n return (\n <img\n src={src}\n alt={alt}\n onError={() => setFailed(true)}\n className=\"w-full rounded-lg object-cover max-h-32 bg-gray-100 dark:bg-gray-800\"\n />\n );\n}\n\nfunction getArtifactFileVisual(artifact: SessionArtifact): FileVisual {\n if (artifact.type === 'chart') {return CHART_VISUAL;}\n if (artifact.type === 'code_output') {\n const v = getFileVisual(artifact.mimeType, getArtifactName(artifact));\n // Code outputs get a sky accent unless they resolve to something specific (image, etc.)\n if (v.label === 'TEXT' || v.label === 'FILE') {\n return { ...v, iconColor: 'text-sky-600 dark:text-sky-400', bgColor: 'bg-sky-100 dark:bg-sky-900/40' };\n }\n return v;\n }\n return getFileVisual(artifact.mimeType, getArtifactName(artifact));\n}\n\nfunction groupArtifactsByType(artifacts: SessionArtifact[]): Array<{ type: string; items: SessionArtifact[] }> {\n const grouped = new Map<string, SessionArtifact[]>();\n\n for (const artifact of artifacts) {\n const type = artifact.type || 'other';\n const existing = grouped.get(type);\n if (existing) {\n existing.push(artifact);\n continue;\n }\n grouped.set(type, [artifact]);\n }\n\n return Array.from(grouped.entries())\n .map(([type, items]) => ({\n type,\n items: items.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt)),\n }))\n .sort((a, b) => a.type.localeCompare(b.type));\n}\n\nexport function SessionArtifactList({\n artifacts,\n selectedArtifactId,\n onSelect,\n}: SessionArtifactListProps) {\n const { t } = useTranslation();\n const grouped = useMemo(() => groupArtifactsByType(artifacts), [artifacts]);\n\n if (artifacts.length === 0) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 px-4 py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-gray-100 dark:bg-gray-800\">\n <Package className=\"h-6 w-6 text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n {t('BiChat.Artifacts.Empty')}\n </p>\n <p className=\"mt-0.5 text-xs text-gray-400 dark:text-gray-500\">\n {t('BiChat.Artifacts.EmptySubtitle')}\n </p>\n <p className=\"mt-2 text-xs text-gray-400 dark:text-gray-500\">\n {t('BiChat.Artifacts.EmptyHint')}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-5\">\n {grouped.map((group) => (\n <section key={group.type}>\n <div className=\"mb-2 flex items-center gap-1.5 px-0.5\">\n <span className=\"text-gray-400 dark:text-gray-500\">{getGroupIcon(group.type)}</span>\n <h3 className=\"text-[11px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {TYPE_LABEL_KEYS[group.type] ? t(TYPE_LABEL_KEYS[group.type]) : group.type.replace(/_/g, ' ')}\n </h3>\n <span className=\"ml-auto text-[10px] tabular-nums text-gray-400 dark:text-gray-500\">\n {group.items.length}\n </span>\n </div>\n <div className=\"space-y-1\">\n {group.items.map((artifact) => {\n const isSelected = artifact.id === selectedArtifactId;\n const visual = getArtifactFileVisual(artifact);\n const Icon = visual.icon;\n const artifactName = getArtifactName(artifact);\n return (\n <button\n key={artifact.id}\n type=\"button\"\n onClick={() => onSelect(artifact)}\n className={`cursor-pointer group/item w-full rounded-lg border px-3 py-2 text-left transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 ${\n isSelected\n ? 'border-primary-200 bg-primary-50/80 shadow-sm dark:border-primary-800/60 dark:bg-primary-950/40'\n : 'border-transparent bg-white hover:border-gray-200 hover:bg-gray-50 hover:shadow-sm dark:bg-gray-900 dark:hover:border-gray-700/80 dark:hover:bg-gray-800/60'\n }`}\n >\n {isImageArtifact(artifact) && artifact.url ? (\n <div>\n <ImageThumbnail src={artifact.url} alt={artifactName} />\n <div className=\"mt-2\">\n <span className=\"block truncate text-[13px] font-medium text-gray-900 dark:text-gray-100\">\n {artifactName}\n </span>\n <span className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n <span>{formatFileSize(artifact.sizeBytes)}</span>\n {artifact.description && (\n <>\n <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n <span className=\"truncate\">{artifact.description}</span>\n </>\n )}\n </span>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center gap-2.5\">\n <span className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor} ${visual.iconColor}`}>\n <Icon size={20} weight=\"duotone\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px] font-medium text-gray-900 dark:text-gray-100\">\n {artifactName}\n </span>\n <span className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n <span>{formatFileSize(artifact.sizeBytes)}</span>\n {artifact.description && (\n <>\n <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n <span className=\"truncate\">{artifact.description}</span>\n </>\n )}\n </span>\n </span>\n </div>\n )}\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","import type { SessionArtifact } from '../types';\n\nexport const FALLBACK_ARTIFACT_NAME = 'Untitled artifact';\n\nexport function getArtifactName(artifact: SessionArtifact): string {\n const name = artifact.name?.trim();\n return name && name.length > 0 ? name : FALLBACK_ARTIFACT_NAME;\n}\n\nexport function isImageArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || '';\n const name = getArtifactName(artifact).toLowerCase();\n return mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name);\n}\n\nexport function isPDFArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || '';\n const name = getArtifactName(artifact).toLowerCase();\n return mime.includes('pdf') || name.endsWith('.pdf');\n}\n\nexport function isOfficeDocumentArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || '';\n const name = getArtifactName(artifact).toLowerCase();\n return (\n mime.includes('wordprocessingml') ||\n mime.includes('msword') ||\n mime.includes('excel') ||\n mime.includes('spreadsheet') ||\n /\\.(docx?|xlsx?|xlsm|xlsb)$/.test(name)\n );\n}\n\nexport function isTextArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || '';\n const name = getArtifactName(artifact).toLowerCase();\n return (\n mime.startsWith('text/') ||\n mime.includes('json') ||\n mime.includes('xml') ||\n mime.includes('yaml') ||\n mime.includes('csv') ||\n mime.includes('tab-separated') ||\n /\\.(txt|md|json|xml|ya?ml|csv|tsv|log|sql)$/.test(name)\n );\n}\n","import { useEffect, useState } from 'react';\n// Shadow-DOM-safe dialog: Headless UI Dialog portals to document.body, escaping\n// the shadow root and dropping all scoped Tailwind. InlineDialog stays inline.\nimport { InlineDialog, InlineDialogBackdrop, InlineDialogPanel } from './InlineDialog';\nimport { FloppyDisk, PencilSimple, Trash, X } from '@phosphor-icons/react';\nimport type { SessionArtifact } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { SessionArtifactPreview } from './SessionArtifactPreview';\n\ninterface SessionArtifactPreviewModalProps {\n isOpen: boolean\n artifact: SessionArtifact | null\n canRename?: boolean\n canDelete?: boolean\n onClose: () => void\n onRename?: (artifact: SessionArtifact, name: string) => Promise<void>\n onDelete?: (artifact: SessionArtifact) => Promise<void>\n}\n\nexport function SessionArtifactPreviewModal({\n isOpen,\n artifact,\n canRename = false,\n canDelete = false,\n onClose,\n onRename,\n onDelete,\n}: SessionArtifactPreviewModalProps) {\n const { t } = useTranslation();\n const [isEditingName, setIsEditingName] = useState(false);\n const [nameDraft, setNameDraft] = useState('');\n const [submittingRename, setSubmittingRename] = useState(false);\n const [submittingDelete, setSubmittingDelete] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setIsEditingName(false);\n setSubmittingRename(false);\n setSubmittingDelete(false);\n setError(null);\n setNameDraft(artifact?.name || '');\n }, [artifact]);\n\n const handleClose = () => {\n if (submittingRename || submittingDelete) {\n return;\n }\n onClose();\n };\n\n const handleRename = async () => {\n if (!artifact || !onRename) {\n return;\n }\n\n const nextName = nameDraft.trim();\n if (!nextName || nextName === artifact.name) {\n setIsEditingName(false);\n setNameDraft(artifact.name);\n return;\n }\n\n setSubmittingRename(true);\n setError(null);\n try {\n await onRename(artifact, nextName);\n setIsEditingName(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : t('BiChat.Artifacts.RenameFailed'));\n } finally {\n setSubmittingRename(false);\n }\n };\n\n const handleDelete = async () => {\n if (!artifact || !onDelete) {\n return;\n }\n if (!window.confirm(t('BiChat.Artifacts.DeleteConfirm'))) {\n return;\n }\n\n setSubmittingDelete(true);\n setError(null);\n try {\n await onDelete(artifact);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : t('BiChat.Artifacts.DeleteFailed'));\n } finally {\n setSubmittingDelete(false);\n }\n };\n\n if (!artifact) {\n return null;\n }\n\n return (\n <InlineDialog open={isOpen} onClose={handleClose} className=\"relative z-50\">\n <InlineDialogBackdrop className=\"fixed inset-0 bg-black/50 backdrop-blur-sm\" />\n\n <div className=\"fixed inset-0 overflow-y-auto p-4 lg:p-6\">\n <div className=\"mx-auto flex min-h-full w-full max-w-6xl items-center justify-center\">\n <InlineDialogPanel className=\"flex max-h-[92vh] w-full flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\">\n <div className=\"flex items-start justify-between gap-3 border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"min-w-0 flex-1\">\n {isEditingName ? (\n <div className=\"flex items-center gap-2\">\n <input\n value={nameDraft}\n onChange={(e) => setNameDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void handleRename();\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n setIsEditingName(false);\n setNameDraft(artifact.name);\n }\n }}\n className=\"w-full rounded-lg border border-gray-300 px-3 py-1.5 text-sm text-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\n aria-label={t('BiChat.Artifacts.Rename')}\n autoFocus\n />\n <button\n type=\"button\"\n onClick={() => {\n void handleRename();\n }}\n disabled={submittingRename}\n className=\"cursor-pointer inline-flex items-center gap-1 rounded-lg bg-primary-600 px-2.5 py-1.5 text-xs font-medium text-white transition-colors hover:bg-primary-700 disabled:cursor-not-allowed disabled:opacity-60\"\n >\n <FloppyDisk className=\"h-3.5 w-3.5\" weight=\"bold\" />\n {t('BiChat.Message.Save')}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setIsEditingName(false);\n setNameDraft(artifact.name);\n }}\n disabled={submittingRename}\n className=\"cursor-pointer rounded-lg border border-gray-200 px-2.5 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n {t('BiChat.Message.Cancel')}\n </button>\n </div>\n ) : (\n <h2 className=\"truncate text-base font-semibold text-gray-900 dark:text-gray-100\">\n {artifact.name}\n </h2>\n )}\n {artifact.description && (\n <p className=\"mt-1 truncate text-xs text-gray-500 dark:text-gray-400\">\n {artifact.description}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n {canRename && onRename && !isEditingName && (\n <button\n type=\"button\"\n onClick={() => {\n setError(null);\n setIsEditingName(true);\n }}\n className=\"cursor-pointer rounded-lg border border-gray-200 p-2 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n aria-label={t('BiChat.Artifacts.Rename')}\n title={t('BiChat.Artifacts.Rename')}\n >\n <PencilSimple className=\"h-4 w-4\" weight=\"regular\" />\n </button>\n )}\n {canDelete && onDelete && (\n <button\n type=\"button\"\n onClick={() => {\n void handleDelete();\n }}\n disabled={submittingDelete}\n className=\"cursor-pointer rounded-lg border border-red-200 p-2 text-red-600 transition-colors hover:bg-red-50 hover:text-red-700 disabled:cursor-not-allowed disabled:opacity-60 dark:border-red-900/60 dark:text-red-400 dark:hover:bg-red-950/30 dark:hover:text-red-300\"\n aria-label={t('BiChat.Artifacts.Delete')}\n title={t('BiChat.Artifacts.Delete')}\n >\n <Trash className=\"h-4 w-4\" weight=\"regular\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"cursor-pointer rounded-lg border border-gray-200 p-2 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n aria-label={t('BiChat.Common.Close')}\n title={t('BiChat.Common.Close')}\n >\n <X className=\"h-4 w-4\" weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto p-4 lg:p-5\">\n {error && (\n <div className=\"mb-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/70 dark:bg-red-950/30 dark:text-red-300\">\n {error}\n </div>\n )}\n <SessionArtifactPreview artifact={artifact} />\n </div>\n </InlineDialogPanel>\n </div>\n </div>\n </InlineDialog>\n );\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { ArrowSquareOut, DownloadSimple, FileText, SpinnerGap, WarningCircle } from '@phosphor-icons/react';\nimport type { SessionArtifact } from '../types';\nimport { parseChartDataFromSpec, isRecord } from '../utils/chartSpec';\nimport { parseRenderTableDataFromMetadata } from '../utils/tableSpec';\nimport { ChartCard } from './ChartCard';\nimport { InteractiveTableCard } from './InteractiveTableCard';\nimport { useTranslation } from '../hooks/useTranslation';\nimport {\n getArtifactName,\n isImageArtifact,\n isPDFArtifact,\n isOfficeDocumentArtifact,\n isTextArtifact,\n} from '../utils/artifactHelpers';\n\ninterface SessionArtifactPreviewProps {\n artifact: SessionArtifact\n}\n\nconst TEXT_PREVIEW_MAX_CHARS = 24000;\n\nfunction parseChartDataFromArtifact(artifact: SessionArtifact) {\n const metadata = artifact.metadata;\n if (!metadata || !isRecord(metadata)) {\n return null;\n }\n\n const spec = isRecord(metadata.spec) ? metadata.spec : metadata;\n if (!isRecord(spec)) {\n return null;\n }\n\n return parseChartDataFromSpec(spec, getArtifactName(artifact));\n}\n\nfunction isAbsoluteHTTPURL(url: string): boolean {\n return /^https?:\\/\\//i.test(url);\n}\n\nfunction WarningBox({ message }: { message: string }) {\n return (\n <div className=\"flex items-start gap-2.5 rounded-xl border border-amber-200/80 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-800/40 dark:bg-amber-950/20 dark:text-amber-200\">\n <WarningCircle className=\"mt-0.5 h-4 w-4 shrink-0\" weight=\"duotone\" />\n <span className=\"leading-relaxed\">{message}</span>\n </div>\n );\n}\n\nfunction ArtifactActions({ url }: { url: string }) {\n const { t } = useTranslation();\n const openLabel = t('BiChat.Artifacts.OpenInNewTab');\n const downloadLabel = t('BiChat.Artifacts.Download');\n\n return (\n <div className=\"flex items-center gap-2\">\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-2 rounded-lg border border-gray-200 px-3 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n <ArrowSquareOut className=\"h-3.5 w-3.5\" weight=\"bold\" />\n {openLabel}\n </a>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n download\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary-600 px-3 py-1.5 text-xs font-medium text-white shadow-sm transition-colors hover:bg-primary-700\"\n >\n <DownloadSimple className=\"h-3.5 w-3.5\" weight=\"bold\" />\n {downloadLabel}\n </a>\n </div>\n );\n}\n\nfunction TextArtifactPreview({ artifact }: { artifact: SessionArtifact }) {\n const { t } = useTranslation();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [content, setContent] = useState('');\n const [truncated, setTruncated] = useState(false);\n\n useEffect(() => {\n if (!artifact.url) {\n setLoading(false);\n setError(t('BiChat.Artifacts.TextPreviewFailed'));\n return;\n }\n\n const controller = new AbortController();\n setLoading(true);\n setError(null);\n setContent('');\n setTruncated(false);\n\n fetch(artifact.url, { signal: controller.signal, credentials: 'include' })\n .then(async (response) => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const text = await response.text();\n if (text.length > TEXT_PREVIEW_MAX_CHARS) {\n setContent(text.slice(0, TEXT_PREVIEW_MAX_CHARS));\n setTruncated(true);\n return;\n }\n setContent(text);\n })\n .catch((err) => {\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n setError(t('BiChat.Artifacts.TextPreviewFailed'));\n })\n .finally(() => {\n setLoading(false);\n });\n\n return () => {\n controller.abort();\n };\n }, [artifact.url, t]);\n\n if (loading) {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center rounded-xl border border-gray-200 bg-gray-50 text-sm text-gray-500 dark:border-gray-700/60 dark:bg-gray-800/30 dark:text-gray-400\">\n <SpinnerGap className=\"mr-2 h-4 w-4 animate-spin\" />\n {t('BiChat.Artifacts.PreviewLoading')}\n </div>\n );\n }\n\n if (error) {\n return <WarningBox message={error} />;\n }\n\n return (\n <div className=\"space-y-2\">\n <pre className=\"max-h-[70vh] overflow-auto rounded-xl border border-gray-200 bg-gray-50 p-3 text-xs leading-relaxed text-gray-800 dark:border-gray-700/60 dark:bg-gray-900 dark:text-gray-100\">\n {content || t('BiChat.Artifacts.PreviewUnavailable')}\n </pre>\n {truncated && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('BiChat.Artifacts.TextPreviewTruncated')}</p>\n )}\n </div>\n );\n}\n\nexport function SessionArtifactPreview({ artifact }: SessionArtifactPreviewProps) {\n const { t } = useTranslation();\n const artifactName = getArtifactName(artifact);\n\n const officeViewerURL = useMemo(() => {\n if (!artifact.url || !isAbsoluteHTTPURL(artifact.url)) {\n return null;\n }\n return `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(artifact.url)}`;\n }, [artifact.url]);\n\n if (artifact.type === 'chart') {\n const chartData = parseChartDataFromArtifact(artifact);\n if (chartData) {\n return <ChartCard chartData={chartData} />;\n }\n return <WarningBox message={t('BiChat.Artifacts.ChartUnavailable')} />;\n }\n\n if (artifact.type === 'table' && artifact.metadata && typeof artifact.metadata === 'object') {\n const tableData = parseRenderTableDataFromMetadata(\n artifact.metadata as Record<string, unknown>,\n artifact.id\n );\n if (tableData) {\n return (\n <div className=\"rounded-xl border border-gray-200/80 bg-white dark:border-gray-700/60 dark:bg-gray-900/30\">\n <InteractiveTableCard table={tableData} />\n </div>\n );\n }\n return <WarningBox message={t('BiChat.Artifacts.PreviewUnavailable')} />;\n }\n\n if (isImageArtifact(artifact)) {\n if (!artifact.url) {\n return <WarningBox message={t('BiChat.Artifacts.ImageUnavailable')} />;\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50/50 dark:border-gray-700/60 dark:bg-gray-800/30\">\n <img\n src={artifact.url}\n alt={artifactName}\n className=\"h-auto max-h-[72vh] w-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n <ArtifactActions url={artifact.url} />\n </div>\n );\n }\n\n if (isPDFArtifact(artifact)) {\n if (!artifact.url) {\n return <WarningBox message={t('BiChat.Artifacts.DownloadUnavailable')} />;\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50 dark:border-gray-700/60 dark:bg-gray-900\">\n <iframe\n src={artifact.url}\n title={artifactName}\n className=\"h-[72vh] w-full\"\n />\n </div>\n <ArtifactActions url={artifact.url} />\n </div>\n );\n }\n\n if (isOfficeDocumentArtifact(artifact)) {\n if (!artifact.url) {\n return <WarningBox message={t('BiChat.Artifacts.DownloadUnavailable')} />;\n }\n\n return (\n <div className=\"space-y-3\">\n {officeViewerURL ? (\n <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50 dark:border-gray-700/60 dark:bg-gray-900\">\n <iframe\n src={officeViewerURL}\n title={artifactName}\n className=\"h-[72vh] w-full\"\n />\n </div>\n ) : (\n <WarningBox message={t('BiChat.Artifacts.OfficePreviewUnavailable')} />\n )}\n <ArtifactActions url={artifact.url} />\n </div>\n );\n }\n\n if (isTextArtifact(artifact)) {\n return (\n <div className=\"space-y-3\">\n <TextArtifactPreview artifact={artifact} />\n {artifact.url && <ArtifactActions url={artifact.url} />}\n </div>\n );\n }\n\n if (artifact.url) {\n return (\n <div className=\"space-y-3\">\n <div className=\"flex min-h-[240px] flex-col items-center justify-center rounded-xl border border-gray-200/80 bg-gray-50/60 p-6 text-center dark:border-gray-700/60 dark:bg-gray-900\">\n <FileText className=\"h-8 w-8 text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n <p className=\"mt-3 text-sm font-medium text-gray-800 dark:text-gray-100\">{t('BiChat.Artifacts.PreviewUnavailable')}</p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">{t('BiChat.Artifacts.PreviewNotSupported')}</p>\n </div>\n <ArtifactActions url={artifact.url} />\n </div>\n );\n }\n\n return <WarningBox message={t('BiChat.Artifacts.DownloadUnavailable')} />;\n}\n","import type { RenderTableData, RenderTableExport } from '../types';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(value: unknown): string | null {\n if (typeof value !== 'string') {return null;}\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readPositiveInteger(value: unknown): number | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {return null;}\n const parsed = Number(trimmed);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {return null;}\n const n = Math.floor(value);\n return n > 0 ? n : null;\n}\n\nfunction normalizeRows(value: unknown): unknown[][] {\n if (!Array.isArray(value)) {return [];}\n\n const rows: unknown[][] = [];\n for (const row of value) {\n if (!Array.isArray(row)) {continue;}\n rows.push(row);\n }\n return rows;\n}\n\nfunction parseExport(value: unknown): RenderTableExport | undefined {\n if (!isRecord(value)) {return undefined;}\n const url = readString(value.url);\n if (!url) {return undefined;}\n\n return {\n url,\n filename: readString(value.filename) || 'table_export.xlsx',\n rowCount: readPositiveInteger(value.row_count) || readPositiveInteger(value.rowCount) || undefined,\n fileSizeKB: readPositiveInteger(value.file_size_kb) || readPositiveInteger(value.fileSizeKB) || undefined,\n };\n}\n\n/**\n * Parses RenderTableData from a record (e.g. artifact metadata from render_table tool).\n */\nexport function parseRenderTableDataFromMetadata(\n metadata: Record<string, unknown>,\n fallbackId: string\n): RenderTableData | null {\n if (!isRecord(metadata)) {return null;}\n return parseRenderTableDataFromObject(metadata, fallbackId);\n}\n\nfunction parseRenderTableDataFromObject(parsed: Record<string, unknown>, fallbackId: string): RenderTableData | null {\n const columns = Array.isArray(parsed.columns)\n ? parsed.columns\n .map((column) => readString(column))\n .filter((column): column is string => column !== null)\n : [];\n if (columns.length === 0) {return null;}\n\n const rows = normalizeRows(parsed.rows);\n\n const headersRaw = Array.isArray(parsed.headers)\n ? parsed.headers\n .map((header) => readString(header))\n .filter((header): header is string => header !== null)\n : [];\n const headers = headersRaw.length === columns.length ? headersRaw : columns;\n\n const columnTypesRaw = Array.isArray(parsed.column_types)\n ? parsed.column_types\n : Array.isArray(parsed.columnTypes)\n ? parsed.columnTypes\n : [];\n const columnTypes =\n columnTypesRaw.length === columns.length\n ? columnTypesRaw.map((t) => readString(t) || 'string')\n : undefined;\n\n const totalRows =\n readPositiveInteger(parsed.total_rows) ||\n readPositiveInteger(parsed.totalRows) ||\n readPositiveInteger(parsed.row_count) ||\n readPositiveInteger(parsed.rowCount) ||\n rows.length;\n const pageSize = readPositiveInteger(parsed.page_size) || readPositiveInteger(parsed.pageSize) || 25;\n\n const query = readString(parsed.query) || readString(parsed.sql);\n if (!query) {return null;}\n\n return {\n id: readString(parsed.id) || fallbackId,\n title: readString(parsed.title) || undefined,\n query,\n columns,\n columnTypes,\n headers,\n rows,\n totalRows,\n pageSize,\n truncated: parsed.truncated === true,\n truncatedReason: readString(parsed.truncated_reason) || readString(parsed.truncatedReason) || undefined,\n export: parseExport(parsed.export),\n exportPrompt: readString(parsed.export_prompt) || readString(parsed.exportPrompt) || undefined,\n };\n}\n\nexport function parseRenderTableDataFromJsonString(\n json: string,\n fallbackId: string\n): RenderTableData | null {\n const trimmed = json.trim();\n if (!trimmed) {return null;}\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return null;\n }\n\n if (!isRecord(parsed)) {return null;}\n return parseRenderTableDataFromObject(parsed, fallbackId);\n}\n","/**\n * SessionMembersModal\n * Polished sharing dialog for managing session members.\n * Uses InlineDialog, UserAvatars, custom search dropdown, and segmented role controls.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport {\n InlineDialog, InlineDialogBackdrop, InlineDialogPanel, InlineDialogTitle,\n} from './InlineDialog';\nimport { UserPlus, Trash, Crown, UsersThree, MagnifyingGlass, X } from '@phosphor-icons/react';\nimport type { ChatDataSource, SessionMember, SessionUser } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { UserAvatar } from './UserAvatar';\nimport { ConfirmModal } from './ConfirmModal';\n\nexport interface SessionMembersModalProps {\n isOpen: boolean\n sessionId?: string\n dataSource: ChatDataSource\n onClose: () => void\n}\n\n// ---------------------------------------------------------------------------\n// RoleSegmentedControl\n// ---------------------------------------------------------------------------\n\nconst ROLES: readonly ['editor', 'viewer'] = ['editor', 'viewer'];\n\nfunction RoleSegmentedControl({\n value,\n onChange,\n disabled,\n size = 'md',\n t,\n}: {\n value: 'editor' | 'viewer'\n onChange: (role: 'editor' | 'viewer') => void\n disabled?: boolean\n size?: 'sm' | 'md'\n t: (key: string) => string\n}) {\n const btnBase = size === 'sm'\n ? 'px-2 py-0.5 text-[11px]'\n : 'px-3 py-1 text-xs';\n const currentIndex = ROLES.indexOf(value);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) {return;}\n let nextIndex: number | null = null;\n if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault();\n nextIndex = currentIndex <= 0 ? ROLES.length - 1 : currentIndex - 1;\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault();\n nextIndex = currentIndex >= ROLES.length - 1 ? 0 : currentIndex + 1;\n }\n if (nextIndex !== null) {\n const nextRole = ROLES[nextIndex];\n onChange(nextRole);\n const target = e.currentTarget.querySelector(`[data-role=\"${nextRole}\"]`) as HTMLButtonElement | null;\n target?.focus();\n }\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('BiChat.Share.RoleLabel')}\n className=\"inline-flex rounded-lg border border-gray-200 dark:border-gray-700 p-0.5 bg-gray-50 dark:bg-gray-800/50\"\n onKeyDown={handleKeyDown}\n >\n {ROLES.map((role) => (\n <button\n key={role}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === role}\n tabIndex={value === role ? 0 : -1}\n data-role={role}\n disabled={disabled}\n onClick={() => onChange(role)}\n className={`${btnBase} cursor-pointer rounded-md font-medium transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 disabled:opacity-50 disabled:cursor-not-allowed ${\n value === role\n ? 'bg-primary-600 text-white shadow-sm'\n : 'text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100'\n }`}\n >\n {role === 'editor' ? t('BiChat.Share.RoleEditor') : t('BiChat.Share.RoleViewer')}\n </button>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Skeleton\n// ---------------------------------------------------------------------------\n\nfunction MemberSkeleton() {\n return (\n <div className=\"flex items-center gap-3 rounded-xl px-3 py-2.5\" aria-hidden=\"true\">\n <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse flex-shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-3 w-28 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-2.5 w-16 rounded bg-gray-100 dark:bg-gray-800 animate-pulse\" />\n </div>\n <div className=\"h-6 w-16 rounded-lg bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SessionMembersModal\n// ---------------------------------------------------------------------------\n\nexport function SessionMembersModal({ isOpen, sessionId, dataSource, onClose }: SessionMembersModalProps) {\n const headingId = useId();\n const { t } = useTranslation();\n const statusTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [users, setUsers] = useState<SessionUser[]>([]);\n const [members, setMembers] = useState<SessionMember[]>([]);\n const [selectedUser, setSelectedUser] = useState<SessionUser | null>(null);\n const [selectedRole, setSelectedRole] = useState<'editor' | 'viewer'>('editor');\n const [query, setQuery] = useState('');\n const [confirmRemove, setConfirmRemove] = useState<SessionMember | null>(null);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [dropdownHighlightIndex, setDropdownHighlightIndex] = useState(0);\n const dropdownOptionRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const canManageMembers = Boolean(\n dataSource.listUsers\n && dataSource.listSessionMembers\n && dataSource.addSessionMember\n && dataSource.updateSessionMemberRole\n && dataSource.removeSessionMember\n );\n\n const refresh = useCallback(async () => {\n if (!sessionId || !canManageMembers) {\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const [usersData, membersData] = await Promise.all([\n dataSource.listUsers!(),\n dataSource.listSessionMembers!(sessionId),\n ]);\n setUsers(usersData);\n setMembers(membersData);\n } catch {\n setError(t('BiChat.Share.LoadFailed'));\n } finally {\n setLoading(false);\n }\n }, [canManageMembers, dataSource, sessionId, t]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n void refresh();\n }, [isOpen, refresh]);\n\n // Reset state when modal closes\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n setSelectedUser(null);\n setSelectedRole('editor');\n setError(null);\n setConfirmRemove(null);\n setStatusMessage(null);\n setDropdownOpen(false);\n setDropdownHighlightIndex(0);\n }\n }, [isOpen]);\n\n const memberIDs = useMemo(() => new Set(members.map((m) => m.user.id)), [members]);\n const availableUsers = useMemo(\n () => users.filter((user) => !memberIDs.has(user.id)),\n [users, memberIDs],\n );\n\n const filteredUsers = useMemo(() => {\n if (!query.trim()) {\n return availableUsers;\n }\n const q = query.toLowerCase();\n return availableUsers.filter(\n (u) =>\n u.firstName.toLowerCase().includes(q)\n || u.lastName.toLowerCase().includes(q)\n || `${u.firstName} ${u.lastName}`.toLowerCase().includes(q)\n );\n }, [availableUsers, query]);\n\n // Reset dropdown highlight when filtered list changes\n useEffect(() => {\n setDropdownHighlightIndex((i) =>\n Math.min(Math.max(0, i), Math.max(0, filteredUsers.length - 1))\n );\n }, [filteredUsers.length]);\n\n useEffect(() => () => clearTimeout(statusTimerRef.current), []);\n\n const flashStatus = useCallback((msg: string) => {\n clearTimeout(statusTimerRef.current);\n setStatusMessage(msg);\n statusTimerRef.current = setTimeout(() => setStatusMessage(null), 3000);\n }, []);\n\n const handleAdd = useCallback(async () => {\n if (!sessionId || !selectedUser || !dataSource.addSessionMember) {\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await dataSource.addSessionMember(sessionId, selectedUser.id, selectedRole);\n setSelectedUser(null);\n setQuery('');\n flashStatus(t('BiChat.Share.MemberAdded'));\n await refresh();\n } catch {\n setError(t('BiChat.Share.AddFailed'));\n } finally {\n setSaving(false);\n }\n }, [sessionId, selectedUser, selectedRole, dataSource.addSessionMember, refresh, t, flashStatus]);\n\n const handleUpdateRole = useCallback(async (userId: string, role: 'editor' | 'viewer') => {\n if (!sessionId || !dataSource.updateSessionMemberRole) {\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await dataSource.updateSessionMemberRole(sessionId, userId, role);\n await refresh();\n } catch {\n setError(t('BiChat.Share.UpdateFailed'));\n } finally {\n setSaving(false);\n }\n }, [sessionId, dataSource.updateSessionMemberRole, refresh]);\n\n const handleRemove = useCallback(async (userId: string) => {\n if (!sessionId || !dataSource.removeSessionMember) {\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await dataSource.removeSessionMember(sessionId, userId);\n flashStatus(t('BiChat.Share.MemberRemoved'));\n await refresh();\n } catch {\n setError(t('BiChat.Share.RemoveFailed'));\n } finally {\n setSaving(false);\n }\n }, [sessionId, dataSource.removeSessionMember, refresh, flashStatus]);\n\n return (\n <>\n <InlineDialog open={isOpen} onClose={onClose} className=\"relative z-40\">\n <InlineDialogBackdrop className=\"fixed inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-sm transition-opacity duration-200\" />\n\n <div className=\"fixed inset-0 flex items-center justify-center z-50 p-4\">\n <InlineDialogPanel\n aria-labelledby={headingId}\n className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl dark:shadow-2xl dark:shadow-black/30 max-w-md w-full\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 pt-5 pb-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-9 h-9 rounded-xl bg-primary-50 dark:bg-primary-950/40 border border-primary-200/60 dark:border-primary-800/40\">\n <UsersThree size={18} weight=\"duotone\" className=\"text-primary-600 dark:text-primary-400\" />\n </div>\n <InlineDialogTitle id={headingId} className=\"text-base font-semibold text-gray-900 dark:text-gray-100\">\n {t('BiChat.Share.Title')}\n </InlineDialogTitle>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1.5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 dark:hover:text-gray-300 dark:hover:bg-gray-700 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={t('BiChat.Common.Close')}\n >\n <X size={18} />\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-6 pb-5 space-y-4\">\n {!canManageMembers && (\n <div className=\"rounded-xl border border-amber-200 bg-amber-50 px-3 py-2.5 text-xs text-amber-700 dark:border-amber-800/60 dark:bg-amber-900/20 dark:text-amber-300\">\n {t('BiChat.Share.Unsupported')}\n </div>\n )}\n\n {error && (\n <div className=\"rounded-xl border border-red-200 bg-red-50 px-3 py-2.5 text-xs text-red-700 dark:border-red-800/60 dark:bg-red-900/20 dark:text-red-300\">\n {error}\n </div>\n )}\n\n {/* Status announcements for screen readers */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {statusMessage}\n </div>\n\n {/* Members list */}\n <div>\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('BiChat.Share.Members')}{!loading && members.length > 0 ? ` (${members.length})` : ''}\n </h3>\n\n <div className=\"max-h-64 overflow-y-auto -mx-1 px-1 space-y-1\">\n {loading ? (\n <>\n <MemberSkeleton />\n <MemberSkeleton />\n <MemberSkeleton />\n </>\n ) : members.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 text-gray-400 dark:text-gray-500\">\n <UsersThree size={32} weight=\"thin\" className=\"mb-2\" />\n <p className=\"text-sm\">{t('BiChat.Share.Empty')}</p>\n </div>\n ) : (\n members.map((member) => (\n <div\n key={member.user.id}\n className=\"flex items-center gap-3 rounded-xl px-3 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700/40\"\n >\n <UserAvatar\n firstName={member.user.firstName}\n lastName={member.user.lastName}\n initials={member.user.initials}\n size=\"sm\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"truncate text-sm font-medium text-gray-900 dark:text-gray-100\">\n {member.user.firstName} {member.user.lastName}\n </div>\n </div>\n\n {member.role === 'owner' ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-amber-50 dark:bg-amber-900/20 border border-amber-200/60 dark:border-amber-800/40 px-2.5 py-0.5 text-[11px] font-medium text-amber-700 dark:text-amber-300\">\n <Crown size={12} weight=\"duotone\" />\n {t('BiChat.Share.RoleOwner')}\n </span>\n ) : (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <RoleSegmentedControl\n value={member.role}\n onChange={(role) => handleUpdateRole(member.user.id, role)}\n disabled={saving}\n size=\"sm\"\n t={t}\n />\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => setConfirmRemove(member)}\n className=\"cursor-pointer rounded-lg p-1.5 text-gray-400 transition-colors hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-900/20 dark:hover:text-red-400 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500/50\"\n aria-label={`${t('BiChat.Share.Remove')} ${member.user.firstName} ${member.user.lastName}`}\n >\n <Trash size={14} />\n </button>\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* Add member */}\n {canManageMembers && (\n <div className=\"rounded-xl border border-gray-200 dark:border-gray-700 p-3 space-y-3\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('BiChat.Share.AddMember')}\n </h3>\n\n {/* User search + dropdown — outer container owns blur-to-close so keyboard nav does not close dropdown */}\n <div\n className=\"relative\"\n onBlur={(e: React.FocusEvent<HTMLDivElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setDropdownOpen(false);\n }\n }}\n >\n <div className=\"relative\">\n <MagnifyingGlass\n size={14}\n className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500\"\n />\n <input\n type=\"text\"\n className=\"w-full rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/60 pl-8 pr-3 py-2 text-sm text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 transition-colors focus:border-primary-400 dark:focus:border-primary-600 focus:outline-none focus:ring-2 focus:ring-primary-500/20\"\n placeholder={t('BiChat.Share.SearchUsers')}\n value={selectedUser ? `${selectedUser.firstName} ${selectedUser.lastName}` : query}\n onFocus={() => { setDropdownOpen(true); setDropdownHighlightIndex(0); if (selectedUser) { setSelectedUser(null); setQuery(''); } }}\n onChange={(e) => { setQuery(e.target.value); setSelectedUser(null); setDropdownOpen(true); setDropdownHighlightIndex(0); }}\n onKeyDown={(e) => {\n if (!dropdownOpen || filteredUsers.length === 0) {\n if (e.key === 'Escape') { setDropdownOpen(false); }\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n setDropdownOpen(false);\n setDropdownHighlightIndex(0);\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n const next = (dropdownHighlightIndex + 1) % filteredUsers.length;\n setDropdownHighlightIndex(next);\n setTimeout(() => dropdownOptionRefs.current[next]?.focus(), 0);\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n const next = dropdownHighlightIndex <= 0 ? filteredUsers.length - 1 : dropdownHighlightIndex - 1;\n setDropdownHighlightIndex(next);\n setTimeout(() => dropdownOptionRefs.current[next]?.focus(), 0);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const user = filteredUsers[dropdownHighlightIndex];\n if (user) {\n setSelectedUser(user);\n setQuery('');\n setDropdownOpen(false);\n }\n }\n }}\n />\n </div>\n\n {dropdownOpen && !selectedUser && (\n <div className=\"absolute z-10 mt-1 max-h-48 w-full overflow-auto rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 shadow-lg py-1\">\n {filteredUsers.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-gray-500 dark:text-gray-400\">\n {availableUsers.length === 0\n ? t('BiChat.Share.NoUsersAvailable')\n : t('BiChat.Share.NoSearchResults')}\n </div>\n ) : (\n filteredUsers.map((user, index) => (\n <button\n key={user.id}\n type=\"button\"\n ref={(el) => { dropdownOptionRefs.current[index] = el; }}\n className={`flex w-full items-center gap-2.5 px-3 py-2 cursor-pointer transition-colors hover:bg-primary-50 dark:hover:bg-primary-900/20 ${index === dropdownHighlightIndex ? 'bg-primary-50 dark:bg-primary-900/20' : ''}`}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => { setSelectedUser(user); setQuery(''); setDropdownOpen(false); }}\n >\n <UserAvatar\n firstName={user.firstName}\n lastName={user.lastName}\n initials={user.initials}\n size=\"xs\"\n />\n <span className=\"text-sm text-gray-900 dark:text-gray-100\">\n {user.firstName} {user.lastName}\n </span>\n </button>\n ))\n )}\n </div>\n )}\n </div>\n\n {/* Role selector + Add button */}\n <div className=\"flex items-center justify-between\">\n <RoleSegmentedControl\n value={selectedRole}\n onChange={setSelectedRole}\n disabled={saving}\n t={t}\n />\n <button\n type=\"button\"\n onClick={handleAdd}\n disabled={saving || !selectedUser}\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-xl bg-primary-600 px-3.5 py-2 text-sm font-medium text-white shadow-sm transition-all duration-150 hover:bg-primary-700 hover:shadow active:bg-primary-800 disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800\"\n >\n <UserPlus size={14} />\n {t('BiChat.Share.Add')}\n </button>\n </div>\n </div>\n )}\n </div>\n </InlineDialogPanel>\n </div>\n </InlineDialog>\n\n {/* Remove confirmation */}\n <ConfirmModal\n isOpen={!!confirmRemove}\n isDanger\n title={t('BiChat.Share.RemoveConfirmTitle')}\n message={\n confirmRemove\n ? t('BiChat.Share.RemoveConfirmMessage').replace(\n '{{name}}',\n `${confirmRemove.user.firstName} ${confirmRemove.user.lastName}`\n )\n : ''\n }\n confirmText={t('BiChat.Share.Remove')}\n onConfirm={() => {\n if (confirmRemove) {\n void handleRemove(confirmRemove.user.id);\n }\n setConfirmRemove(null);\n }}\n onCancel={() => setConfirmRemove(null)}\n />\n </>\n );\n}\n\nexport default SessionMembersModal;\n","/**\n * ConfirmModal Component\n * Polished confirmation dialog with contextual icon, refined typography,\n * and smooth micro-interactions.\n * Uses @headlessui/react Dialog for accessible modal behavior.\n */\n\nimport { memo } from 'react';\nimport {\n InlineDialog, InlineDialogBackdrop, InlineDialogPanel, InlineDialogTitle, InlineDialogDescription,\n} from './InlineDialog';\nimport { WarningCircle } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface ConfirmModalProps {\n /** Whether the modal is open */\n isOpen: boolean\n /** Modal title */\n title: string\n /** Modal message/description */\n message: string\n /** Callback when user confirms */\n onConfirm: () => void\n /** Callback when user cancels */\n onCancel: () => void\n /** Confirm button text (defaults to \"Confirm\") */\n confirmText?: string\n /** Cancel button text (defaults to \"Cancel\") */\n cancelText?: string\n /** Whether this is a danger/destructive action (red confirm button) */\n isDanger?: boolean\n}\n\nfunction ConfirmModalBase({\n isOpen,\n title,\n message,\n onConfirm,\n onCancel,\n confirmText,\n cancelText,\n isDanger = false,\n}: ConfirmModalProps) {\n const { t } = useTranslation();\n const resolvedConfirmText = confirmText?.trim() ? confirmText : t('BiChat.Common.Confirm');\n const resolvedCancelText = cancelText?.trim() ? cancelText : t('BiChat.Common.Cancel');\n return (\n <InlineDialog open={isOpen} onClose={onCancel} className=\"relative z-40\">\n {/* Backdrop */}\n <InlineDialogBackdrop className=\"fixed inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-sm transition-opacity duration-200\" />\n\n {/* Modal */}\n <div className=\"fixed inset-0 flex items-center justify-center z-50 p-4\">\n <InlineDialogPanel className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl dark:shadow-2xl dark:shadow-black/30 max-w-sm w-full overflow-hidden\">\n <div className=\"px-6 pt-6 pb-5\">\n {/* Icon + Title */}\n <div className=\"flex items-start gap-4\">\n {isDanger && (\n <div className=\"flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-xl bg-red-50 dark:bg-red-950/40 border border-red-200/60 dark:border-red-800/40\">\n <WarningCircle size={22} weight=\"duotone\" className=\"text-red-600 dark:text-red-400\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <InlineDialogTitle className=\"text-base font-semibold text-gray-900 dark:text-gray-100 leading-snug\">\n {title}\n </InlineDialogTitle>\n <InlineDialogDescription className=\"mt-2 text-sm text-gray-600 dark:text-gray-400 leading-relaxed\">\n {message}\n </InlineDialogDescription>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-2.5 px-6 pb-5\">\n <button\n type=\"button\"\n onClick={onCancel}\n {...(isDanger ? { 'data-autofocus': true } : {})}\n className=\"cursor-pointer px-4 py-2 text-sm font-medium rounded-xl text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700/60 hover:bg-gray-200 dark:hover:bg-gray-700 active:bg-gray-250 dark:active:bg-gray-600 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800\"\n data-testid=\"confirm-modal-cancel\"\n >\n {resolvedCancelText}\n </button>\n <button\n type=\"button\"\n {...(!isDanger ? { 'data-autofocus': true } : {})}\n onClick={onConfirm}\n className={[\n 'cursor-pointer px-4 py-2 text-sm font-medium rounded-xl text-white',\n 'transition-all duration-150 shadow-sm hover:shadow',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800',\n isDanger\n ? 'bg-red-600 hover:bg-red-700 active:bg-red-800 focus-visible:ring-red-500/50'\n : 'bg-primary-600 hover:bg-primary-700 active:bg-primary-800 focus-visible:ring-primary-500/50',\n ].join(' ')}\n data-testid=\"confirm-modal-confirm\"\n >\n {resolvedConfirmText}\n </button>\n </div>\n </InlineDialogPanel>\n </div>\n </InlineDialog>\n );\n}\n\nconst ConfirmModal = memo(ConfirmModalBase);\nConfirmModal.displayName = 'ConfirmModal';\n\nexport { ConfirmModal };\nexport default ConfirmModal;\n","/**\n * StreamError Component\n * Error recovery UI for streaming failures\n */\n\nimport { motion } from 'framer-motion';\nimport { Warning, ArrowClockwise, ArrowsCounterClockwise, ArrowSquareOut, X } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst OPENAI_BILLING_URL = 'https://platform.openai.com/settings/organization/billing/overview';\nconst OPENAI_API_KEYS_URL = 'https://platform.openai.com/api-keys';\nconst OPENAI_STATUS_URL = 'https://status.openai.com';\n\ninterface ProviderErrorPresentation {\n titleKey: string\n descriptionKey: string\n retryable: boolean\n adminAction?: boolean\n action?: {\n href: string\n labelKey: string\n }\n}\n\nfunction providerErrorPresentation(error: string): ProviderErrorPresentation | null {\n if (error.includes('provider_billing_balance_exhausted')) {\n return {\n titleKey: 'BiChat.StreamError.ProviderBalance.Title',\n descriptionKey: 'BiChat.StreamError.ProviderBalance.Details',\n retryable: false,\n adminAction: true,\n action: {\n href: OPENAI_BILLING_URL,\n labelKey: 'BiChat.StreamError.OpenBilling',\n },\n };\n }\n if (\n error.includes('provider_billing_') ||\n error.includes('provider_quota_exhausted') ||\n error.includes('insufficient_quota') ||\n error.includes('credit_balance_exhausted')\n ) {\n return {\n titleKey: 'BiChat.StreamError.ProviderBilling.Title',\n descriptionKey: 'BiChat.StreamError.ProviderBilling.Details',\n retryable: false,\n adminAction: true,\n action: {\n href: OPENAI_BILLING_URL,\n labelKey: 'BiChat.StreamError.OpenBilling',\n },\n };\n }\n if (error.includes('provider_auth_') || error.includes('provider_ip_not_authorized')) {\n return {\n titleKey: 'BiChat.StreamError.ProviderAuth.Title',\n descriptionKey: 'BiChat.StreamError.ProviderAuth.Details',\n retryable: false,\n adminAction: true,\n action: {\n href: OPENAI_API_KEYS_URL,\n labelKey: 'BiChat.StreamError.OpenAPIKeys',\n },\n };\n }\n if (\n error.includes('provider_permission_denied') ||\n error.includes('provider_region_unsupported')\n ) {\n return {\n titleKey: 'BiChat.StreamError.ProviderAccess.Title',\n descriptionKey: 'BiChat.StreamError.ProviderAccess.Details',\n retryable: false,\n adminAction: true,\n };\n }\n if (error.includes('provider_rate_limited') || error.includes('provider_slow_down')) {\n return {\n titleKey: 'BiChat.StreamError.ProviderRateLimit.Title',\n descriptionKey: 'BiChat.StreamError.ProviderRateLimit.Details',\n retryable: true,\n };\n }\n if (error.includes('provider_context_limit')) {\n return {\n titleKey: 'BiChat.StreamError.ProviderContextLimit.Title',\n descriptionKey: 'BiChat.StreamError.ProviderContextLimit.Details',\n retryable: false,\n };\n }\n if (\n error.includes('provider_bad_request') ||\n error.includes('provider_unprocessable') ||\n error.includes('provider_not_found')\n ) {\n return {\n titleKey: 'BiChat.StreamError.ProviderRequest.Title',\n descriptionKey: 'BiChat.StreamError.ProviderRequest.Details',\n retryable: false,\n adminAction: true,\n };\n }\n if (error.includes('provider_timeout') || error.includes('provider_connection')) {\n return {\n titleKey: 'BiChat.StreamError.ProviderConnection.Title',\n descriptionKey: 'BiChat.StreamError.ProviderConnection.Details',\n retryable: true,\n };\n }\n if (\n error.includes('provider_server_error') ||\n error.includes('provider_overloaded') ||\n error.includes('provider_response_failed') ||\n error.includes('provider_conflict')\n ) {\n return {\n titleKey: 'BiChat.StreamError.ProviderUnavailable.Title',\n descriptionKey: 'BiChat.StreamError.ProviderUnavailable.Details',\n retryable: true,\n action: {\n href: OPENAI_STATUS_URL,\n labelKey: 'BiChat.StreamError.OpenStatus',\n },\n };\n }\n if (error.includes('provider_response_incomplete')) {\n return {\n titleKey: 'BiChat.StreamError.ProviderIncomplete.Title',\n descriptionKey: 'BiChat.StreamError.ProviderIncomplete.Details',\n retryable: true,\n };\n }\n return null;\n}\n\ninterface StreamErrorProps {\n /** Error message to display */\n error: string\n /** Callback to retry the failed operation */\n onRetry?: () => void\n /** Callback to regenerate the message */\n onRegenerate?: () => void\n /** Callback to dismiss the error */\n onDismiss?: () => void\n /** Whether to show compact mode (less padding) */\n compact?: boolean\n}\n\nexport function StreamError({\n error,\n onRetry,\n onRegenerate,\n onDismiss,\n compact = false,\n}: StreamErrorProps) {\n const { t } = useTranslation();\n const normalizedError = error.toLowerCase();\n const providerError = providerErrorPresentation(normalizedError);\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className={`flex items-start gap-3 ${compact ? 'px-3 py-2.5' : 'px-4 py-3'} bg-red-50 dark:bg-red-950/40 border border-red-200/80 dark:border-red-900/60 rounded-xl shadow-sm`}\n role=\"alert\"\n >\n <div className=\"flex-shrink-0 mt-0.5 flex items-center justify-center w-7 h-7 rounded-full bg-red-100 dark:bg-red-900/40\">\n <Warning\n className=\"w-4 h-4 text-red-600 dark:text-red-400\"\n weight=\"fill\"\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-200 leading-snug\">\n {providerError\n ? t(providerError.titleKey)\n : t('BiChat.Error.Generic')}\n </p>\n <p className=\"mt-0.5 text-xs text-red-600/80 dark:text-red-400/70 break-words leading-relaxed\">\n {providerError\n ? t(providerError.descriptionKey)\n : error}\n </p>\n {providerError?.adminAction && (\n <p className=\"mt-1 text-xs font-medium text-red-700 dark:text-red-300 leading-relaxed\">\n {t('BiChat.StreamError.AdminAction')}\n </p>\n )}\n <div className=\"flex items-center gap-2 mt-2\">\n {providerError?.action && (\n <a\n href={providerError.action.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-white bg-red-600 hover:bg-red-700 active:bg-red-800 dark:bg-red-700 dark:hover:bg-red-600 rounded-lg transition-colors shadow-sm\"\n >\n <ArrowSquareOut className=\"w-3.5 h-3.5\" />\n {t(providerError.action.labelKey)}\n </a>\n )}\n {onRetry && providerError?.retryable !== false && (\n <button\n onClick={onRetry}\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-white bg-red-600 hover:bg-red-700 active:bg-red-800 dark:bg-red-700 dark:hover:bg-red-600 rounded-lg transition-colors shadow-sm\"\n type=\"button\"\n >\n <ArrowClockwise className=\"w-3.5 h-3.5\" />\n {t('BiChat.StreamError.Retry')}\n </button>\n )}\n {onRegenerate && (\n <button\n onClick={onRegenerate}\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg transition-colors shadow-sm\"\n type=\"button\"\n >\n <ArrowsCounterClockwise className=\"w-3.5 h-3.5\" />\n {t('BiChat.StreamError.Regenerate')}\n </button>\n )}\n </div>\n </div>\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"cursor-pointer flex-shrink-0 mt-0.5 inline-flex items-center justify-center w-6 h-6 text-red-400 dark:text-red-500 hover:text-red-600 dark:hover:text-red-300 hover:bg-red-100 dark:hover:bg-red-900/40 rounded-md transition-colors\"\n type=\"button\"\n aria-label={t('BiChat.Chat.DismissNotification')}\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </motion.div>\n );\n}\n","import { useEffect, useCallback, useMemo } from 'react';\nimport { Lightning, Brain } from '@phosphor-icons/react';\nimport { useChatSession } from '../context/ChatContext';\nimport { useIotaContext } from '../context/IotaContext';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ModelEntry {\n id: string\n label: string\n default?: boolean\n}\n\nexport function ModelSelector() {\n const { model, setModel } = useChatSession();\n const context = useIotaContext();\n const { t } = useTranslation();\n\n const models: ModelEntry[] = useMemo(\n () => context.extensions?.llm?.models ?? [],\n [context.extensions?.llm?.models],\n );\n\n const defaultModel = models.find((m) => m.default) ?? models[0];\n const currentModel = model ?? defaultModel?.id;\n\n // Set default model on mount\n useEffect(() => {\n if (!model && defaultModel) {\n setModel(defaultModel.id);\n }\n }, [model, defaultModel, setModel]);\n\n // Keyboard shortcut: Cmd+Shift+M to rotate\n const rotateModel = useCallback(() => {\n const currentIndex = models.findIndex((m) => m.id === currentModel);\n const nextIndex = (currentIndex + 1) % models.length;\n setModel(models[nextIndex].id);\n }, [currentModel, models, setModel]);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const isModifierPressed = e.metaKey || e.ctrlKey;\n const isShortcutKey = e.code === 'KeyM' || e.key.toLowerCase() === 'm';\n\n if (isModifierPressed && e.shiftKey && !e.altKey && isShortcutKey) {\n e.preventDefault();\n rotateModel();\n }\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [rotateModel]);\n\n // Don't render if less than 2 models\n if (models.length < 2) {return null;}\n\n return (\n <div className=\"flex items-center justify-between px-4 pt-3 pb-1\">\n <div className=\"inline-flex rounded-lg bg-gray-100 p-0.5 dark:bg-gray-800\">\n {models.map((m, i) => {\n const isActive = m.id === currentModel;\n const isFast = i === 0;\n return (\n <button\n key={m.id}\n type=\"button\"\n onClick={() => setModel(m.id)}\n className={`\n flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-all duration-150\n ${\n isActive\n ? isFast\n ? 'bg-white text-amber-600 shadow-sm dark:bg-gray-700 dark:text-amber-400'\n : 'bg-white text-blue-600 shadow-sm dark:bg-gray-700 dark:text-blue-400'\n : 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300'\n }\n `}\n >\n {isFast ? <Lightning size={13} weight=\"fill\" /> : <Brain size={13} weight=\"fill\" />}\n <span>{t(m.label)}</span>\n </button>\n );\n })}\n </div>\n <span className=\"hidden select-none text-[10px] text-gray-400 sm:block dark:text-gray-500\">\n {navigator.platform.includes('Mac') ? '\\u2318' : 'Ctrl'}{'\\u21E7'}M\n </span>\n </div>\n );\n}\n","/**\n * BI-Chat UI Components\n * Main export file\n */\n\n// Import styles (will be bundled as style.css)\nimport './styles.css';\n\n// =============================================================================\n// Layer 4: Full Components\n// =============================================================================\n\nexport { ChatSession, type ChatSessionProps } from './components/ChatSession';\nexport { ModelSelector } from './components/ModelSelector';\nexport { SessionArtifactsPanel } from './components/SessionArtifactsPanel';\nexport { SessionArtifactList } from './components/SessionArtifactList';\nexport { SessionArtifactPreview } from './components/SessionArtifactPreview';\nexport { ChatHeader } from './components/ChatHeader';\nexport { MessageList } from './components/MessageList';\nexport { TurnBubble, type TurnBubbleProps, type TurnBubbleClassNames } from './components/TurnBubble';\nexport { UserTurnView, type UserTurnViewProps } from './components/UserTurnView';\nexport { AssistantTurnView, type AssistantTurnViewProps } from './components/AssistantTurnView';\nexport { MarkdownRenderer } from './components/MarkdownRenderer';\nexport { ChartCard, type ChartCardHost } from './components/ChartCard';\nexport { SourcesPanel } from './components/SourcesPanel';\nexport { DownloadCard } from './components/DownloadCard';\nexport { InlineQuestionForm } from './components/InlineQuestionForm';\nexport { MessageInput, type MessageInputRef, type MessageInputProps } from './components/MessageInput';\nexport { AttachmentGrid } from './components/AttachmentGrid';\nexport { ImageModal } from './components/ImageModal';\nexport { WelcomeContent } from './components/WelcomeContent';\nexport { CodeOutputsPanel } from './components/CodeOutputsPanel';\nexport { StreamingCursor } from './components/StreamingCursor';\nexport { ScrollToBottomButton } from './components/ScrollToBottomButton';\nexport { CompactionDoodle } from './components/CompactionDoodle';\nexport { EmptyState, type EmptyStateProps } from './components/EmptyState';\nexport { EditableText, type EditableTextProps, type EditableTextRef } from './components/EditableText';\nexport { SearchInput, type SearchInputProps } from './components/SearchInput';\nexport {\n Skeleton,\n SkeletonGroup,\n SkeletonText,\n SkeletonAvatar,\n SkeletonCard,\n ListItemSkeleton,\n type SkeletonProps,\n type SkeletonGroupProps,\n} from './components/Skeleton';\n\n// Phase 2 components\nexport { CodeBlock } from './components/CodeBlock';\nexport { LoadingSpinner } from './components/LoadingSpinner';\nexport { TableExportButton } from './components/TableExportButton';\nexport { TableWithExport } from './components/TableWithExport';\nexport { InteractiveTableCard, type TableCardHost } from './components/InteractiveTableCard';\nexport { TabbedTableGroup, type TabbedTableGroupProps } from './components/TabbedTableGroup';\nexport { TabbedChartGroup, type TabbedChartGroupProps } from './components/TabbedChartGroup';\nexport {\n useDataTable,\n type UseDataTableReturn,\n type DataTableOptions,\n type ColumnMeta,\n type SortState,\n type ColumnStats,\n} from './hooks/useDataTable';\nexport { type ColumnType, type FormattedCell } from './utils/columnTypes';\n\n// Phase 5 generic components\nexport { Toast, type ToastProps } from './components/Toast';\nexport { ToastContainer } from './components/ToastContainer';\nexport { ConfirmModal, type ConfirmModalProps } from './components/ConfirmModal';\nexport { UserAvatar, type UserAvatarProps } from './components/UserAvatar';\nexport { AvatarStack, type AvatarStackProps } from './components/AvatarStack';\nexport { SessionMembersModal, type SessionMembersModalProps } from './components/SessionMembersModal';\nexport { PermissionGuard, type PermissionGuardProps } from './components/PermissionGuard';\nexport { ErrorBoundary, DefaultErrorContent } from './components/ErrorBoundary';\nexport { TypingIndicator, type TypingIndicatorProps } from './components/TypingIndicator';\nexport { ActivityTrace, type ActivityTraceProps } from './components/ActivityTrace';\n\n// Session management components\nexport { default as Sidebar } from './components/Sidebar';\nexport type { SidebarProps, ActiveTab } from './components/Sidebar';\nexport { default as SessionItem } from './components/SessionItem';\nexport { default as ArchivedChatList } from './components/ArchivedChatList';\nexport { default as AllChatsList } from './components/AllChatsList';\nexport { UserFilter } from './components/UserFilter';\nexport { default as DateGroupHeader } from './components/DateGroupHeader';\nexport { default as SessionSkeleton } from './components/SessionSkeleton';\n\n// Layout component\nexport { BiChatLayout, type BiChatLayoutProps, type SidebarDrawerProps } from './components/BiChatLayout';\n\n// Specialized message components\nexport { SystemMessage } from './components/SystemMessage';\nexport { DebugPanel, type DebugPanelProps } from './components/DebugPanel';\n\n// Generic UI components\nexport { default as Alert } from './components/Alert';\nexport { default as ArchiveBanner } from './components/ArchiveBanner';\nexport { RetryActionArea } from './components/RetryActionArea';\nexport { StreamError } from './components/StreamError';\nexport { MessageActions } from './components/MessageActions';\nexport { default as AttachmentPreview } from './components/AttachmentPreview';\nexport { default as AttachmentUpload } from './components/AttachmentUpload';\nexport { default as ScreenReaderAnnouncer } from './components/ScreenReaderAnnouncer';\nexport { default as SkipLink } from './components/SkipLink';\nexport { TouchContextMenu } from './components/TouchContextMenu';\n\n// Question form wizard\nexport { default as QuestionForm } from './components/QuestionForm';\nexport { default as QuestionStep } from './components/QuestionStep';\nexport { default as ConfirmationStep } from './components/ConfirmationStep';\n\n// =============================================================================\n// Layer 3: Composites (Styled with Slots)\n// =============================================================================\n\nexport {\n UserMessage,\n type UserMessageProps,\n type UserMessageSlots,\n type UserMessageClassNames,\n type UserMessageAvatarSlotProps,\n type UserMessageContentSlotProps,\n type UserMessageAttachmentsSlotProps,\n type UserMessageActionsSlotProps,\n} from './components/UserMessage';\n\nexport {\n AssistantMessage,\n type AssistantMessageProps,\n type AssistantMessageSlots,\n type AssistantMessageClassNames,\n type AssistantMessageAvatarSlotProps,\n type AssistantMessageContentSlotProps,\n type AssistantMessageSourcesSlotProps,\n type AssistantMessageChartsSlotProps,\n type AssistantMessageCodeOutputsSlotProps,\n type AssistantMessageTablesSlotProps,\n type AssistantMessageArtifactsSlotProps,\n type AssistantMessageActionsSlotProps,\n type AssistantMessageExplanationSlotProps,\n type RegenerateModelOption,\n} from './components/AssistantMessage';\n\n// =============================================================================\n// Layer 2: Primitives (Unstyled Compound Components)\n// =============================================================================\n\n// Primitives are exported from a separate entry point for tree-shaking\n// import { Turn, Avatar, Bubble, ActionButton } from '@iota-uz/sdk/bichat/primitives'\nexport * from './primitives';\n\n// =============================================================================\n// Layer 1: Headless Hooks\n// =============================================================================\n\n// Existing hooks\nexport { useStreaming } from './hooks/useStreaming';\nexport {\n useActiveRuns,\n type UseActiveRunsOptions,\n type UseActiveRunsResult,\n type ActiveRunSnapshot,\n} from './hooks/useActiveRuns';\nexport { useTranslation } from './hooks/useTranslation';\nexport { useModalLock } from './hooks/useModalLock';\nexport { useFocusTrap } from './hooks/useFocusTrap';\nexport { useToast, type ToastAction, type ToastItem, type ToastType, type UseToastReturn } from './hooks/useToast';\n\n// New composability hooks\nexport {\n useImageGallery,\n type UseImageGalleryOptions,\n type UseImageGalleryReturn,\n} from './hooks/useImageGallery';\n\nexport {\n useAutoScroll,\n type UseAutoScrollOptions,\n type UseAutoScrollReturn,\n} from './hooks/useAutoScroll';\n\nexport {\n useMessageActions,\n type UseMessageActionsOptions,\n type UseMessageActionsReturn,\n} from './hooks/useMessageActions';\n\nexport {\n useAttachments,\n type UseAttachmentsOptions,\n type UseAttachmentsReturn,\n type FileValidationError,\n} from './hooks/useAttachments';\n\nexport {\n useMarkdownCopy,\n type UseMarkdownCopyOptions,\n type UseMarkdownCopyReturn,\n} from './hooks/useMarkdownCopy';\n\n// Session & interaction hooks\nexport { useScrollToBottom } from './hooks/useScrollToBottom';\nexport { useKeyboardShortcuts, type ShortcutConfig } from './hooks/useKeyboardShortcuts';\nexport { useLongPress } from './hooks/useLongPress';\nexport { useSidebarState, type UseSidebarStateReturn } from './hooks/useSidebarState';\nexport { useHttpDataSourceConfigFromApplet } from './hooks/useHttpDataSourceConfigFromApplet';\nexport {\n useBichatRouter,\n type UseBichatRouterParams,\n type UseBichatRouterReturn,\n} from './hooks/useBichatRouter';\n\n// =============================================================================\n// Animations\n// =============================================================================\n\nexport * from './animations';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport { ChatSessionProvider, useChatSession, useChatMessaging, useOptionalChatMessaging, useChatInput, type ChatSessionProviderProps } from './context/ChatContext';\nexport { IotaContextProvider, useIotaContext, hasPermission } from './context/IotaContext';\nexport {\n ConfigProvider,\n useConfig,\n useRequiredConfig,\n} from './config/ConfigContext';\n\n// =============================================================================\n// Theme\n// =============================================================================\n\nexport { ThemeProvider, useTheme } from './theme/ThemeProvider';\nexport { lightTheme, darkTheme } from './theme/themes';\n\n// =============================================================================\n// API Utilities\n// =============================================================================\n\nexport { getCSRFToken, addCSRFHeader, createHeadersWithCSRF } from './api/csrf';\n\n// =============================================================================\n// Data Sources\n// =============================================================================\n\nexport { HttpDataSource, createHttpDataSource } from './data/HttpDataSource';\nexport type { BichatRPC } from './data/rpc.generated';\nexport { RunEventsConnectError } from './data/MessageTransport';\n\n// =============================================================================\n// Machine (framework-agnostic state management)\n// =============================================================================\n\nexport { ChatMachine, type ChatMachineConfig } from './machine';\n\n// =============================================================================\n// SSE Parsing\n// =============================================================================\n\nexport { parseBichatStream, parseBichatStreamEvents, parseSSEStream } from './utils/sseParser';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { RateLimiter } from './utils/RateLimiter';\nexport { getToolLabel } from './utils/toolLabels';\nexport { groupSteps } from './utils/activitySteps';\nexport * from './utils/fileUtils';\nexport { groupSessionsByDate } from './utils/sessionGrouping';\nexport { toErrorDisplay, isPermissionDeniedError, type RPCErrorDisplay } from './utils/errorDisplay';\nexport {\n splitIntoTextBlocks,\n readTextBlockOffsets,\n type AssistantTextBlock,\n} from './utils/textBlocks';\nexport {\n STREAM_EVENT_TYPES,\n TERMINAL_STREAM_EVENT_TYPES,\n isTerminalEvent,\n type StreamEventType,\n type TerminalStreamEventType,\n} from './utils/eventNames';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n // Core types\n Session,\n ToolCall,\n Citation,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChartData,\n ChartSeries,\n RenderTableData,\n RenderTableExport,\n Artifact,\n SessionArtifact,\n // HITL question types\n PendingQuestion,\n Question,\n QuestionOption,\n QuestionAnswerData,\n QuestionAnswers,\n // Streaming types\n StreamEvent,\n StreamChunk,\n ActiveRunDelivery,\n // Split data source interfaces\n SessionStore,\n MessageTransport,\n ArtifactStore,\n AdminStore,\n // Combined data source interface\n ChatDataSource,\n ChatSessionContextValue,\n ChatSessionStateValue,\n ChatMessagingStateValue,\n ChatInputStateValue,\n // Session management types\n SessionListResult,\n SessionUser,\n SessionMember,\n SessionAccess,\n SessionGroup,\n // Turn-based architecture types\n ConversationTurn,\n UserTurn,\n AssistantTurn,\n // Activity trace types\n ActivityStep,\n} from './types';\n\nexport type { Theme, ThemeColors, ThemeSpacing, ThemeBorderRadius } from './theme/types';\n\nexport type {\n UserContext,\n TenantContext,\n LocaleContext,\n AppConfig,\n IotaContext,\n} from './types/iota';\n\nexport type { BiChatConfig } from './config/ConfigContext';\nexport type { RateLimiterConfig } from './utils/RateLimiter';\nexport type { HttpDataSourceConfig } from './data/HttpDataSource';\n\n// =============================================================================\n// Enums\n// =============================================================================\n\nexport { MessageRole } from './types';\n\n// =============================================================================\n// CSS Variables Reference\n// =============================================================================\n// The styles.css file provides comprehensive CSS variables for theming.\n// Import styles: import '@iota-uz/sdk/bichat/styles.css'\n//\n// Key variable prefixes:\n// - --bichat-spacing-* : Spacing scale (0-16, xs/sm/md/lg/xl/2xl)\n// - --bichat-color-* : Colors (gray, primary, semantic, component-specific)\n// - --bichat-font-* : Typography (family, size, weight, line-height)\n// - --bichat-radius-* : Border radius (sm/md/lg/xl/2xl/full, semantic)\n// - --bichat-shadow-* : Box shadows (xs/sm/md/lg/xl/2xl)\n// - --bichat-transition-* : Transition durations\n// - --bichat-z-* : Z-index scale\n//\n// Dark mode: Use .dark class or [data-theme=\"dark\"] attribute\n","/**\n * EmptyState Component\n * Reusable empty state display with icon, title, description, and action\n */\n\nimport { memo, type ReactNode } from 'react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { fadeInVariants } from '../animations/variants';\n\nexport interface EmptyStateProps {\n /** Optional icon to display */\n icon?: ReactNode\n /** Main title text */\n title: string\n /** Optional description text */\n description?: string\n /** Optional action element (button, link, etc.) */\n action?: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-6 px-3',\n title: 'text-sm',\n description: 'text-xs',\n },\n md: {\n container: 'py-8 px-4',\n title: 'text-base',\n description: 'text-sm',\n },\n lg: {\n container: 'py-12 px-6',\n title: 'text-lg',\n description: 'text-base',\n },\n};\n\nfunction EmptyState({\n icon,\n title,\n description,\n action,\n className = '',\n size = 'md',\n}: EmptyStateProps) {\n const sizes = sizeClasses[size];\n const prefersReducedMotion = useReducedMotion();\n const duration = prefersReducedMotion ? 0 : 0.4;\n\n return (\n <motion.div\n className={`flex items-center justify-center ${sizes.container} ${className}`}\n variants={fadeInVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n >\n <div className=\"text-center max-w-md\">\n {/* Icon */}\n {icon && (\n <motion.div\n className=\"mb-4 flex justify-center\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration, delay: prefersReducedMotion ? 0 : 0.1 }}\n >\n {icon}\n </motion.div>\n )}\n\n {/* Title */}\n <motion.h3\n className={`${sizes.title} font-medium text-gray-900 dark:text-white mb-2`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration, delay: prefersReducedMotion ? 0 : 0.2 }}\n >\n {title}\n </motion.h3>\n\n {/* Description */}\n {description && (\n <motion.p\n className={`${sizes.description} text-gray-500 dark:text-gray-400 mb-4`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration, delay: prefersReducedMotion ? 0 : 0.3 }}\n >\n {description}\n </motion.p>\n )}\n\n {/* Action */}\n {action && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration, delay: prefersReducedMotion ? 0 : 0.4 }}\n >\n {action}\n </motion.div>\n )}\n </div>\n </motion.div>\n );\n}\n\nconst MemoizedEmptyState = memo(EmptyState);\nMemoizedEmptyState.displayName = 'EmptyState';\n\nexport { MemoizedEmptyState as EmptyState };\nexport default MemoizedEmptyState;\n","/**\n * EditableText Component\n * Inline editable text with double-click to edit\n * Features: auto-focus, auto-select, Enter to save, Escape to cancel\n * Can be triggered programmatically via ref.startEditing()\n */\n\nimport { useState, useRef, useEffect, useImperativeHandle, forwardRef, memo } from 'react';\nimport { CircleNotch } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface EditableTextProps {\n /** Current text value */\n value: string\n /** Callback when text is saved */\n onSave: (newValue: string) => void\n /** Maximum character length */\n maxLength?: number\n /** Whether the component is in loading state */\n isLoading?: boolean\n /** Placeholder text when empty */\n placeholder?: string\n /** Additional CSS classes for the text display */\n className?: string\n /** Additional CSS classes for the input */\n inputClassName?: string\n /** Font size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport interface EditableTextRef {\n /** Programmatically start editing mode */\n startEditing: () => void\n /** Programmatically cancel editing */\n cancelEditing: () => void\n}\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n};\n\nconst EditableText = forwardRef<EditableTextRef, EditableTextProps>(\n (\n {\n value,\n onSave,\n maxLength = 100,\n isLoading = false,\n placeholder,\n className = '',\n inputClassName = '',\n size = 'sm',\n },\n ref\n ) => {\n const { t } = useTranslation();\n const resolvedPlaceholder = placeholder ?? t('BiChat.Common.Untitled');\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n startEditing: () => {\n setIsEditing(true);\n },\n cancelEditing: () => {\n setEditValue(value);\n setIsEditing(false);\n },\n }));\n\n // Update edit value when value prop changes\n useEffect(() => {\n setEditValue(value);\n }, [value]);\n\n // Auto-focus and select when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n const handleSave = () => {\n const trimmed = editValue.trim();\n\n // Don't save if empty - revert to original\n if (!trimmed) {\n setEditValue(value);\n setIsEditing(false);\n return;\n }\n\n // Only call onSave if value actually changed\n if (trimmed !== value) {\n onSave(trimmed);\n }\n\n setIsEditing(false);\n };\n\n const handleCancel = () => {\n setEditValue(value);\n setIsEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSave();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n handleCancel();\n }\n };\n\n const handleDoubleClick = () => {\n setIsEditing(true);\n };\n\n const handleBlur = () => {\n handleSave();\n };\n\n const sizeClass = sizeClasses[size];\n\n if (isEditing) {\n return (\n <div\n className=\"flex items-center gap-2 flex-1\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onKeyUp={(e) => e.stopPropagation()}\n onBlur={handleBlur}\n maxLength={maxLength}\n placeholder={resolvedPlaceholder}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className={`flex-1 px-2 py-1 ${sizeClass} bg-white dark:bg-gray-700 border border-primary-500 dark:border-primary-600 rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:focus-visible:ring-primary-600/30 text-gray-900 dark:text-white ${inputClassName}`}\n aria-label={t('BiChat.EditableText.AriaLabel')}\n />\n </div>\n );\n }\n\n const displayValue = value || resolvedPlaceholder;\n\n return (\n <span\n onDoubleClick={handleDoubleClick}\n className={`${sizeClass} font-medium truncate flex-1 cursor-pointer select-none hover:text-primary-600 dark:hover:text-primary-400 transition-colors ${className}`}\n title={t('BiChat.EditableText.DoubleClickToEdit')}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleDoubleClick();\n }\n }}\n >\n {isLoading ? (\n <span className=\"inline-flex items-center gap-2 text-gray-400 dark:text-gray-500\">\n <CircleNotch size={12} className=\"animate-spin\" />\n <span className=\"italic\">{displayValue}</span>\n </span>\n ) : (\n <span className={!value ? 'text-gray-400 dark:text-gray-500 italic' : ''}>\n {displayValue}\n </span>\n )}\n </span>\n );\n }\n);\n\nEditableText.displayName = 'EditableText';\n\nconst MemoizedEditableText = memo(EditableText);\n\nexport { MemoizedEditableText as EditableText };\nexport default MemoizedEditableText;\n","/**\n * SearchInput Component\n * Reusable search input with icon, clear button, and keyboard shortcuts\n */\n\nimport { useEffect, useRef, memo, type KeyboardEvent } from 'react';\nimport { MagnifyingGlass, X } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface SearchInputProps {\n /** Current search value */\n value: string\n /** Callback when value changes */\n onChange: (value: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Auto-focus on mount */\n autoFocus?: boolean\n /** Callback when Enter is pressed */\n onSubmit?: (value: string) => void\n /** Callback when Escape is pressed */\n onEscape?: () => void\n /** Additional CSS classes for the container */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Disable the input */\n disabled?: boolean\n /** ARIA label for accessibility */\n ariaLabel?: string\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-1.5 pl-8 pr-8 text-xs',\n icon: 14,\n clearBtn: 'p-1',\n },\n md: {\n container: 'py-2.5 pl-10 pr-10 text-sm',\n icon: 16,\n clearBtn: 'p-1.5',\n },\n lg: {\n container: 'py-3 pl-12 pr-12 text-base',\n icon: 18,\n clearBtn: 'p-2',\n },\n};\n\nfunction SearchInput({\n value,\n onChange,\n placeholder,\n autoFocus = false,\n onSubmit,\n onEscape,\n className = '',\n size = 'md',\n disabled = false,\n ariaLabel,\n}: SearchInputProps) {\n const { t } = useTranslation();\n const resolvedPlaceholder = placeholder ?? t('BiChat.Common.Search');\n const resolvedAriaLabel = ariaLabel ?? t('BiChat.Common.Search');\n const inputRef = useRef<HTMLInputElement>(null);\n const sizes = sizeClasses[size];\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus();\n }\n }, [autoFocus]);\n\n const handleClear = () => {\n onChange('');\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onSubmit) {\n e.preventDefault();\n onSubmit(value);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (value && !onEscape) {\n // Default behavior: clear on Escape if no handler provided\n handleClear();\n } else if (onEscape) {\n onEscape();\n }\n }\n };\n\n return (\n <div className={`relative w-full ${className}`} role=\"search\">\n {/* Search Icon */}\n <span className=\"absolute inset-y-0 left-3 flex items-center pointer-events-none\">\n <MagnifyingGlass\n size={sizes.icon}\n weight=\"bold\"\n className=\"text-gray-400 dark:text-gray-500\"\n aria-hidden=\"true\"\n />\n </span>\n\n {/* Input Field */}\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n className={`w-full ${sizes.container} bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700/50 rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:border-primary-400 dark:focus-visible:border-primary-600 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed`}\n aria-label={resolvedAriaLabel}\n />\n\n {/* Clear Button */}\n {value && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className={`cursor-pointer absolute inset-y-0 right-2 flex items-center ${sizes.clearBtn} rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 transition-all duration-200 text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300`}\n aria-label={t('BiChat.Search.Clear')}\n title={t('BiChat.Search.Clear')}\n >\n <X size={sizes.icon - 2} weight=\"bold\" />\n </button>\n )}\n </div>\n );\n}\n\nconst MemoizedSearchInput = memo(SearchInput);\nMemoizedSearchInput.displayName = 'SearchInput';\n\nexport { MemoizedSearchInput as SearchInput };\nexport default MemoizedSearchInput;\n","/**\n * Skeleton Component\n * Reusable loading skeleton with multiple variants\n */\n\nimport { memo } from 'react';\n\nexport interface SkeletonProps {\n /** Skeleton variant */\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\n /** Width (CSS value or number for pixels) */\n width?: string | number\n /** Height (CSS value or number for pixels) */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Enable animation */\n animate?: boolean\n}\n\nexport interface SkeletonGroupProps {\n /** Number of skeleton items to render */\n count?: number\n /** Gap between items */\n gap?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes for the container */\n className?: string\n /** Render function for each skeleton item */\n children?: (index: number) => React.ReactNode\n}\n\nconst variantClasses = {\n text: 'rounded',\n circular: 'rounded-full',\n rectangular: 'rounded-none',\n rounded: 'rounded-lg',\n};\n\nconst gapClasses = {\n sm: 'space-y-1',\n md: 'space-y-2',\n lg: 'space-y-3',\n};\n\nfunction Skeleton({\n variant = 'text',\n width,\n height,\n className = '',\n animate = true,\n}: SkeletonProps) {\n const variantClass = variantClasses[variant];\n\n const style: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n };\n\n return (\n <div\n className={`bg-gray-200 dark:bg-gray-700 ${variantClass} ${animate ? 'animate-pulse' : ''} ${className}`}\n style={style}\n aria-hidden=\"true\"\n />\n );\n}\n\n/**\n * SkeletonGroup - Renders multiple skeleton items\n */\nexport function SkeletonGroup({\n count = 3,\n gap = 'md',\n className = '',\n children,\n}: SkeletonGroupProps) {\n const gapClass = gapClasses[gap];\n\n return (\n <div className={`${gapClass} ${className}`} aria-hidden=\"true\">\n {Array.from({ length: count }).map((_, index) =>\n children ? (\n <div key={index}>{children(index)}</div>\n ) : (\n <Skeleton key={index} variant=\"text\" height={16} />\n )\n )}\n </div>\n );\n}\n\n/**\n * SkeletonText - Text line skeleton with configurable width\n */\nexport function SkeletonText({\n lines = 1,\n className = '',\n}: {\n lines?: number\n className?: string\n}) {\n const widths = ['100%', '90%', '80%', '95%', '85%'];\n\n return (\n <div className={`space-y-2 ${className}`} aria-hidden=\"true\">\n {Array.from({ length: lines }).map((_, index) => (\n <Skeleton\n key={index}\n variant=\"text\"\n width={widths[index % widths.length]}\n height={14}\n />\n ))}\n </div>\n );\n}\n\n/**\n * SkeletonAvatar - Circular avatar skeleton\n */\nexport function SkeletonAvatar({\n size = 40,\n className = '',\n}: {\n size?: number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"circular\"\n width={size}\n height={size}\n className={className}\n />\n );\n}\n\n/**\n * SkeletonCard - Card-shaped skeleton\n */\nexport function SkeletonCard({\n width,\n height = 120,\n className = '',\n}: {\n width?: string | number\n height?: string | number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"rounded\"\n width={width}\n height={height}\n className={className}\n />\n );\n}\n\n/**\n * ListItemSkeleton - Common list item skeleton with icon and text\n */\nexport function ListItemSkeleton({ className = '' }: { className?: string }) {\n return (\n <div className={`flex items-center gap-3 px-3 py-2 ${className}`}>\n <Skeleton variant=\"rounded\" width={20} height={20} />\n <Skeleton variant=\"text\" height={16} className=\"flex-1\" />\n </div>\n );\n}\n\nconst MemoizedSkeleton = memo(Skeleton);\nMemoizedSkeleton.displayName = 'Skeleton';\n\nexport { MemoizedSkeleton as Skeleton };\nexport default MemoizedSkeleton;\n","/**\n * LoadingSpinner Component\n * Displays animated loading indicators\n */\n\nimport { memo } from 'react';\nimport { CircleNotch } from '@phosphor-icons/react';\n\ntype SpinnerVariant = 'spinner' | 'dots' | 'pulse'\n\ninterface LoadingSpinnerProps {\n variant?: SpinnerVariant\n size?: 'sm' | 'md' | 'lg'\n message?: string\n}\n\nfunction SpinnerLoader({\n size = 'md',\n message,\n}: {\n size: 'sm' | 'md' | 'lg'\n message?: string\n}) {\n const sizeMap = {\n sm: 16,\n md: 32,\n lg: 48,\n };\n\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n };\n\n return (\n <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <CircleNotch\n size={sizeMap[size]}\n className={`${sizeClasses[size]} animate-spin motion-reduce:animate-none text-[var(--bichat-primary)]`}\n />\n {message && <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n </div>\n );\n}\n\nfunction DotsLoader({\n size = 'md',\n message,\n}: {\n size: 'sm' | 'md' | 'lg'\n message?: string\n}) {\n const dotSizeClasses = {\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-3 h-3',\n };\n\n const gapClasses = {\n sm: 'gap-0.5',\n md: 'gap-1',\n lg: 'gap-1.5',\n };\n\n return (\n <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <div className={`flex ${gapClasses[size]}`}>\n {[0, 1, 2].map((index) => (\n <div\n key={index}\n className={`${dotSizeClasses[size]} bg-[var(--bichat-primary)] rounded-full animate-bounce motion-reduce:animate-none`}\n style={{ animationDelay: `${index * 0.15}s` }}\n />\n ))}\n </div>\n {message && <p className=\"mt-3 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n </div>\n );\n}\n\nfunction PulseLoader({\n size = 'md',\n message,\n}: {\n size: 'sm' | 'md' | 'lg'\n message?: string\n}) {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n };\n\n return (\n <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <div className={`${sizeClasses[size]} bg-[var(--bichat-primary)] rounded-full animate-pulse motion-reduce:animate-none`} />\n {message && <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n </div>\n );\n}\n\nfunction LoadingSpinner({ variant = 'spinner', size = 'md', message }: LoadingSpinnerProps) {\n switch (variant) {\n case 'dots':\n return <DotsLoader size={size} message={message} />;\n case 'pulse':\n return <PulseLoader size={size} message={message} />;\n case 'spinner':\n default:\n return <SpinnerLoader size={size} message={message} />;\n }\n}\n\nconst MemoizedLoadingSpinner = memo(LoadingSpinner);\nMemoizedLoadingSpinner.displayName = 'LoadingSpinner';\n\nexport { MemoizedLoadingSpinner as LoadingSpinner };\nexport default MemoizedLoadingSpinner;\n","/**\n * Toast Component\n * Individual toast notification with auto-dismiss, progress bar, and accessibility.\n * Uses @headlessui/react Transition for CSS-driven enter/leave animations.\n */\n\nimport { useEffect, useState, useCallback, useRef, useSyncExternalStore } from 'react';\nimport { Transition } from '@headlessui/react';\nimport { CheckCircle, XCircle, Info, Warning, X } from '@phosphor-icons/react';\nimport type { ToastType, ToastAction } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface ToastProps {\n id: string\n type: ToastType\n message: string\n duration?: number\n onDismiss: (id: string) => void\n /** Label for dismiss button (defaults to \"Dismiss\") */\n dismissLabel?: string\n /** Optional action button rendered in the toast */\n action?: ToastAction\n}\n\nconst typeConfig: Record<\n ToastType,\n { accent: string; bg: string; icon: string; progress: string; iconEl: typeof CheckCircle }\n> = {\n success: {\n accent: 'text-emerald-600 dark:text-emerald-400',\n bg: 'bg-emerald-50 dark:bg-emerald-950/40 border-emerald-200/80 dark:border-emerald-800/50',\n icon: 'bg-emerald-100 dark:bg-emerald-900/50',\n progress: 'bg-emerald-500 dark:bg-emerald-400',\n iconEl: CheckCircle,\n },\n error: {\n accent: 'text-red-600 dark:text-red-400',\n bg: 'bg-red-50 dark:bg-red-950/40 border-red-200/80 dark:border-red-800/50',\n icon: 'bg-red-100 dark:bg-red-900/50',\n progress: 'bg-red-500 dark:bg-red-400',\n iconEl: XCircle,\n },\n info: {\n accent: 'text-blue-600 dark:text-blue-400',\n bg: 'bg-blue-50 dark:bg-blue-950/40 border-blue-200/80 dark:border-blue-800/50',\n icon: 'bg-blue-100 dark:bg-blue-900/50',\n progress: 'bg-blue-500 dark:bg-blue-400',\n iconEl: Info,\n },\n warning: {\n accent: 'text-amber-600 dark:text-amber-400',\n bg: 'bg-amber-50 dark:bg-amber-950/40 border-amber-200/80 dark:border-amber-800/50',\n icon: 'bg-amber-100 dark:bg-amber-900/50',\n progress: 'bg-amber-500 dark:bg-amber-400',\n iconEl: Warning,\n },\n};\n\nconst reducedMotionQuery = '(prefers-reduced-motion: reduce)';\nlet reducedMotionMql: MediaQueryList | null = null;\nfunction getReducedMotionMql(): MediaQueryList | null {\n if (typeof window === 'undefined') {return null;}\n if (!reducedMotionMql) {\n reducedMotionMql = window.matchMedia(reducedMotionQuery);\n }\n return reducedMotionMql;\n}\nfunction subscribeReducedMotion(callback: () => void): () => void {\n const mql = getReducedMotionMql();\n if (!mql) {return () => {};}\n mql.addEventListener('change', callback);\n return () => mql.removeEventListener('change', callback);\n}\nfunction getReducedMotionSnapshot(): boolean {\n const mql = getReducedMotionMql();\n return mql ? mql.matches : false;\n}\nfunction getReducedMotionServerSnapshot(): boolean {\n return false;\n}\n\nexport function Toast({\n id,\n type,\n message,\n duration = 5000,\n onDismiss,\n dismissLabel,\n action,\n}: ToastProps) {\n const { t } = useTranslation();\n const resolvedDismissLabel = dismissLabel ?? t('BiChat.Chat.DismissNotification');\n const config = typeConfig[type];\n const Icon = config.iconEl;\n const [show, setShow] = useState(false);\n const [paused, setPaused] = useState(false);\n const remainingRef = useRef(duration);\n const startRef = useRef(Date.now());\n\n const prefersReducedMotion = useSyncExternalStore(\n subscribeReducedMotion,\n getReducedMotionSnapshot,\n getReducedMotionServerSnapshot\n );\n\n // Trigger enter transition on mount\n useEffect(() => {\n const frame = requestAnimationFrame(() => setShow(true));\n return () => cancelAnimationFrame(frame);\n }, []);\n\n // Auto-dismiss with pause/resume on hover\n useEffect(() => {\n if (paused) {return;}\n\n startRef.current = Date.now();\n const timer = setTimeout(() => {\n setShow(false);\n // Wait for leave transition before removing from DOM\n setTimeout(() => onDismiss(id), 200);\n }, remainingRef.current);\n\n return () => {\n // Capture how much time remains when pausing\n const elapsed = Date.now() - startRef.current;\n remainingRef.current = Math.max(0, remainingRef.current - elapsed);\n clearTimeout(timer);\n };\n }, [id, paused, onDismiss]);\n\n const handleDismiss = useCallback(() => {\n setShow(false);\n setTimeout(() => onDismiss(id), 200);\n }, [id, onDismiss]);\n\n const ariaLive = type === 'error' ? 'assertive' : 'polite';\n const role = type === 'error' || type === 'warning' ? 'alert' : 'status';\n\n return (\n <Transition\n show={show}\n enter=\"transition duration-200 ease-out\"\n enterFrom=\"-translate-y-2 opacity-0 scale-95\"\n enterTo=\"translate-y-0 opacity-100 scale-100\"\n leave=\"transition duration-150 ease-in\"\n leaveFrom=\"translate-y-0 opacity-100 scale-100\"\n leaveTo=\"-translate-y-2 opacity-0 scale-95\"\n >\n <div\n className={`relative flex items-start gap-3 rounded-xl border px-4 py-3 shadow-lg shadow-black/5 dark:shadow-black/20 backdrop-blur-sm min-w-[320px] max-w-[420px] overflow-hidden ${config.bg}`}\n role={role}\n aria-live={ariaLive}\n aria-atomic=\"true\"\n onMouseEnter={() => setPaused(true)}\n onMouseLeave={() => setPaused(false)}\n >\n {/* Icon */}\n <div className={`mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg ${config.icon}`}>\n <Icon size={16} className={config.accent} weight=\"fill\" />\n </div>\n\n {/* Message */}\n <p className=\"flex-1 pt-0.5 text-sm font-medium leading-snug text-gray-800 dark:text-gray-100\">\n {message}\n </p>\n\n {/* Action button */}\n {action && (\n <button\n type=\"button\"\n onClick={() => {\n action.onClick();\n handleDismiss();\n }}\n className={`shrink-0 text-sm font-semibold underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary-500/50 cursor-pointer ${config.accent}`}\n >\n {action.label}\n </button>\n )}\n\n {/* Dismiss */}\n <button\n onClick={handleDismiss}\n className=\"mt-0.5 -mr-1 cursor-pointer shrink-0 rounded-lg p-1 text-gray-400 hover:text-gray-600 hover:bg-gray-200/60 dark:text-gray-500 dark:hover:text-gray-300 dark:hover:bg-gray-700/60 transition-colors duration-100\"\n aria-label={resolvedDismissLabel}\n >\n <X size={14} weight=\"bold\" />\n </button>\n\n {/* Progress bar */}\n <div className=\"absolute inset-x-0 bottom-0 h-0.5 bg-black/5 dark:bg-white/5\">\n <div\n className={`h-full ${config.progress} origin-left motion-reduce:animate-none`}\n style={\n prefersReducedMotion\n ? {}\n : {\n animation: `bichat-toast-progress ${duration}ms linear forwards`,\n animationPlayState: paused ? 'paused' : 'running',\n }\n }\n />\n </div>\n </div>\n </Transition>\n );\n}\n\nexport default Toast;\n","/**\n * ToastContainer Component\n * Container for rendering toast notifications.\n * Positioned at bottom-right to stay out of the way of primary content.\n */\n\nimport { Toast } from './Toast';\nimport type { ToastItem } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ToastContainerProps {\n toasts: ToastItem[]\n onDismiss: (id: string) => void\n /** Label for dismiss buttons */\n dismissLabel?: string\n}\n\nexport function ToastContainer({ toasts, onDismiss, dismissLabel }: ToastContainerProps) {\n const { t } = useTranslation();\n if (toasts.length === 0) {return null;}\n\n return (\n <div\n aria-label={t('BiChat.Common.Notifications')}\n className=\"fixed top-6 right-6 z-[var(--bichat-z-toast,60)] flex flex-col gap-2 pointer-events-none\"\n >\n {toasts.map((toast) => (\n <div key={toast.id} className=\"pointer-events-auto\">\n <Toast {...toast} onDismiss={onDismiss} dismissLabel={dismissLabel} />\n </div>\n ))}\n </div>\n );\n}\n\nexport default ToastContainer;\n","/**\n * PermissionGuard Component\n * Conditionally renders children based on permission checks\n *\n * @example\n * // Single permission\n * <PermissionGuard permissions={['chat.read']} hasPermission={hasPermission}>\n * <ChatList />\n * </PermissionGuard>\n *\n * // Multiple permissions (AND logic - all required)\n * <PermissionGuard permissions={['chat.read', 'chat.write']} mode=\"all\">\n * <AdminPanel />\n * </PermissionGuard>\n *\n * // Multiple permissions (OR logic - any required)\n * <PermissionGuard permissions={['chat.read', 'chat.readOwn']} mode=\"any\">\n * <ChatList />\n * </PermissionGuard>\n *\n * // With custom fallback\n * <PermissionGuard\n * permissions={['chat.write']}\n * fallback={<div>You don't have permission</div>}\n * >\n * <CreateChatButton />\n * </PermissionGuard>\n */\n\nimport type { ReactNode } from 'react';\n\nexport interface PermissionGuardProps {\n /** Permission names to check */\n permissions: string[]\n /** Check mode: 'all' requires all permissions (AND), 'any' requires at least one (OR) */\n mode?: 'all' | 'any'\n /** Function to check if user has a specific permission */\n hasPermission: (permission: string) => boolean\n /** Fallback to render when permissions are not satisfied */\n fallback?: ReactNode\n /** Children to render when permissions are satisfied */\n children: ReactNode\n}\n\n/**\n * Permission guard component.\n * Conditionally renders children based on permission checks.\n */\nexport function PermissionGuard({\n permissions,\n mode = 'all',\n hasPermission,\n fallback = null,\n children,\n}: PermissionGuardProps) {\n // Handle empty permissions array (no permissions required, always render)\n if (permissions.length === 0) {\n return <>{children}</>;\n }\n\n // Check permissions based on mode\n const permitted =\n mode === 'all'\n ? permissions.every((p) => hasPermission(p))\n : permissions.some((p) => hasPermission(p));\n\n return permitted ? <>{children}</> : <>{fallback}</>;\n}\n\nexport default PermissionGuard;\n","/**\n * ErrorBoundary Component\n * React error boundary for catching and displaying errors gracefully\n */\n\nimport { Component, ErrorInfo, ReactNode } from 'react';\nimport { WarningCircle, ArrowClockwise } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ErrorBoundaryProps {\n children: ReactNode\n /** Optional custom error UI */\n fallback?: ReactNode | ((error: Error | null, reset: () => void) => ReactNode)\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void\n /** Pre-translated strings for the emergency fallback (hook-free). Cache these before errors occur. */\n emergencyStrings?: { title: string; fallback: string; retry: string }\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\ninterface FallbackGuardProps {\n primaryError: Error | null\n onReset: () => void\n renderFallback: () => ReactNode\n onFallbackError?: (error: Error, errorInfo: ErrorInfo) => void\n cachedStrings?: { title: string; fallback: string; retry: string }\n}\n\ninterface FallbackGuardState {\n fallbackFailed: boolean\n}\n\n/**\n * Default error UI component\n */\nfunction DefaultErrorContent({\n error,\n onReset,\n resetLabel,\n errorTitle,\n}: {\n error: Error | null\n onReset?: () => void\n resetLabel?: string\n errorTitle?: string\n}) {\n const { t } = useTranslation();\n const resolvedResetLabel = resetLabel ?? t('BiChat.Common.TryAgain');\n const resolvedErrorTitle = errorTitle ?? t('BiChat.Error.SomethingWentWrong');\n return (\n <div className=\"flex flex-col items-center justify-center p-8 text-center min-h-[200px]\">\n {/* Decorative background pattern */}\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none opacity-[0.03] dark:opacity-[0.04]\" aria-hidden=\"true\">\n <svg className=\"absolute -top-8 -right-8 w-64 h-64 text-red-500\" viewBox=\"0 0 200 200\" fill=\"currentColor\">\n <circle cx=\"100\" cy=\"100\" r=\"80\" opacity=\"0.5\" />\n <circle cx=\"100\" cy=\"100\" r=\"50\" opacity=\"0.3\" />\n <circle cx=\"100\" cy=\"100\" r=\"25\" opacity=\"0.2\" />\n </svg>\n </div>\n\n <div className=\"relative flex flex-col items-center\">\n {/* Icon with soft glow ring */}\n <div className=\"relative mb-5\">\n <div className=\"absolute inset-0 rounded-full bg-red-100 dark:bg-red-900/30 scale-150 blur-md\" />\n <div className=\"relative flex items-center justify-center w-14 h-14 rounded-full bg-red-50 dark:bg-red-900/20 border border-red-200/60 dark:border-red-800/40\">\n <WarningCircle size={28} className=\"text-red-500 dark:text-red-400\" weight=\"fill\" />\n </div>\n </div>\n\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-1.5\">{resolvedErrorTitle}</h2>\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mb-5 max-w-md leading-relaxed\">\n {error?.message || t('BiChat.Error.UnexpectedError')}\n </p>\n\n {onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"flex items-center gap-2 px-5 py-2.5 bg-red-600 hover:bg-red-700 active:bg-red-800 text-white rounded-lg transition-colors shadow-sm text-sm font-medium\"\n >\n <ArrowClockwise size={16} weight=\"bold\" />\n {resolvedResetLabel}\n </button>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Hook-free emergency fallback used when the configured fallback crashes.\n */\nfunction StaticEmergencyErrorContent({\n error,\n onReset,\n titleText,\n fallbackText,\n retryText,\n}: {\n error: Error | null\n onReset?: () => void\n titleText?: string\n fallbackText?: string\n retryText?: string\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center p-8 text-center min-h-[200px]\">\n <div className=\"relative flex flex-col items-center\">\n <div className=\"relative mb-5\">\n <div className=\"absolute inset-0 rounded-full bg-red-100 scale-150 blur-md\" />\n <div className=\"relative flex items-center justify-center w-14 h-14 rounded-full bg-red-50 border border-red-200/60\">\n <WarningCircle size={28} className=\"text-red-500\" weight=\"fill\" />\n </div>\n </div>\n\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1.5\">{titleText || 'Something went wrong'}</h2>\n <p className=\"text-sm text-gray-500 mb-5 max-w-md leading-relaxed\">\n {error?.message || fallbackText || 'An unexpected UI error occurred.'}\n </p>\n\n {onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"flex items-center gap-2 px-5 py-2.5 bg-red-600 hover:bg-red-700 active:bg-red-800 text-white rounded-lg transition-colors shadow-sm text-sm font-medium\"\n >\n <ArrowClockwise size={16} weight=\"bold\" />\n {retryText || 'Try again'}\n </button>\n )}\n </div>\n </div>\n );\n}\n\nclass FallbackGuard extends Component<FallbackGuardProps, FallbackGuardState> {\n constructor(props: FallbackGuardProps) {\n super(props);\n this.state = { fallbackFailed: false };\n }\n\n static getDerivedStateFromError(): FallbackGuardState {\n return { fallbackFailed: true };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.props.onFallbackError?.(error, errorInfo);\n }\n\n render() {\n if (this.state.fallbackFailed) {\n return (\n <StaticEmergencyErrorContent\n error={this.props.primaryError}\n onReset={this.props.onReset}\n titleText={this.props.cachedStrings?.title}\n fallbackText={this.props.cachedStrings?.fallback}\n retryText={this.props.cachedStrings?.retry}\n />\n );\n }\n return this.props.renderFallback();\n }\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('React Error Boundary caught an error:', error, errorInfo);\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n handleFallbackError = (error: Error, errorInfo: ErrorInfo) => {\n console.error('React Error Boundary fallback crashed:', {\n primaryError: this.state.error,\n fallbackError: error,\n errorInfo,\n });\n this.props.onError?.(error, errorInfo);\n };\n\n render() {\n if (this.state.hasError) {\n return (\n <FallbackGuard\n key={`${this.state.error?.name ?? 'Error'}:${this.state.error?.message ?? ''}`}\n primaryError={this.state.error}\n onReset={this.handleReset}\n onFallbackError={this.handleFallbackError}\n cachedStrings={this.props.emergencyStrings}\n renderFallback={() => {\n // Custom fallback\n if (this.props.fallback) {\n if (typeof this.props.fallback === 'function') {\n return this.props.fallback(this.state.error, this.handleReset);\n }\n return this.props.fallback;\n }\n\n // Default error UI\n return <DefaultErrorContent error={this.state.error} onReset={this.handleReset} />;\n }}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\nexport { ErrorBoundary, DefaultErrorContent };\n","interface SessionSkeletonProps {\n count?: number\n}\n\nexport default function SessionSkeleton({ count = 5 }: SessionSkeletonProps) {\n return (\n <div className=\"space-y-1 px-2\">\n {Array.from({ length: count }).map((_, index) => (\n <div\n key={index}\n className=\"animate-pulse px-3 py-2 rounded-lg\"\n >\n <div className=\"flex items-center gap-2\">\n {/* Icon placeholder */}\n <div className=\"w-5 h-5 bg-gray-300 dark:bg-gray-700 rounded\" />\n {/* Text placeholder */}\n <div className=\"flex-1\">\n <div className=\"h-4 bg-gray-300 dark:bg-gray-700 rounded w-3/4\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\n\ninterface LongPressOptions {\n delay?: number; // Default: 500ms\n onLongPress: (e: React.TouchEvent | React.MouseEvent) => void;\n onPressStart?: () => void;\n onPressCancel?: () => void;\n moveThreshold?: number; // Default: 10px - cancel if moved more\n hapticFeedback?: boolean; // Default: true\n}\n\ninterface LongPressEventHandlers {\n onTouchStart: (e: React.TouchEvent) => void;\n onTouchEnd: (e: React.TouchEvent) => void;\n onTouchMove: (e: React.TouchEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void; // For desktop testing\n onMouseUp?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n}\n\ninterface LongPressResult {\n handlers: LongPressEventHandlers;\n isPressed: boolean;\n}\n\nexport function useLongPress(options: LongPressOptions): LongPressResult {\n const {\n delay = 500,\n onLongPress,\n onPressStart,\n onPressCancel,\n moveThreshold = 10,\n hapticFeedback = true,\n } = options;\n\n const [isPressed, setIsPressed] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const startPosRef = useRef<{ x: number; y: number } | null>(null);\n const eventRef = useRef<React.TouchEvent | React.MouseEvent | null>(null);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const handlePressStart = useCallback(\n (e: React.TouchEvent | React.MouseEvent) => {\n // Note: Do NOT call preventDefault() on touchstart - it breaks long-press on iPadOS Safari\n // Text selection is prevented via CSS user-select: none on .touch-tap class instead\n\n setIsPressed(true);\n eventRef.current = e;\n\n // Store starting position\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n startPosRef.current = { x: clientX, y: clientY };\n\n onPressStart?.();\n\n clearTimer();\n timerRef.current = setTimeout(() => {\n if (hapticFeedback && navigator.vibrate) {\n navigator.vibrate(10);\n }\n onLongPress(eventRef.current!);\n }, delay);\n },\n [delay, onLongPress, onPressStart, hapticFeedback, clearTimer]\n );\n\n const handlePressEnd = useCallback(() => {\n clearTimer();\n setIsPressed(false);\n startPosRef.current = null;\n eventRef.current = null;\n }, [clearTimer]);\n\n const handlePressCancel = useCallback(() => {\n clearTimer();\n setIsPressed(false);\n startPosRef.current = null;\n eventRef.current = null;\n onPressCancel?.();\n }, [clearTimer, onPressCancel]);\n\n const handleMove = useCallback(\n (e: React.TouchEvent | React.MouseEvent) => {\n if (!startPosRef.current || !isPressed) {return;}\n\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n\n const deltaX = Math.abs(clientX - startPosRef.current.x);\n const deltaY = Math.abs(clientY - startPosRef.current.y);\n\n if (deltaX > moveThreshold || deltaY > moveThreshold) {\n handlePressCancel();\n }\n },\n [isPressed, moveThreshold, handlePressCancel]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearTimer();\n };\n }, [clearTimer]);\n\n return {\n handlers: {\n onTouchStart: handlePressStart,\n onTouchEnd: handlePressEnd,\n onTouchMove: handleMove,\n onMouseDown: handlePressStart,\n onMouseUp: handlePressEnd,\n onMouseLeave: handlePressCancel,\n },\n isPressed,\n };\n}\n","import { useEffect, useMemo, useRef, useState, useCallback, FC, ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon?: ReactNode;\n onClick: () => void;\n variant?: 'default' | 'danger';\n disabled?: boolean;\n}\n\ninterface TouchContextMenuProps {\n items: ContextMenuItem[];\n isOpen: boolean;\n onClose: () => void;\n anchorRect: DOMRect | null;\n}\n\nexport const TouchContextMenu: FC<TouchContextMenuProps> = ({\n items,\n isOpen,\n onClose,\n anchorRect,\n}) => {\n const { t } = useTranslation();\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const enabledIndices = useMemo(\n () => items.reduce<number[]>((acc, item, i) => {\n if (!item.disabled) {acc.push(i);}\n return acc;\n }, []),\n [items]\n );\n\n const focusItem = useCallback((index: number) => {\n setFocusedIndex(index);\n itemRefs.current[index]?.focus();\n }, []);\n\n // Auto-focus first enabled item on open\n useEffect(() => {\n if (!isOpen) {\n setFocusedIndex(-1);\n return;\n }\n\n // Small delay to let the menu render\n const timer = requestAnimationFrame(() => {\n if (enabledIndices.length > 0) {\n focusItem(enabledIndices[0]);\n }\n });\n return () => cancelAnimationFrame(timer);\n }, [isOpen, enabledIndices, focusItem]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!isOpen) {return;}\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const currentEnabledPos = enabledIndices.indexOf(focusedIndex);\n\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'ArrowDown': {\n e.preventDefault();\n const nextPos = currentEnabledPos < enabledIndices.length - 1\n ? currentEnabledPos + 1\n : 0;\n focusItem(enabledIndices[nextPos]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prevPos = currentEnabledPos > 0\n ? currentEnabledPos - 1\n : enabledIndices.length - 1;\n focusItem(enabledIndices[prevPos]);\n break;\n }\n case 'Home':\n e.preventDefault();\n if (enabledIndices.length > 0) {focusItem(enabledIndices[0]);}\n break;\n case 'End':\n e.preventDefault();\n if (enabledIndices.length > 0) {focusItem(enabledIndices[enabledIndices.length - 1]);}\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose, focusedIndex, enabledIndices, focusItem]);\n\n if (!isOpen || !anchorRect) {return null;}\n\n const viewportHeight = window.innerHeight;\n const menuEstimatedHeight = items.length * 44 + 16;\n const spaceBelow = viewportHeight - anchorRect.bottom;\n const shouldShowAbove = spaceBelow < menuEstimatedHeight && anchorRect.top > spaceBelow;\n\n const style: CSSProperties = {\n position: 'fixed',\n left: `${anchorRect.left}px`,\n width: `${anchorRect.width}px`,\n zIndex: 9999,\n ...(shouldShowAbove\n ? { bottom: `${viewportHeight - anchorRect.top}px` }\n : { top: `${anchorRect.bottom}px` }),\n };\n\n return createPortal(\n <AnimatePresence>\n {isOpen && (\n <>\n <div\n className=\"fixed inset-0 z-[9998]\"\n onClick={onClose}\n />\n\n <motion.div\n ref={menuRef}\n role=\"menu\"\n aria-label={t('BiChat.ContextMenu')}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.15 }}\n style={style}\n className=\"rounded-xl shadow-xl backdrop-blur bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 overflow-hidden\"\n >\n <div className=\"py-2\">\n {items.map((item, index) => (\n <button\n key={item.id}\n ref={(el) => { itemRefs.current[index] = el; }}\n role=\"menuitem\"\n tabIndex={focusedIndex === index ? 0 : -1}\n onClick={() => {\n if (!item.disabled) {\n item.onClick();\n onClose();\n }\n }}\n disabled={item.disabled}\n className={`\n w-full flex items-center gap-3 px-4 py-2.5 min-h-[44px]\n text-left text-sm font-medium transition-colors\n ${item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 active:bg-gray-200 dark:active:bg-gray-600'}\n ${item.variant === 'danger'\n ? 'text-red-600 dark:text-red-400'\n : 'text-gray-900 dark:text-gray-100'}\n `}\n >\n {item.icon && (\n <span className=\"flex-shrink-0 w-5 h-5 flex items-center justify-center\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n </button>\n ))}\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>,\n document.body\n );\n};\n","/**\n * SessionItem Component\n * Individual chat session item in the sidebar with actions menu\n * Router-agnostic: uses onSelect callback instead of Link\n */\n\nimport React, { useRef, memo, useState, useEffect, useMemo } from 'react';\nimport { motion, useMotionValue, useTransform, type PanInfo } from 'framer-motion';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { DotsThree, Check, Bookmark, PencilSimple, Archive, ArrowsClockwise, ArrowUUpLeft, Trash, UsersThree } from '@phosphor-icons/react';\nimport { EditableText, type EditableTextRef } from './EditableText';\nimport { sessionItemVariants } from '../animations/variants';\nimport type { Session } from '../types';\nimport { useLongPress } from '../hooks/useLongPress';\nimport { TouchContextMenu, type ContextMenuItem } from './TouchContextMenu';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { formatRelativeTime } from '../utils/dateFormatting';\n\ninterface SessionItemProps {\n session: Session\n isActive: boolean\n mode?: 'active' | 'archived'\n onSelect: (sessionId: string) => void\n onArchive?: () => void\n onRestore?: () => void\n onPin?: () => void\n onRename?: (newTitle: string) => void\n onRegenerateTitle?: () => void\n onDelete?: () => void\n testIdPrefix?: string\n className?: string\n}\n\nconst SessionItem = memo<SessionItemProps>(\n ({\n session,\n isActive,\n mode = 'active',\n onSelect,\n onArchive,\n onRestore,\n onPin,\n onRename,\n onRegenerateTitle,\n onDelete,\n testIdPrefix = 'sidebar',\n className = '',\n }) => {\n const editableTitleRef = useRef<EditableTextRef>(null);\n const itemRef = useRef<HTMLDivElement>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const [menuAnchor, setMenuAnchor] = useState<DOMRect | null>(null);\n const [isTouch, setIsTouch] = useState(false);\n const { t } = useTranslation();\n\n // Drag-to-archive gesture\n const isDraggingRef = useRef(false);\n const dragX = useMotionValue(0);\n const archiveOpacity = useTransform(dragX, [-80, -40, 0], [1, 0.5, 0]);\n const archiveScale = useTransform(dragX, [-80, -40, 0], [1, 0.8, 0.6]);\n const canDragArchive = !!onArchive;\n\n const handleDragEnd = (_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n if (info.offset.x < -80 && onArchive) {\n onArchive();\n }\n // Defer reset so the click event (which fires synchronously after dragEnd)\n // still sees isDraggingRef=true and skips navigation.\n requestAnimationFrame(() => {\n isDraggingRef.current = false;\n });\n };\n\n // Detect touch device\n useEffect(() => {\n setIsTouch('ontouchend' in document);\n }, []);\n\n // Only treat empty/whitespace title as generating.\n // Non-empty placeholders should be displayed as-is.\n const isTitleGenerating = !session.title?.trim();\n\n // Generate title from session (use existing title or show generating state)\n const displayTitle = isTitleGenerating ? t('BiChat.Common.Generating') : (session.title ?? t('BiChat.Common.Untitled'));\n const lastActivity = formatRelativeTime(session.updatedAt, t);\n const accessRole = session.access?.role ?? 'owner';\n const roleLabel =\n accessRole === 'editor'\n ? t('BiChat.Share.RoleEditor')\n : accessRole === 'viewer'\n ? t('BiChat.Share.RoleViewer')\n : accessRole === 'read_all'\n ? t('BiChat.Share.RoleReadOnly')\n : '';\n const visibilityLabel =\n session.isGroup\n ? t('BiChat.Sidebar.GroupChat')\n : accessRole === 'editor' || accessRole === 'viewer'\n ? t('BiChat.Sidebar.SharedWithYou')\n : '';\n const isGroupOrShared = Boolean(session.isGroup || (session.memberCount && session.memberCount > 1));\n const metaParts = [lastActivity, visibilityLabel, roleLabel].filter(Boolean);\n\n // Long press handlers for touch devices\n const { handlers: longPressHandlers } = useLongPress({\n delay: 500,\n onLongPress: (e) => {\n const target = e.currentTarget as HTMLElement;\n setMenuAnchor(target.getBoundingClientRect());\n setMenuOpen(true);\n },\n hapticFeedback: true,\n });\n\n // Add contextmenu event listener as fallback for iPadOS\n useEffect(() => {\n const element = itemRef.current;\n if (!element) {return;}\n\n const isIPad = /iPad|Macintosh/i.test(navigator.userAgent) && 'ontouchend' in document;\n if (!isIPad) {return;}\n\n const handleContextMenu = (e: Event) => {\n e.preventDefault();\n const target = e.currentTarget as HTMLElement;\n setMenuAnchor(target.getBoundingClientRect());\n setMenuOpen(true);\n };\n\n element.addEventListener('contextmenu', handleContextMenu);\n return () => element.removeEventListener('contextmenu', handleContextMenu);\n }, [itemRef]);\n\n const contextMenuItems: ContextMenuItem[] = useMemo(\n () =>\n mode === 'archived'\n ? [\n ...(onRestore ? [{\n id: 'restore',\n label: t('BiChat.Archived.RestoreButton'),\n icon: <ArrowUUpLeft size={20} />,\n onClick: () => onRestore(),\n }] : []),\n ...(onRename ? [{\n id: 'rename',\n label: t('BiChat.Sidebar.RenameChat'),\n icon: <PencilSimple size={20} />,\n onClick: () => editableTitleRef.current?.startEditing(),\n }] : []),\n ]\n : [\n ...(onPin ? [{\n id: 'pin',\n label: session.pinned ? t('BiChat.Sidebar.UnpinChat') : t('BiChat.Sidebar.PinChat'),\n icon: session.pinned ? <Check size={20} /> : <Bookmark size={20} />,\n onClick: () => onPin(),\n }] : []),\n ...(onRename ? [{\n id: 'rename',\n label: t('BiChat.Sidebar.RenameChat'),\n icon: <PencilSimple size={20} />,\n onClick: () => editableTitleRef.current?.startEditing(),\n }] : []),\n ...(onRegenerateTitle ? [{\n id: 'regenerate',\n label: t('BiChat.Sidebar.RegenerateTitle'),\n icon: <ArrowsClockwise size={20} />,\n onClick: () => onRegenerateTitle(),\n }] : []),\n ...(onArchive ? [{\n id: 'archive',\n label: t('BiChat.Sidebar.ArchiveChat'),\n icon: <Archive size={20} />,\n onClick: () => onArchive(),\n variant: 'danger' as const,\n }] : []),\n ...(onDelete ? [{\n id: 'delete',\n label: t('BiChat.Sidebar.DeleteChat'),\n icon: <Trash size={20} />,\n onClick: () => onDelete(),\n variant: 'danger' as const,\n }] : []),\n ],\n [mode, session.pinned, onRestore, onPin, onRename, onRegenerateTitle, onArchive, onDelete, t],\n );\n\n const hasContextMenu = contextMenuItems.length > 0;\n\n return (\n <>\n <motion.div\n variants={sessionItemVariants}\n initial=\"initial\"\n animate=\"animate\"\n whileHover=\"hover\"\n exit=\"exit\"\n className=\"relative overflow-hidden rounded-lg\"\n >\n {/* Archive zone — revealed by drag */}\n {canDragArchive && (\n <motion.div\n className=\"absolute inset-y-0 right-0 w-20 flex items-center justify-center bg-gray-500 dark:bg-gray-600 rounded-r-lg\"\n style={{ opacity: archiveOpacity, scale: archiveScale }}\n aria-hidden=\"true\"\n >\n <Archive size={20} className=\"text-white\" />\n </motion.div>\n )}\n\n {/* Draggable item content */}\n <motion.div\n drag={canDragArchive ? 'x' : false}\n dragDirectionLock\n dragConstraints={{ left: -100, right: 0 }}\n dragElastic={{ left: 0.2, right: 0.5 }}\n dragSnapToOrigin\n style={{ x: canDragArchive ? dragX : undefined }}\n onDragStart={() => { isDraggingRef.current = true; }}\n onDragEnd={canDragArchive ? handleDragEnd : undefined}\n className=\"relative\"\n >\n <div\n role=\"button\"\n tabIndex={0}\n ref={itemRef}\n onClick={() => {\n if (isDraggingRef.current) {return;}\n onSelect(session.id);\n }}\n onKeyDown={(e) => {\n const target = e.target as HTMLElement | null;\n const isFromEditable = !!target?.closest('input, textarea, [contenteditable=\"true\"]');\n if (isFromEditable) {return;}\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(session.id);\n }\n }}\n className={`block w-full text-left px-3 py-2 rounded-lg transition-smooth group relative touch-tap cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 ${\n isActive\n ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 border-l-4 border-transparent'\n } ${className}`}\n aria-current={isActive ? 'page' : undefined}\n data-session-item\n data-testid={`${testIdPrefix}-session-${session.id}`}\n {...longPressHandlers}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-start gap-2 min-w-0 flex-1\">\n {isGroupOrShared && (\n <UsersThree size={14} weight=\"duotone\" className=\"text-primary-500 dark:text-primary-400 mt-1 flex-shrink-0\" />\n )}\n <div className=\"flex flex-col min-w-0 flex-1\">\n <EditableText\n ref={editableTitleRef}\n value={displayTitle}\n onSave={(newTitle) => onRename?.(newTitle)}\n isLoading={isTitleGenerating}\n />\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate mt-0.5\">\n {metaParts.join(' • ')}\n {isGroupOrShared && session.memberCount && session.memberCount > 0 && (\n <span className=\"inline-flex items-center ml-1 rounded-full bg-primary-50 dark:bg-primary-900/30 px-1.5 text-[10px] font-medium text-primary-600 dark:text-primary-400\">\n {session.memberCount}\n </span>\n )}\n </span>\n </div>\n </div>\n {!isTouch && hasContextMenu && (\n <Menu>\n <MenuButton\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1.5 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-smooth flex-shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={t('BiChat.Sidebar.ChatOptions')}\n data-testid={`${testIdPrefix}-session-options-${session.id}`}\n >\n <DotsThree size={16} className=\"w-4 h-4\" weight=\"bold\" />\n </MenuButton>\n <MenuItems\n anchor=\"bottom start\"\n className=\"w-52 bg-white dark:bg-gray-900 rounded-xl shadow-xl border border-gray-200 dark:border-gray-700 z-30 [--anchor-gap:8px] mt-1 p-2 space-y-1\"\n >\n {mode !== 'archived' && onPin && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onPin();\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n focus\n ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n aria-label={session.pinned ? t('BiChat.Sidebar.UnpinChat') : t('BiChat.Sidebar.PinChat')}\n data-testid={`${testIdPrefix}-session-pin-${session.id}`}\n >\n {session.pinned ? (\n <Check size={16} className=\"w-4 h-4\" />\n ) : (\n <Bookmark size={16} className=\"w-4 h-4\" />\n )}\n {session.pinned ? t('BiChat.Sidebar.UnpinChat') : t('BiChat.Sidebar.PinChat')}\n </button>\n )}\n </MenuItem>\n )}\n {onRename && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n editableTitleRef.current?.startEditing();\n close();\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n focus\n ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n aria-label={t('BiChat.Sidebar.RenameChat')}\n data-testid={`${testIdPrefix}-session-rename-${session.id}`}\n >\n <PencilSimple size={16} className=\"w-4 h-4\" />\n {t('BiChat.Sidebar.RenameChat')}\n </button>\n )}\n </MenuItem>\n )}\n {mode !== 'archived' && onRegenerateTitle && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onRegenerateTitle();\n close();\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n focus\n ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n aria-label={t('BiChat.Sidebar.RegenerateTitle')}\n data-testid={`${testIdPrefix}-session-regenerate-${session.id}`}\n >\n <ArrowsClockwise size={16} className=\"w-4 h-4\" />\n {t('BiChat.Sidebar.RegenerateTitle')}\n </button>\n )}\n </MenuItem>\n )}\n {mode === 'archived' && onRestore && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onRestore();\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n focus\n ? 'text-green-700 dark:text-green-300 bg-green-50 dark:bg-green-900/20 ring-1 ring-green-200/70 dark:ring-green-500/30'\n : 'text-green-700 dark:text-green-300 hover:bg-green-50/70 dark:hover:bg-green-900/10'\n }`}\n aria-label={t('BiChat.Archived.RestoreButton')}\n data-testid={`${testIdPrefix}-session-restore-${session.id}`}\n >\n <ArrowUUpLeft size={16} className=\"w-4 h-4\" />\n {t('BiChat.Archived.RestoreButton')}\n </button>\n )}\n </MenuItem>\n )}\n {mode !== 'archived' && onArchive && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onArchive();\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n focus\n ? 'text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 ring-1 ring-amber-200/70 dark:ring-amber-500/30'\n : 'text-amber-600 dark:text-amber-400 hover:bg-amber-50/70 dark:hover:bg-amber-900/10'\n }`}\n aria-label={t('BiChat.Sidebar.ArchiveChat')}\n data-testid={`${testIdPrefix}-session-archive-${session.id}`}\n >\n <Archive size={16} className=\"w-4 h-4\" />\n {t('BiChat.Sidebar.ArchiveChat')}\n </button>\n )}\n </MenuItem>\n )}\n {onDelete && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete();\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n focus\n ? 'text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 ring-1 ring-red-200/70 dark:ring-red-500/30'\n : 'text-red-600 dark:text-red-400 hover:bg-red-50/70 dark:hover:bg-red-900/10'\n }`}\n aria-label={t('BiChat.Sidebar.DeleteChat')}\n data-testid={`${testIdPrefix}-session-delete-${session.id}`}\n >\n <Trash size={16} className=\"w-4 h-4\" />\n {t('BiChat.Sidebar.DeleteChat')}\n </button>\n )}\n </MenuItem>\n )}\n </MenuItems>\n </Menu>\n )}\n </div>\n </div>\n </motion.div>\n </motion.div>\n <TouchContextMenu\n items={contextMenuItems}\n isOpen={menuOpen}\n onClose={() => setMenuOpen(false)}\n anchorRect={menuAnchor}\n />\n </>\n );\n }\n);\n\nSessionItem.displayName = 'SessionItem';\n\nexport default SessionItem;\n","interface DateGroupHeaderProps {\n groupName: string\n count: number\n}\n\n/**\n * Sticky header for date-based session groups\n * Displays group name and session count\n */\nexport default function DateGroupHeader({ groupName, count }: DateGroupHeaderProps) {\n return (\n <div className=\"sticky top-0 bg-surface-300 dark:bg-gray-900 px-4 py-2 text-sm font-medium z-10 border-b border-gray-100 dark:border-gray-800\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-700 dark:text-gray-300 font-semibold\">{groupName}</span>\n <span className=\"text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 px-2 py-0.5 rounded-full\">\n {count}\n </span>\n </div>\n </div>\n );\n}\n","/**\n * UserFilter Component\n * Dropdown to filter chats by user\n * Uses @headlessui/react Menu for accessible dropdown\n */\n\nimport { memo } from 'react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { CaretDown, X } from '@phosphor-icons/react';\nimport { UserAvatar } from './UserAvatar';\nimport { useTranslation } from '../hooks/useTranslation';\nimport type { SessionUser } from '../types';\n\ninterface UserFilterProps {\n users: SessionUser[]\n selectedUser: SessionUser | null\n onUserChange: (user: SessionUser | null) => void\n loading?: boolean\n}\n\nfunction UserFilter({ users, selectedUser, onUserChange, loading }: UserFilterProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"relative\">\n <Menu>\n {({ open }) => (\n <>\n <MenuButton\n disabled={loading}\n className={`\n cursor-pointer w-full px-3 py-2 bg-white dark:bg-gray-800\n border border-gray-300 dark:border-gray-600\n rounded-lg text-sm text-left\n hover:bg-gray-50 dark:hover:bg-gray-700\n focus:outline-none focus:ring-2 focus:ring-primary-500\n transition-smooth\n disabled:opacity-50 disabled:cursor-not-allowed\n flex items-center justify-between gap-2\n `}\n aria-label={t('BiChat.AllChats.AllUsers')}\n >\n {selectedUser ? (\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <UserAvatar\n firstName={selectedUser.firstName}\n lastName={selectedUser.lastName}\n initials={selectedUser.initials}\n size=\"sm\"\n />\n <span className=\"truncate text-gray-900 dark:text-gray-100\">\n {selectedUser.firstName} {selectedUser.lastName}\n </span>\n </div>\n ) : (\n <span className=\"text-gray-500 dark:text-gray-400\">\n {loading ? t('BiChat.AllChats.LoadingUsers') : t('BiChat.AllChats.AllUsers')}\n </span>\n )}\n\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {selectedUser && (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onUserChange(null);\n }}\n className=\"cursor-pointer p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-600 transition-smooth\"\n aria-label={t('BiChat.Common.Clear')}\n >\n <X size={14} className=\"w-3.5 h-3.5 text-gray-600 dark:text-gray-400\" />\n </button>\n )}\n <CaretDown\n size={16}\n className={`w-4 h-4 text-gray-600 dark:text-gray-400 transition-transform ${\n open ? 'rotate-180' : ''\n }`}\n />\n </div>\n </MenuButton>\n\n <MenuItems\n anchor=\"bottom start\"\n className=\"\n w-[var(--button-width)]\n max-h-64 overflow-y-auto\n bg-white dark:bg-gray-800\n border border-gray-200 dark:border-gray-700\n rounded-lg shadow-lg\n z-50\n [--anchor-gap:4px]\n mt-1 p-1\n \"\n >\n {/* \"All users\" option */}\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={() => onUserChange(null)}\n className={`\n cursor-pointer w-full text-left px-3 py-2 rounded-lg text-sm\n transition-smooth\n ${\n focus\n ? 'bg-gray-100 dark:bg-gray-700'\n : 'hover:bg-gray-50 dark:hover:bg-gray-750'\n }\n ${\n !selectedUser\n ? 'text-primary-700 dark:text-primary-400 font-medium'\n : 'text-gray-900 dark:text-gray-100'\n }\n `}\n >\n {t('BiChat.AllChats.AllUsers')}\n </button>\n )}\n </MenuItem>\n\n {/* Divider */}\n {users.length > 0 && (\n <div className=\"border-t border-gray-200 dark:border-gray-700 my-1\" />\n )}\n\n {/* User options */}\n {users.map((user) => (\n <MenuItem key={user.id}>\n {({ focus }) => (\n <button\n onClick={() => onUserChange(user)}\n className={`\n cursor-pointer w-full text-left px-3 py-2 rounded-lg text-sm\n transition-smooth\n flex items-center gap-2\n ${\n focus\n ? 'bg-gray-100 dark:bg-gray-700'\n : 'hover:bg-gray-50 dark:hover:bg-gray-750'\n }\n ${\n selectedUser?.id === user.id\n ? 'text-primary-700 dark:text-primary-400 font-medium'\n : 'text-gray-900 dark:text-gray-100'\n }\n `}\n >\n <UserAvatar\n firstName={user.firstName}\n lastName={user.lastName}\n initials={user.initials}\n size=\"sm\"\n />\n <span className=\"truncate\">\n {user.firstName} {user.lastName}\n </span>\n </button>\n )}\n </MenuItem>\n ))}\n\n {/* Empty state */}\n {users.length === 0 && (\n <div className=\"px-3 py-6 text-center\">\n <p className=\"text-sm text-gray-700 dark:text-gray-300\">{t('BiChat.AllChats.NoUsersFound')}</p>\n </div>\n )}\n </MenuItems>\n </>\n )}\n </Menu>\n </div>\n );\n}\n\nconst MemoizedUserFilter = memo(UserFilter);\nMemoizedUserFilter.displayName = 'UserFilter';\n\nexport { MemoizedUserFilter as UserFilter };\nexport default MemoizedUserFilter;\n","/**\n * AllChatsList Component\n * Displays organization-wide chat sessions with infinite scroll\n * Uses ChatDataSource for data fetching (no GraphQL dependency)\n */\n\nimport { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Archive, CaretRight } from '@phosphor-icons/react';\nimport { UserAvatar } from './UserAvatar';\nimport { UserFilter } from './UserFilter';\nimport SessionSkeleton from './SessionSkeleton';\nimport { EmptyState } from './EmptyState';\nimport { staggerContainerVariants } from '../animations/variants';\nimport { useTranslation } from '../hooks/useTranslation';\nimport type { ChatDataSource, Session, SessionUser } from '../types';\n\ninterface AllChatsListProps {\n dataSource: ChatDataSource\n onSessionSelect: (sessionId: string) => void\n activeSessionId?: string\n}\n\nexport default function AllChatsList({ dataSource, onSessionSelect, activeSessionId }: AllChatsListProps) {\n const { t } = useTranslation();\n\n // State\n const [includeArchived, setIncludeArchived] = useState(false);\n const [selectedUser, setSelectedUser] = useState<SessionUser | null>(null);\n const [offset, setOffset] = useState(0);\n const [fetching, setFetching] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [chats, setChats] = useState<Session[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [users, setUsers] = useState<SessionUser[]>([]);\n const [usersLoading, setUsersLoading] = useState(false);\n\n const limit = 20;\n\n // Fetch users list\n useEffect(() => {\n if (!dataSource.listUsers) {return;}\n\n let cancelled = false;\n setUsersLoading(true);\n\n dataSource.listUsers().then((result) => {\n if (!cancelled) {\n setUsers(result);\n setUsersLoading(false);\n }\n }).catch(() => {\n if (!cancelled) {\n setUsersLoading(false);\n }\n });\n\n return () => { cancelled = true; };\n }, [dataSource]);\n\n // Fetch chats\n useEffect(() => {\n if (!dataSource.listAllSessions) {return;}\n\n let cancelled = false;\n setFetching(true);\n setError(null);\n\n dataSource.listAllSessions({\n limit,\n offset,\n includeArchived,\n userId: selectedUser?.id || null,\n }).then((result) => {\n if (!cancelled) {\n if (offset === 0) {\n setChats(result.sessions);\n } else {\n setChats((prev) => [...prev, ...result.sessions]);\n }\n setTotalCount(result.total);\n setHasMore(result.hasMore);\n setFetching(false);\n }\n }).catch(() => {\n if (!cancelled) {\n setError(t('BiChat.AllChats.FailedToLoad'));\n setFetching(false);\n }\n });\n\n return () => { cancelled = true; };\n }, [dataSource, offset, includeArchived, selectedUser, t]);\n\n // Reset offset when filter changes\n useEffect(() => {\n setOffset(0);\n setChats([]);\n }, [includeArchived, selectedUser]);\n\n // Load more handler\n const handleLoadMore = useCallback(() => {\n if (!fetching && hasMore) {\n setOffset((prev) => prev + limit);\n }\n }, [fetching, hasMore]);\n\n const loadMoreNodeRef = useRef<HTMLDivElement | null>(null);\n\n const loadMoreRef = useCallback((node: HTMLDivElement | null) => {\n loadMoreNodeRef.current = node;\n }, []);\n\n // Infinite scroll observer\n useEffect(() => {\n const node = loadMoreNodeRef.current;\n if (!node || fetching || !hasMore) {return;}\n\n const observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting) {\n handleLoadMore();\n }\n }, { threshold: 0.1 });\n\n observer.observe(node);\n\n return () => observer.disconnect();\n }, [fetching, hasMore, handleLoadMore]);\n\n // Derive unique users from chat data if listUsers is not available\n const derivedUsers = useMemo(() => {\n if (dataSource.listUsers) {return users;}\n const userMap = new Map<string, SessionUser>();\n chats.forEach((chat) => {\n if (chat.owner && !userMap.has(chat.owner.id)) {\n userMap.set(chat.owner.id, chat.owner);\n }\n });\n return Array.from(userMap.values());\n }, [chats, users, dataSource.listUsers]);\n\n // Expanded state for user groups (tracks expanded owner IDs; collapsed by default)\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set());\n\n const toggleGroup = useCallback((ownerId: string) => {\n setExpandedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(ownerId)) {\n next.delete(ownerId);\n } else {\n next.add(ownerId);\n }\n return next;\n });\n }, []);\n\n // Auto-expand the group containing the active session (e.g. deep-link)\n useEffect(() => {\n if (!activeSessionId || selectedUser) { return; }\n const chat = chats.find(c => c.id === activeSessionId);\n if (chat?.owner?.id) {\n setExpandedGroups(prev => {\n if (prev.has(chat.owner!.id)) { return prev; }\n return new Set([...prev, chat.owner!.id]);\n });\n }\n }, [activeSessionId, chats, selectedUser]);\n\n // Group chats by owner when no specific user is selected\n const groupedChats = useMemo(() => {\n if (selectedUser) {return null;} // flat list when user is selected\n\n const groupMap = new Map<string, { owner: SessionUser; chats: Session[]; latestUpdatedAt: string }>();\n\n chats.forEach((chat) => {\n const owner = chat.owner ?? {\n id: '__unknown__',\n firstName: t('BiChat.Common.Untitled'),\n lastName: '',\n initials: '?',\n };\n const ownerId = owner.id;\n\n if (!groupMap.has(ownerId)) {\n groupMap.set(ownerId, {\n owner,\n chats: [],\n latestUpdatedAt: chat.updatedAt,\n });\n }\n\n const group = groupMap.get(ownerId)!;\n group.chats.push(chat);\n\n // Track the most recent updatedAt for sorting groups\n if (chat.updatedAt > group.latestUpdatedAt) {\n group.latestUpdatedAt = chat.updatedAt;\n }\n });\n\n // Sort groups by most recently active first\n return Array.from(groupMap.values()).sort(\n (a, b) => b.latestUpdatedAt.localeCompare(a.latestUpdatedAt),\n );\n }, [chats, selectedUser, t]);\n\n return (\n <div\n className=\"flex flex-col h-full overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Filter Controls */}\n <div className=\"px-4 py-3 space-y-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0\">\n {/* User filter */}\n <UserFilter\n users={derivedUsers}\n selectedUser={selectedUser}\n onUserChange={setSelectedUser}\n loading={usersLoading || (fetching && chats.length === 0)}\n />\n\n {/* Include archived toggle */}\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={includeArchived}\n onChange={(e) => setIncludeArchived(e.target.checked)}\n className=\"\n w-4 h-4 rounded border-gray-300 dark:border-gray-600\n text-primary-600 focus:ring-primary-500 focus:ring-offset-0\n bg-white dark:bg-gray-800\n cursor-pointer\n \"\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300 flex items-center gap-1.5\">\n <Archive size={16} className=\"w-4 h-4\" />\n {t('BiChat.AllChats.IncludeArchived')}\n </span>\n </label>\n\n {/* Results count */}\n {totalCount > 0 && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {totalCount === 1\n ? t('BiChat.AllChats.ChatFound', { count: totalCount })\n : t('BiChat.AllChats.ChatsFound', { count: totalCount })}\n </p>\n )}\n </div>\n\n {/* Chat List */}\n <nav className=\"flex-1 overflow-y-auto px-2 pb-4 hide-scrollbar\" aria-label={t('BiChat.AllChats.OrganizationChats')}>\n {fetching && chats.length === 0 ? (\n <SessionSkeleton count={5} />\n ) : (\n <>\n {chats.length > 0 ? (\n <motion.div\n className=\"space-y-1 mt-2\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n role=\"list\"\n aria-label={t('BiChat.AllChats.OrganizationChatSessions')}\n >\n {groupedChats ? (\n /* ── Grouped view (no user selected) ── */\n groupedChats.map((group) => {\n const ownerId = group.owner.id;\n const ownerName = [group.owner.firstName, group.owner.lastName].filter(Boolean).join(' ');\n const isCollapsed = !expandedGroups.has(ownerId);\n\n return (\n <div key={ownerId} className=\"mb-1\">\n {/* Group header */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => toggleGroup(ownerId)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleGroup(ownerId);\n }\n }}\n className=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-lg transition-smooth select-none\"\n aria-expanded={!isCollapsed}\n >\n <CaretRight\n size={14}\n weight=\"bold\"\n className={`shrink-0 text-gray-500 dark:text-gray-400 transition-transform duration-150 ${isCollapsed ? '' : 'rotate-90'}`}\n />\n <UserAvatar\n firstName={group.owner.firstName}\n lastName={group.owner.lastName}\n initials={group.owner.initials}\n size=\"sm\"\n />\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate flex-1 min-w-0\">\n {ownerName || t('BiChat.Common.Untitled')}\n </span>\n <span className=\"text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 px-2 py-0.5 rounded-full flex-shrink-0\">\n {group.chats.length}\n </span>\n </div>\n\n {/* Group items */}\n <AnimatePresence initial={false}>\n {!isCollapsed && (\n <motion.div\n key={`group-${ownerId}`}\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className=\"overflow-hidden\"\n >\n <div className=\"space-y-0.5 pl-6\">\n {group.chats.map((chat) => (\n <motion.div\n key={chat.id}\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n <div\n role=\"link\"\n tabIndex={0}\n onClick={() => onSessionSelect(chat.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSessionSelect(chat.id);\n }\n }}\n className={`\n block px-3 py-2 rounded-lg transition-smooth group cursor-pointer\n ${\n chat.id === activeSessionId\n ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 border-l-4 border-transparent'\n }\n `}\n aria-current={chat.id === activeSessionId ? 'page' : undefined}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <p className=\"text-sm truncate flex-1 min-w-0\">\n {chat.title || t('BiChat.Common.Untitled')}\n </p>\n <div className=\"flex items-center gap-1.5 flex-shrink-0\">\n {chat.isGroup && chat.memberCount && chat.memberCount > 1 && (\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">\n {chat.memberCount}\n </span>\n )}\n {chat.status === 'archived' && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 rounded-full text-xs\">\n <Archive size={12} className=\"w-3 h-3\" />\n {t('BiChat.Chat.Archived')}\n </span>\n )}\n </div>\n </div>\n </div>\n </motion.div>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n })\n ) : (\n /* ── Flat view (user selected) ── */\n chats.map((chat) => {\n const owner = chat.owner ?? {\n id: '',\n firstName: '',\n lastName: '',\n initials: 'U',\n };\n const ownerName = [owner.firstName, owner.lastName].filter(Boolean).join(' ');\n return (\n <motion.div\n key={chat.id}\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n <div\n role=\"link\"\n tabIndex={0}\n onClick={() => onSessionSelect(chat.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSessionSelect(chat.id);\n }\n }}\n className={`\n block px-3 py-2 rounded-lg transition-smooth group cursor-pointer\n ${\n chat.id === activeSessionId\n ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 border-l-4 border-transparent'\n }\n `}\n aria-current={chat.id === activeSessionId ? 'page' : undefined}\n >\n <div className=\"flex items-start gap-2\">\n {/* Owner avatar */}\n <UserAvatar\n firstName={owner.firstName}\n lastName={owner.lastName}\n initials={owner.initials}\n size=\"sm\"\n />\n\n {/* Chat info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {chat.title || t('BiChat.Common.Untitled')}\n </p>\n {ownerName && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate\">\n {ownerName}\n </p>\n )}\n {chat.status === 'archived' && (\n <span className=\"inline-flex items-center gap-1 mt-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 rounded-full text-xs\">\n <Archive size={12} className=\"w-3 h-3\" />\n {t('BiChat.Chat.Archived')}\n </span>\n )}\n </div>\n </div>\n </div>\n </motion.div>\n );\n })\n )}\n\n {/* Load more trigger */}\n {hasMore && (\n <div ref={loadMoreRef} className=\"py-4 text-center\">\n {fetching ? (\n <SessionSkeleton count={2} />\n ) : (\n <button\n onClick={handleLoadMore}\n className=\"text-sm text-primary-600 dark:text-primary-400 hover:underline\"\n >\n {t('BiChat.AllChats.LoadMore')}\n </button>\n )}\n </div>\n )}\n </motion.div>\n ) : (\n <EmptyState\n title={t('BiChat.AllChats.NoChatsFound')}\n description={\n selectedUser\n ? t('BiChat.AllChats.NoChatsFromUser', { firstName: selectedUser.firstName, lastName: selectedUser.lastName })\n : includeArchived\n ? t('BiChat.AllChats.NoChatsInOrg')\n : t('BiChat.AllChats.NoActiveChatsInOrg')\n }\n />\n )}\n </>\n )}\n\n {error && (\n <div className=\"mx-2 mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-xs text-red-600 dark:text-red-400\">\n {error}\n </p>\n </div>\n )}\n </nav>\n </div>\n );\n}\n","/**\n * Sidebar Component\n * Main chat sidebar with session list, search, and session management.\n * Router-agnostic: uses callbacks for navigation instead of react-router-dom.\n *\n * Collapse UX (matches SDK sidebar pattern):\n * - Click empty space to toggle\n * - Cursor hints (e-resize / w-resize)\n * - localStorage persistence\n * - Keyboard shortcut: Cmd+B toggle\n */\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { X, Plus, Archive, CaretLineLeft, CaretLineRight, Gear, Users, List, ChatCircle, MagnifyingGlass } from '@phosphor-icons/react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport SessionSkeleton from './SessionSkeleton';\nimport SessionItem from './SessionItem';\nimport ConfirmModal from './ConfirmModal';\nimport SearchInput from './SearchInput';\nimport DateGroupHeader from './DateGroupHeader';\nimport { EmptyState } from './EmptyState';\nimport LoadingSpinner from './LoadingSpinner';\nimport AllChatsList from './AllChatsList';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useToast } from '../hooks/useToast';\nimport { groupSessionsByDate } from '../utils/sessionGrouping';\nimport {\n staggerContainerVariants,\n buttonVariants,\n} from '../animations/variants';\nimport type { Session, ChatDataSource } from '../types';\nimport { ToastContainer } from './ToastContainer';\nimport { toErrorDisplay, type RPCErrorDisplay } from '../utils/errorDisplay';\n\n/** Matches sidebar width transition (duration-300) + small buffer for focus-after-expand */\nconst SIDEBAR_EXPAND_FOCUS_DELAY_MS = 350;\n\nfunction ErrorAlert({ error }: { error: RPCErrorDisplay }) {\n const amber = error.isPermissionDenied;\n return (\n <div\n className={`mx-2 mt-4 p-3 border rounded-xl cursor-default ${\n amber\n ? 'bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800'\n : 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800'\n }`}\n >\n <p\n className={`text-xs font-medium ${\n amber\n ? 'text-amber-700 dark:text-amber-300'\n : 'text-red-600 dark:text-red-400'\n }`}\n >\n {error.title}\n </p>\n {error.description && (\n <p\n className={`mt-1 text-xs ${\n amber\n ? 'text-amber-600 dark:text-amber-400'\n : 'text-red-500 dark:text-red-300'\n }`}\n >\n {error.description}\n </p>\n )}\n </div>\n );\n}\n\nconst COLLAPSE_STORAGE_KEY = 'bichat-sidebar-collapsed';\nconst SESSION_RECONCILE_POLL_INTERVAL_MS = 2000;\nconst SESSION_RECONCILE_MAX_POLLS = 30;\nconst ACTIVE_SESSION_MISS_MAX_RETRIES = 8;\nconst ACTIVE_SESSION_MISS_RETRY_DELAY_MS = 1000;\nconst MAX_COLLAPSED_INDICATORS = 5;\n\nfunction useSidebarCollapse() {\n const [isCollapsed, setIsCollapsed] = useState(() => {\n try {\n return localStorage.getItem(COLLAPSE_STORAGE_KEY) === 'true';\n } catch {\n return false;\n }\n });\n\n const isCollapsedRef = useRef(isCollapsed);\n useEffect(() => {\n isCollapsedRef.current = isCollapsed;\n }, [isCollapsed]);\n\n const toggle = useCallback(() => {\n setIsCollapsed((prev) => {\n const next = !prev;\n try { localStorage.setItem(COLLAPSE_STORAGE_KEY, String(next)); } catch { /* noop */ }\n return next;\n });\n }, []);\n\n const expand = useCallback(() => {\n setIsCollapsed(false);\n try { localStorage.setItem(COLLAPSE_STORAGE_KEY, 'false'); } catch { /* noop */ }\n }, []);\n\n const collapse = useCallback(() => {\n setIsCollapsed(true);\n try { localStorage.setItem(COLLAPSE_STORAGE_KEY, 'true'); } catch { /* noop */ }\n }, []);\n\n return { isCollapsed, isCollapsedRef, toggle, expand, collapse };\n}\n\nexport type ActiveTab = 'my-chats' | 'all-chats'\n\nexport interface SidebarProps {\n dataSource: ChatDataSource\n onSessionSelect: (sessionId: string) => void\n onNewChat: () => void\n onArchivedView?: () => void\n activeSessionId?: string\n creating?: boolean\n showAllChatsTab?: boolean\n isOpen?: boolean\n onClose?: () => void\n headerSlot?: React.ReactNode\n footerSlot?: React.ReactNode\n className?: string\n /** Controlled active tab. When provided, overrides internal state. */\n activeTab?: ActiveTab\n /** Called when tab changes. Use with activeTab for controlled mode. */\n onTabChange?: (tab: ActiveTab) => void\n}\n\nexport default function Sidebar({\n dataSource,\n onSessionSelect,\n onNewChat,\n onArchivedView,\n activeSessionId,\n creating,\n showAllChatsTab,\n isOpen: _isOpen,\n onClose,\n headerSlot,\n footerSlot,\n className = '',\n activeTab: controlledActiveTab,\n onTabChange,\n}: SidebarProps) {\n const { t } = useTranslation();\n const toast = useToast();\n const shouldReduceMotion = useReducedMotion();\n const sessionListRef = useRef<HTMLElement>(null);\n const searchContainerRef = useRef<HTMLDivElement>(null);\n const activeSessionMissRetriesRef = useRef<Record<string, number>>({});\n\n // Collapse state — disabled when used as a mobile drawer (onClose present)\n const { isCollapsed, toggle, expand, collapse } = useSidebarCollapse();\n const collapsible = !onClose; // desktop only\n\n // Click-on-empty-space to toggle (same pattern as SDK sidebar)\n const handleSidebarClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n if (!collapsible) {return;}\n const interactive = 'a, button, input, textarea, select, summary, label, [role=\"button\"], [role=\"link\"], [contenteditable=\"true\"], [data-no-sidebar-toggle]';\n if ((e.target as HTMLElement).closest(interactive)) {return;}\n toggle();\n },\n [collapsible, toggle]\n );\n\n // Keyboard shortcut: Cmd+B (toggle)\n useEffect(() => {\n if (!collapsible) {return;}\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n\n if (isMod && e.key === 'b') {\n e.preventDefault();\n toggle();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [collapsible, toggle]);\n\n // Auto-collapse when artifacts panel expands\n useEffect(() => {\n if (!collapsible) {return;}\n\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<{ expanded: boolean }>).detail;\n if (detail?.expanded) {\n collapse();\n }\n };\n window.addEventListener('bichat:artifacts-panel-expanded', handler);\n return () => window.removeEventListener('bichat:artifacts-panel-expanded', handler);\n }, [collapsible, collapse]);\n\n const showCollapsed = collapsible && isCollapsed;\n\n // Allow tooltips to escape sidebar bounds once collapse transition settles\n const [collapsedOverflowVisible, setCollapsedOverflowVisible] = useState(false);\n useEffect(() => {\n if (!showCollapsed) {\n setCollapsedOverflowVisible(false);\n return;\n }\n const timer = setTimeout(() => setCollapsedOverflowVisible(true), 300);\n return () => clearTimeout(timer);\n }, [showCollapsed]);\n\n // View state (my chats vs all chats) — controlled or uncontrolled\n const [internalActiveTab, setInternalActiveTab] = useState<ActiveTab>('my-chats');\n const activeTab = controlledActiveTab ?? internalActiveTab;\n const handleTabChange = useCallback((tab: ActiveTab) => {\n if (controlledActiveTab === undefined) {\n setInternalActiveTab(tab);\n }\n onTabChange?.(tab);\n }, [controlledActiveTab, onTabChange]);\n\n // Search state\n const [searchQuery, setSearchQuery] = useState('');\n\n // Session data\n const [sessions, setSessions] = useState<Session[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadError, setLoadError] = useState<RPCErrorDisplay | null>(null);\n const [actionError, setActionError] = useState<RPCErrorDisplay | null>(null);\n const accessDenied = loadError?.isPermissionDenied === true;\n\n // Refresh key — bump to re-fetch sessions\n const [refreshKey, setRefreshKey] = useState(0);\n const [reconcilePollToken, setReconcilePollToken] = useState(0);\n\n // Confirm modal state\n const [showConfirm, setShowConfirm] = useState(false);\n const [sessionToArchive, setSessionToArchive] = useState<string | null>(null);\n\n // Fetch sessions\n const fetchSessions = useCallback(async () => {\n try {\n setLoading(true);\n setLoadError(null);\n setActionError(null);\n const result = await dataSource.listSessions({ limit: 50 });\n setSessions(result.sessions);\n } catch (err) {\n console.error('Failed to load sessions:', err);\n setLoadError(toErrorDisplay(err, t('BiChat.Sidebar.FailedToLoadSessions')));\n } finally {\n setLoading(false);\n }\n }, [dataSource, t]);\n\n useEffect(() => {\n fetchSessions();\n }, [fetchSessions, refreshKey]);\n\n useEffect(() => {\n const handleSessionsUpdated = (event: Event) => {\n setRefreshKey((k) => k + 1);\n\n const detail = (event as CustomEvent<{ reason?: string }>).detail;\n const reason = detail?.reason;\n if (!reason || reason === 'session_created' || reason === 'message_sent' || reason === 'title_regenerate_requested') {\n setReconcilePollToken((k) => k + 1);\n }\n };\n\n window.addEventListener('bichat:sessions-updated', handleSessionsUpdated);\n return () => {\n window.removeEventListener('bichat:sessions-updated', handleSessionsUpdated);\n };\n }, []);\n\n useEffect(() => {\n activeSessionMissRetriesRef.current = {};\n }, [activeSessionId]);\n\n useEffect(() => {\n if (!activeSessionId) {return;}\n if (loading) {return;}\n\n const hasActiveSession = sessions.some((session) => session.id === activeSessionId);\n if (hasActiveSession) {\n delete activeSessionMissRetriesRef.current[activeSessionId];\n return;\n }\n\n const attempts = activeSessionMissRetriesRef.current[activeSessionId] ?? 0;\n if (attempts >= ACTIVE_SESSION_MISS_MAX_RETRIES) {\n return;\n }\n activeSessionMissRetriesRef.current[activeSessionId] = attempts + 1;\n\n const timeoutId = window.setTimeout(() => {\n setRefreshKey((k) => k + 1);\n setReconcilePollToken((k) => k + 1);\n }, ACTIVE_SESSION_MISS_RETRY_DELAY_MS);\n\n return () => window.clearTimeout(timeoutId);\n }, [activeSessionId, loading, sessions]);\n\n // Poll for title updates on sessions with placeholder titles.\n // Use a stable boolean so that updating sessions inside the poll\n // does NOT re-trigger the effect (which would create overlapping intervals).\n const hasPlaceholderTitles = useMemo(() => {\n const newChatLabel = t('BiChat.Chat.NewChat');\n return (\n Array.isArray(sessions) &&\n sessions.some((s) => s && (!s.title || s.title === newChatLabel))\n );\n }, [sessions, t]);\n\n useEffect(() => {\n if (!hasPlaceholderTitles && reconcilePollToken === 0) {return;}\n\n let pollCount = 0;\n\n const intervalId = setInterval(async () => {\n pollCount++;\n try {\n const result = await dataSource.listSessions({ limit: 50 });\n setSessions(result.sessions);\n } catch {\n // ignore poll errors\n }\n if (pollCount >= SESSION_RECONCILE_MAX_POLLS) {\n clearInterval(intervalId);\n }\n }, SESSION_RECONCILE_POLL_INTERVAL_MS);\n\n return () => clearInterval(intervalId);\n }, [hasPlaceholderTitles, dataSource, reconcilePollToken]);\n\n const handleArchiveRequest = (sessionId: string) => {\n setSessionToArchive(sessionId);\n setShowConfirm(true);\n };\n\n const handleUndoArchive = useCallback(async (sessionId: string) => {\n try {\n await dataSource.unarchiveSession(sessionId);\n setRefreshKey((k) => k + 1);\n window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n detail: { reason: 'unarchived', sessionId },\n }));\n } catch (undoErr) {\n console.error('Failed to restore session:', undoErr);\n toast.error(t('BiChat.Sidebar.FailedToRestoreChat'));\n }\n }, [dataSource, t, toast]);\n\n const confirmArchive = async () => {\n if (!sessionToArchive) {return;}\n\n const wasCurrentSession = activeSessionId === sessionToArchive;\n const archivedId = sessionToArchive;\n\n try {\n await dataSource.archiveSession(archivedId);\n setRefreshKey((k) => k + 1);\n window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n detail: { reason: 'archived', sessionId: archivedId },\n }));\n\n if (wasCurrentSession) {\n onSessionSelect('');\n }\n\n toast.success(t('BiChat.Sidebar.ChatArchived'), 8000, {\n label: t('BiChat.Common.Undo'),\n onClick: () => handleUndoArchive(archivedId),\n });\n } catch (err) {\n console.error('Failed to archive session:', err);\n const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToArchiveChat'));\n setActionError(display);\n toast.error(display.title);\n } finally {\n setShowConfirm(false);\n setSessionToArchive(null);\n }\n };\n\n const handleTogglePin = useCallback(async (\n sessionId: string,\n currentlyPinned: boolean\n ) => {\n try {\n if (currentlyPinned) {\n await dataSource.unpinSession(sessionId);\n } else {\n await dataSource.pinSession(sessionId);\n }\n setRefreshKey((k) => k + 1);\n } catch (err) {\n console.error('Failed to toggle pin:', err);\n const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToTogglePin'));\n setActionError(display);\n toast.error(display.title);\n }\n }, [dataSource, t, toast]);\n\n const handleRenameSession = useCallback(async (sessionId: string, newTitle: string) => {\n try {\n await dataSource.renameSession(sessionId, newTitle);\n toast.success(t('BiChat.Sidebar.ChatRenamedSuccessfully'));\n setRefreshKey((k) => k + 1);\n } catch (err) {\n console.error('Failed to update session title:', err);\n const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToRenameChat'));\n setActionError(display);\n toast.error(display.title);\n }\n }, [dataSource, t, toast]);\n\n const handleRegenerateTitle = useCallback(async (sessionId: string) => {\n try {\n await dataSource.regenerateSessionTitle(sessionId);\n toast.success(t('BiChat.Sidebar.TitleRegenerated'));\n window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n detail: { reason: 'title_regenerate_requested', sessionId },\n }));\n } catch (err) {\n console.error('Failed to regenerate title:', err);\n const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToRegenerateTitle'));\n setActionError(display);\n toast.error(display.title);\n }\n }, [dataSource, t, toast]);\n\n // Stable callbacks for SessionItem — accept session ID as parameter\n const handleSessionSelect = useCallback(\n (sessionId: string) => onSessionSelect(sessionId),\n [onSessionSelect],\n );\n const handleSessionArchive = useCallback(\n (sessionId: string) => handleArchiveRequest(sessionId),\n [],\n );\n const handleSessionPin = useCallback(\n (sessionId: string, pinned: boolean) => handleTogglePin(sessionId, pinned),\n [handleTogglePin],\n );\n const handleSessionRename = useCallback(\n (sessionId: string, newTitle: string) => handleRenameSession(sessionId, newTitle),\n [handleRenameSession],\n );\n const handleSessionRegenerateTitle = useCallback(\n (sessionId: string) => handleRegenerateTitle(sessionId),\n [handleRegenerateTitle],\n );\n\n // Filter sessions by search\n const filteredSessions = useMemo(() => {\n if (!searchQuery.trim()) {return sessions;}\n const q = searchQuery.toLowerCase();\n return sessions.filter((s) => s.title?.toLowerCase().includes(q));\n }, [sessions, searchQuery]);\n\n // Separate pinned and unpinned\n const pinnedSessions = useMemo(\n () => filteredSessions.filter((s) => s.pinned),\n [filteredSessions]\n );\n const unpinnedSessions = useMemo(\n () => filteredSessions.filter((s) => !s.pinned),\n [filteredSessions]\n );\n\n // Group unpinned sessions by date\n const sessionGroups = useMemo(() => {\n const groups = groupSessionsByDate(unpinnedSessions, t);\n return Array.isArray(groups)\n ? groups.map((group) => ({\n ...group,\n sessions: Array.isArray(group.sessions) ? group.sessions : [],\n }))\n : [];\n }, [unpinnedSessions, t]);\n\n // Keep collapsed indicators in the same visual order as expanded list.\n const orderedUnpinnedSessions = useMemo(\n () => sessionGroups.flatMap((group) => group.sessions),\n [sessionGroups]\n );\n\n // Collapsed sidebar indicators — pinned first, then most recent\n const collapsedIndicators = useMemo(() => {\n const seen = new Set<string>();\n const result: Session[] = [];\n for (const s of [...pinnedSessions, ...orderedUnpinnedSessions]) {\n if (seen.has(s.id)) {continue;}\n seen.add(s.id);\n result.push(s);\n if (result.length >= MAX_COLLAPSED_INDICATORS) {break;}\n }\n return result;\n }, [pinnedSessions, orderedUnpinnedSessions]);\n\n const totalSessionCount = filteredSessions.length;\n const overflowCount = Math.max(0, totalSessionCount - collapsedIndicators.length);\n\n // Keyboard navigation for session list (WAI-ARIA listbox pattern)\n const handleSessionListKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n const nav = sessionListRef.current;\n if (!nav) {return;}\n\n const focusableItems = Array.from(\n nav.querySelectorAll<HTMLElement>('button[data-session-item]')\n );\n if (focusableItems.length === 0) {return;}\n\n const currentIndex = focusableItems.indexOf(\n document.activeElement as HTMLElement\n );\n\n let nextIndex: number | null = null;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n nextIndex =\n currentIndex < 0 ? 0 : Math.min(currentIndex + 1, focusableItems.length - 1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n nextIndex =\n currentIndex < 0\n ? focusableItems.length - 1\n : Math.max(currentIndex - 1, 0);\n break;\n case 'Home':\n e.preventDefault();\n nextIndex = 0;\n break;\n case 'End':\n e.preventDefault();\n nextIndex = focusableItems.length - 1;\n break;\n }\n\n if (nextIndex !== null) {\n focusableItems[nextIndex].focus();\n }\n },\n []\n );\n\n return (\n <>\n <aside\n onClick={collapsible ? handleSidebarClick : undefined}\n className={`relative bg-surface-300 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-700 h-full min-h-0 flex flex-col ${collapsedOverflowVisible ? 'overflow-visible' : 'overflow-hidden'} transition-[width] duration-300 ease-in-out ${\n showCollapsed\n ? 'w-16 cursor-e-resize'\n : collapsible\n ? 'w-64 cursor-w-resize'\n : 'w-64'\n } ${className}`}\n style={{ willChange: 'width' }}\n role=\"navigation\"\n aria-label={t('BiChat.Sidebar.ChatSessions')}\n >\n {/* Collapsed overlay — absolutely positioned, fades in after width shrinks */}\n {collapsible && (\n <div\n className={`absolute inset-x-0 top-0 bottom-0 z-10 flex flex-col items-center pt-3 gap-3 transition-opacity ${\n showCollapsed\n ? 'opacity-100 duration-150 delay-100'\n : 'opacity-0 pointer-events-none duration-100'\n }`}\n >\n <div className=\"group/tooltip relative\">\n <motion.button\n onClick={(e) => {\n e.stopPropagation();\n onNewChat();\n }}\n disabled={creating || loading || accessDenied}\n className=\"w-10 h-10 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm flex items-center justify-center disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50\"\n title={t('BiChat.Chat.NewChat')}\n aria-label={t('BiChat.Sidebar.CreateNewChat')}\n whileTap={{ scale: 0.95 }}\n >\n {creating ? (\n <div className=\"w-4 h-4 border-2 border-white/50 border-t-transparent rounded-full animate-spin\" />\n ) : (\n <Plus size={18} weight=\"bold\" />\n )}\n </motion.button>\n <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/tooltip:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n {t('BiChat.Chat.NewChat')}\n </span>\n </div>\n\n {/* Search button — expands sidebar and focuses search */}\n <div className=\"group/search relative\">\n <motion.button\n onClick={(e) => {\n e.stopPropagation();\n expand();\n setTimeout(() => {\n const input = searchContainerRef.current?.querySelector('input');\n input?.focus();\n }, SIDEBAR_EXPAND_FOCUS_DELAY_MS);\n }}\n className=\"w-10 h-10 rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 text-gray-500 dark:text-gray-400 flex items-center justify-center cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:outline-none\"\n aria-label={t('BiChat.Sidebar.SearchChats')}\n whileTap={{ scale: 0.95 }}\n >\n <MagnifyingGlass size={18} />\n </motion.button>\n <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/search:opacity-100 group-focus-within/search:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n {t('BiChat.Sidebar.SearchChats')}\n </span>\n </div>\n\n {/* Session indicators */}\n {collapsedIndicators.length > 0 && (\n <motion.div\n className=\"flex flex-col items-center gap-1.5 mt-1\"\n variants={shouldReduceMotion ? undefined : staggerContainerVariants}\n initial=\"hidden\"\n animate={showCollapsed ? 'visible' : 'hidden'}\n >\n {collapsedIndicators.map((session) => {\n const isActive = session.id === activeSessionId;\n const initial = session.title?.trim()?.[0]?.toUpperCase();\n return (\n <motion.div\n key={session.id}\n className=\"group/indicator relative\"\n variants={\n shouldReduceMotion\n ? undefined\n : {\n hidden: { opacity: 0, scale: 0.8 },\n visible: { opacity: 1, scale: 1 },\n }\n }\n >\n <motion.button\n onClick={(e) => {\n e.stopPropagation();\n onSessionSelect(session.id);\n }}\n className={`w-9 h-9 rounded-full flex items-center justify-center text-xs font-medium cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:outline-none ${\n isActive\n ? 'bg-primary-100 dark:bg-primary-900/40 text-primary-700 dark:text-primary-300 ring-2 ring-primary-500 dark:ring-primary-400'\n : 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n }`}\n aria-label={session.title || t('BiChat.Chat.NewChat')}\n whileTap={{ scale: 0.95 }}\n >\n {initial ? (\n initial\n ) : (\n <ChatCircle size={16} weight=\"fill\" />\n )}\n </motion.button>\n <div className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 w-52 rounded-lg bg-gray-900 dark:bg-gray-100 px-3 py-2 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/indicator:opacity-100 group-focus-within/indicator:opacity-100 transition-opacity shadow-lg break-words\">\n {session.title || t('BiChat.Chat.NewChat')}\n </div>\n </motion.div>\n );\n })}\n {overflowCount > 0 && (\n <motion.div\n className=\"group/overflow relative\"\n variants={\n shouldReduceMotion\n ? undefined\n : {\n hidden: { opacity: 0, scale: 0.8 },\n visible: { opacity: 1, scale: 1 },\n }\n }\n >\n <motion.button\n onClick={(e) => {\n e.stopPropagation();\n toggle();\n }}\n className=\"w-9 h-9 rounded-full flex items-center justify-center text-[10px] font-semibold bg-gray-50 dark:bg-gray-800/60 text-gray-500 dark:text-gray-500 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:outline-none\"\n aria-label={t('BiChat.Sidebar.MoreChats', { count: overflowCount })}\n whileTap={{ scale: 0.95 }}\n >\n +{overflowCount}\n </motion.button>\n <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/overflow:opacity-100 group-focus-within/overflow:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n {t('BiChat.Sidebar.ChatSessions')}\n </span>\n </motion.div>\n )}\n </motion.div>\n )}\n </div>\n )}\n\n {/* Expanded content — fades out before width shrinks */}\n <div\n className={`flex flex-col flex-1 min-h-0 w-64 shrink-0 transition-opacity ${\n showCollapsed\n ? 'opacity-0 pointer-events-none duration-100'\n : collapsible\n ? 'opacity-100 duration-150 delay-[200ms]'\n : ''\n }`}\n >\n {/* Header — only rendered when there is content to show */}\n {(headerSlot || onClose) && (\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n {headerSlot}\n {onClose && (\n <motion.button\n onClick={onClose}\n className=\"cursor-pointer p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-smooth text-gray-600 dark:text-gray-400\"\n title={t('BiChat.Sidebar.CloseSidebar')}\n aria-label={t('BiChat.Sidebar.CloseSidebar')}\n whileHover=\"hover\"\n whileTap=\"tap\"\n variants={buttonVariants}\n >\n <X size={20} className=\"w-5 h-5\" />\n </motion.button>\n )}\n </div>\n )}\n\n {/* Conditional content based on active view */}\n {activeTab === 'all-chats' && showAllChatsTab ? (\n <AllChatsList\n dataSource={dataSource}\n onSessionSelect={onSessionSelect}\n activeSessionId={activeSessionId}\n />\n ) : (\n <>\n {/* Search Input */}\n <div ref={searchContainerRef} className=\"mt-3 px-4\">\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={t('BiChat.Sidebar.SearchChats')}\n />\n </div>\n\n {/* New Chat Button */}\n <div className=\"p-4\">\n <motion.button\n onClick={(e) => {\n e.stopPropagation();\n onNewChat();\n }}\n disabled={creating || loading || accessDenied}\n className=\"cursor-pointer w-full px-4 py-2.5 bg-primary-600 dark:bg-primary-700 text-white rounded-lg hover:bg-primary-700 hover:-translate-y-0.5 active:bg-primary-800 transition-all duration-150 font-medium shadow-sm disabled:opacity-40 disabled:cursor-not-allowed flex items-center justify-center gap-2 focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900\"\n title={accessDenied ? t('BiChat.Sidebar.MissingPermission') : t('BiChat.Chat.NewChat')}\n aria-label={t('BiChat.Sidebar.CreateNewChat')}\n whileHover={shouldReduceMotion ? {} : { y: -1 }}\n whileTap={shouldReduceMotion ? {} : { scale: 0.98 }}\n >\n {creating ? (\n <>\n <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n <span>{t('BiChat.Common.Creating')}</span>\n </>\n ) : (\n <>\n <Plus size={16} weight=\"bold\" />\n <span>{t('BiChat.Chat.NewChat')}</span>\n </>\n )}\n </motion.button>\n </div>\n\n {/* Chat History */}\n <nav\n ref={sessionListRef}\n className=\"flex-1 overflow-y-auto px-2 pb-4 hide-scrollbar\"\n aria-label={t('BiChat.Sidebar.ChatHistory')}\n onKeyDown={handleSessionListKeyDown}\n >\n {loading && sessions.length === 0 ? (\n <SessionSkeleton count={5} />\n ) : (\n <>\n {/* Pinned Sessions */}\n {pinnedSessions.length > 0 && (\n <div className=\"mb-4\">\n <DateGroupHeader\n groupName={t('BiChat.Common.Pinned')}\n count={pinnedSessions.length}\n />\n <motion.div\n className=\"space-y-1 mt-2\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n role=\"list\"\n aria-label={t('BiChat.Sidebar.PinnedChats')}\n >\n {pinnedSessions.map((session) => {\n const canWrite = session.access?.canWrite ?? true;\n return (\n <SessionItem\n key={session.id}\n session={session}\n isActive={session.id === activeSessionId}\n onSelect={() => handleSessionSelect(session.id)}\n onArchive={canWrite ? () => handleSessionArchive(session.id) : undefined}\n onPin={canWrite ? () => handleSessionPin(session.id, session.pinned) : undefined}\n onRename={canWrite ? (newTitle) => handleSessionRename(session.id, newTitle) : undefined}\n onRegenerateTitle={canWrite ? () => handleSessionRegenerateTitle(session.id) : undefined}\n />\n );\n })}\n </motion.div>\n <div className=\"border-b border-gray-200 dark:border-gray-700 my-3\" />\n </div>\n )}\n\n {/* Grouped Sessions by Date */}\n {sessionGroups.map((group) => (\n <div key={group.name} className=\"mb-4\">\n <DateGroupHeader\n groupName={group.name}\n count={group.sessions.length}\n />\n <motion.div\n className=\"space-y-1 mt-2\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n role=\"list\"\n aria-label={`${group.name} chats`}\n >\n {group.sessions.map((session) => {\n const canWrite = session.access?.canWrite ?? true;\n return (\n <SessionItem\n key={session.id}\n session={session}\n isActive={session.id === activeSessionId}\n onSelect={() => handleSessionSelect(session.id)}\n onArchive={canWrite ? () => handleSessionArchive(session.id) : undefined}\n onPin={canWrite ? () => handleSessionPin(session.id, session.pinned) : undefined}\n onRename={canWrite ? (newTitle) => handleSessionRename(session.id, newTitle) : undefined}\n onRegenerateTitle={canWrite ? () => handleSessionRegenerateTitle(session.id) : undefined}\n />\n );\n })}\n </motion.div>\n </div>\n ))}\n\n {/* Empty State */}\n {filteredSessions.length === 0 && !loading && (\n <EmptyState\n title={\n searchQuery\n ? t('BiChat.Sidebar.NoChatsFound', { query: searchQuery })\n : t('BiChat.Sidebar.NoChatsYet')\n }\n description={\n searchQuery\n ? undefined\n : t('BiChat.Sidebar.CreateOneToGetStarted')\n }\n action={\n searchQuery ? (\n <button\n onClick={() => setSearchQuery('')}\n className=\"cursor-pointer text-sm text-primary-600 dark:text-primary-400 hover:underline\"\n >\n {t('BiChat.Common.Clear')}\n </button>\n ) : undefined\n }\n />\n )}\n </>\n )}\n\n {loadError && <ErrorAlert error={loadError} />}\n {actionError && !loadError && <ErrorAlert error={actionError} />}\n </nav>\n\n {/* Footer slot */}\n {footerSlot}\n </>\n )}\n\n {/* Footer — settings (left) + collapse toggle (right) */}\n {collapsible && (\n <div className=\"mt-auto border-t border-gray-100 dark:border-gray-800/80 px-4 py-3 flex items-center justify-between\">\n {/* Gear settings menu */}\n {(onArchivedView || showAllChatsTab) ? (\n <Menu>\n <MenuButton\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n }}\n disabled={loading || accessDenied}\n className=\"flex items-center justify-center rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 p-2\"\n aria-label={t('BiChat.Sidebar.Settings')}\n title={t('BiChat.Sidebar.Settings')}\n >\n <Gear size={20} />\n </MenuButton>\n <MenuItems\n anchor=\"top start\"\n className=\"w-48 bg-white dark:bg-gray-900 rounded-xl shadow-lg border border-gray-200 dark:border-gray-700 z-[var(--bichat-z-dropdown,10)] [--anchor-gap:8px] mb-1 p-1.5\"\n >\n {onArchivedView && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onArchivedView();\n close();\n }}\n className={`cursor-pointer flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] text-gray-600 dark:text-gray-300 transition-colors ${\n focus ? 'bg-gray-100 dark:bg-gray-800/70' : ''\n }`}\n aria-label={t('BiChat.Sidebar.ArchivedChats')}\n >\n <Archive size={16} className=\"text-gray-400 dark:text-gray-500\" />\n {t('BiChat.Sidebar.ArchivedChats')}\n </button>\n )}\n </MenuItem>\n )}\n {showAllChatsTab && activeTab !== 'all-chats' && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleTabChange('all-chats');\n close();\n }}\n className={`cursor-pointer flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] text-gray-600 dark:text-gray-300 transition-colors ${\n focus ? 'bg-gray-100 dark:bg-gray-800/70' : ''\n }`}\n aria-label={t('BiChat.Sidebar.AllChats')}\n >\n <Users size={16} className=\"text-gray-400 dark:text-gray-500\" />\n {t('BiChat.Sidebar.AllChats')}\n </button>\n )}\n </MenuItem>\n )}\n {showAllChatsTab && activeTab === 'all-chats' && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleTabChange('my-chats');\n close();\n }}\n className={`cursor-pointer flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] text-gray-600 dark:text-gray-300 transition-colors ${\n focus ? 'bg-gray-100 dark:bg-gray-800/70' : ''\n }`}\n aria-label={t('BiChat.Sidebar.MyChats')}\n >\n <List size={16} className=\"text-gray-400 dark:text-gray-500\" />\n {t('BiChat.Sidebar.MyChats')}\n </button>\n )}\n </MenuItem>\n )}\n </MenuItems>\n </Menu>\n ) : (\n <div />\n )}\n\n {/* Collapse toggle */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggle();\n }}\n className=\"flex items-center gap-2 rounded-lg px-3 py-2 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n title={t('BiChat.Sidebar.CollapseSidebar')}\n aria-label={t('BiChat.Sidebar.CollapseSidebar')}\n >\n <CaretLineLeft size={16} />\n <span className=\"text-xs font-medium\">{t('BiChat.Sidebar.Collapse')}</span>\n </button>\n </div>\n )}\n </div>\n\n {/* Collapsed footer — expand button */}\n {collapsible && showCollapsed && (\n <div className=\"absolute bottom-0 inset-x-0 z-10 border-t border-gray-100 dark:border-gray-800/80 py-3 flex justify-center\">\n <div className=\"group/tooltip relative\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggle();\n }}\n className=\"w-10 h-10 flex items-center justify-center rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n title={t('BiChat.Sidebar.ExpandSidebar')}\n aria-label={t('BiChat.Sidebar.ExpandSidebar')}\n >\n <CaretLineRight size={16} />\n </button>\n <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/tooltip:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n {t('BiChat.Sidebar.Expand')}\n </span>\n </div>\n </div>\n )}\n </aside>\n\n {/* Confirm Archive Modal */}\n <ConfirmModal\n isOpen={showConfirm}\n title={t('BiChat.Sidebar.ArchiveChatSession')}\n message={t('BiChat.Sidebar.ArchiveChatMessage')}\n confirmText={t('BiChat.Sidebar.ArchiveButton')}\n cancelText={t('BiChat.Common.Cancel')}\n isDanger={true}\n onConfirm={confirmArchive}\n onCancel={() => {\n setShowConfirm(false);\n setSessionToArchive(null);\n }}\n />\n\n {/* Toast notifications */}\n <ToastContainer toasts={toast.toasts} onDismiss={toast.dismiss} />\n </>\n );\n}\n","/**\n * useToast Hook\n * Manages toast notification state\n */\n\nimport { useState, useCallback, useRef } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning'\n\nexport interface ToastAction {\n label: string\n onClick: () => void\n}\n\nexport interface ToastItem {\n id: string\n type: ToastType\n message: string\n duration?: number\n action?: ToastAction\n}\n\nexport interface UseToastReturn {\n toasts: ToastItem[]\n success: (msg: string, duration?: number, action?: ToastAction) => void\n error: (msg: string, duration?: number, action?: ToastAction) => void\n info: (msg: string, duration?: number, action?: ToastAction) => void\n warning: (msg: string, duration?: number, action?: ToastAction) => void\n dismiss: (id: string) => void\n dismissAll: () => void\n}\n\n/**\n * Generate a unique ID for a toast\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(7);\n}\n\nconst DEDUPE_WINDOW_MS = 2500;\nconst MAX_ACTIVE_TOASTS = 5;\n\n/**\n * Hook for managing toast notifications\n *\n * @example\n * ```tsx\n * const { toasts, success, error, dismiss } = useToast()\n *\n * // Show a success toast\n * success('Operation completed!')\n *\n * // Show an error toast with custom duration\n * error('Something went wrong', 10000)\n *\n * // Render toasts\n * <ToastContainer toasts={toasts} onDismiss={dismiss} />\n * ```\n */\nexport function useToast(): UseToastReturn {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const recentToastMapRef = useRef<Map<string, number>>(new Map());\n\n const showToast = useCallback(\n (type: ToastType, message: string, duration?: number, action?: ToastAction) => {\n const normalizedMessage = message.trim().toLowerCase();\n const key = `${type}:${normalizedMessage}`;\n const now = Date.now();\n const lastShownAt = recentToastMapRef.current.get(key);\n if (lastShownAt && now - lastShownAt < DEDUPE_WINDOW_MS) {\n return;\n }\n\n // Drop old dedupe entries to keep map small.\n for (const [mapKey, ts] of recentToastMapRef.current.entries()) {\n if (now - ts > DEDUPE_WINDOW_MS * 4) {\n recentToastMapRef.current.delete(mapKey);\n }\n }\n recentToastMapRef.current.set(key, now);\n\n const id = generateId();\n setToasts((prev) => {\n const next = [...prev, { id, type, message, duration, action }];\n if (next.length <= MAX_ACTIVE_TOASTS) {return next;}\n return next.slice(next.length - MAX_ACTIVE_TOASTS);\n });\n },\n []\n );\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const dismissAll = useCallback(() => {\n setToasts([]);\n recentToastMapRef.current.clear();\n }, []);\n\n const success = useCallback(\n (msg: string, duration?: number, action?: ToastAction) => showToast('success', msg, duration, action),\n [showToast],\n );\n const error = useCallback(\n (msg: string, duration?: number, action?: ToastAction) => showToast('error', msg, duration, action),\n [showToast],\n );\n const info = useCallback(\n (msg: string, duration?: number, action?: ToastAction) => showToast('info', msg, duration, action),\n [showToast],\n );\n const warning = useCallback(\n (msg: string, duration?: number, action?: ToastAction) => showToast('warning', msg, duration, action),\n [showToast],\n );\n\n return {\n toasts,\n success,\n error,\n info,\n warning,\n dismiss,\n dismissAll,\n };\n}\n","import { differenceInDays, startOfDay } from 'date-fns';\nimport type { Session, SessionGroup } from '../types';\n\n/**\n * Groups chat sessions by date relative to today\n * Categories: Today, Yesterday, Last 7 Days, Last 30 Days, Older\n * Sessions within each group are sorted by updatedAt (most recent first)\n */\nexport function groupSessionsByDate(sessions: Session[], t?: (key: string) => string): SessionGroup[] {\n // Ensure sessions is always an array\n const safeSessions = Array.isArray(sessions) ? sessions : [];\n\n const now = new Date();\n const today = startOfDay(now);\n\n // Use translation function if provided, otherwise use key as fallback\n const translate = t || ((key: string) => key);\n\n // Map internal keys to translation keys\n const dateLabels: Record<string, string> = {\n 'Today': translate('BiChat.DateGroup.Today'),\n 'Yesterday': translate('BiChat.DateGroup.Yesterday'),\n 'Last 7 Days': translate('BiChat.DateGroup.Last7Days'),\n 'Last 30 Days': translate('BiChat.DateGroup.Last30Days'),\n 'Older': translate('BiChat.DateGroup.Older'),\n };\n\n // Initialize all groups in the desired order\n const groupMap = new Map<string, Session[]>([\n ['Today', []],\n ['Yesterday', []],\n ['Last 7 Days', []],\n ['Last 30 Days', []],\n ['Older', []],\n ]);\n\n // Categorize each session\n safeSessions.forEach((session) => {\n const sessionDate = new Date(session.updatedAt);\n const daysDiff = differenceInDays(today, startOfDay(sessionDate));\n\n if (daysDiff === 0) {\n groupMap.get('Today')!.push(session);\n } else if (daysDiff === 1) {\n groupMap.get('Yesterday')!.push(session);\n } else if (daysDiff <= 7) {\n groupMap.get('Last 7 Days')!.push(session);\n } else if (daysDiff <= 30) {\n groupMap.get('Last 30 Days')!.push(session);\n } else {\n groupMap.get('Older')!.push(session);\n }\n });\n\n // Sort sessions within each group by updatedAt (most recent first)\n groupMap.forEach((sessions) => {\n sessions.sort((a, b) => {\n return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();\n });\n });\n\n // Convert to array and filter out empty groups, translating names\n const groups: SessionGroup[] = [];\n groupMap.forEach((sessions, internalName) => {\n if (sessions.length > 0) {\n groups.push({ name: dateLabels[internalName] || internalName, sessions });\n }\n });\n\n return groups;\n}\n","/**\n * ArchivedChatList Component\n * Displays archived chat sessions with restore functionality.\n * Router-agnostic: uses callbacks for navigation instead of react-router-dom.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { motion } from 'framer-motion';\nimport { Archive, ArrowLeft } from '@phosphor-icons/react';\nimport SessionItem from './SessionItem';\nimport SearchInput from './SearchInput';\nimport DateGroupHeader from './DateGroupHeader';\nimport LoadingSpinner from './LoadingSpinner';\nimport ConfirmModal from './ConfirmModal';\nimport { EmptyState } from './EmptyState';\nimport { ToastContainer } from './ToastContainer';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useToast, type UseToastReturn } from '../hooks/useToast';\nimport { groupSessionsByDate } from '../utils/sessionGrouping';\nimport { staggerContainerVariants } from '../animations/variants';\nimport type { Session, ChatDataSource } from '../types';\n\nexport interface ArchivedChatListProps {\n dataSource: ChatDataSource\n onBack: () => void\n onSessionSelect: (sessionId: string) => void\n activeSessionId?: string\n className?: string\n toast?: UseToastReturn\n}\n\nexport default function ArchivedChatList({\n dataSource,\n onBack,\n onSessionSelect,\n activeSessionId,\n className = '',\n toast: toastFromProps,\n}: ArchivedChatListProps) {\n const { t } = useTranslation();\n const localToast = useToast();\n const toast = toastFromProps ?? localToast;\n const shouldRenderToastContainer = !toastFromProps;\n\n // Search state\n const [searchQuery, setSearchQuery] = useState('');\n\n // Session data\n const [sessions, setSessions] = useState<Session[]>([]);\n const [loading, setLoading] = useState(true);\n\n // Refresh key\n const [refreshKey, setRefreshKey] = useState(0);\n\n // Confirm modal state for restore action\n const [showConfirm, setShowConfirm] = useState(false);\n const [sessionToRestore, setSessionToRestore] = useState<string | null>(null);\n\n // Fetch archived sessions\n const fetchSessions = useCallback(async () => {\n try {\n setLoading(true);\n const result = await dataSource.listSessions({\n limit: 100,\n includeArchived: true,\n });\n setSessions(result.sessions.filter((s) => s.status === 'archived'));\n } catch (err) {\n console.error('Failed to load archived sessions:', err);\n } finally {\n setLoading(false);\n }\n }, [dataSource]);\n\n useEffect(() => {\n fetchSessions();\n }, [fetchSessions, refreshKey]);\n\n const handleRestoreRequest = (sessionId: string) => {\n setSessionToRestore(sessionId);\n setShowConfirm(true);\n };\n\n const confirmRestore = async () => {\n if (!sessionToRestore) {return;}\n\n try {\n const restoredSessionID = sessionToRestore;\n await dataSource.unarchiveSession(restoredSessionID);\n window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n detail: { reason: 'restored', sessionId: restoredSessionID },\n }));\n setRefreshKey((k) => k + 1);\n toast.success(t('BiChat.Archived.ChatRestoredSuccessfully'));\n } catch (err) {\n console.error('Failed to restore session:', err);\n toast.error(t('BiChat.Archived.FailedToRestoreChat'));\n } finally {\n setShowConfirm(false);\n setSessionToRestore(null);\n }\n };\n\n const handleRenameSession = async (sessionId: string, newTitle: string) => {\n try {\n await dataSource.renameSession(sessionId, newTitle);\n toast.success(t('BiChat.Sidebar.ChatRenamedSuccessfully'));\n setRefreshKey((k) => k + 1);\n } catch (err) {\n console.error('Failed to update session title:', err);\n toast.error(t('BiChat.Sidebar.FailedToRenameChat'));\n }\n };\n\n // Filter by search query\n const filteredSessions = useMemo(() => {\n if (!searchQuery.trim()) {return sessions;}\n const q = searchQuery.toLowerCase();\n return sessions.filter((s) => s.title?.toLowerCase().includes(q));\n }, [sessions, searchQuery]);\n\n // Group sessions by date\n const sessionGroups = useMemo(() => {\n const groups = groupSessionsByDate(filteredSessions, t);\n return Array.isArray(groups)\n ? groups.map((group) => ({\n ...group,\n sessions: Array.isArray(group.sessions) ? group.sessions : [],\n }))\n : [];\n }, [filteredSessions, t]);\n\n const isEmpty = sessions.length === 0;\n const isEmptyAfterSearch = filteredSessions.length === 0 && !!searchQuery;\n\n return (\n <div\n className={`flex-1 flex flex-col bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {/* Header */}\n <div className=\"border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 px-6 py-4\">\n <div className=\"flex items-center gap-3 mb-4\">\n <button\n onClick={onBack}\n className=\"inline-flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors text-gray-600 dark:text-gray-400\"\n aria-label={t('BiChat.Archived.BackToChats')}\n >\n <ArrowLeft size={20} className=\"w-5 h-5\" />\n {t('BiChat.Common.Back')}\n </button>\n </div>\n\n <div className=\"flex items-center gap-2 mb-4\">\n <Archive\n size={24}\n className=\"w-6 h-6 text-gray-600 dark:text-gray-400\"\n />\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('BiChat.Archived.Title')}\n </h1>\n </div>\n\n {/* Search */}\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={t('BiChat.Archived.SearchArchivedChats')}\n />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {loading && sessions.length === 0 ? (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n ) : isEmpty ? (\n <div className=\"flex items-center justify-center h-full px-6\">\n <EmptyState\n icon={\n <Archive\n size={48}\n className=\"text-gray-400 dark:text-gray-500\"\n />\n }\n title={t('BiChat.Archived.NoArchivedChats')}\n description={t('BiChat.Archived.NoArchivedChatsDescription')}\n />\n </div>\n ) : isEmptyAfterSearch ? (\n <div className=\"flex items-center justify-center h-full px-6\">\n <EmptyState\n icon={\n <Archive\n size={48}\n className=\"text-gray-400 dark:text-gray-500\"\n />\n }\n title={t('BiChat.Archived.NoResults')}\n description={t('BiChat.Archived.NoResultsDescription', {\n query: searchQuery,\n })}\n />\n </div>\n ) : (\n <motion.div\n className=\"px-4 py-4 space-y-4\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {sessionGroups.map((group) => (\n <div key={group.name}>\n <DateGroupHeader\n groupName={group.name}\n count={group.sessions.length}\n />\n <motion.ul className=\"space-y-1 mt-3 mb-4\" role=\"list\">\n {group.sessions.map((session) => (\n <motion.li key={session.id} className=\"opacity-70\">\n <SessionItem\n session={session}\n isActive={session.id === activeSessionId}\n mode=\"archived\"\n testIdPrefix=\"archived\"\n onSelect={() => onSessionSelect(session.id)}\n onRestore={() => handleRestoreRequest(session.id)}\n onRename={(newTitle) =>\n handleRenameSession(session.id, newTitle)\n }\n />\n </motion.li>\n ))}\n </motion.ul>\n </div>\n ))}\n </motion.div>\n )}\n </div>\n\n {/* Confirm Restore Modal */}\n <ConfirmModal\n isOpen={showConfirm}\n title={t('BiChat.Archived.RestoreChat')}\n message={t('BiChat.Archived.RestoreChatMessage')}\n confirmText={t('BiChat.Archived.RestoreButton')}\n cancelText={t('BiChat.Common.Cancel')}\n isDanger={false}\n onConfirm={confirmRestore}\n onCancel={() => {\n setShowConfirm(false);\n setSessionToRestore(null);\n }}\n />\n\n {/* Toast notifications */}\n {shouldRenderToastContainer && (\n <ToastContainer toasts={toast.toasts} onDismiss={toast.dismiss} />\n )}\n </div>\n );\n}\n","/**\n * Skip to main content link for keyboard navigation\n * Hidden by default, visible on keyboard focus\n * Allows users to skip navigation and go directly to main content\n */\n\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport default function SkipLink() {\n const { t } = useTranslation();\n\n return (\n <a\n href=\"#main-content\"\n className=\"sr-only focus-visible:not-sr-only focus-visible:absolute focus-visible:top-4 focus-visible:left-4 focus-visible:z-50 focus-visible:bg-primary-600 focus-visible:text-white focus-visible:px-4 focus-visible:py-2 focus-visible:rounded-lg focus-visible:shadow-lg\"\n >\n {t('BiChat.SkipLink.Label')}\n </a>\n );\n}\n","/**\n * useSidebarState — mobile breakpoint detection + drawer open/close state.\n * SSR-safe. Auto-closes drawer when resizing to desktop.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 767px)';\n\nfunction getIsMobile(): boolean {\n if (typeof window === 'undefined') {return false;}\n return window.matchMedia(MOBILE_QUERY).matches;\n}\n\nexport interface UseSidebarStateReturn {\n isMobile: boolean\n isMobileOpen: boolean\n openMobile: () => void\n closeMobile: () => void\n toggleMobile: () => void\n}\n\nexport function useSidebarState(): UseSidebarStateReturn {\n const [isMobile, setIsMobile] = useState(getIsMobile);\n const [isMobileOpen, setIsMobileOpen] = useState(false);\n\n useEffect(() => {\n if (typeof window === 'undefined') {return;}\n\n const mql = window.matchMedia(MOBILE_QUERY);\n\n const handler = (e: MediaQueryListEvent) => {\n setIsMobile(e.matches);\n if (!e.matches) {setIsMobileOpen(false);}\n };\n\n // Safari < 14 uses addListener; modern browsers use addEventListener\n if (mql.addEventListener) {\n mql.addEventListener('change', handler);\n } else if (mql.addListener) {\n mql.addListener(handler);\n }\n\n return () => {\n if (mql.removeEventListener) {\n mql.removeEventListener('change', handler);\n } else if (mql.removeListener) {\n mql.removeListener(handler);\n }\n };\n }, []);\n\n const openMobile = useCallback(() => setIsMobileOpen(true), []);\n const closeMobile = useCallback(() => setIsMobileOpen(false), []);\n const toggleMobile = useCallback(() => setIsMobileOpen((v) => !v), []);\n\n return { isMobile, isMobileOpen, openMobile, closeMobile, toggleMobile };\n}\n","/**\n * BiChatLayout Component\n * Full-page layout with responsive sidebar, mobile drawer, page transitions,\n * keyboard shortcuts (Cmd+N), and SkipLink accessibility.\n *\n * Router-agnostic: consumers provide renderSidebar, routeKey, and onNewChat callbacks.\n */\n\nimport React, { useEffect, useRef, useMemo } from 'react';\nimport { AnimatePresence, motion, type PanInfo } from 'framer-motion';\nimport { List } from '@phosphor-icons/react';\nimport SkipLink from './SkipLink';\nimport { useSidebarState, type UseSidebarStateReturn } from '../hooks/useSidebarState';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { useKeyboardShortcuts, type ShortcutConfig } from '../hooks/useKeyboardShortcuts';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface SidebarDrawerProps {\n onClose?: () => void\n}\n\nexport interface BiChatLayoutProps {\n /** Render function for the sidebar. Receives `{ onClose }` when in mobile drawer mode. */\n renderSidebar: (props: SidebarDrawerProps) => React.ReactNode\n /** Main page content */\n children: React.ReactNode\n /** Callback for Cmd+N keyboard shortcut */\n onNewChat?: () => void\n /** Key for AnimatePresence page transitions (e.g. location.pathname). Omit to disable transitions. */\n routeKey?: string\n /** Custom class for the root container */\n className?: string\n}\n\nexport function BiChatLayout({\n renderSidebar,\n children,\n onNewChat,\n routeKey,\n className = '',\n}: BiChatLayoutProps) {\n const { t } = useTranslation();\n const { isMobile, isMobileOpen, openMobile, closeMobile } = useSidebarState();\n const drawerRef = useRef<HTMLDivElement>(null);\n const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n // Focus trap on mobile drawer\n useFocusTrap(drawerRef, isMobile && isMobileOpen, menuButtonRef.current);\n\n // Cmd+N keyboard shortcut\n const shortcuts = useMemo<ShortcutConfig[]>(() => {\n if (!onNewChat) {return [];}\n return [{ key: 'n', ctrl: true, callback: onNewChat, description: 'New chat' }];\n }, [onNewChat]);\n useKeyboardShortcuts(shortcuts);\n\n // Escape key closes mobile drawer\n useEffect(() => {\n if (!isMobile || !isMobileOpen) {return;}\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n closeMobile();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [closeMobile, isMobile, isMobileOpen]);\n\n // Swipe-left to close drawer\n const handleDrawerDragEnd = (_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n if (info.offset.x < -80) {\n closeMobile();\n }\n };\n\n // Page transition content\n const content = routeKey ? (\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={routeKey}\n className=\"flex flex-1 min-w-0 min-h-0\"\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n >\n {children}\n </motion.div>\n </AnimatePresence>\n ) : (\n <div className=\"flex flex-1 min-w-0 min-h-0\">{children}</div>\n );\n\n return (\n <div className={`relative flex flex-1 w-full h-full min-h-0 overflow-hidden ${className}`}>\n <SkipLink />\n\n {/* Sidebar — desktop */}\n <div className=\"hidden md:block\">\n {renderSidebar({})}\n </div>\n\n {/* Sidebar — mobile drawer */}\n <AnimatePresence>\n {isMobile && isMobileOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n key=\"sidebar-backdrop\"\n className=\"fixed inset-0 z-[var(--bichat-z-overlay,30)] bg-black/40\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={closeMobile}\n aria-hidden=\"true\"\n />\n {/* Drawer */}\n <motion.div\n key=\"sidebar-drawer\"\n className=\"fixed inset-y-0 left-0 z-[var(--bichat-z-modal,40)] w-[18rem] max-w-[85vw] shadow-2xl\"\n initial={{ x: '-100%' }}\n animate={{ x: 0 }}\n exit={{ x: '-100%' }}\n transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n drag=\"x\"\n dragDirectionLock\n dragConstraints={{ left: -120, right: 0 }}\n dragElastic={{ left: 0.2, right: 0 }}\n onDragEnd={handleDrawerDragEnd}\n onClick={(e) => e.stopPropagation()}\n >\n <div ref={drawerRef} className=\"h-full bg-white dark:bg-gray-900\">\n {renderSidebar({ onClose: closeMobile })}\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n\n {/* Main Content */}\n <main id=\"main-content\" className=\"relative flex-1 min-w-0 flex flex-col min-h-0 overflow-hidden\">\n {/* Mobile menu button */}\n {isMobile && !isMobileOpen && (\n <button\n ref={menuButtonRef}\n onClick={openMobile}\n className=\"md:hidden absolute top-3 left-3 z-[var(--bichat-z-sticky,20)] w-10 h-10 rounded-xl bg-white/90 dark:bg-gray-900/90 text-gray-700 dark:text-gray-200 border border-gray-200/60 dark:border-gray-800/80 shadow-sm flex items-center justify-center hover:bg-white dark:hover:bg-gray-900 transition-colors cursor-pointer focus-visible:ring-2 focus-visible:ring-primary-400/50\"\n aria-label={t('BiChat.Layout.OpenSidebar')}\n title={t('BiChat.Layout.OpenSidebar')}\n >\n <List size={20} weight=\"bold\" />\n </button>\n )}\n {content}\n </main>\n </div>\n );\n}\n\n// Re-export useSidebarState for consumers who want custom layout control\nexport { useSidebarState, type UseSidebarStateReturn };\n","import { useState, memo } from 'react';\nimport { Copy, ArrowClockwise, PencilSimple } from '@phosphor-icons/react';\nimport { MessageRole } from '../types';\nimport { useToast } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\nimport LoadingSpinner from './LoadingSpinner';\n\ninterface ActionableMessage {\n id: string\n role: MessageRole\n content: string\n}\n\ninterface MessageActionsProps {\n message: ActionableMessage\n onCopy: (text: string) => Promise<void>\n onRegenerate?: (messageId: string) => Promise<void>\n onEdit?: (message: ActionableMessage) => void\n}\n\nfunction MessageActions({\n message,\n onCopy,\n onRegenerate,\n onEdit,\n}: MessageActionsProps) {\n const [copying, setCopying] = useState(false);\n const [regenerating, setRegenerating] = useState(false);\n const toast = useToast();\n const { t } = useTranslation();\n\n const isUser = message.role === MessageRole.User;\n\n const handleCopy = async () => {\n setCopying(true);\n try {\n await onCopy(message.content);\n toast.success(t('BiChat.Message.CopiedToClipboard'));\n } catch {\n toast.error(t('BiChat.Message.FailedToCopy'));\n } finally {\n setCopying(false);\n }\n };\n\n const handleRegenerate = async () => {\n if (!onRegenerate) {return;}\n setRegenerating(true);\n try {\n await onRegenerate(message.id);\n } finally {\n setRegenerating(false);\n }\n };\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Copy button */}\n <button\n onClick={handleCopy}\n disabled={copying}\n title={copying ? t('BiChat.Message.Copying') : t('BiChat.Message.CopyMessage')}\n className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors disabled:opacity-50 p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={copying ? t('BiChat.Message.Copying') : t('BiChat.Message.CopyMessage')}\n >\n {copying ? (\n <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n ) : (\n <Copy size={16} className=\"w-4 h-4\" />\n )}\n </button>\n\n {/* Regenerate button (AI messages only) */}\n {!isUser && onRegenerate && (\n <button\n onClick={handleRegenerate}\n disabled={regenerating}\n title={regenerating ? t('BiChat.Message.Regenerating') : t('BiChat.Message.Regenerate')}\n className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors disabled:opacity-50 p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={regenerating ? t('BiChat.Message.Regenerating') : t('BiChat.Message.Regenerate')}\n >\n {regenerating ? (\n <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n ) : (\n <ArrowClockwise size={16} className=\"w-4 h-4\" />\n )}\n </button>\n )}\n\n {/* Edit button (user messages only) */}\n {isUser && onEdit && (\n <button\n onClick={() => onEdit(message)}\n title={t('BiChat.Message.EditMessage')}\n className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={t('BiChat.Message.EditMessage')}\n >\n <PencilSimple size={16} className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n );\n}\n\nexport default memo(MessageActions);\nexport { MessageActions };\nexport type { ActionableMessage };\n","/**\n * AttachmentPreview Component\n * Displays thumbnail preview of an image attachment\n * Shows filename, size, remove button, and supports click-to-enlarge\n */\n\nimport { memo, useState } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport { ImageAttachment } from '../types';\nimport { formatFileSize, createDataUrl } from '../utils/fileUtils';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface AttachmentPreviewProps {\n /** The attachment to display */\n attachment: ImageAttachment\n /** Optional callback when remove button is clicked */\n onRemove?: () => void\n /** Optional callback when thumbnail is clicked (for enlargement) */\n onClick?: () => void\n /** If true, hide remove button and disable click interactions */\n readonly?: boolean\n}\n\nconst AttachmentPreview = memo<AttachmentPreviewProps>(({ attachment, onRemove, onClick, readonly = false }) => {\n const { t } = useTranslation();\n const [isImageLoaded, setIsImageLoaded] = useState(false);\n const [imageError, setImageError] = useState(false);\n\n const previewUrl = attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType);\n const isClickable = onClick !== undefined && !readonly;\n const showRemoveButton = onRemove !== undefined && !readonly;\n\n return (\n <div\n className={`\n relative\n rounded-lg\n border border-gray-200 dark:border-gray-700\n bg-white dark:bg-gray-800\n p-2\n transition-all\n duration-200\n ${isClickable ? 'cursor-pointer hover:shadow-md hover:border-primary-400 dark:hover:border-primary-500' : ''}\n ${!isClickable ? 'hover:shadow-sm' : ''}\n `}\n onClick={isClickable ? onClick : undefined}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n >\n {/* Thumbnail Container */}\n <div className=\"relative mb-2 overflow-hidden rounded-md bg-gray-100 dark:bg-gray-700 aspect-square\">\n {/* Loading Skeleton */}\n {!isImageLoaded && !imageError && (\n <div className=\"absolute inset-0 animate-pulse bg-gray-200 dark:bg-gray-600\" />\n )}\n\n {/* Error State */}\n {imageError && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-gray-100 dark:bg-gray-700\">\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">{t('BiChat.Attachment.PreviewUnavailable')}</span>\n </div>\n )}\n\n {/* Image */}\n <img\n src={previewUrl}\n alt={attachment.filename}\n className={`\n w-full h-full object-cover\n transition-opacity duration-200\n ${isImageLoaded ? 'opacity-100' : 'opacity-0'}\n ${isClickable ? 'group-hover:scale-105' : ''}\n `}\n onLoad={() => setIsImageLoaded(true)}\n onError={() => setImageError(true)}\n />\n </div>\n\n {/* Filename */}\n {!isImageLoaded && !imageError ? (\n <div className=\"h-3 w-3/4 bg-gray-200 dark:bg-gray-600 rounded animate-pulse mb-1\" />\n ) : (\n <p\n className=\"text-xs font-medium text-gray-700 dark:text-gray-300 truncate\"\n title={attachment.filename}\n >\n {attachment.filename}\n </p>\n )}\n\n {/* File Size */}\n {!isImageLoaded && !imageError ? (\n <div className=\"h-3 w-1/2 bg-gray-200 dark:bg-gray-600 rounded animate-pulse mb-1\" />\n ) : (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n {formatFileSize(attachment.sizeBytes)}\n </p>\n )}\n\n {/* Remove Button */}\n {showRemoveButton && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n className=\"absolute top-1 right-1 flex items-center justify-center bg-red-500 hover:bg-red-600 dark:bg-red-600 dark:hover:bg-red-700 text-white rounded-full transition-all duration-200 shadow-sm hover:shadow-md active:scale-90 w-6 h-6\"\n aria-label={`Remove ${attachment.filename}`}\n title={t('BiChat.Attachment.Remove')}\n >\n <X size={14} className=\"w-3.5 h-3.5\" weight=\"bold\" />\n </button>\n )}\n </div>\n );\n});\n\nAttachmentPreview.displayName = 'AttachmentPreview';\n\nexport default AttachmentPreview;\n","/**\n * AttachmentUpload Component\n * Handles file selection and base64 encoding for chat attachments\n * Provides loading states, validation, and error handling\n */\n\nimport { memo, useRef, useCallback, useState } from 'react';\nimport { Paperclip, CircleNotch } from '@phosphor-icons/react';\nimport { Attachment } from '../types';\nimport {\n ATTACHMENT_ACCEPT_ATTRIBUTE,\n convertToBase64,\n createDataUrl,\n formatFileSize,\n isImageMimeType,\n validateAttachmentFile,\n} from '../utils/fileUtils';\nimport { useToast } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface AttachmentError {\n filename: string\n error: string\n}\n\ninterface AttachmentUploadProps {\n /** Callback fired when files are successfully converted and validated */\n onAttachmentsSelected: (attachments: Attachment[]) => void\n /** Maximum number of attachments allowed (default: 10) */\n maxAttachments?: number\n /** Maximum file size in bytes (default: 20 MB) */\n maxSizeBytes?: number\n /** Whether the component is disabled */\n disabled?: boolean\n}\n\nconst AttachmentUpload = memo<AttachmentUploadProps>(\n ({ onAttachmentsSelected, maxAttachments = 10, maxSizeBytes = 20 * 1024 * 1024, disabled = false }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [isLoading, setIsLoading] = useState(false);\n const toast = useToast();\n const { t } = useTranslation();\n\n /**\n * Handles file selection from the input element\n * Validates, converts to base64, and calls onAttachmentsSelected\n */\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n // Reset input so same file selection can be processed again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n\n if (files.length === 0) {\n return;\n }\n\n setIsLoading(true);\n\n try {\n // Validate file count\n if (files.length > maxAttachments) {\n toast.error(t('BiChat.Error.MaxFiles', { max: maxAttachments, selected: files.length }));\n setIsLoading(false);\n return;\n }\n\n const attachments: Attachment[] = [];\n const errors: AttachmentError[] = [];\n\n // Process each file\n for (const file of files) {\n // Validate file\n try {\n validateAttachmentFile(file, maxSizeBytes);\n } catch (validationErr) {\n errors.push({ filename: file.name, error: validationErr instanceof Error ? validationErr.message : String(validationErr) });\n continue;\n }\n\n try {\n // Convert to base64\n const base64Data = await convertToBase64(file);\n const attachment: Attachment = {\n clientKey: crypto.randomUUID(),\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data,\n };\n if (isImageMimeType(file.type)) {\n attachment.preview = createDataUrl(base64Data, file.type);\n }\n\n attachments.push(attachment);\n } catch (err) {\n errors.push({\n filename: file.name,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Show error toasts for failed files\n if (errors.length > 0) {\n errors.forEach((err) => {\n toast.error(`${err.filename}: ${err.error}`);\n });\n }\n\n // Call parent callback with successful attachments\n if (attachments.length > 0) {\n onAttachmentsSelected(attachments);\n const message =\n attachments.length === 1\n ? t('BiChat.Attachment.FileAdded', { size: formatFileSize(attachments[0].sizeBytes) })\n : t('BiChat.Attachment.FileAdded', { size: `${attachments.length} files` });\n toast.success(message);\n } else if (errors.length > 0) {\n toast.error(t('BiChat.Attachment.InvalidFile'));\n }\n } finally {\n setIsLoading(false);\n }\n },\n [maxAttachments, maxSizeBytes, onAttachmentsSelected, toast, t]\n );\n\n /**\n * Triggers the hidden file input\n */\n const handleClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n const isDisabled = disabled || isLoading;\n\n return (\n <div className=\"relative\">\n {/* Hidden File Input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={ATTACHMENT_ACCEPT_ATTRIBUTE}\n onChange={handleFileSelect}\n disabled={isDisabled}\n className=\"sr-only\"\n aria-label={t('BiChat.Attachment.SelectFiles')}\n />\n\n {/* Trigger Button */}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n className=\"\n flex items-center justify-center\n w-8 h-8\n text-gray-600 dark:text-gray-400\n hover:text-gray-800 dark:hover:text-gray-200\n hover:bg-gray-100 dark:hover:bg-gray-700\n disabled:text-gray-400 dark:disabled:text-gray-600\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-lg\n transition-all\n duration-200\n active:scale-95\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n \"\n aria-label={t('BiChat.Attachment.SelectFiles')}\n aria-busy={isLoading}\n >\n {isLoading ? (\n <CircleNotch size={20} className=\"w-5 h-5 animate-spin\" weight=\"fill\" />\n ) : (\n <Paperclip size={20} className=\"w-5 h-5\" weight=\"fill\" />\n )}\n </button>\n </div>\n );\n }\n);\n\nAttachmentUpload.displayName = 'AttachmentUpload';\n\nexport default AttachmentUpload;\n","import { useEffect, useState } from 'react';\n\ninterface ScreenReaderAnnouncerProps {\n message: string\n politeness?: 'polite' | 'assertive'\n clearAfter?: number\n}\n\n/**\n * Screen reader announcer component for live region updates\n * Uses ARIA live regions to announce dynamic content changes\n *\n * @param message - The message to announce\n * @param politeness - 'polite' (wait for pause) or 'assertive' (immediate)\n * @param clearAfter - Optional milliseconds to clear message after announcement\n *\n * @example\n * <ScreenReaderAnnouncer\n * message=\"New message received\"\n * politeness=\"polite\"\n * />\n */\nexport default function ScreenReaderAnnouncer({\n message,\n politeness = 'polite',\n clearAfter,\n}: ScreenReaderAnnouncerProps) {\n const [announcement, setAnnouncement] = useState(message);\n\n useEffect(() => {\n setAnnouncement(message);\n\n if (clearAfter && message) {\n const timer = setTimeout(() => {\n setAnnouncement('');\n }, clearAfter);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [message, clearAfter]);\n\n return (\n <div\n role=\"status\"\n aria-live={politeness}\n aria-atomic=\"true\"\n className=\"sr-only\"\n >\n {announcement}\n </div>\n );\n}\n","/**\n * QuestionForm Component\n * Multi-step modal wizard for answering pending questions\n * Includes question steps and confirmation step with progress indicator\n * Supports custom \"Other\" text input for all questions\n */\n\nimport { useState } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport { type PendingQuestion, type QuestionAnswers, type QuestionAnswerData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport QuestionStep from './QuestionStep';\nimport ConfirmationStep from './ConfirmationStep';\nimport { LoadingSpinner } from './LoadingSpinner';\nimport { isQuestionAnswered, validateAnswers } from '../utils/questionFormUtils';\n\ninterface QuestionFormProps {\n pendingQuestion: PendingQuestion\n sessionId: string\n onSubmit: (answers: QuestionAnswers) => Promise<void>\n onCancel: () => void\n}\n\nexport default function QuestionForm({\n pendingQuestion,\n onSubmit,\n onCancel,\n}: QuestionFormProps) {\n const { t } = useTranslation();\n const [currentStep, setCurrentStep] = useState(0);\n const [answers, setAnswers] = useState<QuestionAnswers>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const questions = pendingQuestion.questions;\n const isConfirmationStep = currentStep === questions.length;\n const isFirstStep = currentStep === 0;\n const isLastStep = currentStep === questions.length - 1;\n\n // Check if current question is answered\n const currentQuestionAnswered =\n isConfirmationStep ||\n (questions[currentStep]?.id &&\n isQuestionAnswered(answers[questions[currentStep].id]));\n\n const handleAnswer = (answerData: QuestionAnswerData) => {\n const currentQuestion = questions[currentStep];\n if (currentQuestion) {\n setAnswers((prev) => ({\n ...prev,\n [currentQuestion.id]: answerData,\n }));\n }\n };\n\n const handleNext = () => {\n if (!currentQuestionAnswered) {return;}\n if (isLastStep) {\n setCurrentStep(isConfirmationStep ? currentStep : currentStep + 1);\n } else {\n setCurrentStep(currentStep + 1);\n }\n };\n\n const handleBack = () => {\n if (currentStep > 0) {\n setCurrentStep(currentStep - 1);\n }\n };\n\n const handleSubmitAnswers = async () => {\n const validationError = validateAnswers(questions, answers, t);\n if (validationError) {\n setError(validationError);\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n await onSubmit(answers);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : t('BiChat.Error.Generic');\n setError(errorMessage);\n setIsSubmitting(false);\n }\n };\n\n // Calculate progress text\n const totalSteps = questions.length + 1;\n const progressText = isConfirmationStep\n ? t('BiChat.QuestionForm.Step', { current: totalSteps, total: totalSteps })\n : t('BiChat.QuestionForm.Step', { current: currentStep + 1, total: totalSteps });\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 p-4\">\n {/* Modal Container */}\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\n {/* Header */}\n <div className=\"border-b border-gray-200 dark:border-gray-700 p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('BiChat.QuestionForm.Title')}\n </h2>\n <button\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-50\"\n aria-label={t('BiChat.Common.Close')}\n >\n <X className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Progress Indicator */}\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n {progressText}\n </div>\n\n {/* Progress Bar */}\n <div className=\"mt-3 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary-600 transition-all duration-300\"\n style={{\n width: `${((currentStep + 1) / totalSteps) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-700 dark:text-red-400 text-sm\">{error}</p>\n </div>\n )}\n\n {isConfirmationStep ? (\n <ConfirmationStep questions={questions} answers={answers} />\n ) : (\n <QuestionStep\n question={questions[currentStep]!}\n selectedAnswers={answers}\n onAnswer={handleAnswer}\n />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"border-t border-gray-200 dark:border-gray-700 p-6 flex gap-3 justify-between\">\n {/* Back Button */}\n {!isFirstStep && (\n <button\n onClick={handleBack}\n disabled={isSubmitting}\n className=\"cursor-pointer px-6 py-2 text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 disabled:opacity-50 font-medium transition-colors\"\n >\n {t('BiChat.QuestionForm.Back')}\n </button>\n )}\n\n <div className=\"flex-1\" />\n\n {isConfirmationStep ? (\n <>\n {/* Cancel Button */}\n <button\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"cursor-pointer px-6 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 font-medium transition-colors\"\n >\n {t('BiChat.Message.Cancel')}\n </button>\n\n {/* Submit Button */}\n <button\n onClick={handleSubmitAnswers}\n disabled={isSubmitting}\n className=\"cursor-pointer px-6 py-2 bg-primary-600 hover:bg-primary-700 disabled:opacity-50 text-white rounded-lg font-medium transition-colors flex items-center gap-2\"\n >\n {isSubmitting && <LoadingSpinner size=\"sm\" />}\n {isSubmitting ? t('BiChat.QuestionForm.Submitting') : t('BiChat.QuestionForm.Confirm')}\n </button>\n </>\n ) : (\n /* Next Button */\n <button\n onClick={handleNext}\n disabled={!currentQuestionAnswered || isSubmitting}\n className=\"cursor-pointer px-6 py-2 bg-primary-600 hover:bg-primary-700 disabled:opacity-50 text-white rounded-lg font-medium transition-colors\"\n >\n {t('BiChat.QuestionForm.Next')}\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * QuestionStep Component\n * Displays a single question with options to select from\n * Supports both single-select (radio) and multi-select (checkboxes)\n * Includes automatic \"Other\" option for custom text input\n */\n\nimport { useState, useEffect } from 'react';\nimport { type Question, type QuestionAnswers, type QuestionAnswerData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface QuestionStepProps {\n question: Question\n selectedAnswers: QuestionAnswers\n onAnswer: (answerData: QuestionAnswerData) => void\n}\n\nexport default function QuestionStep({\n question,\n selectedAnswers,\n onAnswer,\n}: QuestionStepProps) {\n const { t } = useTranslation();\n const answerData = selectedAnswers[question.id] || { options: [] };\n const selectedOptions = answerData.options || [];\n const isMultiSelect = question.type === 'MULTIPLE_CHOICE';\n\n // Local state for \"Other\" text input\n const [otherText, setOtherText] = useState(answerData.customText || '');\n\n // Sync local state with props when switching questions\n useEffect(() => {\n const data = selectedAnswers[question.id] || { options: [] };\n setOtherText(data.customText || '');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [question.id]);\n\n const handleOptionClick = (optionID: string) => {\n setOtherText('');\n if (isMultiSelect) {\n // Multi-select: toggle the option\n const newOptions = selectedOptions.includes(optionID)\n ? selectedOptions.filter((a) => a !== optionID)\n : [...selectedOptions, optionID];\n onAnswer({ options: newOptions, customText: undefined });\n } else {\n // Single-select: replace with new selection and clear custom text.\n onAnswer({ options: [optionID], customText: undefined });\n }\n };\n\n const handleOtherTextChange = (text: string) => {\n setOtherText(text);\n onAnswer({\n options: [],\n customText: text || undefined\n });\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Question Header */}\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">\n {question.text}\n </h3>\n </div>\n\n {/* Multi-select hint */}\n {isMultiSelect && (\n <p className=\"text-sm text-gray-500 dark:text-gray-500 italic\">\n {t('BiChat.Question.SelectMulti')}\n </p>\n )}\n\n {/* Options Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {(question.options || []).map((option) => {\n const isSelected = selectedOptions.includes(option.id);\n\n return (\n <button\n key={option.id}\n onClick={() => handleOptionClick(option.id)}\n className={`\n cursor-pointer relative p-4 text-left border-2 rounded-lg transition-all\n ${\n isSelected\n ? 'border-primary-500 bg-white dark:bg-gray-800'\n : 'border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600'\n }\n focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900\n `}\n type=\"button\"\n aria-pressed={isSelected}\n >\n <div className=\"flex items-start gap-3\">\n {/* Radio or Checkbox */}\n <div className=\"flex-shrink-0 mt-1\">\n {isMultiSelect ? (\n <input\n type=\"checkbox\"\n checked={isSelected}\n readOnly\n className=\"w-5 h-5 text-primary-600 border-gray-300 rounded focus:ring-0 dark:bg-gray-700 dark:border-gray-600\"\n />\n ) : (\n <input\n type=\"radio\"\n checked={isSelected}\n readOnly\n className=\"w-5 h-5 text-primary-600 border-gray-300 focus:ring-0 dark:bg-gray-700 dark:border-gray-600\"\n />\n )}\n </div>\n\n {/* Label */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-900 dark:text-white\">\n {option.label}\n </p>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n\n {/* \"Other\" Text Input - always shown */}\n <div>\n <label htmlFor=\"other-input\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n {t('BiChat.Question.SpecifyOther')}:\n </label>\n <textarea\n id=\"other-input\"\n value={otherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n placeholder={t('BiChat.Question.OtherOption')}\n rows={3}\n className=\"w-full px-4 py-3 border-2 border-gray-200 dark:border-gray-700 rounded-lg\n bg-white dark:bg-gray-800 text-gray-900 dark:text-white\n placeholder-gray-400 dark:placeholder-gray-500\n focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-primary-500\n resize-none\"\n />\n </div>\n </div>\n );\n}\n","/**\n * ConfirmationStep Component\n * Displays a summary of all questions and selected answers for review before submission\n * Supports both predefined options and custom \"Other\" text\n */\n\nimport { type Question, type QuestionAnswers } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ConfirmationStepProps {\n questions: Question[]\n answers: QuestionAnswers\n}\n\nexport default function ConfirmationStep({\n questions,\n answers,\n}: ConfirmationStepProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {t('BiChat.QuestionForm.ReviewTitle')}\n </h3>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n {t('BiChat.QuestionForm.ReviewDescription')}\n </p>\n </div>\n\n {/* Questions Summary */}\n <div className=\"space-y-4\">\n {questions.map((question) => {\n const answerData = answers[question.id] || { options: [] };\n const selectedOptions = answerData.options || [];\n const customText = answerData.customText;\n const optionLabelByID = new Map((question.options || []).map((option) => [option.id, option.label]));\n\n const hasAnswer = selectedOptions.length > 0 || !!customText;\n\n return (\n <div\n key={question.id}\n className=\"p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\"\n >\n {/* Question Text */}\n <h4 className=\"font-medium text-gray-900 dark:text-white mb-2\">\n {question.text}\n </h4>\n\n {/* Selected Answers as Tags */}\n {hasAnswer ? (\n <div className=\"flex flex-wrap gap-2\">\n {/* Predefined options */}\n {selectedOptions.map((option) => (\n <span\n key={option}\n className=\"inline-flex items-center px-3 py-1 rounded-lg text-sm font-medium border border-primary-500 bg-primary-500/10 text-primary-600 dark:border-primary-400 dark:bg-primary-400/10 dark:text-primary-400\"\n >\n {optionLabelByID.get(option) || option}\n </span>\n ))}\n\n {/* Custom \"Other\" text - displayed with distinct styling */}\n {customText && (\n <span className=\"inline-flex items-center px-3 py-1 rounded-lg text-sm font-medium border border-amber-500 bg-amber-500/10 text-amber-600 dark:border-amber-400 dark:bg-amber-400/10 dark:text-amber-400\">\n <span className=\"font-semibold mr-1\">{t('BiChat.Question.OtherOption')}:</span>\n <span className=\"italic\">{customText}</span>\n </span>\n )}\n </div>\n ) : (\n <p className=\"text-sm text-gray-400 dark:text-gray-500 italic\">\n {t('BiChat.QuestionForm.Skip')}\n </p>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * Shared validation utilities for QuestionForm components\n */\n\nimport type { Question, QuestionAnswerData, QuestionAnswers } from '../types';\n\n/**\n * Checks if a question has been answered.\n * A question is answered if it has at least one selected option OR custom text.\n */\nexport function isQuestionAnswered(data: QuestionAnswerData | undefined): boolean {\n if (!data) {return false;}\n return (data.options?.length ?? 0) > 0 || !!data.customText;\n}\n\n/**\n * Validates that all questions are answered and custom text is valid.\n * Returns null if valid, or an error message string if invalid.\n *\n * @param questions - Array of questions to validate\n * @param answers - Map of question IDs to answer data\n * @param t - Optional translation function for error messages\n */\nexport function validateAnswers(\n questions: Question[],\n answers: QuestionAnswers,\n t?: (key: string, params?: Record<string, string | number | boolean>) => string\n): string | null {\n const allAnswered = questions.every((q) => isQuestionAnswered(answers[q.id]));\n if (!allAnswered) {\n return t ? t('BiChat.Error.AllQuestionsRequired') : 'Please answer all questions before submitting';\n }\n\n for (const q of questions) {\n const data = answers[q.id];\n if (data && (data.options?.length ?? 0) === 0 && data.customText === '') {\n return t\n ? t('BiChat.Error.CustomTextRequired', { question: q.text })\n : `Please enter custom text for question: ${q.text}`;\n }\n }\n\n return null;\n}\n","/**\n * Slot Primitive\n * Utility component for the asChild pattern (similar to @radix-ui/react-slot)\n */\n\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactNode,\n type ReactElement,\n} from 'react';\n\ntype AnyProps = Record<string, unknown>\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n const overrideProps: AnyProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n // Merge event handlers\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args: unknown[]) => {\n ;(childPropValue as (...a: unknown[]) => void)(...args)\n ;(slotPropValue as (...a: unknown[]) => void)(...args);\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === 'style') {\n // Merge styles\n overrideProps[propName] = { ...(slotPropValue as object), ...(childPropValue as object) };\n } else if (propName === 'className') {\n // Merge classNames\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ');\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\nexport interface SlotProps extends HTMLAttributes<HTMLElement> {\n children?: ReactNode\n}\n\n/**\n * Slot component that merges its props with its child element's props\n * Used for the asChild pattern to allow consumers to customize the rendered element\n */\nexport const Slot = forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (!isValidElement(children)) {\n return null;\n }\n\n const childrenRef = (children as ReactElement & { ref?: unknown }).ref;\n\n return cloneElement(children as ReactElement, {\n ...mergeProps(slotProps, children.props as AnyProps),\n ref: forwardedRef\n ? composeRefs(forwardedRef, childrenRef as React.Ref<unknown>)\n : childrenRef,\n } as AnyProps);\n});\n\nSlot.displayName = 'Slot';\n\n/**\n * Compose multiple refs into one\n */\nfunction composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref != null) {\n ;(ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * Helper type for components that support asChild\n * Extends the HTML attributes while adding asChild option\n */\nexport type AsChildProps<T extends HTMLAttributes<HTMLElement> = HTMLAttributes<HTMLElement>> = T & {\n /** Merge props with child element instead of rendering wrapper */\n asChild?: boolean\n}\n\n/**\n * Get children count (flattens fragments)\n */\nexport function getValidChildren(children: ReactNode): ReactElement[] {\n return Children.toArray(children).filter(isValidElement) as ReactElement[];\n}\n","/**\n * Turn Primitive\n * Compound component for rendering a conversation turn (user + assistant)\n */\n\nimport {\n createContext,\n useContext,\n forwardRef,\n type HTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * TurnContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TurnContextValue {\n /** Turn identifier */\n turnId?: string\n}\n\nconst TurnContext = createContext<TurnContextValue | undefined>(undefined);\n\nfunction useTurnContext() {\n const context = useContext(TurnContext);\n if (!context) {\n throw new Error('Turn components must be used within Turn.Root');\n }\n return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnRootProps = AsChildProps<HTMLAttributes<HTMLDivElement>> & {\n /** Turn identifier for tracking */\n turnId?: string\n}\n\nconst TurnRoot = forwardRef<HTMLDivElement, TurnRootProps>((props, ref) => {\n const { asChild, turnId, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <TurnContext.Provider value={{ turnId }}>\n <Comp ref={ref} data-turn-id={turnId} {...domProps}>\n {children}\n </Comp>\n </TurnContext.Provider>\n );\n});\n\nTurnRoot.displayName = 'Turn.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.User\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnUserProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnUser = forwardRef<HTMLDivElement, TurnUserProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} data-turn-role=\"user\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nTurnUser.displayName = 'Turn.User';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Assistant\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnAssistantProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnAssistant = forwardRef<HTMLDivElement, TurnAssistantProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} data-turn-role=\"assistant\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nTurnAssistant.displayName = 'Turn.Assistant';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Timestamp\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnTimestampProps = AsChildProps<HTMLAttributes<HTMLTimeElement>> & {\n /** ISO date string or Date object */\n date?: string | Date\n /** Custom formatter */\n formatter?: (date: Date) => string\n}\n\nconst defaultFormatter = (date: Date) =>\n date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n\nconst TurnTimestamp = forwardRef<HTMLTimeElement, TurnTimestampProps>((props, ref) => {\n const { asChild, date, formatter = defaultFormatter, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'time';\n\n const dateObj = date ? (typeof date === 'string' ? new Date(date) : date) : null;\n const formattedTime = dateObj ? formatter(dateObj) : '';\n const isoString = dateObj?.toISOString();\n\n return (\n <Comp ref={ref} dateTime={isoString} {...domProps}>\n {children ?? formattedTime}\n </Comp>\n );\n});\n\nTurnTimestamp.displayName = 'Turn.Timestamp';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Actions\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnActionsProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnActions = forwardRef<HTMLDivElement, TurnActionsProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} role=\"group\" aria-label=\"Message actions\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nTurnActions.displayName = 'Turn.Actions';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Turn = {\n Root: TurnRoot,\n User: TurnUser,\n Assistant: TurnAssistant,\n Timestamp: TurnTimestamp,\n Actions: TurnActions,\n};\n\nexport { useTurnContext };\nexport type { TurnRootProps, TurnUserProps, TurnAssistantProps, TurnTimestampProps, TurnActionsProps };\n","/**\n * Avatar Primitive\n * Compound component for displaying user avatars with image and fallback\n */\n\nimport {\n createContext,\n useContext,\n useState,\n forwardRef,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * AvatarContext\n * -----------------------------------------------------------------------------------------------*/\n\ntype ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\ninterface AvatarContextValue {\n imageLoadingStatus: ImageLoadingStatus\n setImageLoadingStatus: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarContext = createContext<AvatarContextValue | undefined>(undefined);\n\nfunction useAvatarContext() {\n const context = useContext(AvatarContext);\n if (!context) {\n throw new Error('Avatar components must be used within Avatar.Root');\n }\n return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarRootProps = AsChildProps<HTMLAttributes<HTMLSpanElement>>\n\nconst AvatarRoot = forwardRef<HTMLSpanElement, AvatarRootProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'span';\n const [imageLoadingStatus, setImageLoadingStatus] = useState<ImageLoadingStatus>('idle');\n\n return (\n <AvatarContext.Provider value={{ imageLoadingStatus, setImageLoadingStatus }}>\n <Comp ref={ref} {...domProps}>\n {children}\n </Comp>\n </AvatarContext.Provider>\n );\n});\n\nAvatarRoot.displayName = 'Avatar.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Image\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarImageProps = AsChildProps<ImgHTMLAttributes<HTMLImageElement>> & {\n /** Called when loading status changes */\n onLoadingStatusChange?: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>((props, ref) => {\n const { asChild, src, alt, onLoadingStatusChange, onLoad, onError, ...domProps } = props;\n const { setImageLoadingStatus } = useAvatarContext();\n const Comp = asChild ? Slot : 'img';\n\n const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImageLoadingStatus('loaded');\n onLoadingStatusChange?.('loaded');\n onLoad?.(e);\n };\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImageLoadingStatus('error');\n onLoadingStatusChange?.('error');\n onError?.(e);\n };\n\n // Start loading when src is provided\n if (src) {\n return (\n <Comp\n ref={ref}\n src={src}\n alt={alt || ''}\n onLoad={handleLoad}\n onError={handleError}\n {...domProps}\n />\n );\n }\n\n return null;\n});\n\nAvatarImage.displayName = 'Avatar.Image';\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Fallback\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarFallbackProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n /** Delay before showing fallback (in ms) */\n delayMs?: number\n}\n\nconst AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>((props, ref) => {\n const { asChild, delayMs = 0, children, ...domProps } = props;\n const { imageLoadingStatus } = useAvatarContext();\n const Comp = asChild ? Slot : 'span';\n const [canRender, setCanRender] = useState(delayMs === 0);\n\n // Handle delay\n if (delayMs > 0 && !canRender) {\n setTimeout(() => setCanRender(true), delayMs);\n }\n\n // Only show fallback if image hasn't loaded\n if (imageLoadingStatus === 'loaded') {\n return null;\n }\n\n if (!canRender) {\n return null;\n }\n\n return (\n <Comp ref={ref} {...domProps}>\n {children}\n </Comp>\n );\n});\n\nAvatarFallback.displayName = 'Avatar.Fallback';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Avatar = {\n Root: AvatarRoot,\n Image: AvatarImage,\n Fallback: AvatarFallback,\n};\n\nexport { useAvatarContext };\nexport type { AvatarRootProps, AvatarImageProps, AvatarFallbackProps, ImageLoadingStatus };\n","/**\n * Bubble Primitive\n * Compound component for message bubble containers\n */\n\nimport {\n createContext,\n useContext,\n forwardRef,\n type HTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * BubbleContext\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleVariant = 'user' | 'assistant' | 'system'\n\ninterface BubbleContextValue {\n variant?: BubbleVariant\n}\n\nconst BubbleContext = createContext<BubbleContextValue | undefined>(undefined);\n\nfunction useBubbleContext() {\n const context = useContext(BubbleContext);\n if (!context) {\n throw new Error('Bubble components must be used within Bubble.Root');\n }\n return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleRootProps = AsChildProps<HTMLAttributes<HTMLDivElement>> & {\n /** Bubble variant (affects data attribute for styling) */\n variant?: BubbleVariant\n}\n\nconst BubbleRoot = forwardRef<HTMLDivElement, BubbleRootProps>((props, ref) => {\n const { asChild, variant, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <BubbleContext.Provider value={{ variant }}>\n <Comp ref={ref} data-bubble-variant={variant} {...domProps}>\n {children}\n </Comp>\n </BubbleContext.Provider>\n );\n});\n\nBubbleRoot.displayName = 'Bubble.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Content\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleContentProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleContent = forwardRef<HTMLDivElement, BubbleContentProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} data-bubble-part=\"content\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nBubbleContent.displayName = 'Bubble.Content';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Header\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleHeaderProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleHeader = forwardRef<HTMLDivElement, BubbleHeaderProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} data-bubble-part=\"header\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nBubbleHeader.displayName = 'Bubble.Header';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Footer\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleFooterProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleFooter = forwardRef<HTMLDivElement, BubbleFooterProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} data-bubble-part=\"footer\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nBubbleFooter.displayName = 'Bubble.Footer';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Metadata\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleMetadataProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleMetadata = forwardRef<HTMLDivElement, BubbleMetadataProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp ref={ref} data-bubble-part=\"metadata\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nBubbleMetadata.displayName = 'Bubble.Metadata';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Bubble = {\n Root: BubbleRoot,\n Content: BubbleContent,\n Header: BubbleHeader,\n Footer: BubbleFooter,\n Metadata: BubbleMetadata,\n};\n\nexport { useBubbleContext };\nexport type {\n BubbleRootProps,\n BubbleContentProps,\n BubbleHeaderProps,\n BubbleFooterProps,\n BubbleMetadataProps,\n BubbleVariant,\n};\n","/**\n * ActionButton Primitive\n * Compound component for icon buttons with tooltips\n */\n\nimport {\n createContext,\n useContext,\n useState,\n forwardRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButtonContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ActionButtonContextValue {\n isHovered: boolean\n isFocused: boolean\n isPressed: boolean\n isDisabled: boolean\n}\n\nconst ActionButtonContext = createContext<ActionButtonContextValue | undefined>(undefined);\n\nfunction useActionButtonContext() {\n const context = useContext(ActionButtonContext);\n if (!context) {\n throw new Error('ActionButton components must be used within ActionButton.Root');\n }\n return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonRootProps = AsChildProps<ButtonHTMLAttributes<HTMLButtonElement>>\n\nconst ActionButtonRoot = forwardRef<HTMLButtonElement, ActionButtonRootProps>((props, ref) => {\n const { asChild, disabled, children, onMouseEnter, onMouseLeave, onFocus, onBlur, onMouseDown, onMouseUp, ...domProps } = props;\n const Comp = asChild ? Slot : 'button';\n\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsHovered(true);\n onMouseEnter?.(e);\n };\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsHovered(false);\n setIsPressed(false);\n onMouseLeave?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n };\n\n const handleMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsPressed(true);\n onMouseDown?.(e);\n };\n\n const handleMouseUp = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsPressed(false);\n onMouseUp?.(e);\n };\n\n return (\n <ActionButtonContext.Provider\n value={{\n isHovered,\n isFocused,\n isPressed,\n isDisabled: !!disabled,\n }}\n >\n <Comp\n ref={ref}\n type=\"button\"\n disabled={disabled}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n {...domProps}\n >\n {children}\n </Comp>\n </ActionButtonContext.Provider>\n );\n});\n\nActionButtonRoot.displayName = 'ActionButton.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Icon\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonIconProps = AsChildProps<HTMLAttributes<HTMLSpanElement>>\n\nconst ActionButtonIcon = forwardRef<HTMLSpanElement, ActionButtonIconProps>((props, ref) => {\n const { asChild, children, ...domProps } = props;\n const Comp = asChild ? Slot : 'span';\n\n return (\n <Comp ref={ref} aria-hidden=\"true\" {...domProps}>\n {children}\n </Comp>\n );\n});\n\nActionButtonIcon.displayName = 'ActionButton.Icon';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Label\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonLabelProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n /** Visually hidden but accessible to screen readers */\n srOnly?: boolean\n}\n\nconst ActionButtonLabel = forwardRef<HTMLSpanElement, ActionButtonLabelProps>((props, ref) => {\n const { asChild, srOnly = false, children, className, ...domProps } = props;\n const Comp = asChild ? Slot : 'span';\n\n const srOnlyClass = srOnly\n ? 'absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0'\n : '';\n\n return (\n <Comp ref={ref} className={[srOnlyClass, className].filter(Boolean).join(' ')} {...domProps}>\n {children}\n </Comp>\n );\n});\n\nActionButtonLabel.displayName = 'ActionButton.Label';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Tooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonTooltipProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n /** Position relative to button */\n position?: 'top' | 'bottom' | 'left' | 'right'\n /** Only show when hovered */\n showOnHover?: boolean\n}\n\nconst ActionButtonTooltip = forwardRef<HTMLSpanElement, ActionButtonTooltipProps>((props, ref) => {\n const { asChild, position = 'top', showOnHover = true, children, ...domProps } = props;\n const context = useActionButtonContext();\n const Comp = asChild ? Slot : 'span';\n\n // If showOnHover is true, only render when hovered or focused\n if (showOnHover && !context.isHovered && !context.isFocused) {\n return null;\n }\n\n return (\n <Comp ref={ref} role=\"tooltip\" data-tooltip-position={position} {...domProps}>\n {children}\n </Comp>\n );\n});\n\nActionButtonTooltip.displayName = 'ActionButton.Tooltip';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const ActionButton = {\n Root: ActionButtonRoot,\n Icon: ActionButtonIcon,\n Label: ActionButtonLabel,\n Tooltip: ActionButtonTooltip,\n};\n\nexport { useActionButtonContext };\nexport type {\n ActionButtonRootProps,\n ActionButtonIconProps,\n ActionButtonLabelProps,\n ActionButtonTooltipProps,\n};\n","import { useState, useRef, useCallback } from 'react';\nimport type { StreamingHook } from '../types';\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n * console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n const [isStreaming, setIsStreaming] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const processStream = useCallback(\n async <T,>(\n generator: AsyncGenerator<T>,\n onChunk: (chunk: T) => void,\n signal?: AbortSignal\n ): Promise<void> => {\n setIsStreaming(true);\n\n // Create abort controller if not provided\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n // Listen to external signal if provided\n const onExternalAbort = signal ? () => { controller.abort(); } : undefined;\n if (signal && onExternalAbort) {\n signal.addEventListener('abort', onExternalAbort);\n }\n\n try {\n for await (const chunk of generator) {\n // Check if stream was cancelled\n if (controller.signal.aborted) {\n break;\n }\n\n onChunk(chunk);\n }\n } catch (error) {\n // Stream was cancelled or errored\n if (controller.signal.aborted) {\n // Cancellation is expected, don't throw\n return;\n }\n throw error;\n } finally {\n if (signal && onExternalAbort) {\n signal.removeEventListener('abort', onExternalAbort);\n }\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n []\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n setIsStreaming(false);\n }, []);\n\n const reset = useCallback(() => {\n abortControllerRef.current = null;\n setIsStreaming(false);\n }, []);\n\n return {\n isStreaming,\n processStream,\n cancel,\n reset\n };\n}\n","/**\n * useStreaming hook\n * BiChat-specific streaming hook that composes on top of applet-core's useStreaming.\n * Adds content accumulation, error state, and chunk type dispatch.\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useStreaming as useCoreStreaming } from '../../applet-core/hooks/useStreaming';\nimport { StreamChunk } from '../types';\n\ninterface UseStreamingOptions {\n onChunk?: (content: string) => void\n onError?: (error: string) => void\n onDone?: () => void\n}\n\nexport function useStreaming(options: UseStreamingOptions = {}) {\n const [content, setContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const core = useCoreStreaming();\n const coreRef = useRef(core);\n coreRef.current = core;\n\n const processStream = useCallback(\n async (stream: AsyncGenerator<StreamChunk>, signal?: AbortSignal) => {\n setError(null);\n setContent('');\n\n try {\n await coreRef.current.processStream<StreamChunk>(\n stream,\n (chunk) => {\n if ((chunk.type === 'chunk' || chunk.type === 'content') && chunk.content) {\n setContent((prev) => {\n const newContent = prev + chunk.content;\n optionsRef.current.onChunk?.(newContent);\n return newContent;\n });\n } else if (chunk.type === 'error') {\n const errorMsg = chunk.error || 'Stream error';\n const err = new Error(errorMsg);\n setError(err);\n optionsRef.current.onError?.(errorMsg);\n } else if (chunk.type === 'done') {\n optionsRef.current.onDone?.();\n }\n },\n signal\n );\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error('Unknown error');\n setError(errorObj);\n optionsRef.current.onError?.(errorObj.message);\n }\n },\n []\n );\n\n const cancel = useCallback(() => {\n coreRef.current.cancel();\n }, []);\n\n const reset = useCallback(() => {\n setContent('');\n setError(null);\n coreRef.current.reset();\n }, []);\n\n return {\n content,\n isStreaming: core.isStreaming,\n error,\n processStream,\n cancel,\n reset,\n };\n}\n","/**\n * useActiveRuns — live map of per-session generation status.\n *\n * Subscribes to the data source's `subscribeActiveRuns` channel\n * (`GET /bi-chat/stream/active-runs`) and maintains a\n * sessionId → status dictionary so the sidebar can render a status\n * dot next to each session card without polling /stream/status per\n * session.\n *\n * The hook is a no-op when:\n * - the data source does not implement subscribeActiveRuns (older\n * backends without the active-run index);\n * - `enabled` is false (e.g. the user is offline).\n */\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport type { ActiveRunDelivery, ChatDataSource } from '../types';\n\nexport interface ActiveRunSnapshot {\n runId: string;\n status: ActiveRunDelivery['status'];\n updatedAt: number;\n}\n\nexport interface UseActiveRunsOptions {\n enabled?: boolean;\n /** Optional hook for raw SSE errors. */\n onError?: (event: Event) => void;\n /**\n * Keep terminal-status entries in the map for this many milliseconds\n * before pruning them. Default 0 preserves the previous behaviour\n * (synchronous delete). Useful when consumers want to render a\n * \"completed\" pulse animation before the dot disappears.\n */\n retainTerminalMs?: number;\n /**\n * How long to wait for an initial snapshot batch before declaring\n * the hook `ready` when the server has zero active runs.\n * Default 250ms.\n */\n emptyStateTimeoutMs?: number;\n}\n\nexport interface UseActiveRunsResult {\n /** sessionId → current live status. Terminal statuses are emitted then the entry is removed. */\n runs: Record<string, ActiveRunSnapshot>;\n /** True once the initial HGETALL snapshot is delivered. */\n ready: boolean;\n /** Convenience: undefined when not active. */\n status: (sessionId: string) => ActiveRunDelivery['status'] | undefined;\n}\n\nconst TERMINAL = new Set<ActiveRunDelivery['status']>([\n 'completed',\n 'cancelled',\n 'failed',\n]);\n\nexport function useActiveRuns(\n dataSource: Pick<ChatDataSource, 'subscribeActiveRuns'>,\n options: UseActiveRunsOptions = {}\n): UseActiveRunsResult {\n const [runs, setRuns] = useState<Record<string, ActiveRunSnapshot>>({});\n const [ready, setReady] = useState(false);\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n\n const enabled = options.enabled ?? true;\n const retainTerminalMs = options.retainTerminalMs ?? 0;\n const emptyStateTimeoutMs = options.emptyStateTimeoutMs ?? 250;\n\n useEffect(() => {\n if (!enabled) {return;}\n if (!dataSource.subscribeActiveRuns) {return;}\n\n const controller = new AbortController();\n // Collect snapshot rows into a staging object so we only flip\n // `ready` once at the end of the initial batch. Each SSE\n // \"snapshot\" event is a single row; the server never emits a\n // delimiter, so we use a microtask coalescer instead.\n let stagingTimer: ReturnType<typeof setTimeout> | undefined;\n const staging: Record<string, ActiveRunSnapshot> = {};\n let sawSnapshotRow = false;\n // Pending terminal-removal timers keyed by sessionId so unmount\n // can clear them and repeat terminals for the same session don't\n // leak timers.\n const pendingTerminalTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n const flushSnapshot = () => {\n setRuns((prev) => ({ ...prev, ...staging }));\n setReady(true);\n stagingTimer = undefined;\n };\n\n const subscription = dataSource.subscribeActiveRuns({\n signal: controller.signal,\n onError: (evt) => onErrorRef.current?.(evt),\n onEvent: (evt) => {\n if (evt.event === 'snapshot') {\n sawSnapshotRow = true;\n // If a terminal-removal timer is pending for this sessionId\n // (e.g. the previous run completed and we're inside the\n // retention window), cancel it. A fresh snapshot — typically\n // delivered after native EventSource reconnect or when the\n // user restarts a run — must NOT be wiped by a stale prune.\n const pending = pendingTerminalTimers.get(evt.sessionId);\n if (pending !== undefined) {\n clearTimeout(pending);\n pendingTerminalTimers.delete(evt.sessionId);\n }\n staging[evt.sessionId] = {\n runId: evt.runId,\n status: evt.status,\n updatedAt: evt.updatedAt,\n };\n if (stagingTimer === undefined) {\n stagingTimer = setTimeout(flushSnapshot, 16);\n }\n return;\n }\n // update: apply immediately.\n if (TERMINAL.has(evt.status)) {\n if (retainTerminalMs <= 0) {\n // Legacy synchronous delete path.\n setRuns((prev) => {\n if (!(evt.sessionId in prev)) {return prev;}\n const next = { ...prev };\n delete next[evt.sessionId];\n return next;\n });\n return;\n }\n // Retain the entry with its terminal status so the consumer\n // can render a completion pulse, then prune after the\n // retention window.\n setRuns((prev) => ({\n ...prev,\n [evt.sessionId]: {\n runId: evt.runId,\n status: evt.status,\n updatedAt: evt.updatedAt,\n },\n }));\n const existing = pendingTerminalTimers.get(evt.sessionId);\n if (existing !== undefined) {clearTimeout(existing);}\n const handle = setTimeout(() => {\n pendingTerminalTimers.delete(evt.sessionId);\n setRuns((prev) => {\n if (!(evt.sessionId in prev)) {return prev;}\n const next = { ...prev };\n delete next[evt.sessionId];\n return next;\n });\n }, retainTerminalMs);\n pendingTerminalTimers.set(evt.sessionId, handle);\n return;\n }\n // Non-terminal update: write through and cancel any pending\n // prune for this session (run restarted before the retention\n // timer fired).\n const pending = pendingTerminalTimers.get(evt.sessionId);\n if (pending !== undefined) {\n clearTimeout(pending);\n pendingTerminalTimers.delete(evt.sessionId);\n }\n setRuns((prev) => ({\n ...prev,\n [evt.sessionId]: {\n runId: evt.runId,\n status: evt.status,\n updatedAt: evt.updatedAt,\n },\n }));\n },\n });\n\n // The subscription promise rejects on initial-connect failures\n // (401/503 before the grace window elapses). Route that through\n // onError instead of leaking an unhandled rejection to the global\n // scope — callers expect a single failure surface.\n subscription?.catch((err: unknown) => {\n if (controller.signal.aborted) {return;}\n const surface =\n err instanceof Event ? err : new Event('error');\n onErrorRef.current?.(surface);\n });\n\n // If the server has zero active runs on connect it never emits a\n // snapshot row; mark ready after a brief idle so consumers don't\n // spin forever.\n const readyTimeout = setTimeout(() => {\n if (!sawSnapshotRow) {setReady(true);}\n }, emptyStateTimeoutMs);\n\n return () => {\n controller.abort();\n if (stagingTimer !== undefined) {clearTimeout(stagingTimer);}\n clearTimeout(readyTimeout);\n for (const handle of pendingTerminalTimers.values()) {\n clearTimeout(handle);\n }\n pendingTerminalTimers.clear();\n };\n }, [dataSource, enabled, retainTerminalMs, emptyStateTimeoutMs]);\n\n const status = useCallback(\n (sessionId: string) => runs[sessionId]?.status,\n [runs]\n );\n\n return { runs, ready, status };\n}\n","/**\n * useImageGallery Hook\n * Manages image modal/gallery state and navigation\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { ImageAttachment } from '../types';\n\nexport interface UseImageGalleryOptions {\n /** Initial images to display */\n images?: ImageAttachment[]\n /** Wrap navigation at boundaries (default: false) */\n wrap?: boolean\n /** Callback when modal opens */\n onOpen?: (index: number) => void\n /** Callback when modal closes */\n onClose?: () => void\n /** Callback when navigation occurs */\n onNavigate?: (index: number, direction: 'prev' | 'next') => void\n}\n\nexport interface UseImageGalleryReturn {\n /** Whether the gallery modal is open */\n isOpen: boolean\n /** Current image index */\n currentIndex: number\n /** Current image (or undefined if none) */\n currentImage: ImageAttachment | undefined\n /** All images in the gallery */\n images: ImageAttachment[]\n /** Whether there's a previous image */\n hasPrev: boolean\n /** Whether there's a next image */\n hasNext: boolean\n /** Open gallery at specific index */\n open: (index: number, newImages?: ImageAttachment[]) => void\n /** Close the gallery */\n close: () => void\n /** Navigate to previous image */\n prev: () => void\n /** Navigate to next image */\n next: () => void\n /** Navigate to specific index */\n goTo: (index: number) => void\n /** Set images without opening */\n setImages: (images: ImageAttachment[]) => void\n}\n\n/**\n * Hook for managing image gallery/modal state\n *\n * @example\n * ```tsx\n * const gallery = useImageGallery({ images: attachments })\n *\n * // Open gallery\n * <button onClick={() => gallery.open(0)}>View Images</button>\n *\n * // Render gallery\n * {gallery.isOpen && (\n * <ImageModal\n * image={gallery.currentImage}\n * onClose={gallery.close}\n * onPrev={gallery.prev}\n * onNext={gallery.next}\n * hasPrev={gallery.hasPrev}\n * hasNext={gallery.hasNext}\n * />\n * )}\n * ```\n */\nexport function useImageGallery(options: UseImageGalleryOptions = {}): UseImageGalleryReturn {\n const { images: initialImages = [], wrap = false, onOpen, onClose, onNavigate } = options;\n\n const [isOpen, setIsOpen] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [images, setImages] = useState<ImageAttachment[]>(initialImages);\n\n const currentImage = useMemo(() => images[currentIndex], [images, currentIndex]);\n\n const hasPrev = useMemo(() => {\n if (wrap) {return images.length > 1;}\n return currentIndex > 0;\n }, [currentIndex, images.length, wrap]);\n\n const hasNext = useMemo(() => {\n if (wrap) {return images.length > 1;}\n return currentIndex < images.length - 1;\n }, [currentIndex, images.length, wrap]);\n\n const open = useCallback(\n (index: number, newImages?: ImageAttachment[]) => {\n if (newImages) {\n setImages(newImages);\n }\n const targetImages = newImages || images;\n // Handle empty images array - don't compute negative index\n if (targetImages.length === 0) {\n setCurrentIndex(0);\n setIsOpen(true);\n return;\n }\n const safeIndex = Math.max(0, Math.min(index, targetImages.length - 1));\n setCurrentIndex(safeIndex);\n setIsOpen(true);\n onOpen?.(safeIndex);\n },\n [images, onOpen]\n );\n\n const close = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n const prev = useCallback(() => {\n if (images.length < 2) {return;}\n if (!hasPrev && !wrap) {return;}\n\n setCurrentIndex((current) => {\n const newIndex = wrap\n ? (current - 1 + images.length) % images.length\n : Math.max(0, current - 1);\n onNavigate?.(newIndex, 'prev');\n return newIndex;\n });\n }, [hasPrev, wrap, images.length, onNavigate]);\n\n const next = useCallback(() => {\n if (images.length < 2) {return;}\n if (!hasNext && !wrap) {return;}\n\n setCurrentIndex((current) => {\n const newIndex = wrap ? (current + 1) % images.length : Math.min(images.length - 1, current + 1);\n onNavigate?.(newIndex, 'next');\n return newIndex;\n });\n }, [hasNext, wrap, images.length, onNavigate]);\n\n const goTo = useCallback(\n (index: number) => {\n const safeIndex = Math.max(0, Math.min(index, images.length - 1));\n setCurrentIndex(safeIndex);\n },\n [images.length]\n );\n\n const setImagesHandler = useCallback((newImages: ImageAttachment[]) => {\n setImages(newImages);\n // Reset index if it's out of bounds (handle empty array case)\n if (newImages.length === 0) {\n setCurrentIndex(0);\n } else {\n setCurrentIndex((current) => Math.min(current, newImages.length - 1));\n }\n }, []);\n\n return {\n isOpen,\n currentIndex,\n currentImage,\n images,\n hasPrev,\n hasNext,\n open,\n close,\n prev,\n next,\n goTo,\n setImages: setImagesHandler,\n };\n}\n","/**\n * useAutoScroll Hook\n * Manages auto-scroll behavior for chat containers\n */\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\n\nexport interface UseAutoScrollOptions {\n /** Threshold in pixels from bottom to consider \"at bottom\" (default: 100) */\n threshold?: number\n /** Smooth scroll behavior (default: true) */\n smooth?: boolean\n /** Callback when scroll position changes */\n onScroll?: (isAtBottom: boolean) => void\n}\n\nexport interface UseAutoScrollReturn {\n /** Ref to attach to the scrollable container */\n containerRef: React.RefObject<HTMLDivElement>\n /** Whether the container is scrolled to the bottom */\n isAtBottom: boolean\n /** Whether auto-scroll should be active */\n shouldAutoScroll: boolean\n /** Manually scroll to bottom */\n scrollToBottom: (smooth?: boolean) => void\n /** Enable/disable auto-scroll */\n setAutoScroll: (enabled: boolean) => void\n /** Handle scroll event (attach to container if not using ref) */\n handleScroll: (e: React.UIEvent<HTMLDivElement>) => void\n}\n\n/**\n * Hook for managing auto-scroll behavior in chat containers\n *\n * @example\n * ```tsx\n * const scroll = useAutoScroll({ threshold: 50 })\n *\n * // Attach to container\n * <div ref={scroll.containerRef} onScroll={scroll.handleScroll}>\n * {messages.map(msg => <Message key={msg.id} />)}\n * </div>\n *\n * // Scroll button\n * {!scroll.isAtBottom && (\n * <button onClick={() => scroll.scrollToBottom()}>\n * Scroll to bottom\n * </button>\n * )}\n * ```\n */\nexport function useAutoScroll(options: UseAutoScrollOptions = {}): UseAutoScrollReturn {\n const { threshold = 100, smooth = true, onScroll } = options;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [shouldAutoScroll, setShouldAutoScroll] = useState(true);\n\n const checkIsAtBottom = useCallback(\n (container: HTMLElement): boolean => {\n const { scrollTop, scrollHeight, clientHeight } = container;\n return scrollHeight - scrollTop - clientHeight <= threshold;\n },\n [threshold]\n );\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const container = e.currentTarget;\n const atBottom = checkIsAtBottom(container);\n setIsAtBottom(atBottom);\n setShouldAutoScroll(atBottom);\n onScroll?.(atBottom);\n },\n [checkIsAtBottom, onScroll]\n );\n\n const scrollToBottom = useCallback(\n (useSmooth?: boolean) => {\n const container = containerRef.current;\n if (!container) {return;}\n\n const shouldSmooth = useSmooth ?? smooth;\n container.scrollTo({\n top: container.scrollHeight,\n behavior: shouldSmooth ? 'smooth' : 'auto',\n });\n setIsAtBottom(true);\n setShouldAutoScroll(true);\n },\n [smooth]\n );\n\n const setAutoScroll = useCallback((enabled: boolean) => {\n setShouldAutoScroll(enabled);\n if (enabled) {\n // Scroll to bottom immediately when enabling\n const container = containerRef.current;\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'auto',\n });\n setIsAtBottom(true);\n }\n }\n }, []);\n\n // Auto-scroll when content changes (using MutationObserver)\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {return;}\n\n let rafId: number | null = null;\n const observer = new MutationObserver(() => {\n if (shouldAutoScroll) {\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'instant',\n });\n rafId = null;\n });\n }\n }\n });\n\n observer.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return () => {\n observer.disconnect();\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [shouldAutoScroll]);\n\n return {\n containerRef,\n isAtBottom,\n shouldAutoScroll,\n scrollToBottom,\n setAutoScroll,\n handleScroll,\n };\n}\n","/**\n * useMessageActions Hook\n * Provides copy, regenerate, and edit functionality for messages\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseMessageActionsOptions {\n /** Callback when copy succeeds */\n onCopy?: (content: string) => void\n /** Callback when copy fails */\n onCopyError?: (error: Error) => void\n /** Callback when regenerate is triggered */\n onRegenerate?: () => void | Promise<void>\n /** Callback when edit is triggered */\n onEdit?: (content: string) => void | Promise<void>\n /** Duration to show \"copied\" state in ms (default: 2000) */\n copiedDuration?: number\n}\n\nexport interface UseMessageActionsReturn {\n /** Whether content was recently copied */\n isCopied: boolean\n /** Whether regenerate is in progress */\n isRegenerating: boolean\n /** Whether edit is in progress */\n isEditing: boolean\n /** Copy content to clipboard */\n copy: (content: string) => Promise<void>\n /** Trigger regenerate action */\n regenerate: () => Promise<void>\n /** Trigger edit action */\n edit: (content: string) => Promise<void>\n /** Reset all states */\n reset: () => void\n}\n\n/**\n * Hook for managing message actions (copy, regenerate, edit)\n *\n * @example\n * ```tsx\n * const actions = useMessageActions({\n * onRegenerate: () => chatContext.regenerateMessage(messageId),\n * onEdit: (content) => chatContext.editMessage(messageId, content),\n * onCopy: () => toast.success('Copied!'),\n * })\n *\n * <button onClick={() => actions.copy(message.content)}>\n * {actions.isCopied ? 'Copied!' : 'Copy'}\n * </button>\n *\n * <button onClick={actions.regenerate} disabled={actions.isRegenerating}>\n * {actions.isRegenerating ? 'Regenerating...' : 'Regenerate'}\n * </button>\n * ```\n */\nexport function useMessageActions(options: UseMessageActionsOptions = {}): UseMessageActionsReturn {\n const { onCopy, onCopyError, onRegenerate, onEdit, copiedDuration = 2000 } = options;\n\n const [isCopied, setIsCopied] = useState(false);\n const [isRegenerating, setIsRegenerating] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n\n const copiedTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (copiedTimeoutRef.current) {\n clearTimeout(copiedTimeoutRef.current);\n copiedTimeoutRef.current = null;\n }\n };\n }, []);\n\n const copy = useCallback(\n async (content: string) => {\n try {\n await navigator.clipboard.writeText(content);\n setIsCopied(true);\n onCopy?.(content);\n\n // Clear existing timeout\n if (copiedTimeoutRef.current) {\n clearTimeout(copiedTimeoutRef.current);\n }\n\n // Reset copied state after duration\n copiedTimeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n copiedTimeoutRef.current = null;\n }, copiedDuration);\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Failed to copy');\n onCopyError?.(err);\n throw err;\n }\n },\n [onCopy, onCopyError, copiedDuration]\n );\n\n const regenerate = useCallback(async () => {\n if (!onRegenerate) {return;}\n if (isRegenerating) {return;}\n\n setIsRegenerating(true);\n try {\n await onRegenerate();\n } finally {\n setIsRegenerating(false);\n }\n }, [onRegenerate, isRegenerating]);\n\n const edit = useCallback(\n async (content: string) => {\n if (!onEdit) {return;}\n if (isEditing) {return;}\n\n setIsEditing(true);\n try {\n await onEdit(content);\n } finally {\n setIsEditing(false);\n }\n },\n [onEdit, isEditing]\n );\n\n const reset = useCallback(() => {\n setIsCopied(false);\n setIsRegenerating(false);\n setIsEditing(false);\n if (copiedTimeoutRef.current) {\n clearTimeout(copiedTimeoutRef.current);\n copiedTimeoutRef.current = null;\n }\n }, []);\n\n return {\n isCopied,\n isRegenerating,\n isEditing,\n copy,\n regenerate,\n edit,\n reset,\n };\n}\n","/**\n * useAttachments Hook\n * Manages file upload state, validation, and preview\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport type { Attachment } from '../types';\nimport { convertToBase64, createDataUrl, validateAttachmentFile } from '../utils/fileUtils';\n\nexport interface FileValidationError {\n file: File\n reason: 'size' | 'type' | 'count' | 'custom'\n message: string\n}\n\nexport interface UseAttachmentsOptions {\n /** Maximum number of files (default: 10) */\n maxFiles?: number\n /** Maximum file size in bytes (default: 20MB) */\n maxFileSize?: number\n /** Allowed MIME types (default: attachment allowlist) */\n allowedTypes?: string[]\n /** Custom validation function */\n validate?: (file: File) => string | null\n /** Callback when files are added */\n onAdd?: (files: Attachment[]) => void\n /** Callback when a file is removed */\n onRemove?: (file: Attachment) => void\n /** Callback when validation fails */\n onError?: (errors: FileValidationError[]) => void\n}\n\nexport interface UseAttachmentsReturn {\n /** Current attachments */\n files: Attachment[]\n /** Validation errors from last operation */\n errors: FileValidationError[]\n /** Whether files are being processed */\n isProcessing: boolean\n /** Whether max file limit is reached */\n isMaxReached: boolean\n /** Number of remaining slots */\n remainingSlots: number\n /** Add files (validates and processes) */\n add: (files: FileList | File[]) => Promise<void>\n /** Remove a specific file */\n remove: (fileOrId: Attachment | string) => void\n /** Clear all files */\n clear: () => void\n /** Clear errors */\n clearErrors: () => void\n /** Set files directly (for controlled mode) */\n setFiles: (files: Attachment[]) => void\n}\n\nconst DEFAULT_MAX_FILES = 10;\nconst DEFAULT_MAX_FILE_SIZE = 20 * 1024 * 1024; // 20MB\nconst DEFAULT_ALLOWED_TYPES: string[] = [];\n\n/**\n * Hook for managing file attachments\n *\n * @example\n * ```tsx\n * const attachments = useAttachments({\n * maxFiles: 5,\n * maxFileSize: 5 * 1024 * 1024, // 5MB\n * onError: (errors) => errors.forEach(e => toast.error(e.message)),\n * })\n *\n * <input\n * type=\"file\"\n * multiple\n * accept=\"image/*\"\n * onChange={(e) => attachments.add(e.target.files)}\n * />\n *\n * {attachments.files.map(file => (\n * <AttachmentPreview\n * key={file.id}\n * attachment={file}\n * onRemove={() => attachments.remove(file)}\n * />\n * ))}\n *\n * {attachments.errors.length > 0 && (\n * <ErrorList errors={attachments.errors} />\n * )}\n * ```\n */\nexport function useAttachments(options: UseAttachmentsOptions = {}): UseAttachmentsReturn {\n const {\n maxFiles = DEFAULT_MAX_FILES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n allowedTypes = DEFAULT_ALLOWED_TYPES,\n validate,\n onAdd,\n onRemove,\n onError,\n } = options;\n\n const [files, setFiles] = useState<Attachment[]>([]);\n const [errors, setErrors] = useState<FileValidationError[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const removedRef = useRef<Attachment | null>(null);\n\n const isMaxReached = useMemo(() => files.length >= maxFiles, [files.length, maxFiles]);\n const remainingSlots = useMemo(() => Math.max(0, maxFiles - files.length), [files.length, maxFiles]);\n\n const validateFile = useCallback(\n (file: File, currentCount: number): FileValidationError | null => {\n // Check count\n if (currentCount >= maxFiles) {\n return {\n file,\n reason: 'count',\n message: `Maximum ${maxFiles} files allowed`,\n };\n }\n\n if (allowedTypes.length > 0) {\n if (!allowedTypes.includes(file.type)) {\n return {\n file,\n reason: 'type',\n message: `File type \"${file.type || 'unknown'}\" not allowed`,\n };\n }\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(1);\n return {\n file,\n reason: 'size',\n message: `File \"${file.name}\" exceeds ${maxSizeMB}MB limit`,\n };\n }\n } else {\n try {\n validateAttachmentFile(file, maxFileSize);\n } catch (err) {\n const message = err instanceof Error ? err.message : `File \"${file.name}\" is not allowed`;\n const reason: FileValidationError['reason'] = message.includes('large') ? 'size' : 'type';\n return {\n file,\n reason,\n message,\n };\n }\n }\n\n // Custom validation\n if (validate) {\n const customError = validate(file);\n if (customError) {\n return {\n file,\n reason: 'custom',\n message: customError,\n };\n }\n }\n\n return null;\n },\n [maxFiles, maxFileSize, allowedTypes, validate]\n );\n\n const add = useCallback(\n async (newFiles: FileList | File[]) => {\n if (isProcessing) {\n const fileArray = Array.from(newFiles);\n if (fileArray.length > 0) {\n const processingErrors = fileArray.map((file) => ({\n file,\n reason: 'custom' as const,\n message: 'Please wait for the current files to finish processing.',\n }));\n setErrors(processingErrors);\n onError?.(processingErrors);\n }\n return;\n }\n\n setIsProcessing(true);\n const fileArray = Array.from(newFiles);\n const validationErrors: FileValidationError[] = [];\n const validFiles: Attachment[] = [];\n let currentCount = files.length;\n\n for (const file of fileArray) {\n const error = validateFile(file, currentCount);\n if (error) {\n validationErrors.push(error);\n continue;\n }\n\n // Create attachment object\n const attachment: Attachment = {\n clientKey: crypto.randomUUID(),\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n };\n\n try {\n const base64Data = await convertToBase64(file);\n attachment.base64Data = base64Data;\n if (file.type.startsWith('image/')) {\n attachment.preview = createDataUrl(base64Data, file.type);\n }\n } catch {\n // Continue without content if conversion fails.\n }\n\n validFiles.push(attachment);\n currentCount++;\n }\n\n if (validationErrors.length > 0) {\n setErrors(validationErrors);\n onError?.(validationErrors);\n }\n\n if (validFiles.length > 0) {\n setFiles((prev) => [...prev, ...validFiles]);\n onAdd?.(validFiles);\n }\n\n setIsProcessing(false);\n },\n [files.length, validateFile, onAdd, onError, isProcessing]\n );\n\n const remove = useCallback(\n (fileOrId: Attachment | string) => {\n const id = typeof fileOrId === 'string' ? fileOrId : fileOrId.id;\n setFiles((prev) => {\n const removed = prev.find((f) => f.id === id) ?? null;\n const next = prev.filter((f) => f.id !== id);\n removedRef.current = removed;\n return next;\n });\n\n const removed = removedRef.current;\n if (removed) {\n onRemove?.(removed);\n removedRef.current = null;\n }\n },\n [onRemove]\n );\n\n const clear = useCallback(() => {\n setFiles([]);\n setErrors([]);\n }, []);\n\n const clearErrors = useCallback(() => {\n setErrors([]);\n }, []);\n\n const setFilesHandler = useCallback((newFiles: Attachment[]) => {\n setFiles(newFiles);\n }, []);\n\n return {\n files,\n errors,\n isProcessing,\n isMaxReached,\n remainingSlots,\n add,\n remove,\n clear,\n clearErrors,\n setFiles: setFilesHandler,\n };\n}\n","/**\n * useMarkdownCopy Hook\n * Manages copy-to-clipboard state for code blocks in markdown\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseMarkdownCopyOptions {\n /** Duration to show \"copied\" state in ms (default: 2000) */\n copiedDuration?: number\n /** Callback when copy succeeds */\n onCopy?: (content: string, language?: string) => void\n /** Callback when copy fails */\n onError?: (error: Error) => void\n}\n\nexport interface UseMarkdownCopyReturn {\n /** Map of copied states by block ID */\n copiedStates: Map<string, boolean>\n /** Check if a specific block is in copied state */\n isCopied: (blockId: string) => boolean\n /** Copy content with block ID tracking */\n copy: (blockId: string, content: string, language?: string) => Promise<void>\n /** Reset copied state for a specific block */\n reset: (blockId: string) => void\n /** Reset all copied states */\n resetAll: () => void\n}\n\n/**\n * Hook for managing copy states for multiple code blocks\n *\n * @example\n * ```tsx\n * const markdownCopy = useMarkdownCopy({\n * onCopy: (content, lang) => console.log(`Copied ${lang} code`),\n * })\n *\n * function CodeBlock({ id, code, language }) {\n * return (\n * <div>\n * <pre>{code}</pre>\n * <button onClick={() => markdownCopy.copy(id, code, language)}>\n * {markdownCopy.isCopied(id) ? 'Copied!' : 'Copy'}\n * </button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useMarkdownCopy(options: UseMarkdownCopyOptions = {}): UseMarkdownCopyReturn {\n const { copiedDuration = 2000, onCopy, onError } = options;\n\n const [copiedStates, setCopiedStates] = useState<Map<string, boolean>>(new Map());\n const timeoutsRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(() => {\n const timeouts = timeoutsRef.current;\n return () => {\n timeouts.forEach((timeout) => clearTimeout(timeout));\n timeouts.clear();\n };\n }, []);\n\n const isCopied = useCallback(\n (blockId: string): boolean => {\n return copiedStates.get(blockId) ?? false;\n },\n [copiedStates]\n );\n\n const copy = useCallback(\n async (blockId: string, content: string, language?: string) => {\n try {\n await navigator.clipboard.writeText(content);\n\n // Set copied state\n setCopiedStates((prev) => {\n const next = new Map(prev);\n next.set(blockId, true);\n return next;\n });\n\n onCopy?.(content, language);\n\n // Clear existing timeout for this block\n const existingTimeout = timeoutsRef.current.get(blockId);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n }\n\n // Set timeout to reset copied state\n const timeout = setTimeout(() => {\n setCopiedStates((prev) => {\n const next = new Map(prev);\n next.set(blockId, false);\n return next;\n });\n timeoutsRef.current.delete(blockId);\n }, copiedDuration);\n\n timeoutsRef.current.set(blockId, timeout);\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Failed to copy');\n onError?.(err);\n throw err;\n }\n },\n [copiedDuration, onCopy, onError]\n );\n\n const reset = useCallback((blockId: string) => {\n setCopiedStates((prev) => {\n const next = new Map(prev);\n next.set(blockId, false);\n return next;\n });\n\n const timeout = timeoutsRef.current.get(blockId);\n if (timeout) {\n clearTimeout(timeout);\n timeoutsRef.current.delete(blockId);\n }\n }, []);\n\n const resetAll = useCallback(() => {\n setCopiedStates(new Map());\n\n // Clear all timeouts\n timeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n timeoutsRef.current.clear();\n }, []);\n\n return {\n copiedStates,\n isCopied,\n copy,\n reset,\n resetAll,\n };\n}\n","/**\n * useScrollToBottom Hook\n * Manages scroll-to-bottom functionality with smart auto-scroll\n * Only scrolls if user is near the bottom (within threshold)\n */\n\nimport { useRef, useCallback, useState, useEffect } from 'react';\n\nconst SCROLL_THRESHOLD = 100; // pixels from bottom to consider \"near bottom\"\n\nexport interface UseScrollToBottomReturn {\n /**\n * Ref to attach to the messages container\n */\n containerRef: React.RefObject<HTMLDivElement>\n\n /**\n * Whether to show the scroll-to-bottom button\n */\n showScrollButton: boolean\n\n /**\n * Function to scroll to bottom\n */\n scrollToBottom: () => void\n}\n\n/**\n * Hook for managing scroll-to-bottom behavior\n * Automatically scrolls if user is near the bottom\n * Shows button only when scrolled up significantly\n */\nexport function useScrollToBottom(items: unknown[]): UseScrollToBottomReturn {\n const containerRef = useRef<HTMLDivElement>(null);\n const [showScrollButton, setShowScrollButton] = useState(false);\n const isNearBottomRef = useRef(true);\n\n /**\n * Scroll to bottom smoothly\n */\n const scrollToBottom = useCallback(() => {\n if (containerRef.current) {\n containerRef.current.scroll({\n top: containerRef.current.scrollHeight,\n behavior: 'smooth',\n });\n isNearBottomRef.current = true;\n setShowScrollButton(false);\n }\n }, []);\n\n /**\n * Handle scroll events to detect when user is near bottom\n */\n const handleScroll = useCallback(() => {\n if (!containerRef.current) {return;}\n\n const element = containerRef.current;\n const { scrollTop, scrollHeight, clientHeight } = element;\n\n // Calculate how far from bottom\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n const isNearBottom = distanceFromBottom < SCROLL_THRESHOLD;\n\n isNearBottomRef.current = isNearBottom;\n setShowScrollButton(!isNearBottom && scrollHeight > clientHeight);\n }, []);\n\n /**\n * Auto-scroll when new items arrive (if near bottom)\n */\n useEffect(() => {\n if (isNearBottomRef.current) {\n // Use requestAnimationFrame for smooth scrolling\n const timer = setTimeout(() => {\n scrollToBottom();\n }, 0);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [items, scrollToBottom]);\n\n /**\n * Add scroll listener to container\n */\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {return;}\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n\n // Initial check - defer to avoid synchronous setState in effect\n const timerId = setTimeout(handleScroll, 0);\n\n return () => {\n container.removeEventListener('scroll', handleScroll);\n clearTimeout(timerId);\n };\n }, [handleScroll]);\n\n return {\n containerRef,\n showScrollButton,\n scrollToBottom,\n };\n}\n","/**\n * Builds HttpDataSourceConfig from window.__APPLET_CONTEXT__.\n * For use with createHttpDataSource when the app is embedded via the applet framework.\n *\n * Expects the host to inject context with:\n * - config.rpcUIEndpoint, config.streamEndpoint\n * - session.csrfToken (or window.__CSRF_TOKEN__)\n */\n\nimport { useMemo } from 'react';\nimport type { HttpDataSourceConfig } from '../data/HttpDataSource';\nimport type { IotaContext } from '../types/iota';\n\n/**\n * Returns HttpDataSourceConfig derived from window.__APPLET_CONTEXT__.\n * Use with createHttpDataSource() for RPC and SSE endpoints.\n *\n * @throws Error if window.__APPLET_CONTEXT__ is not available\n */\nexport function useHttpDataSourceConfigFromApplet(\n options?: { rpcTimeoutMs?: number; streamConnectTimeoutMs?: number }\n): HttpDataSourceConfig {\n return useMemo(() => {\n const ctx = typeof window !== 'undefined' ? (window as Window & { __APPLET_CONTEXT__?: IotaContext }).__APPLET_CONTEXT__ : undefined;\n if (!ctx) {\n throw new Error(\n 'Applet context not found. Ensure window.__APPLET_CONTEXT__ is injected by the backend.'\n );\n }\n\n const rpcEndpoint = ctx.config?.rpcUIEndpoint ?? '/rpc';\n const streamEndpoint = ctx.config?.streamEndpoint ?? '/stream';\n const csrfToken =\n ctx.session?.csrfToken ??\n (typeof window !== 'undefined' ? (window as Window & { __CSRF_TOKEN__?: string }).__CSRF_TOKEN__ : undefined) ??\n '';\n\n const isDev = typeof (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV === 'boolean'\n && (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV;\n if (!csrfToken && isDev) {\n console.warn(\n '[useHttpDataSourceConfigFromApplet] CSRF token is empty — requests may be rejected by the server.'\n );\n }\n\n return {\n baseUrl: '',\n rpcEndpoint,\n streamEndpoint,\n csrfToken,\n rpcTimeoutMs: options?.rpcTimeoutMs ?? 120_000,\n streamConnectTimeoutMs: options?.streamConnectTimeoutMs,\n };\n }, [options?.rpcTimeoutMs, options?.streamConnectTimeoutMs]);\n}\n","/**\n * Router adapter for BiChat sidebar and archived list.\n * Consumes a navigate function and location (pathname) and returns\n * activeSessionId plus callbacks for use with SDK Sidebar and ArchivedChatList.\n *\n * Router-agnostic: pass useNavigate()/useLocation() from react-router-dom\n * or equivalent from your router.\n */\n\nimport { useMemo, useCallback } from 'react';\n\nexport interface UseBichatRouterParams {\n /** Navigate to a path (e.g. from useNavigate()) */\n navigate: (path: string) => void;\n /** Current pathname (e.g. location.pathname from useLocation()) */\n pathname: string;\n /** Optional: close mobile sidebar after navigation (e.g. closeMobile from useSidebarState) */\n onNavigate?: () => void;\n}\n\nexport interface UseBichatRouterReturn {\n /** Session ID extracted from pathname (e.g. /session/:id -> id) */\n activeSessionId: string | undefined;\n /** Navigate to session or home when sessionId is empty */\n onSessionSelect: (sessionId: string) => void;\n /** Navigate to new chat (home) */\n onNewChat: () => void;\n /** Navigate to archived list */\n onArchivedView: () => void;\n /** Navigate back (e.g. to home) */\n onBack: () => void;\n /** Navigate to all-chats view */\n onAllChatsView: () => void;\n /** Current sidebar tab derived from URL */\n sidebarTab: 'my-chats' | 'all-chats';\n /** Handler to change sidebar tab (navigates to appropriate URL) */\n onSidebarTabChange: (tab: 'my-chats' | 'all-chats') => void;\n}\n\nconst SESSION_PATH_REGEX = /\\/session\\/([^/]+)/;\n\n/**\n * Derives BiChat navigation callbacks and activeSessionId from router state.\n * Use with SDK Sidebar (onSessionSelect, onNewChat, onArchivedView, activeSessionId)\n * and ArchivedChatList (onBack, onSessionSelect).\n */\nexport function useBichatRouter({\n navigate,\n pathname,\n onNavigate,\n}: UseBichatRouterParams): UseBichatRouterReturn {\n const isAllChats = pathname.startsWith('/all-chats');\n\n const activeSessionId = useMemo(\n () => pathname.match(SESSION_PATH_REGEX)?.[1],\n [pathname]\n );\n\n const sidebarTab = useMemo<'my-chats' | 'all-chats'>(\n () => (isAllChats ? 'all-chats' : 'my-chats'),\n [isAllChats]\n );\n\n const maybeClose = useCallback(() => {\n onNavigate?.();\n }, [onNavigate]);\n\n const onSessionSelect = useCallback(\n (sessionId: string) => {\n if (sessionId) {\n const prefix = isAllChats ? '/all-chats' : '';\n navigate(`${prefix}/session/${sessionId}`);\n } else {\n navigate(isAllChats ? '/all-chats' : '/');\n }\n maybeClose();\n },\n [navigate, maybeClose, isAllChats]\n );\n\n const onNewChat = useCallback(() => {\n navigate(isAllChats ? '/all-chats' : '/');\n maybeClose();\n }, [navigate, maybeClose, isAllChats]);\n\n const onArchivedView = useCallback(() => {\n navigate('/archived');\n maybeClose();\n }, [navigate, maybeClose]);\n\n const onAllChatsView = useCallback(() => {\n navigate('/all-chats');\n maybeClose();\n }, [navigate, maybeClose]);\n\n const onBack = useCallback(() => {\n navigate('/');\n maybeClose();\n }, [navigate, maybeClose]);\n\n const onSidebarTabChange = useCallback(\n (tab: 'my-chats' | 'all-chats') => {\n if (tab === 'all-chats') {\n navigate('/all-chats');\n } else {\n navigate('/');\n }\n maybeClose();\n },\n [navigate, maybeClose]\n );\n\n return {\n activeSessionId,\n onSessionSelect,\n onNewChat,\n onArchivedView,\n onBack,\n onAllChatsView,\n sidebarTab,\n onSidebarTabChange,\n };\n}\n","/**\n * Configuration context provider for BiChat.\n *\n * @deprecated Use `IotaContextProvider` with its new optional `context` prop\n * instead. `ConfigProvider` and `BiChatConfig` are kept for backwards\n * compatibility but will be removed in a future major version.\n */\n\nimport { createContext, useContext, ReactNode } from 'react';\n\n/** @deprecated Use `IotaContextProvider` with its `context` prop instead. */\nexport interface BiChatConfig {\n user: {\n id: string\n email: string\n firstName: string\n lastName: string\n permissions: string[]\n }\n tenant: {\n id: string\n name: string\n }\n locale: {\n language: string\n translations: Record<string, string>\n }\n endpoints: {\n rpc: string\n stream: string\n }\n csrfToken?: string\n}\n\nconst ConfigContext = createContext<BiChatConfig | null>(null);\n\ninterface ConfigProviderProps {\n config?: BiChatConfig\n useGlobalConfig?: boolean\n children: ReactNode\n}\n\n/**\n * @deprecated Use `IotaContextProvider` with its `context` prop instead.\n *\n * ConfigProvider component — provides configuration to the BiChat library.\n *\n * @param config - Configuration object (preferred method)\n * @param useGlobalConfig - If true, falls back to window.__APPLET_CONTEXT__ when config is not provided\n * @param children - React children\n */\nexport function ConfigProvider({ config, useGlobalConfig = false, children }: ConfigProviderProps) {\n let resolvedConfig: BiChatConfig | null = null;\n\n if (config) {\n resolvedConfig = config;\n } else if (useGlobalConfig && typeof window !== 'undefined') {\n interface GlobalAppletContext {\n user?: { id?: string; email?: string; firstName?: string; lastName?: string; permissions?: string[] }\n tenant?: { id?: string; name?: string }\n locale?: { language?: string; translations?: Record<string, string> }\n config?: { rpcUIEndpoint?: string; streamEndpoint?: string }\n }\n const w = window as unknown as Record<string, unknown>;\n const globalContext = w.__APPLET_CONTEXT__ as GlobalAppletContext | undefined;\n const globalCSRF = w.__CSRF_TOKEN__ as string | undefined;\n\n if (globalContext) {\n resolvedConfig = {\n user: {\n id: String(globalContext.user?.id || ''),\n email: globalContext.user?.email || '',\n firstName: globalContext.user?.firstName || '',\n lastName: globalContext.user?.lastName || '',\n permissions: globalContext.user?.permissions || [],\n },\n tenant: {\n id: globalContext.tenant?.id || '',\n name: globalContext.tenant?.name || '',\n },\n locale: {\n language: globalContext.locale?.language || 'en',\n translations: globalContext.locale?.translations || {},\n },\n endpoints: {\n rpc: globalContext.config?.rpcUIEndpoint || '/rpc',\n stream: globalContext.config?.streamEndpoint || '/stream',\n },\n csrfToken: globalCSRF,\n };\n }\n }\n\n return (\n <ConfigContext.Provider value={resolvedConfig}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\n/**\n * Hook to access BiChat configuration\n * Returns null if no configuration is available\n */\nexport function useConfig(): BiChatConfig | null {\n return useContext(ConfigContext);\n}\n\n/**\n * Hook to access BiChat configuration (required)\n * Throws an error if configuration is not available\n */\nexport function useRequiredConfig(): BiChatConfig {\n const config = useContext(ConfigContext);\n if (!config) {\n throw new Error(\n 'BiChat configuration not found. ' +\n 'Wrap your app with <ConfigProvider config={...}> or use useGlobalConfig={true}.'\n );\n }\n return config;\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(config: BiChatConfig | null, permission: string): boolean {\n if (!config) {\n return false;\n }\n return config.user.permissions.includes(permission);\n}\n","/**\n * Predefined theme configurations\n */\n\nimport { Theme } from './types';\n\nexport const lightTheme: Theme = {\n name: 'light',\n colors: {\n background: '#f9fafb', // --bichat-color-bg (gray-50)\n surface: '#ffffff', // --bichat-color-surface\n primary: '#2563eb', // --bichat-color-accent (primary-600)\n secondary: '#6b7280', // gray-500\n text: '#111827', // --bichat-color-text (gray-900)\n textMuted: '#6b7280', // --bichat-color-text-muted (gray-500)\n border: '#e5e7eb', // --bichat-color-border (gray-200)\n error: '#ef4444', // --bichat-color-error-500\n success: '#22c55e', // --bichat-color-success-500\n warning: '#f59e0b', // --bichat-color-warning-500\n userBubble: '#2563eb', // --bichat-color-user-bubble-bg (primary-600)\n assistantBubble: '#ffffff', // --bichat-color-assistant-bubble-bg (surface)\n userText: '#ffffff', // --bichat-color-user-bubble-text\n assistantText: '#111827', // --bichat-color-assistant-bubble-text (gray-900)\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n};\n\nexport const darkTheme: Theme = {\n name: 'dark',\n colors: {\n background: '#111827', // --bichat-color-bg dark (gray-900)\n surface: '#1f2937', // --bichat-color-surface dark (gray-800)\n primary: '#60a5fa', // primary-400 (lighter for dark mode contrast)\n secondary: '#9ca3af', // gray-400\n text: '#f3f4f6', // --bichat-color-text dark (gray-100)\n textMuted: '#9ca3af', // --bichat-color-text-muted dark (gray-400)\n border: '#374151', // --bichat-color-border dark (gray-700)\n error: '#f87171', // red-400\n success: '#34d399', // emerald-400\n warning: '#fbbf24', // amber-400\n userBubble: '#1d4ed8', // --bichat-color-user-bubble-bg dark (primary-700)\n assistantBubble: '#1f2937', // --bichat-color-assistant-bubble-bg dark (gray-800)\n userText: '#f3f4f6', // gray-100\n assistantText: '#f3f4f6', // gray-100\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n};\n","/**\n * Theme provider component and hook\n * Manages theme state and applies CSS variables to document root\n */\n\nimport { createContext, useContext, useEffect, useMemo, ReactNode } from 'react';\nimport { Theme } from './types';\nimport { lightTheme, darkTheme } from './themes';\n\ninterface ThemeContextValue {\n theme: Theme\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n theme?: Theme | 'light' | 'dark' | 'system'\n children: ReactNode\n}\n\n/**\n * Detect system theme preference\n */\nfunction getSystemTheme(): Theme {\n if (typeof window === 'undefined') {\n return lightTheme;\n }\n\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n return prefersDark ? darkTheme : lightTheme;\n}\n\n/**\n * Resolve theme prop to Theme object\n */\nfunction resolveTheme(themeProp: Theme | 'light' | 'dark' | 'system'): Theme {\n if (typeof themeProp === 'object') {\n return themeProp;\n }\n\n switch (themeProp) {\n case 'light':\n return lightTheme;\n case 'dark':\n return darkTheme;\n case 'system':\n return getSystemTheme();\n default:\n return lightTheme;\n }\n}\n\n/**\n * Apply theme CSS variables to document root\n */\nfunction applyThemeVariables(theme: Theme): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const root = document.documentElement;\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-${key}`, value);\n });\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-spacing-${key}`, value);\n });\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-radius-${key}`, value);\n });\n}\n\n/**\n * Theme provider component\n * Wraps the application and provides theme context\n */\nexport function ThemeProvider({ theme = 'system', children }: ThemeProviderProps) {\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme]);\n\n useEffect(() => {\n applyThemeVariables(resolvedTheme);\n }, [resolvedTheme]);\n\n // Listen for system theme changes when using 'system'\n useEffect(() => {\n if (theme !== 'system') {\n return;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = () => {\n const newTheme = getSystemTheme();\n applyThemeVariables(newTheme);\n };\n\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, [theme]);\n\n const value: ThemeContextValue = {\n theme: resolvedTheme,\n };\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Hook to access current theme\n */\nexport function useTheme(): Theme {\n const context = useContext(ThemeContext);\n\n if (!context) {\n throw new Error('useTheme must be used within ThemeProvider');\n }\n\n return context.theme;\n}\n","/**\n * CSRF token management for API requests\n */\n\n/**\n * Get CSRF token from window object\n * @returns CSRF token string\n */\nexport function getCSRFToken(): string {\n const token = window.__CSRF_TOKEN__;\n if (!token) {\n console.warn('CSRF token not found in window object');\n return '';\n }\n return token;\n}\n\n/**\n * Add CSRF token to request headers\n * @param headers - Headers object to modify\n * @returns Modified headers object\n */\nexport function addCSRFHeader(headers: Headers): Headers {\n const token = getCSRFToken();\n if (token) {\n headers.set('X-CSRF-Token', token);\n }\n return headers;\n}\n\n/**\n * Create headers with CSRF token\n * @param init - Optional initial headers\n * @returns Headers object with CSRF token\n */\nexport function createHeadersWithCSRF(init?: HeadersInit): Headers {\n const headers = new Headers(init);\n return addCSRFHeader(headers);\n}\n","/**\n * Type mapping and sanitization functions for converting RPC payloads\n * to domain types used by the BiChat UI.\n *\n * All functions are pure and side-effect-free (except console.warn for\n * malformed payloads).\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource modules.\n */\n\nimport type { Session as RPCSession } from \"./rpc.generated\";\nimport type { PendingQuestion as RPCPendingQuestion } from \"./rpc.generated\";\nimport type {\n Session,\n SessionUser,\n SessionAccess,\n ConversationTurn,\n Artifact as DownloadArtifact,\n SessionArtifact,\n PendingQuestion,\n Question,\n Attachment,\n AssistantTurn,\n RenderTableData,\n} from \"../types\";\nimport { MessageRole } from \"../types\";\nimport {\n parseChartDataFromSpec,\n parseChartDataFromJsonString,\n isRecord,\n} from \"../utils/chartSpec\";\nimport {\n parseRenderTableDataFromJsonString,\n parseRenderTableDataFromMetadata,\n} from \"../utils/tableSpec\";\n\n// ---------------------------------------------------------------------------\n// Internal helper types\n// ---------------------------------------------------------------------------\n\nexport interface RPCArtifact {\n id: string;\n sessionId: string;\n messageId?: string;\n uploadId?: number | null;\n type: string;\n name: string;\n description?: string;\n mimeType?: string;\n url?: string;\n sizeBytes: number;\n metadata?: Record<string, unknown>;\n createdAt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Logging helpers\n// ---------------------------------------------------------------------------\n\nexport function warnMalformedSessionPayload(\n message: string,\n details?: Record<string, unknown>,\n): void {\n console.warn(`[BiChat] ${message}`, details || {});\n}\n\n// ---------------------------------------------------------------------------\n// Primitive readers\n// ---------------------------------------------------------------------------\n\nfunction readString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction readNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readFiniteNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction readOptionalFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction extractFilenameFromURL(value: unknown): string | null {\n const raw = readNonEmptyString(value);\n if (!raw) {\n return null;\n }\n\n try {\n const parsed = new URL(raw);\n const path = parsed.pathname;\n if (!path) {\n return null;\n }\n const segments = path.split(\"/\").filter(Boolean);\n if (segments.length === 0) {\n return null;\n }\n const candidate = decodeURIComponent(segments[segments.length - 1]);\n return readNonEmptyString(candidate);\n } catch {\n // Relative path fallback: extract last segment without URL parsing\n try {\n const segments = raw.split(\"/\").filter(Boolean);\n if (segments.length === 0) {\n return null;\n }\n const candidate = decodeURIComponent(segments[segments.length - 1]);\n return readNonEmptyString(candidate);\n } catch {\n return null;\n }\n }\n}\n\nfunction resolveArtifactName(artifact: RPCArtifact): string {\n const explicit = readNonEmptyString(artifact.name);\n if (explicit) {\n return explicit;\n }\n\n const fromURL = extractFilenameFromURL(artifact.url);\n if (fromURL) {\n return fromURL;\n }\n\n const type = readNonEmptyString(artifact.type) || \"artifact\";\n const label = type.replace(/_/g, \" \");\n if (label === \"artifact\" || label.endsWith(\" artifact\")) {\n return label;\n }\n return `${label} artifact`;\n}\n\n// ---------------------------------------------------------------------------\n// Session mappers\n// ---------------------------------------------------------------------------\n\nfunction mapSessionUser(rawUser: unknown): SessionUser | undefined {\n if (!isRecord(rawUser)) {\n return undefined;\n }\n\n const rawId = rawUser.id;\n const id =\n readNonEmptyString(rawId) ??\n (typeof rawId === \"number\" && Number.isFinite(rawId)\n ? String(rawId)\n : null);\n if (!id) {\n return undefined;\n }\n\n const firstName = readString(rawUser.firstName);\n const lastName = readString(rawUser.lastName);\n const initials =\n readNonEmptyString(rawUser.initials) ||\n `${firstName.charAt(0)}${lastName.charAt(0)}`.trim().toUpperCase() ||\n \"U\";\n\n return {\n id,\n firstName,\n lastName,\n initials,\n };\n}\n\nfunction mapSessionAccess(rawAccess: unknown): SessionAccess | undefined {\n if (!isRecord(rawAccess)) {\n return undefined;\n }\n const role = readString(rawAccess.role).toLowerCase();\n const source = readString(rawAccess.source).toLowerCase();\n\n const normalizedRole: SessionAccess[\"role\"] =\n role === \"owner\" ||\n role === \"editor\" ||\n role === \"viewer\" ||\n role === \"read_all\"\n ? role\n : \"none\";\n const normalizedSource: SessionAccess[\"source\"] =\n source === \"owner\" || source === \"member\" || source === \"permission\"\n ? source\n : \"none\";\n const canRead = rawAccess.canRead === true || rawAccess.canRead === \"true\";\n const canWrite = rawAccess.canWrite === true || rawAccess.canWrite === \"true\";\n const canManageMembers =\n rawAccess.canManageMembers === true ||\n rawAccess.canManageMembers === \"true\";\n\n if (\n normalizedRole === \"none\" &&\n normalizedSource === \"none\" &&\n !canRead &&\n !canWrite &&\n !canManageMembers\n ) {\n return undefined;\n }\n\n return {\n role: normalizedRole,\n source: normalizedSource,\n canRead,\n canWrite,\n canManageMembers,\n };\n}\n\nexport function toSession(session: RPCSession): Session {\n return {\n id: readString(session.id),\n title: readString(session.title),\n status: session.status === \"archived\" ? \"archived\" : \"active\",\n pinned: Boolean(session.pinned),\n createdAt: readString(session.createdAt),\n updatedAt: readString(session.updatedAt),\n owner: mapSessionUser(session.owner),\n isGroup: Boolean(session.isGroup),\n memberCount:\n typeof session.memberCount === \"number\" ? session.memberCount : undefined,\n access: mapSessionAccess(session.access),\n };\n}\n\nexport function toSessionArtifact(artifact: RPCArtifact): SessionArtifact {\n const rawCreatedAt = readNonEmptyString(artifact.createdAt);\n if (!rawCreatedAt) {\n warnMalformedSessionPayload(\n \"Artifact missing createdAt; defaulting to epoch\",\n { id: artifact.id },\n );\n }\n const createdAt = rawCreatedAt ?? \"1970-01-01T00:00:00.000Z\";\n\n return {\n id: readString(artifact.id),\n sessionId: readString(artifact.sessionId),\n messageId: readNonEmptyString(artifact.messageId) || undefined,\n uploadId: readOptionalFiniteNumber(artifact.uploadId),\n type: readNonEmptyString(artifact.type) || \"other\",\n name: resolveArtifactName(artifact),\n description: readNonEmptyString(artifact.description) || undefined,\n mimeType: readNonEmptyString(artifact.mimeType) || undefined,\n url: readNonEmptyString(artifact.url) || undefined,\n sizeBytes: Math.max(0, readFiniteNumber(artifact.sizeBytes)),\n metadata: isRecord(artifact.metadata) ? artifact.metadata : undefined,\n createdAt,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Normalizers\n// ---------------------------------------------------------------------------\n\nfunction normalizeQuestionType(\n rawType: unknown,\n): \"SINGLE_CHOICE\" | \"MULTIPLE_CHOICE\" {\n const normalized = readString(rawType)\n .trim()\n .toUpperCase()\n .replace(/[\\s-]+/g, \"_\");\n return normalized === \"MULTIPLE_CHOICE\" ? \"MULTIPLE_CHOICE\" : \"SINGLE_CHOICE\";\n}\n\nfunction normalizePendingQuestionStatus(\n rawStatus: unknown,\n): PendingQuestion[\"status\"] {\n const normalized = readString(rawStatus).trim().toUpperCase();\n switch (normalized) {\n case \"ANSWER_SUBMITTED\":\n case \"REJECT_SUBMITTED\":\n case \"ANSWER_RESUME_FAILED\":\n case \"REJECT_RESUME_FAILED\":\n case \"ANSWERED\":\n case \"REJECTED\":\n case \"CANCELLED\":\n return normalized;\n default:\n return \"PENDING\";\n }\n}\n\nfunction normalizeMessageRole(rawRole: unknown): MessageRole {\n const normalized = readString(rawRole).trim().toLowerCase();\n if (normalized === MessageRole.User) {\n return MessageRole.User;\n }\n if (normalized === MessageRole.System) {\n return MessageRole.System;\n }\n if (normalized === MessageRole.Tool) {\n return MessageRole.Tool;\n }\n return MessageRole.Assistant;\n}\n\n// ---------------------------------------------------------------------------\n// Attachment sanitizers\n// ---------------------------------------------------------------------------\n\nfunction sanitizeAttachment(\n rawAttachment: unknown,\n turnId: string,\n index: number,\n): Attachment | null {\n if (!isRecord(rawAttachment)) {\n warnMalformedSessionPayload(\"Dropped malformed attachment entry\", {\n turnId,\n index,\n });\n return null;\n }\n\n const filename = readString(rawAttachment.filename, \"attachment\");\n const mimeType = readString(\n rawAttachment.mimeType,\n \"application/octet-stream\",\n );\n const id = readNonEmptyString(rawAttachment.id) || undefined;\n const clientKey =\n readNonEmptyString(rawAttachment.clientKey) ||\n id ||\n `${turnId}-attachment-${index}`;\n\n return {\n id,\n clientKey,\n filename,\n mimeType,\n sizeBytes: readFiniteNumber(rawAttachment.sizeBytes),\n uploadId: readOptionalFiniteNumber(rawAttachment.uploadId),\n base64Data: readNonEmptyString(rawAttachment.base64Data) || undefined,\n url: readNonEmptyString(rawAttachment.url) || undefined,\n preview: readNonEmptyString(rawAttachment.preview) || undefined,\n };\n}\n\nfunction sanitizeUserAttachments(\n rawAttachments: unknown,\n turnId: string,\n): Attachment[] {\n if (!Array.isArray(rawAttachments)) {\n return [];\n }\n const result: Attachment[] = [];\n for (let i = 0; i < rawAttachments.length; i++) {\n const sanitized = sanitizeAttachment(rawAttachments[i], turnId, i);\n if (sanitized) {\n result.push(sanitized);\n }\n }\n return result;\n}\n\nfunction sanitizeAssistantArtifacts(\n rawArtifacts: unknown,\n turnId: string,\n): DownloadArtifact[] {\n if (!Array.isArray(rawArtifacts)) {\n return [];\n }\n const artifacts: DownloadArtifact[] = [];\n for (let i = 0; i < rawArtifacts.length; i++) {\n const raw = rawArtifacts[i];\n if (!isRecord(raw)) {\n warnMalformedSessionPayload(\"Dropped malformed assistant artifact\", {\n turnId,\n index: i,\n });\n continue;\n }\n const type = readString(raw.type).toLowerCase();\n if (type !== \"excel\" && type !== \"pdf\") {\n continue;\n }\n const url = readNonEmptyString(raw.url);\n if (!url) {\n warnMalformedSessionPayload(\"Dropped assistant artifact without url\", {\n turnId,\n index: i,\n });\n continue;\n }\n artifacts.push({\n type,\n filename: readString(raw.filename, \"download\"),\n url,\n sizeReadable: readNonEmptyString(raw.sizeReadable) || undefined,\n rowCount:\n typeof raw.rowCount === \"number\" && Number.isFinite(raw.rowCount)\n ? raw.rowCount\n : undefined,\n description: readNonEmptyString(raw.description) || undefined,\n });\n }\n return artifacts;\n}\n\n// ---------------------------------------------------------------------------\n// Assistant turn sanitizer\n// ---------------------------------------------------------------------------\n\nfunction sanitizeAssistantTurn(\n rawAssistantTurn: unknown,\n fallbackCreatedAt: string,\n turnId: string,\n): AssistantTurn | undefined {\n if (rawAssistantTurn == null) {\n return undefined;\n }\n if (!isRecord(rawAssistantTurn)) {\n warnMalformedSessionPayload(\"Dropped malformed assistant turn payload\", {\n turnId,\n });\n return undefined;\n }\n\n const assistantID = readNonEmptyString(rawAssistantTurn.id);\n if (!assistantID) {\n warnMalformedSessionPayload(\"Dropped assistant turn without id\", {\n turnId,\n });\n return undefined;\n }\n\n const citations = Array.isArray(rawAssistantTurn.citations)\n ? rawAssistantTurn.citations\n .filter((item) => isRecord(item))\n .map((item, index) => ({\n id: readString(item.id, `${assistantID}-citation-${index}`),\n type: readString(item.type),\n title: readString(item.title),\n url: readString(item.url),\n startIndex: readFiniteNumber(item.startIndex),\n endIndex: readFiniteNumber(item.endIndex),\n excerpt: readNonEmptyString(item.excerpt) || undefined,\n }))\n : [];\n\n const toolCalls = Array.isArray(rawAssistantTurn.toolCalls)\n ? rawAssistantTurn.toolCalls\n .filter((item) => isRecord(item))\n .map((item, index) => ({\n id: readString(item.id, `${assistantID}-tool-${index}`),\n name: readString(item.name),\n arguments: readString(item.arguments),\n result: readNonEmptyString(item.result) || undefined,\n error: readNonEmptyString(item.error) || undefined,\n durationMs: readFiniteNumber(item.durationMs),\n }))\n : [];\n\n const codeOutputs = Array.isArray(rawAssistantTurn.codeOutputs)\n ? rawAssistantTurn.codeOutputs\n .filter((item) => isRecord(item))\n .map((item) => ({\n type: ((): \"image\" | \"text\" | \"error\" => {\n const normalizedType = readString(item.type, \"text\").toLowerCase();\n if (normalizedType === \"image\" || normalizedType === \"error\") {\n return normalizedType;\n }\n return \"text\";\n })(),\n content: readString(item.content),\n filename: readNonEmptyString(item.filename) || undefined,\n mimeType: readNonEmptyString(item.mimeType) || undefined,\n sizeBytes: readOptionalFiniteNumber(item.sizeBytes),\n }))\n : [];\n\n const debugTrace = isRecord(rawAssistantTurn.debug)\n ? {\n schemaVersion:\n readNonEmptyString(rawAssistantTurn.debug.schemaVersion) || undefined,\n startedAt:\n readNonEmptyString(rawAssistantTurn.debug.startedAt) || undefined,\n completedAt:\n readNonEmptyString(rawAssistantTurn.debug.completedAt) || undefined,\n generationMs: readOptionalFiniteNumber(\n rawAssistantTurn.debug.generationMs,\n ),\n traceId:\n readNonEmptyString(rawAssistantTurn.debug.traceId) || undefined,\n traceUrl:\n readNonEmptyString(rawAssistantTurn.debug.traceUrl) || undefined,\n sessionId:\n readNonEmptyString(rawAssistantTurn.debug.sessionId) || undefined,\n thinking:\n readNonEmptyString(rawAssistantTurn.debug.thinking) || undefined,\n observationReason:\n readNonEmptyString(rawAssistantTurn.debug.observationReason) ||\n undefined,\n usage: isRecord(rawAssistantTurn.debug.usage)\n ? {\n promptTokens: readFiniteNumber(\n rawAssistantTurn.debug.usage.promptTokens,\n ),\n completionTokens: readFiniteNumber(\n rawAssistantTurn.debug.usage.completionTokens,\n ),\n totalTokens: readFiniteNumber(\n rawAssistantTurn.debug.usage.totalTokens,\n ),\n cachedTokens: readOptionalFiniteNumber(\n rawAssistantTurn.debug.usage.cachedTokens,\n ),\n cost: readOptionalFiniteNumber(rawAssistantTurn.debug.usage.cost),\n }\n : undefined,\n tools: Array.isArray(rawAssistantTurn.debug.tools)\n ? rawAssistantTurn.debug.tools\n .filter((tool) => isRecord(tool))\n .map((tool) => ({\n callId: readNonEmptyString(tool.callId) || undefined,\n name: readString(tool.name),\n arguments: readNonEmptyString(tool.arguments) || undefined,\n result: readNonEmptyString(tool.result) || undefined,\n error: readNonEmptyString(tool.error) || undefined,\n durationMs: readOptionalFiniteNumber(tool.durationMs),\n }))\n : [],\n attempts: Array.isArray(rawAssistantTurn.debug.attempts)\n ? rawAssistantTurn.debug.attempts\n .filter((attempt) => isRecord(attempt))\n .map((attempt) => ({\n id: readNonEmptyString(attempt.id) || undefined,\n requestId: readNonEmptyString(attempt.requestId) || undefined,\n model: readNonEmptyString(attempt.model) || undefined,\n provider: readNonEmptyString(attempt.provider) || undefined,\n finishReason:\n readNonEmptyString(attempt.finishReason) || undefined,\n promptTokens: readOptionalFiniteNumber(attempt.promptTokens),\n completionTokens: readOptionalFiniteNumber(\n attempt.completionTokens,\n ),\n totalTokens: readOptionalFiniteNumber(attempt.totalTokens),\n cachedTokens: readOptionalFiniteNumber(attempt.cachedTokens),\n cost: readOptionalFiniteNumber(attempt.cost),\n latencyMs: readOptionalFiniteNumber(attempt.latencyMs),\n input: readNonEmptyString(attempt.input) || undefined,\n output: readNonEmptyString(attempt.output) || undefined,\n thinking: readNonEmptyString(attempt.thinking) || undefined,\n observationReason:\n readNonEmptyString(attempt.observationReason) || undefined,\n startedAt: readNonEmptyString(attempt.startedAt) || undefined,\n completedAt:\n readNonEmptyString(attempt.completedAt) || undefined,\n toolCalls: Array.isArray(attempt.toolCalls)\n ? attempt.toolCalls\n .filter((tool) => isRecord(tool))\n .map((tool) => ({\n callId: readNonEmptyString(tool.callId) || undefined,\n name: readString(tool.name),\n arguments:\n readNonEmptyString(tool.arguments) || undefined,\n result: readNonEmptyString(tool.result) || undefined,\n error: readNonEmptyString(tool.error) || undefined,\n durationMs: readOptionalFiniteNumber(tool.durationMs),\n }))\n : [],\n }))\n : [],\n spans: Array.isArray(rawAssistantTurn.debug.spans)\n ? rawAssistantTurn.debug.spans\n .filter((span) => isRecord(span))\n .map((span) => ({\n id: readNonEmptyString(span.id) || undefined,\n parentId: readNonEmptyString(span.parentId) || undefined,\n generationId:\n readNonEmptyString(span.generationId) || undefined,\n name: readNonEmptyString(span.name) || undefined,\n type: readNonEmptyString(span.type) || undefined,\n status: readNonEmptyString(span.status) || undefined,\n level: readNonEmptyString(span.level) || undefined,\n callId: readNonEmptyString(span.callId) || undefined,\n toolName: readNonEmptyString(span.toolName) || undefined,\n input: readNonEmptyString(span.input) || undefined,\n output: readNonEmptyString(span.output) || undefined,\n error: readNonEmptyString(span.error) || undefined,\n durationMs: readOptionalFiniteNumber(span.durationMs),\n startedAt: readNonEmptyString(span.startedAt) || undefined,\n completedAt: readNonEmptyString(span.completedAt) || undefined,\n attributes: isRecord(span.attributes)\n ? span.attributes\n : undefined,\n }))\n : [],\n events: Array.isArray(rawAssistantTurn.debug.events)\n ? rawAssistantTurn.debug.events\n .filter((item) => isRecord(item))\n .map((item) => ({\n id: readNonEmptyString(item.id) || undefined,\n name: readNonEmptyString(item.name) || undefined,\n type: readNonEmptyString(item.type) || undefined,\n level: readNonEmptyString(item.level) || undefined,\n message: readNonEmptyString(item.message) || undefined,\n reason: readNonEmptyString(item.reason) || undefined,\n spanId: readNonEmptyString(item.spanId) || undefined,\n generationId:\n readNonEmptyString(item.generationId) || undefined,\n timestamp: readNonEmptyString(item.timestamp) || undefined,\n attributes: isRecord(item.attributes)\n ? item.attributes\n : undefined,\n }))\n : [],\n }\n : undefined;\n\n return {\n id: assistantID,\n role: normalizeMessageRole(rawAssistantTurn.role),\n content: readString(rawAssistantTurn.content),\n explanation: readNonEmptyString(rawAssistantTurn.explanation) || undefined,\n citations,\n toolCalls,\n charts: undefined,\n renderTables: undefined,\n artifacts: sanitizeAssistantArtifacts(rawAssistantTurn.artifacts, turnId),\n codeOutputs,\n lifecycle: \"complete\",\n debug: debugTrace,\n createdAt: readString(rawAssistantTurn.createdAt, fallbackCreatedAt),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Conversation turn sanitizer\n// ---------------------------------------------------------------------------\n\nfunction sanitizeConversationTurn(\n rawTurn: unknown,\n index: number,\n fallbackSessionID: string,\n): ConversationTurn | null {\n if (!isRecord(rawTurn)) {\n warnMalformedSessionPayload(\n \"Dropped malformed turn payload (not an object)\",\n { index },\n );\n return null;\n }\n\n if (!isRecord(rawTurn.userTurn)) {\n warnMalformedSessionPayload(\n \"Dropped malformed turn payload (missing user turn)\",\n { index },\n );\n return null;\n }\n\n const userTurnID = readNonEmptyString(rawTurn.userTurn.id);\n if (!userTurnID) {\n warnMalformedSessionPayload(\n \"Dropped malformed turn payload (missing user turn id)\",\n { index },\n );\n return null;\n }\n\n const turnID = readString(rawTurn.id, userTurnID);\n const createdAt = readString(\n rawTurn.createdAt,\n readString(rawTurn.userTurn.createdAt, new Date().toISOString()),\n );\n\n return {\n id: turnID,\n sessionId: readString(rawTurn.sessionId, fallbackSessionID),\n userTurn: {\n id: userTurnID,\n content: readString(rawTurn.userTurn.content),\n attachments: sanitizeUserAttachments(\n rawTurn.userTurn.attachments,\n turnID,\n ),\n author: mapSessionUser(rawTurn.userTurn.author),\n createdAt: readString(rawTurn.userTurn.createdAt, createdAt),\n },\n assistantTurn: sanitizeAssistantTurn(\n rawTurn.assistantTurn,\n createdAt,\n turnID,\n ),\n createdAt,\n };\n}\n\nexport function sanitizeConversationTurns(\n rawTurns: unknown,\n sessionID: string,\n): ConversationTurn[] {\n if (!Array.isArray(rawTurns)) {\n warnMalformedSessionPayload(\n \"Session payload contained non-array turns field\",\n { sessionID },\n );\n return [];\n }\n\n const turns: ConversationTurn[] = [];\n let dropped = 0;\n for (let i = 0; i < rawTurns.length; i++) {\n const sanitizedTurn = sanitizeConversationTurn(rawTurns[i], i, sessionID);\n if (sanitizedTurn) {\n turns.push(sanitizedTurn);\n } else {\n dropped++;\n }\n }\n\n if (dropped > 0) {\n warnMalformedSessionPayload(\n \"Dropped malformed turns from session payload\",\n {\n sessionID,\n dropped,\n total: rawTurns.length,\n },\n );\n }\n\n return turns;\n}\n\n// ---------------------------------------------------------------------------\n// Pending question sanitizer\n// ---------------------------------------------------------------------------\n\nexport function sanitizePendingQuestion(\n rawPendingQuestion: RPCPendingQuestion | null | undefined,\n sessionID: string,\n): PendingQuestion | null {\n if (!rawPendingQuestion) {\n return null;\n }\n\n const checkpointID = readNonEmptyString(rawPendingQuestion.checkpointId);\n if (!checkpointID) {\n warnMalformedSessionPayload(\n \"Dropped malformed pendingQuestion without checkpointId\",\n { sessionID },\n );\n return null;\n }\n\n if (!Array.isArray(rawPendingQuestion.questions)) {\n warnMalformedSessionPayload(\n \"Pending question had non-array questions payload\",\n {\n sessionID,\n checkpointID,\n },\n );\n }\n\n const questions: Question[] = Array.isArray(rawPendingQuestion.questions)\n ? rawPendingQuestion.questions\n .filter((question) => {\n if (!question || !isRecord(question)) {\n warnMalformedSessionPayload(\n \"Dropped malformed question from pendingQuestion\",\n {\n sessionID,\n checkpointID,\n },\n );\n return false;\n }\n return true;\n })\n .map((question, index) => {\n const questionID = readString(\n question.id,\n `${checkpointID}-q-${index}`,\n );\n const options = Array.isArray(question.options)\n ? question.options\n .filter((option) => {\n if (!option || !isRecord(option)) {\n warnMalformedSessionPayload(\n \"Dropped malformed pendingQuestion option\",\n {\n sessionID,\n checkpointID,\n questionID,\n },\n );\n return false;\n }\n return true;\n })\n .map((option, optionIndex) => {\n const label = readString(option.label);\n const id = readString(\n option.id,\n `${questionID}-opt-${optionIndex}`,\n );\n return {\n id,\n label,\n value: id,\n };\n })\n : [];\n\n return {\n id: questionID,\n text: readString(question.text),\n type: normalizeQuestionType(question.type),\n options,\n };\n })\n : [];\n\n return {\n id: checkpointID,\n turnId: readString(rawPendingQuestion.turnId),\n agentName: readNonEmptyString(rawPendingQuestion.agentName) || undefined,\n questions,\n status: normalizePendingQuestionStatus(rawPendingQuestion.status),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Artifact helpers\n// ---------------------------------------------------------------------------\n\nfunction formatSizeReadable(bytes: number): string | undefined {\n if (!Number.isFinite(bytes) || bytes <= 0) {\n return undefined;\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let idx = 0;\n while (value >= 1024 && idx < units.length - 1) {\n value /= 1024;\n idx++;\n }\n const precision = idx === 0 ? 0 : value >= 10 ? 1 : 2;\n return `${value.toFixed(precision)} ${units[idx]}`;\n}\n\nfunction parseRowCount(metadata?: Record<string, unknown>): number | undefined {\n if (!metadata) {\n return undefined;\n }\n const raw =\n metadata.row_count ??\n metadata.rowCount ??\n metadata.total_rows ??\n metadata.totalRows;\n if (typeof raw === \"number\" && Number.isSafeInteger(raw) && raw >= 0) {\n return raw;\n }\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n if (!/^\\d+$/.test(trimmed)) {\n return undefined;\n }\n const parsed = Number(trimmed);\n if (Number.isSafeInteger(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction inferDownloadType(\n artifact: SessionArtifact,\n): DownloadArtifact[\"type\"] | null {\n const mime = artifact.mimeType?.toLowerCase() || \"\";\n const name = artifact.name?.toLowerCase() || \"\";\n const cleanURL = artifact.url?.split(\"?\")[0].toLowerCase() || \"\";\n\n const isPDF =\n mime.includes(\"pdf\") || name.endsWith(\".pdf\") || cleanURL.endsWith(\".pdf\");\n if (isPDF) {\n return \"pdf\";\n }\n\n const isExcel =\n mime.includes(\"spreadsheet\") ||\n mime.includes(\"excel\") ||\n name.endsWith(\".xlsx\") ||\n name.endsWith(\".xls\") ||\n cleanURL.endsWith(\".xlsx\") ||\n cleanURL.endsWith(\".xls\");\n if (isExcel) {\n return \"excel\";\n }\n\n return null;\n}\n\nfunction extractFilename(artifact: SessionArtifact): string {\n const name = artifact.name?.trim();\n if (name) {\n return name;\n }\n\n const urlPath = artifact.url?.split(\"?\")[0] || \"\";\n const fromURL = urlPath.split(\"/\").filter(Boolean).pop();\n if (fromURL) {\n return fromURL;\n }\n\n return \"download\";\n}\n\nfunction toDownloadArtifact(\n artifact: SessionArtifact,\n): DownloadArtifact | null {\n if (!artifact.url) {\n return null;\n }\n const type = inferDownloadType(artifact);\n if (!type) {\n return null;\n }\n\n return {\n type,\n filename: extractFilename(artifact),\n url: artifact.url,\n sizeReadable: formatSizeReadable(artifact.sizeBytes),\n rowCount: parseRowCount(artifact.metadata),\n description: artifact.description,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tool-call extraction helpers\n// ---------------------------------------------------------------------------\n\nfunction cloneChartData(\n chart: import(\"../types\").ChartData,\n): import(\"../types\").ChartData {\n return {\n ...chart,\n series:\n chart.series?.map((s) => ({ ...s, data: [...(s.data ?? [])] })) ?? [],\n labels: chart.labels ? [...chart.labels] : undefined,\n colors: chart.colors ? [...chart.colors] : undefined,\n options:\n chart.options &&\n typeof chart.options === \"object\" &&\n !Array.isArray(chart.options)\n ? JSON.parse(JSON.stringify(chart.options))\n : chart.options,\n };\n}\n\nfunction extractChartsFromToolCalls(\n toolCalls?: Array<{ name: string; result?: string }>,\n): import(\"../types\").ChartData[] {\n if (!toolCalls) {\n return [];\n }\n const charts: import(\"../types\").ChartData[] = [];\n for (const tc of toolCalls) {\n if (tc.name === \"draw_chart\" && tc.result) {\n const parsed = parseChartDataFromJsonString(tc.result);\n if (parsed) {\n charts.push(cloneChartData(parsed));\n }\n }\n }\n return charts;\n}\n\nfunction cloneRenderTableData(table: RenderTableData): RenderTableData {\n return {\n ...table,\n columns: [...(table.columns ?? [])],\n headers: [...(table.headers ?? [])],\n rows: table.rows?.map((row) => [...row]) ?? [],\n };\n}\n\nfunction extractRenderTablesFromToolCalls(\n toolCalls?: Array<{ id: string; name: string; result?: string }>,\n): RenderTableData[] {\n if (!toolCalls) {\n return [];\n }\n\n const tables: RenderTableData[] = [];\n for (const tc of toolCalls) {\n if (tc.name !== \"render_table\" || !tc.result) {\n continue;\n }\n const parsed = parseRenderTableDataFromJsonString(tc.result, tc.id);\n if (parsed) {\n tables.push(cloneRenderTableData(parsed));\n }\n }\n\n return tables;\n}\n\nconst EXPORT_TOOL_NAMES: Record<string, DownloadArtifact[\"type\"]> = {\n export_query_to_excel: \"excel\",\n export_data_to_excel: \"excel\",\n export_to_pdf: \"pdf\",\n};\n\nfunction extractDownloadArtifactsFromToolCalls(\n toolCalls?: Array<{ name: string; result?: string }>,\n): DownloadArtifact[] {\n if (!toolCalls) {\n return [];\n }\n const artifacts: DownloadArtifact[] = [];\n for (const tc of toolCalls) {\n const type = EXPORT_TOOL_NAMES[tc.name];\n if (!type || !tc.result) {\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(tc.result);\n } catch {\n continue;\n }\n if (!isRecord(parsed) || typeof parsed.url !== \"string\" || !parsed.url) {\n continue;\n }\n\n const filename =\n typeof parsed.filename === \"string\" && parsed.filename\n ? parsed.filename\n : parsed.url.split(\"/\").pop() || \"download\";\n\n const sizeKB =\n typeof parsed.file_size_kb === \"number\" ? parsed.file_size_kb : undefined;\n const sizeBytes =\n typeof parsed.size === \"number\"\n ? parsed.size\n : sizeKB != null\n ? sizeKB * 1024\n : undefined;\n\n artifacts.push({\n type,\n filename,\n url: parsed.url,\n sizeReadable:\n sizeBytes != null ? formatSizeReadable(sizeBytes) : undefined,\n rowCount: parseRowCount(parsed as Record<string, unknown>),\n description:\n typeof parsed.description === \"string\" ? parsed.description : undefined,\n });\n }\n return artifacts;\n}\n\n// ---------------------------------------------------------------------------\n// Turn normalization\n// ---------------------------------------------------------------------------\n\nfunction normalizeAssistantTurn(\n turn: Partial<AssistantTurn> & {\n id: string;\n content: string;\n createdAt: string;\n },\n): AssistantTurn {\n const existingArtifacts = turn.artifacts || [];\n const fromToolCalls = extractDownloadArtifactsFromToolCalls(turn.toolCalls);\n const renderTables =\n turn.renderTables || extractRenderTablesFromToolCalls(turn.toolCalls);\n // Merge: add tool-call artifacts that aren't already present (by URL + filename)\n const merged = [...existingArtifacts];\n for (const a of fromToolCalls) {\n if (!merged.some((e) => e.url === a.url && e.filename === a.filename)) {\n merged.push(a);\n }\n }\n\n const chartsRaw = turn.charts?.length\n ? turn.charts\n : extractChartsFromToolCalls(turn.toolCalls);\n const charts = chartsRaw?.map(cloneChartData) ?? [];\n const renderTablesCloned = renderTables.map(cloneRenderTableData);\n\n return {\n ...turn,\n role: (turn.role as MessageRole) || MessageRole.Assistant,\n charts: charts.length ? charts : undefined,\n renderTables: renderTablesCloned,\n citations: turn.citations || [],\n artifacts: merged,\n codeOutputs: turn.codeOutputs || [],\n lifecycle: turn.lifecycle || \"complete\",\n };\n}\n\nexport function normalizeTurns(raw: ConversationTurn[]): ConversationTurn[] {\n return raw.map((turn) => {\n if (!turn.assistantTurn) {\n return turn;\n }\n return {\n ...turn,\n assistantTurn: normalizeAssistantTurn(turn.assistantTurn),\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Attach artifacts to turns\n// ---------------------------------------------------------------------------\n\nfunction toMillis(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : Number.NaN;\n}\n\nexport function attachArtifactsToTurns(\n turns: ConversationTurn[],\n artifacts: SessionArtifact[],\n): ConversationTurn[] {\n if (artifacts.length === 0) {\n return turns;\n }\n\n const downloadArtifacts = artifacts\n .map((raw) => ({ raw, mapped: toDownloadArtifact(raw) }))\n .filter(\n (entry): entry is { raw: SessionArtifact; mapped: DownloadArtifact } =>\n entry.mapped !== null,\n )\n .sort((a, b) => toMillis(a.raw.createdAt) - toMillis(b.raw.createdAt));\n\n const chartArtifacts = artifacts\n .filter((a) => a.type === \"chart\")\n .sort((a, b) => toMillis(a.createdAt) - toMillis(b.createdAt));\n\n const tableArtifacts = artifacts\n .filter((a) => a.type === \"table\")\n .sort((a, b) => toMillis(a.createdAt) - toMillis(b.createdAt));\n\n if (\n downloadArtifacts.length === 0 &&\n chartArtifacts.length === 0 &&\n tableArtifacts.length === 0\n ) {\n return turns;\n }\n\n const nextTurns = turns.map((turn) => {\n if (!turn.assistantTurn) {\n return turn;\n }\n return {\n ...turn,\n assistantTurn: {\n ...turn.assistantTurn,\n artifacts: [...(turn.assistantTurn.artifacts || [])],\n charts: turn.assistantTurn.charts\n ? [...turn.assistantTurn.charts]\n : undefined,\n renderTables: turn.assistantTurn.renderTables\n ? [...turn.assistantTurn.renderTables]\n : undefined,\n },\n };\n });\n\n const turnIndexByMessageID = new Map<string, number>();\n\n nextTurns.forEach((turn, index) => {\n turnIndexByMessageID.set(turn.userTurn.id, index);\n\n const assistantTurn = turn.assistantTurn;\n if (!assistantTurn) {\n return;\n }\n turnIndexByMessageID.set(assistantTurn.id, index);\n });\n\n for (const entry of downloadArtifacts) {\n const messageID = entry.raw.messageId;\n // Only attach artifacts that are explicitly linked to a message.\n // Orphan artifacts (uploaded via the artifacts panel) have no messageId\n // and should not appear on any message.\n if (!messageID) {\n continue;\n }\n const targetIndex = turnIndexByMessageID.get(messageID);\n if (targetIndex === undefined) {\n continue;\n }\n\n const assistantTurn = nextTurns[targetIndex]?.assistantTurn;\n if (!assistantTurn) {\n continue;\n }\n\n const exists = assistantTurn.artifacts.some(\n (existing) =>\n existing.url === entry.mapped.url &&\n existing.filename === entry.mapped.filename,\n );\n if (!exists) {\n assistantTurn.artifacts.push(entry.mapped);\n }\n }\n\n for (const raw of chartArtifacts) {\n const messageID = raw.messageId;\n if (!messageID) {\n continue;\n }\n const targetIndex = turnIndexByMessageID.get(messageID);\n if (targetIndex === undefined) {\n continue;\n }\n\n const assistantTurn = nextTurns[targetIndex]?.assistantTurn;\n if (!assistantTurn) {\n continue;\n }\n\n const metadata = raw.metadata;\n if (!metadata || typeof metadata !== \"object\" || metadata === null) {\n continue;\n }\n const spec =\n metadata.spec &&\n typeof metadata.spec === \"object\" &&\n metadata.spec !== null\n ? (metadata.spec as Record<string, unknown>)\n : (metadata as Record<string, unknown>);\n\n const chart = parseChartDataFromSpec(spec, raw.name);\n if (chart) {\n if (!assistantTurn.charts) {\n assistantTurn.charts = [];\n }\n assistantTurn.charts.push(cloneChartData(chart));\n }\n }\n\n for (const raw of tableArtifacts) {\n const messageID = raw.messageId;\n if (!messageID) {\n continue;\n }\n const targetIndex = turnIndexByMessageID.get(messageID);\n if (targetIndex === undefined) {\n continue;\n }\n\n const assistantTurn = nextTurns[targetIndex]?.assistantTurn;\n if (!assistantTurn) {\n continue;\n }\n\n if (assistantTurn.renderTables === undefined) {\n assistantTurn.renderTables = extractRenderTablesFromToolCalls(\n assistantTurn.toolCalls,\n );\n }\n const existing = assistantTurn.renderTables;\n\n const metadata = raw.metadata;\n if (!metadata || typeof metadata !== \"object\" || metadata === null) {\n continue;\n }\n const tableData = parseRenderTableDataFromMetadata(\n metadata as Record<string, unknown>,\n raw.id,\n );\n if (!tableData) {\n continue;\n }\n\n const dedupeKey = (t: RenderTableData) =>\n `${t.query}|${t.columns.join(\",\")}`;\n const key = dedupeKey(tableData);\n if (existing.some((t) => dedupeKey(t) === key)) {\n continue;\n }\n assistantTurn.renderTables = [...existing, cloneRenderTableData(tableData)];\n }\n\n return nextTurns;\n}\n","/**\n * Session lifecycle management: create, list, get, delete, archive, pin, rename.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport { AppletRPCException } from '../../applet-host';\nimport type { BichatRPC } from './rpc.generated';\nimport type {\n Session,\n SessionMember,\n SessionUser,\n SessionListResult,\n SessionArtifact,\n ConversationTurn,\n PendingQuestion,\n AsyncRunAccepted,\n} from '../types';\nimport {\n toSession,\n sanitizeConversationTurns,\n sanitizePendingQuestion,\n normalizeTurns,\n attachArtifactsToTurns,\n warnMalformedSessionPayload,\n} from './mappers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SessionState {\n session: Session\n turns: ConversationTurn[]\n pendingQuestion?: PendingQuestion | null\n}\n\ntype RPCCaller = <TMethod extends keyof BichatRPC & string>(\n method: TMethod,\n params: BichatRPC[TMethod]['params']\n) => Promise<BichatRPC[TMethod]['result']>\n\ntype FetchSessionArtifactsFn = (\n sessionId: string,\n options?: { limit?: number; offset?: number }\n) => Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }>\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isSessionNotFoundError(err: unknown): boolean {\n if (!(err instanceof AppletRPCException)) {return false;}\n return err.code === 'not_found' || err.code === 'session_not_found';\n}\n\n// ---------------------------------------------------------------------------\n// Session CRUD functions\n// ---------------------------------------------------------------------------\n\nexport async function createSession(callRPC: RPCCaller): Promise<Session> {\n const data = await callRPC('bichat.session.create', { title: '' });\n return toSession(data.session);\n}\n\nexport async function fetchSession(\n id: string,\n callRPC: RPCCaller,\n fetchArtifacts: FetchSessionArtifactsFn,\n): Promise<SessionState | null> {\n try {\n const [data, artifactsData] = await Promise.all([\n callRPC('bichat.session.get', { id }),\n fetchArtifacts(id, { limit: 200, offset: 0 }).catch((err) => {\n console.warn('Failed to fetch session artifacts:', err);\n return { artifacts: [] as SessionArtifact[], hasMore: false, nextOffset: 0 };\n }),\n ]);\n\n const sanitizedTurns = sanitizeConversationTurns(data.turns, id);\n const turns = attachArtifactsToTurns(\n normalizeTurns(sanitizedTurns),\n artifactsData.artifacts || []\n );\n const pendingQuestion = sanitizePendingQuestion(data.pendingQuestion, id);\n\n if (data.pendingQuestion && pendingQuestion && pendingQuestion.questions.length === 0) {\n warnMalformedSessionPayload('Pending question normalized to zero renderable questions', {\n sessionID: id,\n checkpointID: pendingQuestion.id,\n });\n }\n\n return {\n session: toSession(data.session),\n turns,\n pendingQuestion,\n };\n } catch (err) {\n if (isSessionNotFoundError(err)) {\n return null;\n }\n console.error('Failed to fetch session:', err);\n throw err instanceof Error ? err : new Error('Failed to fetch session');\n }\n}\n\nexport async function listSessions(\n callRPC: RPCCaller,\n options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n }\n): Promise<SessionListResult> {\n const data = await callRPC('bichat.session.list', {\n limit: options?.limit ?? 200,\n offset: options?.offset ?? 0,\n includeArchived: options?.includeArchived ?? false,\n });\n return {\n sessions: data.sessions.map(toSession),\n total: typeof data.total === 'number' ? data.total : data.sessions.length,\n hasMore: typeof data.hasMore === 'boolean' ? data.hasMore : false,\n };\n}\n\nexport async function archiveSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n const data = await callRPC('bichat.session.archive', { id: sessionId });\n return toSession(data.session);\n}\n\nexport async function unarchiveSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n const data = await callRPC('bichat.session.unarchive', { id: sessionId });\n return toSession(data.session);\n}\n\nexport async function pinSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n const data = await callRPC('bichat.session.pin', { id: sessionId });\n return toSession(data.session);\n}\n\nexport async function unpinSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n const data = await callRPC('bichat.session.unpin', { id: sessionId });\n return toSession(data.session);\n}\n\nexport async function deleteSession(callRPC: RPCCaller, sessionId: string): Promise<void> {\n await callRPC('bichat.session.delete', { id: sessionId });\n}\n\nexport async function renameSession(callRPC: RPCCaller, sessionId: string, title: string): Promise<Session> {\n const data = await callRPC('bichat.session.updateTitle', { id: sessionId, title });\n return toSession(data.session);\n}\n\nexport async function regenerateSessionTitle(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n const data = await callRPC('bichat.session.regenerateTitle', { id: sessionId });\n return toSession(data.session);\n}\n\nexport async function clearSessionHistory(callRPC: RPCCaller, sessionId: string): Promise<{\n success: boolean\n deletedMessages: number\n deletedArtifacts: number\n}> {\n return callRPC('bichat.session.clear', { id: sessionId });\n}\n\nexport async function compactSessionHistory(callRPC: RPCCaller, sessionId: string): Promise<AsyncRunAccepted> {\n const result = await callRPC('bichat.session.compact', { id: sessionId });\n if (!result.accepted) {\n throw new Error('Session compact request was not accepted');\n }\n if (result.operation !== 'session_compact') {\n throw new Error(`Unexpected async operation: ${result.operation}`);\n }\n if (!result.sessionId || !result.runId) {\n throw new Error('Missing async run metadata');\n }\n return {\n accepted: true,\n operation: result.operation,\n sessionId: result.sessionId,\n runId: result.runId,\n startedAt: result.startedAt,\n };\n}\n\nexport async function listUsers(callRPC: RPCCaller): Promise<SessionUser[]> {\n const data = await callRPC('bichat.user.list', {});\n return data.users.map((user) => ({\n id: String(user.id),\n firstName: user.firstName || '',\n lastName: user.lastName || '',\n initials: user.initials || '',\n }));\n}\n\nexport async function listAllSessions(\n callRPC: RPCCaller,\n options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n userId?: string | null\n }\n): Promise<{\n sessions: Session[]\n total: number\n hasMore: boolean\n}> {\n const data = await callRPC('bichat.session.listAll', {\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n includeArchived: options?.includeArchived ?? false,\n userId: options?.userId ?? null,\n });\n\n return {\n sessions: data.sessions.map(toSession),\n total: typeof data.total === 'number' ? data.total : data.sessions.length,\n hasMore: Boolean(data.hasMore),\n };\n}\n\nexport async function listSessionMembers(callRPC: RPCCaller, sessionId: string): Promise<SessionMember[]> {\n const data = await callRPC('bichat.session.members.list', { sessionId });\n return data.members.map((member) => ({\n user: {\n id: String(member.user.id),\n firstName: member.user.firstName,\n lastName: member.user.lastName,\n initials: member.user.initials,\n },\n role: (() => {\n const normalizedRole = (member.role || '').toLowerCase();\n if (normalizedRole === 'owner') {return 'owner';}\n if (normalizedRole === 'editor') {return 'editor';}\n return 'viewer';\n })(),\n createdAt: member.createdAt,\n updatedAt: member.updatedAt,\n }));\n}\n\nexport async function addSessionMember(\n callRPC: RPCCaller,\n sessionId: string,\n userId: string,\n role: 'editor' | 'viewer',\n): Promise<void> {\n await callRPC('bichat.session.members.add', {\n sessionId,\n userId,\n role: role.toUpperCase(),\n });\n}\n\nexport async function updateSessionMemberRole(\n callRPC: RPCCaller,\n sessionId: string,\n userId: string,\n role: 'editor' | 'viewer',\n): Promise<void> {\n await callRPC('bichat.session.members.updateRole', {\n sessionId,\n userId,\n role: role.toUpperCase(),\n });\n}\n\nexport async function removeSessionMember(callRPC: RPCCaller, sessionId: string, userId: string): Promise<void> {\n await callRPC('bichat.session.members.remove', { sessionId, userId });\n}\n","/**\n * SSE stream parser for consuming Server-Sent Events.\n */\n\nimport type { StreamChunk, StreamEvent } from '../types';\n\nexport interface SSEEvent {\n type: string\n content?: string\n error?: string\n sessionId?: string\n toolName?: string\n toolCallId?: string\n durationMs?: number\n success?: boolean\n [key: string]: unknown\n}\n\n/**\n * Helper function to process SSE data lines and parse JSON events.\n */\nfunction* processDataLines(lines: string[]): Generator<SSEEvent, void, unknown> {\n for (const line of lines) {\n if (line.startsWith(':')) {continue;}\n\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6);\n if (jsonStr === '[DONE]') {continue;}\n\n try {\n const parsed = JSON.parse(jsonStr) as SSEEvent;\n yield parsed;\n } catch (err) {\n console.error('SSE parse error:', err, 'Data:', jsonStr);\n // Yield error event so consumer can react appropriately\n yield {\n type: 'error',\n error: 'Failed to parse SSE event',\n };\n }\n }\n }\n}\n\n/**\n * Parses an SSE stream and yields parsed JSON events.\n */\nexport async function* parseSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<SSEEvent, void, unknown> {\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {break;}\n\n buffer += decoder.decode(value, { stream: true });\n const events = buffer.split('\\n\\n');\n buffer = events.pop() || '';\n\n for (const event of events) {\n if (!event.trim()) {continue;}\n yield* processDataLines(event.split('\\n'));\n }\n }\n\n // Process any remaining data in buffer\n if (buffer.trim()) {\n yield* processDataLines(buffer.split('\\n'));\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Terminal event types that signal end of stream.\n */\nconst TERMINAL_TYPES = new Set(['done', 'error']);\n\n/**\n * Parses BiChat SSE stream with normalization and terminal event guarantee.\n *\n * Guarantees that the generator always yields a terminal event (`done` or\n * `error`) as its last item — even when the underlying stream closes silently\n * without one.\n */\nexport async function* parseBichatStream(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<StreamChunk, void, unknown> {\n let yieldedTerminal = false;\n\n for await (const event of parseSSEStream(reader)) {\n if (event.type === 'ping') {\n continue;\n }\n const parsed = event as StreamChunk;\n\n // Infer type if missing\n const inferredType = parsed.type || (parsed.content ? 'content' : 'error');\n\n const normalized: StreamChunk = {\n ...parsed,\n type: inferredType,\n };\n\n if (TERMINAL_TYPES.has(inferredType)) {\n yieldedTerminal = true;\n }\n\n yield normalized;\n }\n\n // Guarantee: always emit a terminal event\n if (!yieldedTerminal) {\n yield { type: 'done' };\n }\n}\n\n/**\n * Type-safe version of `parseBichatStream` that yields `StreamEvent`\n * discriminated union members instead of the flat `StreamChunk`.\n *\n * Use this in new code for proper type narrowing on `event.type`.\n */\nexport async function* parseBichatStreamEvents(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<StreamEvent, void, unknown> {\n for await (const chunk of parseBichatStream(reader)) {\n const event = toStreamEvent(chunk);\n if (event) {yield event;}\n }\n}\n\n/**\n * Convert a flat StreamChunk into a discriminated StreamEvent.\n * Returns null for chunks that can't be meaningfully mapped.\n */\nfunction toStreamEvent(chunk: StreamChunk): StreamEvent | null {\n switch (chunk.type) {\n case 'chunk':\n case 'content':\n return { type: 'content', content: chunk.content ?? '' };\n case 'thinking':\n return { type: 'thinking', content: chunk.content ?? '' };\n case 'tool_start':\n return chunk.tool ? { type: 'tool_start', tool: chunk.tool } : null;\n case 'tool_end':\n return chunk.tool ? { type: 'tool_end', tool: chunk.tool } : null;\n case 'usage':\n return chunk.usage ? { type: 'usage', usage: chunk.usage } : null;\n case 'user_message':\n return chunk.sessionId ? { type: 'user_message', sessionId: chunk.sessionId } : null;\n case 'interrupt':\n return chunk.interrupt\n ? { type: 'interrupt', interrupt: chunk.interrupt, sessionId: chunk.sessionId }\n : null;\n case 'text_block_end':\n // seq defaults to 0 so consumers can always key on it even when\n // the server mints the first block implicitly.\n return { type: 'text_block_end', seq: chunk.textBlockSeq ?? 0 };\n case 'done':\n return { type: 'done', sessionId: chunk.sessionId, generationMs: chunk.generationMs };\n case 'error':\n return { type: 'error', error: chunk.error ?? 'Unknown error' };\n default:\n return null;\n }\n}\n","/**\n * Hand-mirrored copy of the backend's pkg/httpdto.StreamEventType\n * constant set. Used by subscribeRunEvents / subscribeActiveRuns /\n * openManagedEventSource to register addEventListener handlers that\n * match every `event:` label the server emits.\n *\n * Drift between this file and the Go definition is caught by\n * eventNames.test.ts — the test reads the sibling Go source at test\n * time and diffs the constant set. When the Go file is absent (CI\n * without the SDK sidecar checkout) the drift guard self-skips.\n */\n\nexport const STREAM_EVENT_TYPES = [\n 'chunk',\n 'content',\n 'thinking',\n 'tool_start',\n 'tool_end',\n 'text_block_end',\n 'snapshot',\n 'interrupt',\n 'citation',\n 'usage',\n 'ping',\n 'stream_started',\n 'done',\n 'cancelled',\n 'error',\n 'failed',\n] as const;\n\nexport type StreamEventType = typeof STREAM_EVENT_TYPES[number];\n\n/**\n * Subset of {@link STREAM_EVENT_TYPES} that terminates a run from the\n * client's perspective. Callers should close the EventSource and\n * settle their promise on any of these.\n */\nexport const TERMINAL_STREAM_EVENT_TYPES = [\n 'done',\n 'cancelled',\n 'error',\n 'failed',\n] as const satisfies readonly StreamEventType[];\n\nexport type TerminalStreamEventType = typeof TERMINAL_STREAM_EVENT_TYPES[number];\n\n/**\n * Narrow + type-guard helper. Returns true when `name` is one of the\n * terminal stream event types. The guard narrows precisely to the\n * terminal subset — callers receiving `true` get {@link TerminalStreamEventType},\n * not the full {@link StreamEventType} union.\n */\nexport function isTerminalEvent(name: string): name is TerminalStreamEventType {\n return (TERMINAL_STREAM_EVENT_TYPES as readonly string[]).includes(name);\n}\n","/**\n * openManagedEventSource — shared EventSource primitive.\n *\n * Centralises the listener wiring, AbortSignal handling, and the\n * 500ms initial-connect grace used by subscribeRunEvents and\n * subscribeActiveRuns. Future fan-out helpers can adopt this instead\n * of duplicating the EventSource boilerplate.\n *\n * Behaviour:\n * - Registers an addEventListener for every name in `events`. The\n * callback receives the event name and the JSON-parsed payload.\n * - On JSON parse failure, the callback is invoked with\n * `{ __unparseable: true, raw: <string> }` so the caller can log or\n * surface a synthetic error. The subscription stays open; native\n * EventSource reconnect handles transient flaps.\n * - Initial-connect grace: when `onerror` fires before any event is\n * received AND within `connectGraceMs` of construction, the\n * returned promise rejects with either the caller-provided error\n * (via `onConnectError`) or a generic Error. After the grace\n * window expires, `onerror` is non-fatal — the browser reconnects\n * silently.\n * - AbortSignal close: closing the source resolves the promise.\n * Already-aborted signals short-circuit before construction.\n */\n\nexport interface UnparseableEventPayload {\n __unparseable: true;\n raw: string;\n}\n\nexport interface OpenManagedEventSourceOptions {\n url: string;\n /** Every named event to subscribe to via addEventListener. */\n events: readonly string[];\n /**\n * Called for each event received. `data` is either the JSON-parsed\n * payload or a sentinel `{ __unparseable: true, raw }` when the\n * payload could not be parsed.\n */\n onMessage: (name: string, data: unknown) => void;\n /** Optional hook for raw EventSource errors (all flaps, not just initial). */\n onError?: (e: Event) => void;\n /** Close the source and resolve the promise when the signal aborts. */\n signal?: AbortSignal;\n /** Forwarded to the EventSource constructor. Defaults to true. */\n withCredentials?: boolean;\n /** Initial-connect grace window in ms. Default 500. Set 0 to disable the probe. */\n connectGraceMs?: number;\n /**\n * Maps the raw onerror Event into a rejection Error. Called only\n * when the error fires within the grace window and before any event\n * has been received. Defaults to a plain Error.\n */\n onConnectError?: (e: Event) => Error;\n}\n\nexport function openManagedEventSource(\n opts: OpenManagedEventSourceOptions,\n): Promise<void> {\n const graceMs = opts.connectGraceMs ?? 500;\n return new Promise<void>((resolve, reject) => {\n const startedAt = Date.now();\n const es = new EventSource(opts.url, {\n withCredentials: opts.withCredentials ?? true,\n });\n let settled = false;\n let sawEvent = false;\n\n const settle = (err?: Error) => {\n if (settled) {return;}\n settled = true;\n es.close();\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n };\n\n if (opts.signal) {\n if (opts.signal.aborted) {\n settle();\n return;\n }\n opts.signal.addEventListener('abort', () => settle(), { once: true });\n }\n\n const forward = (name: string) => (evt: MessageEvent) => {\n sawEvent = true;\n let parsed: unknown;\n try {\n parsed = JSON.parse(evt.data);\n } catch {\n parsed = { __unparseable: true, raw: String(evt.data) } as UnparseableEventPayload;\n }\n try {\n opts.onMessage(name, parsed);\n } catch {\n // Caller errors are non-fatal — EventSource stays open.\n }\n };\n\n for (const name of opts.events) {\n es.addEventListener(name, forward(name) as EventListener);\n }\n\n es.onerror = (evt) => {\n opts.onError?.(evt);\n if (graceMs > 0 && !sawEvent && Date.now() - startedAt < graceMs) {\n const err = opts.onConnectError\n ? opts.onConnectError(evt)\n : new Error('EventSource failed to connect before first event');\n settle(err);\n }\n // Otherwise let native reconnect handle the flap.\n };\n });\n}\n","/**\n * Attachment file processing and upload logic.\n *\n * Handles MIME detection from file signatures, filename normalization,\n * base64/URL decoding, and upload to the core upload endpoint.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport type { Attachment } from '../types';\nimport { isRecord } from '../utils/chartSpec';\nimport { validateAttachmentFile } from '../utils/fileUtils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CoreUploadResponse {\n id: number\n url: string\n path: string\n name: string\n mimetype: string\n size: number\n}\n\ntype AttachmentLifecycleEvent =\n | 'attachment_decode_start' | 'attachment_decode_success' | 'attachment_decode_fail'\n | 'attachment_upload_start' | 'attachment_upload_success' | 'attachment_upload_fail'\n | 'stream_send_with_upload_ids'\n\n// ---------------------------------------------------------------------------\n// MIME detection constants\n// ---------------------------------------------------------------------------\n\nconst MIME_TO_EXTENSION: Record<string, string> = {\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/gif': 'gif',\n 'application/pdf': 'pdf',\n};\n\nconst SAFE_AUTOCORRECT_MIME_TYPES = new Set(Object.keys(MIME_TO_EXTENSION));\n\n// ---------------------------------------------------------------------------\n// MIME detection from file signature\n// ---------------------------------------------------------------------------\n\nfunction detectMimeFromSignature(bytes: Uint8Array): string | undefined {\n if (bytes.length >= 8) {\n const isPng =\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a;\n if (isPng) {return 'image/png';}\n }\n\n if (bytes.length >= 3) {\n const isJpeg = bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff;\n if (isJpeg) {return 'image/jpeg';}\n }\n\n if (bytes.length >= 6) {\n const isGif =\n bytes[0] === 0x47 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x38 &&\n (bytes[4] === 0x37 || bytes[4] === 0x39) &&\n bytes[5] === 0x61;\n if (isGif) {return 'image/gif';}\n }\n\n if (bytes.length >= 4) {\n const isPdf =\n bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46;\n if (isPdf) {return 'application/pdf';}\n }\n\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Filename normalization\n// ---------------------------------------------------------------------------\n\nfunction normalizeFilenameForMime(filename: string, mimeType: string): string {\n const expectedExt = MIME_TO_EXTENSION[mimeType];\n if (!expectedExt) {return filename;}\n\n const lower = filename.toLowerCase();\n if (mimeType === 'image/jpeg' && (lower.endsWith('.jpg') || lower.endsWith('.jpeg'))) {\n return filename;\n }\n if (lower.endsWith(`.${expectedExt}`)) {\n return filename;\n }\n\n const dotIndex = filename.lastIndexOf('.');\n const baseName = dotIndex > 0 ? filename.slice(0, dotIndex) : filename;\n return `${baseName}.${expectedExt}`;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle logging\n// ---------------------------------------------------------------------------\n\nfunction logAttachmentLifecycle(\n event: AttachmentLifecycleEvent,\n details: Record<string, unknown>\n): void {\n const payload = {\n source: 'HttpDataSource',\n event,\n ...details,\n };\n\n if (event.endsWith('_fail')) {\n console.warn('[bichat.attachments]', payload);\n return;\n }\n // Non-failure lifecycle events: no console output (ESLint allows only warn/error)\n}\n\n// ---------------------------------------------------------------------------\n// File normalization (MIME correction, extension fix)\n// ---------------------------------------------------------------------------\n\nasync function normalizeAttachmentFile(attachment: Attachment, file: File): Promise<File> {\n const signatureBytes = new Uint8Array(await file.slice(0, 16).arrayBuffer());\n const detectedMimeType = detectMimeFromSignature(signatureBytes);\n const declaredMimeType = (attachment.mimeType || file.type || '').trim().toLowerCase();\n\n let resolvedMimeType = declaredMimeType || detectedMimeType || 'application/octet-stream';\n let correctedFromDeclared = false;\n\n if (detectedMimeType && declaredMimeType && detectedMimeType !== declaredMimeType) {\n const safeToCorrect =\n SAFE_AUTOCORRECT_MIME_TYPES.has(detectedMimeType) &&\n SAFE_AUTOCORRECT_MIME_TYPES.has(declaredMimeType);\n\n if (!safeToCorrect) {\n throw new Error(\n `Attachment \"${attachment.filename}\" MIME mismatch: declared \"${declaredMimeType}\", detected \"${detectedMimeType}\"`\n );\n }\n\n resolvedMimeType = detectedMimeType;\n correctedFromDeclared = true;\n } else if (detectedMimeType && !declaredMimeType) {\n resolvedMimeType = detectedMimeType;\n }\n\n const normalizedName = normalizeFilenameForMime(attachment.filename, resolvedMimeType);\n const normalized = new File([file], normalizedName, {\n type: resolvedMimeType,\n lastModified: file.lastModified,\n });\n\n logAttachmentLifecycle('attachment_decode_success', {\n attachmentKey: attachment.clientKey,\n filename: attachment.filename,\n normalizedFilename: normalized.name,\n declaredMimeType: declaredMimeType || undefined,\n detectedMimeType,\n resolvedMimeType,\n correctedFromDeclared,\n sizeBytes: normalized.size,\n });\n\n return normalized;\n}\n\n// ---------------------------------------------------------------------------\n// Convert Attachment to File (from base64 or URL)\n// ---------------------------------------------------------------------------\n\nasync function attachmentToFile(attachment: Attachment): Promise<File> {\n if (attachment.base64Data && attachment.base64Data.trim().length > 0) {\n try {\n const base64Data = attachment.base64Data.trim();\n const dataUrl = base64Data.startsWith('data:')\n ? base64Data\n : `data:${attachment.mimeType || 'application/octet-stream'};base64,${base64Data}`;\n const blob = await fetch(dataUrl).then((response) => response.blob());\n return new File([blob], attachment.filename, {\n type: attachment.mimeType || blob.type || 'application/octet-stream',\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown decode error';\n throw new Error(`Attachment \"${attachment.filename}\" decode failed: ${message}`);\n }\n }\n\n if (attachment.url) {\n let parsed: URL;\n try {\n parsed = new URL(attachment.url, window.location?.origin ?? 'https://localhost');\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n throw new Error(`Attachment \"${attachment.filename}\" URL has disallowed protocol: ${parsed.protocol}`);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('Attachment')) {throw err;}\n throw new Error(`Attachment \"${attachment.filename}\" has invalid or malformed URL`);\n }\n const response = await fetch(parsed.href);\n if (!response.ok) {\n throw new Error(`Attachment \"${attachment.filename}\" decode failed: source HTTP ${response.status}`);\n }\n const blob = await response.blob();\n return new File([blob], attachment.filename, {\n type: attachment.mimeType || blob.type || 'application/octet-stream',\n });\n }\n\n throw new Error(`Attachment \"${attachment.filename}\" has no uploadable data`);\n}\n\n// ---------------------------------------------------------------------------\n// Upload a single file\n// ---------------------------------------------------------------------------\n\nexport async function uploadFile(\n file: File,\n baseUrl: string,\n uploadEndpoint: string,\n createUploadHeaders: () => Headers,\n): Promise<CoreUploadResponse> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await fetch(`${baseUrl}${uploadEndpoint}`, {\n method: 'POST',\n headers: createUploadHeaders(),\n body: formData,\n });\n\n let payload: unknown = null;\n try {\n payload = await response.json();\n } catch {\n payload = null;\n }\n\n if (!response.ok) {\n const errorMessage = isRecord(payload) && typeof payload.error === 'string'\n ? payload.error\n : `Upload failed: HTTP ${response.status}`;\n throw new Error(errorMessage);\n }\n\n if (!isRecord(payload) || typeof payload.id !== 'number' || payload.id <= 0) {\n throw new Error('Upload failed: invalid response payload');\n }\n\n return {\n id: payload.id,\n url: typeof payload.url === 'string' ? payload.url : '',\n path: typeof payload.path === 'string' ? payload.path : '',\n name: typeof payload.name === 'string' ? payload.name : file.name,\n mimetype: typeof payload.mimetype === 'string' ? payload.mimetype : file.type,\n size: typeof payload.size === 'number' && Number.isFinite(payload.size) ? payload.size : file.size,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Assert upload references are valid\n// ---------------------------------------------------------------------------\n\nexport function assertUploadReferences(uploads: CoreUploadResponse[]): Array<{ uploadId: number }> {\n return uploads.map((upload, index) => {\n if (typeof upload.id !== 'number' || !Number.isFinite(upload.id) || upload.id <= 0) {\n throw new Error(`Attachment upload reference is invalid at index ${index}`);\n }\n return { uploadId: upload.id };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Ensure attachment is uploaded (reuse existing uploadId or upload new)\n// ---------------------------------------------------------------------------\n\nexport async function ensureAttachmentUpload(\n attachment: Attachment,\n context: { sessionId: string; attachmentIndex: number },\n uploadFileFn: (file: File) => Promise<CoreUploadResponse>,\n): Promise<CoreUploadResponse> {\n if (typeof attachment.uploadId === 'number' && attachment.uploadId > 0) {\n logAttachmentLifecycle('attachment_upload_success', {\n sessionId: context.sessionId,\n attachmentIndex: context.attachmentIndex,\n attachmentKey: attachment.clientKey,\n filename: attachment.filename,\n uploadId: attachment.uploadId,\n reusedUploadId: true,\n });\n return {\n id: attachment.uploadId,\n url: attachment.url || '',\n path: '',\n name: attachment.filename,\n mimetype: attachment.mimeType,\n size: attachment.sizeBytes,\n };\n }\n\n logAttachmentLifecycle('attachment_decode_start', {\n sessionId: context.sessionId,\n attachmentIndex: context.attachmentIndex,\n attachmentKey: attachment.clientKey,\n filename: attachment.filename,\n hasBase64Data: Boolean(attachment.base64Data && attachment.base64Data.trim().length > 0),\n hasURL: Boolean(attachment.url),\n });\n\n let file: File;\n try {\n const rawFile = await attachmentToFile(attachment);\n file = await normalizeAttachmentFile(attachment, rawFile);\n validateAttachmentFile(file);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown attachment decode/validation error';\n logAttachmentLifecycle('attachment_decode_fail', {\n sessionId: context.sessionId,\n attachmentIndex: context.attachmentIndex,\n attachmentKey: attachment.clientKey,\n filename: attachment.filename,\n error: message,\n });\n throw new Error(message);\n }\n\n logAttachmentLifecycle('attachment_upload_start', {\n sessionId: context.sessionId,\n attachmentIndex: context.attachmentIndex,\n attachmentKey: attachment.clientKey,\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n });\n\n try {\n const upload = await uploadFileFn(file);\n // TODO: Refactor to return updated attachment instead of mutating; callers currently rely on this in-place update.\n attachment.uploadId = upload.id;\n attachment.mimeType = upload.mimetype || file.type;\n attachment.filename = upload.name || file.name;\n attachment.sizeBytes = upload.size || file.size;\n logAttachmentLifecycle('attachment_upload_success', {\n sessionId: context.sessionId,\n attachmentIndex: context.attachmentIndex,\n attachmentKey: attachment.clientKey,\n filename: attachment.filename,\n uploadId: upload.id,\n reusedUploadId: false,\n });\n return upload;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown upload error';\n logAttachmentLifecycle('attachment_upload_fail', {\n sessionId: context.sessionId,\n attachmentIndex: context.attachmentIndex,\n attachmentKey: attachment.clientKey,\n filename: file.name,\n error: message,\n });\n throw new Error(`Attachment \"${attachment.filename}\" upload failed: ${message}`);\n }\n}\n","/**\n * Message sending, SSE streaming, and HITL question handling.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport type { BichatRPC } from './rpc.generated';\nimport type {\n ActiveRunDelivery,\n Attachment,\n StreamChunk,\n StreamStatus,\n QuestionAnswers,\n SendMessageOptions,\n AsyncRunAccepted,\n} from '../types';\nimport { parseBichatStream } from '../utils/sseParser';\nimport {\n STREAM_EVENT_TYPES,\n isTerminalEvent,\n} from '../utils/eventNames';\nimport { openManagedEventSource } from './openManagedEventSource';\nimport {\n ensureAttachmentUpload,\n assertUploadReferences,\n type CoreUploadResponse,\n} from './AttachmentUploader';\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n/**\n * Thrown by {@link subscribeRunEvents} when the underlying EventSource\n * emits `onerror` before the first event arrives within the\n * initial-connect grace window. Distinguishes boundary failures\n * (401 / 404 / 503) from transient mid-run flaps, which the browser's\n * native auto-reconnect continues to handle silently.\n */\nexport class RunEventsConnectError extends Error {\n readonly cause?: Event;\n constructor(message: string, cause?: Event) {\n super(message);\n this.name = 'RunEventsConnectError';\n this.cause = cause;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface Result<T> {\n success: boolean\n data?: T\n error?: string\n}\n\ntype RPCCaller = <TMethod extends keyof BichatRPC & string>(\n method: TMethod,\n params: BichatRPC[TMethod]['params']\n) => Promise<BichatRPC[TMethod]['result']>\n\ntype AttachmentLifecycleLogger = (\n event: 'stream_send_with_upload_ids',\n details: Record<string, unknown>\n) => void\n\nexport interface MessageTransportDeps {\n callRPC: RPCCaller\n baseUrl: string\n streamEndpoint: string\n rpcTimeoutMs: number\n streamConnectTimeoutMs?: number\n createHeaders: (additionalHeaders?: Record<string, string>) => Headers\n uploadFileFn: (file: File) => Promise<CoreUploadResponse>\n logAttachmentLifecycle: AttachmentLifecycleLogger\n}\n\n// ---------------------------------------------------------------------------\n// Request-id generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a UUID-ish idempotency key for a single send. Prefers\n * crypto.randomUUID when available (every evergreen browser + Node\n * 16.7+); falls back to a Math.random-based v4 string so the feature\n * still works in constrained WebViews.\n *\n * The resulting id is returned inline in the POST /stream body as\n * `requestId` so the backend's SetNX dedupe can collapse duplicates.\n *\n * Backend contract:\n * - Dedupe window is 30 minutes on SetNX (see SDK stream handler).\n * - UUID v4 is expected — the backend parses the value as\n * `uuid.UUID` via the Go stdlib, so malformed ids are rejected\n * at the boundary.\n * - A double-click or cross-tab retry that sends the same\n * `requestId` converges on the same run; the second call returns\n * the existing run's `runId` instead of spawning a duplicate.\n */\nfunction generateRequestId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n // RFC 4122 v4 fallback. Not cryptographically strong, but sufficient\n // for idempotency keys that live < 30 min.\n const bytes = new Uint8Array(16);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Stream sending\n// ---------------------------------------------------------------------------\n\nexport async function* sendMessage(\n deps: MessageTransportDeps,\n sessionId: string,\n content: string,\n attachments: Attachment[] = [],\n signal?: AbortSignal,\n options?: SendMessageOptions\n): AsyncGenerator<StreamChunk> {\n // Create new abort controller for this stream\n const abortController = new AbortController();\n\n // Link external signal if provided, with cleanup\n let onExternalAbort: (() => void) | undefined;\n if (signal) {\n onExternalAbort = () => { abortController.abort(); };\n signal.addEventListener('abort', onExternalAbort);\n }\n\n const url = `${deps.baseUrl}${deps.streamEndpoint}`;\n\n let connectionTimeoutID: ReturnType<typeof setTimeout> | undefined;\n let connectionTimedOut = false;\n try {\n const uploads = await Promise.all(\n attachments.map((attachment, attachmentIndex) =>\n ensureAttachmentUpload(\n attachment,\n { sessionId, attachmentIndex },\n deps.uploadFileFn,\n )\n )\n );\n const streamAttachments = assertUploadReferences(uploads);\n deps.logAttachmentLifecycle('stream_send_with_upload_ids', {\n sessionId,\n attachmentCount: streamAttachments.length,\n });\n // Idempotency: one request_id per send, client-generated unless\n // the caller provided a deterministic one (e.g. retry flow). The\n // backend dedupes duplicates within a ~30 min window so a double\n // click / tab-level retry converges on the same run. Falls back to\n // a stable pseudo-id on environments that lack crypto.randomUUID.\n const requestId = options?.requestId ?? generateRequestId();\n const payload: Record<string, unknown> = {\n sessionId,\n content,\n debugMode: options?.debugMode ?? false,\n replaceFromMessageId: options?.replaceFromMessageID,\n attachments: streamAttachments,\n requestId,\n };\n if (options?.reasoningEffort) {\n payload.reasoningEffort = options.reasoningEffort;\n }\n if (options?.model) {\n payload.model = options.model;\n }\n\n const timeoutMs = deps.streamConnectTimeoutMs ?? 0;\n if (timeoutMs > 0) {\n connectionTimeoutID = setTimeout(() => {\n connectionTimedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: deps.createHeaders(),\n body: JSON.stringify(payload),\n signal: abortController.signal,\n });\n if (connectionTimeoutID !== undefined) {\n clearTimeout(connectionTimeoutID);\n connectionTimeoutID = undefined;\n }\n\n if (!response.ok) {\n throw new Error(`Stream request failed: HTTP ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n\n for await (const chunk of parseBichatStream(reader)) {\n yield chunk;\n\n if (chunk.type === 'done' || chunk.type === 'error') {\n return;\n }\n }\n } catch (err) {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n // A connection timeout is a genuine failure — surface it as an error\n // chunk. A user-initiated stop or a provider unmount, however, must\n // stay an AbortError so the machine takes its soft-cancel path (restore\n // input, no error banner) instead of treating the send as failed and\n // discarding the turn. Re-throw to preserve the error's identity;\n // yielding an error chunk here would flatten it into a generic Error.\n if (connectionTimedOut) {\n yield {\n type: 'error',\n error: `Stream request timed out after ${deps.streamConnectTimeoutMs}ms`,\n };\n } else {\n throw err;\n }\n } else {\n yield {\n type: 'error',\n error: err.message,\n };\n }\n } else {\n yield {\n type: 'error',\n error: 'Unknown error',\n };\n }\n } finally {\n if (connectionTimeoutID !== undefined) {\n clearTimeout(connectionTimeoutID);\n }\n if (signal && onExternalAbort) {\n signal.removeEventListener('abort', onExternalAbort);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stop stream (explicit stop — backend discards partial assistant message)\n// ---------------------------------------------------------------------------\n\nfunction buildStreamUrl(\n deps: Pick<MessageTransportDeps, 'baseUrl' | 'streamEndpoint'>,\n path: string\n): string {\n const base = deps.baseUrl.replace(/\\/+$/, '');\n const streamPath = deps.streamEndpoint.replace(/\\/$/, '');\n return `${base}${streamPath}${path}`;\n}\n\nconst DEFAULT_STOP_STREAM_TIMEOUT_MS = 5000;\n\nexport async function stopStream(\n deps: Pick<MessageTransportDeps, 'baseUrl' | 'streamEndpoint' | 'createHeaders'> & { timeoutMs?: number },\n sessionId: string\n): Promise<void> {\n const timeoutMs = deps.timeoutMs ?? DEFAULT_STOP_STREAM_TIMEOUT_MS;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const stopUrl = buildStreamUrl(deps, '/stop');\n const response = await fetch(stopUrl, {\n method: 'POST',\n headers: deps.createHeaders(),\n body: JSON.stringify({ sessionId }),\n signal: controller.signal,\n });\n if (!response.ok) {\n console.warn('Stop stream request failed:', response.status);\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n console.warn('Stop stream request timed out');\n } else {\n throw err;\n }\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream status and resume (refresh-safe)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STREAM_STATUS_TIMEOUT_MS = 5000;\n\ntype StreamStatusResumeDeps = Pick<\n MessageTransportDeps,\n 'baseUrl' | 'streamEndpoint' | 'createHeaders'\n> & { timeoutMs?: number; connectTimeoutMs?: number }\n\nexport async function getStreamStatus(\n deps: StreamStatusResumeDeps,\n sessionId: string\n): Promise<StreamStatus | null> {\n const timeoutMs = deps.timeoutMs ?? DEFAULT_STREAM_STATUS_TIMEOUT_MS;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const url = buildStreamUrl(deps, `/status?sessionId=${encodeURIComponent(sessionId)}`);\n const response = await fetch(url, {\n method: 'GET',\n headers: deps.createHeaders(),\n signal: controller.signal,\n });\n if (!response.ok) {\n if (response.status === 404) {\n return null;\n }\n console.warn('Stream status request failed:', response.status);\n return null;\n }\n const data = (await response.json()) as StreamStatus;\n return data;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return null;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nexport async function resumeStream(\n deps: StreamStatusResumeDeps,\n sessionId: string,\n runId: string,\n onChunk: (chunk: StreamChunk) => void,\n signal?: AbortSignal\n): Promise<void> {\n const url = buildStreamUrl(deps, '/resume');\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutMs = deps.connectTimeoutMs;\n if (timeoutMs != null && timeoutMs > 0) {\n timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n }\n if (signal) {\n signal.addEventListener('abort', () => controller.abort());\n }\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: deps.createHeaders(),\n body: JSON.stringify({ sessionId, runId }),\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(`Resume stream failed: HTTP ${response.status}`);\n }\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n if (!response.body) {\n throw new Error('Resume response body is null');\n }\n const reader = response.body.getReader();\n for await (const chunk of parseBichatStream(reader)) {\n onChunk(chunk);\n if (chunk.type === 'done' || chunk.type === 'error') {\n return;\n }\n }\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cursor-based event tail (Last-Event-ID reconnect)\n// ---------------------------------------------------------------------------\n\ntype StreamEventsDeps = Pick<\n MessageTransportDeps,\n 'baseUrl' | 'streamEndpoint'\n>\n\nexport interface SubscribeRunEventsOptions {\n /** When set, start from the last seen event id instead of a full replay. */\n lastEventId?: string;\n /** Fires for every chunk (content / tool / snapshot / done / error / …). */\n onChunk: (chunk: StreamChunk) => void;\n /** Optional hook for raw SSE errors (connection blips, parse failures). */\n onError?: (event: Event) => void;\n /** AbortSignal closes the underlying EventSource. */\n signal?: AbortSignal;\n}\n\n/**\n * Open a native EventSource against GET /stream/events for a run. The\n * browser handles reconnect + Last-Event-ID automatically on transient\n * network drops; we forward each SSE event onto onChunk and resolve the\n * returned promise when a terminal event (done / error) arrives or the\n * caller aborts.\n *\n * Kept separate from sendMessage so the applet can connect to a run\n * that was started by another tab (shared request_id) or that the\n * current session already had in flight (tab reopen, device switch).\n */\nexport function subscribeRunEvents(\n deps: StreamEventsDeps,\n sessionId: string,\n runId: string,\n options: SubscribeRunEventsOptions\n): Promise<void> {\n const base = buildStreamUrl(deps, '/events');\n const qs = new URLSearchParams({ sessionId, runId });\n const url = `${base}?${qs.toString()}`;\n\n // EventSource ignores custom headers in most browsers, so we leave\n // auth to the cookie that backs the session. Last-Event-ID is only\n // honoured by native reconnects — when the caller explicitly\n // supplies one (first connect after a known cursor) we append it as\n // a query parameter the server reads as a fallback. Native\n // reconnect adds the real `Last-Event-ID` header for subsequent\n // drops.\n const withCursor = options.lastEventId\n ? `${url}&${new URLSearchParams({ lastEventId: options.lastEventId }).toString()}`\n : url;\n\n // Track whether the caller has already received a terminal chunk —\n // openManagedEventSource only closes on abort or initial-connect\n // error, so we drive the settle handshake through AbortController.\n const settleController = new AbortController();\n if (options.signal) {\n if (options.signal.aborted) {\n settleController.abort();\n } else {\n options.signal.addEventListener('abort', () => settleController.abort(), {\n once: true,\n });\n }\n }\n\n return openManagedEventSource({\n url: withCursor,\n events: STREAM_EVENT_TYPES,\n withCredentials: true,\n signal: settleController.signal,\n onError: options.onError,\n onConnectError: (evt) =>\n new RunEventsConnectError(\n 'EventSource failed to connect before first event',\n evt,\n ),\n onMessage: (name, data) => {\n if (\n typeof data === 'object' &&\n data !== null &&\n (data as { __unparseable?: boolean }).__unparseable\n ) {\n // Surface parse failures as synthetic error chunks but keep\n // the stream open — native EventSource reconnects on transient\n // flaps.\n options.onChunk({\n type: 'error',\n error: `Failed to parse event: ${(data as { raw: string }).raw}`,\n });\n return;\n }\n // Some server payloads omit `type` because it duplicates the SSE\n // event name; back-fill it so downstream consumers can rely on\n // StreamChunk.type being populated.\n const parsed = data as Partial<StreamChunk> & Record<string, unknown>;\n if (!parsed.type) {\n parsed.type = name as StreamChunk['type'];\n }\n options.onChunk(parsed as StreamChunk);\n if (isTerminalEvent(name) || isTerminalEvent(String(parsed.type))) {\n settleController.abort();\n }\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Active-run sidebar fan-out (per-tenant status SSE)\n// ---------------------------------------------------------------------------\n\nexport interface SubscribeActiveRunsOptions {\n onEvent: (event: ActiveRunDelivery) => void;\n onError?: (event: Event) => void;\n signal?: AbortSignal;\n}\n\n/**\n * Open an EventSource to the per-tenant active-run feed. Emits one\n * \"snapshot\" row per currently-running session on connect then live\n * \"update\" deltas as runs transition. Used by the chat list to render\n * a status dot without polling each session.\n *\n * Never resolves on its own — the caller should abort via the signal\n * when the component unmounts; the returned promise only settles on\n * signal abort or initial-connect failure.\n */\nexport function subscribeActiveRuns(\n deps: StreamEventsDeps,\n options: SubscribeActiveRunsOptions\n): Promise<void> {\n const url = buildStreamUrl(deps, '/active-runs');\n return openManagedEventSource({\n url,\n events: ['snapshot', 'update'],\n withCredentials: true,\n signal: options.signal,\n onError: options.onError,\n onMessage: (name, data) => {\n if (\n typeof data !== 'object' ||\n data === null ||\n (data as { __unparseable?: boolean }).__unparseable\n ) {\n // Server contract guarantees JSON; silently skip malformed\n // frames rather than surfacing them as fake entries.\n return;\n }\n const body = data as Omit<ActiveRunDelivery, 'event'>;\n options.onEvent({ event: name as ActiveRunDelivery['event'], ...body });\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Question submission / rejection\n// ---------------------------------------------------------------------------\n\nexport async function submitQuestionAnswers(\n callRPC: RPCCaller,\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n): Promise<Result<AsyncRunAccepted>> {\n try {\n // Convert QuestionAnswers to flat map[string]string for RPC\n const flatAnswers: Record<string, string> = {};\n for (const [qId, answerData] of Object.entries(answers)) {\n if (answerData.customText) {\n flatAnswers[qId] = answerData.customText;\n } else if (answerData.options.length > 0) {\n flatAnswers[qId] = answerData.options.join(', ');\n }\n }\n const result = await callRPC('bichat.question.submit', {\n sessionId,\n checkpointId: questionId,\n answers: flatAnswers,\n });\n return {\n success: true,\n data: normalizeAsyncRunAccepted(result),\n };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };\n }\n}\n\nexport async function rejectPendingQuestion(\n callRPC: RPCCaller,\n sessionId: string\n): Promise<Result<AsyncRunAccepted>> {\n try {\n const result = await callRPC('bichat.question.reject', { sessionId });\n return { success: true, data: normalizeAsyncRunAccepted(result) };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };\n }\n}\n\nfunction isAsyncRunOperation(value: string): value is AsyncRunAccepted['operation'] {\n return value === 'question_submit' || value === 'question_reject' || value === 'session_compact';\n}\n\nfunction normalizeAsyncRunAccepted(input: {\n accepted: boolean\n operation: string\n sessionId: string\n runId: string\n startedAt: number\n}): AsyncRunAccepted {\n if (!input.accepted) {\n throw new Error('Async run request was not accepted');\n }\n if (!isAsyncRunOperation(input.operation)) {\n throw new Error(`Unexpected async operation: ${input.operation}`);\n }\n if (!input.sessionId || !input.runId) {\n throw new Error('Missing async run metadata');\n }\n return {\n accepted: true,\n operation: input.operation,\n sessionId: input.sessionId,\n runId: input.runId,\n startedAt: input.startedAt,\n };\n}\n","/**\n * Session artifact CRUD: fetch, upload, rename, delete artifacts.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport type { BichatRPC } from './rpc.generated';\nimport type { SessionArtifact } from '../types';\nimport { validateAttachmentFile, validateFileCount } from '../utils/fileUtils';\nimport { toSessionArtifact, type RPCArtifact } from './mappers';\nimport type { CoreUploadResponse } from './AttachmentUploader';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype RPCCaller = <TMethod extends keyof BichatRPC & string>(\n method: TMethod,\n params: BichatRPC[TMethod]['params']\n) => Promise<BichatRPC[TMethod]['result']>\n\n// ---------------------------------------------------------------------------\n// Artifact operations\n// ---------------------------------------------------------------------------\n\nexport async function fetchSessionArtifacts(\n callRPC: RPCCaller,\n sessionId: string,\n options?: { limit?: number; offset?: number }\n): Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }> {\n const limit = options?.limit ?? 50;\n const offset = options?.offset ?? 0;\n const data = await callRPC('bichat.session.artifacts', {\n sessionId,\n limit,\n offset,\n });\n\n const artifacts = (data.artifacts || []).map((artifact) => toSessionArtifact(artifact));\n const hasMore =\n typeof data.hasMore === 'boolean'\n ? data.hasMore\n : artifacts.length >= limit;\n const nextOffset =\n typeof data.nextOffset === 'number'\n ? data.nextOffset\n : offset + artifacts.length;\n\n return {\n artifacts,\n hasMore,\n nextOffset,\n };\n}\n\nexport async function uploadSessionArtifacts(\n callRPC: RPCCaller,\n sessionId: string,\n files: File[],\n uploadFileFn: (file: File) => Promise<CoreUploadResponse>,\n): Promise<{ artifacts: SessionArtifact[] }> {\n if (!Array.isArray(files) || files.length === 0) {\n return { artifacts: [] };\n }\n\n validateFileCount(0, files.length, 10);\n files.forEach((file) => validateAttachmentFile(file));\n const uploads = await Promise.all(files.map((file) => uploadFileFn(file)));\n\n const data = await callRPC('bichat.session.uploadArtifacts', {\n sessionId,\n attachments: uploads.map((upload) => ({\n id: String(upload.id),\n filename: upload.name,\n uploadId: upload.id,\n mimeType: upload.mimetype || 'application/octet-stream',\n sizeBytes: upload.size,\n url: upload.url,\n })),\n });\n\n return {\n artifacts: (data.artifacts || []).map((artifact) => toSessionArtifact(artifact)),\n };\n}\n\nexport async function renameSessionArtifact(\n callRPC: RPCCaller,\n artifactId: string,\n name: string,\n description: string = ''\n): Promise<SessionArtifact> {\n const data = await callRPC('bichat.artifact.update', {\n id: artifactId,\n name,\n description,\n });\n return toSessionArtifact(data.artifact as RPCArtifact);\n}\n\nexport async function deleteSessionArtifact(\n callRPC: RPCCaller,\n artifactId: string\n): Promise<void> {\n await callRPC('bichat.artifact.delete', { id: artifactId });\n}\n","/**\n * Built-in HTTP data source with SSE streaming and AbortController\n * Implements ChatDataSource interface with real HTTP/RPC calls\n *\n * Uses turn-based architecture - fetches ConversationTurns instead of flat messages.\n *\n * This file is a thin facade that delegates to focused internal modules:\n * - SessionManager.ts — session CRUD (create, list, get, delete, archive, pin)\n * - MessageTransport.ts — send messages, stream responses, HITL questions\n * - ArtifactManager.ts — artifact fetch, upload, rename, delete\n * - AttachmentUploader.ts — file decode, normalize, upload\n * - mappers.ts — RPC-to-domain type mapping and sanitization\n */\n\nimport { createAppletRPCClient } from '../../applet-host';\nimport type { BichatRPC } from './rpc.generated';\nimport type {\n ChatDataSource,\n Session,\n SessionMember,\n SessionListResult,\n SessionUser,\n SessionArtifact,\n Attachment,\n StreamChunk,\n StreamStatus,\n QuestionAnswers,\n SendMessageOptions,\n AsyncRunAccepted,\n} from '../types';\n\nimport * as Sessions from './SessionManager';\nimport type { SessionState } from './SessionManager';\nimport * as Messages from './MessageTransport';\nimport * as Artifacts from './ArtifactManager';\nimport { uploadFile } from './AttachmentUploader';\n\nexport interface HttpDataSourceConfig {\n baseUrl: string\n rpcEndpoint: string\n streamEndpoint?: string\n uploadEndpoint?: string\n csrfToken?: string | (() => string)\n headers?: Record<string, string>\n rpcTimeoutMs?: number\n streamConnectTimeoutMs?: number\n}\n\nexport class HttpDataSource implements ChatDataSource {\n private config: HttpDataSourceConfig;\n private abortController: AbortController | null = null;\n private rpc: ReturnType<typeof createAppletRPCClient>;\n\n constructor(config: HttpDataSourceConfig) {\n this.config = {\n streamEndpoint: '/stream',\n uploadEndpoint: '/api/uploads',\n ...config,\n rpcTimeoutMs: typeof config.rpcTimeoutMs === 'number' ? config.rpcTimeoutMs : 120000,\n streamConnectTimeoutMs: typeof config.streamConnectTimeoutMs === 'number'\n ? config.streamConnectTimeoutMs\n : undefined,\n };\n this.rpc = createAppletRPCClient({\n endpoint: `${this.config.baseUrl}${this.config.rpcEndpoint}`,\n timeoutMs: this.config.rpcTimeoutMs,\n });\n }\n\n // -------------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------------\n\n private getCSRFToken(): string {\n if (!this.config.csrfToken) {return '';}\n return typeof this.config.csrfToken === 'function'\n ? this.config.csrfToken()\n : this.config.csrfToken;\n }\n\n private createHeaders(additionalHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...additionalHeaders,\n });\n const csrfToken = this.getCSRFToken();\n if (csrfToken) {headers.set('X-CSRF-Token', csrfToken);}\n return headers;\n }\n\n private createUploadHeaders(additionalHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n ...this.config.headers,\n ...additionalHeaders,\n });\n const csrfToken = this.getCSRFToken();\n if (csrfToken) {headers.set('X-CSRF-Token', csrfToken);}\n headers.delete('Content-Type');\n return headers;\n }\n\n private callRPC<TMethod extends keyof BichatRPC & string>(\n method: TMethod,\n params: BichatRPC[TMethod]['params']\n ): Promise<BichatRPC[TMethod]['result']> {\n return this.rpc.callTyped<BichatRPC, TMethod>(method, params);\n }\n\n private boundCallRPC = <TMethod extends keyof BichatRPC & string>(\n method: TMethod,\n params: BichatRPC[TMethod]['params']\n ): Promise<BichatRPC[TMethod]['result']> => {\n return this.callRPC(method, params);\n };\n\n private boundUploadFile = (file: File) => {\n return uploadFile(\n file,\n this.config.baseUrl,\n this.config.uploadEndpoint!,\n () => this.createUploadHeaders(),\n );\n };\n\n // -------------------------------------------------------------------------\n // Session management (delegates to SessionManager)\n // -------------------------------------------------------------------------\n\n async createSession(): Promise<Session> {\n return Sessions.createSession(this.boundCallRPC);\n }\n\n async fetchSession(id: string): Promise<SessionState | null> {\n return Sessions.fetchSession(\n id,\n this.boundCallRPC,\n (sessionId, options) => this.fetchSessionArtifacts(sessionId, options),\n );\n }\n\n async listSessions(options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n }): Promise<SessionListResult> {\n return Sessions.listSessions(this.boundCallRPC, options);\n }\n\n async archiveSession(sessionId: string): Promise<Session> {\n return Sessions.archiveSession(this.boundCallRPC, sessionId);\n }\n\n async unarchiveSession(sessionId: string): Promise<Session> {\n return Sessions.unarchiveSession(this.boundCallRPC, sessionId);\n }\n\n async pinSession(sessionId: string): Promise<Session> {\n return Sessions.pinSession(this.boundCallRPC, sessionId);\n }\n\n async unpinSession(sessionId: string): Promise<Session> {\n return Sessions.unpinSession(this.boundCallRPC, sessionId);\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n return Sessions.deleteSession(this.boundCallRPC, sessionId);\n }\n\n async renameSession(sessionId: string, title: string): Promise<Session> {\n return Sessions.renameSession(this.boundCallRPC, sessionId, title);\n }\n\n async regenerateSessionTitle(sessionId: string): Promise<Session> {\n return Sessions.regenerateSessionTitle(this.boundCallRPC, sessionId);\n }\n\n async clearSessionHistory(sessionId: string): Promise<{\n success: boolean\n deletedMessages: number\n deletedArtifacts: number\n }> {\n return Sessions.clearSessionHistory(this.boundCallRPC, sessionId);\n }\n\n async compactSessionHistory(sessionId: string): Promise<AsyncRunAccepted> {\n return Sessions.compactSessionHistory(this.boundCallRPC, sessionId);\n }\n\n async listUsers(): Promise<SessionUser[]> {\n return Sessions.listUsers(this.boundCallRPC);\n }\n\n async listAllSessions(options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n userId?: string | null\n }): Promise<{\n sessions: Session[]\n total: number\n hasMore: boolean\n }> {\n return Sessions.listAllSessions(this.boundCallRPC, options);\n }\n\n async listSessionMembers(sessionId: string): Promise<SessionMember[]> {\n return Sessions.listSessionMembers(this.boundCallRPC, sessionId);\n }\n\n async addSessionMember(sessionId: string, userId: string, role: 'editor' | 'viewer'): Promise<void> {\n return Sessions.addSessionMember(this.boundCallRPC, sessionId, userId, role);\n }\n\n async updateSessionMemberRole(sessionId: string, userId: string, role: 'editor' | 'viewer'): Promise<void> {\n return Sessions.updateSessionMemberRole(this.boundCallRPC, sessionId, userId, role);\n }\n\n async removeSessionMember(sessionId: string, userId: string): Promise<void> {\n return Sessions.removeSessionMember(this.boundCallRPC, sessionId, userId);\n }\n\n // -------------------------------------------------------------------------\n // Message transport (delegates to MessageTransport)\n // -------------------------------------------------------------------------\n\n async stopGeneration(sessionId: string): Promise<void> {\n this.cancelStream();\n await Messages.stopStream(\n {\n baseUrl: this.config.baseUrl,\n streamEndpoint: this.config.streamEndpoint!,\n createHeaders: (h) => this.createHeaders(h),\n },\n sessionId\n );\n }\n\n async getStreamStatus(sessionId: string): Promise<StreamStatus | null> {\n return Messages.getStreamStatus(\n {\n baseUrl: this.config.baseUrl,\n streamEndpoint: this.config.streamEndpoint!,\n createHeaders: (h) => this.createHeaders(h),\n timeoutMs: this.config.rpcTimeoutMs,\n },\n sessionId\n );\n }\n\n async resumeStream(\n sessionId: string,\n runId: string,\n onChunk: (chunk: StreamChunk) => void,\n signal?: AbortSignal\n ): Promise<void> {\n await Messages.resumeStream(\n {\n baseUrl: this.config.baseUrl,\n streamEndpoint: this.config.streamEndpoint!,\n createHeaders: (h) => this.createHeaders(h),\n connectTimeoutMs: this.config.streamConnectTimeoutMs,\n },\n sessionId,\n runId,\n onChunk,\n signal\n );\n }\n\n /**\n * Open a native EventSource against GET /stream/events for the given\n * run. Used by components that want browser-native auto-reconnect\n * with Last-Event-ID (tab close, wifi drop, device switch). Prefer\n * over resumeStream when tailing an already-running generation that\n * another tab started.\n */\n subscribeRunEvents(\n sessionId: string,\n runId: string,\n options: Messages.SubscribeRunEventsOptions\n ): Promise<void> {\n return Messages.subscribeRunEvents(\n {\n baseUrl: this.config.baseUrl,\n streamEndpoint: this.config.streamEndpoint!,\n },\n sessionId,\n runId,\n options\n );\n }\n\n /**\n * Subscribe to the per-tenant active-run fan-out\n * (GET /stream/active-runs). Never resolves until the caller aborts\n * via the signal; use from a top-level component (sidebar container)\n * that mounts for the lifetime of the chat app.\n */\n subscribeActiveRuns(\n options: Messages.SubscribeActiveRunsOptions\n ): Promise<void> {\n return Messages.subscribeActiveRuns(\n {\n baseUrl: this.config.baseUrl,\n streamEndpoint: this.config.streamEndpoint!,\n },\n options\n );\n }\n\n async *sendMessage(\n sessionId: string,\n content: string,\n attachments: Attachment[] = [],\n signal?: AbortSignal,\n options?: SendMessageOptions\n ): AsyncGenerator<StreamChunk> {\n this.abortController = new AbortController();\n\n // Link external signal to our internal controller\n let onExternalAbort: (() => void) | undefined;\n if (signal) {\n onExternalAbort = () => { this.abortController?.abort(); };\n signal.addEventListener('abort', onExternalAbort);\n }\n\n try {\n const innerSignal = this.abortController.signal;\n yield* Messages.sendMessage(\n {\n callRPC: this.boundCallRPC,\n baseUrl: this.config.baseUrl,\n streamEndpoint: this.config.streamEndpoint!,\n rpcTimeoutMs: this.config.rpcTimeoutMs!,\n streamConnectTimeoutMs: this.config.streamConnectTimeoutMs,\n createHeaders: (additional) => this.createHeaders(additional),\n uploadFileFn: this.boundUploadFile,\n logAttachmentLifecycle: () => {\n // lifecycle events handled inside AttachmentUploader\n },\n },\n sessionId,\n content,\n attachments,\n innerSignal,\n options\n );\n } finally {\n if (signal && onExternalAbort) {\n signal.removeEventListener('abort', onExternalAbort);\n }\n this.abortController = null;\n }\n }\n\n cancelStream(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n }\n\n async submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<{\n success: boolean\n data?: AsyncRunAccepted\n error?: string\n }> {\n return Messages.submitQuestionAnswers(this.boundCallRPC, sessionId, questionId, answers);\n }\n\n async rejectPendingQuestion(sessionId: string): Promise<{ success: boolean; data?: AsyncRunAccepted; error?: string }> {\n return Messages.rejectPendingQuestion(this.boundCallRPC, sessionId);\n }\n\n // -------------------------------------------------------------------------\n // Artifact management (delegates to ArtifactManager)\n // -------------------------------------------------------------------------\n\n async fetchSessionArtifacts(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }> {\n return Artifacts.fetchSessionArtifacts(this.boundCallRPC, sessionId, options);\n }\n\n async uploadSessionArtifacts(\n sessionId: string,\n files: File[]\n ): Promise<{ artifacts: SessionArtifact[] }> {\n return Artifacts.uploadSessionArtifacts(\n this.boundCallRPC,\n sessionId,\n files,\n this.boundUploadFile,\n );\n }\n\n async renameSessionArtifact(\n artifactId: string,\n name: string,\n description: string = ''\n ): Promise<SessionArtifact> {\n return Artifacts.renameSessionArtifact(this.boundCallRPC, artifactId, name, description);\n }\n\n async deleteSessionArtifact(artifactId: string): Promise<void> {\n return Artifacts.deleteSessionArtifact(this.boundCallRPC, artifactId);\n }\n\n}\n\n/**\n * Factory function to create HttpDataSource\n */\nexport function createHttpDataSource(config: HttpDataSourceConfig): ChatDataSource {\n return new HttpDataSource(config);\n}\n","/**\n * Utilities for splitting accumulated assistant content into the distinct\n * text blocks the server emitted.\n *\n * Background: the executor interleaves text with tool calls within one\n * turn — `text → tool_call → text → tool_call → final_text`. Before the\n * backend emitted `text_block_end` markers (iota-uz/iota-sdk#732 M1),\n * all text segments collapsed into one paragraph on the client. Now the\n * server emits a `text_block_end` event before each tool_start and at\n * snapshot time carries byte offsets in `partialMetadata.text_block_offsets`.\n *\n * `splitIntoTextBlocks` is the client-side inverse: given the\n * accumulated content string and the ordered list of byte offsets that\n * mark segment ends, return one entry per segment. The trailing un-closed\n * segment (if any) is included as the last entry.\n */\n\nexport interface AssistantTextBlock {\n /** Zero-based index matching the seq carried on text_block_end events. */\n seq: number;\n /** Markdown source for this segment. */\n content: string;\n}\n\n/**\n * Split an accumulated assistant content string into blocks using byte\n * offsets emitted by the server. Offsets are EXCLUSIVE end markers —\n * i.e. `offsets[0]` is the length of block 0.\n *\n * - When `offsets` is empty or undefined, returns a single block with\n * the full content.\n * - When offsets are provided but content is shorter than the last\n * offset (e.g. stale metadata), offsets beyond the content length are\n * clamped so no crash propagates up.\n * - Trailing content after the last offset is included as an extra\n * block (the un-closed segment during streaming / the final segment\n * after the last tool call).\n */\nexport function splitIntoTextBlocks(\n content: string,\n offsets?: ReadonlyArray<number> | null\n): AssistantTextBlock[] {\n if (!content) {\n return [];\n }\n if (!offsets || offsets.length === 0) {\n return [{ seq: 0, content }];\n }\n\n const sanitized = [...offsets]\n .map((n) => Math.max(0, Math.min(Math.floor(n), content.length)))\n .sort((a, b) => a - b);\n\n const blocks: AssistantTextBlock[] = [];\n let cursor = 0;\n for (let i = 0; i < sanitized.length; i++) {\n const end = sanitized[i];\n if (end <= cursor) {\n continue;\n }\n const slice = content.slice(cursor, end);\n if (slice) {\n blocks.push({ seq: blocks.length, content: slice });\n }\n cursor = end;\n }\n if (cursor < content.length) {\n blocks.push({ seq: blocks.length, content: content.slice(cursor) });\n }\n return blocks;\n}\n\n/**\n * Normalise partialMetadata.text_block_offsets from a StreamSnapshotPayload\n * into a number[]. Guards against malformed server data (non-array,\n * non-numeric entries) so UI code never has to think about shapes.\n */\nexport function readTextBlockOffsets(\n partialMetadata?: Record<string, unknown> | null\n): number[] {\n if (!partialMetadata) {\n return [];\n }\n const raw = partialMetadata[\"text_block_offsets\"];\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: number[] = [];\n for (const entry of raw) {\n if (typeof entry === \"number\" && Number.isFinite(entry) && entry >= 0) {\n out.push(Math.floor(entry));\n }\n }\n return out;\n}\n"]}
|