@singlebase/elements 0.8.0 → 0.9.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/dist/{chat-BWcGH9lr.cjs → chat-Bj6DrOaW.cjs} +237 -168
- package/dist/chat-Bj6DrOaW.cjs.map +1 -0
- package/dist/{chat-t4o5FsxM.js → chat-DNiqYF6F.js} +1095 -822
- package/dist/chat-DNiqYF6F.js.map +1 -0
- package/dist/chat-messages.d.ts +5 -0
- package/dist/chat.cjs +1 -1
- package/dist/chat.js +1 -1
- package/dist/elements/chat.d.ts +73 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/singlebase-elements.min.js +2409 -2136
- package/dist/singlebase-elements.min.js.map +1 -1
- package/package.json +3 -3
- package/dist/chat-BWcGH9lr.cjs.map +0 -1
- package/dist/chat-t4o5FsxM.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-BWcGH9lr.cjs","sources":["../src/styles/chat.ts","../src/chat-messages.ts","../src/utils/markdown.ts","../src/utils/svg.ts","../src/elements/chat.ts"],"sourcesContent":["import { css } from \"lit\";\n\n/**\n * The glow's rotating angle has to be a registered custom property to\n * animate, and registration only works at document level, not in a shadow\n * root's stylesheet. Registering twice throws, which is fine to ignore.\n */\nif (typeof CSS !== \"undefined\" && \"registerProperty\" in CSS) {\n try {\n CSS.registerProperty({\n name: \"--sb-ai-angle\",\n syntax: \"<angle>\",\n inherits: false,\n initialValue: \"0deg\"\n });\n } catch {\n /* already registered */\n }\n}\n\n/**\n * <singlebase-chat> styles. Every colour comes from the shared --sb-* tokens\n * (plus --sb-hover, --sb-ink-2 and --sb-divider, which only the chat uses),\n * so a page themes the chat, the auth widget and the uploader in one place.\n */\nexport const chatStyles = css`\n :host {\n --c-ink: var(--sb-ink, #16181a);\n --c-ink2: var(--sb-ink-2, #41464b);\n --c-muted: var(--sb-muted-ink, #61666c);\n --c-faint: #8a8f95;\n --c-bg: var(--sb-surface, #ffffff);\n --c-bg2: var(--sb-surface-alt, #fafafa);\n --c-hover: var(--sb-hover, #f2f3f4);\n --c-line: var(--sb-border, #e4e6e9);\n --c-line2: var(--sb-divider, #ecedee);\n --c-strong: var(--sb-border-strong, #cdd1d6);\n --c-brand: var(--sb-accent, #16181a);\n --c-on-brand: var(--sb-on-accent, #ffffff);\n --c-danger: var(--sb-danger, #b4231a);\n --c-ok: var(--sb-ok, #0f6b4a);\n --c-mono: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n --c-r: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n --c-r2: calc(var(--c-r) * 1.5);\n --c-r3: calc(var(--c-r) * 2);\n --c-r4: calc(var(--c-r) * 3);\n --c-glow: 0.6;\n --c-conic: conic-gradient(\n from var(--sb-ai-angle, 0deg),\n oklch(0.72 0.15 295),\n oklch(0.74 0.13 245),\n oklch(0.8 0.11 190),\n oklch(0.84 0.12 85),\n oklch(0.78 0.12 350),\n oklch(0.72 0.15 295)\n );\n --c-z: var(--sb-chat-z, 1000);\n display: block;\n height: 100%;\n min-height: 0;\n color-scheme: light;\n }\n\n :host([theme=\"dark\"]) {\n --sb-hover: #24272b;\n --sb-ink-2: #c9ccd0;\n --sb-divider: #26292d;\n --c-faint: #7c8187;\n color-scheme: dark;\n }\n\n :host([glow=\"vivid\"]) {\n --c-glow: 1;\n }\n\n :host([embed=\"inline\"]) {\n height: auto;\n }\n\n :host([embed=\"launcher\"]) {\n height: 0;\n }\n\n * {\n box-sizing: border-box;\n }\n\n button {\n font: inherit;\n color: inherit;\n }\n\n button:focus-visible,\n input:focus-visible,\n textarea:focus-visible,\n [role=\"button\"]:focus-visible {\n outline: 2px solid var(--c-ink);\n outline-offset: 1px;\n }\n\n .mono {\n font-family: var(--c-mono);\n }\n\n .label {\n font-family: var(--c-mono);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--c-muted);\n }\n\n /* ── frames ───────────────────────────────────────────── */\n\n .frame {\n position: relative;\n display: flex;\n height: 100%;\n min-height: 0;\n background: var(--c-bg);\n color: var(--c-ink);\n overflow: hidden;\n }\n\n .frame.boxed {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r4);\n }\n\n .frame.inline {\n width: 440px;\n height: 660px;\n min-width: 340px;\n min-height: 480px;\n max-width: 100%;\n resize: both;\n box-shadow: 0 1px 2px rgba(22, 24, 26, 0.06);\n }\n\n @media (max-width: 559px) {\n .frame.inline {\n width: 100%;\n min-width: 0;\n resize: none;\n }\n }\n\n .frame.launcher {\n position: fixed;\n bottom: 96px;\n right: 24px;\n z-index: var(--c-z);\n width: 420px;\n height: min(680px, calc(100vh - 120px));\n max-width: calc(100vw - 48px);\n box-shadow: 0 24px 60px -24px rgba(22, 24, 26, 0.35);\n transform-origin: bottom right;\n animation: scaleIn 0.2s ease-out;\n }\n\n :host([position=\"left\"]) .frame.launcher {\n right: auto;\n left: 24px;\n transform-origin: bottom left;\n }\n\n .frame.expanded {\n position: fixed;\n inset: 24px;\n width: auto;\n height: auto;\n max-width: none;\n z-index: var(--c-z);\n resize: none;\n box-shadow: 0 24px 60px -24px rgba(22, 24, 26, 0.35);\n animation: scaleIn 0.2s ease-out;\n }\n\n .frame.full {\n position: fixed;\n inset: 0;\n width: auto;\n height: auto;\n max-width: none;\n border-radius: 0;\n border: none;\n z-index: var(--c-z);\n resize: none;\n }\n\n .root {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n font-family: var(--sb-font, \"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif);\n background: var(--c-bg);\n color: var(--c-ink);\n }\n\n /* ── launcher ─────────────────────────────────────────── */\n\n .launcher-btn {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: calc(var(--c-z) + 1);\n width: 56px;\n height: 56px;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n cursor: pointer;\n background: var(--c-brand);\n color: var(--c-on-brand);\n box-shadow: 0 12px 28px -10px rgba(22, 24, 26, 0.45);\n }\n\n :host([position=\"left\"]) .launcher-btn,\n :host([position=\"left\"]) .bubble {\n right: auto;\n left: 24px;\n }\n\n .badge {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--c-danger);\n border: 2px solid var(--c-bg);\n }\n\n .bubble {\n position: fixed;\n bottom: 96px;\n right: 24px;\n z-index: var(--c-z);\n width: 260px;\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px 10px 12px 14px;\n background: var(--c-bg);\n color: var(--c-ink);\n border: 1px solid var(--c-line);\n border-radius: calc(var(--c-r) * 2.5);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.25);\n font-family: var(--sb-font, \"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif);\n animation: aiIn 0.25s ease-out;\n }\n\n .bubble-text {\n flex: 1;\n min-width: 0;\n text-align: left;\n font-size: 13.5px;\n line-height: 1.45;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n /* ── icon buttons ─────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--c-r);\n background: transparent;\n color: var(--c-muted);\n cursor: pointer;\n }\n\n .icon:hover:not(:disabled),\n .icon.on {\n color: var(--c-ink);\n }\n\n .icon:hover:not(:disabled) {\n background: var(--c-hover);\n }\n\n .icon.danger:hover:not(:disabled) {\n color: var(--c-danger);\n }\n\n .icon:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .icon.sm {\n width: 24px;\n height: 24px;\n }\n\n svg.i {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n svg.i.filled path {\n fill: currentColor;\n }\n\n @media (pointer: coarse) {\n .icon {\n width: 44px;\n height: 44px;\n }\n }\n\n /* ── sidebar ──────────────────────────────────────────── */\n\n .scrim {\n position: absolute;\n inset: 0;\n z-index: 29;\n background: rgba(22, 24, 26, 0.18);\n }\n\n .sidebar {\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n background: var(--c-bg2);\n border-right: 1px solid var(--c-line);\n }\n\n .sidebar.docked {\n position: relative;\n flex: 0 0 272px;\n width: 272px;\n }\n\n .sidebar.overlay {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n z-index: 30;\n width: min(280px, 86%);\n box-shadow: 12px 0 32px -16px rgba(22, 24, 26, 0.25);\n animation: slideIn 0.15s ease-out;\n }\n\n .side-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 14px 12px 10px 16px;\n }\n\n .side-tools {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px 8px;\n }\n\n .new-chat {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 34px;\n font-size: 13px;\n font-weight: 500;\n color: var(--c-on-brand);\n background: var(--c-brand);\n border: 1px solid var(--c-brand);\n border-radius: var(--c-r2);\n padding: 8px 12px;\n cursor: pointer;\n }\n\n .new-chat:hover {\n filter: brightness(1.2);\n }\n\n .search {\n width: 100%;\n font: inherit;\n font-size: 13px;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 8px 10px;\n outline: none;\n }\n\n .search:focus {\n border-color: var(--c-ink);\n }\n\n .threads {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1px;\n padding: 4px 12px 12px;\n }\n\n .group {\n font-family: var(--c-mono);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--c-muted);\n padding: 10px 8px 6px;\n }\n\n .thread {\n display: flex;\n align-items: center;\n gap: 4px;\n min-height: 34px;\n width: 100%;\n font-size: 13px;\n color: var(--c-ink);\n border-radius: var(--c-r2);\n padding: 3px 4px 3px 10px;\n cursor: pointer;\n }\n\n .thread:hover {\n background: var(--c-hover);\n }\n\n .thread.active {\n background: var(--c-line2);\n font-weight: 500;\n }\n\n .thread-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .thread-actions {\n display: none;\n gap: 0;\n }\n\n .thread:hover .thread-actions,\n .thread:focus-within .thread-actions {\n display: flex;\n }\n\n .thread-rename {\n flex: 1;\n min-width: 0;\n font: inherit;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r);\n padding: 3px 6px;\n outline: none;\n }\n\n .side-extra {\n display: none;\n }\n\n .side-extra.filled {\n display: block;\n padding: 12px 16px;\n border-top: 1px solid var(--c-line);\n font-size: 12.5px;\n }\n\n .side-note {\n font-size: 12.5px;\n color: var(--c-muted);\n padding: 6px 10px;\n }\n\n .skeleton {\n height: 28px;\n margin: 3px 0;\n border-radius: var(--c-r2);\n background: linear-gradient(90deg, var(--c-hover) 0%, var(--c-line2) 50%, var(--c-hover) 100%);\n background-size: 200% 100%;\n animation: aiShimmer 1.6s linear infinite;\n }\n\n /* ── main column ──────────────────────────────────────── */\n\n .main {\n container: chat / inline-size;\n position: relative;\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 52px;\n padding: 10px 8px 10px 12px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .header-right {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .title {\n min-width: 0;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background: none;\n border: none;\n padding: 2px 4px;\n border-radius: var(--c-r);\n cursor: text;\n animation: aiIn 0.25s ease-out;\n }\n\n .title:hover:not(:disabled) {\n background: var(--c-hover);\n }\n\n .title:disabled {\n cursor: default;\n }\n\n .title-input {\n min-width: 0;\n width: 320px;\n max-width: 100%;\n font: inherit;\n font-size: 14px;\n font-weight: 600;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r);\n padding: 2px 6px;\n outline: none;\n }\n\n .divider {\n width: 1px;\n height: 18px;\n background: var(--c-line);\n margin: 0 4px;\n }\n\n .menu-wrap {\n position: relative;\n }\n\n .menu-scrim {\n position: fixed;\n inset: 0;\n z-index: 40;\n }\n\n .menu {\n position: absolute;\n right: 0;\n top: 34px;\n z-index: 41;\n width: 220px;\n display: flex;\n flex-direction: column;\n padding: 4px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.22);\n animation: aiIn 0.15s ease-out;\n }\n\n .menu .label {\n font-size: 10.5px;\n padding: 8px 10px 6px;\n }\n\n .menu-item {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 10px;\n width: 100%;\n text-align: left;\n font-size: 13px;\n background: none;\n border: none;\n border-radius: var(--c-r);\n padding: 8px 10px;\n cursor: pointer;\n }\n\n .menu-item:hover {\n background: var(--c-hover);\n }\n\n .menu-item .ext {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n }\n\n .scroller {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .banner {\n margin: 10px 16px 0;\n padding: 8px 12px;\n font-size: 12.5px;\n color: var(--c-ink2);\n background: var(--c-bg2);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n }\n\n /* ── welcome ──────────────────────────────────────────── */\n\n .welcome-slot {\n min-height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n ::slotted([slot=\"welcome\"]) {\n box-sizing: border-box;\n width: 100%;\n max-width: 640px;\n margin: 0 auto;\n padding: 28px 18px;\n }\n\n .welcome {\n max-width: 640px;\n min-height: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 20px;\n padding: 28px 18px;\n }\n\n .welcome-head {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .welcome-logo {\n width: 32px;\n height: 32px;\n object-fit: contain;\n border-radius: var(--c-r2);\n }\n\n .welcome h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .welcome p {\n margin: 0;\n font-size: 14px;\n line-height: 1.55;\n color: var(--c-muted);\n text-wrap: pretty;\n }\n\n .prompts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n }\n\n .prompt {\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: left;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 12px 14px;\n cursor: pointer;\n transition:\n border-color 0.15s,\n box-shadow 0.15s;\n }\n\n .prompt:hover {\n border-color: var(--c-ink);\n box-shadow: 0 6px 18px -10px rgba(22, 24, 26, 0.25);\n }\n\n .prompt .label {\n font-size: 10.5px;\n letter-spacing: 0.06em;\n }\n\n .prompt-text {\n font-size: 13.5px;\n font-weight: 500;\n line-height: 1.4;\n }\n\n @container chat (max-width: 480px) {\n .prompts {\n grid-template-columns: minmax(0, 1fr);\n }\n }\n\n /* ── messages ─────────────────────────────────────────── */\n\n .thread-view {\n max-width: 760px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 30px;\n padding: 20px 16px 28px;\n }\n\n .msg {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--c-r3);\n }\n\n .msg.user {\n align-self: flex-end;\n max-width: 80%;\n align-items: flex-end;\n gap: 6px;\n margin-bottom: -22px;\n animation: aiIn 0.25s ease-out;\n }\n\n .bubble-user {\n padding: 10px 14px;\n font-size: 14.5px;\n line-height: 1.6;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--c-hover);\n border-radius: calc(var(--c-r) * 2.5) calc(var(--c-r) * 2.5) 2px calc(var(--c-r) * 2.5);\n }\n\n .attachments {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .doc-chip {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n font-size: 12.5px;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg);\n }\n\n .doc-chip .ext {\n font-family: var(--c-mono);\n font-size: 10px;\n letter-spacing: 0.04em;\n color: var(--c-muted);\n }\n\n .doc-chip .name {\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n }\n\n .msg:hover .toolbar,\n .msg:focus-within .toolbar,\n .toolbar.pinned {\n opacity: 1;\n }\n\n @media (hover: none) {\n .toolbar {\n opacity: 1;\n }\n }\n\n .msg.bot .toolbar {\n margin-left: -6px;\n }\n\n .time {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-faint);\n padding: 0 6px;\n font-variant-numeric: tabular-nums;\n }\n\n .note {\n font-size: 12px;\n color: var(--c-muted);\n }\n\n .spacer {\n flex: 1;\n }\n\n .saved {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-family: var(--c-mono);\n font-size: 10.5px;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n color: var(--c-ink);\n }\n\n .saved svg {\n width: 12px;\n height: 12px;\n fill: currentColor;\n stroke: currentColor;\n stroke-width: 1.5;\n }\n\n .bot-body {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .edit-box {\n width: 440px;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r3);\n background: var(--c-bg);\n }\n\n .edit-box textarea {\n width: 100%;\n resize: vertical;\n font: inherit;\n font-size: 14px;\n line-height: 1.5;\n color: var(--c-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 4px;\n }\n\n .row-end {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n\n .btn {\n font-size: 12.5px;\n font-weight: 500;\n border-radius: var(--c-r);\n padding: 6px 12px;\n cursor: pointer;\n background: transparent;\n color: var(--c-muted);\n border: 1px solid var(--c-line);\n }\n\n .btn:hover {\n color: var(--c-ink);\n background: var(--c-bg2);\n }\n\n .btn.primary {\n background: var(--c-brand);\n color: var(--c-on-brand);\n border-color: var(--c-brand);\n }\n\n .btn.primary:hover {\n filter: brightness(1.2);\n }\n\n .error-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n font-size: 13px;\n color: var(--c-danger);\n border: 1px solid var(--sb-danger-border, #f3d6d3);\n background: var(--sb-danger-bg, #fdf1f0);\n border-radius: var(--c-r2);\n }\n\n .followups {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .followup {\n display: inline-flex;\n align-items: baseline;\n gap: 8px;\n text-align: left;\n font-size: 13px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 6px 12px;\n cursor: pointer;\n animation: aiIn 0.25s ease-out;\n }\n\n .followup:hover {\n background: var(--c-hover);\n }\n\n .followup .arrow {\n font-family: var(--c-mono);\n color: var(--c-muted);\n }\n\n .jump {\n position: absolute;\n left: 50%;\n bottom: 8px;\n transform: translateX(-50%);\n z-index: 5;\n font-size: 12.5px;\n font-weight: 500;\n color: var(--c-on-brand);\n background: var(--c-brand);\n border: none;\n border-radius: 999px;\n padding: 6px 14px;\n cursor: pointer;\n box-shadow: 0 8px 20px -10px rgba(22, 24, 26, 0.4);\n animation: aiIn 0.2s ease-out;\n }\n\n /* ── rendered answer ──────────────────────────────────── */\n\n .answer {\n display: flex;\n flex-direction: column;\n gap: 14px;\n font-size: 14.5px;\n line-height: 1.7;\n }\n\n .answer p {\n margin: 0;\n text-wrap: pretty;\n overflow-wrap: anywhere;\n }\n\n .answer .raw {\n white-space: pre-wrap;\n }\n\n .answer h3 {\n margin: 6px 0 0;\n font-size: 15.5px;\n font-weight: 600;\n letter-spacing: -0.01em;\n line-height: 1.4;\n }\n\n .answer ul,\n .answer ol {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .answer li {\n line-height: 1.65;\n padding-left: 2px;\n }\n\n .answer strong {\n font-weight: 600;\n }\n\n .answer a {\n color: var(--c-ink);\n text-underline-offset: 3px;\n }\n\n .answer code.inline {\n font-family: var(--c-mono);\n font-size: 12.5px;\n background: var(--c-hover);\n border-radius: calc(var(--c-r) * 0.75);\n padding: 1px 5px;\n }\n\n .answer h3.h1 {\n font-size: 18px;\n }\n\n .answer h3.h2 {\n font-size: 16.5px;\n }\n\n .answer h3.h4 {\n font-size: 14.5px;\n }\n\n .answer hr {\n width: 100%;\n border: none;\n border-top: 1px solid var(--c-line);\n margin: 4px 0;\n }\n\n .answer li.task {\n list-style: none;\n margin-left: -18px;\n }\n\n .answer li.task input {\n margin: 0 6px 0 0;\n vertical-align: -1px;\n accent-color: var(--c-brand);\n }\n\n .callout {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 13.5px;\n line-height: 1.6;\n padding: 10px 14px;\n border: 1px solid var(--c-line);\n border-left: 3px solid var(--callout, var(--c-ink));\n border-radius: var(--c-r2);\n background: color-mix(in srgb, var(--callout, var(--c-ink)) 7%, var(--c-bg));\n }\n\n .callout-title {\n font-weight: 600;\n color: var(--callout, var(--c-ink));\n }\n\n .callout.note {\n --callout: oklch(0.55 0.15 255);\n }\n\n .callout.tip {\n --callout: oklch(0.55 0.12 160);\n }\n\n .callout.important {\n --callout: oklch(0.52 0.17 300);\n }\n\n .callout.warning {\n --callout: oklch(0.6 0.14 70);\n }\n\n .callout.caution {\n --callout: var(--c-danger);\n }\n\n .jtree {\n padding: 10px 14px;\n overflow-x: auto;\n font-family: var(--c-mono);\n font-size: 12.5px;\n line-height: 1.7;\n }\n\n .jtree summary {\n cursor: pointer;\n list-style-position: outside;\n }\n\n .jkids {\n padding-left: 16px;\n border-left: 1px solid var(--c-line);\n margin-left: 4px;\n }\n\n .jkey {\n color: var(--c-ink2);\n }\n\n .jmeta {\n color: var(--c-muted);\n }\n\n .jv.string {\n color: oklch(0.52 0.12 160);\n }\n\n .jv.number {\n color: oklch(0.55 0.15 255);\n }\n\n .jv.boolean,\n .jv.null {\n color: oklch(0.52 0.17 300);\n }\n\n .table th button.sort {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font: inherit;\n color: inherit;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n .table th .arrow {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .table th[aria-sort=\"ascending\"] .arrow,\n .table th[aria-sort=\"descending\"] .arrow {\n opacity: 1;\n }\n\n .table-note {\n padding: 7px 12px;\n font-size: 12px;\n color: var(--c-muted);\n border-top: 1px solid var(--c-line2);\n background: var(--c-bg2);\n }\n\n figure.svg {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: flex-start;\n }\n\n figure.svg img {\n display: block;\n width: min(100%, 480px);\n height: auto;\n max-height: 420px;\n object-fit: contain;\n padding: 12px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: #ffffff;\n }\n\n .custom-block {\n min-width: 0;\n }\n\n .quote {\n font-size: 13.5px;\n line-height: 1.6;\n color: var(--c-ink2);\n background: var(--c-bg2);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 10px 14px;\n }\n\n .code {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n overflow: hidden;\n background: var(--c-bg2);\n }\n\n .code-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 12px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .code-head .label {\n font-size: 11px;\n }\n\n .text-btn {\n font-size: 12px;\n color: var(--c-muted);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n .text-btn:hover {\n color: var(--c-ink);\n }\n\n .text-btn.underline {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .code pre {\n margin: 0;\n padding: 12px 14px;\n overflow-x: auto;\n font-family: var(--c-mono);\n font-size: 13px;\n line-height: 1.6;\n }\n\n .table {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n overflow-x: auto;\n }\n\n .table table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n }\n\n .table th {\n text-align: left;\n font-size: 12px;\n font-weight: 500;\n color: var(--c-muted);\n background: var(--c-bg2);\n border-bottom: 1px solid var(--c-line);\n padding: 9px 12px;\n white-space: nowrap;\n }\n\n .table td {\n padding: 9px 12px;\n border-top: 1px solid var(--c-line2);\n white-space: nowrap;\n }\n\n .table th:first-child,\n .table td:first-child {\n min-width: 120px;\n }\n\n .cite {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 17px;\n height: 17px;\n padding: 0 4px;\n margin: 0 1px 0 3px;\n vertical-align: 2px;\n font: 500 10px var(--c-mono);\n border-radius: calc(var(--c-r) * 0.75);\n cursor: pointer;\n border: 1px solid var(--c-strong);\n background: var(--c-hover);\n color: var(--c-ink);\n }\n\n .cite:hover,\n .cite.active {\n background: var(--c-ink);\n color: var(--c-bg);\n border-color: var(--c-ink);\n }\n\n .chart {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 14px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 14px 16px 12px;\n background: var(--c-bg);\n }\n\n .chart-head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px 16px;\n }\n\n .chart-title {\n font-size: 13px;\n font-weight: 600;\n }\n\n .legend {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 12px;\n }\n\n .legend span {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--c-ink2);\n }\n\n .swatch {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n }\n\n .bars {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .bar-row {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr) 64px;\n align-items: center;\n gap: 12px;\n }\n\n .bar-label {\n font-size: 12.5px;\n color: var(--c-ink2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .bar-track {\n display: flex;\n height: 12px;\n background: var(--c-hover);\n border-radius: 2px;\n overflow: hidden;\n }\n\n .bar-fill {\n display: flex;\n height: 100%;\n transform-origin: left;\n animation: aiGrow 0.8s cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .bar-value {\n font-family: var(--c-mono);\n font-size: 11.5px;\n text-align: right;\n font-variant-numeric: tabular-nums;\n }\n\n .line-chart {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-left: 48px;\n }\n\n .plot {\n position: relative;\n height: 170px;\n }\n\n .tick {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 1px dashed var(--c-line2);\n }\n\n .tick.base {\n border-top: 1px solid var(--c-strong);\n }\n\n .tick span,\n .x-labels span {\n font-family: var(--c-mono);\n font-size: 10.5px;\n color: var(--c-faint);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n\n .tick span {\n position: absolute;\n right: calc(100% + 8px);\n top: -7px;\n }\n\n .plot svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n }\n\n .plot polyline {\n fill: none;\n stroke-width: 2;\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n stroke-dasharray: 1;\n animation: aiDraw 1s ease-out;\n }\n\n .x-labels {\n display: flex;\n justify-content: space-between;\n gap: 4px;\n }\n\n .chart-pending {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 190px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: linear-gradient(90deg, var(--c-bg2) 0%, var(--c-hover) 50%, var(--c-bg2) 100%);\n background-size: 200% 100%;\n animation: aiShimmer 1.6s linear infinite;\n }\n\n .gallery {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 10px;\n max-width: 520px;\n }\n\n .gallery.many {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n max-width: 100%;\n }\n\n .gallery figure {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n }\n\n .gallery img {\n width: 100%;\n aspect-ratio: 16 / 10;\n max-height: 320px;\n object-fit: contain;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg2);\n }\n\n .img-missing {\n aspect-ratio: 16 / 9;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--c-r2);\n border: 1px dashed var(--c-strong);\n background: repeating-linear-gradient(135deg, var(--c-bg2) 0 10px, var(--c-hover) 10px 20px);\n }\n\n figcaption {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .caret {\n display: inline-block;\n width: 7px;\n height: 15px;\n margin-top: -6px;\n background: var(--c-brand);\n animation: rgcaret 1s steps(1) infinite;\n }\n\n /* ── sources ──────────────────────────────────────────── */\n\n .retrieval {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: var(--c-bg2);\n }\n\n .retrieval-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n text-align: left;\n font-size: 12.5px;\n color: var(--c-ink2);\n background: none;\n border: none;\n padding: 9px 12px;\n cursor: pointer;\n }\n\n .retrieval-toggle .chev,\n .retrieval-toggle .ms {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n }\n\n .retrieval-list {\n display: flex;\n flex-direction: column;\n border-top: 1px solid var(--c-line);\n padding: 4px 12px;\n }\n\n .passage {\n display: grid;\n grid-template-columns: 22px minmax(0, 1fr) 64px;\n align-items: center;\n gap: 10px;\n width: 100%;\n text-align: left;\n background: none;\n border: none;\n border-bottom: 1px solid var(--c-line2);\n padding: 8px 0;\n cursor: pointer;\n }\n\n .passage:last-child {\n border-bottom: none;\n }\n\n .passage .n,\n .passage .score {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n font-variant-numeric: tabular-nums;\n }\n\n .passage .what {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n\n .passage .what span:first-child {\n font-size: 12.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .passage .what span:last-child {\n font-size: 11.5px;\n color: var(--c-muted);\n }\n\n .relevance {\n display: flex;\n flex-direction: column;\n gap: 3px;\n align-items: flex-end;\n }\n\n .relevance-track {\n width: 64px;\n height: 3px;\n background: var(--c-line);\n border-radius: 99px;\n overflow: hidden;\n }\n\n .relevance-fill {\n display: block;\n height: 100%;\n background: var(--c-brand);\n }\n\n .cards {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 8px;\n }\n\n .source-card {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n text-align: left;\n padding: 10px 12px;\n border-radius: var(--c-r2);\n cursor: pointer;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n }\n\n .source-card:hover,\n .source-card.active {\n border-color: var(--c-ink);\n }\n\n .source-card .top {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n .num {\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: calc(var(--c-r) * 0.75);\n border: 1px solid var(--c-strong);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--c-mono);\n font-size: 10px;\n background: var(--c-bg);\n }\n\n .source-card .t {\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .source-card .s {\n font-size: 12px;\n line-height: 1.45;\n color: var(--c-muted);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n background: var(--c-bg);\n border-left: 1px solid var(--c-line);\n animation: aiIn 0.15s ease-out;\n }\n\n .panel.docked {\n position: relative;\n flex: 0 0 400px;\n width: 400px;\n }\n\n .panel.overlay {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 30;\n width: min(420px, 100%);\n box-shadow: -12px 0 32px -16px rgba(22, 24, 26, 0.25);\n }\n\n .panel-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .panel-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 18px;\n }\n\n .panel-body h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .panel-meta {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .panel-meta .path {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n overflow-wrap: anywhere;\n }\n\n .panel-meta .meta {\n font-size: 12px;\n color: var(--c-muted);\n }\n\n .passage-box {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\n border-radius: var(--c-r2);\n background: var(--c-hover);\n border: 1px solid var(--c-strong);\n }\n\n .passage-box .text {\n font-size: 13px;\n line-height: 1.6;\n color: var(--c-ink2);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n\n .passage-foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--c-line);\n }\n\n .copy-ref {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r);\n padding: 4px 8px;\n cursor: pointer;\n }\n\n .copy-ref:hover {\n border-color: var(--c-strong);\n }\n\n .panel-foot {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 18px 16px;\n border-top: 1px solid var(--c-line);\n }\n\n .chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .chip {\n font-size: 12px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r);\n padding: 4px 8px;\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .chip:hover {\n border-color: var(--c-ink);\n }\n\n /* ── composer ─────────────────────────────────────────── */\n\n .composer-wrap {\n padding: 0 12px 12px;\n }\n\n .composer-wrap.reader {\n padding-top: 10px;\n }\n\n .composer-col {\n max-width: 760px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .composer-box {\n position: relative;\n }\n\n .composer {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px;\n border-radius: calc(var(--c-r) * 2.25);\n background: var(--c-bg);\n border: 1px solid var(--c-strong);\n box-shadow:\n 0 1px 2px rgba(22, 24, 26, 0.04),\n 0 12px 32px -18px rgba(22, 24, 26, 0.22);\n transition: border-color 0.15s;\n }\n\n .composer:focus-within {\n border-color: var(--c-ink);\n }\n\n .composer.busy {\n border-color: transparent;\n }\n\n :host([glow=\"off\"]) .composer.busy {\n border-color: var(--c-strong);\n }\n\n .composer textarea {\n width: 100%;\n resize: none;\n font: inherit;\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--c-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 6px 6px 2px;\n max-height: 176px;\n }\n\n .composer textarea::placeholder {\n color: var(--c-faint);\n }\n\n .composer-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n\n .attach {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12.5px;\n color: var(--c-muted);\n background: none;\n border: none;\n border-radius: var(--c-r);\n padding: 6px 8px;\n cursor: pointer;\n }\n\n .attach:hover {\n background: var(--c-hover);\n color: var(--c-ink);\n }\n\n .send {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-brand);\n cursor: pointer;\n background: var(--c-brand);\n color: var(--c-on-brand);\n transition: background 0.15s;\n }\n\n .send:disabled {\n cursor: default;\n background: var(--c-line);\n border-color: var(--c-line);\n color: var(--c-faint);\n }\n\n .send.stop {\n background: var(--c-bg);\n color: var(--c-ink);\n border-color: var(--c-ink);\n }\n\n .send.stop svg {\n fill: currentColor;\n stroke: none;\n }\n\n .pending-files {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 2px 2px 4px;\n }\n\n .pending-file {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px 4px 4px;\n font-size: 12.5px;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg2);\n animation: aiIn 0.2s ease-out;\n }\n\n .pending-file .ext {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--c-r);\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n font-family: var(--c-mono);\n font-size: 9px;\n letter-spacing: 0.03em;\n color: var(--c-muted);\n }\n\n .pending-file .meta {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n\n .pending-file.kept {\n background: var(--c-bg);\n border-style: dashed;\n }\n\n .pending-file .name {\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .pending-file .size {\n font-family: var(--c-mono);\n font-size: 10.5px;\n color: var(--c-muted);\n }\n\n .pending-file button {\n font-size: 15px;\n line-height: 1;\n color: var(--c-muted);\n background: none;\n border: none;\n padding: 0 0 0 2px;\n cursor: pointer;\n }\n\n .pending-file button:hover {\n color: var(--c-danger);\n }\n\n .footnote {\n text-align: center;\n font-size: 11.5px;\n color: var(--c-muted);\n }\n\n .branding {\n padding: 0 12px 10px;\n margin-top: -4px;\n }\n\n .toast {\n position: absolute;\n left: 50%;\n bottom: 124px;\n transform: translateX(-50%);\n z-index: 35;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 9px 14px;\n background: var(--c-ink);\n color: var(--c-bg);\n font-size: 13px;\n border-radius: var(--c-r2);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.25);\n white-space: nowrap;\n animation: aiIn 0.2s ease-out;\n }\n\n .toast button {\n font-size: 13px;\n font-weight: 500;\n color: var(--c-bg);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .drop {\n position: absolute;\n inset: 10px;\n z-index: 36;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n text-align: center;\n padding: 16px;\n border: 1.5px dashed var(--c-ink);\n border-radius: var(--c-r3);\n background: color-mix(in srgb, var(--c-bg) 92%, transparent);\n }\n\n .drop strong {\n font-size: 15px;\n font-weight: 600;\n }\n\n .drop span {\n font-size: 12.5px;\n color: var(--c-muted);\n }\n\n /* ── AI glow ──────────────────────────────────────────── */\n\n .halo {\n position: absolute;\n inset: -18px -24px;\n z-index: 0;\n pointer-events: none;\n opacity: var(--c-glow);\n }\n\n .halo::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 20px;\n background: var(--c-conic);\n filter: blur(32px);\n opacity: 0.45;\n animation:\n aiSpin 5s linear infinite,\n aiBreathe 2.6s ease-in-out infinite;\n }\n\n .arrived {\n position: absolute;\n inset: -12px -16px;\n z-index: 0;\n pointer-events: none;\n border-radius: var(--c-r4);\n animation: aiDone 2.6s ease-out forwards;\n }\n\n .arrived .wash {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: var(--c-conic);\n filter: blur(26px);\n opacity: calc(0.22 * var(--c-glow) + 0.06);\n animation: aiSpin 2.6s linear infinite;\n }\n\n .ring {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n padding: 1px;\n background: var(--c-conic);\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: aiSpin 2.6s linear infinite;\n pointer-events: none;\n }\n\n .arrived .sweep {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n overflow: hidden;\n }\n\n .arrived .sweep::before {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n oklch(0.88 0.07 260 / 0.5) 50%,\n transparent 75%\n );\n animation: aiSweep 1.6s cubic-bezier(0.3, 0.6, 0.3, 1) forwards;\n }\n\n .pill {\n position: relative;\n display: inline-flex;\n align-self: flex-start;\n align-items: center;\n gap: 9px;\n padding: 6px 14px 6px 10px;\n border-radius: 999px;\n background: var(--c-bg);\n box-shadow: 0 0 24px -6px oklch(0.7 0.15 280 / 0.5);\n animation: aiIn 0.25s ease-out;\n }\n\n .pill .ring {\n border-radius: 999px;\n animation-duration: 2.4s;\n }\n\n .pill .dot {\n width: 9px;\n height: 9px;\n border-radius: 50%;\n background: var(--c-conic);\n animation:\n aiSpin 1.6s linear infinite,\n aiPulse 1.6s ease-in-out infinite;\n }\n\n .pill .shimmer {\n font-size: 12.5px;\n font-weight: 500;\n background: linear-gradient(90deg, var(--c-faint) 0%, var(--c-ink) 45%, var(--c-faint) 90%);\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n animation: aiShimmer 1.8s linear infinite;\n }\n\n .composer-glow {\n position: absolute;\n inset: -4px;\n z-index: 0;\n border-radius: var(--c-r4);\n background: var(--c-conic);\n filter: blur(14px);\n opacity: calc(0.32 + 0.23 * (var(--c-glow) - 0.6) / 0.4);\n animation: aiSpin 4s linear infinite;\n pointer-events: none;\n }\n\n .composer-ring {\n position: absolute;\n inset: 0;\n z-index: 2;\n border-radius: calc(var(--c-r) * 2.25);\n pointer-events: none;\n }\n\n .composer-ring .ring {\n animation-duration: 3s;\n }\n\n :host([glow=\"off\"]) .halo,\n :host([glow=\"off\"]) .arrived,\n :host([glow=\"off\"]) .composer-glow,\n :host([glow=\"off\"]) .composer-ring,\n :host([glow=\"off\"]) .pill .ring {\n display: none;\n }\n\n :host([glow=\"off\"]) .pill {\n box-shadow: inset 0 0 0 1px var(--c-line);\n }\n\n :host([glow=\"off\"]) .pill .dot {\n background: var(--c-ink);\n }\n\n @keyframes aiSpin {\n to {\n --sb-ai-angle: 360deg;\n }\n }\n\n @keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n to {\n background-position: -200% 0;\n }\n }\n\n @keyframes aiBreathe {\n 0%,\n 100% {\n transform: scale(0.97);\n }\n 50% {\n transform: scale(1.03);\n }\n }\n\n @keyframes aiPulse {\n 0%,\n 100% {\n transform: scale(0.8);\n }\n 50% {\n transform: scale(1.15);\n }\n }\n\n @keyframes aiDone {\n 0% {\n opacity: 0;\n }\n 12% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n }\n\n @keyframes aiSweep {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(100%);\n }\n }\n\n @keyframes aiIn {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes scaleIn {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes aiGrow {\n from {\n transform: scaleX(0);\n }\n }\n\n @keyframes aiDraw {\n from {\n stroke-dashoffset: 1;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n\n @keyframes rgcaret {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n }\n .caret {\n display: none;\n }\n }\n\n @media print {\n .sidebar,\n .scrim,\n .header-right,\n .composer-wrap,\n .branding,\n .toolbar,\n .followups,\n .panel,\n .toast {\n display: none !important;\n }\n .frame,\n .scroller {\n overflow: visible;\n height: auto;\n }\n }\n`;\n","/**\n * Default copy for <singlebase-chat>. Same contract as the auth and upload\n * bags: flat strings, overridable in whole or in part through `.messages`.\n *\n * `{name}`, `{n}` and `{query}` are filled in by `fill()` from upload-messages.\n */\nexport interface SinglebaseChatMessages {\n // welcome, per mode\n eyebrowChat: string;\n eyebrowRag: string;\n headingChat: string;\n headingRag: string;\n descriptionChat: string;\n descriptionRag: string;\n eyebrowKb: string;\n headingKb: string;\n descriptionKb: string;\n\n // composer\n placeholderChat: string;\n placeholderRag: string;\n placeholderKb: string;\n footnote: string;\n attach: string;\n send: string;\n stop: string;\n removeFile: string;\n inThisChat: string;\n removeFromChat: string;\n attachmentFailed: string;\n dropTitle: string;\n dropSub: string;\n\n // status pills\n thinking: string;\n searching: string;\n\n // sidebar\n chats: string;\n newChat: string;\n searchChats: string;\n groupBookmarked: string;\n groupToday: string;\n groupYesterday: string;\n groupWeek: string;\n groupOlder: string;\n noChats: string;\n noMatch: string;\n loadingChats: string;\n showChats: string;\n hideSidebar: string;\n\n // header\n untitled: string;\n renameChat: string;\n bookmarkChat: string;\n unbookmarkChat: string;\n exportChat: string;\n deleteChat: string;\n expand: string;\n restore: string;\n minimize: string;\n\n // export menu\n exportHeading: string;\n exportMarkdown: string;\n exportJson: string;\n exportText: string;\n exportCopy: string;\n\n // message toolbar\n copy: string;\n copied: string;\n edit: string;\n saveResend: string;\n cancel: string;\n regenerate: string;\n helpful: string;\n notHelpful: string;\n markedHelpful: string;\n thanksFeedback: string;\n bookmarkMessage: string;\n unbookmarkMessage: string;\n deleteMessage: string;\n saved: string;\n stopped: string;\n emptyReply: string;\n newReply: string;\n you: string;\n\n // sources\n sourcesCited: string;\n sourcesRetrieved: string;\n searchedSources: string;\n sourceLabel: string;\n openSource: string;\n citedPassage: string;\n copyReference: string;\n alsoCited: string;\n close: string;\n\n // rendered blocks\n renderingChart: string;\n renderingSvg: string;\n copySvg: string;\n showRaw: string;\n showFormatted: string;\n showingRows: string;\n calloutNote: string;\n calloutTip: string;\n calloutImportant: string;\n calloutWarning: string;\n calloutCaution: string;\n\n // toasts\n undo: string;\n chatDeleted: string;\n messageDeleted: string;\n messageBookmarked: string;\n bookmarkRemoved: string;\n chatBookmarked: string;\n chatUnbookmarked: string;\n exported: string;\n copiedMarkdown: string;\n fileTooLarge: string;\n fileType: string;\n tooManyFiles: string;\n\n // errors\n errGeneric: string;\n errNotFound: string;\n errKbSource: string;\n errNoClient: string;\n errLoad: string;\n retry: string;\n offline: string;\n\n // launcher\n bubbleText: string;\n openChat: string;\n closeChat: string;\n dismiss: string;\n}\n\nexport const defaultChatMessages: SinglebaseChatMessages = {\n eyebrowChat: \"Chat\",\n eyebrowRag: \"Grounded answers\",\n headingChat: \"What can I help with?\",\n headingRag: \"Ask your knowledge base\",\n descriptionChat: \"Ask anything. Attach text files to give it more context.\",\n descriptionRag:\n \"Answers are grounded in your sources, with a citation for every claim. Attach text files to search them too.\",\n eyebrowKb: \"Knowledge base\",\n headingKb: \"Ask the knowledge base\",\n descriptionKb: \"Answers come only from the knowledge base, with a citation for every claim.\",\n\n placeholderChat: \"Message {name}…\",\n placeholderRag: \"Ask about your sources…\",\n placeholderKb: \"Ask the knowledge base…\",\n footnote: \"{name} can make mistakes. Check important details.\",\n attach: \"Attach files\",\n send: \"Send message\",\n stop: \"Stop generating\",\n removeFile: \"Remove file\",\n inThisChat: \"In this chat\",\n removeFromChat: \"Remove from this chat\",\n attachmentFailed: \"Couldn't read {name}.\",\n dropTitle: \"Drop files to attach\",\n dropSub: \"Text, Markdown, CSV and JSON files are added as context.\",\n\n thinking: \"Thinking\",\n searching: \"Searching sources\",\n\n chats: \"Chats\",\n newChat: \"New chat\",\n searchChats: \"Search chats\",\n groupBookmarked: \"Bookmarked\",\n groupToday: \"Today\",\n groupYesterday: \"Yesterday\",\n groupWeek: \"Previous 7 days\",\n groupOlder: \"Older\",\n noChats: \"No chats yet.\",\n noMatch: \"No chats match “{query}”.\",\n loadingChats: \"Loading chats\",\n showChats: \"Show chats\",\n hideSidebar: \"Hide sidebar\",\n\n untitled: \"New chat\",\n renameChat: \"Rename chat\",\n bookmarkChat: \"Bookmark chat\",\n unbookmarkChat: \"Remove chat bookmark\",\n exportChat: \"Export chat\",\n deleteChat: \"Delete chat\",\n expand: \"Expand\",\n restore: \"Restore size\",\n minimize: \"Minimize chat\",\n\n exportHeading: \"Export this chat\",\n exportMarkdown: \"Markdown\",\n exportJson: \"JSON\",\n exportText: \"Plain text\",\n exportCopy: \"Copy as Markdown\",\n\n copy: \"Copy\",\n copied: \"Copied\",\n edit: \"Edit and resend\",\n saveResend: \"Save & resend\",\n cancel: \"Cancel\",\n regenerate: \"Regenerate\",\n helpful: \"Helpful\",\n notHelpful: \"Not helpful\",\n markedHelpful: \"Marked helpful\",\n thanksFeedback: \"Thanks for the feedback\",\n bookmarkMessage: \"Bookmark message\",\n unbookmarkMessage: \"Remove bookmark\",\n deleteMessage: \"Delete message\",\n saved: \"Saved\",\n stopped: \"Stopped\",\n emptyReply: \"(empty response)\",\n newReply: \"New reply\",\n you: \"You\",\n\n sourcesCited: \"Cited sources\",\n sourcesRetrieved: \"Sources\",\n searchedSources: \"Searched {n} sources\",\n sourceLabel: \"Source {n}\",\n openSource: \"Open source {n}\",\n citedPassage: \"Cited passage\",\n copyReference: \"Copy passage with reference\",\n alsoCited: \"Also cited\",\n close: \"Close\",\n\n renderingChart: \"Rendering chart\",\n renderingSvg: \"Rendering drawing\",\n copySvg: \"Copy SVG\",\n showRaw: \"View raw\",\n showFormatted: \"View formatted\",\n showingRows: \"Showing {n} of {total} rows\",\n calloutNote: \"Note\",\n calloutTip: \"Tip\",\n calloutImportant: \"Important\",\n calloutWarning: \"Warning\",\n calloutCaution: \"Caution\",\n\n undo: \"Undo\",\n chatDeleted: \"Chat deleted\",\n messageDeleted: \"Message deleted\",\n messageBookmarked: \"Message bookmarked\",\n bookmarkRemoved: \"Bookmark removed\",\n chatBookmarked: \"Chat bookmarked\",\n chatUnbookmarked: \"Chat removed from bookmarks\",\n exported: \"Exported {name}\",\n copiedMarkdown: \"Copied as Markdown\",\n fileTooLarge: \"{name} is larger than {size}.\",\n fileType: \"{name} isn't a text file.\",\n tooManyFiles: \"Attach up to {n} files at a time.\",\n\n errGeneric: \"Something went wrong.\",\n errNotFound: \"This chat no longer exists. Retry to start a new one.\",\n errKbSource: \"No knowledge base is set up for this chat.\",\n errNoClient: \"Chat isn't connected. Create a SinglebaseClient() on this page.\",\n errLoad: \"Couldn't load this chat.\",\n retry: \"Retry\",\n offline: \"You're offline. Messages will send when you reconnect.\",\n\n bubbleText: \"Hi! Questions? Ask me here.\",\n openChat: \"Open chat\",\n closeChat: \"Close chat\",\n dismiss: \"Dismiss\"\n};\n\nexport function resolveChatMessages(\n overrides: Partial<SinglebaseChatMessages> | undefined\n): SinglebaseChatMessages {\n return { ...defaultChatMessages, ...(overrides ?? {}) };\n}\n","/**\n * The Markdown <singlebase-chat> renders, parsed into plain blocks. Nothing\n * here produces HTML: the element turns blocks into Lit templates, so model\n * output is always text, never markup.\n *\n * Blocks: paragraphs, `#`–`####` headings, nested `-`/`*`/`1.` lists and task\n * lists, `>` quotes, `> [!NOTE]` callouts, `---` rules, pipe tables (with\n * alignment), `` images, and fenced code. Fences with a known\n * language become richer blocks: ```chart, ```csv / ```tsv, ```json,\n * ```callout and ```svg.\n *\n * Inline: `**bold**`, `*italic*` / `_italic_`, `~~strike~~`, `` `code` ``,\n * `[text](https://…)`, bare https links and `[n]` citations.\n */\n\nexport interface ChartSeries {\n name: string;\n values: number[];\n}\n\nexport interface ChartSpec {\n type: \"bar\" | \"line\";\n title: string;\n unit: string;\n labels: string[];\n series: ChartSeries[];\n}\n\nexport interface ImageRef {\n alt: string;\n src: string;\n}\n\nexport interface ListItem {\n text: string;\n /** Nesting level, 0 for top-level items. */\n depth: number;\n /** A task list item's state, or null for an ordinary item. */\n checked: boolean | null;\n}\n\nexport type Align = \"left\" | \"center\" | \"right\" | null;\nexport type CalloutKind = \"note\" | \"tip\" | \"important\" | \"warning\" | \"caution\";\n\nexport type Block =\n | { type: \"p\"; text: string }\n | { type: \"h\"; level: number; text: string }\n | { type: \"list\"; ordered: boolean; items: ListItem[] }\n | { type: \"quote\"; text: string }\n | { type: \"hr\" }\n | { type: \"code\"; lang: string; text: string }\n | { type: \"table\"; head: string[]; rows: string[][]; align: Align[] }\n | { type: \"chart\"; spec: ChartSpec }\n | { type: \"json\"; value: unknown; source: string }\n | { type: \"callout\"; kind: CalloutKind; title: string; text: string }\n | { type: \"svg\"; source: string }\n | { type: \"img\"; images: ImageRef[] }\n | { type: \"pending\"; kind: \"chart\" | \"svg\" }\n | { type: \"raw\"; text: string };\n\nexport type Segment =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; text: string }\n | { type: \"italic\"; text: string }\n | { type: \"strike\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string }\n | { type: \"cite\"; n: number };\n\n/**\n * How much of a reply is formatted. `raw` shows the text exactly as written,\n * `plain` is text with light formatting, `advanced` adds tables, CSV, JSON and\n * SVG, and `rich` adds callouts, charts, images and the host's own blocks.\n */\nexport type ChatFormat = \"raw\" | \"plain\" | \"advanced\" | \"rich\";\n\nconst TABLE_ROW = /^\\|.*\\|$/;\nconst TABLE_RULE = /^\\|[\\s:|-]+\\|$/;\nconst IMAGE_LINE = /^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/;\nconst LIST_ITEM = /^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/;\nconst TASK = /^\\[( |x|X)\\]\\s+/;\nconst RULE = /^(-{3,}|\\*{3,}|_{3,})$/;\nconst ALERT = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*(.*)$/i;\nconst CALLOUT_KINDS: CalloutKind[] = [\"note\", \"tip\", \"important\", \"warning\", \"caution\"];\n\n/** Parses `text` into blocks. An unclosed fence is still streaming. */\nexport function parseMarkdown(text: string): Block[] {\n const blocks: Block[] = [];\n const parts = (text ?? \"\").replace(/\\r/g, \"\").split(\"```\");\n\n parts.forEach((part, index) => {\n if (index % 2 === 1) {\n const newline = part.indexOf(\"\\n\");\n const info = (newline > -1 ? part.slice(0, newline) : part).trim();\n const body = (newline > -1 ? part.slice(newline + 1) : \"\").replace(/\\n$/, \"\");\n blocks.push(fencedBlock(info, body, index === parts.length - 1));\n return;\n }\n\n for (const chunk of part.split(/\\n{2,}/)) {\n if (!chunk.trim()) continue;\n blocks.push(...parseChunk(chunk));\n }\n });\n\n return blocks;\n}\n\nfunction fencedBlock(info: string, body: string, open: boolean): Block {\n const [word = \"\", ...rest] = info.split(/\\s+/);\n const lang = word.toLowerCase();\n\n if (lang === \"chart\") {\n const spec = open ? null : parseChart(body);\n return spec ? { type: \"chart\", spec } : { type: \"pending\", kind: \"chart\" };\n }\n if (lang === \"svg\") {\n return open || !/<svg[\\s>]/i.test(body)\n ? { type: \"pending\", kind: \"svg\" }\n : { type: \"svg\", source: body.trim() };\n }\n if (!open && (lang === \"csv\" || lang === \"tsv\")) {\n const rows = parseDelimited(body, lang === \"tsv\" ? \"\\t\" : \",\");\n if (rows.length > 1) {\n return { type: \"table\", head: rows[0], rows: rows.slice(1), align: rows[0].map(() => null) };\n }\n }\n if (!open && lang === \"json\") {\n try {\n return { type: \"json\", value: JSON.parse(body), source: body };\n } catch {\n /* not valid JSON: show it as code */\n }\n }\n if (lang === \"callout\") {\n const kind = (rest[0] ?? \"\").toLowerCase() as CalloutKind;\n const known = CALLOUT_KINDS.includes(kind);\n return {\n type: \"callout\",\n kind: known ? kind : \"note\",\n title: (known ? rest.slice(1) : rest).join(\" \"),\n text: body.trim()\n };\n }\n return { type: \"code\", lang: lang || \"code\", text: body };\n}\n\nfunction parseChunk(chunk: string): Block[] {\n const raw = chunk.split(\"\\n\").filter((line) => line.trim());\n const lines = raw.map((line) => line.trim());\n\n if (lines.length > 1 && lines.every((line) => TABLE_ROW.test(line))) {\n const cells = (line: string) =>\n line\n .replace(/^\\||\\|$/g, \"\")\n .split(\"|\")\n .map((cell) => cell.trim());\n const ruleIndex = lines.findIndex((line) => TABLE_RULE.test(line));\n const align: Align[] =\n ruleIndex > -1\n ? cells(lines[ruleIndex]).map((cell) =>\n /^:-+:$/.test(cell)\n ? \"center\"\n : /^-+:$/.test(cell)\n ? \"right\"\n : /^:-+$/.test(cell)\n ? \"left\"\n : null\n )\n : [];\n const rows = lines.filter((line) => !TABLE_RULE.test(line)).map(cells);\n const head = rows[0] ?? [];\n return [\n { type: \"table\", head, rows: rows.slice(1), align: head.map((_, i) => align[i] ?? null) }\n ];\n }\n\n if (lines.length === 1 && RULE.test(lines[0])) return [{ type: \"hr\" }];\n\n if (lines.every((line) => IMAGE_LINE.test(line))) {\n return [\n {\n type: \"img\",\n images: lines.map((line) => {\n const match = line.match(IMAGE_LINE)!;\n return { alt: match[1], src: match[2] };\n })\n }\n ];\n }\n\n if (lines.every((line) => line.startsWith(\">\"))) {\n const body = lines.map((line) => line.replace(/^>\\s?/, \"\"));\n const alert = body[0].match(ALERT);\n if (alert) {\n return [\n {\n type: \"callout\",\n kind: alert[1].toLowerCase() as CalloutKind,\n title: alert[2].trim(),\n text: body.slice(1).join(\"\\n\").trim()\n }\n ];\n }\n return [{ type: \"quote\", text: body.join(\" \") }];\n }\n\n if (LIST_ITEM.test(raw[0])) {\n const items: ListItem[] = [];\n for (const line of raw) {\n const match = line.match(LIST_ITEM);\n if (match) {\n const task = match[3].match(TASK);\n items.push({\n text: task ? match[3].replace(TASK, \"\") : match[3],\n depth: Math.min(3, Math.floor(match[1].replace(/\\t/g, \" \").length / 2)),\n checked: task ? task[1] !== \" \" : null\n });\n } else {\n // A wrapped line belongs to the item above it.\n items[items.length - 1].text += ` ${line.trim()}`;\n }\n }\n return [{ type: \"list\", ordered: /^\\s*\\d/.test(raw[0]), items }];\n }\n\n // A heading followed by more lines in the same chunk: split it off.\n const heading = lines[0].match(/^(#{1,4})\\s+(.*)$/);\n if (heading) {\n const rest = raw.slice(1).join(\"\\n\");\n return [\n { type: \"h\", level: heading[1].length, text: heading[2] },\n ...(rest ? parseChunk(rest) : [])\n ];\n }\n\n return [{ type: \"p\", text: lines.join(\" \") }];\n}\n\n/** CSV/TSV with quoted fields. Rows are padded to the header's width. */\nexport function parseDelimited(body: string, separator = \",\"): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n const text = body.replace(/\\r/g, \"\");\n\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"' && text[i + 1] === '\"') {\n field += '\"';\n i++;\n } else if (c === '\"') quoted = false;\n else field += c;\n } else if (c === '\"' && field === \"\") quoted = true;\n else if (c === separator) {\n row.push(field.trim());\n field = \"\";\n } else if (c === \"\\n\") {\n row.push(field.trim());\n if (row.some(Boolean)) rows.push(row);\n row = [];\n field = \"\";\n } else field += c;\n }\n row.push(field.trim());\n if (row.some(Boolean)) rows.push(row);\n\n const width = rows[0]?.length ?? 0;\n return rows.map((r) => (r.length < width ? [...r, ...Array(width - r.length).fill(\"\")] : r));\n}\n\n/** A ```chart body, or null when it is not a usable spec. */\nexport function parseChart(body: string): ChartSpec | null {\n let raw: any;\n try {\n raw = JSON.parse(body);\n } catch {\n return null;\n }\n if (!raw || typeof raw !== \"object\") return null;\n const series = (Array.isArray(raw.series) ? raw.series : [])\n .filter((entry: any) => entry && Array.isArray(entry.values))\n .map((entry: any, index: number) => ({\n name: String(entry.name ?? `Series ${index + 1}`),\n values: entry.values.map((value: unknown) => Number(value) || 0)\n }));\n if (!series.length) return null;\n const labels = Array.isArray(raw.labels)\n ? raw.labels.map(String)\n : series[0].values.map((_: number, i: number) => String(i + 1));\n return {\n type: raw.type === \"line\" ? \"line\" : \"bar\",\n title: String(raw.title ?? \"\"),\n unit: String(raw.unit ?? \"\"),\n labels,\n series\n };\n}\n\nconst INLINE = new RegExp(\n [\n /\\*\\*([^*]+)\\*\\*/.source, // 1 bold\n /~~([^~]+)~~/.source, // 2 strike\n /`([^`]+)`/.source, // 3 code\n /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/.source, // 4, 5 link\n /(https?:\\/\\/[^\\s<>()]*[^\\s<>().,;:!?'\"\\]])/.source, // 6 bare link\n /(?<![\\w*])\\*(?![\\s*])([^*\\n]+?)\\*(?![\\w*])/.source, // 7 *italic*\n /(?<![\\w_])_(?![\\s_])([^_\\n]+?)_(?![\\w_])/.source, // 8 _italic_\n /\\s?\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/.source // 9 citation\n ].join(\"|\"),\n \"g\"\n);\n\n/**\n * Inline segments of one line. Citations only become chips when `maxCite`\n * is at least the cited number; anything else stays literal text.\n */\nexport function parseInline(text: string, maxCite = 0): Segment[] {\n const out: Segment[] = [];\n let last = 0;\n let match: RegExpExecArray | null;\n INLINE.lastIndex = 0;\n\n const pushText = (value: string) => {\n if (!value) return;\n const prev = out[out.length - 1];\n if (prev?.type === \"text\") prev.text += value;\n else out.push({ type: \"text\", text: value });\n };\n\n while ((match = INLINE.exec(text))) {\n pushText(text.slice(last, match.index));\n if (match[1] !== undefined) out.push({ type: \"bold\", text: match[1] });\n else if (match[2] !== undefined) out.push({ type: \"strike\", text: match[2] });\n else if (match[3] !== undefined) out.push({ type: \"code\", text: match[3] });\n else if (match[4] !== undefined) out.push({ type: \"link\", text: match[4], href: match[5] });\n else if (match[6] !== undefined) out.push({ type: \"link\", text: match[6], href: match[6] });\n else if (match[7] !== undefined) out.push({ type: \"italic\", text: match[7] });\n else if (match[8] !== undefined) out.push({ type: \"italic\", text: match[8] });\n else {\n const numbers = match[9].split(\",\").map((n) => Number(n.trim()));\n const valid = numbers.filter((n) => n >= 1 && n <= maxCite);\n if (!maxCite) pushText(match[0]);\n else valid.forEach((n) => out.push({ type: \"cite\", n }));\n }\n last = match.index + match[0].length;\n }\n pushText(text.slice(last));\n return out;\n}\n\n/**\n * Tidies the tail of a reply that is still arriving, so half-written syntax\n * doesn't flash on screen: an unfinished table row, link or image is held\n * back, and an unpaired `**`, `~~` or backtick is dropped until its partner\n * arrives. Only the last paragraph outside a code fence is touched.\n */\nexport function settleStreaming(text: string): string {\n if (((text ?? \"\").match(/```/g) ?? []).length % 2 === 1) return text;\n const cut = text.lastIndexOf(\"\\n\\n\");\n const head = cut > -1 ? text.slice(0, cut + 2) : \"\";\n let tail = cut > -1 ? text.slice(cut + 2) : text;\n\n const lines = tail.split(\"\\n\");\n const last = lines[lines.length - 1];\n if (last.trimStart().startsWith(\"|\") && !last.trimEnd().endsWith(\"|\")) lines.pop();\n tail = lines.join(\"\\n\");\n\n tail = tail.replace(/!?\\[[^\\]\\n]*(\\]\\([^)\\n]*)?$/, \"\");\n for (const marker of [\"**\", \"~~\", \"`\"]) {\n const count = tail.split(marker).length - 1;\n if (count % 2 === 1) {\n const at = tail.lastIndexOf(marker);\n tail = tail.slice(0, at) + tail.slice(at + marker.length);\n }\n }\n return head + tail;\n}\n\n/** Every citation number used in `text`. */\nexport function citedNumbers(text: string): Set<number> {\n const found = new Set<number>();\n for (const group of (text ?? \"\").match(/\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/g) ?? []) {\n group\n .replace(/[[\\]]/g, \"\")\n .split(\",\")\n .forEach((n) => found.add(Number(n.trim())));\n }\n return found;\n}\n\nfunction chartRows(spec: ChartSpec): string[][] {\n return [\n [\"\", ...spec.series.map((s) => s.name)],\n ...spec.labels.map((label, i) => [\n label,\n ...spec.series.map((s) => (s.values[i] === undefined ? \"\" : `${s.values[i]}${spec.unit}`))\n ])\n ];\n}\n\nconst rowsText = (rows: string[][]) => rows.map((r) => r.join(\" · \")).join(\"\\n\");\nconst CALLOUT_LABELS: Record<CalloutKind, string> = {\n note: \"Note\",\n tip: \"Tip\",\n important: \"Important\",\n warning: \"Warning\",\n caution: \"Caution\"\n};\n\n/**\n * Applies the format level. Blocks a level doesn't draw become the nearest\n * thing it does, so nothing the model wrote is ever lost:\n *\n * - `rich`: everything as written.\n * - `advanced`: tables, CSV, JSON and SVG; charts become data tables,\n * callouts become quotes, images become \"Image: alt\".\n * - `plain`: text only; tables become plain rows, data and SVG become code.\n *\n * `raw` never gets here: the element shows the text without parsing it.\n */\nexport function adaptBlocks(blocks: Block[], level: Exclude<ChatFormat, \"raw\">): Block[] {\n if (level === \"rich\") return blocks;\n const simple = level === \"plain\";\n\n return blocks.map((block): Block => {\n switch (block.type) {\n case \"chart\": {\n const [head, ...rows] = chartRows(block.spec);\n if (simple) {\n return {\n type: \"raw\",\n text: [block.spec.title, rowsText([head, ...rows])].filter(Boolean).join(\"\\n\")\n };\n }\n return {\n type: \"table\",\n head: block.spec.title ? [block.spec.title, ...head.slice(1)] : head,\n rows,\n align: head.map(() => null)\n };\n }\n case \"pending\":\n return block.kind === \"svg\" && !simple ? block : { type: \"raw\", text: \"\" };\n case \"callout\":\n return {\n type: \"quote\",\n text: `**${block.title || CALLOUT_LABELS[block.kind]}** ${block.text}`.trim()\n };\n case \"img\":\n return {\n type: \"p\",\n text: block.images.map((image) => `Image: ${image.alt || \"untitled\"}`).join(\" · \")\n };\n case \"table\":\n return simple ? { type: \"raw\", text: rowsText([block.head, ...block.rows]) } : block;\n case \"json\":\n return simple ? { type: \"code\", lang: \"json\", text: block.source } : block;\n case \"svg\":\n return simple ? { type: \"code\", lang: \"svg\", text: block.source } : block;\n default:\n return block;\n }\n });\n}\n\n/**\n * Splits the `FOLLOWUPS:` tail the model is asked to write off the visible\n * answer. Questions may be `|`-separated or one per line.\n */\nexport function splitFollowups(content: string): { text: string; followups: string[] } {\n const source = content ?? \"\";\n const index = source.search(/FOLLOWUPS:/i);\n if (index < 0) return { text: source.trim(), followups: [] };\n const tail = source.slice(index).replace(/^FOLLOWUPS:/i, \"\");\n const followups = tail\n .split(/\\||\\n/)\n .map((q) => q.replace(/^\\s*(?:[-*↳→]|\\d+[.)])\\s*/, \"\").trim())\n .filter(Boolean)\n .slice(0, 3);\n return { text: source.slice(0, index).trim(), followups };\n}\n\n/** A one-line plain rendering, for snippets and search. */\nexport function plainText(text: string): string {\n return (text ?? \"\")\n .replace(/```(\\w*)[\\s\\S]*?(```|$)/g, (_m, lang) =>\n lang === \"chart\" ? \"[Chart] \" : lang === \"svg\" ? \"[Drawing] \" : \"[Code] \"\n )\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"[Image: $1]\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\")\n .replace(/\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]/gi, \"\")\n .replace(/[*#>`~]/g, \"\")\n .replace(/\\|/g, \" \")\n .replace(/\\s?\\[\\d+(?:\\s*,\\s*\\d+)*\\]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\n/** The first message, cut at a word boundary: a title until a better one lands. */\nexport function provisionalTitle(text: string, max = 48): string {\n const clean = plainText(text);\n if (clean.length <= max) return clean;\n const cut = clean.slice(0, max);\n const space = cut.lastIndexOf(\" \");\n return (space > max / 2 ? cut.slice(0, space) : cut).trim();\n}\n\n/** A model-written title: no quotes, no trailing punctuation, 80 characters. */\nexport function cleanTitle(value: unknown): string {\n return String(value ?? \"\")\n .split(\"\\n\")[0]\n .trim()\n .replace(/^[\"'“”‘’]+|[\"'“”‘’]+$/g, \"\")\n .replace(/^title:\\s*/i, \"\")\n .replace(/[.!?:;,]+$/, \"\")\n .trim()\n .slice(0, 80);\n}\n\n/** Only these reach an `<img src>` or a link: no javascript:, no stray schemes. */\nexport function isSafeUrl(url: string, image = false): boolean {\n if (/^https?:\\/\\//i.test(url)) return true;\n return image && /^(blob:|data:image\\/)/i.test(url);\n}\n","/**\n * Model-written SVG, made safe to show.\n *\n * The real protection is how it's shown: as an `<img>` data URL, where the\n * browser runs no scripts and loads no external resources. On top of that\n * the markup is cleaned, so what we hand the browser has no scripts, event\n * handlers, embedded HTML or outside references to begin with.\n */\n\nconst MAX_SVG_BYTES = 200_000;\n\nconst DROP_ELEMENTS = new Set([\n \"script\",\n \"foreignobject\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"image\",\n \"audio\",\n \"video\",\n \"animate\",\n \"set\",\n \"animatemotion\",\n \"animatetransform\",\n \"handler\",\n \"listener\"\n]);\n\n/** The cleaned SVG as a data URL for `<img src>`, or null when it isn't usable. */\nexport function svgDataUrl(source: string): string | null {\n if (!source || source.length > MAX_SVG_BYTES || typeof DOMParser === \"undefined\") return null;\n\n const doc = new DOMParser().parseFromString(source, \"image/svg+xml\");\n const root = doc.documentElement;\n if (!root || root.nodeName.toLowerCase() !== \"svg\" || doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const walk = (el: Element) => {\n for (const child of Array.from(el.children)) {\n const name = child.nodeName.toLowerCase();\n if (DROP_ELEMENTS.has(name)) child.remove();\n else if (name === \"a\") {\n // Links can't work inside an image; keep what they wrap.\n const inner = Array.from(child.childNodes);\n child.replaceWith(...inner);\n inner.forEach((node) => node instanceof Element && walk(node));\n } else walk(child);\n }\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const external = (name === \"href\" || name.endsWith(\":href\")) && !value.startsWith(\"#\");\n const scripted = value.includes(\"javascript:\") || /url\\(\\s*['\"]?(?!#)/.test(value);\n if (name.startsWith(\"on\") || external || scripted) el.removeAttribute(attr.name);\n }\n };\n walk(root);\n // <style> may pull in outside resources; keep its rules, drop any url() or @import.\n for (const style of Array.from(root.querySelectorAll(\"style\"))) {\n style.textContent = (style.textContent ?? \"\")\n .replace(/@import[^;]*;?/gi, \"\")\n .replace(/url\\(\\s*['\"]?(?!#)[^)]*\\)/gi, \"none\");\n }\n\n root.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n const markup = new XMLSerializer().serializeToString(root);\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n","import { LitElement, html, nothing, svg, type PropertyValues, type TemplateResult } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { getDefaultClient } from \"@singlebase/core\";\nimport type { SinglebaseClientInstance } from \"@singlebase/singlebase-sdk\";\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { chatStyles } from \"../styles/chat.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport { resolveChatMessages, type SinglebaseChatMessages } from \"../chat-messages.js\";\nimport { fill } from \"../upload-messages.js\";\nimport { formatSize } from \"../utils/files.js\";\nimport {\n adaptBlocks,\n citedNumbers,\n cleanTitle,\n isSafeUrl,\n parseInline,\n parseMarkdown,\n plainText,\n provisionalTitle,\n settleStreaming,\n splitFollowups,\n type Block,\n type ChartSpec,\n type ListItem,\n type ChatFormat\n} from \"../utils/markdown.js\";\nimport { svgDataUrl } from \"../utils/svg.js\";\n\n// ── public types ───────────────────────────────────────────\n\n/**\n * How answers use sources: `chat` free-form, `rag` prefers sources and cites\n * them, `kb` answers only from sources (docsets, retrieval, attachments).\n */\nexport type ChatMode = \"chat\" | \"rag\" | \"kb\";\nexport type ChatEmbed = \"page\" | \"inline\" | \"launcher\";\nexport type ChatGlow = \"subtle\" | \"vivid\" | \"off\";\nexport type ChatExportFormat = \"md\" | \"txt\" | \"json\" | \"copy\";\n/** `auto` docks when there's room; `none` removes the list and its toggle. */\nexport type ChatSidebar = \"auto\" | \"open\" | \"closed\" | \"none\";\n\n/** What the chat needs from a client: `llm.call`, and nothing else. */\nexport type ChatClient = {\n llm: {\n call<T = unknown>(\n method: string,\n payload?: unknown,\n options?: { signal?: AbortSignal }\n ): Promise<T>;\n };\n};\n\n/** A row of `llm.list_chats`. */\nexport interface ChatSummary {\n _id: string;\n title: string | null;\n bookmarked?: boolean;\n message_count?: number;\n _created_at?: string;\n _modified_at?: string;\n}\n\n/** A text file attached to one message, sent to the model as retrieval. */\nexport interface ChatAttachment {\n name: string;\n size: number;\n content: string;\n mime?: string;\n}\n\n/** A file the service keeps on the chat (attachments-mode=\"payload\"). */\nexport interface ChatSavedAttachment {\n id: string;\n name: string;\n type?: string;\n mime?: string;\n size?: number;\n status?: string;\n}\n\nexport interface ChatMessage {\n /** Local identity, stable across renders. */\n key: string;\n /** The server's message id, once known. Bookmark and delete need it. */\n id: string | null;\n role: \"user\" | \"assistant\";\n /** The text. For replies, the FOLLOWUPS tail is already split off. */\n content: string;\n at: number;\n bookmarked: boolean;\n /** Retrieved documents the reply used, as the server recorded them. */\n sources: Record<string, unknown>[];\n followups: string[];\n phase: \"pending\" | \"streaming\" | \"done\" | \"error\";\n error?: string;\n stopped?: boolean;\n feedback?: \"up\" | \"down\";\n attachments?: ChatAttachment[];\n execTime?: number;\n model?: string;\n}\n\n/**\n * Draws a fenced block the host knows about, e.g. ```order {\"id\":\"A-1\"}```.\n * Return a Lit template, a DOM node or text; return null to fall back to code.\n */\nexport type ChatBlockRenderer = (\n source: string,\n context: { lang: string; message: ChatMessage }\n) => unknown;\n\n/**\n * Runs before each message is sent. Return the payload (changed or not), a new\n * payload, or `false` to cancel. Anything else stops the send.\n */\nexport type ChatBeforeSend = (\n payload: Record<string, unknown>,\n context: { chatId: string | null; isNew: boolean; message: ChatMessage }\n) => Record<string, unknown> | false | Promise<Record<string, unknown> | false>;\n\n/** Runs after a reply is parsed. Return the blocks to draw. */\nexport type ChatAfterParse = (\n blocks: Block[],\n context: { message: ChatMessage; format: ChatFormat }\n) => Block[];\n\nexport interface ChatPrompt {\n label?: string;\n text: string;\n}\n\n/** Every setting in one object, keyed by property name. */\nexport interface ChatConfig {\n /** The client to chat with. Defaults to the page's SinglebaseClient(). */\n client: ChatClient | null;\n /** Opens this saved chat. */\n chatId: string;\n embed: ChatEmbed;\n mode: ChatMode;\n format: ChatFormat;\n renderers: Record<string, ChatBlockRenderer>;\n beforeSend: ChatBeforeSend | null;\n afterParse: ChatAfterParse | null;\n glow: ChatGlow;\n position: \"right\" | \"left\";\n sidebar: ChatSidebar;\n showTitle: boolean;\n assistantName: string;\n logoUrl: string;\n heading: string;\n description: string;\n eyebrow: string;\n prompts: string | (string | ChatPrompt)[];\n bubbleText: string;\n greetingBubble: boolean;\n unreadBadge: boolean;\n allowUpload: boolean;\n allowExport: boolean;\n allowRaw: boolean;\n allowCopy: boolean;\n allowRegenerate: boolean;\n allowBookmark: boolean;\n allowDelete: boolean;\n allowRename: boolean;\n allowFeedback: boolean;\n showTime: boolean;\n showComposer: boolean;\n footnote: string;\n branding: boolean;\n followups: boolean;\n docsets: string | string[];\n attachmentsMode: \"retrieval\" | \"payload\";\n saveAttachments: boolean;\n showFollowups: boolean;\n showSources: boolean;\n showNewChat: boolean;\n showBookmarked: boolean;\n allowSearch: boolean;\n autoTitle: boolean;\n model: string;\n params: Record<string, unknown>;\n systemMessage: string;\n retrieval: Record<string, unknown>[];\n metadata: Record<string, unknown>;\n messages: Partial<SinglebaseChatMessages>;\n theme: \"light\" | \"dark\";\n radius: \"sharp\" | \"default\" | \"round\";\n}\n\nconst CONFIG_KEYS: readonly (keyof ChatConfig)[] = [\n \"embed\",\n \"mode\",\n \"format\",\n \"renderers\",\n \"beforeSend\",\n \"afterParse\",\n \"glow\",\n \"position\",\n \"sidebar\",\n \"showTitle\",\n \"assistantName\",\n \"logoUrl\",\n \"heading\",\n \"description\",\n \"eyebrow\",\n \"prompts\",\n \"bubbleText\",\n \"greetingBubble\",\n \"unreadBadge\",\n \"allowUpload\",\n \"allowExport\",\n \"allowRaw\",\n \"allowCopy\",\n \"allowRegenerate\",\n \"allowBookmark\",\n \"allowDelete\",\n \"allowRename\",\n \"allowFeedback\",\n \"showTime\",\n \"showComposer\",\n \"footnote\",\n \"branding\",\n \"followups\",\n \"docsets\",\n \"attachmentsMode\",\n \"saveAttachments\",\n \"showFollowups\",\n \"showSources\",\n \"showNewChat\",\n \"showBookmarked\",\n \"allowSearch\",\n \"autoTitle\",\n \"model\",\n \"params\",\n \"systemMessage\",\n \"retrieval\",\n \"metadata\",\n \"messages\",\n \"theme\",\n \"radius\"\n];\n\n// ── attribute converters ───────────────────────────────────\n\n/** JSON in markup, an object or array in JavaScript. Bad JSON is ignored. */\nconst jsonAttr = {\n fromAttribute: (value: string | null) => {\n if (!value) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n console.warn(\"[singlebase-chat] an attribute holds invalid JSON; ignoring it\");\n return undefined;\n }\n },\n toAttribute: (value: unknown) => JSON.stringify(value ?? null)\n};\n\n/** Present-but-empty means true, so `branding` and `branding=\"false\"` both read. */\nconst flagAttr = {\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\n/** Bare `sidebar` or `=\"true\"` means open, `=\"false\"` closed; unknown is auto. */\nconst sidebarAttr = {\n fromAttribute: (value: string | null): ChatSidebar => {\n if (value === null) return \"auto\";\n if (value === \"\" || value === \"true\") return \"open\";\n if (value === \"false\") return \"closed\";\n return ([\"auto\", \"open\", \"closed\", \"none\"] as const).includes(value as ChatSidebar)\n ? (value as ChatSidebar)\n : \"auto\";\n },\n toAttribute: (value: ChatSidebar) => (value === \"auto\" ? null : value)\n};\n\n// ── constants ──────────────────────────────────────────────\n\nconst SIDEBAR_WIDTH = 272;\nconst DOCK_SIDEBAR_AT = 820;\nconst DOCK_PANEL_AT = 940;\nconst MAX_FILES = 5;\nconst MAX_FILE_SIZE = 512 * 1024;\nconst TEXT_FILE = /\\.(md|markdown|txt|csv|tsv|json|html?|ya?ml|xml|log)$/i;\nconst TOAST_MS = 5000;\nconst MAX_TABLE_ROWS = 200;\nconst MAX_JSON_NODES = 2000;\nconst CALLOUT_MESSAGE = {\n note: \"calloutNote\",\n tip: \"calloutTip\",\n important: \"calloutImportant\",\n warning: \"calloutWarning\",\n caution: \"calloutCaution\"\n} as const;\nconst ARRIVED_MS = 2600;\n\nconst CHART_COLORS = [\n \"var(--c-ink)\",\n \"oklch(0.58 0.13 255)\",\n \"oklch(0.63 0.1 175)\",\n \"oklch(0.74 0.12 70)\"\n];\n\n/** How each mode asks the model to answer. Sent once, when a chat is created. */\nconst MODE_PROMPTS: Record<ChatMode, string> = {\n chat: \"Be helpful and concise. Use Markdown when it helps: headings, lists, **bold**, code blocks and tables.\",\n rag:\n \"Prefer the sources provided with each message, numbered in the order given, and put a citation like [1] right after each claim they support. \" +\n \"If they don't cover the question, you may answer from general knowledge, but say clearly that it isn't from the sources.\",\n kb:\n \"Answer ONLY from the sources provided with each message, numbered in the order given. \" +\n \"Put a citation like [1] right after each claim. Do not use outside knowledge. \" +\n \"If the sources don't contain the answer, say that you can't find it in the available sources.\"\n};\n\n/** What the model may write at each format level, so it only uses what renders. */\nconst FORMAT_PROMPTS: Record<ChatFormat, string> = {\n raw: \"Reply in plain text. Don't use Markdown or any other markup.\",\n plain:\n \"Format with light Markdown only: short paragraphs, lists, **bold**, *italics*, `inline code`, code blocks and links. \" +\n \"Don't use tables, charts, callouts, images or other special blocks.\",\n advanced:\n \"You can use Markdown: headings, lists, task lists, **bold**, *italics*, links, code blocks and pipe tables. \" +\n 'For data, use a fenced \"csv\" block or a fenced \"json\" block. ' +\n 'For a diagram or illustration, write a self-contained fenced \"svg\" block with a viewBox, and no scripts, links or external images. ' +\n \"Don't use charts, callouts or images.\",\n rich:\n \"When the answer is about data, lead with one sentence stating the key finding, with key numbers in **bold**, then show the data visually. \" +\n \"You can use Markdown: headings, lists, task lists, **bold**, *italics*, links, code blocks and pipe tables. \" +\n 'For data, use a fenced \"csv\" block or a fenced \"json\" block. ' +\n 'For a diagram or illustration, write a self-contained fenced \"svg\" block with a viewBox, and no scripts, links or external images. ' +\n 'For trends and comparisons, use a fenced \"chart\" block containing only JSON: ' +\n '{\"type\":\"bar\"|\"line\",\"title\":string,\"unit\":string,\"labels\":[string],\"series\":[{\"name\":string,\"values\":[number]}]}. ' +\n \"For notes and warnings, use callouts: a quote starting with [!NOTE], [!TIP], [!IMPORTANT], [!WARNING] or [!CAUTION]. \" +\n \"Images use .\"\n};\n\nconst FOLLOWUP_PROMPT =\n \"After the answer, on a final line write FOLLOWUPS: followed by three short follow-up questions the user might ask next, separated by |.\";\n\nconst DEFAULT_PROMPTS: Record<ChatMode, [string, string][]> = {\n chat: [\n [\"Write\", \"Draft a short welcome email for new users\"],\n [\"Explain\", \"Explain how refresh tokens work, simply\"],\n [\"Code\", \"Write a JavaScript debounce function\"],\n [\"Plan\", \"Outline a one-week plan to learn TypeScript\"]\n ],\n rag: [\n [\"Overview\", \"What topics do these sources cover?\"],\n [\"Summarize\", \"Summarize the most important points\"],\n [\"Find\", \"Where is the refund policy described?\"],\n [\"Explain\", \"Explain the setup steps in plain language\"]\n ],\n kb: [\n [\"Find\", \"Where is the refund policy described?\"],\n [\"How to\", \"How do I reset my password?\"],\n [\"Limits\", \"What are the plan limits?\"],\n [\"Policy\", \"What happens when my account is deleted?\"]\n ]\n};\n\n// ── icons ──────────────────────────────────────────────────\n\nconst icon = (body: TemplateResult, cls = \"\") =>\n html`<svg class=\"i ${cls}\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">${body}</svg>`;\n\nconst I = {\n sidebar: () =>\n icon(\n svg`<rect x=\"2\" y=\"2.5\" width=\"12\" height=\"11\" rx=\"1.5\"></rect><path d=\"M6 2.5v11\"></path>`\n ),\n plus: () => icon(svg`<path d=\"M8 3v10M3 8h10\"></path>`),\n bookmark: (on = false) =>\n icon(svg`<path d=\"M4.5 2.5h7v11L8 11l-3.5 2.5z\"></path>`, on ? \"filled\" : \"\"),\n download: () => icon(svg`<path d=\"M8 2.5v8M4.5 7.5L8 11l3.5-3.5M2.5 13.5h11\"></path>`),\n trash: () => icon(svg`<path d=\"M2.5 4.5h11M6.5 4.5v-2h3v2M4 4.5l.7 9h6.6l.7-9\"></path>`),\n pencil: () => icon(svg`<path d=\"M10.5 2.5l3 3L6 13H3v-3z\"></path>`),\n copy: () =>\n icon(\n svg`<rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\"></rect><path d=\"M10.5 5.5v-2a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2\"></path>`\n ),\n raw: () => icon(svg`<path d=\"M5.5 4.5L2 8l3.5 3.5M10.5 4.5L14 8l-3.5 3.5\"></path>`),\n refresh: () => icon(svg`<path d=\"M13.5 8A5.5 5.5 0 1 1 11.9 4.1M13.5 2v3.5H10\"></path>`),\n thumb: (down = false) =>\n html`<svg\n class=\"i\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n style=${down ? \"transform:rotate(180deg)\" : \"\"}\n >\n <path\n d=\"M5 7v6.5H2.5V7zM5 7l2.5-4.5a1.3 1.3 0 0 1 1.9 1.4L9 6.5h3.6a1 1 0 0 1 1 1.2l-1 4.8a1 1 0 0 1-1 .8H5\"\n ></path>\n </svg>`,\n expand: () => icon(svg`<path d=\"M9.5 2.5h4v4M13.5 2.5L9 7M6.5 13.5h-4v-4M2.5 13.5L7 9\"></path>`),\n restore: () => icon(svg`<path d=\"M13.5 6.5h-4v-4M9.5 6.5l4-4M2.5 9.5h4v4M6.5 9.5l-4 4\"></path>`),\n minimize: () => icon(svg`<path d=\"M4 8h8\"></path>`),\n close: () => icon(svg`<path d=\"M4 4l8 8M12 4l-8 8\"></path>`),\n clip: () =>\n icon(\n svg`<path d=\"M13 7.5l-5.3 5.3a3 3 0 0 1-4.3-4.3L9 2.9a2 2 0 0 1 2.9 2.9L6.4 11.3a1 1 0 0 1-1.4-1.4L10 5\"></path>`\n ),\n up: () => icon(svg`<path d=\"M8 13V3M3.5 7.5L8 3l4.5 4.5\"></path>`),\n stop: () => icon(svg`<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"></rect>`),\n chat: () =>\n html`<svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 22 22\"\n aria-hidden=\"true\"\n style=\"fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round\"\n >\n <path\n d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h9A2.5 2.5 0 0 1 18 5.5v7a2.5 2.5 0 0 1-2.5 2.5H9l-4 3.5V15H6.5\"\n ></path>\n </svg>`,\n chevronDown: () =>\n html`<svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n style=\"fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round\"\n >\n <path d=\"M5 8l5 5 5-5\"></path>\n </svg>`\n};\n\n// ── helpers ────────────────────────────────────────────────\n\nlet keySeed = 0;\nconst newKey = () => `m${Date.now().toString(36)}${(keySeed++).toString(36)}`;\n\nfunction isNotFound(error: unknown): boolean {\n const e = error as { message?: string; code?: string; details?: { status?: number } } | null;\n return e?.message === \"NOT_FOUND\" || e?.code === \"NOT_FOUND\" || e?.details?.status === 404;\n}\n\nfunction errorCode(error: unknown): string {\n const e = error as { code?: string; message?: string } | null;\n return e?.code || e?.message || \"UNKNOWN\";\n}\n\nconst reducedMotion = () =>\n typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst formatNumber = (value: number, unit: string) =>\n (Number.isInteger(value) ? value.toLocaleString(\"en-US\") : value.toFixed(1)) + unit;\n\nconst fileExt = (name: string) => {\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1, dot + 5).toUpperCase() : \"FILE\";\n};\n\n/** A readable view of whatever shape the server recorded for a source. */\nexport function describeSource(source: Record<string, unknown>, n: number) {\n const s = source ?? {};\n const meta = (s.metadata && typeof s.metadata === \"object\" ? s.metadata : {}) as Record<\n string,\n unknown\n >;\n const pick = (...values: unknown[]) =>\n values.find((v) => typeof v === \"string\" && v.trim()) as string | undefined;\n const text =\n pick(s.content, s.text, s.page_content, s.body, s.snippet, s.chunk, meta.content) ??\n JSON.stringify(s, null, 2);\n const score = [s.score, s.relevance, s._score, meta.score].find((v) => typeof v === \"number\") as\n number | undefined;\n const number = typeof s.n === \"number\" && s.n > 0 ? s.n : n;\n return {\n n: number,\n title: pick(s.title, s.name, s.filename, meta.title, meta.name) ?? `Source ${number}`,\n section: pick(s.section, s.heading, meta.section) ?? \"\",\n path: pick(s.path, s.url, s.key, meta.path, meta.url) ?? \"\",\n collection: pick(s.collection, s.namespace, s.dbname, meta.collection) ?? \"\",\n updated: pick(s.updated, s._modified_at, meta.updated) ?? \"\",\n text,\n score: score === undefined ? null : Math.max(0, Math.min(1, score))\n };\n}\n\n/** The saved entries of a service `attachments` list. */\nfunction toSavedFiles(list: unknown): ChatSavedAttachment[] {\n if (!Array.isArray(list)) return [];\n return list\n .filter((item) => item && typeof item === \"object\" && (item._id || item.id))\n .filter((item) => item.saved !== false && item.status !== \"failed\")\n .map((item) => ({\n id: String(item._id ?? item.id),\n name: String(item.name ?? \"file\"),\n type: item.type,\n mime: item.mime,\n size: typeof item.size === \"number\" ? item.size : undefined,\n status: item.status\n }));\n}\n\nfunction toRetrieval(files: ChatAttachment[]): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n const documents: { title: string; content: string }[] = [];\n for (const file of files) {\n if (/\\.csv$/i.test(file.name)) out.push({ source: \"csv\", data: file.content });\n else if (/\\.json$/i.test(file.name)) {\n try {\n out.push({ source: \"json\", data: JSON.parse(file.content) });\n } catch {\n documents.push({ title: file.name, content: file.content });\n }\n } else documents.push({ title: file.name, content: file.content });\n }\n if (documents.length) out.push({ source: \"docs\", payload: { documents } });\n return out;\n}\n\nfunction dayGroup(iso: string | undefined): \"today\" | \"yesterday\" | \"week\" | \"older\" {\n const at = iso ? Date.parse(iso) : NaN;\n if (Number.isNaN(at)) return \"older\";\n const start = new Date();\n start.setHours(0, 0, 0, 0);\n const day = 86_400_000;\n if (at >= start.getTime()) return \"today\";\n if (at >= start.getTime() - day) return \"yesterday\";\n if (at >= start.getTime() - 7 * day) return \"week\";\n return \"older\";\n}\n\ninterface Toast {\n key: number;\n text: string;\n undo?: () => void;\n commit?: () => void;\n}\n\n/**\n * An AI chat workspace backed by the `llm.*` service.\n *\n * <singlebase-chat></singlebase-chat>\n * <singlebase-chat embed=\"inline\" mode=\"rag\" retrieval='[{\"type\":\"kdb\",\"namespace\":\"docs\"}]'></singlebase-chat>\n * <singlebase-chat embed=\"launcher\" greeting-bubble unread-badge></singlebase-chat>\n *\n * Conversations live on the server, scoped to the signed-in user: the list\n * comes from `llm.list_chats`, a thread from `llm.get_chat`, and each turn is\n * one `llm.chat`. Titles and follow-up questions never add turns to the\n * conversation — titles come from `llm.generate`, follow-ups from the reply.\n */\n@customElement(\"singlebase-chat\")\nexport class SinglebaseChat extends LitElement {\n static styles = [tokenDefaults, brandingStyles, chatStyles];\n\n // ── wiring ────────────────────────────────────────────────\n /** An explicit client. Omit it and the page's SinglebaseClient() is used. */\n @property({ attribute: false })\n accessor client: ChatClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseChatMessages> = {};\n\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n // ── behaviour ─────────────────────────────────────────────\n /** `chat` free-form, `rag` grounded with citations, `rich` charts and tables. */\n @property({ reflect: true }) accessor mode: ChatMode = \"chat\";\n\n /**\n * How much of a reply is formatted: `raw` (the text as written), `plain`\n * (light formatting), `advanced` (+ tables, CSV, JSON and SVG) or `rich`\n * (+ callouts, charts, images and `renderers`). Copy and export always use\n * the original text.\n */\n @property({ reflect: true }) accessor format: ChatFormat = \"advanced\";\n\n /** Your own fenced blocks, by language. Drawn at the `rich` level. */\n @property({ attribute: false }) accessor renderers: Record<string, ChatBlockRenderer> = {};\n\n /**\n * Preflight for every message: gets the `llm.chat` payload, returns it\n * (changed or not), or `false` to cancel. May be async.\n */\n @property({ attribute: false }) accessor beforeSend: ChatBeforeSend | null = null;\n\n /** Rewrites a reply's parsed blocks before they're drawn. Returns the blocks. */\n @property({ attribute: false }) accessor afterParse: ChatAfterParse | null = null;\n\n @property({ reflect: true }) accessor glow: ChatGlow = \"subtle\";\n\n /**\n * Docsets to answer from: slugs or ids, comma-separated in markup or an\n * array in JavaScript. Sent as `{ source: \"docset\", ids }`.\n */\n @property() accessor docsets: string | string[] = \"\";\n\n /**\n * How attached files reach the service: `payload` (as `attachments`, which\n * the service keeps on the chat for later turns) or `retrieval` (with this\n * message only).\n */\n @property({ attribute: \"attachments-mode\" }) accessor attachmentsMode: \"retrieval\" | \"payload\" =\n \"payload\";\n\n /** With attachments-mode=\"payload\": keep attached files on the chat. */\n @property({ converter: flagAttr, attribute: \"save-attachments\" }) accessor saveAttachments = true;\n\n /** Ask the model for follow-up questions with each reply. */\n @property({ converter: flagAttr }) accessor followups = true;\n\n /** The \"Cited sources\" cards and the \"Searched n sources\" row under answers. */\n @property({ converter: flagAttr, attribute: \"show-sources\" }) accessor showSources = true;\n\n /** The New chat button. */\n @property({ converter: flagAttr, attribute: \"show-new-chat\" }) accessor showNewChat = true;\n\n /** The pinned \"Bookmarked\" group in the chat list. */\n @property({ converter: flagAttr, attribute: \"show-bookmarked\" }) accessor showBookmarked = true;\n\n /** Show the follow-up questions under the latest reply. */\n @property({ converter: flagAttr, attribute: \"show-followups\" }) accessor showFollowups = true;\n\n /** The search box in the chat list. */\n @property({ converter: flagAttr, attribute: \"allow-search\" }) accessor allowSearch = true;\n\n /** Replace the provisional title with a model-written one after the first reply. */\n @property({ converter: flagAttr, attribute: \"auto-title\" }) accessor autoTitle = true;\n\n /** Model for new turns; empty uses the chat's, then the project default. */\n @property() accessor model = \"\";\n\n @property({ converter: jsonAttr }) accessor params: Record<string, unknown> = {};\n\n /** Extra instructions, sent when a chat is created. */\n @property({ attribute: \"system-message\" }) accessor systemMessage = \"\";\n\n /** Retrieval sources sent with every turn: `[{\"type\":\"kdb\",\"namespace\":\"docs\"}]`. */\n @property({ converter: jsonAttr }) accessor retrieval: Record<string, unknown>[] = [];\n\n /** Stored on each user message. Never sent to the model. */\n @property({ converter: jsonAttr }) accessor metadata: Record<string, unknown> = {};\n\n // ── embed and layout ──────────────────────────────────────\n @property({ reflect: true }) accessor embed: ChatEmbed = \"page\";\n\n /** Launcher side. */\n @property({ reflect: true }) accessor position: \"right\" | \"left\" = \"right\";\n\n /**\n * The chat list: `auto` docks it when there's room, `open` / `closed` set\n * how it starts, `none` removes it and its toggle entirely.\n */\n @property({ converter: sidebarAttr }) accessor sidebar: ChatSidebar = \"auto\";\n\n @property({ converter: flagAttr, attribute: \"show-title\" }) accessor showTitle = true;\n\n /** Opens this chat on load. */\n @property({ attribute: \"chat-id\" }) accessor chatIdAttr = \"\";\n\n // ── brand and content ─────────────────────────────────────\n /** Used in placeholders, exports and labels. Never shown above messages. */\n @property({ attribute: \"assistant-name\" }) accessor assistantName = \"Assistant\";\n\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property() accessor heading = \"\";\n @property() accessor description = \"\";\n\n /** The small label above the heading. Unset uses the mode's; `\"\"` hides it. */\n @property() accessor eyebrow: string | undefined = undefined;\n\n /**\n * Suggested prompts: `|`-separated in markup, an array in JavaScript.\n * `\"none\"` or `[]` shows no suggestions.\n */\n @property() accessor prompts: string | (string | ChatPrompt)[] = \"\";\n\n @property({ attribute: \"bubble-text\" }) accessor bubbleText = \"\";\n @property({ type: Boolean, attribute: \"greeting-bubble\" }) accessor greetingBubble = false;\n @property({ type: Boolean, attribute: \"unread-badge\" }) accessor unreadBadge = false;\n\n @property({ converter: flagAttr, attribute: \"allow-upload\" }) accessor allowUpload = true;\n @property({ converter: flagAttr, attribute: \"allow-export\" }) accessor allowExport = true;\n\n /** Copy buttons on messages. */\n @property({ converter: flagAttr, attribute: \"allow-copy\" }) accessor allowCopy = true;\n\n /** Regenerate on the latest reply. */\n @property({ converter: flagAttr, attribute: \"allow-regenerate\" }) accessor allowRegenerate = true;\n\n /** Bookmark buttons for chats and messages. */\n @property({ converter: flagAttr, attribute: \"allow-bookmark\" }) accessor allowBookmark = true;\n\n /** Delete buttons for chats and messages. */\n @property({ converter: flagAttr, attribute: \"allow-delete\" }) accessor allowDelete = true;\n\n /** Renaming a chat from its title or the chat list. */\n @property({ converter: flagAttr, attribute: \"allow-rename\" }) accessor allowRename = true;\n\n /** The helpful / not helpful buttons on replies. */\n @property({ converter: flagAttr, attribute: \"allow-feedback\" }) accessor allowFeedback = true;\n\n /**\n * The message box. Off, the chat only shows the conversation — pair it with\n * `chat-id` to display a saved chat read-only.\n */\n @property({ converter: flagAttr, attribute: \"show-composer\" }) accessor showComposer = true;\n\n /** Message times in the toolbars. */\n @property({ converter: flagAttr, attribute: \"show-time\" }) accessor showTime = true;\n\n /**\n * The line under the composer. Unset uses the default (\"{name} can make\n * mistakes…\"); an empty string hides it.\n */\n @property() accessor footnote: string | undefined = undefined;\n\n /** A per-reply toggle between the formatted answer and the text as written. */\n @property({ type: Boolean, attribute: \"allow-raw\" }) accessor allowRaw = false;\n\n /** The \"Chat by Singlebase\" credit. A plain link — it makes no request. */\n @property({ converter: flagAttr }) accessor branding = true;\n\n // ── state ─────────────────────────────────────────────────\n @state() private accessor chatList: ChatSummary[] = [];\n @state() private accessor listState: \"idle\" | \"loading\" | \"ready\" | \"error\" = \"idle\";\n @state() private accessor activeId: string | null = null;\n @state() private accessor chatTitle = \"\";\n @state() private accessor bookmarked = false;\n @state() private accessor msgs: ChatMessage[] = [];\n @state() private accessor loadingThread = false;\n @state() private accessor threadError = \"\";\n @state() private accessor busy = false;\n @state() private accessor draft = \"\";\n @state() private accessor files: ChatAttachment[] = [];\n @state() private accessor search = \"\";\n @state() private accessor sidebarOpen: boolean | null = null;\n @state() private accessor width = 0;\n @state() private accessor panel: { key: string; n: number } | null = null;\n @state() private accessor menuOpen = false;\n @state() private accessor editingKey = \"\";\n @state() private accessor editDraft = \"\";\n @state() private accessor editingTitle = false;\n @state() private accessor renamingId = \"\";\n @state() private accessor toast: Toast | null = null;\n @state() private accessor copiedKey = \"\";\n @state() private accessor retrievalOpen = new Set<string>();\n @state() private accessor rawKeys = new Set<string>();\n @state() private accessor savedFiles: ChatSavedAttachment[] = [];\n @state() private accessor hasSidebarContent = false;\n @state() private accessor sorts = new Map<string, { col: number; dir: 1 | -1 }>();\n @state() private accessor arrivedKey = \"\";\n @state() private accessor dragging = false;\n @state() private accessor showJump = false;\n @state() private accessor offline = false;\n @state() private accessor isOpen = false;\n @state() private accessor expanded = false;\n @state() private accessor bubble = false;\n @state() private accessor seen = false;\n @state() private accessor mobile = false;\n\n private run = 0;\n private abort: AbortController | null = null;\n private revealTimer: ReturnType<typeof setInterval> | undefined;\n private timers = new Set<ReturnType<typeof setTimeout>>();\n private toastTimer: ReturnType<typeof setTimeout> | undefined;\n private stick = true;\n private renamed = new Set<string>();\n private observer: ResizeObserver | null = null;\n private observed: Element | null = null;\n private media: MediaQueryList | null = null;\n private focusNext = \"\";\n private bubbleScheduled = false;\n private pendingChatId = \"\";\n\n get msg(): SinglebaseChatMessages {\n return resolveChatMessages(this.messages);\n }\n\n /** An explicit `.client`, else the page default. */\n get resolvedClient(): ChatClient | null {\n return this.client ?? getDefaultClient<SinglebaseClientInstance>() ?? null;\n }\n\n /** The open conversation's id, or null for a new chat. */\n get chatId(): string | null {\n return this.activeId;\n }\n\n /** The open conversation's messages. */\n get thread(): readonly ChatMessage[] {\n return this.msgs;\n }\n\n /** `format`, falling back to the default for anything unknown. */\n /** `docsets` as a clean list of ids. */\n private get docsetIds(): string[] {\n const value = this.docsets;\n const list = Array.isArray(value) ? value : String(value ?? \"\").split(/[\\s,]+/);\n return [...new Set(list.map((id) => String(id).trim()).filter(Boolean))];\n }\n\n /** The files this chat keeps on the service. */\n get attachments(): readonly ChatSavedAttachment[] {\n return this.savedFiles;\n }\n\n private get formatLevel(): ChatFormat {\n return ([\"raw\", \"plain\", \"advanced\", \"rich\"] as const).includes(this.format)\n ? this.format\n : \"advanced\";\n }\n\n /** The loaded chat list. */\n get chats(): readonly ChatSummary[] {\n return this.chatList;\n }\n\n /**\n * Every setting in one object, keyed by property name:\n *\n * chat.config = { client, mode: \"rag\", format: \"rich\", retrieval: [...], chatId: \"…\" };\n *\n * Unknown keys are ignored. `chatId` opens that chat; reading `config`\n * returns the current settings with `chatId` as the open chat.\n */\n set config(value: Partial<ChatConfig>) {\n if (!value) return;\n const target = this as unknown as Record<string, unknown>;\n if (\"client\" in value) this.client = value.client ?? null;\n for (const key of CONFIG_KEYS) {\n if (key in value) target[key] = value[key];\n }\n if (value.chatId && value.chatId !== this.activeId) {\n if (this.hasUpdated) void this.openChat(value.chatId);\n else this.chatIdAttr = value.chatId;\n }\n }\n\n /**\n * Changes settings on the fly. Only the keys you pass change; the chat keeps\n * its conversation and re-renders in place. Returns the element, so calls chain.\n *\n * chat.configure({ format: \"rich\" }).configure({ theme: \"dark\" });\n */\n configure(options: Partial<ChatConfig>): this {\n this.config = options;\n return this;\n }\n\n get config(): Partial<ChatConfig> {\n const source = this as unknown as Record<string, unknown>;\n return {\n client: this.client,\n chatId: this.activeId ?? \"\",\n ...Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]))\n };\n }\n\n // ── lifecycle ─────────────────────────────────────────────\n override connectedCallback(): void {\n super.connectedCallback();\n this.offline = typeof navigator !== \"undefined\" && navigator.onLine === false;\n window.addEventListener(\"online\", this.onNetwork);\n window.addEventListener(\"offline\", this.onNetwork);\n this.media = typeof matchMedia !== \"undefined\" ? matchMedia(\"(max-width: 559px)\") : null;\n this.mobile = !!this.media?.matches;\n this.media?.addEventListener(\"change\", this.onMedia);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener(\"online\", this.onNetwork);\n window.removeEventListener(\"offline\", this.onNetwork);\n this.media?.removeEventListener(\"change\", this.onMedia);\n this.observer?.disconnect();\n this.observer = null;\n this.observed = null;\n this.flushToast();\n this.halt();\n this.timers.forEach(clearTimeout);\n this.timers.clear();\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has(\"retrieval\") && !Array.isArray(this.retrieval)) {\n const value = this.retrieval as unknown;\n this.retrieval = value && typeof value === \"object\" ? [value as Record<string, unknown>] : [];\n }\n if (changed.has(\"params\") && (!this.params || typeof this.params !== \"object\"))\n this.params = {};\n if (changed.has(\"metadata\") && (!this.metadata || typeof this.metadata !== \"object\")) {\n this.metadata = {};\n }\n if (changed.has(\"sidebar\")) {\n if (this.sidebar === \"open\") this.sidebarOpen = true;\n else if (this.sidebar === \"closed\" || this.sidebar === \"none\") this.sidebarOpen = false;\n else if (this.width) this.sidebarOpen = this.docked;\n }\n if (this.embed === \"launcher\" && this.greetingBubble && !this.bubbleScheduled) {\n this.bubbleScheduled = true;\n this.later(() => {\n if (!this.isOpen && !this.seen) this.bubble = true;\n }, 1200);\n }\n }\n\n override firstUpdated(): void {\n if (this.chatIdAttr) void this.openChat(this.chatIdAttr);\n }\n\n override updated(): void {\n // The root is re-created when a launcher opens, so re-observe as needed.\n const root = this.renderRoot.querySelector(\".root\");\n if (root !== this.observed) {\n this.observer?.disconnect();\n this.observed = root;\n if (root && typeof ResizeObserver !== \"undefined\") {\n this.observer ??= new ResizeObserver(([entry]) => {\n const width = Math.round(entry.contentRect.width);\n if (width === this.width) return;\n this.width = width;\n if (this.sidebarOpen === null) this.sidebarOpen = this.sidebar === \"auto\" && this.docked;\n });\n this.observer.observe(root);\n }\n }\n\n if (this.sidebarOpen && this.listState === \"idle\" && this.resolvedClient) void this.loadChats();\n if (this.pendingChatId && this.resolvedClient) void this.openChat(this.pendingChatId);\n\n if (this.focusNext) {\n const target = this.renderRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n this.focusNext\n );\n this.focusNext = \"\";\n if (target) {\n target.focus();\n if (\"select\" in target && target.tagName === \"INPUT\") target.select();\n }\n }\n }\n\n private onNetwork = () => {\n this.offline = navigator.onLine === false;\n };\n\n private onMedia = () => {\n this.mobile = !!this.media?.matches;\n };\n\n private later(fn: () => void, ms: number) {\n const id = setTimeout(() => {\n this.timers.delete(id);\n fn();\n }, ms);\n this.timers.add(id);\n }\n\n private emit(name: string, detail: unknown) {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n private get docked(): boolean {\n return this.embed === \"page\" && this.width >= DOCK_SIDEBAR_AT;\n }\n\n private get panelDocked(): boolean {\n const used = this.docked && this.sidebarOpen ? SIDEBAR_WIDTH : 0;\n return this.width - used >= DOCK_PANEL_AT;\n }\n\n // ── public API ────────────────────────────────────────────\n /** Starts a new, empty conversation. */\n newChat(): void {\n this.halt();\n this.pendingChatId = \"\";\n this.savedFiles = [];\n this.loadingThread = false;\n this.activeId = null;\n this.chatTitle = \"\";\n this.bookmarked = false;\n this.msgs = [];\n this.threadError = \"\";\n this.resetViewState();\n this.focusNext = \"textarea.input\";\n }\n\n /** Opens a saved conversation. */\n async openChat(id: string): Promise<void> {\n const client = this.resolvedClient;\n if (!id) return;\n this.halt();\n this.savedFiles = [];\n const summary = this.chatList.find((chat) => chat._id === id);\n this.activeId = id;\n this.chatTitle = summary?.title ?? \"\";\n this.bookmarked = !!summary?.bookmarked;\n this.msgs = [];\n this.threadError = \"\";\n this.resetViewState();\n if (!client) {\n // Opened before a client was set (common when `.client` is assigned\n // after the element is created): open it as soon as one arrives.\n this.pendingChatId = id;\n this.loadingThread = true;\n return;\n }\n\n const run = ++this.run;\n this.pendingChatId = \"\";\n this.loadingThread = true;\n try {\n const data = await client.llm.call<ChatSummary & { messages?: any[] }>(\"get_chat\", {\n _id: id\n });\n if (run !== this.run) return;\n this.chatTitle = data?.title ?? \"\";\n this.bookmarked = !!data?.bookmarked;\n this.msgs = (data?.messages ?? [])\n .filter((m) => m && (m.role === \"user\" || m.role === \"assistant\"))\n .map((m) => this.fromServer(m));\n this.savedFiles = toSavedFiles((data as { attachments?: unknown })?.attachments);\n this.upsertChat({ ...summary, ...data, _id: id } as ChatSummary);\n this.stick = true;\n void this.scrollToBottom();\n } catch (error) {\n if (run !== this.run) return;\n if (isNotFound(error)) {\n this.chatList = this.chatList.filter((chat) => chat._id !== id);\n this.newChat();\n this.showToast(this.msg.errNotFound);\n } else {\n this.threadError = this.msg.errLoad;\n }\n } finally {\n if (run === this.run) this.loadingThread = false;\n }\n }\n\n /** Sends a message; with no argument, sends the composer's text. */\n async send(text?: string): Promise<void> {\n const content = (typeof text === \"string\" ? text : this.draft).trim();\n if (!content || this.busy) return;\n const attachments = this.files;\n this.draft = \"\";\n this.files = [];\n const input = this.renderRoot.querySelector<HTMLTextAreaElement>(\"textarea.input\");\n if (input) input.style.height = \"auto\";\n await this.runTurn(this.userMessage(content, attachments));\n }\n\n /** Stops waiting for, or revealing, the current reply. */\n stop(): void {\n if (!this.busy) return;\n const last = this.msgs[this.msgs.length - 1];\n this.halt();\n if (last?.role === \"assistant\" && (last.phase === \"pending\" || last.phase === \"streaming\")) {\n last.phase = \"done\";\n last.stopped = true;\n last.followups = [];\n this.msgs = [...this.msgs];\n }\n }\n\n /** Downloads the open conversation, or copies it as Markdown. */\n exportChat(format: ChatExportFormat = \"md\"): void {\n if (!this.msgs.length) return;\n this.menuOpen = false;\n const title = this.chatTitle || this.msg.untitled;\n const who = (m: ChatMessage) => (m.role === \"user\" ? this.msg.you : this.assistantName);\n const when = (at: number) => new Date(at || Date.now()).toLocaleString();\n const sources = (m: ChatMessage) =>\n m.sources.map((s, i) => {\n const d = describeSource(s, i + 1);\n return `[${d.n}] ${d.title}${d.path ? ` — ${d.path}` : \"\"}`;\n });\n const files = (m: ChatMessage) => (m.attachments ?? []).map((a) => a.name);\n\n let body: string;\n let mime = \"text/markdown\";\n let ext = \"md\";\n if (format === \"json\") {\n body = JSON.stringify(\n {\n exportedAt: new Date().toISOString(),\n id: this.activeId,\n title,\n mode: this.mode,\n bookmarked: this.bookmarked,\n messages: this.msgs.map((m) => ({\n role: m.role,\n text: m.content,\n at: new Date(m.at || Date.now()).toISOString(),\n bookmarked: m.bookmarked,\n attachments: files(m),\n sources: sources(m)\n }))\n },\n null,\n 2\n );\n mime = \"application/json\";\n ext = \"json\";\n } else if (format === \"txt\") {\n body =\n `${title}\\n${\"=\".repeat(title.length)}\\n\\n` +\n this.msgs\n .map((m) =>\n [\n `${who(m)} · ${when(m.at)}`,\n files(m).length ? `Attachments: ${files(m).join(\", \")}` : \"\",\n m.content,\n sources(m).length ? `Sources:\\n${sources(m).join(\"\\n\")}` : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\")\n )\n .join(\"\\n\\n\");\n mime = \"text/plain\";\n ext = \"txt\";\n } else {\n body =\n `# ${title}\\n\\n` +\n this.msgs\n .map((m) =>\n [\n `### ${who(m)} · ${when(m.at)}`,\n files(m).length ? `Attachments: ${files(m).join(\", \")}` : \"\",\n m.content,\n sources(m).length\n ? `**Sources**\\n\\n${sources(m)\n .map((s) => `- ${s}`)\n .join(\"\\n\")}`\n : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\\n\")\n )\n .join(\"\\n\\n---\\n\\n\") +\n \"\\n\";\n }\n\n this.emit(\"singlebase-chat-export\", { chatId: this.activeId, format });\n if (format === \"copy\") {\n void navigator.clipboard?.writeText(body).catch(() => {});\n this.showToast(this.msg.copiedMarkdown);\n return;\n }\n\n const slug =\n title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"chat\";\n const name = `${slug}-${new Date().toISOString().slice(0, 10)}.${ext}`;\n const url = URL.createObjectURL(new Blob([body], { type: mime }));\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = name;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(url), 2000);\n this.showToast(fill(this.msg.exported, { name }));\n }\n\n /** Inline and launcher: fill the window. */\n expand(): void {\n this.expanded = true;\n this.emit(\"singlebase-chat-expand\", { expanded: true });\n }\n\n collapse(): void {\n this.expanded = false;\n this.emit(\"singlebase-chat-expand\", { expanded: false });\n }\n\n /** Launcher: open the panel. */\n open(): void {\n this.isOpen = true;\n this.seen = true;\n this.bubble = false;\n this.focusNext = \"textarea.input\";\n this.emit(\"singlebase-chat-open\", {});\n }\n\n /** Launcher: close the panel. */\n close(): void {\n this.isOpen = false;\n this.expanded = false;\n this.emit(\"singlebase-chat-close\", {});\n }\n\n // ── turns ─────────────────────────────────────────────────\n private userMessage(content: string, attachments: ChatAttachment[] = []): ChatMessage {\n return {\n key: newKey(),\n id: null,\n role: \"user\",\n content,\n at: Date.now(),\n bookmarked: false,\n sources: [],\n followups: [],\n phase: \"done\",\n attachments\n };\n }\n\n private systemPrompt(): string {\n return [\n this.systemMessage,\n MODE_PROMPTS[this.mode] ?? MODE_PROMPTS.chat,\n FORMAT_PROMPTS[this.formatLevel],\n this.followups ? FOLLOWUP_PROMPT : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n private payloadFor(user: ChatMessage): Record<string, unknown> {\n const payload: Record<string, unknown> = { message: user.content, format: \"markdown\" };\n if (this.activeId) {\n payload._id = this.activeId;\n } else {\n payload.title = provisionalTitle(user.content);\n payload.system_message = this.systemPrompt();\n }\n payload.mode = this.mode;\n if (this.model) payload.model = this.model;\n if (Object.keys(this.params ?? {}).length) payload.params = this.params;\n\n // Files go either as this turn's retrieval (works everywhere) or, with\n // attachments-mode=\"payload\", as attachments the service keeps on the chat.\n const files = user.attachments ?? [];\n const asPayload = this.attachmentsMode === \"payload\";\n if (asPayload && files.length) {\n payload.attachments = files.map((file) => ({\n type: \"content\",\n content: file.content,\n name: file.name,\n ...(file.mime ? { mime: file.mime } : {}),\n size: file.size,\n save_attachment: this.saveAttachments\n }));\n }\n\n const names = asPayload ? [] : files.map((file) => file.name);\n if (Object.keys(this.metadata ?? {}).length || names.length) {\n payload.metadata = { ...this.metadata, ...(names.length ? { attachments: names } : {}) };\n }\n\n const docsets = this.docsetIds;\n const retrieval = [\n ...(docsets.length ? [{ source: \"docset\", ids: docsets }] : []),\n ...(this.retrieval ?? []),\n ...(asPayload ? [] : toRetrieval(files))\n ];\n if (retrieval.length) payload.retrieval = retrieval;\n return payload;\n }\n\n private async runTurn(user: ChatMessage): Promise<void> {\n const bot: ChatMessage = {\n key: newKey(),\n id: null,\n role: \"assistant\",\n content: \"\",\n at: Date.now(),\n bookmarked: false,\n sources: [],\n followups: [],\n phase: \"pending\"\n };\n this.msgs = [...this.msgs, user, bot];\n this.busy = true;\n this.panel = null;\n this.stick = true;\n void this.scrollToBottom();\n this.emit(\"singlebase-chat-send\", { chatId: this.activeId, text: user.content });\n\n const client = this.resolvedClient;\n if (!client) {\n this.failTurn(bot, this.msg.errNoClient, \"NO_CLIENT\");\n this.busy = false;\n return;\n }\n\n const run = ++this.run;\n const controller = new AbortController();\n this.abort = controller;\n const isNew = !this.activeId;\n let payload = this.payloadFor(user);\n\n if (this.beforeSend) {\n let out: unknown;\n try {\n out = await this.beforeSend(payload, { chatId: this.activeId, isNew, message: user });\n } catch (error) {\n out = error;\n }\n if (run !== this.run) return;\n if (out === false) {\n // Cancelled: nothing was sent, so undo the turn and give the text back.\n this.msgs = this.msgs.filter((m) => m !== user && m !== bot);\n this.draft = user.content;\n this.busy = false;\n this.abort = null;\n return;\n }\n const valid =\n !!out &&\n typeof out === \"object\" &&\n typeof (out as { message?: unknown }).message === \"string\";\n if (!valid || !(out as { message: string }).message.trim()) {\n // Never fall back to the unmodified request: a hook that strips data\n // and forgets to return must not send the original.\n console.error(\n \"[singlebase-chat] beforeSend must return the request object (with a message) or false to cancel; the message was not sent.\",\n out\n );\n this.failTurn(bot, this.msg.errGeneric, \"BEFORE_SEND_INVALID\");\n this.busy = false;\n this.abort = null;\n return;\n }\n payload = out as Record<string, unknown>;\n }\n\n try {\n const data = await client.llm.call<any>(\"chat\", payload, { signal: controller.signal });\n const chatId: string | null = data?._id || data?.chat_id || this.activeId;\n\n // A new chat exists now even if the user moved on; keep it in the list.\n if (isNew && chatId) {\n this.upsertChat({\n _id: chatId,\n title: data?.title || (payload.title as string),\n bookmarked: !!data?.bookmarked,\n _modified_at: new Date().toISOString()\n });\n }\n if (run !== this.run) return;\n\n if (chatId) this.activeId = chatId;\n if (isNew) {\n this.chatTitle = data?.title || (payload.title as string);\n this.bookmarked = !!data?.bookmarked;\n }\n\n const reply = data?.message ?? {};\n const raw =\n typeof reply.content === \"string\"\n ? reply.content\n : data?.json !== undefined\n ? JSON.stringify(data.json, null, 2)\n : \"\";\n const { text, followups } = splitFollowups(raw);\n user.id = reply.reply_to ?? null;\n this.applyAttachmentResults(data?.attachments);\n Object.assign(bot, {\n id: reply._id ?? null,\n content: text,\n sources: Array.isArray(reply.sources) ? reply.sources : [],\n followups,\n execTime: typeof reply.exec_time === \"number\" ? reply.exec_time : undefined,\n model: reply.model,\n at: Date.now()\n });\n this.emit(\"singlebase-chat-response\", { chatId, message: bot });\n\n await this.reveal(bot, run);\n if (isNew && chatId && this.autoTitle) void this.retitle(chatId, user.content, bot.content);\n } catch (error) {\n if (run !== this.run) return;\n const notFound = isNotFound(error);\n if (notFound) {\n this.chatList = this.chatList.filter((chat) => chat._id !== this.activeId);\n this.activeId = null;\n }\n const code = errorCode(error);\n const message = notFound\n ? this.msg.errNotFound\n : code === \"KB_SOURCE_REQUIRED\"\n ? this.msg.errKbSource\n : this.msg.errGeneric;\n this.failTurn(bot, message, code);\n } finally {\n if (run === this.run) {\n this.busy = false;\n this.abort = null;\n // Follow-ups appear once the turn is over; keep them in view.\n if (this.stick) void this.scrollToBottom();\n }\n }\n }\n\n private failTurn(bot: ChatMessage, message: string, code: string) {\n bot.phase = \"error\";\n bot.error = message;\n this.msgs = [...this.msgs];\n this.emit(\"singlebase-chat-error\", { chatId: this.activeId, code, message });\n }\n\n /**\n * The service answers in one piece; this reveals it progressively so it\n * reads like a stream. Capped at about a second and a half.\n */\n private reveal(bot: ChatMessage, run: number): Promise<void> {\n const total = bot.content.length;\n const finish = () => {\n bot.phase = \"done\";\n this.msgs = [...this.msgs];\n this.arrivedKey = bot.key;\n this.later(() => {\n if (this.arrivedKey === bot.key) this.arrivedKey = \"\";\n }, ARRIVED_MS);\n if (this.stick) void this.scrollToBottom();\n else this.showJump = true;\n };\n\n if (!total || reducedMotion()) {\n finish();\n return Promise.resolve();\n }\n\n const full = bot.content;\n const step = Math.max(4, Math.ceil(total / 90));\n let shown = 0;\n bot.phase = \"streaming\";\n bot.content = \"\";\n\n return new Promise((resolve) => {\n this.revealTimer = setInterval(() => {\n if (run !== this.run) {\n clearInterval(this.revealTimer);\n resolve();\n return;\n }\n shown = Math.min(total, shown + step);\n bot.content = full.slice(0, shown);\n if (shown >= total) {\n clearInterval(this.revealTimer);\n finish();\n resolve();\n return;\n }\n this.msgs = [...this.msgs];\n if (this.stick) void this.scrollToBottom();\n }, 16);\n });\n }\n\n /** Cancels any request or reveal in flight. */\n private halt() {\n this.run++;\n this.abort?.abort();\n this.abort = null;\n clearInterval(this.revealTimer);\n this.busy = false;\n }\n\n private async retitle(chatId: string, question: string, answer: string) {\n const client = this.resolvedClient;\n if (!client || this.renamed.has(chatId)) return;\n try {\n const data = await client.llm.call<{ result?: unknown }>(\"generate\", {\n user_input: `user: ${question}\\nassistant: ${answer.slice(0, 1500)}`,\n custom_instructions:\n \"Write a concise title (3–6 words, sentence case, no quotes, no trailing punctuation) for this conversation.\",\n format: \"text\"\n });\n const title = cleanTitle(data?.result);\n if (!title || this.renamed.has(chatId)) return;\n await client.llm.call(\"update_chat\", { _id: chatId, title });\n this.applyTitle(chatId, title, true);\n } catch {\n // Cosmetic: the provisional title stays.\n }\n }\n\n private applyTitle(chatId: string, title: string, auto: boolean) {\n this.chatList = this.chatList.map((chat) => (chat._id === chatId ? { ...chat, title } : chat));\n if (this.activeId === chatId) this.chatTitle = title;\n this.emit(\"singlebase-chat-title\", { chatId, title, auto });\n }\n\n /**\n * Enter and blur both land here. Saving on Enter directly (not via blur())\n * matters: blur never fires on an input that doesn't have focus.\n */\n private commitTitle(value: string) {\n if (!this.editingTitle) return;\n this.editingTitle = false;\n if (this.activeId) void this.renameChat(this.activeId, value);\n }\n\n private commitRename(chatId: string, value: string) {\n if (this.renamingId !== chatId) return;\n this.renamingId = \"\";\n void this.renameChat(chatId, value);\n }\n\n private async renameChat(chatId: string, value: string) {\n const title = value.trim().slice(0, 80);\n const previous = this.chatList.find((chat) => chat._id === chatId)?.title ?? this.chatTitle;\n if (!title || title === previous) return;\n this.renamed.add(chatId);\n this.applyTitle(chatId, title, false);\n try {\n await this.resolvedClient?.llm.call(\"update_chat\", { _id: chatId, title });\n } catch {\n this.applyTitle(chatId, previous ?? \"\", false);\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private fromServer(m: any): ChatMessage {\n const assistant = m.role === \"assistant\";\n const { text, followups } = assistant\n ? splitFollowups(String(m.content ?? \"\"))\n : { text: String(m.content ?? \"\"), followups: [] };\n return {\n key: newKey(),\n id: m._id ?? null,\n role: assistant ? \"assistant\" : \"user\",\n content: text,\n at: Date.parse(m._created_at ?? \"\") || 0,\n bookmarked: !!m.bookmarked,\n sources: Array.isArray(m.sources) ? m.sources : [],\n followups,\n phase: \"done\",\n execTime: typeof m.exec_time === \"number\" ? m.exec_time : undefined,\n model: m.model\n };\n }\n\n // ── chat list ─────────────────────────────────────────────\n private async loadChats() {\n const client = this.resolvedClient;\n if (!client) return;\n this.listState = \"loading\";\n try {\n const data = await client.llm.call<{ items?: ChatSummary[] }>(\"list_chats\", { limit: 100 });\n this.chatList = [...(data?.items ?? [])];\n this.listState = \"ready\";\n } catch {\n this.listState = \"error\";\n }\n }\n\n /**\n * A new chat goes on top. A chat already in the list is updated where it is,\n * keeping its dates, so opening or using a chat never reorders the list; the\n * next load from the server brings the fresh order.\n */\n private upsertChat(chat: ChatSummary) {\n const index = this.chatList.findIndex((c) => c._id === chat._id);\n if (index < 0) {\n this.chatList = [chat, ...this.chatList];\n return;\n }\n const existing = this.chatList[index];\n const next = [...this.chatList];\n next[index] = {\n ...existing,\n ...chat,\n _created_at: existing._created_at ?? chat._created_at,\n _modified_at: existing._modified_at ?? chat._modified_at\n };\n this.chatList = next;\n }\n\n // ── actions ───────────────────────────────────────────────\n private resetViewState() {\n this.panel = null;\n this.menuOpen = false;\n this.editingKey = \"\";\n this.editingTitle = false;\n this.showJump = false;\n this.retrievalOpen = new Set();\n // A docked list stays put; a drawer gets out of the way.\n if (this.sidebarOpen && !this.docked) this.sidebarOpen = false;\n }\n\n private async deleteOnServer(ids: (string | null)[]) {\n const client = this.resolvedClient;\n const chatId = this.activeId;\n if (!client || !chatId) return;\n for (const id of ids) {\n if (!id) continue;\n await client.llm.call(\"delete_chat_message\", { _id: chatId, message_id: id }).catch(() => {});\n }\n }\n\n private async regenerate() {\n if (this.busy) return;\n const index = this.msgs.map((m) => m.role).lastIndexOf(\"assistant\");\n const user = this.msgs[index - 1];\n if (index < 1 || user?.role !== \"user\") return;\n const removed = this.msgs.slice(index - 1);\n this.msgs = this.msgs.slice(0, index - 1);\n await this.deleteOnServer(removed.map((m) => m.id));\n await this.runTurn(this.userMessage(user.content, user.attachments));\n }\n\n private async retry(bot: ChatMessage) {\n if (this.busy) return;\n const index = this.msgs.indexOf(bot);\n const user = this.msgs[index - 1];\n if (user?.role !== \"user\") return;\n this.msgs = this.msgs.slice(0, index - 1);\n await this.runTurn(this.userMessage(user.content, user.attachments));\n }\n\n private async saveEdit(m: ChatMessage) {\n const text = this.editDraft.trim();\n const index = this.msgs.indexOf(m);\n this.editingKey = \"\";\n if (!text || index < 0 || this.busy) return;\n const removed = this.msgs.slice(index);\n this.msgs = this.msgs.slice(0, index);\n await this.deleteOnServer(removed.map((x) => x.id));\n await this.runTurn(this.userMessage(text, m.attachments));\n }\n\n private toggleRaw(key: string) {\n const next = new Set(this.rawKeys);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n this.rawKeys = next;\n }\n\n /** Adds newly saved files, and says which ones the service couldn't read. */\n private applyAttachmentResults(list: unknown) {\n if (!Array.isArray(list)) return;\n const saved = toSavedFiles(list).filter((f) => !this.savedFiles.some((x) => x.id === f.id));\n if (saved.length) this.savedFiles = [...this.savedFiles, ...saved];\n const failed = list\n .filter((item) => item?.status === \"failed\")\n .map((item) => String(item.name ?? \"file\"));\n if (failed.length) this.showToast(fill(this.msg.attachmentFailed, { name: failed.join(\", \") }));\n }\n\n /** Removes a file the service keeps on this chat. */\n private async removeSavedFile(file: ChatSavedAttachment) {\n const chatId = this.activeId;\n if (!chatId) return;\n const before = this.savedFiles;\n this.savedFiles = before.filter((f) => f !== file);\n try {\n await this.resolvedClient?.llm.call(\"remove_chat_attachment\", {\n _id: chatId,\n attachment_id: file.id\n });\n } catch {\n if (this.activeId === chatId) this.savedFiles = before;\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private copy(key: string, text: string) {\n void navigator.clipboard?.writeText(text).catch(() => {});\n this.copiedKey = key;\n this.later(() => {\n if (this.copiedKey === key) this.copiedKey = \"\";\n }, 1400);\n }\n\n private async toggleMessageBookmark(m: ChatMessage) {\n const chatId = this.activeId;\n if (!chatId || !m.id) return;\n m.bookmarked = !m.bookmarked;\n this.msgs = [...this.msgs];\n this.showToast(m.bookmarked ? this.msg.messageBookmarked : this.msg.bookmarkRemoved);\n this.emit(\"singlebase-chat-bookmark\", { chatId, messageId: m.id, bookmarked: m.bookmarked });\n try {\n await this.resolvedClient?.llm.call(\"bookmark_chat_message\", {\n _id: chatId,\n message_id: m.id,\n bookmarked: m.bookmarked\n });\n } catch {\n m.bookmarked = !m.bookmarked;\n this.msgs = [...this.msgs];\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private async toggleChatBookmark(chatId: string) {\n const current =\n this.chatList.find((chat) => chat._id === chatId)?.bookmarked ??\n (chatId === this.activeId ? this.bookmarked : false);\n const next = !current;\n const apply = (value: boolean) => {\n this.chatList = this.chatList.map((chat) =>\n chat._id === chatId ? { ...chat, bookmarked: value } : chat\n );\n if (chatId === this.activeId) this.bookmarked = value;\n };\n apply(next);\n this.showToast(next ? this.msg.chatBookmarked : this.msg.chatUnbookmarked);\n this.emit(\"singlebase-chat-bookmark\", { chatId, bookmarked: next });\n try {\n await this.resolvedClient?.llm.call(\"bookmark_chat\", { _id: chatId, bookmarked: next });\n } catch {\n apply(current);\n this.showToast(this.msg.errGeneric);\n }\n }\n\n /** Removed at once; the server call waits out the undo window. */\n private deleteMessage(m: ChatMessage) {\n const chatId = this.activeId;\n const index = this.msgs.indexOf(m);\n if (index < 0) return;\n this.msgs = this.msgs.filter((x) => x !== m);\n if (this.panel?.key === m.key) this.panel = null;\n this.showToast(this.msg.messageDeleted, {\n undo: () => {\n if (this.activeId !== chatId) return;\n const next = [...this.msgs];\n next.splice(index, 0, m);\n this.msgs = next;\n },\n commit: () => {\n this.emit(\"singlebase-chat-message-delete\", { chatId, messageId: m.id });\n if (chatId && m.id) {\n void this.resolvedClient?.llm\n .call(\"delete_chat_message\", { _id: chatId, message_id: m.id })\n .catch(() => {});\n }\n }\n });\n }\n\n private deleteChat(chatId: string) {\n const index = this.chatList.findIndex((chat) => chat._id === chatId);\n const summary = this.chatList[index] ?? {\n _id: chatId,\n title: this.chatTitle,\n bookmarked: this.bookmarked\n };\n const wasActive = chatId === this.activeId;\n const snapshot = wasActive\n ? { title: this.chatTitle, bookmarked: this.bookmarked, msgs: this.msgs }\n : null;\n this.chatList = this.chatList.filter((chat) => chat._id !== chatId);\n if (wasActive) this.newChat();\n\n this.showToast(this.msg.chatDeleted, {\n undo: () => {\n const next = [...this.chatList];\n next.splice(Math.max(0, index), 0, summary);\n this.chatList = next;\n if (snapshot && !this.activeId && !this.msgs.length) {\n this.activeId = chatId;\n this.chatTitle = snapshot.title;\n this.bookmarked = snapshot.bookmarked;\n this.msgs = snapshot.msgs;\n }\n },\n commit: () => {\n this.emit(\"singlebase-chat-delete\", { chatId });\n void this.resolvedClient?.llm.call(\"delete_chat\", { _id: chatId }).catch(() => {});\n }\n });\n }\n\n private feedback(m: ChatMessage, value: \"up\" | \"down\") {\n m.feedback = value;\n this.msgs = [...this.msgs];\n this.emit(\"singlebase-chat-feedback\", {\n chatId: this.activeId,\n messageId: m.id,\n value,\n text: m.content\n });\n }\n\n // ── toasts ────────────────────────────────────────────────\n private showToast(text: string, actions: { undo?: () => void; commit?: () => void } = {}) {\n this.flushToast();\n const toast: Toast = { key: Date.now(), text, ...actions };\n this.toast = toast;\n this.toastTimer = setTimeout(() => {\n if (this.toast === toast) this.flushToast();\n }, TOAST_MS);\n }\n\n /** Ends the current toast, committing whatever it was holding back. */\n private flushToast() {\n const toast = this.toast;\n clearTimeout(this.toastTimer);\n this.toast = null;\n toast?.commit?.();\n }\n\n private undo() {\n const toast = this.toast;\n clearTimeout(this.toastTimer);\n this.toast = null;\n toast?.undo?.();\n }\n\n // ── files ─────────────────────────────────────────────────\n private async addFiles(list: FileList | File[] | null | undefined) {\n const picked = Array.from(list ?? []);\n if (!picked.length) return;\n const accepted: ChatAttachment[] = [];\n for (const file of picked) {\n if (this.files.length + accepted.length >= MAX_FILES) {\n this.showToast(fill(this.msg.tooManyFiles, { n: MAX_FILES }));\n break;\n }\n if (!TEXT_FILE.test(file.name) && !file.type.startsWith(\"text/\")) {\n this.showToast(fill(this.msg.fileType, { name: file.name }));\n continue;\n }\n if (file.size > MAX_FILE_SIZE) {\n this.showToast(\n fill(this.msg.fileTooLarge, { name: file.name, size: formatSize(MAX_FILE_SIZE) })\n );\n continue;\n }\n accepted.push({\n name: file.name,\n size: file.size,\n content: await file.text(),\n ...(file.type ? { mime: file.type } : {})\n });\n }\n if (!accepted.length) return;\n this.files = [...this.files, ...accepted];\n this.emit(\"singlebase-chat-files\", {\n files: accepted.map(({ name, size }) => ({ name, size }))\n });\n }\n\n // ── scrolling ─────────────────────────────────────────────\n private async scrollToBottom() {\n await this.updateComplete;\n const scroller = this.renderRoot.querySelector(\".scroller\");\n if (scroller) scroller.scrollTop = scroller.scrollHeight;\n this.showJump = false;\n }\n\n private onScroll(event: Event) {\n const el = event.currentTarget as HTMLElement;\n this.stick = el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n if (this.stick) this.showJump = false;\n }\n\n private jumpToLatest() {\n this.stick = true;\n void this.scrollToBottom();\n }\n\n // ── keyboard ──────────────────────────────────────────────\n private onKeydown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n if (this.menuOpen) this.menuOpen = false;\n else if (this.panel) this.panel = null;\n else if (this.sidebarOpen && !this.docked) this.sidebarOpen = false;\n else if (this.expanded) this.collapse();\n else if (this.embed === \"launcher\" && this.isOpen) this.close();\n else return;\n event.stopPropagation();\n }\n\n private onComposerKey(event: KeyboardEvent) {\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n void this.send();\n }\n }\n\n private onComposerInput(event: Event) {\n const el = event.target as HTMLTextAreaElement;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(176, el.scrollHeight)}px`;\n this.draft = el.value;\n }\n\n // ── drag and drop ─────────────────────────────────────────\n private onDragEnter(event: DragEvent) {\n if (!this.allowUpload || !this.showComposer) return;\n if (!Array.from(event.dataTransfer?.types ?? []).includes(\"Files\")) return;\n event.preventDefault();\n this.dragging = true;\n }\n\n private onDragLeave(event: DragEvent) {\n const target = event.currentTarget as HTMLElement;\n if (!target.contains(event.relatedTarget as Node)) this.dragging = false;\n }\n\n private onDrop(event: DragEvent) {\n event.preventDefault();\n this.dragging = false;\n if (this.allowUpload) void this.addFiles(event.dataTransfer?.files);\n }\n\n // ── render ────────────────────────────────────────────────\n override render() {\n if (this.embed === \"launcher\") return this.renderLauncher();\n const classes = [\n \"frame\",\n this.embed === \"inline\" ? \"inline boxed\" : \"\",\n this.expanded ? \"expanded boxed\" : \"\"\n ].join(\" \");\n return html`<div class=${classes} part=\"frame\">${this.renderWorkspace()}</div>`;\n }\n\n private renderLauncher() {\n const msg = this.msg;\n const frame = [\n \"frame launcher boxed\",\n this.expanded ? \"expanded\" : \"\",\n this.mobile ? \"full\" : \"\"\n ].join(\" \");\n const panel = this.isOpen\n ? html`<div class=${frame} role=\"dialog\" aria-label=${this.assistantName} part=\"frame\">\n ${this.renderWorkspace()}\n </div>`\n : nothing;\n const bubble =\n this.bubble && !this.isOpen\n ? html`<div class=\"bubble\" part=\"bubble\">\n <button type=\"button\" class=\"bubble-text\" @click=${() => this.open()}>\n ${this.bubbleText || msg.bubbleText}\n </button>\n <button\n type=\"button\"\n class=\"icon sm\"\n aria-label=${msg.dismiss}\n title=${msg.dismiss}\n @click=${() => (this.bubble = false)}\n >\n ${I.close()}\n </button>\n </div>`\n : nothing;\n const hideButton = this.isOpen && (this.expanded || this.mobile);\n const button = hideButton\n ? nothing\n : html`<button\n type=\"button\"\n class=\"launcher-btn\"\n part=\"launcher\"\n aria-label=${this.isOpen ? msg.closeChat : msg.openChat}\n aria-expanded=${this.isOpen ? \"true\" : \"false\"}\n @click=${() => (this.isOpen ? this.close() : this.open())}\n >\n ${this.isOpen ? I.chevronDown() : I.chat()}\n ${this.unreadBadge && !this.seen && !this.isOpen ? html`<span class=\"badge\"></span>` : nothing}\n </button>`;\n return html`${panel}${bubble}${button}`;\n }\n\n private renderWorkspace() {\n const overlay = !this.docked;\n return html`<div class=\"root\" @keydown=${this.onKeydown}>\n ${\n this.sidebarOpen && overlay\n ? html`<div class=\"scrim\" @click=${() => (this.sidebarOpen = false)}></div>`\n : nothing\n }\n ${this.sidebarOpen && this.sidebar !== \"none\" ? this.renderSidebar(overlay) : nothing}\n <main\n class=\"main\"\n @dragenter=${this.onDragEnter}\n @dragover=${(e: DragEvent) => e.preventDefault()}\n >\n ${this.renderHeader()}\n ${this.offline ? html`<div class=\"banner\" role=\"status\">${this.msg.offline}</div>` : nothing}\n <div\n class=\"scroller\"\n role=\"log\"\n aria-live=\"polite\"\n aria-busy=${this.busy ? \"true\" : \"false\"}\n part=\"messages\"\n @scroll=${this.onScroll}\n >\n ${\n this.msgs.length || this.loadingThread || this.threadError\n ? this.renderThread()\n : this.renderWelcome()\n }\n </div>\n ${\n this.showJump\n ? html`<button type=\"button\" class=\"jump\" @click=${this.jumpToLatest}>\n ↓ ${this.msg.newReply}\n </button>`\n : nothing\n }\n ${this.renderComposer()} ${renderBranding(this.branding, \"Chat\")}\n ${\n this.toast\n ? html`<div class=\"toast\" role=\"status\">\n <span>${this.toast.text}</span>\n ${\n this.toast.undo\n ? html`<button type=\"button\" @click=${this.undo}>${this.msg.undo}</button>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${\n this.dragging\n ? html`<div\n class=\"drop\"\n @dragover=${(e: DragEvent) => e.preventDefault()}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <strong>${this.msg.dropTitle}</strong><span>${this.msg.dropSub}</span>\n </div>`\n : nothing\n }\n </main>\n ${this.renderPanel()}\n </div>`;\n }\n\n private renderSidebar(overlay: boolean) {\n const msg = this.msg;\n const query = this.allowSearch ? this.search.trim().toLowerCase() : \"\";\n const shown = this.chatList.filter(\n (chat) => !query || (chat.title ?? \"\").toLowerCase().includes(query)\n );\n // Bookmarked chats get their own group on top, unless show-bookmarked is off.\n const pinned = (c: ChatSummary) => this.showBookmarked && !!c.bookmarked;\n const inDay = (day: ReturnType<typeof dayGroup>) =>\n shown.filter((c) => !pinned(c) && dayGroup(c._modified_at ?? c._created_at) === day);\n const groups: [string, ChatSummary[]][] = [\n [msg.groupBookmarked, shown.filter(pinned)],\n [msg.groupToday, inDay(\"today\")],\n [msg.groupYesterday, inDay(\"yesterday\")],\n [msg.groupWeek, inDay(\"week\")],\n [msg.groupOlder, inDay(\"older\")]\n ];\n\n let body: unknown;\n if (this.listState === \"loading\" && !this.chatList.length) {\n body = html`<div aria-label=${msg.loadingChats}>\n ${[1, 2, 3, 4].map(() => html`<div class=\"skeleton\"></div>`)}\n </div>`;\n } else if (!shown.length) {\n body = html`<span class=\"side-note\"\n >${query ? fill(msg.noMatch, { query: this.search.trim() }) : msg.noChats}</span\n >`;\n } else {\n body = groups\n .filter(([, rows]) => rows.length)\n .map(\n ([label, rows]) =>\n html`<div class=\"group\">${label}</div>\n ${rows.map((chat) => this.renderThreadRow(chat))}`\n );\n }\n\n return html`<aside\n class=\"sidebar ${overlay ? \"overlay\" : \"docked\"}\"\n part=\"sidebar\"\n aria-label=${msg.chats}\n >\n <div class=\"side-head\">\n <span class=\"label\">${msg.chats}</span>\n <button\n type=\"button\"\n class=\"icon\"\n title=${msg.hideSidebar}\n aria-label=${msg.hideSidebar}\n @click=${() => (this.sidebarOpen = false)}\n >\n ${I.sidebar()}\n </button>\n </div>\n <div class=\"side-tools\">\n ${\n this.showNewChat\n ? html`<button type=\"button\" class=\"new-chat\" @click=${() => this.newChat()}>\n ${I.plus()}<span>${msg.newChat}</span>\n </button>`\n : nothing\n }\n ${\n this.allowSearch\n ? html`<input\n class=\"search\"\n type=\"search\"\n placeholder=${msg.searchChats}\n aria-label=${msg.searchChats}\n .value=${this.search}\n @input=${(e: Event) => (this.search = (e.target as HTMLInputElement).value)}\n />`\n : nothing\n }\n </div>\n <div class=\"threads\">${body}</div>\n <div class=\"side-extra ${this.hasSidebarContent ? \"filled\" : \"\"}\" part=\"sidebar-extra\">\n <slot\n name=\"sidebar\"\n @slotchange=${(e: Event) =>\n (this.hasSidebarContent = (e.target as HTMLSlotElement).assignedNodes().length > 0)}\n ></slot>\n </div>\n </aside>`;\n }\n\n private renderThreadRow(chat: ChatSummary) {\n const msg = this.msg;\n const active = chat._id === this.activeId;\n const title = chat.title || msg.untitled;\n if (this.renamingId === chat._id) {\n return html`<div class=\"thread active\">\n <input\n class=\"thread-rename\"\n maxlength=\"80\"\n .value=${title}\n aria-label=${msg.renameChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\")\n this.commitRename(chat._id, (e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.renamingId = \"\";\n }\n }}\n @blur=${(e: Event) => this.commitRename(chat._id, (e.target as HTMLInputElement).value)}\n />\n </div>`;\n }\n const stop = (fn: () => void) => (e: Event) => {\n e.stopPropagation();\n fn();\n };\n return html`<div\n class=\"thread ${active ? \"active\" : \"\"}\"\n role=\"button\"\n tabindex=\"0\"\n aria-current=${active ? \"true\" : \"false\"}\n @click=${() => this.openChat(chat._id)}\n @keydown=${(e: KeyboardEvent) => e.key === \"Enter\" && this.openChat(chat._id)}\n >\n <span class=\"thread-title\">${title}</span>\n <span class=\"thread-actions\">\n ${\n this.allowBookmark\n ? html`<button\n type=\"button\"\n class=\"icon sm ${chat.bookmarked ? \"on\" : \"\"}\"\n title=${chat.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n aria-label=${chat.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n @click=${stop(() => this.toggleChatBookmark(chat._id))}\n >\n ${I.bookmark(!!chat.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowRename\n ? html`<button\n type=\"button\"\n class=\"icon sm\"\n title=${msg.renameChat}\n aria-label=${msg.renameChat}\n @click=${stop(() => {\n this.renamingId = chat._id;\n this.focusNext = \"input.thread-rename\";\n })}\n >\n ${I.pencil()}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon sm danger\"\n title=${msg.deleteChat}\n aria-label=${msg.deleteChat}\n @click=${stop(() => this.deleteChat(chat._id))}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n </span>\n </div>`;\n }\n\n private renderHeader() {\n const msg = this.msg;\n const hasChat = !!this.activeId;\n const canExpand = (this.embed === \"inline\" || this.embed === \"launcher\") && !this.mobile;\n const minimize =\n this.embed === \"launcher\" ? () => this.close() : this.expanded ? () => this.collapse() : null;\n\n let title: unknown = nothing;\n if (this.showTitle) {\n title = this.editingTitle\n ? html`<input\n class=\"title-input\"\n maxlength=\"80\"\n .value=${this.chatTitle}\n aria-label=${msg.renameChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") this.commitTitle((e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.editingTitle = false;\n }\n }}\n @blur=${(e: Event) => this.commitTitle((e.target as HTMLInputElement).value)}\n />`\n : html`<button\n type=\"button\"\n class=\"title\"\n part=\"title\"\n ?disabled=${!hasChat || !this.allowRename}\n title=${hasChat && this.allowRename ? msg.renameChat : \"\"}\n @click=${() => {\n this.editingTitle = true;\n this.focusNext = \"input.title-input\";\n }}\n >\n ${this.chatTitle || msg.untitled}\n </button>`;\n }\n\n return html`<header class=\"header\" part=\"header\">\n <div class=\"header-left\">\n ${\n this.sidebar === \"none\" || (this.sidebarOpen && this.docked)\n ? nothing\n : html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.showChats}\n aria-label=${msg.showChats}\n @click=${() => (this.sidebarOpen = true)}\n >\n ${I.sidebar()}\n </button>`\n }\n ${title}\n </div>\n <div class=\"header-right\">\n ${\n this.sidebar === \"none\" && this.showNewChat\n ? html`<button\n type=\"button\"\n class=\"icon\"\n ?disabled=${!this.msgs.length && !hasChat}\n title=${msg.newChat}\n aria-label=${msg.newChat}\n @click=${() => this.newChat()}\n >\n ${I.plus()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark\n ? html`<button\n type=\"button\"\n class=\"icon ${this.bookmarked ? \"on\" : \"\"}\"\n ?disabled=${!hasChat}\n title=${this.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n aria-label=${this.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n @click=${() => this.activeId && this.toggleChatBookmark(this.activeId)}\n >\n ${I.bookmark(this.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowExport\n ? html`<div class=\"menu-wrap\">\n <button\n type=\"button\"\n class=\"icon ${this.menuOpen ? \"on\" : \"\"}\"\n ?disabled=${!this.msgs.length}\n title=${msg.exportChat}\n aria-label=${msg.exportChat}\n aria-haspopup=\"menu\"\n aria-expanded=${this.menuOpen ? \"true\" : \"false\"}\n @click=${() => (this.menuOpen = !this.menuOpen)}\n >\n ${I.download()}\n </button>\n ${this.menuOpen ? this.renderExportMenu() : nothing}\n </div>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n ?disabled=${!hasChat}\n title=${msg.deleteChat}\n aria-label=${msg.deleteChat}\n @click=${() => this.activeId && this.deleteChat(this.activeId)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n ${\n canExpand || minimize\n ? html`<span class=\"divider\"></span> ${\n canExpand\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.expanded ? msg.restore : msg.expand}\n aria-label=${this.expanded ? msg.restore : msg.expand}\n @click=${() => (this.expanded ? this.collapse() : this.expand())}\n >\n ${this.expanded ? I.restore() : I.expand()}\n </button>`\n : nothing\n }\n ${\n minimize\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.minimize}\n aria-label=${msg.minimize}\n @click=${minimize}\n >\n ${I.minimize()}\n </button>`\n : nothing\n }`\n : nothing\n }\n </div>\n </header>`;\n }\n\n private renderExportMenu() {\n const msg = this.msg;\n const items: [string, string, ChatExportFormat][] = [\n [msg.exportMarkdown, \".md\", \"md\"],\n [msg.exportJson, \".json\", \"json\"],\n [msg.exportText, \".txt\", \"txt\"],\n [msg.exportCopy, \"\", \"copy\"]\n ];\n return html`<div class=\"menu-scrim\" @click=${() => (this.menuOpen = false)}></div>\n <div class=\"menu\" role=\"menu\">\n <span class=\"label\">${msg.exportHeading}</span>\n ${items.map(\n ([label, ext, format]) =>\n html`<button\n type=\"button\"\n role=\"menuitem\"\n class=\"menu-item\"\n @click=${() => this.exportChat(format)}\n >\n <span>${label}</span><span class=\"ext\">${ext}</span>\n </button>`\n )}\n </div>`;\n }\n\n /** The suggestion cards. `[]` or `\"none\"` shows none; unset uses the mode's. */\n private promptList(): ChatPrompt[] {\n const custom = this.prompts;\n if (Array.isArray(custom)) {\n return custom\n .map((p) => (typeof p === \"string\" ? { text: p } : p))\n .filter((p) => p?.text)\n .slice(0, 4);\n }\n if (typeof custom === \"string\" && custom.trim().toLowerCase() === \"none\") return [];\n if (typeof custom === \"string\" && custom.trim()) {\n return custom\n .split(\"|\")\n .map((text) => text.trim())\n .filter(Boolean)\n .slice(0, 4)\n .map((text) => ({ text }));\n }\n return (DEFAULT_PROMPTS[this.mode] ?? DEFAULT_PROMPTS.chat).map(([label, text]) => ({\n label,\n text\n }));\n }\n\n private renderWelcome() {\n const msg = this.msg;\n const mode = this.mode === \"rag\" ? \"Rag\" : this.mode === \"kb\" ? \"Kb\" : \"Chat\";\n const pick = (key: string) => msg[`${key}${mode}` as keyof SinglebaseChatMessages];\n const eyebrow = this.eyebrow ?? pick(\"eyebrow\");\n const prompts = this.promptList();\n // Anything the page puts in slot=\"welcome\" replaces this whole screen.\n return html`<div class=\"welcome-slot\">\n <slot name=\"welcome\"\n ><div class=\"welcome\" part=\"welcome\">\n <div class=\"welcome-head\">\n ${\n this.logoUrl && isSafeUrl(this.logoUrl, true)\n ? html`<img class=\"welcome-logo\" src=${this.logoUrl} alt=\"\" />`\n : nothing\n }\n ${eyebrow ? html`<span class=\"label\">${eyebrow}</span>` : nothing}\n <h2>${this.heading || pick(\"heading\")}</h2>\n <p>${this.description || pick(\"description\")}</p>\n </div>\n ${\n prompts.length\n ? html`<div class=\"prompts\">\n ${prompts.map(\n (p) =>\n html`<button\n type=\"button\"\n class=\"prompt\"\n part=\"prompt\"\n @click=${() => this.send(p.text)}\n >\n <span class=\"label\">${p.label || \"Suggested\"}</span>\n <span class=\"prompt-text\">${p.text}</span>\n </button>`\n )}\n </div>`\n : nothing\n }\n </div></slot\n >\n </div>`;\n }\n\n private renderThread() {\n const lastBot = this.msgs.map((m) => m.role).lastIndexOf(\"assistant\");\n return html`<div class=\"thread-view\">\n ${\n this.threadError\n ? html`<div class=\"error-card\" role=\"alert\">\n <span>${this.threadError}</span>\n ${\n this.activeId\n ? html`<button\n type=\"button\"\n class=\"btn\"\n @click=${() => this.openChat(this.activeId!)}\n >\n ${this.msg.retry}\n </button>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${this.loadingThread ? html`${[1, 2].map(() => html`<div class=\"skeleton\" style=\"height:48px\"></div>`)}` : nothing}\n ${repeat(\n this.msgs,\n (m) => m.key,\n (m, i) => (m.role === \"user\" ? this.renderUser(m) : this.renderBot(m, i === lastBot))\n )}\n </div>`;\n }\n\n private renderUser(m: ChatMessage) {\n const msg = this.msg;\n const time = m.at\n ? new Date(m.at).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n const files = m.attachments ?? [];\n return html`<div class=\"msg user\" part=\"message user\">\n ${\n files.length\n ? html`<div class=\"attachments\">\n ${files.map((f) => html`<span class=\"doc-chip\"><span class=\"ext\">${fileExt(f.name)}</span><span class=\"name\">${f.name}</span></span>`)}\n </div>`\n : nothing\n }\n ${\n this.editingKey === m.key\n ? html`<div class=\"edit-box\">\n <textarea\n rows=\"3\"\n class=\"edit-input\"\n .value=${this.editDraft}\n @input=${(e: Event) => (this.editDraft = (e.target as HTMLTextAreaElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.editingKey = \"\";\n }\n }}\n ></textarea>\n <div class=\"row-end\">\n <button type=\"button\" class=\"btn\" @click=${() => (this.editingKey = \"\")}>\n ${msg.cancel}\n </button>\n <button type=\"button\" class=\"btn primary\" @click=${() => this.saveEdit(m)}>\n ${msg.saveResend}\n </button>\n </div>\n </div>`\n : html`<div class=\"bubble-user\">${m.content}</div>\n <div class=\"toolbar\">\n ${this.allowBookmark && m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n ${this.showTime ? html`<span class=\"time\">${time}</span>` : nothing}\n ${\n !this.busy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.edit}\n aria-label=${msg.edit}\n @click=${() => {\n this.editingKey = m.key;\n this.editDraft = m.content;\n this.focusNext = \"textarea.edit-input\";\n }}\n >\n ${I.pencil()}\n </button>`\n : nothing\n }\n ${\n this.allowCopy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.copiedKey === m.key ? msg.copied : msg.copy}\n aria-label=${msg.copy}\n @click=${() => this.copy(m.key, m.content)}\n >\n ${I.copy()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark && m.id\n ? html`<button\n type=\"button\"\n class=\"icon ${m.bookmarked ? \"on\" : \"\"}\"\n title=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n aria-label=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n @click=${() => this.toggleMessageBookmark(m)}\n >\n ${I.bookmark(m.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n title=${msg.deleteMessage}\n aria-label=${msg.deleteMessage}\n @click=${() => this.deleteMessage(m)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n </div>`\n }\n </div>`;\n }\n\n private pillLabel(): string {\n if (this.mode === \"rag\" || this.mode === \"kb\") return this.msg.searching;\n return this.msg.thinking;\n }\n\n private renderBot(m: ChatMessage, latest: boolean) {\n const msg = this.msg;\n const pending = m.phase === \"pending\";\n const done = m.phase === \"done\";\n const count = m.sources.length;\n const cited = citedNumbers(m.content);\n const numbered = m.sources.map((s, i) => describeSource(s, i + 1));\n const cards = cited.size ? numbered.filter((s) => cited.has(s.n)) : numbered;\n const time = m.at\n ? new Date(m.at).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n const copyText =\n m.content +\n (cards.length ? `\\n\\nSources:\\n${cards.map((s) => `[${s.n}] ${s.title}`).join(\"\\n\")}` : \"\");\n const retrievalOpen = this.retrievalOpen.has(m.key);\n\n return html`<div class=\"msg bot\" part=\"message assistant\">\n ${pending ? html`<div class=\"halo\"></div>` : nothing}\n ${\n this.arrivedKey === m.key\n ? html`<div class=\"arrived\">\n <div class=\"wash\"></div>\n <div class=\"ring\"></div>\n <div class=\"sweep\"></div>\n </div>`\n : nothing\n }\n <div class=\"bot-body\">\n ${this.allowBookmark && m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n ${\n pending\n ? html`<div class=\"pill\" role=\"status\">\n <span class=\"ring\"></span><span class=\"dot\"></span>\n <span class=\"shimmer\">${this.pillLabel()}</span>\n </div>`\n : nothing\n }\n ${\n this.showSources && count && !pending\n ? html`<div class=\"retrieval\">\n <button\n type=\"button\"\n class=\"retrieval-toggle\"\n aria-expanded=${retrievalOpen ? \"true\" : \"false\"}\n @click=${() => {\n const next = new Set(this.retrievalOpen);\n if (next.has(m.key)) next.delete(m.key);\n else next.add(m.key);\n this.retrievalOpen = next;\n }}\n >\n <span class=\"chev\">${retrievalOpen ? \"▾\" : \"▸\"}</span>\n <span style=\"flex:1\">${fill(msg.searchedSources, { n: count })}</span>\n ${m.execTime !== undefined ? html`<span class=\"ms\">${m.execTime.toFixed(1)}s</span>` : nothing}\n </button>\n ${\n retrievalOpen\n ? html`<div class=\"retrieval-list\">\n ${numbered.map(\n (s) =>\n html`<button\n type=\"button\"\n class=\"passage\"\n @click=${() => (this.panel = { key: m.key, n: s.n })}\n >\n <span class=\"n\">${s.n}</span>\n <span class=\"what\"\n ><span>${s.title}${s.section ? ` · ${s.section}` : \"\"}</span\n ><span>${s.collection || s.path}</span></span\n >\n ${\n s.score !== null\n ? html`<span class=\"relevance\"\n ><span class=\"score\">${s.score.toFixed(2)}</span>\n <span class=\"relevance-track\"\n ><span\n class=\"relevance-fill\"\n style=\"width:${Math.round(s.score * 100)}%\"\n ></span></span\n ></span>`\n : html`<span></span>`\n }\n </button>`\n )}\n </div>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${!pending ? this.renderAnswer(m) : nothing}\n ${m.phase === \"streaming\" ? html`<span class=\"caret\"></span>` : nothing}\n ${\n m.phase === \"error\"\n ? html`<div class=\"error-card\" role=\"alert\">\n <span>${m.error}</span>\n <button type=\"button\" class=\"btn\" @click=${() => this.retry(m)}>\n ${msg.retry}\n </button>\n </div>`\n : nothing\n }\n ${\n this.showSources && done && cards.length\n ? html`<div class=\"cards\">\n <span class=\"label\">${cited.size ? msg.sourcesCited : msg.sourcesRetrieved}</span>\n <div class=\"card-grid\">\n ${cards.map(\n (s) =>\n html`<button\n type=\"button\"\n class=\"source-card ${this.panel?.key === m.key && this.panel.n === s.n ? \"active\" : \"\"}\"\n @click=${() => (this.panel = { key: m.key, n: s.n })}\n >\n <span class=\"top\"\n ><span class=\"num\">${s.n}</span\n >${s.collection ? html`<span class=\"label\">${s.collection}</span>` : nothing}</span\n >\n <span class=\"t\">${s.title}${s.section ? ` · ${s.section}` : \"\"}</span>\n <span class=\"s\">${s.text}</span>\n </button>`\n )}\n </div>\n </div>`\n : nothing\n }\n ${\n done\n ? html`<div class=\"toolbar ${latest ? \"pinned\" : \"\"}\">\n ${\n this.allowCopy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.copiedKey === m.key ? msg.copied : msg.copy}\n aria-label=${msg.copy}\n @click=${() => this.copy(m.key, copyText)}\n >\n ${I.copy()}\n </button>`\n : nothing\n }\n ${\n this.allowRaw && this.formatLevel !== \"raw\" && m.content\n ? html`<button\n type=\"button\"\n class=\"icon ${this.rawKeys.has(m.key) ? \"on\" : \"\"}\"\n title=${this.rawKeys.has(m.key) ? msg.showFormatted : msg.showRaw}\n aria-label=${msg.showRaw}\n aria-pressed=${this.rawKeys.has(m.key) ? \"true\" : \"false\"}\n @click=${() => this.toggleRaw(m.key)}\n >\n ${I.raw()}\n </button>`\n : nothing\n }\n ${\n this.allowRegenerate && latest && !this.busy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.regenerate}\n aria-label=${msg.regenerate}\n @click=${() => this.regenerate()}\n >\n ${I.refresh()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark && m.id\n ? html`<button\n type=\"button\"\n class=\"icon ${m.bookmarked ? \"on\" : \"\"}\"\n title=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n aria-label=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n @click=${() => this.toggleMessageBookmark(m)}\n >\n ${I.bookmark(m.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n title=${msg.deleteMessage}\n aria-label=${msg.deleteMessage}\n @click=${() => this.deleteMessage(m)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n ${this.showTime ? html`<span class=\"time\">${time}</span>` : nothing}\n ${m.stopped ? html`<span class=\"note\">${msg.stopped}</span>` : nothing}\n <span class=\"spacer\"></span>\n ${\n !this.allowFeedback\n ? nothing\n : m.feedback\n ? html`<span class=\"note\"\n >${m.feedback === \"up\" ? msg.markedHelpful : msg.thanksFeedback}</span\n >`\n : html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.helpful}\n aria-label=${msg.helpful}\n @click=${() => this.feedback(m, \"up\")}\n >\n ${I.thumb()}\n </button>\n <button\n type=\"button\"\n class=\"icon\"\n title=${msg.notHelpful}\n aria-label=${msg.notHelpful}\n @click=${() => this.feedback(m, \"down\")}\n >\n ${I.thumb(true)}\n </button>`\n }\n </div>`\n : nothing\n }\n ${\n this.showFollowups && done && latest && !this.busy && m.followups.length\n ? html`<div class=\"followups\">\n ${m.followups.map(\n (q) =>\n html`<button type=\"button\" class=\"followup\" @click=${() => this.send(q)}>\n <span class=\"arrow\">↳</span><span>${q}</span>\n </button>`\n )}\n </div>`\n : nothing\n }\n </div>\n </div>`;\n }\n\n private renderAnswer(m: ChatMessage) {\n if (m.phase === \"error\" && !m.content) return nothing;\n if (m.phase === \"done\" && !m.content) {\n return m.stopped\n ? nothing\n : html`<div class=\"answer\"><p class=\"note\">${this.msg.emptyReply}</p></div>`;\n }\n const level = this.formatLevel;\n if (level === \"raw\" || (this.allowRaw && this.rawKeys.has(m.key))) {\n return html`<div class=\"answer\" part=\"answer\"><p class=\"raw\">${m.content}</p></div>`;\n }\n const source = m.phase === \"streaming\" ? settleStreaming(m.content) : m.content;\n let blocks = adaptBlocks(parseMarkdown(source), level);\n if (this.afterParse) {\n try {\n const out = this.afterParse(blocks, { message: m, format: level });\n if (Array.isArray(out)) blocks = out;\n else\n console.warn(\n \"[singlebase-chat] afterParse must return an array of blocks; showing the original.\"\n );\n } catch (error) {\n console.warn(\"[singlebase-chat] afterParse failed; showing the original.\", error);\n }\n }\n // Citations may go up to the highest source number the service gave.\n const maxCite = m.sources.reduce(\n (max: number, source, i) => Math.max(max, describeSource(source, i + 1).n),\n 0\n );\n return html`<div class=\"answer\" part=\"answer\">\n ${blocks.map((b, i) => this.renderBlock(b, m, maxCite, i))}\n </div>`;\n }\n\n private renderInline(text: string, m: ChatMessage, maxCite: number) {\n return parseInline(text, maxCite).map((seg) => {\n switch (seg.type) {\n case \"bold\":\n return html`<strong>${seg.text}</strong>`;\n case \"italic\":\n return html`<em>${seg.text}</em>`;\n case \"strike\":\n return html`<s>${seg.text}</s>`;\n case \"code\":\n return html`<code class=\"inline\">${seg.text}</code>`;\n case \"link\":\n return html`<a href=${seg.href} target=\"_blank\" rel=\"noopener noreferrer nofollow\"\n >${seg.text}</a\n >`;\n case \"cite\": {\n const cls = this.panel?.key === m.key && this.panel.n === seg.n ? \"cite active\" : \"cite\";\n const label = fill(this.msg.openSource, { n: seg.n });\n const open = () => (this.panel = { key: m.key, n: seg.n });\n // Kept on one line: whitespace inside the chip would sit next to the number.\n // prettier-ignore\n return html`<button type=\"button\" class=${cls} aria-label=${label} @click=${open}>${seg.n}</button>`;\n }\n default:\n return seg.text;\n }\n });\n }\n\n private renderBlock(block: Block, m: ChatMessage, maxCite: number, index: number): unknown {\n switch (block.type) {\n case \"p\":\n return html`<p>${this.renderInline(block.text, m, maxCite)}</p>`;\n case \"raw\":\n return html`<p class=\"raw\">${block.text}</p>`;\n case \"h\":\n return html`<h3 class=\"h${block.level}\">${this.renderInline(block.text, m, maxCite)}</h3>`;\n case \"hr\":\n return html`<hr />`;\n case \"list\":\n return this.renderList(block.ordered, block.items, m, maxCite);\n case \"quote\":\n return html`<div class=\"quote\">${this.renderInline(block.text, m, maxCite)}</div>`;\n case \"callout\":\n return html`<div class=\"callout ${block.kind}\" role=\"note\" part=\"callout\">\n <strong class=\"callout-title\"\n >${block.title || this.msg[CALLOUT_MESSAGE[block.kind]]}</strong\n >\n ${block.text\n .split(\"\\n\")\n .filter((line) => line.trim())\n .map((line) => html`<p>${this.renderInline(line, m, maxCite)}</p>`)}\n </div>`;\n case \"code\":\n return (\n this.renderCustom(block.lang, block.text, m) ??\n this.renderCode(block.lang, block.text, `${m.key}:${index}`)\n );\n case \"table\":\n return this.renderTable(\n block.head,\n block.rows,\n block.align,\n m,\n maxCite,\n `${m.key}:${index}`\n );\n case \"json\":\n return this.renderJsonBlock(block.value, block.source, `${m.key}:${index}`);\n case \"svg\": {\n const url = svgDataUrl(block.source);\n if (!url) return this.renderCode(\"svg\", block.source, `${m.key}:${index}`);\n const key = `${m.key}:${index}`;\n return html`<figure class=\"svg\" part=\"svg\">\n <img src=${url} alt=\"Drawing\" />\n <figcaption>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, block.source)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copySvg}\n </button>\n </figcaption>\n </figure>`;\n }\n case \"pending\":\n return html`<div class=\"chart-pending\">\n <span class=\"label\"\n >${block.kind === \"svg\" ? this.msg.renderingSvg : this.msg.renderingChart}</span\n >\n </div>`;\n case \"chart\":\n return this.renderChart(block.spec);\n case \"img\":\n return html`<div class=\"gallery ${block.images.length > 1 ? \"many\" : \"\"}\">\n ${block.images.map(\n (image) =>\n html`<figure>\n ${\n image.src && isSafeUrl(image.src, true)\n ? html`<img\n src=${image.src}\n alt=${image.alt}\n loading=\"lazy\"\n referrerpolicy=\"no-referrer\"\n />`\n : html`<div class=\"img-missing\"><span class=\"label\">Image</span></div>`\n }\n ${image.alt ? html`<figcaption>${image.alt}</figcaption>` : nothing}\n </figure>`\n )}\n </div>`;\n default:\n return nothing;\n }\n }\n\n private renderList(ordered: boolean, items: ListItem[], m: ChatMessage, maxCite: number) {\n const rows = items.map(\n (item) =>\n html`<li\n class=${item.checked === null ? \"\" : \"task\"}\n style=${item.depth ? `margin-left:${item.depth * 20}px` : \"\"}\n >\n ${\n item.checked === null\n ? nothing\n : html`<input type=\"checkbox\" disabled .checked=${item.checked} aria-hidden=\"true\" />`\n }\n ${this.renderInline(item.text, m, maxCite)}\n </li>`\n );\n return ordered\n ? html`<ol>\n ${rows}\n </ol>`\n : html`<ul>\n ${rows}\n </ul>`;\n }\n\n private renderCode(lang: string, text: string, key: string) {\n return html`<div class=\"code\">\n <div class=\"code-head\">\n <span class=\"label\">${lang}</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, text)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <pre><code>${text}</code></pre>\n </div>`;\n }\n\n /** A host renderer for this language, at the rich level only. */\n private renderCustom(lang: string, text: string, m: ChatMessage): unknown {\n const draw = this.formatLevel === \"rich\" ? this.renderers?.[lang] : undefined;\n if (typeof draw !== \"function\" || m.phase === \"streaming\") return null;\n try {\n const out = draw(text, { lang, message: m });\n return out === null || out === undefined\n ? null\n : html`<div class=\"custom-block\">${out}</div>`;\n } catch (error) {\n console.warn(`[singlebase-chat] the \"${lang}\" renderer failed; showing the source`, error);\n return null;\n }\n }\n\n private renderTable(\n head: string[],\n rows: string[][],\n align: (string | null)[],\n m: ChatMessage,\n maxCite: number,\n key: string\n ) {\n const numeric = (value: string) =>\n /^[-+]?[$€£¥]?\\s?[\\d,.]+\\s?%?$/.test(value.trim()) && /\\d/.test(value);\n const toNumber = (value: string) => Number(value.replace(/[^\\d.+-]/g, \"\"));\n const alignOf = head.map((_, col) => {\n if (align[col]) return align[col];\n const cells = rows.map((r) => r[col] ?? \"\").filter(Boolean);\n return cells.length && cells.filter(numeric).length / cells.length >= 0.8 ? \"right\" : null;\n });\n\n const sort = this.sorts.get(key);\n let shown = rows;\n if (sort) {\n shown = [...rows].sort((a, b) => {\n const x = a[sort.col] ?? \"\";\n const y = b[sort.col] ?? \"\";\n const diff =\n numeric(x) && numeric(y)\n ? toNumber(x) - toNumber(y)\n : x.localeCompare(y, undefined, { numeric: true });\n return diff * sort.dir;\n });\n }\n const total = shown.length;\n shown = shown.slice(0, MAX_TABLE_ROWS);\n\n const sortBy = (col: number) => {\n const next = new Map(this.sorts);\n const current = next.get(key);\n if (current?.col === col && current.dir === -1) next.delete(key);\n else next.set(key, { col, dir: current?.col === col ? -1 : 1 });\n this.sorts = next;\n };\n const style = (col: number) => (alignOf[col] ? `text-align:${alignOf[col]}` : \"\");\n\n return html`<div class=\"table\" part=\"table\">\n <table>\n <thead>\n <tr>\n ${head.map((cell, col) => {\n const state =\n sort?.col === col ? (sort.dir === 1 ? \"ascending\" : \"descending\") : \"none\";\n return html`<th style=${style(col)} aria-sort=${state}>\n ${\n rows.length > 1\n ? html`<button type=\"button\" class=\"sort\" @click=${() => sortBy(col)}>\n ${this.renderInline(cell, m, maxCite)}<span class=\"arrow\"\n >${state === \"ascending\" ? \"↑\" : state === \"descending\" ? \"↓\" : \"↕\"}</span\n >\n </button>`\n : this.renderInline(cell, m, maxCite)\n }\n </th>`;\n })}\n </tr>\n </thead>\n <tbody>\n ${shown.map(\n (row) =>\n html`<tr>\n ${head.map(\n (_, col) =>\n html`<td style=${style(col)}>\n ${this.renderInline(row[col] ?? \"\", m, maxCite)}\n </td>`\n )}\n </tr>`\n )}\n </tbody>\n </table>\n ${\n total > shown.length\n ? html`<div class=\"table-note\">\n ${fill(this.msg.showingRows, { n: shown.length, total })}\n </div>`\n : nothing\n }\n </div>`;\n }\n\n private renderJsonBlock(value: unknown, source: string, key: string) {\n let nodes = 0;\n const count = (v: unknown): void => {\n nodes++;\n if (nodes <= MAX_JSON_NODES && v && typeof v === \"object\") Object.values(v).forEach(count);\n };\n count(value);\n if (nodes > MAX_JSON_NODES) return this.renderCode(\"json\", source, key);\n\n const node = (v: unknown, depth: number, name?: string): unknown => {\n const label = name === undefined ? nothing : html`<span class=\"jkey\">${name}</span>: `;\n if (v && typeof v === \"object\") {\n const entries = Object.entries(v);\n const meta = Array.isArray(v) ? `[${entries.length}]` : `{${entries.length}}`;\n return html`<details class=\"jnode\" ?open=${depth < 2}>\n <summary>${label}<span class=\"jmeta\">${meta}</span></summary>\n <div class=\"jkids\">${entries.map(([k, child]) => node(child, depth + 1, k))}</div>\n </details>`;\n }\n const type = v === null ? \"null\" : typeof v;\n return html`<div class=\"jleaf\">\n ${label}<span class=\"jv ${type}\">${JSON.stringify(v)}</span>\n </div>`;\n };\n\n return html`<div class=\"code json\" part=\"json\">\n <div class=\"code-head\">\n <span class=\"label\">json</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, source)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <div class=\"jtree\">${node(value, 0)}</div>\n </div>`;\n }\n\n private renderChart(spec: ChartSpec) {\n const legend =\n spec.series.length > 1\n ? html`<span class=\"legend\">\n ${spec.series.map(\n (s, k) =>\n html`<span\n ><span\n class=\"swatch\"\n style=\"background:${CHART_COLORS[k % CHART_COLORS.length]}\"\n ></span\n >${s.name}</span\n >`\n )}\n </span>`\n : nothing;\n const head = html`<div class=\"chart-head\">\n <span class=\"chart-title\">${spec.title}</span>${legend}\n </div>`;\n\n if (spec.type === \"line\") {\n const peak = Math.max(0, ...spec.series.flatMap((s) => s.values));\n const scale = Math.pow(10, Math.floor(Math.log10(peak || 1)));\n const max = (Math.ceil((peak / scale) * 2) / 2) * scale || 1;\n const n = Math.max(spec.labels.length, ...spec.series.map((s) => s.values.length));\n return html`<figure class=\"chart\" part=\"chart\" aria-label=${spec.title}>\n ${head}\n <div class=\"line-chart\">\n <div class=\"plot\">\n ${[1, 0.5, 0].map(\n (f) =>\n html`<div class=\"tick ${f === 0 ? \"base\" : \"\"}\" style=\"top:${(1 - f) * 100}%\">\n <span>${formatNumber(Math.round(max * f), spec.unit)}</span>\n </div>`\n )}\n <svg\n viewBox=\"0 0 600 170\"\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label=${spec.title}\n >\n ${spec.series.map(\n (\n s,\n k\n ) => svg`<polyline pathLength=\"1\" stroke=${CHART_COLORS[k % CHART_COLORS.length]}\n points=${s.values\n .map(\n (v, i) =>\n `${(n > 1 ? (i / (n - 1)) * 600 : 300).toFixed(1)},${(170 - (v / max) * 170).toFixed(1)}`\n )\n .join(\n \" \"\n )}><title>${s.name}: ${s.values.map((v) => formatNumber(v, spec.unit)).join(\", \")}</title></polyline>`\n )}\n </svg>\n </div>\n <div class=\"x-labels\">${spec.labels.map((label) => html`<span>${label}</span>`)}</div>\n </div>\n </figure>`;\n }\n\n const totals = spec.labels.map((_, i) =>\n spec.series.reduce((sum, s) => sum + (s.values[i] || 0), 0)\n );\n const max = Math.max(0, ...totals) || 1;\n return html`<figure class=\"chart\" part=\"chart\" aria-label=${spec.title}>\n ${head}\n <div class=\"bars\">\n ${spec.labels.map(\n (label, i) =>\n html`<div class=\"bar-row\" title=\"${label}: ${formatNumber(totals[i], spec.unit)}\">\n <span class=\"bar-label\">${label}</span>\n <span class=\"bar-track\"\n ><span class=\"bar-fill\" style=\"width:${(Math.max(0, totals[i]) / max) * 100}%\">\n ${spec.series.map(\n (s, k) =>\n html`<span\n style=\"flex:${Math.max(0, s.values[i] || 0)};background:${spec.series.length > 1 ? CHART_COLORS[k % CHART_COLORS.length] : \"var(--c-ink)\"}\"\n ></span>`\n )}\n </span></span\n >\n <span class=\"bar-value\">${formatNumber(totals[i], spec.unit)}</span>\n </div>`\n )}\n </div>\n </figure>`;\n }\n\n private renderPanel() {\n if (!this.panel) return nothing;\n const m = this.msgs.find((x) => x.key === this.panel!.key);\n if (!m) return nothing;\n const numbered = m.sources.map((x, i) => describeSource(x, i + 1));\n const s = numbered.find((x) => x.n === this.panel!.n);\n if (!s) return nothing;\n const msg = this.msg;\n const cited = citedNumbers(m.content);\n const others = numbered.filter((o) => o.n !== s.n && (!cited.size || cited.has(o.n)));\n const refKey = `ref:${m.key}:${s.n}`;\n const reference = `\"${s.text}\"\\n— ${s.title} [${s.n}]${s.path ? `\\n${s.path}` : \"\"}${s.updated ? ` · Updated ${s.updated}` : \"\"}`;\n const meta = [\n s.updated ? `Updated ${s.updated}` : \"\",\n s.score !== null ? `Relevance ${s.score.toFixed(2)}` : \"\"\n ]\n .filter(Boolean)\n .join(\" · \");\n\n return html`<aside\n class=\"panel ${this.panelDocked ? \"docked\" : \"overlay\"}\"\n part=\"panel\"\n role=\"region\"\n aria-label=${fill(msg.sourceLabel, { n: s.n })}\n >\n <div class=\"panel-head\">\n <span class=\"label\"\n >${fill(msg.sourceLabel, { n: s.n })}${s.collection ? ` · ${s.collection}` : \"\"}</span\n >\n <button type=\"button\" class=\"text-btn underline\" @click=${() => (this.panel = null)}>\n ${msg.close}\n </button>\n </div>\n <div class=\"panel-body\">\n <div class=\"panel-meta\">\n <h3>${s.title}</h3>\n ${s.section ? html`<span class=\"meta\">${s.section}</span>` : nothing}\n ${s.path ? html`<span class=\"path\">${s.path}</span>` : nothing}\n ${meta ? html`<span class=\"meta\">${meta}</span>` : nothing}\n </div>\n <div class=\"passage-box\">\n <span class=\"text\">${s.text}</span>\n <div class=\"passage-foot\">\n <span class=\"label\">${msg.citedPassage}</span>\n <button\n type=\"button\"\n class=\"copy-ref\"\n title=${msg.copyReference}\n aria-label=${msg.copyReference}\n @click=${() => this.copy(refKey, reference)}\n >\n ${I.copy()}<span>${this.copiedKey === refKey ? msg.copied : msg.copy}</span>\n </button>\n </div>\n </div>\n </div>\n ${\n others.length\n ? html`<div class=\"panel-foot\">\n <span class=\"label\">${msg.alsoCited}</span>\n <div class=\"chips\">\n ${others.map(\n (o) =>\n html`<button\n type=\"button\"\n class=\"chip\"\n @click=${() => (this.panel = { key: m.key, n: o.n })}\n >\n ${o.n} · ${o.title}\n </button>`\n )}\n </div>\n </div>`\n : nothing\n }\n </aside>`;\n }\n\n private renderComposer() {\n const msg = this.msg;\n const placeholder =\n this.mode === \"rag\"\n ? msg.placeholderRag\n : this.mode === \"kb\"\n ? msg.placeholderKb\n : fill(msg.placeholderChat, { name: this.assistantName });\n const cantSend = !this.draft.trim();\n const footnote =\n this.footnote === \"\"\n ? nothing\n : html`<span class=\"footnote\" part=\"footnote\"\n >${this.footnote ?? fill(msg.footnote, { name: this.assistantName })}</span\n >`;\n // Without a composer the chat is a reader: the conversation, and the footnote.\n if (!this.showComposer) {\n return html`<div class=\"composer-wrap reader\">\n <div class=\"composer-col\">${footnote}</div>\n </div>`;\n }\n return html`<div class=\"composer-wrap\">\n <div class=\"composer-col\">\n <input\n type=\"file\"\n multiple\n hidden\n accept=\".md,.markdown,.txt,.csv,.tsv,.json,.html,.htm,.yaml,.yml,.xml,.log,text/*\"\n @change=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n void this.addFiles(input.files).then(() => (input.value = \"\"));\n }}\n />\n <div class=\"composer-box\">\n ${this.busy ? html`<div class=\"composer-glow\"></div>` : nothing}\n <div class=\"composer ${this.busy ? \"busy\" : \"\"}\" part=\"composer\">\n ${\n this.savedFiles.length\n ? html`<div class=\"pending-files\" part=\"saved-files\">\n ${this.savedFiles.map(\n (f) =>\n html`<div class=\"pending-file kept\">\n <span class=\"ext\">${fileExt(f.name)}</span>\n <span class=\"meta\"\n ><span class=\"name\">${f.name}</span\n ><span class=\"size\">${msg.inThisChat}</span></span\n >\n <button\n type=\"button\"\n aria-label=${msg.removeFromChat}\n title=${msg.removeFromChat}\n @click=${() => this.removeSavedFile(f)}\n >\n ×\n </button>\n </div>`\n )}\n </div>`\n : nothing\n }\n ${\n this.files.length\n ? html`<div class=\"pending-files\">\n ${this.files.map(\n (f) =>\n html`<div class=\"pending-file\">\n <span class=\"ext\">${fileExt(f.name)}</span>\n <span class=\"meta\"\n ><span class=\"name\">${f.name}</span\n ><span class=\"size\">${formatSize(f.size)}</span></span\n >\n <button\n type=\"button\"\n aria-label=${msg.removeFile}\n title=${msg.removeFile}\n @click=${() => (this.files = this.files.filter((x) => x !== f))}\n >\n ×\n </button>\n </div>`\n )}\n </div>`\n : nothing\n }\n <textarea\n class=\"input\"\n rows=\"1\"\n placeholder=${placeholder}\n aria-label=${placeholder}\n .value=${this.draft}\n @input=${this.onComposerInput}\n @keydown=${this.onComposerKey}\n ></textarea>\n <div class=\"composer-row\">\n <div>\n ${\n this.allowUpload\n ? html`<button\n type=\"button\"\n class=\"attach\"\n title=${msg.attach}\n aria-label=${msg.attach}\n @click=${() => this.renderRoot.querySelector<HTMLInputElement>(\"input[type=file]\")?.click()}\n >\n ${I.clip()}\n </button>`\n : nothing\n }\n </div>\n ${\n this.busy\n ? html`<button\n type=\"button\"\n class=\"send stop\"\n title=${msg.stop}\n aria-label=${msg.stop}\n @click=${() => this.stop()}\n >\n ${I.stop()}\n </button>`\n : html`<button\n type=\"button\"\n class=\"send\"\n title=${msg.send}\n aria-label=${msg.send}\n ?disabled=${cantSend}\n @click=${() => this.send()}\n >\n ${I.up()}\n </button>`\n }\n </div>\n </div>\n ${this.busy ? html`<div class=\"composer-ring\"><div class=\"ring\"></div></div>` : nothing}\n </div>\n ${footnote}\n </div>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-chat\": SinglebaseChat;\n }\n}\n"],"names":["chatStyles","css","defaultChatMessages","resolveChatMessages","overrides","TABLE_ROW","TABLE_RULE","IMAGE_LINE","LIST_ITEM","TASK","RULE","ALERT","CALLOUT_KINDS","parseMarkdown","text","blocks","parts","part","index","newline","info","body","fencedBlock","chunk","parseChunk","open","word","rest","lang","spec","parseChart","rows","parseDelimited","kind","known","raw","line","lines","cells","cell","ruleIndex","align","head","_","i","match","alert","items","task","heading","separator","row","field","quoted","c","width","_a","r","series","entry","value","labels","INLINE","parseInline","maxCite","out","last","pushText","prev","valid","n","settleStreaming","cut","tail","marker","at","citedNumbers","found","group","chartRows","s","label","rowsText","CALLOUT_LABELS","adaptBlocks","level","simple","block","image","splitFollowups","content","source","followups","q","plainText","_m","provisionalTitle","max","clean","space","cleanTitle","isSafeUrl","url","MAX_SVG_BYTES","DROP_ELEMENTS","svgDataUrl","doc","root","walk","el","child","name","inner","node","attr","external","scripted","style","markup","CONFIG_KEYS","jsonAttr","flagAttr","sidebarAttr","SIDEBAR_WIDTH","DOCK_SIDEBAR_AT","DOCK_PANEL_AT","MAX_FILES","MAX_FILE_SIZE","TEXT_FILE","TOAST_MS","MAX_TABLE_ROWS","MAX_JSON_NODES","CALLOUT_MESSAGE","ARRIVED_MS","CHART_COLORS","MODE_PROMPTS","FORMAT_PROMPTS","FOLLOWUP_PROMPT","DEFAULT_PROMPTS","icon","cls","html","I","svg","on","down","keySeed","newKey","isNotFound","error","e","errorCode","reducedMotion","formatNumber","unit","fileExt","dot","describeSource","meta","pick","values","v","score","number","toSavedFiles","list","item","toRetrieval","files","documents","file","dayGroup","iso","start","day","SinglebaseChat","LitElement","__privateAdd","_client","_messages","_theme","_radius","_mode","_format","_renderers","_beforeSend","_afterParse","_glow","_docsets","_attachmentsMode","_saveAttachments","_followups","_showSources","_showNewChat","_showBookmarked","_showFollowups","_allowSearch","_autoTitle","_model","_params","_systemMessage","_retrieval","_metadata","_embed","_position","_sidebar","_showTitle","_chatIdAttr","_assistantName","_logoUrl","_heading","_description","_eyebrow","_prompts","_bubbleText","_greetingBubble","_unreadBadge","_allowUpload","_allowExport","_allowCopy","_allowRegenerate","_allowBookmark","_allowDelete","_allowRename","_allowFeedback","_showComposer","_showTime","_footnote","_allowRaw","_branding","_chatList","_listState","_activeId","_chatTitle","_bookmarked","_msgs","_loadingThread","_threadError","_busy","_draft","_files","_search","_sidebarOpen","_width","_panel","_menuOpen","_editingKey","_editDraft","_editingTitle","_renamingId","_toast","_copiedKey","_retrievalOpen","_rawKeys","_savedFiles","_hasSidebarContent","_sorts","_arrivedKey","_dragging","_showJump","_offline","_isOpen","_expanded","_bubble","_seen","_mobile","__publicField","__privateGet","__privateSet","getDefaultClient","id","target","key","options","_b","changed","fn","ms","detail","used","client","summary","chat","run","data","m","attachments","input","format","title","who","when","sources","d","a","mime","ext","anchor","fill","user","payload","asPayload","names","docsets","retrieval","bot","controller","isNew","chatId","reply","notFound","code","message","total","finish","full","step","shown","resolve","question","answer","auto","previous","assistant","existing","next","ids","removed","x","saved","f","failed","before","current","apply","wasActive","snapshot","actions","toast","picked","accepted","formatSize","size","scroller","event","classes","msg","frame","panel","nothing","bubble","button","overlay","renderBranding","query","pinned","inDay","groups","active","stop","hasChat","canExpand","minimize","custom","p","mode","eyebrow","prompts","lastBot","repeat","time","latest","pending","done","count","cited","numbered","cards","copyText","retrievalOpen","b","seg","ordered","draw","numeric","toNumber","alignOf","col","sort","y","sortBy","state","nodes","depth","entries","k","type","legend","peak","scale","totals","sum","others","o","refKey","reference","placeholder","cantSend","footnote","tokenDefaults","brandingStyles","__decorateClass","property","customElement"],"mappings":"gqBAOA,GAAI,OAAO,IAAQ,KAAe,qBAAsB,IACtD,GAAI,CACF,IAAI,iBAAiB,CACnB,KAAM,gBACN,OAAQ,UACR,SAAU,GACV,aAAc,MAAA,CACf,CACH,MAAQ,CAER,CAQK,MAAMA,GAAaC,EAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAA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"}
|