@burtson-labs/bandit-engine 2.0.53 → 2.0.54
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/README.md +23 -12
- package/dist/{chat-U4SE4JQK.mjs → chat-IDE6Z4Q4.mjs} +4 -4
- package/dist/{chunk-EULV5CHD.mjs → chunk-KM7FUWCM.mjs} +4 -4
- package/dist/chunk-KM7FUWCM.mjs.map +1 -0
- package/dist/{chunk-NZKLKZJT.mjs → chunk-KNBWR4DS.mjs} +773 -486
- package/dist/chunk-KNBWR4DS.mjs.map +1 -0
- package/dist/{chunk-O54PTFJM.mjs → chunk-NP2OHTTX.mjs} +113 -149
- package/dist/chunk-NP2OHTTX.mjs.map +1 -0
- package/dist/{chunk-GNE4TTSI.mjs → chunk-TLY6A6XL.mjs} +78 -135
- package/dist/chunk-TLY6A6XL.mjs.map +1 -0
- package/dist/{chunk-2BGORTWS.mjs → chunk-WL7NV4WJ.mjs} +26 -30
- package/dist/chunk-WL7NV4WJ.mjs.map +1 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4045 -4034
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -11
- package/dist/index.mjs.map +1 -1
- package/dist/management/management.js +4016 -4005
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +4 -4
- package/dist/modals/chat-modal/chat-modal.js +1384 -1270
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +2 -2
- package/dist/{gateway-C5T5FfCy.d.mts → public-BzsEWB08.d.mts} +2 -145
- package/dist/{gateway-C5T5FfCy.d.ts → public-BzsEWB08.d.ts} +2 -145
- package/dist/public-types.d.mts +2 -32
- package/dist/public-types.d.ts +2 -32
- package/package.json +3 -11
- package/dist/chunk-2BGORTWS.mjs.map +0 -1
- package/dist/chunk-EULV5CHD.mjs.map +0 -1
- package/dist/chunk-GNE4TTSI.mjs.map +0 -1
- package/dist/chunk-NZKLKZJT.mjs.map +0 -1
- package/dist/chunk-O54PTFJM.mjs.map +0 -1
- package/dist/cli.js +0 -4084
- package/dist/cli.js.map +0 -1
- /package/dist/{chat-U4SE4JQK.mjs.map → chat-IDE6Z4Q4.mjs.map} +0 -0
package/README.md
CHANGED
|
@@ -17,19 +17,30 @@ An AI chat toolkit built for speed, design, and control. Power branded AI assist
|
|
|
17
17
|
[](./LICENSE)
|
|
18
18
|
|
|
19
19
|
## Features
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
20
|
+
- Plug-and-play React chat, modal, and management surfaces
|
|
21
|
+
- Memory, searchable knowledge, and provider switching behind a secure gateway
|
|
22
|
+
- Full MUI theming, dark mode, and branding controls out of the box
|
|
23
|
+
- Multimodal support (voice, images, documents) with Bandit AI, Ollama, OpenAI, Azure OpenAI, Anthropic, and xAI today — tell us which providers you need next so we can prioritize them
|
|
24
|
+
- CLI scaffolding, sample gateway, and docs to launch in minutes
|
|
25
25
|
|
|
26
26
|
Bandit keeps confidentiality, integrity, and availability front and center: data stays within your routes, answers stay auditable, and the UI falls back gracefully when a provider is unavailable.
|
|
27
27
|
|
|
28
|
+
## Bandit package ecosystem
|
|
29
|
+
|
|
30
|
+
This package is the core React engine. Related packages:
|
|
31
|
+
|
|
32
|
+
| Package | Purpose | Install weight |
|
|
33
|
+
|---------|---------|----------------|
|
|
34
|
+
| `@burtson-labs/bandit-engine` | React chat, modal, and management UI — this package | Full |
|
|
35
|
+
| [`@burtson-labs/bandit-cli`](https://banditailabs.com/npm-package) | Quickstart scaffolding CLI — `npx @burtson-labs/bandit-cli create` | Minimal (Node.js only) |
|
|
36
|
+
| [`@burtson-labs/bandit-themes`](https://banditailabs.com/npm-package) | MUI theme pack — use Bandit design tokens without the engine | MUI only |
|
|
37
|
+
| [`@burtson-labs/bandit-types`](https://banditailabs.com/npm-package) | Gateway contract type definitions — type your own gateway or server | Zero runtime deps |
|
|
38
|
+
|
|
28
39
|
## Quick Links
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
40
|
+
- Full docs: [banditailabs.com/npm-package](https://banditailabs.com/npm-package) (mirrors `/docs` in this repo)
|
|
41
|
+
- Live demo with OAuth sign-in: [banditailabs.com](https://banditailabs.com/)
|
|
42
|
+
- Playground (no auth required): [banditailabs.com/playground](https://banditailabs.com/playground)
|
|
43
|
+
- Sample gateway: [`examples/gateway-node`](./examples/gateway-node/README.md)
|
|
33
44
|
|
|
34
45
|
## Quick Start
|
|
35
46
|
|
|
@@ -38,7 +49,7 @@ Bandit keeps confidentiality, integrity, and availability front and center: data
|
|
|
38
49
|
Want a working playground instantly? Scaffold a Bandit app and gateway in one command:
|
|
39
50
|
|
|
40
51
|
```bash
|
|
41
|
-
npx @burtson-labs/bandit-
|
|
52
|
+
npx @burtson-labs/bandit-cli create my-bandit-app
|
|
42
53
|
```
|
|
43
54
|
|
|
44
55
|

|
|
@@ -58,9 +69,9 @@ Customize the output with options such as:
|
|
|
58
69
|
- `--yes` / `--skip-prompts` to accept defaults non-interactively
|
|
59
70
|
- `--force` to overwrite a non-empty directory
|
|
60
71
|
|
|
61
|
-
>
|
|
72
|
+
> The generated project installs directly from `https://registry.npmjs.org/` — no GitHub npm token is required once the package is public.
|
|
62
73
|
|
|
63
|
-
>
|
|
74
|
+
> The scaffolded gateway focuses on Bandit AI/OpenAI/xAI/Ollama chat and model discovery. All advanced routes (file storage uploads, vector embedding, voice, MCP, etc.) are generated as `501` placeholders so you can wire them to your own infrastructure. Implement the contracts below before turning on those features in production.
|
|
64
75
|
|
|
65
76
|
Check out the [CLI quick start guide](./docs/05_cli_quickstart.md) for the full walkthrough, option matrix, and project anatomy.
|
|
66
77
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chat_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TLY6A6XL.mjs";
|
|
4
4
|
import "./chunk-ONQMRE2G.mjs";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-KM7FUWCM.mjs";
|
|
6
6
|
import "./chunk-EHNWQ4T3.mjs";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-KNBWR4DS.mjs";
|
|
8
8
|
import "./chunk-557E5VZ2.mjs";
|
|
9
9
|
import "./chunk-7ZDS33S2.mjs";
|
|
10
10
|
import "./chunk-H3BYFEIE.mjs";
|
|
@@ -13,4 +13,4 @@ import "./chunk-BJTO5JO5.mjs";
|
|
|
13
13
|
export {
|
|
14
14
|
chat_default as default
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=chat-
|
|
16
|
+
//# sourceMappingURL=chat-IDE6Z4Q4.mjs.map
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
+
CheckIcon,
|
|
3
|
+
ContentCopyIcon,
|
|
2
4
|
getHighlightTree,
|
|
3
5
|
markdownSanitizeSchema,
|
|
4
6
|
renderLowlightChildren
|
|
5
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-KNBWR4DS.mjs";
|
|
6
8
|
|
|
7
9
|
// src/components/StreamingMarkdown.tsx
|
|
8
10
|
import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -12,8 +14,6 @@ import remarkGfm from "remark-gfm";
|
|
|
12
14
|
import rehypeRaw from "rehype-raw";
|
|
13
15
|
import rehypeSanitize from "rehype-sanitize";
|
|
14
16
|
import { useTheme, alpha } from "@mui/material/styles";
|
|
15
|
-
import CheckIcon from "@mui/icons-material/Check";
|
|
16
|
-
import ContentCopyIcon from "@mui/icons-material/ContentCopy";
|
|
17
17
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
18
|
var StreamingMarkdown = ({
|
|
19
19
|
content,
|
|
@@ -479,4 +479,4 @@ var StreamingMarkdown_default = StreamingMarkdown;
|
|
|
479
479
|
export {
|
|
480
480
|
StreamingMarkdown_default
|
|
481
481
|
};
|
|
482
|
-
//# sourceMappingURL=chunk-
|
|
482
|
+
//# sourceMappingURL=chunk-KM7FUWCM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/StreamingMarkdown.tsx"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4F0E-E71F75\nconst __banditFingerprint_components_StreamingMarkdowntsx = 'BL-FP-BB12E1-3387';\nconst __auditTrail_components_StreamingMarkdowntsx = 'BL-AU-MGOIKVV9-FMED';\n// File: StreamingMarkdown.tsx | Path: src/components/StreamingMarkdown.tsx | Hash: 4f0e3387\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Box, Tooltip, IconButton } from \"@mui/material\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport { useTheme, alpha } from \"@mui/material/styles\";\nimport type { Element, Text, Root } from \"hast\";\nimport type { Components } from \"react-markdown\";\nimport type { CodeProps } from \"react-markdown/lib/ast-to-react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { getHighlightTree } from \"../utils/lowlight\";\nimport { markdownSanitizeSchema, renderLowlightChildren } from \"../utils/markdownRendering\";\nimport { CheckIcon, ContentCopyIcon } from \"../icons/lucide-icons\";\n\ninterface SourceSummary {\n id: string;\n name: string;\n}\n\ninterface StreamingMarkdownProps {\n content: string;\n isStreaming?: boolean;\n sources?: SourceSummary[];\n}\n\nconst StreamingMarkdown: React.FC<StreamingMarkdownProps> = ({\n content,\n isStreaming = false,\n sources,\n}) => {\n const theme = useTheme();\n const showCursor = isStreaming && content.trim().length > 0;\n const showLoader = isStreaming && content.trim().length === 0; // Show loader when streaming but no content yet\n const prevSanitizedRef = useRef<string>(\"\");\n const containerRef = useRef<HTMLDivElement | null>(null);\n const stableSourcesRef = useRef<SourceSummary[]>([]);\n\n const effectiveSources = useMemo(() => {\n if (Array.isArray(sources) && sources.length > 0) {\n stableSourcesRef.current = sources;\n return sources;\n }\n\n if (sources === undefined) {\n return stableSourcesRef.current;\n }\n\n stableSourcesRef.current = [];\n return [];\n }, [sources]);\n\n const normalizeTables = (markdown: string): string => {\n const lines = markdown.split(\"\\n\");\n const output: string[] = [];\n let inTable = false;\n let tableRows: string[][] = [];\n\n const flushTable = () => {\n if (tableRows.length === 0) return;\n const maxCols = Math.max(...tableRows.map((r) => r.length));\n const padded = tableRows.map((row) => [...row, ...Array(maxCols - row.length).fill(\"\")]);\n const header = padded[0];\n const separator = Array(maxCols).fill(\"---\");\n output.push(\"| \" + header.join(\" | \") + \" |\");\n output.push(\"| \" + separator.join(\" | \") + \" |\");\n for (let i = 1; i < padded.length; i++) {\n const row = padded[i];\n if (row.every((cell) => /^-+$/.test(cell))) continue;\n output.push(\"| \" + row.join(\" | \") + \" |\");\n }\n tableRows = [];\n inTable = false;\n };\n\n for (const line of lines) {\n if (/^\\s*\\|.*\\|\\s*$/.test(line)) {\n inTable = true;\n const cells = line.trim().slice(1, -1).split(\"|\").map((c) => c.trim());\n tableRows.push(cells);\n } else {\n if (inTable) flushTable();\n output.push(line);\n }\n }\n if (inTable) flushTable();\n return output.join(\"\\n\");\n };\n\n const sanitizeMarkdown = (raw: string): string => {\n let sanitized = raw.replace(/<[/]?start_of_turn>|<[/]?end[_]?of[_]?turn>/gi, \"\");\n // Unwrap Box wrappers\n sanitized = sanitized\n .replace(/<div class=\"MuiBox-root[^\"]*\"[^>]*>([\\s\\S]*?)<\\/div>/g, (_, inner) => inner.trim())\n .replace(/<div[^>]*>\\s*<\\/div>/g, \"\");\n // Collapse newline before common punctuation\n sanitized = sanitized.replace(/\\r?\\n\\s*:\\s*/g, \": \");\n sanitized = sanitized.replace(/\\r?\\n\\s*,\\s*/g, \", \");\n // Normalize pipe tables\n sanitized = normalizeTables(sanitized);\n return sanitized;\n };\n\n const sanitizedContent = sanitizeMarkdown(content);\n\n const contentWithSources = useMemo(() => {\n if (!effectiveSources.length || isStreaming) {\n return sanitizedContent;\n }\n\n const existingSection = /\\*\\*Sources?\\*\\*/i.test(sanitizedContent);\n if (existingSection) {\n return sanitizedContent;\n }\n\n const listMarkdown = effectiveSources\n .map((doc, index) => `- ${index + 1}. ${doc.name}`)\n .join(\"\\n\");\n\n return `${sanitizedContent}\\n\\n**Sources**\\n${listMarkdown}`;\n }, [sanitizedContent, effectiveSources, isStreaming]);\n\n // Helpers for safe per-word fade wrapping\n const escapeHtml = (str: string) =>\n str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\n\n const isPlainAppend = (s: string) => {\n // Avoid wrapping when the delta includes markdown/code/meta characters\n return !/[`*_\\[\\]<>|#~]/.test(s);\n };\n\n // Compute a render string where newly appended words fade in with a stagger\n let renderContent = contentWithSources;\n if (isStreaming) {\n const prev = prevSanitizedRef.current;\n // Find common prefix length to identify newly appended tail\n let i = 0;\n const max = Math.min(prev.length, sanitizedContent.length);\n while (i < max && prev.charCodeAt(i) === sanitizedContent.charCodeAt(i)) i++;\n const base = sanitizedContent.slice(0, i);\n const appended = sanitizedContent.slice(i);\n if (appended && isPlainAppend(appended)) {\n const parts = appended.split(/(\\s+)/); // keep whitespace tokens\n let delayMs = 0;\n const step = 42; // gentle stagger between words for smoother reveal\n const wrapped = parts\n .map((p) => {\n if (/^\\s+$/.test(p) || p === \"\") return p; // preserve whitespace\n const safe = escapeHtml(p);\n const out = `<span class=\\\"bl-fade-word\\\" data-bl-delay=\\\"${delayMs}\\\">${safe}</span>`;\n delayMs += step;\n return out;\n })\n .join(\"\");\n renderContent = base + wrapped;\n }\n }\n\n // After compute: update ref for next render\n useEffect(() => {\n prevSanitizedRef.current = contentWithSources;\n }, [contentWithSources]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const nodes = containerRef.current.querySelectorAll<HTMLElement>(\".bl-fade-word\");\n nodes.forEach((node) => {\n const delay = node.getAttribute(\"data-bl-delay\");\n if (delay) {\n node.style.setProperty(\"--bl-delay\", `${delay}ms`);\n node.style.animationDelay = `${delay}ms`;\n }\n });\n }, [renderContent, sanitizedContent, isStreaming]);\n\n type MarkProps = ComponentPropsWithoutRef<\"mark\">;\n type AnchorProps = ComponentPropsWithoutRef<\"a\">;\n type EmProps = ComponentPropsWithoutRef<\"em\">;\n type TableProps = ComponentPropsWithoutRef<\"table\">;\n type TableCellProps = ComponentPropsWithoutRef<\"td\">;\n type TableHeaderProps = ComponentPropsWithoutRef<\"th\">;\n type ParagraphProps = ComponentPropsWithoutRef<\"p\">;\n type BlockQuoteProps = ComponentPropsWithoutRef<\"blockquote\">;\n type OrderedListProps = ComponentPropsWithoutRef<\"ol\">;\n type UnorderedListProps = ComponentPropsWithoutRef<\"ul\">;\n\n const MarkRenderer: React.FC<MarkProps> = ({ children, ...props }) => {\n const inlineBg = theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.06)\n : alpha(theme.palette.text.primary, 0.06);\n const inlineBorder = `1px solid ${alpha(theme.palette.text.primary, 0.15)}`;\n return (\n <Box\n component=\"span\"\n sx={{\n display: \"inline-block\",\n backgroundColor: inlineBg,\n border: inlineBorder,\n color: \"inherit\",\n padding: \"0.15em 0.35em\",\n borderRadius: \"4px\",\n fontWeight: 500,\n fontSize: \"0.92em\",\n lineHeight: 1.4,\n whiteSpace: \"normal\",\n width: \"fit-content\",\n maxWidth: \"100%\",\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n }}\n {...props}\n >\n {children}\n </Box>\n );\n };\n\n const LinkRenderer: React.FC<AnchorProps> = ({ href, children, ...props }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: theme.palette.primary.main, textDecoration: \"underline\" }}\n {...props}\n >\n {children}\n </a>\n );\n\n const CodeRenderer: React.FC<CodeProps> = ({ inline, className, children, ...props }) => {\n const match = /language-([\\w-]+)/.exec(className || \"\");\n const requestedLanguage = match?.[1]?.toLowerCase() ?? \"\";\n const codeText = String(children).replace(/\\n$/, \"\");\n const isProbablyBlock = codeText.includes(\"\\n\") || Boolean(requestedLanguage);\n\n const [copied, setCopied] = useState(false);\n const handleCopy = () => {\n void navigator.clipboard.writeText(codeText);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n\n const highlightTree = useMemo<Root | null>(\n () => (isProbablyBlock ? getHighlightTree(codeText, requestedLanguage) : null),\n [isProbablyBlock, codeText, requestedLanguage]\n );\n\n const highlightedNodes = useMemo<ReactNode[]>(\n () =>\n highlightTree\n ? renderLowlightChildren(\n (highlightTree.children || []).filter(\n (node): node is Element | Text => node.type === \"element\" || node.type === \"text\"\n ),\n `hl-${requestedLanguage || \"auto\"}`\n )\n : [],\n [highlightTree, requestedLanguage]\n );\n\n const dataLanguage =\n highlightTree &&\n highlightTree.data &&\n typeof highlightTree.data === \"object\" &&\n \"language\" in highlightTree.data\n ? String((highlightTree.data as { language?: unknown }).language ?? \"\")\n : \"\";\n\n if (!highlightTree) {\n const inlineBg = theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.06)\n : alpha(theme.palette.text.primary, 0.06);\n const inlineBorder = `1px solid ${alpha(theme.palette.text.primary, 0.15)}`;\n return (\n <code\n style={{\n borderRadius: 4,\n fontSize: \"0.92em\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n backgroundColor: inlineBg,\n border: inlineBorder,\n padding: \"0.15em 0.35em\",\n }}\n {...props}\n >\n {children}\n </code>\n );\n }\n\n const resolvedLanguage = (requestedLanguage || dataLanguage || \"code\").toString();\n const languageLabel = resolvedLanguage.toUpperCase();\n const languageClass = resolvedLanguage.toLowerCase();\n\n const highlightColors = theme.palette.mode === \"dark\"\n ? {\n background: \"#0f172a\",\n text: \"#e2e8f0\",\n keyword: \"#c792ea\",\n string: \"#7fdbca\",\n number: \"#f78c6c\",\n comment: \"#64748b\",\n function: \"#82aaff\",\n variable: \"#f07178\",\n }\n : {\n background: \"#f4f6ff\",\n text: \"#1e293b\",\n keyword: \"#7c3aed\",\n string: \"#0f766e\",\n number: \"#b45309\",\n comment: \"#6b7280\",\n function: \"#2563eb\",\n variable: \"#d97706\",\n };\n\n return (\n <Box\n sx={{\n borderRadius: \"4px\",\n overflow: \"auto\",\n my: \"0.5rem\",\n px: 0,\n py: 0,\n mt: 1,\n mb: 0.5,\n fontSize: \"0.9rem\",\n position: \"relative\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\n >\n <Box\n sx={{\n px: 2,\n py: 1,\n bgcolor: theme.palette.mode === \"dark\"\n ? alpha(theme.palette.common.white, 0.04)\n : alpha(theme.palette.text.primary, 0.04),\n color: theme.palette.text.secondary,\n fontSize: \"0.75rem\",\n borderBottom: `1px solid ${alpha(theme.palette.text.primary, 0.1)}`,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontFamily: \"inherit\",\n }}\n >\n <span>{languageLabel}</span>\n <Tooltip title={copied ? \"Copied!\" : \"Copy\"} arrow>\n <IconButton\n size=\"small\"\n onClick={handleCopy}\n sx={{\n color: copied ? theme.palette.success.main : theme.palette.text.secondary,\n \"&:hover\": { color: theme.palette.text.primary },\n padding: \"4px\",\n }}\n >\n {copied ? <CheckIcon fontSize=\"small\" /> : <ContentCopyIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n </Box>\n <Box\n sx={{\n overflowX: \"auto\",\n maxWidth: \"100%\",\n '& .hljs': {\n display: 'block',\n overflowX: 'auto',\n padding: '16px',\n margin: 0,\n backgroundColor: highlightColors.background,\n color: highlightColors.text,\n fontSize: '0.9rem',\n },\n '& .hljs-comment, & .hljs-quote': {\n color: highlightColors.comment,\n fontStyle: 'italic',\n },\n '& .hljs-keyword, & .hljs-selector-tag, & .hljs-literal, & .hljs-built_in': {\n color: highlightColors.keyword,\n },\n '& .hljs-string, & .hljs-doctag, & .hljs-template-tag, & .hljs-attr': {\n color: highlightColors.string,\n },\n '& .hljs-number, & .hljs-symbol, & .hljs-bullet, & .hljs-meta': {\n color: highlightColors.number,\n },\n '& .hljs-title, & .hljs-section, & .hljs-selector-id, & .hljs-function': {\n color: highlightColors.function,\n },\n '& .hljs-variable, & .hljs-params, & .hljs-property': {\n color: highlightColors.variable,\n },\n }}\n >\n <pre className={`hljs language-${languageClass}`} {...props}>\n <code className=\"hljs\">{highlightedNodes}</code>\n </pre>\n </Box>\n </Box>\n );\n };\n\n const EmRenderer: React.FC<EmProps> = ({ children, ...props }) => {\n const onlyChild = Array.isArray(children) && children.length === 1 ? children[0] : null;\n if (\n onlyChild &&\n React.isValidElement(onlyChild) &&\n typeof onlyChild.props?.className === \"string\" &&\n onlyChild.props.className.includes(\"MuiBox-root\")\n ) {\n const inner = onlyChild.props.children as ReactNode;\n if (typeof inner === \"string\" && inner.trim().toUpperCase() === \"CODE\") {\n return null;\n }\n return (\n <Box\n sx={{\n fontFamily: \"monospace\",\n fontSize: \"0.9rem\",\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n padding: \"12px 16px\",\n borderRadius: \"4px\",\n border: `1px solid ${theme.palette.divider}`,\n my: 1,\n display: \"inline-block\",\n }}\n >\n {inner}\n </Box>\n );\n }\n return <em {...props}>{children}</em>;\n };\n\n const TableRenderer: React.FC<TableProps> = ({ children, ...props }) => (\n <Box sx={{ overflowX: \"auto\", my: 1 }}>\n <table style={{ borderCollapse: \"collapse\", width: \"100%\" }} {...props}>\n {children}\n </table>\n </Box>\n );\n\n const OrderedListRenderer: React.FC<OrderedListProps> = ({ children, ...props }) => (\n <ol style={{ paddingLeft: 24, marginLeft: 16, listStyleType: \"decimal\" }} {...props}>\n {children}\n </ol>\n );\n\n const UnorderedListRenderer: React.FC<UnorderedListProps> = ({ children, ...props }) => (\n <ul\n style={{\n paddingLeft: \"1.5rem\",\n marginTop: \"0.5rem\",\n marginBottom: \"0.25rem\",\n listStyle: \"disc\",\n }}\n {...props}\n >\n {children}\n </ul>\n );\n\n const BlockQuoteRenderer: React.FC<BlockQuoteProps> = ({ children, ...props }) => (\n <Box\n component=\"blockquote\"\n sx={{\n borderLeft: `4px solid ${theme.palette.divider}`,\n pl: 2,\n ml: 0,\n color: theme.palette.text.secondary,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n\n const TableHeaderRenderer: React.FC<TableHeaderProps> = ({ children, ...props }) => (\n <th\n style={{\n border: \"1px solid #ddd\",\n padding: \"8px\",\n backgroundColor: theme.palette.mode === \"dark\" ? \"#333\" : \"#f2f2f2\",\n textAlign: \"left\",\n }}\n {...props}\n >\n {children}\n </th>\n );\n\n const TableCellRenderer: React.FC<TableCellProps> = ({ children, ...props }) => (\n <td\n style={{\n border: \"1px solid #ddd\",\n padding: \"8px\",\n }}\n {...props}\n >\n {children}\n </td>\n );\n\n const ParagraphRenderer: React.FC<ParagraphProps> = ({ children, ...props }) => (\n <p style={{ marginTop: \"0.5rem\", marginBottom: \"0.5rem\" }} {...props}>\n {children}\n </p>\n );\n\n const components: Components = {\n mark: MarkRenderer,\n code: CodeRenderer,\n a: LinkRenderer,\n em: EmRenderer,\n table: TableRenderer,\n ol: OrderedListRenderer,\n ul: UnorderedListRenderer,\n blockquote: BlockQuoteRenderer,\n th: TableHeaderRenderer,\n td: TableCellRenderer,\n p: ParagraphRenderer,\n };\n\n return (\n <Box\n ref={containerRef}\n sx={{\n // Base transition for minor layout changes\n transition: \"opacity 120ms ease-out, transform 120ms ease-out\",\n \"& .cursor\": {\n display: showCursor ? \"inline\" : \"none\",\n animation: \"blink 1s step-start infinite\",\n },\n \"@keyframes blink\": {\n \"50%\": { opacity: 0 },\n },\n \"& .bl-fade-word\": {\n opacity: 0,\n animation: \"bl-fade-in 420ms ease-out forwards\",\n },\n \"@keyframes bl-fade-in\": {\n from: { opacity: 0, transform: \"translateY(1.5px)\" },\n to: { opacity: 1, transform: \"translateY(0)\" },\n },\n // Subtle fade-in for each render while streaming to reduce choppiness perception\n opacity: isStreaming ? 0.985 : 1,\n transform: isStreaming ? \"translateY(0.25px)\" : \"none\",\n // Reduce layout jumpiness between updates\n \"& p:last-child\": { marginBottom: 0 },\n // Add min height when showing loader to prevent layout shift\n minHeight: showLoader ? \"40px\" : \"auto\",\n }}\n >\n {showLoader ? (\n // Show loading indicator when streaming but no content yet\n <Box sx={{ display: \"flex\", alignItems: \"center\", minHeight: \"40px\", pl: 2 }}>\n <div className=\"typing-only\">\n <span className=\"dot\" />\n <span className=\"dot\" />\n <span className=\"dot\" />\n </div>\n </Box>\n ) : (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, markdownSanitizeSchema]]}\n components={components}\n >\n {(renderContent || sanitizedContent) + (showCursor ? \" ▊\" : \"\")}\n </ReactMarkdown>\n )}\n </Box>\n );\n};\n\nexport default StreamingMarkdown;\n"],"mappings":"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","names":[]}
|