@burtson-labs/bandit-engine 2.0.153 → 2.0.155
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-4UZ5QT7B.mjs → chat-W5E6FD2Z.mjs} +5 -5
- package/dist/chat-provider.js +23 -1
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +2 -2
- package/dist/{chunk-DADHPWB7.mjs → chunk-6JTXYVOW.mjs} +6 -6
- package/dist/{chunk-GQ3X6VPR.mjs → chunk-HQZXTOOK.mjs} +2 -2
- package/dist/{chunk-6KOEXQJN.mjs → chunk-IS2LWSBZ.mjs} +24 -2
- package/dist/chunk-IS2LWSBZ.mjs.map +1 -0
- package/dist/{chunk-RN7FRSMX.mjs → chunk-NTG4V34T.mjs} +426 -378
- package/dist/chunk-NTG4V34T.mjs.map +1 -0
- package/dist/{chunk-AJL3JOD6.mjs → chunk-TVPYBRWF.mjs} +2 -2
- package/dist/{chunk-2HGBMNX4.mjs → chunk-XONVE5DJ.mjs} +4 -2
- package/dist/chunk-XONVE5DJ.mjs.map +1 -0
- package/dist/{chunk-6NYYYKYZ.mjs → chunk-YWCROXF2.mjs} +5 -4
- package/dist/chunk-YWCROXF2.mjs.map +1 -0
- package/dist/index.js +3350 -3279
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/management/management.js +3216 -3145
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +5 -5
- package/dist/modals/chat-modal/chat-modal.js +822 -775
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-2HGBMNX4.mjs.map +0 -1
- package/dist/chunk-6KOEXQJN.mjs.map +0 -1
- package/dist/chunk-6NYYYKYZ.mjs.map +0 -1
- package/dist/chunk-RN7FRSMX.mjs.map +0 -1
- /package/dist/{chat-4UZ5QT7B.mjs.map → chat-W5E6FD2Z.mjs.map} +0 -0
- /package/dist/{chunk-DADHPWB7.mjs.map → chunk-6JTXYVOW.mjs.map} +0 -0
- /package/dist/{chunk-GQ3X6VPR.mjs.map → chunk-HQZXTOOK.mjs.map} +0 -0
- /package/dist/{chunk-AJL3JOD6.mjs.map → chunk-TVPYBRWF.mjs.map} +0 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-B2TJZM4Z.mjs";
|
|
7
7
|
import {
|
|
8
8
|
useMCPToolsStore
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-IS2LWSBZ.mjs";
|
|
10
10
|
import {
|
|
11
11
|
FeatureFlagProvider,
|
|
12
12
|
NotificationProvider,
|
|
@@ -191,4 +191,4 @@ export {
|
|
|
191
191
|
ChatProvider,
|
|
192
192
|
chat_provider_default
|
|
193
193
|
};
|
|
194
|
-
//# sourceMappingURL=chunk-
|
|
194
|
+
//# sourceMappingURL=chunk-TVPYBRWF.mjs.map
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CheckIcon,
|
|
3
3
|
ContentCopyIcon,
|
|
4
|
+
MarkdownImage,
|
|
4
5
|
getHighlightTree,
|
|
5
6
|
markdownSanitizeSchema,
|
|
6
7
|
maybeHandleFileLinkClick,
|
|
7
8
|
renderLowlightChildren
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-NTG4V34T.mjs";
|
|
9
10
|
|
|
10
11
|
// src/components/StreamingMarkdown.tsx
|
|
11
12
|
import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -422,6 +423,7 @@ ${listMarkdown}`;
|
|
|
422
423
|
mark: MarkRenderer,
|
|
423
424
|
code: CodeRenderer,
|
|
424
425
|
a: LinkRenderer,
|
|
426
|
+
img: MarkdownImage,
|
|
425
427
|
em: EmRenderer,
|
|
426
428
|
table: TableRenderer,
|
|
427
429
|
ol: OrderedListRenderer,
|
|
@@ -511,4 +513,4 @@ export {
|
|
|
511
513
|
isNativeShell,
|
|
512
514
|
isStandalonePwa
|
|
513
515
|
};
|
|
514
|
-
//# sourceMappingURL=chunk-
|
|
516
|
+
//# sourceMappingURL=chunk-XONVE5DJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/StreamingMarkdown.tsx","../src/utils/installedApp.ts"],"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 { MarkdownImage, markdownSanitizeSchema, renderLowlightChildren } from \"../utils/markdownRendering\";\nimport { CheckIcon, ContentCopyIcon } from \"../icons/lucide-icons\";\nimport { maybeHandleFileLinkClick } from \"../utils/openFileLink\";\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 // Standalone PWAs can't download — route file links to the share sheet.\n onClick={(e) => maybeHandleFileLinkClick(e, href)}\n style={{\n color: theme.palette.info?.main ?? theme.palette.primary.main,\n textDecoration: \"underline\",\n textUnderlineOffset: \"2px\",\n }}\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 img: MarkdownImage,\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 // Settle the whole block to full color a beat after streaming ends.\n transition: \"opacity 380ms ease-out, transform 220ms 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 // Each newly-written word focuses in — blur→sharp, a tiny rise, and fade —\n // like ink settling onto the page as the typewriter writes.\n \"& .bl-fade-word\": {\n opacity: 0,\n animation: \"bl-fade-in 480ms cubic-bezier(0.22, 1, 0.36, 1) forwards\",\n },\n \"@keyframes bl-fade-in\": {\n from: { opacity: 0, filter: \"blur(3px)\", transform: \"translateY(2px)\" },\n to: { opacity: 1, filter: \"blur(0)\", transform: \"translateY(0)\" },\n },\n // Dimmed while streaming, then brightens to full color once the answer lands.\n opacity: isStreaming ? 0.86 : 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\n// Skip re-rendering (and re-parsing markdown) when nothing this component cares\n// about changed. Critical for long chats: without this, every streamed token\n// re-parses the markdown of EVERY prior message — the main source of mid-stream\n// jank / \"thread-locky\" feel. Only the actively-streaming message (whose content\n// changes each flush) re-renders.\nconst arePropsEqual = (\n prev: StreamingMarkdownProps,\n next: StreamingMarkdownProps,\n): boolean => {\n if (prev.content !== next.content || prev.isStreaming !== next.isStreaming) {\n return false;\n }\n const a = prev.sources;\n const b = next.sources;\n if (a === b) return true;\n if (!a || !b || a.length !== b.length) return false;\n return a.every((s, i) => s.id === b[i].id && s.name === b[i].name);\n};\n\nexport default React.memo(StreamingMarkdown, arePropsEqual);\n","/**\n * \"Is this running as an installed app?\" — either a home-screen PWA in\n * standalone display mode, or the Capacitor native shell (which injects\n * `window.Capacitor` before the page loads). The engine can't import\n * @capacitor/core (it's a host-app dependency), so the native check reads\n * the global directly.\n *\n * Layout code that sizes to the real webview / hides browser chrome should\n * key off this rather than the standalone media query alone — WKWebView\n * reports display-mode \"browser\", so the native app would otherwise get\n * the in-browser layout.\n */\nexport const isNativeShell = (): boolean => {\n if (typeof window === \"undefined\") return false;\n const cap = (window as unknown as { Capacitor?: { isNativePlatform?: () => boolean } }).Capacitor;\n return typeof cap?.isNativePlatform === \"function\" && cap.isNativePlatform() === true;\n};\n\nexport const isStandalonePwa = (): boolean => {\n if (typeof window === \"undefined\") return false;\n const nav = window.navigator as Navigator & { standalone?: boolean };\n return window.matchMedia?.(\"(display-mode: standalone)\").matches || nav.standalone === true;\n};\n\nexport const isInstalledApp = (): boolean => isStandalonePwa() || isNativeShell();\n"],"mappings":"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","names":[]}
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
StreamingMarkdown_default,
|
|
6
6
|
isNativeShell,
|
|
7
7
|
isStandalonePwa
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-XONVE5DJ.mjs";
|
|
9
9
|
import {
|
|
10
10
|
useMCPToolsStore
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-IS2LWSBZ.mjs";
|
|
12
12
|
import {
|
|
13
13
|
AddIcon,
|
|
14
14
|
ArrowDownwardIcon,
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
useNotificationService,
|
|
39
39
|
useTTS,
|
|
40
40
|
useVoiceStore
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-NTG4V34T.mjs";
|
|
42
42
|
import {
|
|
43
43
|
brandingService_default,
|
|
44
44
|
detectMessageMood,
|
|
@@ -4225,6 +4225,7 @@ TOOL USAGE PROTOCOL (conservative approach)
|
|
|
4225
4225
|
- Only call tools for SPECIFIC, CURRENT information that requires real-time data or a source you don't already have:
|
|
4226
4226
|
* web_search() - when asked about recent/current events, breaking news, live information (weather, prices, sports scores), or when you need to look up documentation, libraries, APIs, error messages, or verify a specific fact
|
|
4227
4227
|
* web_fetch() - to read the FULL contents of a specific URL you already have. Reach for this when the user wants to "tell me more", "go deeper", "read/open that article", or asks for details about a specific source, link, or article from an EARLIER answer: take that item's URL from the previous Sources list in this conversation and fetch it, then answer from the page's actual content (not just the prior summary)
|
|
4228
|
+
* image_generation() - ONLY when explicitly asked to create or generate an image. Runs on Burtson's local GPU; it can take a couple of minutes when the GPU is cold, and is limited to admin and partner accounts
|
|
4228
4229
|
* create_file({"content": "...", "filename": "report.docx", "format": "docx"}) - when the user asks for a downloadable FILE (a document, spreadsheet, slides, markdown, code, etc.) or to "export"/"download"/"save" something. Formats: md, txt, csv, json, html, xml, yaml, docx, pptx. PDF is NOT a supported format \u2014 if the user asks for a PDF, create a docx instead. For docx/pptx write well-structured Markdown (use "## " headings to start each slide for pptx). It returns a temporary download link \u2014 ALWAYS tell the user the file expires (~1 hour). If it is unclear whether they want it shown inline vs. as a downloadable file, use ask_user first.
|
|
4229
4230
|
* ask_user({"questions": [{"question": "...", "header": "Format", "options": [{"label": "Inline (Recommended)"}, {"label": "Download a file"}]}]}) - when the request is AMBIGUOUS or missing a detail you need to do a good job (unclear scope, audience, format, tone, which of several interpretations they meant), or you are blocked on a decision that is the user's to make and cannot resolve from the request, context, or sensible defaults. Renders clickable options the user answers in one step \u2014 ALWAYS prefer this over asking a clarifying question in prose and ending your turn. Give 1-4 questions, each with 2-4 short options; if one is clearly best, list it first and append " (Recommended)". The user may also type their own answer; act on it directly. Don't overuse it \u2014 when a sensible default exists, take it and note the assumption instead.
|
|
4230
4231
|
- For general questions about concepts, definitions, explanations, or how-to topics, use your built-in knowledge WITHOUT calling tools.
|
|
@@ -11773,4 +11774,4 @@ var chat_default = Chat;
|
|
|
11773
11774
|
export {
|
|
11774
11775
|
chat_default
|
|
11775
11776
|
};
|
|
11776
|
-
//# sourceMappingURL=chunk-
|
|
11777
|
+
//# sourceMappingURL=chunk-YWCROXF2.mjs.map
|