@singlebase/elements 0.1.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +2 -0
  2. package/dist/{display-8HEcKYR4.js → authui-display-BCZBP7HR.js} +11 -10
  3. package/dist/authui-display-BCZBP7HR.js.map +1 -0
  4. package/dist/{display-CLDNNZQy.cjs → authui-display-CLGFSqRi.cjs} +21 -21
  5. package/dist/authui-display-CLGFSqRi.cjs.map +1 -0
  6. package/dist/authui.cjs +1 -1
  7. package/dist/authui.d.ts +9 -9
  8. package/dist/authui.js +2 -2
  9. package/dist/chat-DRenTJlI.cjs +3001 -0
  10. package/dist/chat-DRenTJlI.cjs.map +1 -0
  11. package/dist/chat-bXaRWel7.js +4926 -0
  12. package/dist/chat-bXaRWel7.js.map +1 -0
  13. package/dist/chat-messages.d.ts +109 -0
  14. package/dist/chat.cjs +2 -0
  15. package/dist/chat.cjs.map +1 -0
  16. package/dist/chat.d.ts +10 -0
  17. package/dist/chat.js +13 -0
  18. package/dist/chat.js.map +1 -0
  19. package/dist/elements/{account-screen.d.ts → authui-account.d.ts} +1 -1
  20. package/dist/elements/{buttons.d.ts → authui-buttons.d.ts} +1 -1
  21. package/dist/elements/{display.d.ts → authui-display.d.ts} +1 -1
  22. package/dist/elements/{form-base.d.ts → authui-form-base.d.ts} +1 -1
  23. package/dist/elements/{guard.d.ts → authui-guard.d.ts} +1 -1
  24. package/dist/elements/{auth-screen.d.ts → authui.d.ts} +3 -3
  25. package/dist/elements/chat.d.ts +312 -0
  26. package/dist/files-BOwtpYyQ.js +168 -0
  27. package/dist/files-BOwtpYyQ.js.map +1 -0
  28. package/dist/files-DW8A4Jl-.cjs +38 -0
  29. package/dist/files-DW8A4Jl-.cjs.map +1 -0
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.d.ts +3 -2
  32. package/dist/index.js +36 -25
  33. package/dist/index.js.map +1 -1
  34. package/dist/singlebase-elements.min.js +6845 -1829
  35. package/dist/singlebase-elements.min.js.map +1 -1
  36. package/dist/styles/chat.d.ts +6 -0
  37. package/dist/styles/tokens.d.ts +1 -1
  38. package/dist/{uploader-eFYKpk8b.cjs → uploader-DGV2y9uT.cjs} +41 -77
  39. package/dist/uploader-DGV2y9uT.cjs.map +1 -0
  40. package/dist/{uploader-D-Da1trc.js → uploader-abQoem5q.js} +309 -463
  41. package/dist/uploader-abQoem5q.js.map +1 -0
  42. package/dist/uploader.cjs +1 -1
  43. package/dist/uploader.js +5 -4
  44. package/dist/uploader.js.map +1 -1
  45. package/dist/utils/markdown.d.ts +108 -0
  46. package/package.json +13 -5
  47. package/dist/display-8HEcKYR4.js.map +0 -1
  48. package/dist/display-CLDNNZQy.cjs.map +0 -1
  49. package/dist/uploader-D-Da1trc.js.map +0 -1
  50. package/dist/uploader-eFYKpk8b.cjs.map +0 -1
  51. /package/dist/elements/{base.d.ts → authui-base.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-bXaRWel7.js","sources":["../src/styles/chat.ts","../src/chat-messages.ts","../src/utils/markdown.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: var(--sb-radius, 4px);\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-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 {\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 .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-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 .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 .branding {\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 .branding a {\n font-family: var(--c-mono);\n font-size: 10.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--c-muted);\n text-decoration: none;\n }\n\n .branding a:hover {\n color: var(--c-ink);\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 eyebrowRich: string;\n headingChat: string;\n headingRag: string;\n headingRich: string;\n descriptionChat: string;\n descriptionRag: string;\n descriptionRich: string;\n\n // composer\n placeholderChat: string;\n placeholderRag: string;\n placeholderRich: string;\n footnote: string;\n attach: string;\n send: string;\n stop: string;\n removeFile: string;\n dropTitle: string;\n dropSub: string;\n\n // status pills\n thinking: string;\n searching: string;\n building: 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 // 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 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 brandingLabel: string;\n}\n\nexport const defaultChatMessages: SinglebaseChatMessages = {\n eyebrowChat: \"Chat\",\n eyebrowRag: \"Grounded answers\",\n eyebrowRich: \"Charts · tables · images\",\n headingChat: \"What can I help with?\",\n headingRag: \"Ask your knowledge base\",\n headingRich: \"Ask for a chart or a table\",\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 descriptionRich:\n \"Answers come back with charts, tables and images when they help. Attach CSV or JSON files to use your own data.\",\n\n placeholderChat: \"Message {name}…\",\n placeholderRag: \"Ask about your sources…\",\n placeholderRich: \"Ask for a chart, table or breakdown…\",\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 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 building: \"Building charts and tables\",\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 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 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 brandingLabel: \"Chat by Singlebase\"\n};\n\nexport function resolveChatMessages(\n overrides: Partial<SinglebaseChatMessages> | undefined\n): SinglebaseChatMessages {\n return { ...defaultChatMessages, ...(overrides ?? {}) };\n}\n","/**\n * The small Markdown subset <singlebase-chat> renders, parsed into plain\n * blocks. Nothing here produces HTML: the element turns blocks into Lit\n * templates, so model output is always text, never markup.\n *\n * Supported: paragraphs, `#`–`####` headings, `-`/`*`/`1.` lists, `>` quotes,\n * fenced code, ```chart JSON blocks, pipe tables, `![alt](src)` images,\n * `**bold**`, `` `code` ``, `[text](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 type Block =\n | { type: \"p\"; text: string }\n | { type: \"h\"; level: number; text: string }\n | { type: \"list\"; ordered: boolean; items: string[] }\n | { type: \"quote\"; text: string }\n | { type: \"code\"; lang: string; text: string }\n | { type: \"table\"; head: string[]; rows: string[][] }\n | { type: \"chart\"; spec: ChartSpec }\n | { type: \"chartPending\" }\n | { type: \"img\"; images: ImageRef[] }\n | { type: \"raw\"; text: string };\n\nexport type Segment =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string }\n | { type: \"cite\"; n: number };\n\nexport type RenderAs = \"rich\" | \"markdown\" | \"text\";\n\nconst TABLE_ROW = /^\\|.*\\|$/;\nconst TABLE_RULE = /^\\|[\\s:|-]+\\|$/;\nconst IMAGE_LINE = /^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/;\nconst LIST_ITEM = /^([-*]|\\d+\\.)\\s+/;\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 lang = (newline > -1 ? part.slice(0, newline) : part).trim().toLowerCase();\n const body = (newline > -1 ? part.slice(newline + 1) : \"\").replace(/\\n$/, \"\");\n const open = index === parts.length - 1;\n if (lang === \"chart\") {\n const spec = open ? null : parseChart(body);\n blocks.push(spec ? { type: \"chart\", spec } : { type: \"chartPending\" });\n } else {\n blocks.push({ type: \"code\", lang: lang || \"code\", text: body });\n }\n return;\n }\n\n for (const chunk of part.split(/\\n{2,}/)) {\n const trimmed = chunk.trim();\n if (!trimmed) continue;\n blocks.push(...parseChunk(trimmed));\n }\n });\n\n return blocks;\n}\n\nfunction parseChunk(chunk: string): Block[] {\n const lines = chunk\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (lines.length > 1 && lines.every((line) => TABLE_ROW.test(line))) {\n const rows = lines\n .filter((line) => !TABLE_RULE.test(line))\n .map((line) =>\n line\n .replace(/^\\||\\|$/g, \"\")\n .split(\"|\")\n .map((cell) => cell.trim())\n );\n return [{ type: \"table\", head: rows[0] ?? [], rows: rows.slice(1) }];\n }\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 return [{ type: \"quote\", text: lines.map((line) => line.replace(/^>\\s?/, \"\")).join(\" \") }];\n }\n\n if (lines.every((line) => LIST_ITEM.test(line))) {\n return [\n {\n type: \"list\",\n ordered: /^\\d+\\./.test(lines[0]),\n items: lines.map((line) => line.replace(LIST_ITEM, \"\"))\n }\n ];\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 = lines.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/** 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 =\n /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)|\\s?\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/g;\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: \"code\", text: match[2] });\n else if (match[3] !== undefined) out.push({ type: \"link\", text: match[3], href: match[4] });\n else {\n const numbers = match[5].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/** 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): { head: string[]; rows: string[][] } {\n return {\n head: [\"\", ...spec.series.map((s) => s.name)],\n rows: 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 stripInline = (text: string) =>\n text\n .replace(/\\*\\*/g, \"\")\n .replace(/`/g, \"\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\");\n\n/**\n * Applies `render-as`. `rich` keeps everything; `markdown` turns charts into\n * tables and images into a line of text; `text` flattens it all to one block.\n */\nexport function adaptBlocks(blocks: Block[], renderAs: RenderAs): Block[] {\n if (renderAs === \"markdown\") {\n return blocks.flatMap((block): Block[] => {\n if (block.type === \"chart\") {\n const table = chartRows(block.spec);\n return [\n ...(block.spec.title ? [{ type: \"p\", text: `**${block.spec.title}**` } as Block] : []),\n { type: \"table\", ...table }\n ];\n }\n if (block.type === \"img\") {\n return block.images.map((image) => ({\n type: \"p\",\n text: `Image: ${image.alt || \"untitled\"}`\n }));\n }\n return [block];\n });\n }\n\n if (renderAs === \"text\") {\n const joined = blocks\n .map((block) => {\n switch (block.type) {\n case \"chart\": {\n const table = chartRows(block.spec);\n return [block.spec.title, ...[table.head, ...table.rows].map((r) => r.join(\" · \"))]\n .filter(Boolean)\n .join(\"\\n\");\n }\n case \"chartPending\":\n return \"\";\n case \"img\":\n return block.images.map((image) => `Image: ${image.alt || \"untitled\"}`).join(\"\\n\");\n case \"table\":\n return [block.head, ...block.rows]\n .map((r) => r.map(stripInline).join(\" · \"))\n .join(\"\\n\");\n case \"list\":\n return block.items.map((item) => `- ${stripInline(item)}`).join(\"\\n\");\n case \"code\":\n case \"raw\":\n return block.text;\n default:\n return stripInline(block.text);\n }\n })\n .filter(Boolean)\n .join(\"\\n\\n\");\n return joined ? [{ type: \"raw\", text: joined }] : [];\n }\n\n return blocks;\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) => (lang === \"chart\" ? \"[Chart] \" : \"[Code] \"))\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"[Image: $1]\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\")\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","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 { 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 splitFollowups,\n type Block,\n type ChartSpec,\n type RenderAs\n} from \"../utils/markdown.js\";\n\n// ── public types ───────────────────────────────────────────\n\nexport type ChatMode = \"chat\" | \"rag\" | \"rich\";\nexport type ChatEmbed = \"page\" | \"inline\" | \"launcher\";\nexport type ChatGlow = \"subtle\" | \"vivid\" | \"off\";\nexport type ChatExportFormat = \"md\" | \"txt\" | \"json\" | \"copy\";\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}\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\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 embed: ChatEmbed;\n mode: ChatMode;\n renderAs: RenderAs;\n glow: ChatGlow;\n position: \"right\" | \"left\";\n sidebar: boolean | undefined;\n showTitle: boolean;\n assistantName: string;\n logoUrl: string;\n heading: string;\n description: string;\n prompts: string | (string | ChatPrompt)[];\n bubbleText: string;\n greetingBubble: boolean;\n unreadBadge: boolean;\n allowUpload: boolean;\n allowExport: boolean;\n branding: boolean;\n followups: 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}\n\nconst CONFIG_KEYS: readonly (keyof ChatConfig)[] = [\n \"embed\",\n \"mode\",\n \"renderAs\",\n \"glow\",\n \"position\",\n \"sidebar\",\n \"showTitle\",\n \"assistantName\",\n \"logoUrl\",\n \"heading\",\n \"description\",\n \"prompts\",\n \"bubbleText\",\n \"greetingBubble\",\n \"unreadBadge\",\n \"allowUpload\",\n \"allowExport\",\n \"branding\",\n \"followups\",\n \"autoTitle\",\n \"model\",\n \"params\",\n \"systemMessage\",\n \"retrieval\",\n \"metadata\",\n \"messages\",\n \"theme\"\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/** Absent means \"decide for me\". */\nconst optionalFlagAttr = {\n fromAttribute: (value: string | null) => (value === null ? undefined : value !== \"false\"),\n toAttribute: (value: boolean | undefined) => (value === undefined ? null : String(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 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 \"Answer ONLY from the sources provided with each message, numbered in the order given. \" +\n \"Put a citation like [1] right after each claim it supports. \" +\n \"If the sources don't cover the question, say so plainly.\",\n rich:\n \"Lead with one sentence stating the key finding, with key numbers in **bold**. \" +\n 'For trends and comparisons, include a chart as a fenced code block with the language \"chart\" containing only JSON: ' +\n '{\"type\":\"bar\"|\"line\",\"title\":string,\"unit\":string,\"labels\":[string],\"series\":[{\"name\":string,\"values\":[number]}]}. ' +\n \"Use Markdown tables for exact values. Keep prose short.\"\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 rich: [\n [\"Bar chart\", \"Compare the five most spoken languages in a bar chart\"],\n [\"Line chart\", \"Show world population from 1950 to 2020\"],\n [\"Table\", \"List the planets with their diameters in a table\"],\n [\"Breakdown\", \"Break down a $4,000 monthly budget by category\"]\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 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 return {\n n,\n title: pick(s.title, s.name, s.filename, meta.title, meta.name) ?? `Source ${n}`,\n path: pick(s.path, s.url, s.key, s.source, 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\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({ type: \"csv\", data: file.content });\n else if (/\\.json$/i.test(file.name)) {\n try {\n out.push({ type: \"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({ type: \"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, 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 // ── behaviour ─────────────────────────────────────────────\n /** `chat` free-form, `rag` grounded with citations, `rich` charts and tables. */\n @property({ reflect: true }) accessor mode: ChatMode = \"chat\";\n\n /** How replies display. Copy and export always use the original text. */\n @property({ attribute: \"render-as\" }) accessor renderAs: RenderAs = \"rich\";\n\n @property({ reflect: true }) accessor glow: ChatGlow = \"subtle\";\n\n /** Ask for follow-up questions with each reply. */\n @property({ converter: flagAttr }) accessor followups = 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 /** Force the chat list open or closed. Unset, it docks when there's room. */\n @property({ converter: optionalFlagAttr }) accessor sidebar: boolean | undefined = undefined;\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 /** Suggested prompts: `|`-separated in markup, an array in JavaScript. */\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 /** 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 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\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 /** The loaded chat list. */\n get chats(): readonly ChatSummary[] {\n return this.chatList;\n }\n\n set config(value: Partial<ChatConfig>) {\n const target = this as unknown as Record<string, unknown>;\n for (const key of CONFIG_KEYS) {\n if (value && key in value) target[key] = value[key];\n }\n }\n\n get config(): Partial<ChatConfig> {\n const source = this as unknown as Record<string, unknown>;\n return Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]));\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\") && this.sidebar !== undefined) this.sidebarOpen = this.sidebar;\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 ?? this.docked;\n });\n this.observer.observe(root);\n }\n }\n\n if (this.sidebarOpen && this.listState === \"idle\" && this.resolvedClient) void this.loadChats();\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.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 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 this.threadError = this.msg.errNoClient;\n return;\n }\n\n const run = ++this.run;\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.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 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 if (this.model) payload.model = this.model;\n if (Object.keys(this.params ?? {}).length) payload.params = this.params;\n\n const names = (user.attachments ?? []).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 retrieval = [...(this.retrieval ?? []), ...toRetrieval(user.attachments ?? [])];\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 const payload = this.payloadFor(user);\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 } else if (chatId) {\n this.touchChat(chatId);\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 Object.assign(bot, {\n id: reply._id ?? null,\n content: text,\n sources: Array.isArray(reply.sources) ? reply.sources : [],\n followups: this.followups ? 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 this.failTurn(bot, notFound ? this.msg.errNotFound : this.msg.errGeneric, errorCode(error));\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: this.followups ? 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 private upsertChat(chat: ChatSummary) {\n const rest = this.chatList.filter((c) => c._id !== chat._id);\n const existing = this.chatList.find((c) => c._id === chat._id);\n this.chatList = [{ ...existing, ...chat }, ...rest];\n }\n\n private touchChat(chatId: string) {\n const existing = this.chatList.find((c) => c._id === chatId);\n if (existing) this.upsertChat({ ...existing, _modified_at: new Date().toISOString() });\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 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({ name: file.name, size: file.size, content: await file.text() });\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 || !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.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()}\n ${\n this.branding\n ? html`<div class=\"branding\" part=\"branding\">\n <a href=\"https://singlebase.cloud\" target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.brandingLabel}</a\n >\n </div>`\n : nothing\n }\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.search.trim().toLowerCase();\n const shown = this.chatList.filter(\n (chat) => !query || (chat.title ?? \"\").toLowerCase().includes(query)\n );\n const groups: [string, ChatSummary[]][] = [\n [msg.groupBookmarked, shown.filter((c) => c.bookmarked)],\n [\n msg.groupToday,\n shown.filter((c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"today\")\n ],\n [\n msg.groupYesterday,\n shown.filter(\n (c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"yesterday\"\n )\n ],\n [\n msg.groupWeek,\n shown.filter((c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"week\")\n ],\n [\n msg.groupOlder,\n shown.filter((c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"older\")\n ]\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 <button type=\"button\" class=\"new-chat\" @click=${() => this.newChat()}>\n ${I.plus()}<span>${msg.newChat}</span>\n </button>\n <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 </div>\n <div class=\"threads\">${body}</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 <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 <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 <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 </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}\n title=${hasChat ? 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.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 <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 ${\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 <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 ${\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 private promptList(): ChatPrompt[] {\n const custom = this.prompts;\n if (Array.isArray(custom) && custom.length) {\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()) {\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 === \"rich\" ? \"Rich\" : \"Chat\";\n const pick = (key: string) => msg[`${key}${mode}` as keyof SinglebaseChatMessages];\n return html`<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 <span class=\"label\">${pick(\"eyebrow\")}</span>\n <h2>${this.heading || pick(\"heading\")}</h2>\n <p>${this.description || pick(\"description\")}</p>\n </div>\n <div class=\"prompts\">\n ${this.promptList().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 </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 ${m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n <span class=\"time\">${time}</span>\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 <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 ${\n 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 <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 </div>`\n }\n </div>`;\n }\n\n private pillLabel(): string {\n if (this.mode === \"rag\") return this.msg.searching;\n if (this.mode === \"rich\") return this.msg.building;\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 ${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 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}</span><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 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}</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 <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 ${\n 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 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 <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 <span class=\"time\">${time}</span>\n ${m.stopped ? html`<span class=\"note\">${msg.stopped}</span>` : nothing}\n <span class=\"spacer\"></span>\n ${\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 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 blocks = adaptBlocks(parseMarkdown(m.content), this.renderAs);\n const maxCite = this.renderAs === \"text\" ? 0 : m.sources.length;\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 \"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>${this.renderInline(block.text, m, maxCite)}</h3>`;\n case \"list\": {\n const items = block.items.map(\n (item) => html`<li>${this.renderInline(item, m, maxCite)}</li>`\n );\n return block.ordered\n ? html`<ol>\n ${items}\n </ol>`\n : html`<ul>\n ${items}\n </ul>`;\n }\n case \"quote\":\n return html`<div class=\"quote\">${this.renderInline(block.text, m, maxCite)}</div>`;\n case \"code\": {\n const key = `${m.key}:${index}`;\n return html`<div class=\"code\">\n <div class=\"code-head\">\n <span class=\"label\">${block.lang}</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, block.text)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <pre><code>${block.text}</code></pre>\n </div>`;\n }\n case \"table\":\n return html`<div class=\"table\">\n <table>\n <thead>\n <tr>\n ${block.head.map((cell) => html`<th>${this.renderInline(cell, m, maxCite)}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${block.rows.map(\n (row) =>\n html`<tr>\n ${row.map((cell) => html`<td>${this.renderInline(cell, m, maxCite)}</td>`)}\n </tr>`\n )}\n </tbody>\n </table>\n </div>`;\n case \"chart\":\n return this.renderChart(block.spec);\n case \"chartPending\":\n return html`<div class=\"chart-pending\"><span class=\"label\">Rendering chart</span></div>`;\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 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 const source = m?.sources[this.panel.n - 1];\n if (!m || !source) return nothing;\n const msg = this.msg;\n const s = describeSource(source, this.panel.n);\n const cited = citedNumbers(m.content);\n const others = m.sources\n .map((x, i) => describeSource(x, i + 1))\n .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.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 === \"rich\"\n ? msg.placeholderRich\n : fill(msg.placeholderChat, { name: this.assistantName });\n const cantSend = !this.draft.trim();\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.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 <span class=\"footnote\">${fill(msg.footnote, { name: this.assistantName })}</span>\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","parseMarkdown","text","blocks","parts","part","index","newline","lang","body","open","spec","parseChart","chunk","trimmed","parseChunk","lines","line","rows","cell","match","heading","rest","raw","series","entry","value","labels","_","i","INLINE","parseInline","maxCite","out","last","pushText","prev","valid","n","citedNumbers","found","group","chartRows","s","label","stripInline","adaptBlocks","renderAs","block","table","image","joined","r","item","splitFollowups","content","source","followups","q","plainText","_m","provisionalTitle","max","clean","cut","space","cleanTitle","isSafeUrl","url","CONFIG_KEYS","jsonAttr","flagAttr","optionalFlagAttr","SIDEBAR_WIDTH","DOCK_SIDEBAR_AT","DOCK_PANEL_AT","MAX_FILES","MAX_FILE_SIZE","TEXT_FILE","TOAST_MS","ARRIVED_MS","CHART_COLORS","MODE_PROMPTS","FOLLOWUP_PROMPT","DEFAULT_PROMPTS","icon","cls","html","I","svg","on","down","keySeed","newKey","isNotFound","error","_a","errorCode","reducedMotion","formatNumber","unit","fileExt","name","dot","describeSource","meta","pick","values","v","score","toRetrieval","files","documents","file","dayGroup","iso","at","start","day","SinglebaseChat","LitElement","__privateAdd","_client","_messages","_theme","_mode","_renderAs","_glow","_followups","_autoTitle","_model","_params","_systemMessage","_retrieval","_metadata","_embed","_position","_sidebar","_showTitle","_chatIdAttr","_assistantName","_logoUrl","_heading","_description","_prompts","_bubbleText","_greetingBubble","_unreadBadge","_allowUpload","_allowExport","_branding","_chatList","_listState","_activeId","_chatTitle","_bookmarked","_msgs","_loadingThread","_threadError","_busy","_draft","_files","_search","_sidebarOpen","_width","_panel","_menuOpen","_editingKey","_editDraft","_editingTitle","_renamingId","_toast","_copiedKey","_retrievalOpen","_arrivedKey","_dragging","_showJump","_offline","_isOpen","_expanded","_bubble","_seen","_mobile","__publicField","__privateGet","__privateSet","getDefaultClient","target","key","_b","changed","root","width","fn","ms","id","detail","used","client","summary","chat","run","data","m","attachments","input","format","title","who","when","sources","d","a","mime","ext","anchor","fill","user","payload","names","retrieval","bot","controller","isNew","chatId","reply","notFound","message","code","total","finish","full","step","shown","resolve","question","answer","auto","previous","assistant","c","existing","ids","removed","x","current","next","apply","wasActive","snapshot","actions","toast","list","picked","accepted","formatSize","size","scroller","event","el","classes","msg","frame","panel","nothing","bubble","button","overlay","e","query","groups","active","stop","hasChat","canExpand","minimize","items","custom","p","mode","lastBot","repeat","time","f","latest","pending","done","count","cited","numbered","cards","copyText","retrievalOpen","b","seg","row","legend","k","head","peak","scale","totals","sum","others","o","refKey","reference","placeholder","cantSend","tokenDefaults","__decorateClass","property","state","customElement"],"mappings":";;;;;;;;;;;;AAOA,IAAI,OAAO,MAAQ,OAAe,sBAAsB;AACtD,MAAI;AACF,QAAI,iBAAiB;AAAA,MACnB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,cAAc;AAAA,IAAA,CACf;AAAA,EACH,QAAQ;AAAA,EAER;AAQK,MAAMA,KAAaC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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"}