@rohansguliani/mux-chat-ui 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/controller.d.ts +66 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1237 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +2 -0
- package/dist/model.d.ts +33 -0
- package/dist/mount.d.ts +56 -0
- package/dist/styles.d.ts +2 -0
- package/dist/testing.d.ts +49 -0
- package/dist/testing.js +61 -0
- package/dist/testing.js.map +1 -0
- package/dist/view/Chat.d.ts +26 -0
- package/dist/view/parts.d.ts +19 -0
- package/dist/view/primitives.d.ts +10 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["theme","animations","iconButton","spinner","collapsible","basicTool","textShimmer","toolStatusTitle","dockSurface","markdown","messagePart","sessionTurn","chat","createEffect","createSignal","onCleanup","SWAP_MS","TextShimmer","props","text","active","offset","run","setRun","timer","ReturnType","setTimeout","clearTimeout","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_$insert","_$effect","_p$","_v$","_v$2","_v$3","_v$4","e","_$setAttribute","t","a","_$setStyleProperty","o","undefined","svg","path","filled","_el$5","_tmpl$2","_el$6","_el$7","ChevronDown","ArrowUp","Stop","Plus","_tmpl$","_tmpl$2","_$setAttribute","_$setStyleProperty","Part","ReasoningPart","TextPart","ToolPart","createMemo","createSignal","Match","Show","Switch","JSX","renderMarkdown","seconds","toolActive","toolDetail","toolSubtitle","toolTitle","ChevronDown","TextShimmer","ActivityRow","props","title","subtitle","active","name","status","children","Element","open","setOpen","expandable","undefined","_el$","_tmpl$3","_el$2","firstChild","_el$3","_el$4","_el$5","_el$6","_el$7","_el$8","_el$9","nextSibling","$$click","_$insert","_$createComponent","text","when","_el$11","_tmpl$4","_el$0","_tmpl$","_el$1","_$memo","_el$10","_tmpl$2","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","_v$6","e","_$setAttribute","t","a","o","i","n","disabled","ToolRow","part","labels","Record","detail","state","slice","tool","_el$12","_tmpl$5","_el$13","ReasoningRow","live","time","end","duration","start","_el$14","_tmpl$6","_el$15","innerHTML","TextPartView","_el$16","_tmpl$7","_el$17","PartView","type","_$delegateEvents","_tmpl$","_tmpl$2","_tmpl$3","_tmpl$4","_tmpl$5","_tmpl$6","_tmpl$7","_$createComponent","_$memo","_$setAttribute","_$delegateEvents","PermissionRequest","QuestionRequest","Turn","createComputed","createEffect","createMemo","createSignal","For","on","onCleanup","Show","createChatController","ToolResult","sameIDs","visibleParts","ActivityRow","PartView","ArrowUp","ChevronDown","Plus","Stop","ResolvedOptions","url","title","subtitle","placeholder","suggestions","Array","label","prompt","toolLabels","Record","agent","sessionTitle","storageKey","preferredModel","onToolResult","result","ChatAPI","send","text","Promise","focus","newChat","TurnView","props","turn","streaming","labels","message","parts","ids","map","part","id","equals","byID","Map","live","m","role","time","completed","undefined","error","failure","name","data","userText","flatMap","type","synthetic","join","_$createComponent","when","children","fallback","_el$2","_tmpl$2","_el$3","firstChild","_el$4","_$insert","_$effect","_$setAttribute","_el$","_tmpl$","each","get","_$memo","length","active","_el$5","_tmpl$3","_p$","_v$","_v$2","e","t","QuestionDock","request","onAnswer","answers","onSkip","setAnswers","questions","set","index","value","previous","current","i","toggle","multiple","includes","filter","_el$6","_tmpl$4","_el$7","_el$8","_el$9","nextSibling","question","_el$0","_tmpl$7","_el$10","_el$11","header","_el$1","_tmpl$5","options","option","_el$13","_tmpl$9","_el$14","$$click","description","_el$15","_tmpl$8","_v$3","_v$4","custom","_el$12","_tmpl$6","$$input","event","currentTarget","trim","disabled","every","answer","PermissionDock","onReply","response","patterns","Boolean","replied","setReplied","reply","_el$16","_tmpl$1","_el$17","_el$18","_el$19","_el$21","_el$20","_el$23","_el$24","_el$25","_el$26","permission","_el$22","_tmpl$0","_v$5","_v$6","_v$7","a","Chat","api","chat","timeline","HTMLDivElement","input","HTMLTextAreaElement","draft","setDraft","grow","style","height","Math","min","scrollHeight","clear","restore","sendText","submit","ready","waiting","resolve","sent","queue","sendFromHost","push","flush","batch","then","working","lastTurn","messageIDs","awaitingReply","pinned","nearBottom","scrollTop","clientHeight","changes","defer","older","_el$27","_tmpl$17","_el$28","_el$29","_el$30","_el$32","_el$33","_el$34","_el$35","_el$40","_el$42","_el$46","_el$47","_el$48","_el$49","_el$50","_el$51","_el$52","_el$53","_el$54","_el$55","_el$56","_el$57","_el$58","_el$59","_el$31","_tmpl$10","status","addEventListener","_ref$","_$use","_el$36","_tmpl$13","_el$37","_el$38","_tmpl$11","_el$39","_tmpl$12","suggestion","_el$60","_tmpl$18","_el$41","_tmpl$14","permissions","keyed","replyPermission","reject","unconfirmed","_el$43","_tmpl$16","_el$44","_el$45","_tmpl$15","retry","$$keydown","key","shiftKey","isComposing","preventDefault","_ref$2","selectModel","modelGroups","group","_el$61","_tmpl$19","models","model","_el$62","_tmpl$20","selected","modelValue","abort","_v$8","sessionID","_v$9","tone","_v$0","_v$1","_v$10","_v$11","_v$12","_v$13","_v$14","_v$15","o","n","s","h","r","d","_$delegateEvents","_tmpl$","_$createComponent","_$setAttribute","_$memo","_$use","_$delegateEvents","onCleanup","onMount","JSX","render","ToolResult","styles","Chat","ChatAPI","MuxChatOptions","url","title","subtitle","placeholder","suggestions","Array","label","prompt","toolLabels","Record","preferredModel","onToolResult","result","theme","storageKey","agent","sessionTitle","MuxChatHandle","send","text","Promise","focus","newChat","dispose","mountMuxChat","host","HTMLElement","options","root","shadowRoot","attachShadow","mode","replaceChildren","style","document","createElement","textContent","container","height","append","setAttribute","removeAttribute","api","_$createComponent","value","resolve","MuxChat","props","id","class","CSSProperties","ref","handle","HTMLDivElement","_el$","_tmpl$","_ref$","_$use","_$effect","_p$","_v$","_v$2","_v$3","e","_$setAttribute","t","_$className","a","_$style","undefined","_$createComponent","_$use","_$setAttribute","_$className","_$style"],"sources":["../src/styles/mux/animations.css?inline","../src/styles/mux/basic-tool.css?inline","../src/styles/mux/collapsible.css?inline","../src/styles/mux/dock-surface.css?inline","../src/styles/mux/icon-button.css?inline","../src/styles/mux/markdown.css?inline","../src/styles/mux/message-part.css?inline","../src/styles/mux/session-turn.css?inline","../src/styles/mux/spinner.css?inline","../src/styles/mux/text-shimmer.css?inline","../src/styles/mux/theme.css?inline","../src/styles/mux/tool-status-title.css?inline","../src/styles/chat.css?inline","../src/styles.ts","../src/model.ts","../src/controller.ts","../src/markdown.ts","../src/view/primitives.tsx","../src/view/parts.tsx","../src/view/Chat.tsx","../src/mount.tsx"],"sourcesContent":["/* Synced from Mux frontend/src/ui/styles/animations.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n:host {\n --animate-pulse: pulse-opacity 2s ease-in-out infinite;\n --animate-pulse-scale: pulse-scale 1.2s ease-in-out infinite;\n}\n\n@keyframes pulse-opacity {\n 0%,\n 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes pulse-scale {\n 0%,\n 100% {\n transform: scale(1);\n }\n 50% {\n transform: scale(0.6666667);\n }\n}\n\n@keyframes pulse-opacity-dim {\n 0%,\n 100% {\n opacity: 0.15;\n }\n 50% {\n opacity: 0.35;\n }\n}\n\n@keyframes fadeUp {\n from {\n opacity: 0;\n transform: translateY(5px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.fade-up-text {\n animation: fadeUp 0.4s ease-out forwards;\n opacity: 0;\n\n &:nth-child(1) {\n animation-delay: 0.1s;\n }\n &:nth-child(2) {\n animation-delay: 0.2s;\n }\n &:nth-child(3) {\n animation-delay: 0.3s;\n }\n &:nth-child(4) {\n animation-delay: 0.4s;\n }\n &:nth-child(5) {\n animation-delay: 0.5s;\n }\n &:nth-child(6) {\n animation-delay: 0.6s;\n }\n &:nth-child(7) {\n animation-delay: 0.7s;\n }\n &:nth-child(8) {\n animation-delay: 0.8s;\n }\n &:nth-child(9) {\n animation-delay: 0.9s;\n }\n &:nth-child(10) {\n animation-delay: 1s;\n }\n &:nth-child(11) {\n animation-delay: 1.1s;\n }\n &:nth-child(12) {\n animation-delay: 1.2s;\n }\n &:nth-child(13) {\n animation-delay: 1.3s;\n }\n &:nth-child(14) {\n animation-delay: 1.4s;\n }\n &:nth-child(15) {\n animation-delay: 1.5s;\n }\n &:nth-child(16) {\n animation-delay: 1.6s;\n }\n &:nth-child(17) {\n animation-delay: 1.7s;\n }\n &:nth-child(18) {\n animation-delay: 1.8s;\n }\n &:nth-child(19) {\n animation-delay: 1.9s;\n }\n &:nth-child(20) {\n animation-delay: 2s;\n }\n &:nth-child(21) {\n animation-delay: 2.1s;\n }\n &:nth-child(22) {\n animation-delay: 2.2s;\n }\n &:nth-child(23) {\n animation-delay: 2.3s;\n }\n &:nth-child(24) {\n animation-delay: 2.4s;\n }\n &:nth-child(25) {\n animation-delay: 2.5s;\n }\n &:nth-child(26) {\n animation-delay: 2.6s;\n }\n &:nth-child(27) {\n animation-delay: 2.7s;\n }\n &:nth-child(28) {\n animation-delay: 2.8s;\n }\n &:nth-child(29) {\n animation-delay: 2.9s;\n }\n &:nth-child(30) {\n animation-delay: 3s;\n }\n}\n","/* Synced from Mux frontend/src/ui/components/basic-tool.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n/* [data-component=\"tool-trigger\"] {\n content-visibility: auto;\n} */\n[data-component=\"tool-trigger\"][data-layout=\"activity-row\"] {\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n display: grid;\n grid-template-columns: var(--activity-label-width) minmax(0, auto) auto auto;\n column-gap: 8px;\n align-items: baseline;\n justify-content: start;\n\n [data-slot=\"basic-tool-tool-trigger-content\"],\n [data-slot=\"basic-tool-tool-info\"],\n [data-slot=\"basic-tool-tool-info-structured\"],\n [data-slot=\"basic-tool-tool-info-main\"] {\n display: contents;\n }\n\n [data-slot=\"basic-tool-tool-title\"] {\n grid-column: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n [data-slot=\"basic-tool-tool-detail\"] {\n grid-column: 2;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n }\n\n [data-slot=\"basic-tool-tool-action\"],\n [data-component=\"tool-action\"] {\n grid-column: 3;\n }\n\n > [data-slot=\"collapsible-arrow\"] {\n grid-column: 3;\n align-self: center;\n }\n\n &:has([data-slot=\"basic-tool-tool-action\"], [data-component=\"tool-action\"])\n > [data-slot=\"collapsible-arrow\"] {\n grid-column: 4;\n }\n\n [data-slot=\"basic-tool-tool-indicator\"] {\n width: 16px;\n height: 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n [data-component=\"spinner\"] {\n width: 16px;\n height: 16px;\n }\n }\n\n [data-slot=\"basic-tool-tool-spinner\"] {\n width: 16px;\n height: 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--text-weak);\n\n [data-component=\"spinner\"] {\n width: 16px;\n height: 16px;\n }\n }\n\n [data-slot=\"icon-svg\"] {\n flex-shrink: 0;\n }\n\n [data-slot=\"basic-tool-tool-info\"] {\n display: contents;\n font-size: var(--font-size-base);\n }\n\n [data-slot=\"basic-tool-tool-info-structured\"],\n [data-slot=\"basic-tool-tool-info-main\"] {\n display: contents;\n }\n\n [data-slot=\"basic-tool-tool-title\"] {\n flex-shrink: 0;\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n font-style: normal;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n color: var(--text-strong);\n\n &.capitalize {\n text-transform: capitalize;\n }\n\n &.agent-title {\n color: var(--text-strong);\n font-weight: var(--font-weight-medium);\n }\n }\n\n [data-slot=\"basic-tool-tool-detail\"] {\n display: block;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: ltr;\n unicode-bidi: isolate;\n\n > :not(:first-child) {\n margin-left: 8px;\n }\n }\n\n [data-slot=\"basic-tool-tool-subtitle\"] {\n min-width: 0;\n font-family: var(--font-family-sans);\n font-variant-numeric: tabular-nums;\n font-size: var(--font-size-base);\n font-style: normal;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n color: var(--text-base);\n\n &.webfetch-url {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--font-size-small);\n }\n\n &.clickable {\n cursor: pointer;\n text-decoration: underline;\n transition: color 0.15s ease;\n\n &:hover {\n color: var(--text-base);\n }\n }\n }\n\n [data-slot=\"basic-tool-tool-arg\"] {\n flex-shrink: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-family-sans);\n font-variant-numeric: tabular-nums;\n font-size: var(--font-size-base);\n font-style: normal;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n color: var(--text-base);\n }\n\n [data-slot=\"basic-tool-tool-action\"] {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n}\n\n/* Consecutive tool rows sit flush; a delegation card needs its own breathing room.\n Cards stop short of the full prose width so two short lines are not boxed\n inside a mostly empty frame. */\n[data-component=\"task-supervision\"] {\n width: 100%;\n max-width: 40rem;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-block: 4px;\n}\n\n[data-component=\"task-tool-card\"] {\n width: 100%;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n border-radius: 6px;\n border: 1px solid var(--border-weak-base, rgba(255, 255, 255, 0.08));\n background: color-mix(in srgb, var(--background-base) 92%, transparent);\n transition:\n border-color 0.15s ease,\n background-color 0.15s ease,\n color 0.15s ease;\n\n [data-slot=\"task-tool-body\"] {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: inherit;\n color: inherit;\n text-decoration: none;\n }\n\n a[data-slot=\"task-tool-body\"] {\n cursor: pointer;\n }\n\n [data-slot=\"task-tool-info\"] {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n [data-slot=\"task-tool-heading\"] {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n }\n\n [data-slot=\"task-tool-description\"] {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--text-strong);\n font-weight: var(--font-weight-regular);\n }\n\n [data-slot=\"task-tool-meta\"] {\n min-width: 0;\n display: flex;\n align-items: baseline;\n white-space: nowrap;\n font-family: var(--font-family-sans);\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n color: var(--text-weak);\n\n > * {\n flex-shrink: 0;\n }\n\n > * + *::before {\n content: \"·\";\n margin-inline: 6px;\n color: var(--text-weaker);\n }\n\n /* The model label is last and gives way on narrow layouts. */\n > :last-child:not(:first-child) {\n flex-shrink: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n [data-slot=\"task-tool-state\"]:is([data-state=\"pending\"], [data-state=\"queued\"], [data-state=\"running\"]) {\n color: var(--text-interactive-base);\n }\n\n [data-slot=\"task-tool-state\"][data-state=\"error\"] {\n color: var(--text-danger-base);\n }\n\n [data-component=\"task-tool-spinner\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n\n [data-component=\"spinner\"] {\n width: 16px;\n height: 16px;\n }\n }\n\n [data-component=\"task-tool-action\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--icon-weak);\n opacity: 0;\n transition:\n opacity 0.15s ease,\n color 0.15s ease;\n }\n\n [data-component=\"task-tool-title\"] {\n flex-shrink: 0;\n font-weight: var(--font-weight-medium);\n text-transform: capitalize;\n }\n\n > [data-component=\"button\"] {\n flex-shrink: 0;\n margin-inline-end: 8px;\n }\n\n &:hover,\n &:focus-within {\n background: color-mix(in srgb, var(--background-stronger) 88%, transparent);\n\n [data-component=\"task-tool-action\"] {\n opacity: 1;\n }\n }\n\n @media (hover: none) {\n [data-component=\"task-tool-action\"] {\n opacity: 1;\n }\n }\n}\n\n[data-component=\"task-supervision\"] > [data-slot=\"task-tool-failure\"] {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n overflow: hidden;\n padding-inline: 12px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n color: var(--text-base);\n}\n\n[data-component=\"task-supervision\"] > [data-slot=\"task-tool-status-error\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding-inline: 12px;\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n color: var(--text-weak);\n}\n","/* Synced from Mux frontend/src/ui/components/collapsible.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-slot=\"collapsible-collapse\"] {\n min-height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n [data-component=\"icon-button\"] {\n width: 28px;\n height: 28px;\n\n [data-slot=\"icon-svg\"] {\n transform: rotate(180deg);\n }\n }\n}\n\n[data-component=\"collapsible\"] {\n width: 100%;\n display: flex;\n flex-direction: column;\n background-color: transparent;\n border: none;\n transition: background-color 0.15s ease;\n border-radius: var(--radius-md);\n overflow: visible;\n\n &.tool-collapsible {\n gap: 8px;\n }\n\n [data-slot=\"collapsible-trigger\"]:has(\n > [data-layout=\"activity-row\"]\n ) {\n min-height: 28px;\n height: auto;\n }\n\n [data-slot=\"collapsible-trigger\"] {\n width: 100%;\n display: flex;\n height: 32px;\n padding: 0;\n align-items: center;\n align-self: stretch;\n cursor: default;\n user-select: none;\n color: var(--text-base);\n /* Triggers render as <button>, which still defaults to centered text. */\n text-align: start;\n\n [data-slot=\"collapsible-arrow\"] {\n opacity: 0;\n transition: opacity 0.15s ease;\n will-change: opacity;\n transform: translateZ(0);\n }\n\n [data-slot=\"collapsible-arrow-icon\"] {\n display: inline-flex;\n color: var(--icon-weaker);\n transform: translateZ(0) rotate(-90deg);\n transition: transform 0.15s ease;\n will-change: transform;\n }\n\n &:hover [data-slot=\"collapsible-arrow\"] {\n opacity: 1;\n }\n\n /* text-12-medium */\n font-family: var(--font-family-sans);\n font-size: var(--font-size-small);\n font-style: normal;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large); /* 166.667% */\n letter-spacing: var(--letter-spacing-normal);\n\n /* &:hover { */\n /* background-color: var(--surface-base); */\n /* } */\n &:focus-visible {\n outline: none;\n background-color: var(--surface-raised-base-hover);\n }\n &[data-disabled] {\n cursor: not-allowed;\n }\n\n [data-slot=\"collapsible-arrow\"] {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &[data-size=\"compact\"] {\n width: 16px;\n height: 16px;\n }\n }\n }\n\n [data-slot=\"collapsible-trigger\"][aria-expanded=\"true\"] {\n [data-slot=\"collapsible-arrow\"] {\n opacity: 1;\n }\n\n [data-slot=\"collapsible-arrow-icon\"] {\n transform: translateZ(0) rotate(0deg);\n }\n }\n\n [data-slot=\"collapsible-content\"] {\n overflow: hidden;\n\n &[data-expanded] {\n overflow: visible;\n }\n }\n\n &[data-variant=\"ghost\"] {\n background-color: transparent;\n border: none;\n\n > [data-slot=\"collapsible-trigger\"] {\n background-color: transparent;\n border: none;\n padding: 0;\n\n /* &:hover { */\n /* color: var(--text-strong); */\n /* } */\n &:focus-visible {\n outline: none;\n background-color: var(--surface-raised-base-hover);\n }\n &[data-disabled] {\n cursor: not-allowed;\n }\n }\n }\n\n &[data-variant=\"ghost\"][data-scope=\"filetree\"] {\n > [data-slot=\"collapsible-trigger\"] {\n height: 24px;\n }\n }\n}\n","/* Synced from Mux frontend/src/ui/components/dock-surface.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-dock-surface=\"shell\"] {\n background-color: var(--surface-raised-stronger-non-alpha);\n box-shadow: var(--shadow-xs-border);\n position: relative;\n z-index: 10;\n border-radius: 12px;\n overflow: clip;\n}\n\n[data-dock-surface=\"tray\"] {\n background-color: var(--background-base);\n border: 1px solid var(--border-weak-base);\n position: relative;\n z-index: 0;\n border-radius: 12px;\n overflow: clip;\n}\n\n[data-dock-surface=\"tray\"][data-dock-attach=\"top\"] {\n margin-top: -0.875rem;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n","/* Synced from Mux frontend/src/ui/components/icon-button.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-component=\"icon-button\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-sm);\n text-decoration: none;\n user-select: none;\n aspect-ratio: 1;\n flex-shrink: 0;\n\n &[data-variant=\"primary\"] {\n background-color: var(--icon-strong-base);\n\n [data-slot=\"icon-svg\"] {\n /* color: var(--icon-weak-base); */\n color: var(--icon-invert-base);\n\n /* &:hover:not(:disabled) { */\n /* color: var(--icon-weak-hover); */\n /* } */\n /* &:active:not(:disabled) { */\n /* color: var(--icon-strong-active); */\n /* } */\n }\n\n @media (hover: hover) {\n &:hover:not(:disabled) {\n background-color: var(--icon-strong-hover);\n }\n }\n &:focus:not(:disabled) {\n background-color: var(--icon-strong-focus);\n }\n &:active:not(:disabled) {\n background-color: var(--icon-strong-active);\n }\n &:disabled {\n background-color: var(--icon-strong-disabled);\n\n [data-slot=\"icon-svg\"] {\n color: var(--icon-invert-base);\n }\n }\n }\n\n &[data-variant=\"secondary\"] {\n border: transparent;\n background-color: var(--button-secondary-base);\n color: var(--text-strong);\n box-shadow: var(--shadow-xs-border-base);\n\n @media (hover: hover) {\n &:hover:not(:disabled) {\n background-color: var(--button-secondary-hover);\n }\n }\n &:focus:not(:disabled) {\n background-color: var(--button-secondary-base);\n }\n &:focus-visible:not(:active) {\n background-color: var(--button-secondary-base);\n box-shadow: var(--shadow-xs-border-focus);\n }\n &:focus-visible:active {\n box-shadow: none;\n }\n &:active:not(:disabled) {\n background-color: var(--button-secondary-base);\n }\n\n [data-slot=\"icon-svg\"] {\n color: var(--icon-strong-base);\n }\n\n &:disabled {\n background-color: var(--icon-strong-disabled);\n color: var(--icon-invert-base);\n cursor: not-allowed;\n }\n }\n\n &[data-variant=\"ghost\"] {\n background-color: transparent;\n /* color: var(--icon-base); */\n\n [data-slot=\"icon-svg\"] {\n color: var(--icon-base);\n }\n\n @media (hover: hover) {\n &:hover:not(:disabled) {\n background-color: var(--surface-base-hover);\n\n /* [data-slot=\"icon-svg\"] { */\n /* color: var(--icon-hover); */\n /* } */\n }\n }\n &:focus-visible:not(:disabled) {\n background-color: var(--surface-base-hover);\n }\n &:active:not(:disabled) {\n background-color: var(--surface-base-active);\n /* [data-slot=\"icon-svg\"] { */\n /* color: var(--icon-active); */\n /* } */\n }\n &:selected:not(:disabled) {\n background-color: var(--surface-base-active);\n /* [data-slot=\"icon-svg\"] { */\n /* color: var(--icon-selected); */\n /* } */\n }\n &:disabled {\n color: var(--icon-invert-base);\n cursor: not-allowed;\n }\n }\n\n &[data-size=\"normal\"] {\n width: 24px;\n height: 24px;\n\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n gap: calc(var(--spacing) * 0.5);\n }\n\n &[data-size=\"small\"] {\n width: 20px;\n height: 20px;\n }\n\n &[data-size=\"large\"] {\n height: 32px;\n /* padding: 0 8px 0 6px; */\n gap: 8px;\n\n /* text-12-medium */\n font-family: var(--font-family-sans);\n font-size: var(--font-size-small);\n font-style: normal;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large); /* 166.667% */\n letter-spacing: var(--letter-spacing-normal);\n }\n\n &:focus {\n outline: none;\n }\n}\n\n@media (prefers-reduced-motion: no-preference) {\n [data-component=\"icon-button\"][data-icon=\"stop\"] [data-slot=\"icon-svg\"] rect {\n transform-origin: center;\n transform-box: fill-box;\n animation: stop-pulse 1.8s ease-in-out infinite;\n }\n}\n\n@keyframes stop-pulse {\n 0%,\n 100% {\n transform: scale(0.95);\n }\n 50% {\n transform: scale(1.12);\n }\n}\n\n[data-component=\"icon-button\"].titlebar-icon {\n width: 32px;\n height: 24px;\n aspect-ratio: auto;\n}\n\n[data-component=\"icon-button\"].titlebar-icon[data-variant=\"ghost\"][aria-expanded=\"true\"] {\n background-color: var(--surface-raised-base-active);\n}\n\n[data-component=\"icon-button\"].titlebar-icon[data-variant=\"ghost\"][aria-expanded=\"true\"] [data-slot=\"icon-svg\"] {\n color: var(--icon-strong-base);\n}\n\n@media (hover: hover) {\n [data-component=\"icon-button\"].titlebar-icon[data-variant=\"ghost\"][aria-expanded=\"true\"]:hover:not(:disabled) {\n background-color: var(--surface-raised-base-active);\n }\n}\n","/* Synced from Mux frontend/src/ui/components/markdown.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-component=\"markdown\"] {\n /* Reset & Base Typography */\n min-width: 0;\n max-width: 100%;\n overflow-wrap: break-word;\n color: var(--text-strong);\n font-family: var(--font-family-sans);\n font-size: var(--markdown-font-size, var(--font-size-base));\n line-height: 160%;\n /* Contain outer margins, but let margins collapse across streaming wrappers. */\n display: flow-root;\n\n /* Spacing for flow */\n > *:first-child,\n > [data-markdown-block]:first-child > *:first-child {\n margin-top: 0;\n }\n > *:last-child,\n > [data-markdown-block]:last-child > *:last-child {\n margin-bottom: 0;\n }\n\n /* Headings: Same size, distinguished by color and spacing */\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: var(--markdown-font-size, var(--font-size-base));\n color: var(--text-strong);\n font-weight: var(--font-weight-medium);\n margin-top: 1.5rem;\n margin-bottom: 0.5rem;\n line-height: var(--line-height-large);\n }\n\n /* Emphasis & Strong: Neutral strong color */\n strong,\n b {\n color: var(--text-strong);\n font-weight: var(--font-weight-medium);\n }\n\n /* Paragraphs */\n p {\n margin-bottom: 0.75rem;\n }\n\n /* Links */\n a {\n color: var(--text-interactive-base);\n text-decoration: none;\n font-weight: inherit;\n }\n\n a:hover {\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n\n /* Lists */\n ul,\n ol {\n margin-top: 0.5rem;\n margin-bottom: 0.75rem;\n margin-left: 0;\n padding-left: 1.5rem;\n list-style-position: outside;\n }\n\n ul {\n list-style-type: disc;\n }\n\n ol {\n list-style-type: decimal;\n padding-left: 2.25rem;\n }\n\n li {\n margin-bottom: 0.5rem;\n }\n\n li > p:first-child {\n display: inline;\n margin: 0;\n }\n\n li > p + p {\n display: block;\n margin-top: 0.5rem;\n }\n\n li::marker {\n color: var(--text-weak);\n }\n\n /* Nested lists spacing */\n li > ul,\n li > ol {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n padding-left: 1rem; /* Minimal indent for nesting only */\n }\n\n li > ol {\n padding-left: 1.75rem;\n }\n\n /* Blockquotes */\n blockquote {\n border-left: 2px solid var(--border-weak-base);\n margin: 1rem 0;\n padding-left: 0.5rem;\n color: var(--text-weak);\n font-style: normal;\n }\n\n /* Horizontal Rule - Invisible spacing only */\n hr {\n border: none;\n height: 0;\n margin: 2rem 0;\n }\n\n .shiki,\n .markdown-code-pending {\n font-size: var(--markdown-font-size, 13px);\n line-height: 1.5;\n padding: 8px 12px;\n border-radius: 6px;\n border: 0.5px solid var(--border-weak-base);\n background: var(--surface-raised-base);\n }\n\n .markdown-code-pending code {\n font-family: var(--font-family-mono);\n font-feature-settings: var(--font-family-mono--font-feature-settings);\n }\n\n [data-component=\"markdown-code\"] {\n position: relative;\n\n [data-slot=\"markdown-copy-button\"] {\n position: absolute;\n right: 4px;\n z-index: 10;\n\n &[data-position=\"top\"] {\n top: 4px;\n }\n\n &[data-position=\"bottom\"] {\n bottom: 4px;\n }\n }\n }\n\n [data-slot=\"markdown-copy-button\"] {\n opacity: 0;\n transition: opacity 0.15s ease;\n\n &::after {\n content: attr(data-tooltip);\n position: absolute;\n left: 50%;\n bottom: calc(100% + 4px);\n transform: translateX(-50%);\n z-index: 1000;\n\n max-width: 320px;\n border-radius: var(--radius-sm);\n background: var(--surface-float-base);\n color: var(--text-invert-strong);\n padding: 2px 8px;\n border: 1px solid var(--border-weak-base, rgba(0, 0, 0, 0.07));\n box-shadow: var(--shadow-md);\n\n pointer-events: none;\n white-space: nowrap;\n\n font-family: var(--font-family-sans);\n font-size: var(--font-size-small);\n font-style: normal;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n }\n\n [data-slot=\"markdown-copy-button\"]:hover::after,\n [data-slot=\"markdown-copy-button\"]:focus-visible::after {\n opacity: 1;\n }\n\n [data-slot=\"markdown-copy-button\"][data-variant=\"secondary\"] {\n box-shadow: none;\n border: 1px solid var(--border-weak-base);\n }\n\n [data-slot=\"markdown-copy-button\"][data-variant=\"secondary\"] [data-slot=\"icon-svg\"] {\n color: var(--icon-base);\n }\n\n [data-component=\"markdown-code\"]:hover [data-slot=\"markdown-copy-button\"],\n [data-component=\"file-viewer\"]:hover [data-slot=\"markdown-copy-button\"] {\n opacity: 1;\n }\n\n [data-slot=\"markdown-copy-button\"] [data-slot=\"check-icon\"] {\n display: none;\n }\n\n [data-slot=\"markdown-copy-button\"][data-copied=\"true\"] [data-slot=\"copy-icon\"] {\n display: none;\n }\n\n [data-slot=\"markdown-copy-button\"][data-copied=\"true\"] [data-slot=\"check-icon\"] {\n display: inline-flex;\n }\n\n pre {\n margin-top: 0.75rem;\n margin-bottom: 1.5rem;\n overflow: auto;\n\n &[data-wrap=\"true\"] {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n overflow-x: hidden;\n }\n\n &[data-wrap=\"true\"] code,\n &[data-wrap=\"true\"] .line {\n white-space: inherit;\n }\n\n scrollbar-width: none;\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n :not(pre) > code {\n font-family: var(--font-family-mono);\n font-feature-settings: var(--font-family-mono--font-feature-settings);\n color: var(--syntax-string);\n font-weight: var(--font-weight-medium);\n /* font-size: 13px; */\n\n /* padding: 2px 2px; */\n /* margin: 0 1.5px; */\n /* border-radius: 2px; */\n /* background: var(--surface-base); */\n /* box-shadow: 0 0 0 0.5px var(--border-weak-base); */\n }\n\n /* Tables */\n table {\n width: 100%;\n border-collapse: collapse;\n margin: 1.5rem 0;\n font-size: var(--markdown-font-size, var(--font-size-base));\n display: block;\n overflow-x: auto;\n }\n\n th,\n td {\n /* Minimal borders for structure, matching TUI \"lines\" roughly but keeping it web-clean */\n border-bottom: 1px solid var(--border-weaker-base);\n padding: 0.75rem 0.5rem;\n text-align: left;\n vertical-align: top;\n }\n\n th {\n color: var(--text-strong);\n font-weight: var(--font-weight-medium);\n border-bottom: 1px solid var(--border-weak-base);\n }\n\n /* Images */\n img {\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n margin: 1.5rem 0;\n display: block;\n }\n\n [data-component=\"mermaid\"] {\n margin: 2rem 0;\n overflow: auto;\n border: 0.5px solid var(--border-weak-base);\n border-radius: 6px;\n background: var(--surface-raised-base);\n padding: 16px;\n\n svg {\n display: block;\n width: 100%;\n min-width: 320px;\n height: auto;\n margin: 0 auto;\n }\n }\n\n pre[data-mermaid-status=\"error\"]::after {\n content: attr(data-mermaid-error);\n display: block;\n margin-top: 8px;\n color: var(--text-weak);\n font-family: var(--font-family-sans);\n font-size: 12px;\n white-space: normal;\n }\n}\n\n[data-component=\"markdown\"] a.external-link:hover > code {\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n","/* Synced from Mux frontend/src/pages/session/transcript/renderers/message-part.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n/* [data-component=\"assistant-message\"] {\n content-visibility: auto;\n} */\n[data-component=\"assistant-message\"] {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n\n [data-slot=\"assistant-message-actions\"] {\n min-height: 24px;\n display: flex;\n align-items: center;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease;\n will-change: opacity;\n }\n\n &:hover [data-slot=\"assistant-message-actions\"],\n &:focus-within [data-slot=\"assistant-message-actions\"] {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n[data-component=\"user-message\"] {\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n font-style: normal;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n color: var(--text-strong);\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n align-self: stretch;\n width: 100%;\n max-width: 100%;\n gap: 0;\n\n [data-slot=\"user-message-attachments\"] {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 8px;\n width: fit-content;\n max-width: min(82%, 64ch);\n margin-left: auto;\n }\n\n [data-slot=\"user-message-attachment\"] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-width: 0;\n border-radius: 6px;\n overflow: hidden;\n background: var(--surface-weak);\n border: 1px solid var(--border-weak-base);\n cursor: default;\n transition:\n border-color 0.15s ease,\n opacity 0.3s ease;\n\n &:hover {\n border-color: var(--border-strong-base);\n }\n\n &[data-clickable] {\n cursor: pointer;\n }\n\n &[data-type=\"image\"] {\n width: 48px;\n height: 48px;\n }\n\n &[data-type=\"file\"] {\n width: min(220px, 100%);\n height: 48px;\n padding: 0 10px;\n }\n }\n\n [data-slot=\"user-message-attachment-image\"] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n [data-slot=\"user-message-attachment-file\"] {\n width: 100%;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n\n [data-component=\"file-icon\"] {\n width: 20px;\n height: 20px;\n flex: none;\n }\n }\n\n [data-slot=\"user-message-attachment-name\"] {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--text-base);\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n }\n\n [data-slot=\"user-message-body\"] {\n width: fit-content;\n max-width: min(82%, 64ch);\n margin-left: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n [data-slot=\"user-message-attachments\"] + [data-slot=\"user-message-body\"] {\n margin-top: 8px;\n }\n\n [data-slot=\"user-message-text\"] {\n display: inline-block;\n white-space: pre-wrap;\n word-break: break-word;\n overflow: hidden;\n background: color-mix(in srgb, var(--surface-weak) 65%, transparent);\n border: 1px solid transparent;\n padding: 8px 12px;\n border-radius: 12px;\n\n [data-highlight=\"file\"] {\n color: var(--syntax-property);\n }\n\n [data-highlight=\"agent\"] {\n color: var(--syntax-type);\n }\n\n max-width: 100%;\n }\n\n [data-slot=\"user-message-copy-wrapper\"] {\n min-height: 24px;\n margin-top: 4px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n width: 100%;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease;\n will-change: opacity;\n\n [data-component=\"tooltip-trigger\"] {\n display: inline-flex;\n width: fit-content;\n }\n }\n\n [data-slot=\"user-message-meta\"] {\n user-select: none;\n text-align: right;\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n [data-slot=\"user-message-meta-wrap\"] {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n overflow: hidden;\n gap: 0;\n }\n\n [data-slot=\"user-message-meta-tail\"] {\n user-select: none;\n flex: 0 0 auto;\n white-space: nowrap;\n text-align: right;\n }\n\n &:hover [data-slot=\"user-message-copy-wrapper\"],\n &:focus-within [data-slot=\"user-message-copy-wrapper\"] {\n opacity: 1;\n pointer-events: auto;\n }\n\n .text-text-strong {\n color: var(--text-strong);\n }\n\n .font-medium {\n font-weight: var(--font-weight-medium);\n }\n}\n\n[data-component=\"text-part\"] {\n width: 100%;\n margin-top: 24px;\n container-type: inline-size;\n container-name: text-part;\n\n [data-slot=\"text-part-body\"] {\n margin-top: 0;\n }\n\n [data-slot=\"text-part-copy-wrapper\"] {\n display: none;\n min-height: 24px;\n margin-top: 4px;\n align-items: center;\n justify-content: flex-start;\n gap: 10px;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease;\n will-change: opacity;\n\n &[data-active] {\n display: flex;\n }\n\n [data-component=\"tooltip-trigger\"] {\n display: inline-flex;\n width: fit-content;\n }\n }\n\n [data-slot=\"text-part-meta\"] {\n flex: 0 0 auto;\n white-space: nowrap;\n user-select: none;\n\n > span {\n flex: 0 0 auto;\n }\n }\n\n [data-slot=\"text-part-copy-wrapper\"][data-interrupted] {\n width: 100%;\n justify-content: flex-end;\n gap: 12px;\n }\n\n &:hover [data-slot=\"text-part-copy-wrapper\"],\n &:focus-within [data-slot=\"text-part-copy-wrapper\"] {\n opacity: 1;\n pointer-events: auto;\n }\n\n [data-component=\"markdown\"] {\n margin-top: 0;\n }\n}\n\n@container text-part (max-width: 44rem) {\n [data-slot=\"text-part-copy-wrapper\"] {\n gap: 8px;\n }\n\n [data-slot=\"text-part-meta\"] {\n gap: 4px;\n font-size: calc(var(--font-size-base) * 11 / 14);\n }\n}\n\n@container text-part (max-width: 32rem) {\n [data-slot=\"text-part-copy-wrapper\"] {\n gap: 6px;\n }\n\n [data-slot=\"text-part-meta\"] {\n gap: 3px;\n font-size: calc(var(--font-size-base) * 10 / 14);\n }\n}\n\n[data-component=\"compaction-part\"] {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n\n [data-slot=\"compaction-part-divider\"] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n width: 100%;\n }\n\n [data-slot=\"compaction-part-line\"] {\n flex: 1 1 auto;\n height: 1px;\n background: var(--border-weak-base);\n }\n\n [data-slot=\"compaction-part-label\"] {\n flex: 0 0 auto;\n white-space: nowrap;\n text-align: center;\n }\n\n [data-slot=\"compaction-part-toggle\"] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: 24px;\n padding: 0 6px;\n border-radius: var(--radius-md);\n color: inherit;\n cursor: pointer;\n user-select: none;\n\n &:hover,\n &:focus-visible {\n outline: none;\n background-color: var(--surface-raised-base-hover);\n color: var(--text-base);\n }\n }\n\n [data-slot=\"compaction-part-summary\"] {\n padding: 4px 0 8px;\n color: var(--text-weak);\n }\n}\n\n[data-component=\"reasoning-part\"] {\n width: 100%;\n color: var(--text-base);\n line-height: var(--line-height-normal);\n\n [data-component=\"markdown\"] {\n margin-top: 24px;\n font-style: normal;\n color: var(--text-weak);\n\n strong,\n b {\n color: var(--text-weak);\n }\n\n p:has(strong) {\n margin-top: 24px;\n margin-bottom: 0;\n\n &:first-child {\n margin-top: 0;\n }\n }\n }\n}\n\n@media (prefers-color-scheme: dark) {\n [data-component=\"reasoning-part\"]\n [data-component=\"markdown\"]\n :not(pre)\n > code {\n opacity: 0.6;\n }\n}\n\n[data-component=\"tool-output\"] {\n white-space: pre;\n padding: 0;\n margin-bottom: 24px;\n height: fit-content;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: flex-start;\n\n [data-component=\"markdown\"] {\n width: 100%;\n min-width: 0;\n\n pre {\n margin: 0;\n padding: 0;\n background-color: transparent !important;\n border: none !important;\n }\n }\n\n pre {\n margin: 0;\n padding: 0;\n background: none;\n }\n\n &[data-scrollable] {\n height: auto;\n max-height: 240px;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n [data-component=\"markdown\"] {\n overflow: visible;\n }\n }\n}\n\n[data-component=\"bash-output\"] {\n width: 100%;\n border: 1px solid var(--border-weak-base);\n border-radius: 6px;\n background: transparent;\n position: relative;\n overflow: hidden;\n\n [data-slot=\"bash-copy\"] {\n position: absolute;\n top: 4px;\n right: 4px;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease;\n }\n\n &:hover [data-slot=\"bash-copy\"],\n &:focus-within [data-slot=\"bash-copy\"] {\n opacity: 1;\n pointer-events: auto;\n }\n\n [data-slot=\"bash-copy\"]\n [data-component=\"icon-button\"][data-variant=\"secondary\"] {\n box-shadow: none;\n border: 1px solid var(--border-weak-base);\n }\n\n [data-slot=\"bash-copy\"]\n [data-component=\"icon-button\"][data-variant=\"secondary\"]\n [data-slot=\"icon-svg\"] {\n color: var(--icon-base);\n }\n\n [data-slot=\"bash-scroll\"] {\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 240px;\n\n scrollbar-width: none;\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n [data-slot=\"bash-pre\"] {\n margin: 0;\n padding: 12px;\n }\n\n [data-slot=\"bash-pre\"] code {\n font-family: var(--font-family-mono);\n font-feature-settings: var(--font-family-mono--font-feature-settings);\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n}\n\n[data-component=\"tool-trigger\"][data-layout=\"activity-row\"]:has(\n [data-component=\"edit-trigger\"],\n [data-component=\"write-trigger\"]\n) > [data-slot=\"collapsible-arrow\"] {\n grid-column: 4;\n}\n\n[data-component=\"tool-trigger\"][data-layout=\"activity-row\"]:hover\n [data-slot=\"message-part-view-file\"],\n[data-component=\"tool-trigger\"][data-layout=\"activity-row\"]:focus-within\n [data-slot=\"message-part-view-file\"] {\n opacity: 1;\n}\n\n[data-component=\"edit-trigger\"],\n[data-component=\"write-trigger\"] {\n display: contents;\n\n [data-slot=\"message-part-title\"] {\n grid-column: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n font-style: normal;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n letter-spacing: var(--letter-spacing-normal);\n color: var(--text-base);\n }\n\n [data-slot=\"message-part-path\"] {\n grid-column: 2;\n display: flex;\n min-width: 0;\n overflow: hidden;\n font-weight: var(--font-weight-regular);\n }\n\n [data-slot=\"message-part-actions\"] {\n grid-column: 3;\n display: flex;\n gap: 4px;\n align-items: center;\n justify-content: flex-end;\n flex-shrink: 0;\n }\n\n [data-slot=\"message-part-actions\"] [data-component=\"diff-changes\"] {\n gap: 4px;\n\n [data-slot=\"diff-changes-additions\"],\n [data-slot=\"diff-changes-deletions\"] {\n min-width: 2ch;\n font-size: var(--font-size-small);\n }\n }\n\n [data-slot=\"message-part-view-file\"] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1px;\n border-radius: 4px;\n color: var(--text-base);\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.15s ease;\n\n &:hover,\n &:focus-visible {\n color: var(--text-strong);\n background: var(--surface-base);\n outline: none;\n }\n }\n\n [data-slot=\"message-part-title-text\"] {\n flex-shrink: 0;\n text-transform: capitalize;\n color: var(--text-strong);\n }\n\n [data-slot=\"message-part-path\"] {\n display: flex;\n min-width: 0;\n overflow: hidden;\n font-weight: var(--font-weight-regular);\n }\n\n [data-slot=\"message-part-directory\"] {\n color: var(--text-weak);\n flex: 0 1 auto;\n min-width: 0;\n direction: rtl;\n text-align: left;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n [data-slot=\"message-part-path-separator\"] {\n color: var(--text-weak);\n flex: 0 0 auto;\n }\n\n [data-slot=\"message-part-filename\"] {\n color: var(--text-strong);\n flex: 0 0 auto;\n white-space: nowrap;\n }\n}\n\n[data-component=\"edit-content\"],\n[data-component=\"write-content\"],\n[data-component=\"apply-patch-file-diff\"] {\n border-radius: inherit;\n max-height: calc(var(--session-viewport-height, 100dvh) * 0.6);\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--border-weak-base) transparent;\n}\n\n[data-component=\"edit-content\"],\n[data-component=\"write-content\"] {\n border-top: 1px solid var(--border-weaker-base);\n}\n\n/* Expanded output belongs to the transcript's vertical scroll in the mobile\n layout, including landscape phones wider than 768px. clip, unlike hidden,\n does not create another scrolling container. */\n:where(html[data-mobile-layout]) [data-mobile-surface=\"session\"] {\n [data-component=\"edit-content\"],\n [data-component=\"write-content\"],\n [data-component=\"apply-patch-file-diff\"],\n [data-component=\"tool-output\"][data-scrollable],\n [data-slot=\"bash-scroll\"] {\n max-height: none;\n overflow-x: clip;\n overflow-y: visible;\n }\n}\n\n[data-component=\"tool-action\"] {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[data-component=\"exa-tool-output\"] {\n width: 100%;\n padding-top: 8px;\n display: flex;\n flex-direction: column;\n}\n\n[data-slot=\"basic-tool-tool-subtitle\"].exa-tool-query {\n display: block;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n[data-slot=\"exa-tool-links\"] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n[data-slot=\"exa-tool-link\"] {\n display: block;\n max-width: 100%;\n color: var(--text-interactive-base);\n text-decoration: underline;\n text-underline-offset: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover {\n color: var(--text-interactive-base);\n }\n\n &:visited {\n color: var(--text-interactive-base);\n }\n}\n\n[data-slot=\"basic-tool-tool-title\"],\n[data-slot=\"context-tool-group-label\"] {\n min-width: 0;\n}\n\n:is([data-component=\"context-tool-group-trigger\"], [data-component=\"work-tool-group-trigger\"])[data-layout=\"activity-row\"] {\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n min-height: 24px;\n display: grid;\n grid-template-columns: var(--activity-label-width) minmax(0, auto) auto auto;\n align-items: center;\n column-gap: 8px;\n cursor: default;\n\n [data-slot=\"context-tool-group-title\"] {\n display: contents;\n }\n\n [data-slot=\"context-tool-group-label\"] {\n grid-column: 1;\n }\n\n [data-slot=\"context-tool-group-summary\"] {\n grid-column: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n [data-slot=\"context-tool-group-budget\"],\n > [data-component=\"diff-changes\"] {\n grid-column: 3;\n }\n\n > [data-component=\"diff-changes\"] {\n margin-inline-start: 8px;\n gap: 4px;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n\n > [data-slot=\"collapsible-arrow\"] {\n grid-column: 4;\n }\n\n &:not(:has([data-slot=\"context-tool-group-budget\"], [data-component=\"diff-changes\"]))\n > [data-slot=\"collapsible-arrow\"] {\n grid-column: 3;\n }\n\n [data-slot=\"collapsible-arrow\"] {\n color: var(--icon-weaker);\n cursor: pointer;\n }\n}\n\n[data-activity-group] > [data-slot=\"collapsible-content\"] > [data-component=\"context-tool-group-list\"] {\n --activity-label-width: calc(var(--font-size-base) * 72 / 14);\n padding: 4px 0 0 16px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n > [data-slot=\"context-tool-group-item\"] {\n min-width: 0;\n padding: 0;\n }\n\n > [data-slot=\"context-tool-group-item\"] > [data-component=\"tool-trigger\"] {\n min-height: 28px;\n align-items: center;\n }\n\n}\n\n[data-activity-group=\"single\"] > [data-slot=\"collapsible-content\"] > [data-component=\"context-tool-group-list\"] {\n --activity-label-width: max-content;\n padding: 0;\n gap: 0;\n}\n\n[data-component=\"diagnostics\"] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px 12px;\n background-color: var(--surface-critical-weak);\n border-top: 1px solid var(--border-critical-base);\n\n [data-slot=\"diagnostic\"] {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n }\n}\n\n[data-component=\"user-message\"] [data-slot=\"user-message-text\"],\n[data-component=\"text-part\"],\n[data-component=\"reasoning-part\"],\n[data-component=\"tool-output\"],\n[data-component=\"bash-output\"],\n[data-component=\"edit-content\"],\n[data-component=\"write-content\"],\n[data-component=\"diagnostics\"],\n.error-card {\n -webkit-user-select: text;\n user-select: text;\n}\n\n[data-component=\"tool-part-wrapper\"] {\n width: 100%;\n}\n\n[data-component=\"dock-prompt\"][data-kind=\"permission\"] {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0;\n min-height: 0;\n max-height: 100dvh;\n\n [data-slot=\"permission-header\"] {\n padding: 0;\n }\n\n [data-slot=\"permission-row\"] {\n display: grid;\n grid-template-columns: 20px 1fr;\n column-gap: 8px;\n align-items: start;\n }\n\n [data-slot=\"permission-row\"][data-variant=\"header\"] {\n align-items: center;\n }\n\n [data-slot=\"permission-icon\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n [data-slot=\"permission-icon\"] [data-component=\"icon\"] {\n color: var(--icon-warning-base);\n }\n\n [data-slot=\"permission-header-title\"] {\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n color: var(--text-strong);\n min-width: 0;\n }\n\n [data-slot=\"permission-hint\"] {\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n color: var(--text-weak);\n padding: 0;\n }\n\n [data-slot=\"permission-patterns\"] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 8px;\n margin-bottom: 16px;\n padding: 1px 0 8px;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n code {\n font-size: 14px;\n line-height: var(--line-height-large);\n }\n }\n\n [data-slot=\"permission-footer\"] {\n display: flex;\n flex-shrink: 0;\n padding: 32px 8px 8px;\n margin-top: -24px;\n }\n\n [data-slot=\"permission-footer-actions\"] {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n gap: 8px;\n\n [data-component=\"button\"] {\n padding-left: 12px;\n padding-right: 12px;\n }\n }\n}\n\n[data-component=\"dock-prompt\"][data-kind=\"question\"] {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0;\n min-height: 0;\n max-height: var(--question-prompt-max-height, 100dvh);\n\n [data-slot=\"question-header\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 0 10px;\n }\n\n [data-slot=\"question-header-title\"] {\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n color: var(--text-strong);\n min-width: 0;\n }\n\n [data-slot=\"question-progress\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n }\n\n [data-slot=\"question-progress-segment\"] {\n width: 16px;\n height: 16px;\n padding: 0;\n border: 0;\n background: transparent;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n touch-action: manipulation;\n\n &::after {\n content: \"\";\n width: 16px;\n height: 2px;\n border-radius: 999px;\n background-color: var(--icon-weak-base);\n transition: background-color 0.2s ease;\n }\n\n &[data-active=\"true\"]::after {\n background-color: var(--icon-strong-base);\n }\n\n &[data-answered=\"true\"]::after {\n background-color: var(--icon-interactive-base);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n }\n\n [data-slot=\"question-text\"] {\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n color: var(--text-strong);\n padding: 0 10px;\n }\n\n [data-slot=\"question-hint\"] {\n font-family: var(--font-family-sans);\n font-size: 13px;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n color: var(--text-weak);\n padding: 0 10px;\n }\n\n [data-slot=\"question-options\"] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 12px;\n padding: 1px 1px 8px;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n [data-slot=\"question-option\"] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 8px 8px 8px 10px;\n background-color: var(--surface-raised-stronger-non-alpha);\n border: 1px solid var(--border-weak-base);\n border-radius: 6px;\n box-shadow: none;\n text-align: left;\n width: 100%;\n cursor: pointer;\n transition:\n background-color 0.15s ease,\n border-color 0.15s ease,\n box-shadow 0.15s ease;\n\n &:hover:not([data-picked=\"true\"]) {\n background-color: var(--background-base);\n }\n\n &[data-picked=\"true\"] {\n background-color: var(--surface-interactive-weak);\n border-color: transparent;\n box-shadow: var(--shadow-xs-border-hover);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n }\n\n [data-slot=\"question-option-check\"] {\n display: inline-flex;\n transform: translateY(2px);\n }\n\n [data-slot=\"question-option-box\"] {\n width: 16px;\n height: 16px;\n padding: 2px;\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-weak-base);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background-color: transparent;\n transition:\n background-color 0.15s ease,\n border-color 0.15s ease;\n\n [data-component=\"icon\"] {\n opacity: 0;\n color: var(--icon-base);\n }\n\n &[data-type=\"radio\"] {\n border-radius: 999px;\n }\n\n [data-slot=\"question-option-radio-dot\"] {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background-color: var(--background-stronger);\n opacity: 0;\n }\n\n &[data-picked=\"true\"] {\n border-color: var(--icon-interactive-base);\n\n [data-component=\"icon\"] {\n opacity: 1;\n color: var(--icon-invert-base);\n }\n\n &[data-type=\"checkbox\"] {\n background-color: var(--icon-interactive-base);\n }\n\n &[data-type=\"radio\"] {\n background-color: var(--icon-interactive-base);\n [data-slot=\"question-option-radio-dot\"] {\n opacity: 1;\n }\n }\n }\n }\n\n [data-slot=\"question-option-main\"] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n }\n\n [data-slot=\"option-label\"] {\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n color: var(--text-strong);\n }\n\n [data-slot=\"option-description\"] {\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n color: var(--text-base);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n [data-slot=\"question-option\"][data-custom=\"true\"] {\n [data-slot=\"option-description\"] {\n overflow: visible;\n text-overflow: clip;\n white-space: normal;\n overflow-wrap: anywhere;\n }\n }\n\n [data-slot=\"question-custom\"] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n [data-slot=\"question-custom-input\"] {\n width: 100%;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n outline: none;\n font-family: var(--font-family-sans);\n font-size: 14px;\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n color: var(--text-base);\n min-width: 0;\n cursor: text;\n resize: none;\n overflow: hidden;\n overflow-wrap: anywhere;\n\n &::placeholder {\n color: var(--text-weak);\n }\n\n &:focus-visible {\n outline: 1px solid var(--border-interactive-base);\n outline-offset: 2px;\n border-radius: var(--radius-xs);\n }\n\n &:disabled {\n opacity: 0.6;\n }\n }\n\n [data-slot=\"question-footer\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n padding: 32px 8px 8px;\n margin-top: -24px;\n }\n\n [data-slot=\"question-footer-actions\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n}\n\n[data-component=\"question-answers\"] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 8px 0;\n\n [data-slot=\"question-answer-item\"] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: var(--font-size-small);\n\n [data-slot=\"question-text\"] {\n color: var(--text-weak);\n }\n\n [data-slot=\"answer-text\"] {\n color: var(--text-strong);\n }\n }\n}\n\n[data-component=\"edit-tool\"],\n[data-component=\"write-tool\"],\n[data-component=\"apply-patch-tool\"] {\n > [data-component=\"collapsible\"].tool-collapsible {\n gap: 0px;\n }\n\n > [data-component=\"collapsible\"] > [data-slot=\"collapsible-content\"] {\n border: none;\n background: transparent;\n }\n\n > [data-component=\"collapsible\"] > [data-slot=\"collapsible-trigger\"] {\n min-height: 28px;\n height: auto;\n padding-bottom: 0;\n }\n\n > [data-component=\"collapsible\"]\n > [data-slot=\"collapsible-trigger\"][aria-expanded=\"true\"] {\n z-index: 20;\n background-color: var(--background-stronger);\n }\n}\n\n[data-component=\"accordion\"][data-scope=\"apply-patch\"] {\n [data-slot=\"accordion-trigger\"] {\n background-color: var(--background-stronger) !important;\n }\n\n [data-slot=\"apply-patch-trigger-content\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 20px;\n }\n\n [data-slot=\"apply-patch-file-info\"] {\n flex-grow: 1;\n display: flex;\n align-items: center;\n gap: 20px;\n min-width: 0;\n }\n\n [data-slot=\"apply-patch-file-name-container\"] {\n display: flex;\n flex-grow: 1;\n min-width: 0;\n }\n\n [data-slot=\"apply-patch-directory\"] {\n color: var(--text-base);\n min-width: 0;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n [data-slot=\"apply-patch-filename\"] {\n color: var(--text-strong);\n flex-shrink: 0;\n }\n\n [data-slot=\"apply-patch-trigger-actions\"] {\n flex-shrink: 0;\n display: flex;\n gap: 16px;\n align-items: center;\n justify-content: flex-end;\n }\n\n [data-slot=\"apply-patch-change\"] {\n font-family: var(--font-family-sans);\n font-size: var(--font-size-small);\n font-weight: var(--font-weight-medium);\n }\n\n [data-slot=\"apply-patch-change\"][data-type=\"added\"] {\n color: var(--icon-diff-add-base);\n }\n\n [data-slot=\"apply-patch-change\"][data-type=\"removed\"] {\n color: var(--icon-diff-delete-base);\n }\n\n [data-slot=\"apply-patch-change\"][data-type=\"modified\"] {\n color: var(--icon-diff-modified-base);\n }\n}\n\n[data-component=\"tool-loaded-file\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0 4px 28px;\n font-family: var(--font-family-sans);\n font-size: var(--font-size-small);\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-large);\n color: var(--text-weak);\n\n [data-component=\"icon\"] {\n flex-shrink: 0;\n color: var(--icon-weak);\n }\n}\n","/* Synced from Mux frontend/src/pages/session/transcript/renderers/session-turn.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n/* Scope the existing typography tokens to transcript rows, not the header,\n composer, file tabs, or portalled menus. Shared renderers inherit this scale. */\n[data-component=\"message-timeline\"] [data-component=\"session-turn\"] {\n --font-size-base: var(--chat-font-size, 14px);\n --font-size-small: calc(var(--font-size-base) * 13 / 14);\n --font-size-large: calc(var(--font-size-base) * 16 / 14);\n --font-size-x-large: calc(var(--font-size-base) * 20 / 14);\n --markdown-font-size: var(--font-size-base);\n --file-font-size: var(--font-size-base);\n font-size: var(--font-size-base);\n}\n\n[data-component=\"session-turn\"] {\n --sticky-header-height: calc(var(--session-title-height, 0px) + 24px);\n height: 100%;\n min-height: 0;\n min-width: 0;\n display: flex;\n align-items: flex-start;\n justify-content: flex-start;\n\n [data-slot=\"session-turn-message-container\"] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n align-self: stretch;\n min-width: 0;\n gap: 18px;\n overflow-anchor: none;\n }\n\n [data-slot=\"session-turn-message-content\"] {\n margin-top: 0;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n }\n\n [data-slot=\"session-turn-compaction\"] {\n width: 100%;\n min-width: 0;\n align-self: stretch;\n }\n\n [data-slot=\"session-turn-thinking\"][data-layout=\"activity-row\"] {\n display: grid;\n grid-template-columns: var(--activity-label-width) minmax(0, 1fr) auto auto;\n align-items: baseline;\n column-gap: 8px;\n width: 100%;\n min-width: 0;\n color: var(--text-weak);\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-large);\n min-height: 20px;\n\n [data-slot=\"activity-row-label\"] {\n grid-column: 1;\n min-width: 0;\n }\n\n .session-turn-thinking-heading {\n grid-column: 2;\n }\n\n [data-component=\"spinner\"] {\n width: 16px;\n height: 16px;\n }\n }\n\n .session-turn-thinking-heading {\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n color: var(--text-weaker);\n font-weight: var(--font-weight-regular);\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .error-card {\n color: var(--text-on-critical-base);\n max-height: 240px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n word-break: break-word;\n overflow-y: auto;\n }\n\n [data-slot=\"session-turn-assistant-content\"] {\n width: 100%;\n min-width: 0;\n display: flex;\n flex-direction: column;\n align-self: stretch;\n gap: 12px;\n\n > :first-child > [data-component=\"markdown\"]:first-child {\n margin-top: 0;\n }\n }\n}\n","/* Synced from Mux frontend/src/ui/components/spinner.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-component=\"spinner\"] {\n color: inherit;\n flex-shrink: 0;\n width: 18px;\n aspect-ratio: 1;\n}\n","/* Synced from Mux frontend/src/ui/components/text-shimmer.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-component=\"text-shimmer\"] {\n --text-shimmer-step: 45ms;\n --text-shimmer-duration: 1200ms;\n --text-shimmer-swap: 220ms;\n --text-shimmer-index: 0;\n --text-shimmer-angle: 90deg;\n --text-shimmer-spread: 5.2ch;\n --text-shimmer-size: 360%;\n --text-shimmer-base-color: var(--text-weak);\n --text-shimmer-peak-color: var(--text-strong);\n --text-shimmer-sweep: linear-gradient(\n var(--text-shimmer-angle),\n transparent calc(50% - var(--text-shimmer-spread)),\n var(--text-shimmer-peak-color) 50%,\n transparent calc(50% + var(--text-shimmer-spread))\n );\n --text-shimmer-base: linear-gradient(var(--text-shimmer-base-color), var(--text-shimmer-base-color));\n\n display: inline-flex;\n align-items: baseline;\n font: inherit;\n letter-spacing: inherit;\n line-height: inherit;\n}\n\n[data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char\"] {\n display: inline-grid;\n white-space: pre;\n font: inherit;\n letter-spacing: inherit;\n line-height: inherit;\n}\n\n[data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-base\"],\n[data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-shimmer\"] {\n grid-area: 1 / 1;\n white-space: pre;\n transition: opacity var(--text-shimmer-swap) ease-out;\n font: inherit;\n letter-spacing: inherit;\n line-height: inherit;\n}\n\n[data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-base\"] {\n color: inherit;\n opacity: 1;\n}\n\n[data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-shimmer\"] {\n color: var(--text-weaker);\n opacity: 0;\n}\n\n[data-component=\"text-shimmer\"][data-active=\"true\"] [data-slot=\"text-shimmer-char-shimmer\"] {\n opacity: 1;\n}\n\n[data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-shimmer\"][data-run=\"true\"] {\n animation-name: text-shimmer-sweep;\n animation-duration: var(--text-shimmer-duration);\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n animation-fill-mode: both;\n animation-delay: calc(var(--text-shimmer-step) * var(--text-shimmer-index) * -1);\n will-change: background-position;\n}\n\n@keyframes text-shimmer-sweep {\n 0% {\n background-position:\n 100% 0,\n 0 0;\n }\n\n 100% {\n background-position:\n 0% 0,\n 0 0;\n }\n}\n\n@supports ((-webkit-background-clip: text) or (background-clip: text)) {\n [data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-shimmer\"] {\n color: transparent;\n -webkit-text-fill-color: transparent;\n background-image: var(--text-shimmer-sweep), var(--text-shimmer-base);\n background-size:\n var(--text-shimmer-size) 100%,\n 100% 100%;\n background-position:\n 100% 0,\n 0 0;\n background-repeat: no-repeat;\n -webkit-background-clip: text;\n background-clip: text;\n }\n\n [data-component=\"text-shimmer\"][data-active=\"true\"] [data-slot=\"text-shimmer-char-base\"] {\n opacity: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-base\"],\n [data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-shimmer\"] {\n transition-duration: 0ms;\n }\n\n [data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-shimmer\"] {\n animation: none !important;\n color: inherit;\n -webkit-text-fill-color: currentColor;\n background-image: none;\n }\n\n [data-component=\"text-shimmer\"] [data-slot=\"text-shimmer-char-base\"] {\n opacity: 1 !important;\n }\n}\n","/* Synced from Mux frontend/src/ui/styles/theme.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n:host {\n --font-family-sans: \"Inter\", \"Inter Fallback\";\n --font-family-sans--font-feature-settings: \"ss03\" 1;\n --font-family-mono: \"IBM Plex Mono\", \"IBM Plex Mono Fallback\";\n --font-family-mono--font-feature-settings: \"ss01\" 1;\n\n --font-size-small: 13px;\n --font-size-base: 14px;\n --font-size-large: 16px;\n --font-size-x-large: 20px;\n --font-weight-regular: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --line-height-normal: 130%;\n --line-height-large: 150%;\n --line-height-x-large: 180%;\n --line-height-2x-large: 200%;\n --letter-spacing-normal: 0;\n --letter-spacing-tight: -0.16px;\n --letter-spacing-tightest: -0.32px;\n --paragraph-spacing-base: 0;\n\n --spacing: 0.25rem;\n\n /* Label track for transcript activity rows (tool/thinking/context triggers).\n Content-sized, so each label sits one 8px gap from its detail text.\n Set a fixed length here to align column 2 across rows instead. */\n --activity-label-width: max-content;\n\n --breakpoint-sm: 40rem;\n --breakpoint-md: 48rem;\n --breakpoint-lg: 64rem;\n --breakpoint-xl: 80rem;\n --breakpoint-2xl: 96rem;\n\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.625rem;\n\n --shadow-xs:\n 0 1px 2px -0.5px light-dark(hsl(0 0% 0% / 0.04), hsl(0 0% 0% / 0.06)),\n 0 0.5px 1.5px 0 light-dark(hsl(0 0% 0% / 0.025), hsl(0 0% 0% / 0.08)),\n 0 1px 3px 0 light-dark(hsl(0 0% 0% / 0.05), hsl(0 0% 0% / 0.1));\n --shadow-sm:\n 0 1px 3px 0 light-dark(hsl(0 0% 0% / 0.06), hsl(0 0% 0% / 0.12)),\n 0 1px 2px -1px light-dark(hsl(0 0% 0% / 0.06), hsl(0 0% 0% / 0.12));\n --shadow-md:\n 0 6px 12px -2px light-dark(hsl(0 0% 0% / 0.075), hsl(0 0% 0% / 0.1)),\n 0 4px 8px -2px light-dark(hsl(0 0% 0% / 0.075), hsl(0 0% 0% / 0.15)),\n 0 1px 2px light-dark(hsl(0 0% 0% / 0.1), hsl(0 0% 0% / 0.15));\n --shadow-lg:\n 0 16px 48px -6px light-dark(hsl(0 0% 0% / 0.05), hsl(0 0% 0% / 0.15)),\n 0 6px 12px -2px light-dark(hsl(0 0% 0% / 0.025), hsl(0 0% 0% / 0.1)),\n 0 1px 2.5px light-dark(hsl(0 0% 0% / 0.025), hsl(0 0% 0% / 0.1));\n --shadow-xl:\n 0 24px 64px -12px light-dark(hsl(0 0% 0% / 0.12), hsl(0 0% 0% / 0.4)),\n 0 8px 20px -6px light-dark(hsl(0 0% 0% / 0.06), hsl(0 0% 0% / 0.2));\n --shadow-xxs-border: 0 0 0 0.5px var(--border-weak-base, rgba(0, 0, 0, 0.07));\n --shadow-xs-border:\n 0 0 0 1px var(--border-base, rgba(11, 6, 0, 0.2)), 0 1px 2px -1px rgba(19, 16, 16, 0.04),\n 0 1px 2px 0 rgba(19, 16, 16, 0.06), 0 1px 3px 0 rgba(19, 16, 16, 0.08);\n --shadow-xs-border-base:\n 0 0 0 1px var(--border-weak-base, rgba(17, 0, 0, 0.12)), 0 1px 2px -1px rgba(19, 16, 16, 0.04),\n 0 1px 2px 0 rgba(19, 16, 16, 0.06), 0 1px 3px 0 rgba(19, 16, 16, 0.08);\n --shadow-xs-border-select:\n 0 0 0 3px var(--border-weak-selected, rgba(1, 103, 255, 0.29)),\n 0 0 0 1px var(--border-selected, rgba(0, 74, 255, 0.99)), 0 1px 2px -1px rgba(19, 16, 16, 0.25),\n 0 1px 2px 0 rgba(19, 16, 16, 0.08), 0 1px 3px 0 rgba(19, 16, 16, 0.12);\n --shadow-xs-border-focus:\n 0 0 0 1px var(--border-base, rgba(11, 6, 0, 0.2)), 0 1px 2px -1px rgba(19, 16, 16, 0.25),\n 0 1px 2px 0 rgba(19, 16, 16, 0.08), 0 1px 3px 0 rgba(19, 16, 16, 0.12), 0 0 0 2px var(--background-weak, #f1f0f0),\n 0 0 0 3px var(--border-selected, rgba(0, 74, 255, 0.99));\n --shadow-xs-border-hover:\n 0 0 0 1px var(--border-weak-selected, rgba(0, 112, 255, 0.22)), 0 1px 2px -1px rgba(19, 16, 16, 0.04),\n 0 1px 2px 0 rgba(19, 16, 16, 0.06), 0 1px 3px 0 rgba(19, 16, 16, 0.08);\n --shadow-xs-border-critical-base: 0 0 0 1px var(--border-critical-selected, #fc543a);\n --shadow-xs-border-critical-focus:\n 0 0 0 3px var(--border-critical-weak, rgba(251, 34, 0, 0.18)), 0 0 0 1px var(--border-critical-selected, #fc543a),\n 0 1px 2px -1px rgba(19, 16, 16, 0.25), 0 1px 2px 0 rgba(19, 16, 16, 0.08), 0 1px 3px 0 rgba(19, 16, 16, 0.12);\n --shadow-lg-border-base:\n 0 0 0 1px var(--border-weak-base, rgba(0, 0, 0, 0.07)), 0 36px 80px 0 rgba(0, 0, 0, 0.03),\n 0 13.141px 29.201px 0 rgba(0, 0, 0, 0.04), 0 6.38px 14.177px 0 rgba(0, 0, 0, 0.05),\n 0 3.127px 6.95px 0 rgba(0, 0, 0, 0.06), 0 1.237px 2.748px 0 rgba(0, 0, 0, 0.09);\n\n color-scheme: light;\n --text-mix-blend-mode: multiply;\n\n /* OC-2 fallback variables (light) */\n --background-base: #f8f8f8;\n --background-weak: #f3f3f3;\n --background-strong: #fcfcfc;\n --background-stronger: #fcfcfc;\n --surface-base: rgba(0, 0, 0, 0.031);\n --base: rgba(0, 0, 0, 0.034);\n --surface-base-hover: rgba(0, 0, 0, 0.059);\n --surface-base-active: rgba(0, 0, 0, 0.051);\n --surface-base-interactive-active: rgba(3, 76, 255, 0.09);\n --base2: rgba(0, 0, 0, 0.034);\n --base3: rgba(0, 0, 0, 0.034);\n --surface-inset-base: rgba(0, 0, 0, 0.034);\n --surface-inset-base-hover: rgba(0, 0, 0, 0.055);\n --surface-inset-strong: rgba(0, 0, 0, 0.09);\n --surface-inset-strong-hover: rgba(0, 0, 0, 0.09);\n --surface-raised-base: rgba(0, 0, 0, 0.031);\n --surface-float-base: #161616;\n --surface-float-base-hover: #1c1c1c;\n --surface-raised-base-hover: rgba(0, 0, 0, 0.051);\n --surface-raised-base-active: rgba(0, 0, 0, 0.09);\n --surface-raised-strong: #fcfcfc;\n --surface-raised-strong-hover: #ffffff;\n --surface-raised-stronger: #ffffff;\n --surface-raised-stronger-hover: #ffffff;\n --surface-weak: rgba(0, 0, 0, 0.051);\n --surface-weaker: rgba(0, 0, 0, 0.071);\n --surface-strong: #ffffff;\n --surface-stronger-non-alpha: var(--surface-raised-stronger-non-alpha);\n --surface-raised-stronger-non-alpha: #ffffff;\n --surface-panel: var(--surface-raised-stronger-non-alpha);\n --surface-panel-base: var(--surface-raised-stronger-non-alpha);\n --surface-brand-base: #dcde8d;\n --surface-brand-hover: #d0d283;\n --surface-interactive-base: #ecf3ff;\n --surface-interactive-hover: #e0eaff;\n --surface-interactive-weak: #f7faff;\n --surface-interactive-weak-hover: #ecf3ff;\n --surface-success-base: #dbfed7;\n --surface-success-weak: #f0feee;\n --surface-success-strong: #12c905;\n --surface-warning-base: #fcf3cb;\n --surface-warning-weak: #fdfaec;\n --surface-warning-strong: #fbdd46;\n --surface-critical-base: #fff2f0;\n --surface-critical-weak: #fff8f6;\n --surface-critical-strong: #fc533a;\n --surface-info-base: #fdecfe;\n --surface-info-weak: #fef7ff;\n --surface-info-strong: #a753ae;\n --surface-diff-unchanged-base: #ffffff00;\n --surface-diff-skip-base: #f8f8f8;\n --surface-diff-hidden-base: #eaf4ff;\n --surface-diff-hidden-weak: #f6faff;\n --surface-diff-hidden-weaker: #fbfdff;\n --surface-diff-hidden-strong: #cae3ff;\n --surface-diff-hidden-stronger: #2090f5;\n --surface-diff-add-base: #e3fae1;\n --surface-diff-add-weak: #f4fcf3;\n --surface-diff-add-weaker: #fbfefb;\n --surface-diff-add-strong: #c2eebf;\n --surface-diff-add-stronger: #9ff29a;\n --surface-diff-delete-base: #feefeb;\n --surface-diff-delete-weak: #fff8f6;\n --surface-diff-delete-weaker: #fffcfb;\n --surface-diff-delete-strong: #fdc3b7;\n --surface-diff-delete-stronger: #fc533a;\n --input-base: #fcfcfc;\n --input-hover: #f8f8f8;\n --input-active: #fcfdff;\n --input-selected: #e0eaff;\n --input-focus: #fcfdff;\n --input-disabled: #ededed;\n --text-base: #6f6f6f;\n --text-weak: #8f8f8f;\n --text-weaker: #c7c7c7;\n --text-strong: #171717;\n --text-invert-base: #f8f8f8;\n --text-invert-weak: #f3f3f3;\n --text-invert-weaker: #ededed;\n --text-invert-strong: #fcfcfc;\n --text-interactive-base: #034cff;\n --text-subtle: var(--text-weak);\n --accent: var(--text-interactive-base);\n --accent-base: var(--text-interactive-base);\n --danger-base: #ed4831;\n --danger-muted: rgba(237, 72, 49, 0.12);\n --text-danger-base: var(--danger-base);\n --text-text-danger-base: var(--danger-base);\n --text-on-brand-base: rgba(0, 0, 0, 0.574);\n --text-on-interactive-base: #fcfcfc;\n --text-on-interactive-weak: rgba(0, 0, 0, 0.574);\n --text-on-success-base: #2dba26;\n --text-on-critical-base: #ed4831;\n --text-on-critical-weak: #fe806a;\n --text-on-critical-strong: #601a0f;\n --text-on-warning-base: rgba(0, 0, 0, 0.574);\n --text-on-info-base: rgba(0, 0, 0, 0.574);\n --text-diff-add-base: #3a8437;\n --text-diff-delete-base: #ed4831;\n --text-diff-delete-strong: #601a0f;\n --text-diff-add-strong: #1d3e1c;\n --text-on-info-weak: rgba(0, 0, 0, 0.453);\n --text-on-info-strong: rgba(0, 0, 0, 0.915);\n --text-on-warning-weak: rgba(0, 0, 0, 0.453);\n --text-on-warning-strong: rgba(0, 0, 0, 0.915);\n --text-on-success-weak: #96ec8e;\n --text-on-success-strong: #044202;\n --text-on-brand-weak: rgba(0, 0, 0, 0.453);\n --text-on-brand-weaker: rgba(0, 0, 0, 0.232);\n --text-on-brand-strong: rgba(0, 0, 0, 0.915);\n --button-primary-base: #171717;\n --button-secondary-base: #fcfcfc;\n --button-secondary-hover: #f8f8f8;\n --button-ghost-hover: rgba(0, 0, 0, 0.031);\n --button-ghost-hover2: rgba(0, 0, 0, 0.051);\n --border-base: rgba(0, 0, 0, 0.162);\n --border-hover: rgba(0, 0, 0, 0.236);\n --border-active: rgba(0, 0, 0, 0.46);\n --border-selected: rgba(3, 76, 255, 0.99);\n --border-disabled: rgba(0, 0, 0, 0.236);\n --border-focus: rgba(0, 0, 0, 0.46);\n --border-weak-base: #e5e5e5;\n --border-strong-base: rgba(0, 0, 0, 0.151);\n --border-strong-hover: rgba(0, 0, 0, 0.232);\n --border-strong-active: rgba(0, 0, 0, 0.151);\n --border-strong-selected: rgba(3, 76, 255, 0.31);\n --border-strong-disabled: rgba(0, 0, 0, 0.118);\n --border-strong-focus: rgba(0, 0, 0, 0.151);\n --border-weak-hover: rgba(0, 0, 0, 0.118);\n --border-weak-active: rgba(0, 0, 0, 0.151);\n --border-weak-selected: rgba(3, 76, 255, 0.24);\n --border-weak-disabled: rgba(0, 0, 0, 0.118);\n --border-weak-focus: rgba(0, 0, 0, 0.151);\n --border-weaker-base: #f0f0f0;\n --border-weaker-hover: rgba(0, 0, 0, 0.075);\n --border-weaker-active: rgba(0, 0, 0, 0.118);\n --border-weaker-selected: rgba(3, 76, 255, 0.16);\n --border-weaker-disabled: rgba(0, 0, 0, 0.034);\n --border-weaker-focus: rgba(0, 0, 0, 0.118);\n --border-interactive-base: #a3c1fd;\n --border-interactive-hover: #7ea9ff;\n --border-interactive-active: #034cff;\n --border-interactive-selected: #034cff;\n --border-interactive-disabled: #c7c7c7;\n --border-interactive-focus: #034cff;\n --border-success-base: #96ec8e;\n --border-success-hover: #7add71;\n --border-success-selected: #12c905;\n --border-warning-base: #e8d479;\n --border-warning-hover: #d8c158;\n --border-warning-selected: #fbdd46;\n --border-critical-base: #fdc3b7;\n --border-critical-hover: #ffa796;\n --border-critical-selected: #fc533a;\n --border-info-base: #f4bdf8;\n --border-info-hover: #e6a8ea;\n --border-info-selected: #a753ae;\n --border-color: #ffffff;\n --icon-base: #8f8f8f;\n --icon-hover: #6f6f6f;\n --icon-active: #171717;\n --icon-selected: #171717;\n --icon-disabled: #c7c7c7;\n --icon-focus: #171717;\n --icon-invert-base: #ffffff;\n --icon-weak-base: #dbdbdb;\n --icon-weak-hover: #c7c7c7;\n --icon-weak-active: #8f8f8f;\n --icon-weak-selected: #858585;\n --icon-weak-disabled: #e2e2e2;\n --icon-weak-focus: #8f8f8f;\n --icon-strong-base: #171717;\n --icon-strong-hover: #151313;\n --icon-strong-active: #020202;\n --icon-strong-selected: #020202;\n --icon-strong-disabled: #c7c7c7;\n --icon-strong-focus: #020202;\n --icon-brand-base: #171717;\n --icon-interactive-base: #034cff;\n --icon-success-base: #7add71;\n --icon-success-hover: #4cc944;\n --icon-success-active: #078901;\n --icon-warning-base: #ebb76e;\n --icon-warning-hover: #da9e40;\n --icon-warning-active: #95671b;\n --icon-critical-base: #ed4831;\n --icon-critical-hover: #ca2d17;\n --icon-critical-active: #601a0f;\n --icon-info-base: #e6a8ea;\n --icon-info-hover: #d58cda;\n --icon-info-active: #9b4da1;\n --icon-on-brand-base: rgba(0, 0, 0, 0.574);\n --icon-on-brand-hover: rgba(0, 0, 0, 0.915);\n --icon-on-brand-selected: rgba(0, 0, 0, 0.915);\n --icon-on-interactive-base: #fcfcfc;\n --icon-agent-plan-base: #a753ae;\n --icon-agent-docs-base: #fcb239;\n --icon-agent-ask-base: #2090f5;\n --icon-agent-build-base: #034cff;\n --icon-on-success-base: rgba(18, 201, 5, 0.9);\n --icon-on-success-hover: rgba(45, 186, 38, 0.9);\n --icon-on-success-selected: rgba(7, 137, 1, 0.9);\n --icon-on-warning-base: rgba(252, 178, 57, 0.9);\n --icon-on-warning-hover: rgba(239, 167, 46, 0.9);\n --icon-on-warning-selected: rgba(149, 103, 27, 0.9);\n --icon-on-critical-base: rgba(252, 83, 58, 0.9);\n --icon-on-critical-hover: rgba(237, 72, 49, 0.9);\n --icon-on-critical-selected: rgba(202, 45, 23, 0.9);\n --icon-on-info-base: #a753ae;\n --icon-on-info-hover: rgba(155, 73, 162, 0.9);\n --icon-on-info-selected: rgba(155, 77, 161, 0.9);\n --icon-diff-add-base: #3a8437;\n --icon-diff-add-hover: #1d3e1c;\n --icon-diff-add-active: #1d3e1c;\n --icon-diff-delete-base: #ed4831;\n --icon-diff-delete-hover: #ca2d17;\n --icon-diff-modified-base: #ff8c00;\n --syntax-comment: var(--text-weak);\n --syntax-regexp: var(--text-base);\n --syntax-string: #006656;\n --syntax-keyword: var(--text-weak);\n --syntax-primitive: #fb4804;\n --syntax-operator: var(--text-base);\n --syntax-variable: var(--text-strong);\n --syntax-property: #ed6dc8;\n --syntax-type: #596600;\n --syntax-constant: #007b80;\n --syntax-punctuation: var(--text-base);\n --syntax-object: var(--text-strong);\n --syntax-success: #2dba26;\n --syntax-warning: #efa72e;\n --syntax-critical: #ed4831;\n --syntax-info: #0092a8;\n --syntax-diff-add: #3a8437;\n --syntax-diff-delete: #ca2d17;\n --syntax-diff-unknown: #ff0000;\n --markdown-heading: #d68c27;\n --markdown-text: #1a1a1a;\n --markdown-link: #3b7dd8;\n --markdown-link-text: #318795;\n --markdown-code: #3d9a57;\n --markdown-block-quote: #b0851f;\n --markdown-emph: #b0851f;\n --markdown-strong: #d68c27;\n --markdown-horizontal-rule: #8a8a8a;\n --markdown-list-item: #3b7dd8;\n --markdown-list-enumeration: #318795;\n --markdown-image: #3b7dd8;\n --markdown-image-text: #318795;\n --markdown-code-block: #1a1a1a;\n --avatar-background-pink: #feeef8;\n --avatar-background-mint: #e1fbf4;\n --avatar-background-orange: #fff1e7;\n --avatar-background-purple: #f9f1fe;\n --avatar-background-cyan: #e7f9fb;\n --avatar-background-lime: #eefadc;\n --avatar-text-pink: #cd1d8d;\n --avatar-text-mint: #147d6f;\n --avatar-text-orange: #ed5f00;\n --avatar-text-purple: #8445bc;\n --avatar-text-cyan: #0894b3;\n --avatar-text-lime: #5d770d;\n --text-stronger: #171717;\n\n\n}\n\n@media (prefers-color-scheme: dark) {\n :host(:not([data-theme=\"light\"])) {\n color-scheme: dark;\n --text-mix-blend-mode: plus-lighter;\n\n /* OC-2 fallback variables (dark) */\n --background-base: #101010;\n --background-weak: #1e1e1e;\n --background-strong: #121212;\n --background-stronger: #151515;\n --surface-base: rgba(255, 255, 255, 0.031);\n --base: rgba(255, 255, 255, 0.034);\n --surface-base-hover: rgba(255, 255, 255, 0.039);\n --surface-base-active: rgba(255, 255, 255, 0.059);\n --surface-base-interactive-active: rgba(3, 76, 255, 0.125);\n --base2: rgba(255, 255, 255, 0.034);\n --base3: rgba(255, 255, 255, 0.034);\n --surface-inset-base: rgba(0, 0, 0, 0.5);\n --surface-inset-base-hover: rgba(0, 0, 0, 0.5);\n --surface-inset-strong: rgba(0, 0, 0, 0.8);\n --surface-inset-strong-hover: rgba(0, 0, 0, 0.8);\n --surface-raised-base: rgba(255, 255, 255, 0.059);\n --surface-float-base: #161616;\n --surface-float-base-hover: #1c1c1c;\n --surface-raised-base-hover: rgba(255, 255, 255, 0.078);\n --surface-raised-base-active: rgba(255, 255, 255, 0.102);\n --surface-raised-strong: rgba(255, 255, 255, 0.078);\n --surface-raised-strong-hover: rgba(255, 255, 255, 0.129);\n --surface-raised-stronger: rgba(255, 255, 255, 0.129);\n --surface-raised-stronger-hover: rgba(255, 255, 255, 0.169);\n --surface-weak: rgba(255, 255, 255, 0.078);\n --surface-weaker: rgba(255, 255, 255, 0.102);\n --surface-strong: rgba(255, 255, 255, 0.169);\n --surface-stronger-non-alpha: var(--surface-raised-stronger-non-alpha);\n --surface-raised-stronger-non-alpha: #1c1c1c;\n --surface-panel: var(--surface-raised-stronger-non-alpha);\n --surface-panel-base: var(--surface-raised-stronger-non-alpha);\n --surface-brand-base: #fab283;\n --surface-brand-hover: #eda779;\n --surface-interactive-base: #091f52;\n --surface-interactive-hover: #091f52;\n --surface-interactive-weak: #0b1730;\n --surface-interactive-weak-hover: #ecf3ff;\n --surface-success-base: #062d04;\n --surface-success-weak: #0a1e08;\n --surface-success-strong: #12c905;\n --surface-warning-base: #fdf3cf;\n --surface-warning-weak: #fdfaed;\n --surface-warning-strong: #fcd53a;\n --surface-critical-base: #1f0603;\n --surface-critical-weak: #28110c;\n --surface-critical-strong: #fc533a;\n --surface-info-base: #feecfe;\n --surface-info-weak: #fdf7fe;\n --surface-info-strong: #edb2f1;\n --surface-diff-unchanged-base: #161616;\n --surface-diff-skip-base: #00000000;\n --surface-diff-hidden-base: #0c1928;\n --surface-diff-hidden-weak: #09131d;\n --surface-diff-hidden-weaker: #082542;\n --surface-diff-hidden-strong: #073966;\n --surface-diff-hidden-stronger: #8ec2fc;\n --surface-diff-add-base: #1a2919;\n --surface-diff-add-weak: #1f351e;\n --surface-diff-add-weaker: #1a2919;\n --surface-diff-add-strong: #264024;\n --surface-diff-add-stronger: #9bcd97;\n --surface-diff-delete-base: #42120b;\n --surface-diff-delete-weak: #580f06;\n --surface-diff-delete-weaker: #42120b;\n --surface-diff-delete-strong: #6a1206;\n --surface-diff-delete-stronger: #faa494;\n --input-base: #1c1c1c;\n --input-hover: #1c1c1c;\n --input-active: #091123;\n --input-selected: #0b1730;\n --input-focus: #091123;\n --input-disabled: #282828;\n --text-base: rgba(255, 255, 255, 0.618);\n --text-weak: rgba(255, 255, 255, 0.422);\n --text-weaker: rgba(255, 255, 255, 0.284);\n --text-strong: rgba(255, 255, 255, 0.936);\n --text-invert-base: #a0a0a0;\n --text-invert-weak: #707070;\n --text-invert-weaker: #505050;\n --text-invert-strong: #ededed;\n --text-interactive-base: #9dbefe;\n --text-subtle: var(--text-weak);\n --accent: var(--text-interactive-base);\n --accent-base: var(--text-interactive-base);\n --danger-base: #fc533a;\n --danger-muted: rgba(252, 83, 58, 0.16);\n --text-danger-base: var(--danger-base);\n --text-text-danger-base: var(--danger-base);\n --text-on-brand-base: rgba(255, 255, 255, 0.603);\n --text-on-interactive-base: #ededed;\n --text-on-interactive-weak: rgba(255, 255, 255, 0.603);\n --text-on-success-base: #12c905;\n --text-on-critical-base: #fc533a;\n --text-on-critical-weak: #b72d1a;\n --text-on-critical-strong: #ffe0da;\n --text-on-warning-base: rgba(255, 255, 255, 0.603);\n --text-on-info-base: rgba(255, 255, 255, 0.603);\n --text-diff-add-base: #9bcd97;\n --text-diff-delete-base: #fc533a;\n --text-diff-delete-strong: #ffe0da;\n --text-diff-add-strong: #4a7348;\n --text-on-info-weak: rgba(255, 255, 255, 0.404);\n --text-on-info-strong: rgba(255, 255, 255, 0.928);\n --text-on-warning-weak: rgba(255, 255, 255, 0.404);\n --text-on-warning-strong: rgba(255, 255, 255, 0.928);\n --text-on-success-weak: #127d0d;\n --text-on-success-strong: #bafdb3;\n --text-on-brand-weak: rgba(255, 255, 255, 0.404);\n --text-on-brand-weaker: rgba(255, 255, 255, 0.266);\n --text-on-brand-strong: rgba(255, 255, 255, 0.928);\n --button-primary-base: #ededed;\n --button-secondary-base: #1c1c1c;\n --button-secondary-hover: rgba(255, 255, 255, 0.039);\n --button-ghost-hover: rgba(255, 255, 255, 0.031);\n --button-ghost-hover2: rgba(255, 255, 255, 0.059);\n --border-base: rgba(255, 255, 255, 0.195);\n --border-hover: rgba(255, 255, 255, 0.284);\n --border-active: rgba(255, 255, 255, 0.418);\n --border-selected: #9dbefe;\n --border-disabled: rgba(255, 255, 255, 0.284);\n --border-focus: rgba(255, 255, 255, 0.418);\n --border-weak-base: #282828;\n --border-strong-base: rgba(255, 255, 255, 0.266);\n --border-strong-hover: rgba(255, 255, 255, 0.266);\n --border-strong-active: rgba(255, 255, 255, 0.266);\n --border-strong-selected: rgba(3, 76, 255, 0.62);\n --border-strong-disabled: rgba(255, 255, 255, 0.138);\n --border-strong-focus: rgba(255, 255, 255, 0.266);\n --border-weak-hover: rgba(255, 255, 255, 0.181);\n --border-weak-active: rgba(255, 255, 255, 0.266);\n --border-weak-selected: rgba(3, 76, 255, 0.62);\n --border-weak-disabled: rgba(255, 255, 255, 0.138);\n --border-weak-focus: rgba(255, 255, 255, 0.266);\n --border-weaker-base: #202020;\n --border-weaker-hover: rgba(255, 255, 255, 0.084);\n --border-weaker-active: rgba(255, 255, 255, 0.138);\n --border-weaker-selected: rgba(3, 76, 255, 0.32);\n --border-weaker-disabled: rgba(255, 255, 255, 0.034);\n --border-weaker-focus: rgba(255, 255, 255, 0.138);\n --border-interactive-base: #a3c1fd;\n --border-interactive-hover: #7ea9ff;\n --border-interactive-active: #034cff;\n --border-interactive-selected: #034cff;\n --border-interactive-disabled: #505050;\n --border-interactive-focus: #034cff;\n --border-success-base: #96ec8e;\n --border-success-hover: #7add71;\n --border-success-selected: #12c905;\n --border-warning-base: #e9d282;\n --border-warning-hover: #dac063;\n --border-warning-selected: #fcd53a;\n --border-critical-base: #6a1206;\n --border-critical-hover: #952414;\n --border-critical-selected: #fc533a;\n --border-info-base: #eac5ec;\n --border-info-hover: #dab1dd;\n --border-info-selected: #edb2f1;\n --border-color: #ffffff;\n --icon-base: #7e7e7e;\n --icon-hover: #a0a0a0;\n --icon-active: #ededed;\n --icon-selected: #ededed;\n --icon-disabled: #3e3e3e;\n --icon-focus: #ededed;\n --icon-invert-base: #161616;\n --icon-weak-base: #343434;\n --icon-weak-hover: #d9d9d9;\n --icon-weak-active: #c8c8c8;\n --icon-weak-selected: #707070;\n --icon-weak-disabled: #ededed;\n --icon-weak-focus: #707070;\n --icon-strong-base: #ededed;\n --icon-strong-hover: #f6f3f3;\n --icon-strong-active: #fcfcfc;\n --icon-strong-selected: #fdfcfc;\n --icon-strong-disabled: #3e3e3e;\n --icon-strong-focus: #fdfcfc;\n --icon-brand-base: #ffffff;\n --icon-interactive-base: #034cff;\n --icon-success-base: #12c905;\n --icon-success-hover: #35c02d;\n --icon-success-active: #4de144;\n --icon-warning-base: #fbb73c;\n --icon-warning-hover: #885e08;\n --icon-warning-active: #f1b13f;\n --icon-critical-base: #fc533a;\n --icon-critical-hover: #faa494;\n --icon-critical-active: #ffe0da;\n --icon-info-base: #68446b;\n --icon-info-hover: #815484;\n --icon-info-active: #dfa7e3;\n --icon-on-brand-base: rgba(255, 255, 255, 0.603);\n --icon-on-brand-hover: rgba(255, 255, 255, 0.928);\n --icon-on-brand-selected: rgba(255, 255, 255, 0.928);\n --icon-on-interactive-base: #ededed;\n --icon-agent-plan-base: #edb2f1;\n --icon-agent-docs-base: #fbb73c;\n --icon-agent-ask-base: #2090f5;\n --icon-agent-build-base: #9dbefe;\n --icon-on-success-base: rgba(18, 201, 5, 0.9);\n --icon-on-success-hover: rgba(53, 192, 45, 0.9);\n --icon-on-success-selected: rgba(77, 225, 68, 0.9);\n --icon-on-warning-base: rgba(251, 183, 60, 0.9);\n --icon-on-warning-hover: rgba(245, 178, 56, 0.9);\n --icon-on-warning-selected: rgba(241, 177, 63, 0.9);\n --icon-on-critical-base: rgba(252, 83, 58, 0.9);\n --icon-on-critical-hover: rgba(245, 79, 54, 0.9);\n --icon-on-critical-selected: rgba(250, 164, 148, 0.9);\n --icon-on-info-base: #edb2f1;\n --icon-on-info-hover: rgba(231, 173, 235, 0.9);\n --icon-on-info-selected: rgba(223, 167, 227, 0.9);\n --icon-diff-add-base: #9bcd97;\n --icon-diff-add-hover: #c3f9bf;\n --icon-diff-add-active: #9bcd97;\n --icon-diff-delete-base: #fc533a;\n --icon-diff-delete-hover: #f54f36;\n --icon-diff-modified-base: #ffba92;\n --syntax-comment: var(--text-weak);\n --syntax-regexp: var(--text-base);\n --syntax-string: #00ceb9;\n --syntax-keyword: var(--text-weak);\n --syntax-primitive: #ffba92;\n --syntax-operator: var(--text-weak);\n --syntax-variable: var(--text-strong);\n --syntax-property: #ff9ae2;\n --syntax-type: #ecf58c;\n --syntax-constant: #93e9f6;\n --syntax-punctuation: var(--text-weak);\n --syntax-object: var(--text-strong);\n --syntax-success: #35c02d;\n --syntax-warning: #f5b238;\n --syntax-critical: #f54f36;\n --syntax-info: #93e9f6;\n --syntax-diff-add: #9bcd97;\n --syntax-diff-delete: #faa494;\n --syntax-diff-unknown: #ff0000;\n --markdown-heading: #9d7cd8;\n --markdown-text: #eeeeee;\n --markdown-link: #fab283;\n --markdown-link-text: #56b6c2;\n --markdown-code: #7fd88f;\n --markdown-block-quote: #e5c07b;\n --markdown-emph: #e5c07b;\n --markdown-strong: #f5a742;\n --markdown-horizontal-rule: #808080;\n --markdown-list-item: #fab283;\n --markdown-list-enumeration: #56b6c2;\n --markdown-image: #fab283;\n --markdown-image-text: #56b6c2;\n --markdown-code-block: #eeeeee;\n --avatar-background-pink: #501b3f;\n --avatar-background-mint: #033a34;\n --avatar-background-orange: #5f2a06;\n --avatar-background-purple: #432155;\n --avatar-background-cyan: #0f3058;\n --avatar-background-lime: #2b3711;\n --avatar-text-pink: #e34ba9;\n --avatar-text-mint: #95f3d9;\n --avatar-text-orange: #ff802b;\n --avatar-text-purple: #9d5bd2;\n --avatar-text-cyan: #369eff;\n --avatar-text-lime: #c4f042;\n --text-stronger: rgba(255, 255, 255, 0.936);\n }\n}\n:host([data-theme=\"dark\"]) {\n color-scheme: dark;\n --text-mix-blend-mode: plus-lighter;\n\n /* OC-2 fallback variables (dark) */\n --background-base: #101010;\n --background-weak: #1e1e1e;\n --background-strong: #121212;\n --background-stronger: #151515;\n --surface-base: rgba(255, 255, 255, 0.031);\n --base: rgba(255, 255, 255, 0.034);\n --surface-base-hover: rgba(255, 255, 255, 0.039);\n --surface-base-active: rgba(255, 255, 255, 0.059);\n --surface-base-interactive-active: rgba(3, 76, 255, 0.125);\n --base2: rgba(255, 255, 255, 0.034);\n --base3: rgba(255, 255, 255, 0.034);\n --surface-inset-base: rgba(0, 0, 0, 0.5);\n --surface-inset-base-hover: rgba(0, 0, 0, 0.5);\n --surface-inset-strong: rgba(0, 0, 0, 0.8);\n --surface-inset-strong-hover: rgba(0, 0, 0, 0.8);\n --surface-raised-base: rgba(255, 255, 255, 0.059);\n --surface-float-base: #161616;\n --surface-float-base-hover: #1c1c1c;\n --surface-raised-base-hover: rgba(255, 255, 255, 0.078);\n --surface-raised-base-active: rgba(255, 255, 255, 0.102);\n --surface-raised-strong: rgba(255, 255, 255, 0.078);\n --surface-raised-strong-hover: rgba(255, 255, 255, 0.129);\n --surface-raised-stronger: rgba(255, 255, 255, 0.129);\n --surface-raised-stronger-hover: rgba(255, 255, 255, 0.169);\n --surface-weak: rgba(255, 255, 255, 0.078);\n --surface-weaker: rgba(255, 255, 255, 0.102);\n --surface-strong: rgba(255, 255, 255, 0.169);\n --surface-stronger-non-alpha: var(--surface-raised-stronger-non-alpha);\n --surface-raised-stronger-non-alpha: #1c1c1c;\n --surface-panel: var(--surface-raised-stronger-non-alpha);\n --surface-panel-base: var(--surface-raised-stronger-non-alpha);\n --surface-brand-base: #fab283;\n --surface-brand-hover: #eda779;\n --surface-interactive-base: #091f52;\n --surface-interactive-hover: #091f52;\n --surface-interactive-weak: #0b1730;\n --surface-interactive-weak-hover: #ecf3ff;\n --surface-success-base: #062d04;\n --surface-success-weak: #0a1e08;\n --surface-success-strong: #12c905;\n --surface-warning-base: #fdf3cf;\n --surface-warning-weak: #fdfaed;\n --surface-warning-strong: #fcd53a;\n --surface-critical-base: #1f0603;\n --surface-critical-weak: #28110c;\n --surface-critical-strong: #fc533a;\n --surface-info-base: #feecfe;\n --surface-info-weak: #fdf7fe;\n --surface-info-strong: #edb2f1;\n --surface-diff-unchanged-base: #161616;\n --surface-diff-skip-base: #00000000;\n --surface-diff-hidden-base: #0c1928;\n --surface-diff-hidden-weak: #09131d;\n --surface-diff-hidden-weaker: #082542;\n --surface-diff-hidden-strong: #073966;\n --surface-diff-hidden-stronger: #8ec2fc;\n --surface-diff-add-base: #1a2919;\n --surface-diff-add-weak: #1f351e;\n --surface-diff-add-weaker: #1a2919;\n --surface-diff-add-strong: #264024;\n --surface-diff-add-stronger: #9bcd97;\n --surface-diff-delete-base: #42120b;\n --surface-diff-delete-weak: #580f06;\n --surface-diff-delete-weaker: #42120b;\n --surface-diff-delete-strong: #6a1206;\n --surface-diff-delete-stronger: #faa494;\n --input-base: #1c1c1c;\n --input-hover: #1c1c1c;\n --input-active: #091123;\n --input-selected: #0b1730;\n --input-focus: #091123;\n --input-disabled: #282828;\n --text-base: rgba(255, 255, 255, 0.618);\n --text-weak: rgba(255, 255, 255, 0.422);\n --text-weaker: rgba(255, 255, 255, 0.284);\n --text-strong: rgba(255, 255, 255, 0.936);\n --text-invert-base: #a0a0a0;\n --text-invert-weak: #707070;\n --text-invert-weaker: #505050;\n --text-invert-strong: #ededed;\n --text-interactive-base: #9dbefe;\n --text-subtle: var(--text-weak);\n --accent: var(--text-interactive-base);\n --accent-base: var(--text-interactive-base);\n --danger-base: #fc533a;\n --danger-muted: rgba(252, 83, 58, 0.16);\n --text-danger-base: var(--danger-base);\n --text-text-danger-base: var(--danger-base);\n --text-on-brand-base: rgba(255, 255, 255, 0.603);\n --text-on-interactive-base: #ededed;\n --text-on-interactive-weak: rgba(255, 255, 255, 0.603);\n --text-on-success-base: #12c905;\n --text-on-critical-base: #fc533a;\n --text-on-critical-weak: #b72d1a;\n --text-on-critical-strong: #ffe0da;\n --text-on-warning-base: rgba(255, 255, 255, 0.603);\n --text-on-info-base: rgba(255, 255, 255, 0.603);\n --text-diff-add-base: #9bcd97;\n --text-diff-delete-base: #fc533a;\n --text-diff-delete-strong: #ffe0da;\n --text-diff-add-strong: #4a7348;\n --text-on-info-weak: rgba(255, 255, 255, 0.404);\n --text-on-info-strong: rgba(255, 255, 255, 0.928);\n --text-on-warning-weak: rgba(255, 255, 255, 0.404);\n --text-on-warning-strong: rgba(255, 255, 255, 0.928);\n --text-on-success-weak: #127d0d;\n --text-on-success-strong: #bafdb3;\n --text-on-brand-weak: rgba(255, 255, 255, 0.404);\n --text-on-brand-weaker: rgba(255, 255, 255, 0.266);\n --text-on-brand-strong: rgba(255, 255, 255, 0.928);\n --button-primary-base: #ededed;\n --button-secondary-base: #1c1c1c;\n --button-secondary-hover: rgba(255, 255, 255, 0.039);\n --button-ghost-hover: rgba(255, 255, 255, 0.031);\n --button-ghost-hover2: rgba(255, 255, 255, 0.059);\n --border-base: rgba(255, 255, 255, 0.195);\n --border-hover: rgba(255, 255, 255, 0.284);\n --border-active: rgba(255, 255, 255, 0.418);\n --border-selected: #9dbefe;\n --border-disabled: rgba(255, 255, 255, 0.284);\n --border-focus: rgba(255, 255, 255, 0.418);\n --border-weak-base: #282828;\n --border-strong-base: rgba(255, 255, 255, 0.266);\n --border-strong-hover: rgba(255, 255, 255, 0.266);\n --border-strong-active: rgba(255, 255, 255, 0.266);\n --border-strong-selected: rgba(3, 76, 255, 0.62);\n --border-strong-disabled: rgba(255, 255, 255, 0.138);\n --border-strong-focus: rgba(255, 255, 255, 0.266);\n --border-weak-hover: rgba(255, 255, 255, 0.181);\n --border-weak-active: rgba(255, 255, 255, 0.266);\n --border-weak-selected: rgba(3, 76, 255, 0.62);\n --border-weak-disabled: rgba(255, 255, 255, 0.138);\n --border-weak-focus: rgba(255, 255, 255, 0.266);\n --border-weaker-base: #202020;\n --border-weaker-hover: rgba(255, 255, 255, 0.084);\n --border-weaker-active: rgba(255, 255, 255, 0.138);\n --border-weaker-selected: rgba(3, 76, 255, 0.32);\n --border-weaker-disabled: rgba(255, 255, 255, 0.034);\n --border-weaker-focus: rgba(255, 255, 255, 0.138);\n --border-interactive-base: #a3c1fd;\n --border-interactive-hover: #7ea9ff;\n --border-interactive-active: #034cff;\n --border-interactive-selected: #034cff;\n --border-interactive-disabled: #505050;\n --border-interactive-focus: #034cff;\n --border-success-base: #96ec8e;\n --border-success-hover: #7add71;\n --border-success-selected: #12c905;\n --border-warning-base: #e9d282;\n --border-warning-hover: #dac063;\n --border-warning-selected: #fcd53a;\n --border-critical-base: #6a1206;\n --border-critical-hover: #952414;\n --border-critical-selected: #fc533a;\n --border-info-base: #eac5ec;\n --border-info-hover: #dab1dd;\n --border-info-selected: #edb2f1;\n --border-color: #ffffff;\n --icon-base: #7e7e7e;\n --icon-hover: #a0a0a0;\n --icon-active: #ededed;\n --icon-selected: #ededed;\n --icon-disabled: #3e3e3e;\n --icon-focus: #ededed;\n --icon-invert-base: #161616;\n --icon-weak-base: #343434;\n --icon-weak-hover: #d9d9d9;\n --icon-weak-active: #c8c8c8;\n --icon-weak-selected: #707070;\n --icon-weak-disabled: #ededed;\n --icon-weak-focus: #707070;\n --icon-strong-base: #ededed;\n --icon-strong-hover: #f6f3f3;\n --icon-strong-active: #fcfcfc;\n --icon-strong-selected: #fdfcfc;\n --icon-strong-disabled: #3e3e3e;\n --icon-strong-focus: #fdfcfc;\n --icon-brand-base: #ffffff;\n --icon-interactive-base: #034cff;\n --icon-success-base: #12c905;\n --icon-success-hover: #35c02d;\n --icon-success-active: #4de144;\n --icon-warning-base: #fbb73c;\n --icon-warning-hover: #885e08;\n --icon-warning-active: #f1b13f;\n --icon-critical-base: #fc533a;\n --icon-critical-hover: #faa494;\n --icon-critical-active: #ffe0da;\n --icon-info-base: #68446b;\n --icon-info-hover: #815484;\n --icon-info-active: #dfa7e3;\n --icon-on-brand-base: rgba(255, 255, 255, 0.603);\n --icon-on-brand-hover: rgba(255, 255, 255, 0.928);\n --icon-on-brand-selected: rgba(255, 255, 255, 0.928);\n --icon-on-interactive-base: #ededed;\n --icon-agent-plan-base: #edb2f1;\n --icon-agent-docs-base: #fbb73c;\n --icon-agent-ask-base: #2090f5;\n --icon-agent-build-base: #9dbefe;\n --icon-on-success-base: rgba(18, 201, 5, 0.9);\n --icon-on-success-hover: rgba(53, 192, 45, 0.9);\n --icon-on-success-selected: rgba(77, 225, 68, 0.9);\n --icon-on-warning-base: rgba(251, 183, 60, 0.9);\n --icon-on-warning-hover: rgba(245, 178, 56, 0.9);\n --icon-on-warning-selected: rgba(241, 177, 63, 0.9);\n --icon-on-critical-base: rgba(252, 83, 58, 0.9);\n --icon-on-critical-hover: rgba(245, 79, 54, 0.9);\n --icon-on-critical-selected: rgba(250, 164, 148, 0.9);\n --icon-on-info-base: #edb2f1;\n --icon-on-info-hover: rgba(231, 173, 235, 0.9);\n --icon-on-info-selected: rgba(223, 167, 227, 0.9);\n --icon-diff-add-base: #9bcd97;\n --icon-diff-add-hover: #c3f9bf;\n --icon-diff-add-active: #9bcd97;\n --icon-diff-delete-base: #fc533a;\n --icon-diff-delete-hover: #f54f36;\n --icon-diff-modified-base: #ffba92;\n --syntax-comment: var(--text-weak);\n --syntax-regexp: var(--text-base);\n --syntax-string: #00ceb9;\n --syntax-keyword: var(--text-weak);\n --syntax-primitive: #ffba92;\n --syntax-operator: var(--text-weak);\n --syntax-variable: var(--text-strong);\n --syntax-property: #ff9ae2;\n --syntax-type: #ecf58c;\n --syntax-constant: #93e9f6;\n --syntax-punctuation: var(--text-weak);\n --syntax-object: var(--text-strong);\n --syntax-success: #35c02d;\n --syntax-warning: #f5b238;\n --syntax-critical: #f54f36;\n --syntax-info: #93e9f6;\n --syntax-diff-add: #9bcd97;\n --syntax-diff-delete: #faa494;\n --syntax-diff-unknown: #ff0000;\n --markdown-heading: #9d7cd8;\n --markdown-text: #eeeeee;\n --markdown-link: #fab283;\n --markdown-link-text: #56b6c2;\n --markdown-code: #7fd88f;\n --markdown-block-quote: #e5c07b;\n --markdown-emph: #e5c07b;\n --markdown-strong: #f5a742;\n --markdown-horizontal-rule: #808080;\n --markdown-list-item: #fab283;\n --markdown-list-enumeration: #56b6c2;\n --markdown-image: #fab283;\n --markdown-image-text: #56b6c2;\n --markdown-code-block: #eeeeee;\n --avatar-background-pink: #501b3f;\n --avatar-background-mint: #033a34;\n --avatar-background-orange: #5f2a06;\n --avatar-background-purple: #432155;\n --avatar-background-cyan: #0f3058;\n --avatar-background-lime: #2b3711;\n --avatar-text-pink: #e34ba9;\n --avatar-text-mint: #95f3d9;\n --avatar-text-orange: #ff802b;\n --avatar-text-purple: #9d5bd2;\n --avatar-text-cyan: #369eff;\n --avatar-text-lime: #c4f042;\n --text-stronger: rgba(255, 255, 255, 0.936);\n }\n","/* Synced from Mux frontend/src/ui/components/tool-status-title.css @ 37d6096b450cb33dfe9d7112e9d4ff75975d20b2. Do not edit; run npm run sync-styles. */\n[data-component=\"tool-status-title\"] {\n display: inline-flex;\n align-items: baseline;\n white-space: nowrap;\n text-align: start;\n\n [data-slot=\"tool-status-suffix\"] {\n display: inline-flex;\n align-items: baseline;\n white-space: nowrap;\n }\n\n [data-slot=\"tool-status-prefix\"] {\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n [data-slot=\"tool-status-swap\"],\n [data-slot=\"tool-status-tail\"] {\n display: inline-grid;\n overflow: hidden;\n justify-items: start;\n transition: width var(--tool-motion-spring-ms, 480ms) var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));\n }\n\n [data-slot=\"tool-status-active\"],\n [data-slot=\"tool-status-done\"] {\n grid-area: 1 / 1;\n white-space: nowrap;\n justify-self: start;\n text-align: start;\n transition-property: opacity, filter, transform;\n transition-duration:\n var(--tool-motion-fade-ms, 240ms), calc(var(--tool-motion-fade-ms, 240ms) * 0.8),\n calc(var(--tool-motion-fade-ms, 240ms) * 0.8);\n transition-timing-function: ease-out, ease-out, ease-out;\n }\n\n &[data-ready=\"false\"] {\n [data-slot=\"tool-status-swap\"],\n [data-slot=\"tool-status-tail\"] {\n transition-duration: 0ms;\n }\n\n [data-slot=\"tool-status-active\"],\n [data-slot=\"tool-status-done\"] {\n transition-duration: 0ms;\n }\n }\n\n [data-slot=\"tool-status-active\"] {\n opacity: 0;\n filter: blur(calc(var(--tool-motion-blur, 2px) * 0.45));\n transform: translateY(0.03em);\n }\n\n [data-slot=\"tool-status-done\"] {\n color: var(--text-strong);\n opacity: 1;\n filter: blur(0);\n transform: translateY(0);\n }\n\n &[data-active=\"true\"] {\n [data-slot=\"tool-status-active\"] {\n opacity: 1;\n filter: blur(0);\n transform: translateY(0);\n }\n\n [data-slot=\"tool-status-done\"] {\n opacity: 0;\n filter: blur(calc(var(--tool-motion-blur, 2px) * 0.45));\n transform: translateY(0.03em);\n }\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-component=\"tool-status-title\"] [data-slot=\"tool-status-swap\"],\n [data-component=\"tool-status-title\"] [data-slot=\"tool-status-tail\"] {\n transition-duration: 0ms;\n }\n\n [data-component=\"tool-status-title\"] [data-slot=\"tool-status-active\"],\n [data-component=\"tool-status-title\"] [data-slot=\"tool-status-done\"] {\n transition-duration: 0ms;\n }\n}\n","/* The embed's own layout, plus the timeline and composer rules Mux keeps in\n frontend/src/index.css or writes as Tailwind classes (composer-view.tsx).\n Values mirror Mux's; everything else comes from the synced stylesheets. */\n\n:host {\n display: block;\n height: 100%;\n min-height: 0;\n /* Mux ships Inter and IBM Plex Mono; fall back to system faces when the host page lacks them. */\n --font-family-sans: \"Inter\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n --font-family-mono: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n font: inherit;\n color: inherit;\n margin: 0;\n}\n\nbutton {\n background: none;\n border: 0;\n padding: 0;\n cursor: pointer;\n}\n\nbutton:disabled {\n cursor: default;\n}\n\n[data-component=\"icon\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n[data-component=\"mux-chat\"] {\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n background: var(--background-stronger);\n color: var(--text-base);\n font-family: var(--font-family-sans);\n font-feature-settings: var(--font-family-sans--font-feature-settings);\n font-size: var(--font-size-base);\n line-height: var(--line-height-large);\n -webkit-font-smoothing: antialiased;\n}\n\n/* ---------------------------------------------------------------- header */\n\n[data-slot=\"mux-chat-header\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: 44px;\n padding: 8px 10px 8px 18px;\n border-bottom: 1px solid var(--border-weaker-base);\n}\n\n[data-slot=\"mux-chat-heading\"] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n[data-slot=\"mux-chat-title\"] {\n color: var(--text-strong);\n font-weight: var(--font-weight-medium);\n line-height: 20px;\n}\n\n[data-slot=\"mux-chat-subtitle\"] {\n color: var(--text-weak);\n font-size: 12px;\n line-height: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-slot=\"mux-chat-status\"] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: none;\n color: var(--text-weak);\n font-size: 12px;\n line-height: 16px;\n\n &::before {\n content: \"\";\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--icon-weak-base);\n }\n\n &[data-tone=\"ok\"]::before {\n background: var(--icon-success-base);\n }\n\n &[data-tone=\"bad\"]::before {\n background: var(--icon-critical-base);\n }\n\n &[data-tone=\"ok\"] [data-slot=\"mux-chat-status-text\"] {\n display: none;\n }\n}\n\n[data-action=\"new-chat\"] {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n/* -------------------------------------------------------------- timeline */\n\n[data-component=\"message-timeline\"] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-anchor: auto;\n display: flex;\n flex-direction: column;\n padding: 16px 0;\n scrollbar-width: thin;\n}\n\n[data-component=\"message-timeline\"] [data-slot=\"session-turn-message-container\"] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding-inline: 18px;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"assistant-message\"] {\n gap: 8px;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"user-message\"] {\n line-height: var(--line-height-large);\n}\n\n[data-component=\"message-timeline\"] [data-slot=\"user-message-text\"] {\n padding: 6px 9px;\n white-space: pre-wrap;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"text-part\"] {\n width: 100%;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"text-part\"] [data-component=\"markdown\"] {\n line-height: 1.5625;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] p {\n margin-bottom: 0.75rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] :is(h1, h2, h3, h4, h5, h6) {\n margin-top: 1.5rem;\n margin-bottom: 0.5rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] :is(ul, ol) {\n margin-top: 0.375rem;\n margin-bottom: 0.75rem;\n padding-left: 1.25rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] ol {\n padding-left: 1.75rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] li {\n margin-bottom: 0.25rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] :is(blockquote, pre) {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] hr {\n margin-block: 1.5rem;\n}\n\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] > :last-child {\n margin-bottom: 0;\n}\n\n/* Tables scroll inside a narrow sidebar instead of overflowing it. */\n[data-component=\"message-timeline\"] [data-component=\"markdown\"] table {\n display: block;\n max-width: 100%;\n overflow-x: auto;\n}\n\n[data-slot=\"mux-tool-output\"] {\n padding: 8px 4px 4px;\n\n pre {\n margin: 0;\n max-height: 320px;\n overflow: auto;\n padding: 8px 12px;\n border: 1px solid var(--border-weak-base);\n border-radius: var(--radius-lg);\n background: var(--surface-raised-base);\n color: var(--text-base);\n font-family: var(--font-family-mono);\n font-size: 12px;\n line-height: 18px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n\n pre[data-status=\"error\"] {\n color: var(--text-critical-base, var(--icon-critical-base));\n }\n}\n\n[data-slot=\"mux-chat-error\"],\n[data-slot=\"mux-chat-notice\"] {\n color: var(--text-critical-base, var(--icon-critical-base));\n font-size: var(--font-size-small);\n line-height: var(--line-height-large);\n}\n\n[data-slot=\"mux-chat-notice\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 8px;\n\n > span {\n flex: 1;\n min-width: 0;\n }\n\n [data-action=\"retry\"] {\n flex: none;\n color: var(--text-strong);\n }\n}\n\n/* ----------------------------------------------------------- empty state */\n\n[data-slot=\"mux-chat-empty\"] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-block: auto;\n padding: 24px 18px;\n}\n\n[data-slot=\"mux-chat-empty-title\"] {\n color: var(--text-strong);\n font-size: var(--font-size-large);\n font-weight: var(--font-weight-medium);\n line-height: 24px;\n}\n\n[data-slot=\"mux-chat-empty-subtitle\"] {\n color: var(--text-weak);\n}\n\n[data-slot=\"mux-chat-suggestions\"] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n margin-top: 10px;\n}\n\n[data-slot=\"mux-chat-suggestion\"] {\n max-width: 100%;\n padding: 6px 12px;\n border: 1px solid var(--border-weak-base);\n border-radius: 9999px;\n background: var(--surface-raised-base);\n color: var(--text-base);\n font-size: var(--font-size-small);\n line-height: 20px;\n text-align: start;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n\n &:hover {\n background: var(--surface-raised-base-hover);\n border-color: var(--border-base);\n }\n}\n\n/* --------------------------------------------------------- dock/composer */\n\n[data-slot=\"mux-chat-dock\"] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 8px;\n}\n\n[data-component=\"prompt-composer-surface\"] {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: clip;\n border: 1px solid var(--border-weak-base);\n border-bottom-width: 0;\n border-radius: 16px 16px 0 0;\n --prompt-composer-fill: var(--surface-raised-stronger-non-alpha);\n background: var(--prompt-composer-fill);\n\n &:focus-within {\n border-color: var(--border-base);\n }\n\n &[aria-busy=\"true\"] {\n pointer-events: none;\n }\n\n > [data-dock-surface=\"shell\"] {\n border-radius: 0;\n box-shadow: none;\n background: transparent;\n }\n\n > [data-component=\"prompt-controls\"] {\n margin-top: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n }\n}\n\n[data-component=\"prompt-input-shell\"] {\n flex: none;\n min-height: 32px;\n}\n\n[data-component=\"prompt-input-scroll\"] {\n position: relative;\n max-height: 240px;\n overflow-y: auto;\n scrollbar-width: none;\n}\n\n[data-component=\"prompt-input\"] {\n display: block;\n width: 100%;\n min-height: 30px;\n resize: none;\n border: 0;\n outline: none;\n background: transparent;\n padding: 8px 16px var(--prompt-inset);\n color: var(--text-strong);\n font-size: 13px;\n line-height: 20px;\n\n &::placeholder {\n color: var(--text-weaker);\n }\n}\n\n[data-component=\"prompt-controls-inner\"] {\n padding: 1px 10px;\n}\n\n[data-component=\"prompt-control-row\"] {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n min-height: 36px;\n}\n\n[data-component=\"prompt-control-left\"] {\n display: flex;\n align-items: center;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n[data-component=\"prompt-control-right\"] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n margin-left: auto;\n}\n\n[data-component=\"prompt-model-control\"] {\n position: relative;\n min-width: 0;\n max-width: 14rem;\n display: flex;\n align-items: center;\n}\n\n[data-action=\"prompt-model\"] {\n appearance: none;\n field-sizing: content;\n height: 28px;\n min-width: 0;\n max-width: 100%;\n padding: 0 22px 0 8px;\n border: 0;\n border-radius: var(--radius-md);\n background: transparent;\n color: var(--text-base);\n font-size: var(--font-size-small);\n font-weight: var(--font-weight-medium);\n text-overflow: ellipsis;\n cursor: pointer;\n transition: background-color 0.15s ease;\n\n &:hover:not(:disabled) {\n background: var(--surface-base-hover);\n }\n\n &:focus-visible {\n outline: none;\n box-shadow: var(--shadow-xs-border-focus);\n }\n\n option,\n optgroup {\n background: var(--background-stronger);\n color: var(--text-base);\n }\n}\n\n[data-slot=\"prompt-model-chevron\"] {\n position: absolute;\n right: 6px;\n display: inline-flex;\n color: var(--icon-weak-base);\n pointer-events: none;\n}\n\n[data-component=\"prompt-submit-control\"] {\n display: flex;\n width: 28px;\n height: 28px;\n flex: none;\n align-items: center;\n justify-content: center;\n}\n\n[data-action=\"prompt-submit\"] {\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n}\n\n/* ---------------------------------------------------------- question dock */\n\n[data-component=\"mux-question\"],\n[data-component=\"mux-permission\"] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--border-weak-base);\n border-radius: 12px;\n background: var(--surface-raised-stronger-non-alpha);\n}\n\n[data-component=\"mux-permission\"] {\n gap: 8px;\n}\n\n[data-slot=\"mux-permission-patterns\"] {\n max-height: 96px;\n overflow: auto;\n padding: 6px 8px;\n border-radius: var(--radius-md);\n background: var(--surface-inset-base);\n color: var(--text-base);\n font-family: var(--font-family-mono);\n font-size: 12px;\n line-height: 18px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n[data-slot=\"mux-question-item\"] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n[data-slot=\"mux-question-header\"] {\n color: var(--text-weak);\n font-size: 12px;\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n\n[data-slot=\"mux-question-text\"] {\n color: var(--text-strong);\n font-weight: var(--font-weight-medium);\n}\n\n[data-slot=\"mux-question-options\"] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n[data-slot=\"mux-question-option\"] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n padding: 8px 10px;\n border: 1px solid var(--border-weak-base);\n border-radius: var(--radius-lg);\n text-align: start;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n\n &:hover {\n background: var(--surface-base-hover);\n }\n\n &[aria-checked=\"true\"] {\n border-color: var(--border-selected);\n background: var(--surface-base-interactive-active);\n }\n}\n\n[data-slot=\"mux-question-option-description\"] {\n color: var(--text-weak);\n font-size: var(--font-size-small);\n}\n\n[data-slot=\"mux-question-custom\"] {\n height: 34px;\n padding: 0 10px;\n border: 1px solid var(--border-weak-base);\n border-radius: var(--radius-lg);\n background: transparent;\n outline: none;\n\n &:focus {\n border-color: var(--border-base);\n }\n}\n\n[data-slot=\"mux-question-actions\"] {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n}\n\n[data-slot=\"mux-button\"] {\n height: 30px;\n padding: 0 12px;\n border-radius: var(--radius-md);\n font-size: var(--font-size-small);\n font-weight: var(--font-weight-medium);\n\n &[data-variant=\"ghost\"]:hover {\n background: var(--surface-base-hover);\n }\n\n &[data-variant=\"primary\"] {\n background: var(--icon-strong-base);\n color: var(--icon-invert-base);\n }\n\n &[data-variant=\"primary\"]:disabled {\n background: var(--icon-strong-disabled);\n }\n}\n","import animations from \"./styles/mux/animations.css?inline\"\nimport basicTool from \"./styles/mux/basic-tool.css?inline\"\nimport collapsible from \"./styles/mux/collapsible.css?inline\"\nimport dockSurface from \"./styles/mux/dock-surface.css?inline\"\nimport iconButton from \"./styles/mux/icon-button.css?inline\"\nimport markdown from \"./styles/mux/markdown.css?inline\"\nimport messagePart from \"./styles/mux/message-part.css?inline\"\nimport sessionTurn from \"./styles/mux/session-turn.css?inline\"\nimport spinner from \"./styles/mux/spinner.css?inline\"\nimport textShimmer from \"./styles/mux/text-shimmer.css?inline\"\nimport theme from \"./styles/mux/theme.css?inline\"\nimport toolStatusTitle from \"./styles/mux/tool-status-title.css?inline\"\nimport chat from \"./styles/chat.css?inline\"\n\n/** Mux's stylesheets in its cascade order, then the embed's layout on top. */\nexport const styles = [theme, animations, iconButton, spinner, collapsible, basicTool, textShimmer, toolStatusTitle, dockSurface, markdown, messagePart, sessionTurn, chat].join(\"\\n\")\n","// Pure view-model rules for the chat UI: which parts render, how tool rows\n// are titled, and which model is selected. Kept free of Solid and the DOM.\nimport type { Part, ProviderInventory, ToolPart, ToolState } from \"@rohansguliani/mux-chat-core\"\n\nexport type ModelOption = { value: string; label: string }\nexport type ModelGroup = { id: string; label: string; models: ModelOption[] }\n\n/** Connected providers and their models, in runtime order. */\nexport function modelGroups(inventory: ProviderInventory): ModelGroup[] {\n return inventory.all\n .filter((provider) => inventory.connected.includes(provider.id))\n .map((provider) => ({\n id: provider.id,\n label: provider.name || provider.id,\n models: Object.values(provider.models).map((model) => ({ value: `${provider.id}/${model.id}`, label: model.name || model.id })),\n }))\n .filter((group) => group.models.length > 0)\n}\n\n/**\n * The model to use: the user's stored pick, else the app's preference, else a\n * connected provider's default, else the first available. `undefined` when\n * nothing is available.\n */\nexport function chooseModel(groups: ModelGroup[], inventory: ProviderInventory, stored?: string, preferred?: string): string | undefined {\n const available = new Set(groups.flatMap((group) => group.models.map((model) => model.value)))\n const defaults = inventory.connected.map((id) => (inventory.default[id] ? `${id}/${inventory.default[id]}` : \"\"))\n return [stored, preferred, ...defaults, groups[0]?.models[0]?.value].find((value): value is string => !!value && available.has(value))\n}\n\nexport function parseModel(value: string | undefined) {\n const slash = value?.indexOf(\"/\") ?? -1\n return value && slash > 0 ? { providerID: value.slice(0, slash), modelID: value.slice(slash + 1) } : undefined\n}\n\n/** Parts a reader sees, in order: text, non-empty reasoning, and tool calls. */\nexport function visibleParts(parts: readonly Part[]): Part[] {\n return parts.filter((part) =>\n (part.type === \"text\" && !part.synthetic && !part.ignored && part.text.trim() !== \"\") ||\n (part.type === \"reasoning\" && part.text.trim() !== \"\") ||\n part.type === \"tool\")\n}\n\nconst BUILTIN_TOOLS: Record<string, string> = { websearch: \"Searching the web\", webfetch: \"Reading page\", question: \"Question\" }\n\n/** \"add_to_watchlist\" → \"Add to watchlist\". */\nexport const humanize = (name: string) => {\n const words = name.replace(/[_-]+/g, \" \").trim()\n return words ? words[0]!.toUpperCase() + words.slice(1) : name\n}\n\nexport function toolTitle(tool: string, labels: Record<string, string> = {}): string {\n return labels[tool] ?? BUILTIN_TOOLS[tool] ?? humanize(tool)\n}\n\nconst INPUT_KEYS = [\"description\", \"query\", \"url\", \"name\", \"symbol\", \"watchlist\", \"path\", \"pattern\"]\n\n/** One line under the tool name: the tool's own title once it has one, else its most telling input. */\nexport function toolSubtitle(state: ToolState): string {\n if ((state.status === \"completed\" || state.status === \"running\") && state.title) return state.title\n const input = state.input ?? {}\n for (const key of INPUT_KEYS) {\n const value = input[key]\n if (typeof value === \"string\" && value) return value\n }\n for (const value of Object.values(input)) {\n if (typeof value === \"string\" && value) return value\n if (Array.isArray(value) && value.length && value.every((item) => typeof item === \"string\")) return value.join(\", \")\n }\n return \"\"\n}\n\nexport const toolActive = (part: ToolPart) => part.state.status === \"pending\" || part.state.status === \"running\"\n\nexport function toolDetail(state: ToolState): string {\n if (state.status === \"error\") return state.error\n if (state.status === \"completed\") return state.output\n if (state.status === \"running\") return state.output ?? \"\"\n return \"\"\n}\n\nexport const seconds = (start: number, end: number) => `${Math.max(0, (end - start) / 1000).toFixed(1)}s`\n\nexport const sameIDs = (a: readonly string[], b: readonly string[]) => a.length === b.length && a.every((id, index) => id === b[index])\n","// The chat's state and actions as Solid signals, on top of chat-core. It owns\n// the grant lifecycle, the session (resume, new chat), the model choice, and\n// the tool-result callback; the views only render what it exposes.\nimport {\n createAppClient,\n createChatSession,\n createMemoryStore,\n createRuntimeTransport,\n isSessionStreaming,\n sessionPermissions,\n sessionQuestions,\n sessionTurns,\n textSubmission,\n type ChatSessionView,\n type ChatState,\n type ChatTool,\n type PermissionRequest,\n type ProviderInventory,\n type QuestionRequest,\n type Turn,\n} from \"@rohansguliani/mux-chat-core\"\nimport { batch, createEffect, createMemo, createSignal, on, onCleanup, untrack } from \"solid-js\"\nimport { chooseModel, modelGroups, parseModel, sameIDs, type ModelGroup } from \"./model.js\"\n\nexport type { ChatGrant, ChatTool } from \"@rohansguliani/mux-chat-core\"\n\n/**\n * A tool call that finished while the chat was open. `readOnly` comes from\n * the app's tool definitions (built-in tools such as web search are read-only),\n * so `!readOnly` means the call may have changed app data.\n */\nexport type ToolResult = { tool: string; title?: string; input: Record<string, unknown>; output: string; sessionID: string; readOnly: boolean }\n\nexport type ControllerOptions = {\n /** Where the app mounts `mux.handle`. */\n url: string\n agent: string\n sessionTitle: string\n storageKey: string\n preferredModel?: string\n onToolResult?: (result: ToolResult) => void\n}\n\nexport type Status = { tone: \"ok\" | \"busy\" | \"bad\"; text: string }\n\n/**\n * What happened to a message: delivered; shown but unconfirmed (it stays in\n * the transcript and `retry()` completes it); or not delivered at all, so the\n * caller still owns the text.\n */\nexport type SendResult = \"sent\" | \"unconfirmed\" | \"failed\"\n\nconst idle: ChatSessionView = { connected: false, ready: false, historyLoading: false, historyError: \"\", snapshotError: \"\", error: \"\", ended: false }\n\nconst storage = {\n get(key: string) {\n try { return localStorage.getItem(key) ?? undefined } catch { return undefined }\n },\n set(key: string, value: string | undefined) {\n try { if (value === undefined) localStorage.removeItem(key); else localStorage.setItem(key, value) } catch { /* storage disabled */ }\n },\n}\n\nexport function createChatController(options: ControllerOptions) {\n let disposed = false\n const app = createAppClient({ url: options.url })\n const { client } = app\n const store = createMemoryStore()\n const [state, setState] = createSignal<ChatState>(store.state())\n const [view, setView] = createSignal<ChatSessionView>(idle)\n const [sessionID, setSessionID] = createSignal<string>()\n const [notice, setNotice] = createSignal<string>()\n const [grantError, setGrantError] = createSignal<string>()\n const [tools, setTools] = createSignal<ReadonlyMap<string, ChatTool>>(new Map())\n const [inventory, setInventory] = createSignal<ProviderInventory>()\n const [offline, setOffline] = createSignal(false)\n const [delivering, setDelivering] = createSignal(false)\n const describe = (error: unknown) => (error instanceof Error ? error.message : String(error))\n const report = (error: unknown) => setNotice(describe(error))\n\n const connect = (workspaceID: string) => createChatSession({ store, transport: createRuntimeTransport(client, { workspaceID }) })\n let session: ReturnType<typeof connect> | undefined\n // Streaming deltas can outpace the display; publish at most once per frame.\n let frame: number | undefined\n const publish = () => {\n if (frame !== undefined || disposed) return\n frame = requestAnimationFrame(() => {\n frame = undefined\n batch(() => {\n setState(store.state())\n setView(session ? session.view() : idle)\n })\n })\n }\n const unsubscribe = store.subscribe(publish)\n\n const timers = new Map<string, ReturnType<typeof setTimeout>>()\n const schedule = (name: string, ms: number, run: () => void) => {\n clearTimeout(timers.get(name))\n timers.set(name, setTimeout(() => { timers.delete(name); if (!disposed) run() }, ms))\n }\n onCleanup(() => {\n disposed = true\n for (const timer of timers.values()) clearTimeout(timer)\n if (frame !== undefined) cancelAnimationFrame(frame)\n unsubscribe()\n session?.dispose()\n })\n\n const fetchGrant = async () => {\n const next = await app.refreshGrant()\n if (!next?.token || !next.workspaceID) throw new Error(\"Chat is unavailable (invalid grant)\")\n setTools(new Map((next.tools ?? []).map((tool) => [tool.name, tool])))\n setGrantError(undefined)\n // Renew at 80% of its life; the event stream reconnects with the new grant.\n schedule(\"grant\", Math.max(10_000, (next.expiresAt - Date.now()) * 0.8), () => void renew(0))\n }\n // Keeps trying through an outage (backing off to a minute), so the chat is\n // never left holding an expired grant.\n const renew = async (attempt: number) => {\n try {\n await fetchGrant()\n } catch (error) {\n setGrantError(describe(error))\n schedule(\"grant\", Math.min(60_000, 15_000 * 2 ** attempt), () => void renew(attempt + 1))\n }\n }\n\n const sessionKey = () => `${options.storageKey}:session:${app.grant()?.workspaceID}`\n const modelKey = `${options.storageKey}:model`\n\n const open = async (resume: string | undefined) => {\n const opened = await client.openSession({ workspaceID: app.grant()!.workspaceID, sessionID: resume, title: options.sessionTitle })\n if (disposed) return\n storage.set(sessionKey(), opened.session.id)\n session?.dispose()\n session = connect(opened.workspaceID)\n session.subscribe(publish)\n setSessionID(opened.session.id)\n session.start(opened.session.id)\n publish()\n }\n\n const loadModels = async () => {\n try {\n setInventory(await client.providers())\n setOffline(false)\n } catch (error) {\n console.warn(\"[mux-chat]\", error)\n setOffline(true)\n schedule(\"models\", 15_000, () => void loadModels())\n }\n }\n\n const boot = async () => {\n try {\n await fetchGrant()\n } catch (error) {\n setGrantError(describe(error))\n schedule(\"boot\", 15_000, () => void boot())\n return\n }\n try {\n await open(storage.get(sessionKey()))\n setNotice(undefined)\n void loadModels()\n } catch (error) {\n report(error)\n schedule(\"boot\", 15_000, () => void boot())\n }\n }\n void boot()\n\n const turns = createMemo<Turn[]>(() => { const id = sessionID(); return id ? sessionTurns(state(), id) : [] })\n const turnsByID = createMemo(() => new Map(turns().map((turn) => [turn.message.id, turn])))\n const messageIDs = createMemo(() => turns().map((turn) => turn.message.id), [] as string[], { equals: sameIDs })\n const streaming = createMemo(() => { const id = sessionID(); return !!id && isSessionStreaming(state(), id) })\n const questions = createMemo<readonly QuestionRequest[]>(() => { const id = sessionID(); return id ? sessionQuestions(state(), id) : [] })\n const permissions = createMemo<readonly PermissionRequest[]>(() => { const id = sessionID(); return id ? sessionPermissions(state(), id) : [] })\n\n // Report tool calls that finish while the chat is open; history loaded on\n // open is marked seen without reporting.\n const seen = new Set<string>()\n let live = false\n createEffect(on(turns, (current) => {\n for (const turn of current) {\n for (const part of turn.parts) {\n if (part.type !== \"tool\" || part.state.status !== \"completed\" || seen.has(part.id)) continue\n seen.add(part.id)\n if (live) {\n options.onToolResult?.({\n tool: part.tool,\n title: part.state.title,\n input: part.state.input,\n output: part.state.output,\n sessionID: part.sessionID,\n // Tools the app did not define are the runtime's own (web search and the like).\n readOnly: tools().get(part.tool)?.readOnly ?? true,\n })\n }\n }\n }\n if (untrack(view).ready) live = true\n }))\n\n const [modelValue, setModelValue] = createSignal(storage.get(modelKey) ?? \"\")\n const selectModel = (value: string) => {\n setModelValue(value)\n storage.set(modelKey, value)\n }\n const groups = createMemo<ModelGroup[]>(() => { const inv = inventory(); return inv ? modelGroups(inv) : [] })\n createEffect(on(groups, (current) => {\n const inv = inventory()\n if (!inv || !current.length) return\n const choice = chooseModel(current, inv, untrack(modelValue), options.preferredModel)\n if (choice && choice !== untrack(modelValue)) selectModel(choice)\n }))\n\n const status = createMemo<Status>(() => {\n if (offline()) return { tone: \"bad\", text: \"Offline\" }\n if (inventory() && !groups().length) return { tone: \"bad\", text: \"No models available\" }\n const current = view()\n if (current.connected) return { tone: \"ok\", text: \"Connected\" }\n return current.ready ? { tone: \"bad\", text: \"Reconnecting…\" } : { tone: \"busy\", text: \"Connecting…\" }\n })\n\n const withSession = (action: (id: string) => Promise<unknown>) => async () => {\n const id = sessionID()\n if (!id) return\n try { await action(id) } catch (error) { report(error) }\n }\n type Submission = Parameters<NonNullable<typeof session>[\"send\"]>[0]\n const deliver = async (target: NonNullable<typeof session>, submission: Submission) => {\n setDelivering(true)\n try { return await target.send(submission) } finally { setDelivering(false) }\n }\n\n return {\n /** Changes once per rendered frame while the transcript updates. */\n changes: state,\n sessionID,\n /** Labels from the app's tool definitions. */\n toolLabels: createMemo(() => Object.fromEntries([...tools()].flatMap(([name, tool]) => (tool.label ? [[name, tool.label]] : [])))) as () => Record<string, string>,\n messageIDs,\n turn: (id: string) => turnsByID().get(id),\n questions,\n permissions,\n streaming,\n ready: () => view().ready,\n view,\n status,\n error: () => view().error || view().snapshotError || grantError() || notice() || \"\",\n /** A message is shown but its delivery was not confirmed; `retry()` completes it. */\n unconfirmed: () => !!view().pending && !delivering(),\n modelGroups: groups,\n modelValue,\n selectModel,\n async send(text: string): Promise<SendResult> {\n const target = session\n const id = sessionID()\n const trimmed = text.trim()\n if (!target || !id || !trimmed || !view().ready) return \"failed\"\n setNotice(undefined)\n // An unconfirmed message goes first, so it is neither lost nor overtaken.\n const pending = target.view().pending\n if (pending && !(await deliver(target, pending))) return \"failed\"\n const submission = textSubmission({ sessionID: id, text: trimmed, agent: options.agent, model: parseModel(modelValue()) })\n if (await deliver(target, submission)) return \"sent\"\n return target.view().pending === submission ? \"unconfirmed\" : \"failed\"\n },\n async retry() {\n const target = session\n const pending = target?.view().pending\n if (target && pending && !delivering()) await deliver(target, pending)\n },\n abort: withSession((id) => client.abort(id)),\n answer: (requestID: string, answers: string[][]) => withSession(() => client.answerQuestion(requestID, answers))(),\n reject: (requestID: string) => withSession(() => client.rejectQuestion(requestID))(),\n replyPermission: (requestID: string, response: \"once\" | \"always\" | \"reject\") => withSession((id) => client.replyPermission(id, requestID, response))(),\n /** Loads the next older page of history, if any. */\n older: () => { if (view().cursor && !view().historyLoading) void session?.older() },\n async newChat() {\n if (!app.grant()) return\n try {\n session?.dispose()\n session = undefined\n setSessionID(undefined)\n setView(idle)\n await open(undefined)\n } catch (error) { report(error) }\n },\n }\n}\n\nexport type ChatController = ReturnType<typeof createChatController>\n","import createDOMPurify from \"dompurify\"\nimport { Marked } from \"marked\"\n\n// Private instances: the host app's own marked/DOMPurify configuration and\n// hooks are neither used nor changed.\nconst marked = new Marked({ gfm: true, breaks: false })\nlet purify: ReturnType<typeof createDOMPurify> | undefined\n\nfunction sanitizer() {\n if (!purify) {\n purify = createDOMPurify(window)\n purify.addHook(\"afterSanitizeAttributes\", (node) => {\n if (node.tagName === \"A\" && node.getAttribute(\"href\")) {\n node.setAttribute(\"target\", \"_blank\")\n node.setAttribute(\"rel\", \"noopener noreferrer\")\n }\n })\n }\n return purify\n}\n\n/** Model output as sanitized HTML. */\nexport function renderMarkdown(text: string): string {\n return sanitizer().sanitize(marked.parse(text, { async: false }) as string)\n}\n","import { createEffect, createSignal, onCleanup } from \"solid-js\"\n\nconst SWAP_MS = 220\n\n/** Mux's text shimmer (ui/components/text-shimmer): an animated sweep while `active`. */\nexport function TextShimmer(props: { text: string; active: boolean; offset?: number }) {\n const [run, setRun] = createSignal(props.active)\n let timer: ReturnType<typeof setTimeout> | undefined\n createEffect(() => {\n clearTimeout(timer)\n if (props.active) setRun(true)\n else timer = setTimeout(() => setRun(false), SWAP_MS)\n })\n onCleanup(() => clearTimeout(timer))\n return (\n <span\n data-component=\"text-shimmer\"\n data-active={props.active ? \"true\" : \"false\"}\n aria-label={props.text}\n style={{ \"--text-shimmer-swap\": `${SWAP_MS}ms`, \"--text-shimmer-index\": `${props.offset ?? 0}` }}\n >\n <span data-slot=\"text-shimmer-char\">\n <span data-slot=\"text-shimmer-char-base\" aria-hidden=\"true\">{props.text}</span>\n <span data-slot=\"text-shimmer-char-shimmer\" data-run={run() ? \"true\" : \"false\"} aria-hidden=\"true\">{props.text}</span>\n </span>\n </span>\n )\n}\n\nconst svg = (path: string, filled = false) => () => (\n <span data-component=\"icon\" data-size=\"small\">\n <svg data-slot=\"icon-svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill={filled ? \"currentColor\" : \"none\"} stroke={filled ? \"none\" : \"currentColor\"} stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d={path} />\n </svg>\n </span>\n)\n\nexport const ChevronDown = svg(\"M4 6l4 4 4-4\")\nexport const ArrowUp = svg(\"M8 13V3.5M3.5 8 8 3.5 12.5 8\")\nexport const Stop = svg(\"M4.5 4.5h7v7h-7z\", true)\nexport const Plus = svg(\"M8 3v10M3 8h10\")\n","// Transcript parts with Mux's markup, so Mux's own stylesheets render them:\n// text and reasoning parts (message-part.css, markdown.css) and tool calls as\n// activity rows (ui/components/basic-tool + collapsible).\nimport type { Part, ReasoningPart, TextPart, ToolPart } from \"@rohansguliani/mux-chat-core\"\nimport { createMemo, createSignal, Match, Show, Switch, type JSX } from \"solid-js\"\nimport { renderMarkdown } from \"../markdown.js\"\nimport { seconds, toolActive, toolDetail, toolSubtitle, toolTitle } from \"../model.js\"\nimport { ChevronDown, TextShimmer } from \"./primitives.jsx\"\n\n/** One collapsible activity row (Mux BasicTool). */\nexport function ActivityRow(props: { title: string; subtitle?: string; active: boolean; name?: string; status?: string; children?: JSX.Element }) {\n const [open, setOpen] = createSignal(false)\n const expandable = () => props.children !== undefined\n return (\n <div\n data-component=\"collapsible\"\n data-variant=\"normal\"\n class=\"tool-collapsible\"\n data-tool={props.name}\n data-status={props.status}\n data-expanded={open() ? \"\" : undefined}\n data-closed={open() ? undefined : \"\"}\n >\n <button type=\"button\" data-slot=\"collapsible-trigger\" aria-expanded={open()} disabled={!expandable()} onClick={() => setOpen(!open())}>\n <div data-component=\"tool-trigger\" data-layout=\"activity-row\">\n <div data-slot=\"basic-tool-tool-trigger-content\">\n <div data-slot=\"basic-tool-tool-info\">\n <div data-slot=\"basic-tool-tool-info-structured\">\n <div data-slot=\"basic-tool-tool-info-main\">\n <span data-slot=\"basic-tool-tool-title\"><TextShimmer text={props.title} active={props.active} /></span>\n <span data-slot=\"basic-tool-tool-detail\" dir=\"ltr\">\n <Show when={props.subtitle}>{(subtitle) => <span data-slot=\"basic-tool-tool-subtitle\">{subtitle()}</span>}</Show>\n </span>\n </div>\n </div>\n </div>\n </div>\n <Show when={expandable()}>\n <div data-slot=\"collapsible-arrow\" data-size=\"compact\"><span data-slot=\"collapsible-arrow-icon\"><ChevronDown /></span></div>\n </Show>\n </div>\n </button>\n <Show when={open() && expandable()}>\n <div data-slot=\"collapsible-content\" data-expanded=\"\">{props.children}</div>\n </Show>\n </div>\n )\n}\n\nfunction ToolRow(props: { part: ToolPart; labels: Record<string, string> }) {\n const detail = createMemo(() => toolDetail(props.part.state).slice(0, 20_000))\n return (\n <ActivityRow title={toolTitle(props.part.tool, props.labels)} subtitle={toolSubtitle(props.part.state)} active={toolActive(props.part)} name={props.part.tool} status={props.part.state.status}>\n {detail() ? (\n <div data-slot=\"mux-tool-output\">\n <pre data-status={props.part.state.status}>{detail()}</pre>\n </div>\n ) : undefined}\n </ActivityRow>\n )\n}\n\nfunction ReasoningRow(props: { part: ReasoningPart; live: boolean }) {\n const active = () => props.live && props.part.time?.end === undefined\n const duration = () => (props.part.time?.end ? seconds(props.part.time.start, props.part.time.end) : undefined)\n return (\n <ActivityRow title={active() ? \"Thinking\" : \"Thought\"} subtitle={duration()} active={active()} name=\"reasoning\">\n <div data-component=\"reasoning-part\">\n <div data-component=\"markdown\" innerHTML={renderMarkdown(props.part.text)} />\n </div>\n </ActivityRow>\n )\n}\n\nexport function TextPartView(props: { part: TextPart }) {\n return (\n <div data-component=\"text-part\">\n <div data-component=\"markdown\" innerHTML={renderMarkdown(props.part.text)} />\n </div>\n )\n}\n\nexport function PartView(props: { part: Part; live: boolean; labels: Record<string, string> }) {\n return (\n <Switch>\n <Match when={props.part.type === \"text\" && (props.part as TextPart)}>{(part) => <TextPartView part={part()} />}</Match>\n <Match when={props.part.type === \"reasoning\" && (props.part as ReasoningPart)}>{(part) => <ReasoningRow part={part()} live={props.live} />}</Match>\n <Match when={props.part.type === \"tool\" && (props.part as ToolPart)}>{(part) => <ToolRow part={part()} labels={props.labels} />}</Match>\n </Switch>\n )\n}\n","import type { PermissionRequest, QuestionRequest, Turn } from \"@rohansguliani/mux-chat-core\"\nimport { createComputed, createEffect, createMemo, createSignal, For, on, onCleanup, Show } from \"solid-js\"\nimport { createChatController, type ToolResult } from \"../controller.js\"\nimport { sameIDs, visibleParts } from \"../model.js\"\nimport { ActivityRow, PartView } from \"./parts.jsx\"\nimport { ArrowUp, ChevronDown, Plus, Stop } from \"./primitives.jsx\"\n\nexport type ResolvedOptions = {\n url: string\n title: string\n subtitle?: string\n placeholder: string\n suggestions: Array<{ label: string; prompt: string }>\n toolLabels: Record<string, string>\n agent: string\n sessionTitle: string\n storageKey: string\n preferredModel?: string\n onToolResult?: (result: ToolResult) => void\n}\n\nexport type ChatAPI = { send(text: string): Promise<boolean>; focus(): void; newChat(): Promise<void> }\n\nfunction TurnView(props: { turn: () => Turn | undefined; streaming: () => boolean; labels: Record<string, string> }) {\n const message = () => props.turn()?.message\n const parts = createMemo(() => visibleParts(props.turn()?.parts ?? []))\n const ids = createMemo(() => parts().map((part) => part.id), [] as string[], { equals: sameIDs })\n const byID = createMemo(() => new Map(parts().map((part) => [part.id, part])))\n const live = createMemo(() => { const m = message(); return m?.role === \"assistant\" && m.time.completed === undefined && props.streaming() })\n const error = () => {\n const m = message()\n const failure = m?.role === \"assistant\" ? m.error : undefined\n return failure && failure.name !== \"MessageAbortedError\" ? failure.data?.message ?? failure.name : undefined\n }\n const userText = () => (props.turn()?.parts ?? []).flatMap((part) => (part.type === \"text\" && !part.synthetic ? [part.text] : [])).join(\"\\n\")\n return (\n <Show when={message()}>\n {(m) => (\n <Show\n when={m().role === \"assistant\"}\n fallback={\n <div data-component=\"user-message\" data-message-id={m().id}>\n <div data-slot=\"user-message-body\"><div data-slot=\"user-message-text\">{userText()}</div></div>\n </div>\n }\n >\n <div data-component=\"assistant-message\" data-message-id={m().id} data-live={live() ? \"\" : undefined}>\n <For each={ids()}>{(id) => <Show when={byID().get(id)}>{(part) => <PartView part={part()} live={live()} labels={props.labels} />}</Show>}</For>\n <Show when={live() && !ids().length}><ActivityRow title=\"Thinking\" active={true} name=\"thinking\" /></Show>\n <Show when={error()}>{(text) => <div data-slot=\"mux-chat-error\" role=\"alert\">{text()}</div>}</Show>\n </div>\n </Show>\n )}\n </Show>\n )\n}\n\nfunction QuestionDock(props: { request: QuestionRequest; onAnswer: (answers: string[][]) => void; onSkip: () => void }) {\n const [answers, setAnswers] = createSignal<string[][]>(props.request.questions.map(() => []))\n const set = (index: number, value: string[]) => setAnswers((previous) => previous.map((current, i) => (i === index ? value : current)))\n const toggle = (index: number, label: string, multiple: boolean) => {\n const current = answers()[index] ?? []\n set(index, multiple ? (current.includes(label) ? current.filter((value) => value !== label) : [...current, label]) : [label])\n }\n return (\n <div data-component=\"mux-question\" data-dock-surface=\"shell\" role=\"group\" aria-label=\"Question from the assistant\">\n <For each={props.request.questions}>\n {(question, index) => (\n <div data-slot=\"mux-question-item\">\n <Show when={question.header}><div data-slot=\"mux-question-header\">{question.header}</div></Show>\n <div data-slot=\"mux-question-text\">{question.question}</div>\n <div data-slot=\"mux-question-options\" role={question.multiple ? \"group\" : \"radiogroup\"}>\n <For each={question.options}>\n {(option) => (\n <button\n type=\"button\"\n data-slot=\"mux-question-option\"\n role={question.multiple ? \"checkbox\" : \"radio\"}\n aria-checked={answers()[index()]?.includes(option.label) ?? false}\n onClick={() => toggle(index(), option.label, !!question.multiple)}\n >\n <span data-slot=\"mux-question-option-label\">{option.label}</span>\n <Show when={option.description}><span data-slot=\"mux-question-option-description\">{option.description}</span></Show>\n </button>\n )}\n </For>\n </div>\n <Show when={question.custom !== false}>\n <input data-slot=\"mux-question-custom\" placeholder=\"Or type your own answer\" onInput={(event) => set(index(), event.currentTarget.value.trim() ? [event.currentTarget.value.trim()] : [])} />\n </Show>\n </div>\n )}\n </For>\n <div data-slot=\"mux-question-actions\">\n <button type=\"button\" data-slot=\"mux-button\" data-variant=\"ghost\" onClick={() => props.onSkip()}>Skip</button>\n <button type=\"button\" data-slot=\"mux-button\" data-variant=\"primary\" disabled={!answers().every((answer) => answer.length > 0)} onClick={() => props.onAnswer(answers())}>Answer</button>\n </div>\n </div>\n )\n}\n\nfunction PermissionDock(props: { request: PermissionRequest; onReply: (response: \"once\" | \"always\" | \"reject\") => void }) {\n const patterns = () => (props.request.patterns ?? []).filter(Boolean)\n // One answer per request; the dock goes away when the runtime confirms it.\n const [replied, setReplied] = createSignal(false)\n const reply = (response: \"once\" | \"always\" | \"reject\") => {\n if (replied()) return\n setReplied(true)\n props.onReply(response)\n }\n return (\n <div data-component=\"mux-permission\" data-dock-surface=\"shell\" role=\"group\" aria-label=\"Permission request from the assistant\">\n <div data-slot=\"mux-question-header\">Permission</div>\n <div data-slot=\"mux-question-text\">The assistant wants to use {props.request.permission ?? \"a tool\"}.</div>\n <Show when={patterns().length}><div data-slot=\"mux-permission-patterns\">{patterns().join(\"\\n\")}</div></Show>\n <div data-slot=\"mux-question-actions\">\n <button type=\"button\" data-slot=\"mux-button\" data-variant=\"ghost\" data-reply=\"reject\" disabled={replied()} onClick={() => reply(\"reject\")}>Deny</button>\n <button type=\"button\" data-slot=\"mux-button\" data-variant=\"ghost\" data-reply=\"always\" disabled={replied()} onClick={() => reply(\"always\")}>Always allow</button>\n <button type=\"button\" data-slot=\"mux-button\" data-variant=\"primary\" data-reply=\"once\" disabled={replied()} onClick={() => reply(\"once\")}>Allow once</button>\n </div>\n </div>\n )\n}\n\nexport function Chat(props: { options: ResolvedOptions; api: (api: ChatAPI) => void }) {\n const options = props.options\n const chat = createChatController({\n url: options.url,\n agent: options.agent,\n sessionTitle: options.sessionTitle,\n storageKey: options.storageKey,\n preferredModel: options.preferredModel,\n onToolResult: options.onToolResult,\n })\n let timeline!: HTMLDivElement\n let input!: HTMLTextAreaElement\n const [draft, setDraft] = createSignal(\"\")\n // Tool names in the transcript: the app's tool definitions, overridable per mount.\n const labels = createMemo(() => ({ ...chat.toolLabels(), ...options.toolLabels }))\n\n const grow = () => {\n input.style.height = \"auto\"\n input.style.height = `${Math.min(input.scrollHeight, 240)}px`\n }\n const clear = () => {\n input.value = \"\"\n setDraft(\"\")\n grow()\n }\n const restore = (text: string) => {\n input.value = text\n setDraft(text)\n grow()\n }\n /** Sends `text`; text that was not delivered (and is not shown as pending) goes back into an empty composer. */\n const sendText = async (text: string) => {\n const result = await chat.send(text)\n if (result === \"failed\" && !draft()) restore(text)\n return result === \"sent\"\n }\n const submit = async () => {\n const text = draft()\n if (!text.trim() || !chat.ready()) return\n clear()\n await sendText(text)\n }\n\n // Messages sent from outside (handle.send) before the chat is ready wait for\n // it, then go out in order.\n let waiting: Array<{ text: string; resolve: (sent: boolean) => void }> = []\n let queue = Promise.resolve()\n const sendFromHost = (text: string) =>\n new Promise<boolean>((resolve) => {\n waiting.push({ text, resolve })\n if (chat.ready()) flush()\n })\n const flush = () => {\n const batch = waiting\n waiting = []\n for (const { text, resolve } of batch) queue = queue.then(() => sendText(text).then(resolve, () => resolve(false)))\n }\n createEffect(on(chat.ready, (ready) => { if (ready) flush() }))\n onCleanup(() => { for (const { resolve } of waiting) resolve(false) })\n const working = () => chat.streaming() && !draft().trim()\n const lastTurn = () => { const ids = chat.messageIDs(); return ids.length ? chat.turn(ids[ids.length - 1]!) : undefined }\n const awaitingReply = () => chat.streaming() && lastTurn()?.message.role === \"user\"\n\n // Stay pinned to the newest message while the reader is already there: the\n // computed samples the position before the DOM updates, the effect restores it.\n let pinned = true\n const nearBottom = () => !timeline || timeline.scrollHeight - timeline.scrollTop - timeline.clientHeight < 80\n createComputed(on(chat.changes, () => { pinned = nearBottom() }, { defer: true }))\n createEffect(on(chat.changes, () => {\n if (pinned) timeline.scrollTop = timeline.scrollHeight\n // Short transcripts cannot scroll, so fetch older history until they can.\n if (timeline.scrollHeight <= timeline.clientHeight + 120) chat.older()\n }, { defer: true }))\n\n props.api({ send: sendFromHost, focus: () => input?.focus(), newChat: () => chat.newChat() })\n\n return (\n <div data-component=\"mux-chat\" data-session-id={chat.sessionID() ?? \"\"}>\n <header data-slot=\"mux-chat-header\">\n <div data-slot=\"mux-chat-heading\">\n <span data-slot=\"mux-chat-title\">{options.title}</span>\n <Show when={options.subtitle}><span data-slot=\"mux-chat-subtitle\">{options.subtitle}</span></Show>\n </div>\n <span data-slot=\"mux-chat-status\" data-tone={chat.status().tone} title={chat.status().text}>\n <span data-slot=\"mux-chat-status-text\">{chat.status().text}</span>\n </span>\n <button type=\"button\" data-component=\"icon-button\" data-variant=\"ghost\" data-size=\"normal\" data-action=\"new-chat\" aria-label=\"New chat\" title=\"New chat\" onClick={() => { void chat.newChat(); input.focus() }}>\n <Plus />\n </button>\n </header>\n\n <div data-component=\"message-timeline\" ref={timeline} onScroll={() => { if (timeline.scrollTop < 200) chat.older() }}>\n <Show when={chat.messageIDs().length === 0 && chat.ready()}>\n <div data-slot=\"mux-chat-empty\">\n <div data-slot=\"mux-chat-empty-title\">{options.title}</div>\n <Show when={options.subtitle}><div data-slot=\"mux-chat-empty-subtitle\">{options.subtitle}</div></Show>\n <Show when={options.suggestions.length}>\n <div data-slot=\"mux-chat-suggestions\">\n <For each={options.suggestions}>\n {(suggestion) => <button type=\"button\" data-slot=\"mux-chat-suggestion\" onClick={() => void sendText(suggestion.prompt)}>{suggestion.label}</button>}\n </For>\n </div>\n </Show>\n </div>\n </Show>\n <div data-slot=\"session-turn-message-container\">\n <For each={chat.messageIDs()}>{(id) => <TurnView turn={() => chat.turn(id)} streaming={chat.streaming} labels={labels()} />}</For>\n <Show when={awaitingReply()}>\n <div data-component=\"assistant-message\" data-live=\"\"><ActivityRow title=\"Thinking\" active={true} name=\"thinking\" /></div>\n </Show>\n </div>\n </div>\n\n <div data-slot=\"mux-chat-dock\">\n <Show when={chat.permissions()[0]} keyed>\n {(request) => <PermissionDock request={request} onReply={(response) => void chat.replyPermission(request.id, response)} />}\n </Show>\n <Show when={chat.questions()[0]} keyed>\n {(request) => <QuestionDock request={request} onAnswer={(answers) => void chat.answer(request.id, answers)} onSkip={() => void chat.reject(request.id)} />}\n </Show>\n <Show when={chat.error() || chat.unconfirmed()}>\n <div data-slot=\"mux-chat-notice\" role=\"status\">\n <span>{chat.error() || \"Your last message may not have been delivered.\"}</span>\n <Show when={chat.unconfirmed()}>\n <button type=\"button\" data-slot=\"mux-button\" data-variant=\"ghost\" data-action=\"retry\" onClick={() => void chat.retry()}>Retry</button>\n </Show>\n </div>\n </Show>\n <div data-component=\"prompt-composer-surface\" aria-busy={!chat.ready()}>\n <div data-dock-surface=\"shell\" data-component=\"prompt-input-shell\" style={{ \"--prompt-inset\": \"2px\" }}>\n <div data-component=\"prompt-input-scroll\">\n <textarea\n ref={input}\n data-component=\"prompt-input\"\n rows={1}\n placeholder={options.placeholder}\n aria-label={options.placeholder}\n onInput={(event) => { setDraft(event.currentTarget.value); grow() }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault()\n void submit()\n }\n }}\n />\n </div>\n </div>\n <div data-dock-surface=\"tray\" data-dock-attach=\"top\" data-component=\"prompt-controls\">\n <div data-component=\"prompt-controls-inner\">\n <div data-component=\"prompt-control-row\">\n <div data-component=\"prompt-control-left\">\n <div data-component=\"prompt-model-control\">\n <select data-action=\"prompt-model\" aria-label=\"Model\" disabled={!chat.modelGroups().length} onChange={(event) => chat.selectModel(event.currentTarget.value)}>\n <For each={chat.modelGroups()}>\n {(group) => (\n <optgroup label={group.label}>\n <For each={group.models}>{(model) => <option value={model.value} selected={model.value === chat.modelValue()}>{model.label}</option>}</For>\n </optgroup>\n )}\n </For>\n </select>\n <span data-slot=\"prompt-model-chevron\"><ChevronDown /></span>\n </div>\n </div>\n <div data-component=\"prompt-control-right\">\n <div data-component=\"prompt-submit-control\">\n <button\n type=\"button\"\n data-component=\"icon-button\"\n data-variant=\"primary\"\n data-size=\"normal\"\n data-icon-size=\"small\"\n data-action=\"prompt-submit\"\n data-working={working() ? \"\" : undefined}\n aria-label={working() ? \"Stop\" : \"Send\"}\n disabled={working() ? false : !chat.ready() || !draft().trim()}\n onClick={() => (working() ? void chat.abort() : void submit())}\n >\n <Show when={working()} fallback={<ArrowUp />}><Stop /></Show>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { onCleanup, onMount, type JSX } from \"solid-js\"\nimport { render } from \"solid-js/web\"\nimport type { ToolResult } from \"./controller.js\"\nimport { styles } from \"./styles.js\"\nimport { Chat, type ChatAPI } from \"./view/Chat.jsx\"\n\nexport type MuxChatOptions = {\n /** Where the app mounts `mux.handle` (@rohansguliani/mux-chat-runtime). Default `/api/mux`. */\n url?: string\n /** Header and empty-state title. Default \"Assistant\". */\n title?: string\n subtitle?: string\n placeholder?: string\n /** Starter prompts shown in an empty chat. */\n suggestions?: Array<{ label: string; prompt: string }>\n /** Overrides tool names in the transcript; by default they come from each tool's `label`. */\n toolLabels?: Record<string, string>\n /** Model to select when the user has not picked one, as `provider/model`. */\n preferredModel?: string\n /**\n * Called when a tool call finishes while the chat is open. `readOnly` is\n * false when the tool may have changed app data: refresh it then.\n */\n onToolResult?: (result: ToolResult) => void\n /** Default follows the operating system. */\n theme?: \"light\" | \"dark\" | \"system\"\n /** Prefix for the browser storage that remembers the open chat and model. Default `mux-chat`. */\n storageKey?: string\n /** Agent that answers; embed grants force `assistant`. */\n agent?: string\n /** Title of sessions the chat creates. */\n sessionTitle?: string\n}\n\nexport type MuxChatHandle = {\n /**\n * Sends a message as the user, waiting for the chat to be ready if it is not\n * yet. Resolves true once delivered; false otherwise (a refused message is\n * put back into an empty composer).\n */\n send(text: string): Promise<boolean>\n focus(): void\n /** Starts a new, empty chat. */\n newChat(): Promise<void>\n dispose(): void\n}\n\n/**\n * Renders the Mux chat into `host` (inside its shadow root, with Mux's\n * styles). Give `host` a height, e.g. a sidebar column.\n */\nexport function mountMuxChat(host: HTMLElement, options: MuxChatOptions = {}): MuxChatHandle {\n const root = host.shadowRoot ?? host.attachShadow({ mode: \"open\" })\n root.replaceChildren()\n const style = document.createElement(\"style\")\n style.textContent = styles\n const container = document.createElement(\"div\")\n container.style.height = \"100%\"\n root.append(style, container)\n if (options.theme === \"light\" || options.theme === \"dark\") host.setAttribute(\"data-theme\", options.theme)\n else host.removeAttribute(\"data-theme\")\n\n let api: ChatAPI | undefined\n const dispose = render(() => (\n <Chat\n api={(value) => (api = value)}\n options={{\n url: options.url ?? \"/api/mux\",\n title: options.title ?? \"Assistant\",\n subtitle: options.subtitle,\n placeholder: options.placeholder ?? \"Ask anything…\",\n suggestions: options.suggestions ?? [],\n toolLabels: options.toolLabels ?? {},\n agent: options.agent ?? \"assistant\",\n sessionTitle: options.sessionTitle ?? \"Chat\",\n storageKey: options.storageKey ?? \"mux-chat\",\n preferredModel: options.preferredModel,\n onToolResult: options.onToolResult,\n }}\n />\n ), container)\n\n return {\n send: (text) => api?.send(text) ?? Promise.resolve(false),\n focus: () => api?.focus(),\n newChat: () => api?.newChat() ?? Promise.resolve(),\n dispose: () => {\n dispose()\n root.replaceChildren()\n },\n }\n}\n\n/** Solid wrapper around `mountMuxChat`. Options are read once, at mount. */\nexport function MuxChat(props: MuxChatOptions & { id?: string; class?: string; style?: JSX.CSSProperties | string; ref?: (handle: MuxChatHandle) => void }) {\n let host!: HTMLDivElement\n onMount(() => {\n const handle = mountMuxChat(host, props)\n props.ref?.(handle)\n onCleanup(() => handle.dispose())\n })\n return <div ref={host} id={props.id} class={props.class} style={props.style} />\n}\n"],"mappings":";;;;;;;;AaeA,IAAa,SAAS;CAACA;CAAOC;CAAYC;CAAYC;CAASC;CAAaC;CAAWC;CAAaC;CAAiBC;CAAaC;CAAUC;CAAaC;CAAaC;AAAI,CAAC,CAAC,KAAK,IAAI;;;;ACPrL,SAAgB,YAAY,WAA4C;CACtE,OAAO,UAAU,IACd,QAAQ,aAAa,UAAU,UAAU,SAAS,SAAS,EAAE,CAAC,CAAC,CAC/D,KAAK,cAAc;EAClB,IAAI,SAAS;EACb,OAAO,SAAS,QAAQ,SAAS;EACjC,QAAQ,OAAO,OAAO,SAAS,MAAM,CAAC,CAAC,KAAK,WAAW;GAAE,OAAO,GAAG,SAAS,GAAG,GAAG,MAAM;GAAM,OAAO,MAAM,QAAQ,MAAM;EAAG,EAAE;CAChI,EAAE,CAAC,CACF,QAAQ,UAAU,MAAM,OAAO,SAAS,CAAC;AAC9C;;;;;;AAOA,SAAgB,YAAY,QAAsB,WAA8B,QAAiB,WAAwC;CACvI,MAAM,YAAY,IAAI,IAAI,OAAO,SAAS,UAAU,MAAM,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC;CAE7F,OAAO;EAAC;EAAQ;EAAW,GADV,UAAU,UAAU,KAAK,OAAQ,UAAU,QAAQ,MAAM,GAAG,GAAG,GAAG,UAAU,QAAQ,QAAQ,EAC/E;EAAU,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE;CAAK,CAAC,CAAC,MAAM,UAA2B,CAAC,CAAC,SAAS,UAAU,IAAI,KAAK,CAAC;AACvI;AAEA,SAAgB,WAAW,OAA2B;CACpD,MAAM,QAAQ,OAAO,QAAQ,GAAG,KAAK;CACrC,OAAO,SAAS,QAAQ,IAAI;EAAE,YAAY,MAAM,MAAM,GAAG,KAAK;EAAG,SAAS,MAAM,MAAM,QAAQ,CAAC;CAAE,IAAI,KAAA;AACvG;;AAGA,SAAgB,aAAa,OAAgC;CAC3D,OAAO,MAAM,QAAQ,SAClB,KAAK,SAAS,UAAU,CAAC,KAAK,aAAa,CAAC,KAAK,WAAW,KAAK,KAAK,KAAK,MAAM,MACjF,KAAK,SAAS,eAAe,KAAK,KAAK,KAAK,MAAM,MACnD,KAAK,SAAS,MAAM;AACxB;AAEA,IAAM,gBAAwC;CAAE,WAAW;CAAqB,UAAU;CAAgB,UAAU;AAAW;;AAG/H,IAAa,YAAY,SAAiB;CACxC,MAAM,QAAQ,KAAK,QAAQ,UAAU,GAAG,CAAC,CAAC,KAAK;CAC/C,OAAO,QAAQ,MAAM,EAAE,CAAE,YAAY,IAAI,MAAM,MAAM,CAAC,IAAI;AAC5D;AAEA,SAAgB,UAAU,MAAc,SAAiC,CAAC,GAAW;CACnF,OAAO,OAAO,SAAS,cAAc,SAAS,SAAS,IAAI;AAC7D;AAEA,IAAM,aAAa;CAAC;CAAe;CAAS;CAAO;CAAQ;CAAU;CAAa;CAAQ;AAAS;;AAGnG,SAAgB,aAAa,OAA0B;CACrD,KAAK,MAAM,WAAW,eAAe,MAAM,WAAW,cAAc,MAAM,OAAO,OAAO,MAAM;CAC9F,MAAM,QAAQ,MAAM,SAAS,CAAC;CAC9B,KAAK,MAAM,OAAO,YAAY;EAC5B,MAAM,QAAQ,MAAM;EACpB,IAAI,OAAO,UAAU,YAAY,OAAO,OAAO;CACjD;CACA,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK,GAAG;EACxC,IAAI,OAAO,UAAU,YAAY,OAAO,OAAO;EAC/C,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ,GAAG,OAAO,MAAM,KAAK,IAAI;CACrH;CACA,OAAO;AACT;AAEA,IAAa,cAAc,SAAmB,KAAK,MAAM,WAAW,aAAa,KAAK,MAAM,WAAW;AAEvG,SAAgB,WAAW,OAA0B;CACnD,IAAI,MAAM,WAAW,SAAS,OAAO,MAAM;CAC3C,IAAI,MAAM,WAAW,aAAa,OAAO,MAAM;CAC/C,IAAI,MAAM,WAAW,WAAW,OAAO,MAAM,UAAU;CACvD,OAAO;AACT;AAEA,IAAa,WAAW,OAAe,QAAgB,GAAG,KAAK,IAAI,IAAI,MAAM,SAAS,GAAI,CAAC,CAAC,QAAQ,CAAC,EAAE;AAEvG,IAAa,WAAW,GAAsB,MAAyB,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,IAAI,UAAU,OAAO,EAAE,MAAM;;;AC/BtI,IAAM,OAAwB;CAAE,WAAW;CAAO,OAAO;CAAO,gBAAgB;CAAO,cAAc;CAAI,eAAe;CAAI,OAAO;CAAI,OAAO;AAAM;AAEpJ,IAAM,UAAU;CACd,IAAI,KAAa;EACf,IAAI;GAAE,OAAO,aAAa,QAAQ,GAAG,KAAK,KAAA;EAAU,QAAQ;GAAE;EAAiB;CACjF;CACA,IAAI,KAAa,OAA2B;EAC1C,IAAI;GAAE,IAAI,UAAU,KAAA,GAAW,aAAa,WAAW,GAAG;QAAQ,aAAa,QAAQ,KAAK,KAAK;EAAE,QAAQ,CAAyB;CACtI;AACF;AAEA,SAAgB,qBAAqB,SAA4B;CAC/D,IAAI,WAAW;CACf,MAAM,MAAM,gBAAgB,EAAE,KAAK,QAAQ,IAAI,CAAC;CAChD,MAAM,EAAE,WAAW;CACnB,MAAM,QAAQ,kBAAkB;CAChC,MAAM,CAAC,OAAO,YAAY,aAAwB,MAAM,MAAM,CAAC;CAC/D,MAAM,CAAC,MAAM,WAAW,aAA8B,IAAI;CAC1D,MAAM,CAAC,WAAW,gBAAgB,aAAqB;CACvD,MAAM,CAAC,QAAQ,aAAa,aAAqB;CACjD,MAAM,CAAC,YAAY,iBAAiB,aAAqB;CACzD,MAAM,CAAC,OAAO,YAAY,6BAA4C,IAAI,IAAI,CAAC;CAC/E,MAAM,CAAC,WAAW,gBAAgB,aAAgC;CAClE,MAAM,CAAC,SAAS,cAAc,aAAa,KAAK;CAChD,MAAM,CAAC,YAAY,iBAAiB,aAAa,KAAK;CACtD,MAAM,YAAY,UAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CAC3F,MAAM,UAAU,UAAmB,UAAU,SAAS,KAAK,CAAC;CAE5D,MAAM,WAAW,gBAAwB,kBAAkB;EAAE;EAAO,WAAW,uBAAuB,QAAQ,EAAE,YAAY,CAAC;CAAE,CAAC;CAChI,IAAI;CAEJ,IAAI;CACJ,MAAM,gBAAgB;EACpB,IAAI,UAAU,KAAA,KAAa,UAAU;EACrC,QAAQ,4BAA4B;GAClC,QAAQ,KAAA;GACR,YAAY;IACV,SAAS,MAAM,MAAM,CAAC;IACtB,QAAQ,UAAU,QAAQ,KAAK,IAAI,IAAI;GACzC,CAAC;EACH,CAAC;CACH;CACA,MAAM,cAAc,MAAM,UAAU,OAAO;CAE3C,MAAM,yBAAS,IAAI,IAA2C;CAC9D,MAAM,YAAY,MAAc,IAAY,QAAoB;EAC9D,aAAa,OAAO,IAAI,IAAI,CAAC;EAC7B,OAAO,IAAI,MAAM,iBAAiB;GAAE,OAAO,OAAO,IAAI;GAAG,IAAI,CAAC,UAAU,IAAI;EAAE,GAAG,EAAE,CAAC;CACtF;CACA,gBAAgB;EACd,WAAW;EACX,KAAK,MAAM,SAAS,OAAO,OAAO,GAAG,aAAa,KAAK;EACvD,IAAI,UAAU,KAAA,GAAW,qBAAqB,KAAK;EACnD,YAAY;EACZ,SAAS,QAAQ;CACnB,CAAC;CAED,MAAM,aAAa,YAAY;EAC7B,MAAM,OAAO,MAAM,IAAI,aAAa;EACpC,IAAI,CAAC,MAAM,SAAS,CAAC,KAAK,aAAa,MAAM,IAAI,MAAM,qCAAqC;EAC5F,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,EAAA,CAAG,KAAK,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC;EACrE,cAAc,KAAA,CAAS;EAEvB,SAAS,SAAS,KAAK,IAAI,MAAS,KAAK,YAAY,KAAK,IAAI,KAAK,EAAG,SAAS,KAAK,MAAM,CAAC,CAAC;CAC9F;CAGA,MAAM,QAAQ,OAAO,YAAoB;EACvC,IAAI;GACF,MAAM,WAAW;EACnB,SAAS,OAAO;GACd,cAAc,SAAS,KAAK,CAAC;GAC7B,SAAS,SAAS,KAAK,IAAI,KAAQ,OAAS,KAAK,OAAO,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;EAC1F;CACF;CAEA,MAAM,mBAAmB,GAAG,QAAQ,WAAW,WAAW,IAAI,MAAM,CAAC,EAAE;CACvE,MAAM,WAAW,GAAG,QAAQ,WAAW;CAEvC,MAAM,OAAO,OAAO,WAA+B;EACjD,MAAM,SAAS,MAAM,OAAO,YAAY;GAAE,aAAa,IAAI,MAAM,CAAC,CAAE;GAAa,WAAW;GAAQ,OAAO,QAAQ;EAAa,CAAC;EACjI,IAAI,UAAU;EACd,QAAQ,IAAI,WAAW,GAAG,OAAO,QAAQ,EAAE;EAC3C,SAAS,QAAQ;EACjB,UAAU,QAAQ,OAAO,WAAW;EACpC,QAAQ,UAAU,OAAO;EACzB,aAAa,OAAO,QAAQ,EAAE;EAC9B,QAAQ,MAAM,OAAO,QAAQ,EAAE;EAC/B,QAAQ;CACV;CAEA,MAAM,aAAa,YAAY;EAC7B,IAAI;GACF,aAAa,MAAM,OAAO,UAAU,CAAC;GACrC,WAAW,KAAK;EAClB,SAAS,OAAO;GACd,QAAQ,KAAK,cAAc,KAAK;GAChC,WAAW,IAAI;GACf,SAAS,UAAU,YAAc,KAAK,WAAW,CAAC;EACpD;CACF;CAEA,MAAM,OAAO,YAAY;EACvB,IAAI;GACF,MAAM,WAAW;EACnB,SAAS,OAAO;GACd,cAAc,SAAS,KAAK,CAAC;GAC7B,SAAS,QAAQ,YAAc,KAAK,KAAK,CAAC;GAC1C;EACF;EACA,IAAI;GACF,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC,CAAC;GACpC,UAAU,KAAA,CAAS;GACnB,WAAgB;EAClB,SAAS,OAAO;GACd,OAAO,KAAK;GACZ,SAAS,QAAQ,YAAc,KAAK,KAAK,CAAC;EAC5C;CACF;CACA,KAAU;CAEV,MAAM,QAAQ,iBAAyB;EAAE,MAAM,KAAK,UAAU;EAAG,OAAO,KAAK,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC;CAAE,CAAC;CAC7G,MAAM,YAAY,iBAAiB,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC;CAC1F,MAAM,aAAa,iBAAiB,MAAM,CAAC,CAAC,KAAK,SAAS,KAAK,QAAQ,EAAE,GAAG,CAAC,GAAe,EAAE,QAAQ,QAAQ,CAAC;CAC/G,MAAM,YAAY,iBAAiB;EAAE,MAAM,KAAK,UAAU;EAAG,OAAO,CAAC,CAAC,MAAM,mBAAmB,MAAM,GAAG,EAAE;CAAE,CAAC;CAC7G,MAAM,YAAY,iBAA6C;EAAE,MAAM,KAAK,UAAU;EAAG,OAAO,KAAK,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC;CAAE,CAAC;CACzI,MAAM,cAAc,iBAA+C;EAAE,MAAM,KAAK,UAAU;EAAG,OAAO,KAAK,mBAAmB,MAAM,GAAG,EAAE,IAAI,CAAC;CAAE,CAAC;CAI/I,MAAM,uBAAO,IAAI,IAAY;CAC7B,IAAI,OAAO;CACX,aAAa,GAAG,QAAQ,YAAY;EAClC,KAAK,MAAM,QAAQ,SACjB,KAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,IAAI,KAAK,SAAS,UAAU,KAAK,MAAM,WAAW,eAAe,KAAK,IAAI,KAAK,EAAE,GAAG;GACpF,KAAK,IAAI,KAAK,EAAE;GAChB,IAAI,MACF,QAAQ,eAAe;IACrB,MAAM,KAAK;IACX,OAAO,KAAK,MAAM;IAClB,OAAO,KAAK,MAAM;IAClB,QAAQ,KAAK,MAAM;IACnB,WAAW,KAAK;IAEhB,UAAU,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,YAAY;GAChD,CAAC;EAEL;EAEF,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO,OAAO;CAClC,CAAC,CAAC;CAEF,MAAM,CAAC,YAAY,iBAAiB,aAAa,QAAQ,IAAI,QAAQ,KAAK,EAAE;CAC5E,MAAM,eAAe,UAAkB;EACrC,cAAc,KAAK;EACnB,QAAQ,IAAI,UAAU,KAAK;CAC7B;CACA,MAAM,SAAS,iBAA+B;EAAE,MAAM,MAAM,UAAU;EAAG,OAAO,MAAM,YAAY,GAAG,IAAI,CAAC;CAAE,CAAC;CAC7G,aAAa,GAAG,SAAS,YAAY;EACnC,MAAM,MAAM,UAAU;EACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,QAAQ;EAC7B,MAAM,SAAS,YAAY,SAAS,KAAK,QAAQ,UAAU,GAAG,QAAQ,cAAc;EACpF,IAAI,UAAU,WAAW,QAAQ,UAAU,GAAG,YAAY,MAAM;CAClE,CAAC,CAAC;CAEF,MAAM,SAAS,iBAAyB;EACtC,IAAI,QAAQ,GAAG,OAAO;GAAE,MAAM;GAAO,MAAM;EAAU;EACrD,IAAI,UAAU,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,OAAO;GAAE,MAAM;GAAO,MAAM;EAAsB;EACvF,MAAM,UAAU,KAAK;EACrB,IAAI,QAAQ,WAAW,OAAO;GAAE,MAAM;GAAM,MAAM;EAAY;EAC9D,OAAO,QAAQ,QAAQ;GAAE,MAAM;GAAO,MAAM;EAAgB,IAAI;GAAE,MAAM;GAAQ,MAAM;EAAc;CACtG,CAAC;CAED,MAAM,eAAe,WAA6C,YAAY;EAC5E,MAAM,KAAK,UAAU;EACrB,IAAI,CAAC,IAAI;EACT,IAAI;GAAE,MAAM,OAAO,EAAE;EAAE,SAAS,OAAO;GAAE,OAAO,KAAK;EAAE;CACzD;CAEA,MAAM,UAAU,OAAO,QAAqC,eAA2B;EACrF,cAAc,IAAI;EAClB,IAAI;GAAE,OAAO,MAAM,OAAO,KAAK,UAAU;EAAE,UAAU;GAAE,cAAc,KAAK;EAAE;CAC9E;CAEA,OAAO;;EAEL,SAAS;EACT;;EAEA,YAAY,iBAAiB,OAAO,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,UAAW,KAAK,QAAQ,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,CAAE,CAAC,CAAC;EACjI;EACA,OAAO,OAAe,UAAU,CAAC,CAAC,IAAI,EAAE;EACxC;EACA;EACA;EACA,aAAa,KAAK,CAAC,CAAC;EACpB;EACA;EACA,aAAa,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,iBAAiB,WAAW,KAAK,OAAO,KAAK;;EAEjF,mBAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW;EACnD,aAAa;EACb;EACA;EACA,MAAM,KAAK,MAAmC;GAC5C,MAAM,SAAS;GACf,MAAM,KAAK,UAAU;GACrB,MAAM,UAAU,KAAK,KAAK;GAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,OAAO;GACxD,UAAU,KAAA,CAAS;GAEnB,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;GAC9B,IAAI,WAAW,CAAE,MAAM,QAAQ,QAAQ,OAAO,GAAI,OAAO;GACzD,MAAM,aAAa,eAAe;IAAE,WAAW;IAAI,MAAM;IAAS,OAAO,QAAQ;IAAO,OAAO,WAAW,WAAW,CAAC;GAAE,CAAC;GACzH,IAAI,MAAM,QAAQ,QAAQ,UAAU,GAAG,OAAO;GAC9C,OAAO,OAAO,KAAK,CAAC,CAAC,YAAY,aAAa,gBAAgB;EAChE;EACA,MAAM,QAAQ;GACZ,MAAM,SAAS;GACf,MAAM,UAAU,QAAQ,KAAK,CAAC,CAAC;GAC/B,IAAI,UAAU,WAAW,CAAC,WAAW,GAAG,MAAM,QAAQ,QAAQ,OAAO;EACvE;EACA,OAAO,aAAa,OAAO,OAAO,MAAM,EAAE,CAAC;EAC3C,SAAS,WAAmB,YAAwB,kBAAkB,OAAO,eAAe,WAAW,OAAO,CAAC,CAAC,CAAC;EACjH,SAAS,cAAsB,kBAAkB,OAAO,eAAe,SAAS,CAAC,CAAC,CAAC;EACnF,kBAAkB,WAAmB,aAA2C,aAAa,OAAO,OAAO,gBAAgB,IAAI,WAAW,QAAQ,CAAC,CAAC,CAAC;;EAErJ,aAAa;GAAE,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,gBAAgB,SAAc,MAAM;EAAE;EAClF,MAAM,UAAU;GACd,IAAI,CAAC,IAAI,MAAM,GAAG;GAClB,IAAI;IACF,SAAS,QAAQ;IACjB,UAAU,KAAA;IACV,aAAa,KAAA,CAAS;IACtB,QAAQ,IAAI;IACZ,MAAM,KAAK,KAAA,CAAS;GACtB,SAAS,OAAO;IAAE,OAAO,KAAK;GAAE;EAClC;CACF;AACF;;;AC/RA,IAAM,SAAS,IAAI,OAAO;CAAE,KAAK;CAAM,QAAQ;AAAM,CAAC;AACtD,IAAI;AAEJ,SAAS,YAAY;CACnB,IAAI,CAAC,QAAQ;EACX,SAAS,gBAAgB,MAAM;EAC/B,OAAO,QAAQ,4BAA4B,SAAS;GAClD,IAAI,KAAK,YAAY,OAAO,KAAK,aAAa,MAAM,GAAG;IACrD,KAAK,aAAa,UAAU,QAAQ;IACpC,KAAK,aAAa,OAAO,qBAAqB;GAChD;EACF,CAAC;CACH;CACA,OAAO;AACT;;AAGA,SAAgB,eAAe,MAAsB;CACnD,OAAO,UAAU,CAAC,CAAC,SAAS,OAAO,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC,CAAW;AAC5E;;;;;ACtBA,IAAMI,UAAU;;AAGhB,SAAgBC,YAAYC,OAA2D;CACrF,MAAM,CAACI,KAAKC,UAAUT,aAAaI,MAAME,MAAM;CAC/C,IAAII;CACJX,mBAAmB;EACjBc,aAAaH,KAAK;EAClB,IAAIN,MAAME,QAAQG,OAAO,IAAI;OACxBC,QAAQE,iBAAiBH,OAAO,KAAK,GAAGP,OAAO;CACtD,CAAC;CACDD,gBAAgBY,aAAaH,KAAK,CAAC;CACnC,cAAA;EAAA,IAAAI,OAAAC,SAAA,GAAAG,QAAAJ,KAAAG,WAAAA,YAAAE,QAAAD,MAAAE;EAAAC,OAAAH,aAQmEd,MAAMC,IAAI;EAAAgB,OAAAF,aAC6Bf,MAAMC,IAAI;EAAAiB,QAAAC,QAAA;GAAA,IAAAC,MANnGpB,MAAME,SAAS,SAAS,SAAOmB,OAChCrB,MAAMC,MAAIqB,OACkD,GAAGtB,MAAMG,UAAU,KAAGoB,OAItCnB,IAAI,IAAI,SAAS;GAAOgB,QAAAD,IAAAK,KAAAC,aAAAf,MAAA,eAAAS,IAAAK,IAAAJ,GAAA;GAAAC,SAAAF,IAAAO,KAAAD,aAAAf,MAAA,cAAAS,IAAAO,IAAAL,IAAA;GAAAC,SAAAH,IAAAQ,KAAAC,iBAAAlB,MAAA,wBAAAS,IAAAQ,IAAAL,IAAA;GAAAC,SAAAJ,IAAAU,KAAAJ,aAAAV,OAAA,YAAAI,IAAAU,IAAAN,IAAA;GAAA,OAAAJ;EAAA,GAAA;GAAAK,GAAAM,KAAAA;GAAAJ,GAAAI,KAAAA;GAAAH,GAAAG,KAAAA;GAAAD,GAAAC,KAAAA;EAAA,CAAA;EAAA,OAAApB;CAAA,EAAA,CAAA;AAItF;AAEA,IAAMqB,OAAOC,MAAcC,SAAS,uBAAU;CAAA,IAAAC,QAAAC,UAAA,GAAAC,QAAAF,MAAArB,YAAAwB,QAAAD,MAAAvB;CAAAY,aAAAW,OAAA,QAEiCH,SAAS,iBAAiB,MAAM;CAAAR,aAAAW,OAAA,UAAUH,SAAS,SAAS,cAAc;CAAAR,aAAAY,OAAA,KAC1IL,IAAI;CAAA,OAAAE;AAAA,EAAA,CAAA;AAKnB,IAAaI,cAAcP,IAAI,cAAc;AAC7C,IAAaQ,UAAUR,IAAI,8BAA8B;AACzD,IAAaS,OAAOT,IAAI,oBAAoB,IAAI;AAChD,IAAaU,OAAOV,IAAI,gBAAgB;;;;;;;;;;;AC9BxC,SAAgBiC,YAAYC,OAAsH;CAChJ,MAAM,CAACQ,MAAMC,WAAWvB,aAAa,KAAK;CAC1C,MAAMwB,mBAAmBV,MAAMM,aAAaK,KAAAA;CAC5C,cAAA;EAAA,IAAAC,OAAAC,UAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAM,QAAAL,MAAAD,WAAAA,WAAAA,WAAAA,WAAAA,YAAAO,QAAAD,MAAAE;EAAAT,MAAAU,gBAUyHf,QAAQ,CAACD,KAAK,CAAC;EAACiB,OAAAJ,OAAAK,gBAMhF5B,aAAW;GAAA,IAAC6B,OAAI;IAAA,OAAE3B,MAAMC;GAAK;GAAA,IAAEE,SAAM;IAAA,OAAEH,MAAMG;GAAM;EAAA,CAAA,CAAA;EAAAsB,OAAAH,OAAAI,gBAEzFtC,MAAI;GAAA,IAACwC,OAAI;IAAA,OAAE5B,MAAME;GAAQ;GAAAI,WAAIJ,oBAAQ;IAAA,IAAA2B,SAAAC,UAAA;IAAAL,OAAAI,QAAiD3B,QAAQ;IAAA,OAAA2B;GAAA,EAAA,CAAA;EAAU,CAAA,CAAA;EAAAJ,OAAAT,OAAAU,gBAMlHtC,MAAI;GAAA,IAACwC,OAAI;IAAA,OAAElB,WAAW;GAAC;GAAA,IAAAJ,WAAA;IAAA,IAAAyB,QAAAC,SAAA,GAAAC,QAAAF,MAAAhB;IAAAU,OAAAQ,OAAAP,gBAC2E7B,aAAW,CAAA,CAAA,CAAA;IAAA,OAAAkC;GAAA;EAAA,CAAA,GAAA,IAAA;EAAAN,OAAAb,MAAAc,gBAIjHtC,MAAI;GAAA,IAACwC,OAAI;IAAA,OAAEM,WAAA,CAAA,CAAA1B,KAAK,CAAC,CAAA,CAAA,KAAIE,WAAW;GAAC;GAAA,IAAAJ,WAAA;IAAA,IAAA6B,SAAAC,UAAA;IAAAX,OAAAU,cACuBnC,MAAMM,QAAQ;IAAA,OAAA6B;GAAA;EAAA,CAAA,GAAA,IAAA;EAAAE,QAAAC,QAAA;GAAA,IAAAC,MAzB5DvC,MAAMI,MAAIoC,OACRxC,MAAMK,QAAMoC,OACVjC,KAAK,IAAI,KAAKG,KAAAA,GAAS+B,OACzBlC,KAAK,IAAIG,KAAAA,IAAY,IAAEgC,OAEiCnC,KAAK,GAACoC,OAAY,CAAClC,WAAW;GAAC6B,QAAAD,IAAAO,KAAAC,aAAAlC,MAAA,aAAA0B,IAAAO,IAAAN,GAAA;GAAAC,SAAAF,IAAAS,KAAAD,aAAAlC,MAAA,eAAA0B,IAAAS,IAAAP,IAAA;GAAAC,SAAAH,IAAAU,KAAAF,aAAAlC,MAAA,iBAAA0B,IAAAU,IAAAP,IAAA;GAAAC,SAAAJ,IAAAW,KAAAH,aAAAlC,MAAA,eAAA0B,IAAAW,IAAAP,IAAA;GAAAC,SAAAL,IAAAY,KAAAJ,aAAAhC,OAAA,iBAAAwB,IAAAY,IAAAP,IAAA;GAAAC,SAAAN,IAAAa,MAAArC,MAAAsC,WAAAd,IAAAa,IAAAP;GAAA,OAAAN;EAAA,GAAA;GAAAO,GAAAlC,KAAAA;GAAAoC,GAAApC,KAAAA;GAAAqC,GAAArC,KAAAA;GAAAsC,GAAAtC,KAAAA;GAAAuC,GAAAvC,KAAAA;GAAAwC,GAAAxC,KAAAA;EAAA,CAAA;EAAA,OAAAC;CAAA,EAAA,CAAA;AAwB1G;AAEA,SAASyC,QAAQrD,OAA2D;CAC1E,MAAMyD,SAASxE,iBAAiBS,WAAWM,MAAMsD,KAAKI,KAAK,CAAC,CAACC,MAAM,GAAG,GAAM,CAAC;CAC7E,OAAAjC,gBACG3B,aAAW;EAAA,IAACE,QAAK;GAAA,OAAEL,UAAUI,MAAMsD,KAAKM,MAAM5D,MAAMuD,MAAM;EAAC;EAAA,IAAErD,WAAQ;GAAA,OAAEP,aAAaK,MAAMsD,KAAKI,KAAK;EAAC;EAAA,IAAEvD,SAAM;GAAA,OAAEV,WAAWO,MAAMsD,IAAI;EAAC;EAAA,IAAElD,OAAI;GAAA,OAAEJ,MAAMsD,KAAKM;EAAI;EAAA,IAAEvD,SAAM;GAAA,OAAEL,MAAMsD,KAAKI,MAAMrD;EAAM;EAAA,IAAAC,WAAA;GAAA,OAC3L4B,WAAA,CAAA,CAAAuB,OAAO,CAAC,CAAA,CAAA,WAAA;IAAA,IAAAI,SAAAC,UAAA,GAAAC,SAAAF,OAAA9C;IAAAU,OAAAsC,QAEuCN,MAAM;IAAApB,aAAAS,aAAAiB,QAAA,eAAhC/D,MAAMsD,KAAKI,MAAMrD,MAAM,CAAA;IAAA,OAAAwD;GAAA,EAAA,CAAA,IAEzClD,KAAAA;EAAS;CAAA,CAAA;AAGnB;AAEA,SAASqD,aAAahE,OAA+C;CACnE,MAAMG,eAAeH,MAAMiE,QAAQjE,MAAMsD,KAAKY,MAAMC,QAAQxD,KAAAA;CAC5D,MAAMyD,iBAAkBpE,MAAMsD,KAAKY,MAAMC,MAAM3E,QAAQQ,MAAMsD,KAAKY,KAAKG,OAAOrE,MAAMsD,KAAKY,KAAKC,GAAG,IAAIxD,KAAAA;CACrG,OAAAe,gBACG3B,aAAW;EAAA,IAACE,QAAK;GAAA,OAAEE,OAAO,IAAI,aAAa;EAAS;EAAA,IAAED,WAAQ;GAAA,OAAEkE,SAAS;EAAC;EAAA,IAAEjE,SAAM;GAAA,OAAEA,OAAO;EAAC;EAAEC,MAAI;EAAA,IAAAE,WAAA;GAAA,IAAAgE,SAAAC,UAAA,GAAAC,SAAAF,OAAAvD;GAAAsB,aAAAmC,OAAAC,YAErDlF,eAAeS,MAAMsD,KAAK3B,IAAI,CAAC;GAAA,OAAA2C;EAAA;CAAA,CAAA;AAIjF;AAEA,SAAgBI,aAAa1E,OAA2B;CACtD,cAAA;EAAA,IAAA2E,SAAAC,UAAA,GAAAC,SAAAF,OAAA5D;EAAAsB,aAAAwC,OAAAJ,YAE8ClF,eAAeS,MAAMsD,KAAK3B,IAAI,CAAC;EAAA,OAAAgD;CAAA,EAAA,CAAA;AAG/E;AAEA,SAAgBG,SAAS9E,OAAsE;CAC7F,OAAA0B,gBACGrC,QAAM,EAAA,IAAAiB,WAAA;EAAA,OAAA;GAAAoB,gBACJvC,OAAK;IAAA,IAACyC,OAAI;KAAA,OAAEM,WAAAlC,MAAMsD,KAAKyB,SAAS,MAAM,CAAA,CAAA,KAAK/E,MAAMsD;IAAiB;IAAAhD,WAAIgD,SAAI5B,gBAAMgD,cAAY,EAAA,IAACpB,OAAI;KAAA,OAAEA,KAAK;IAAC,EAAA,CAAA;GAAI,CAAA;GAAA5B,gBAC7GvC,OAAK;IAAA,IAACyC,OAAI;KAAA,OAAEM,WAAAlC,MAAMsD,KAAKyB,SAAS,WAAW,CAAA,CAAA,KAAK/E,MAAMsD;IAAsB;IAAAhD,WAAIgD,SAAI5B,gBAAMsC,cAAY;KAAA,IAACV,OAAI;MAAA,OAAEA,KAAK;KAAC;KAAA,IAAEW,OAAI;MAAA,OAAEjE,MAAMiE;KAAI;IAAA,CAAA;GAAI,CAAA;GAAAvC,gBACzIvC,OAAK;IAAA,IAACyC,OAAI;KAAA,OAAEM,WAAAlC,MAAMsD,KAAKyB,SAAS,MAAM,CAAA,CAAA,KAAK/E,MAAMsD;IAAiB;IAAAhD,WAAIgD,SAAI5B,gBAAM2B,SAAO;KAAA,IAACC,OAAI;MAAA,OAAEA,KAAK;KAAC;KAAA,IAAEC,SAAM;MAAA,OAAEvD,MAAMuD;KAAM;IAAA,CAAA;GAAI,CAAA;EAAA;CAAA,EAAA,CAAA;AAGrI;AAACyB,eAAA,CAAA,OAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;ACnED,SAASwD,SAASC,OAAmG;CACnH,MAAMI,gBAAgBJ,MAAMC,KAAK,CAAC,EAAEG;CACpC,MAAMC,QAAQ7C,iBAAiBS,aAAa+B,MAAMC,KAAK,CAAC,EAAEI,SAAS,CAAA,CAAE,CAAC;CACtE,MAAMC,MAAM9C,iBAAiB6C,MAAM,CAAC,CAACE,KAAKC,SAASA,KAAKC,EAAE,GAAG,CAAA,GAAgB,EAAEC,QAAQ1C,QAAQ,CAAC;CAChG,MAAM2C,OAAOnD,iBAAiB,IAAIoD,IAAIP,MAAM,CAAC,CAACE,KAAKC,SAAS,CAACA,KAAKC,IAAID,IAAI,CAAC,CAAC,CAAC;CAC7E,MAAMK,OAAOrD,iBAAiB;EAAE,MAAMsD,IAAIV,QAAQ;EAAG,OAAOU,GAAGC,SAAS,eAAeD,EAAEE,KAAKC,cAAcC,KAAAA,KAAalB,MAAME,UAAU;CAAE,CAAC;CAC5I,MAAMiB,cAAc;EAClB,MAAML,IAAIV,QAAQ;EAClB,MAAMgB,UAAUN,GAAGC,SAAS,cAAcD,EAAEK,QAAQD,KAAAA;EACpD,OAAOE,WAAWA,QAAQC,SAAS,wBAAwBD,QAAQE,MAAMlB,WAAWgB,QAAQC,OAAOH,KAAAA;CACrG;CACA,MAAMK,kBAAkBvB,MAAMC,KAAK,CAAC,EAAEI,SAAS,CAAA,EAAA,CAAImB,SAAShB,SAAUA,KAAKiB,SAAS,UAAU,CAACjB,KAAKkB,YAAY,CAAClB,KAAKb,IAAI,IAAI,CAAA,CAAG,CAAC,CAACgC,KAAK,IAAI;CAC5I,OAAAC,gBACG/D,MAAI;EAAA,IAACgE,OAAI;GAAA,OAAEzB,QAAQ;EAAC;EAAA0B,WACjBhB,MAACc,gBACA/D,MAAI;GAAA,IACHgE,OAAI;IAAA,OAAEf,EAAE,CAAC,CAACC,SAAS;GAAW;GAAA,IAC9BgB,WAAQ;IAAA,cAAA;KAAA,IAAAC,QAAAC,QAAA,GAAAG,QAAAJ,MAAAG,WAAAA;KAAAE,OAAAD,OAEmEb,QAAQ;KAAAe,aAAAC,aAAAP,OAAA,mBAD7BlB,EAAE,CAAC,CAACL,EAAE,CAAA;KAAA,OAAAuB;IAAA,EAAA,CAAA;GAAA;GAAA,IAAAF,WAAA;IAAA,IAAAU,OAAAC,SAAA;IAAAJ,OAAAG,MAAAZ,gBAMzDlE,KAAG;KAAA,IAACgF,OAAI;MAAA,OAAEpC,IAAI;KAAC;KAAAwB,WAAIrB,OAAEmB,gBAAM/D,MAAI;MAAA,IAACgE,OAAI;OAAA,OAAElB,KAAK,CAAC,CAACgC,IAAIlC,EAAE;MAAC;MAAAqB,WAAItB,SAAIoB,gBAAMzD,UAAQ;OAAA,IAACqC,OAAI;QAAA,OAAEA,KAAK;OAAC;OAAA,IAAEK,OAAI;QAAA,OAAEA,KAAK;OAAC;OAAA,IAAEV,SAAM;QAAA,OAAEH,MAAMG;OAAM;MAAA,CAAA;KAAI,CAAA;IAAQ,CAAA,GAAA,IAAA;IAAAkC,OAAAG,MAAAZ,gBACvI/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEe,WAAA,CAAA,CAAA/B,KAAK,CAAC,CAAA,CAAA,KAAI,CAACP,IAAI,CAAC,CAACuC;KAAM;KAAA,IAAAf,WAAA;MAAA,OAAAF,gBAAG1D,aAAW;OAACQ,OAAK;OAAYoE,QAAQ;OAAMzB,MAAI;MAAA,CAAA;KAAA;IAAA,CAAA,GAAA,IAAA;IAAAgB,OAAAG,MAAAZ,gBACpF/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEV,MAAM;KAAC;KAAAW,WAAInC,gBAAI;MAAA,IAAAoD,QAAAC,QAAA;MAAAX,OAAAU,OAAmDpD,IAAI;MAAA,OAAAoD;KAAA,EAAA,CAAA;IAAS,CAAA,GAAA,IAAA;IAAAT,QAAAW,QAAA;KAAA,IAAAC,MAHpCpC,EAAE,CAAC,CAACL,IAAE0C,OAAatC,KAAK,IAAI,KAAKK,KAAAA;KAASgC,QAAAD,IAAAG,KAAAb,aAAAC,MAAA,mBAAAS,IAAAG,IAAAF,GAAA;KAAAC,SAAAF,IAAAI,KAAAd,aAAAC,MAAA,aAAAS,IAAAI,IAAAF,IAAA;KAAA,OAAAF;IAAA,GAAA;KAAAG,GAAAlC,KAAAA;KAAAmC,GAAAnC,KAAAA;IAAA,CAAA;IAAA,OAAAsB;GAAA;EAAA,CAAA;CAMtG,CAAA;AAGP;AAEA,SAASc,aAAatD,OAAkG;CACtH,MAAM,CAACyD,SAASE,cAAclG,aAAyBuC,MAAMuD,QAAQK,UAAUrD,UAAU,CAAA,CAAE,CAAC;CAC5F,MAAMsD,OAAOC,OAAeC,UAAoBJ,YAAYK,aAAaA,SAASzD,KAAK0D,SAASC,MAAOA,MAAMJ,QAAQC,QAAQE,OAAQ,CAAC;CACtI,MAAME,UAAUL,OAAe/E,OAAeqF,aAAsB;EAClE,MAAMH,UAAUR,QAAQ,CAAC,CAACK,UAAU,CAAA;EACpCD,IAAIC,OAAOM,WAAYH,QAAQI,SAAStF,KAAK,IAAIkF,QAAQK,QAAQP,UAAUA,UAAUhF,KAAK,IAAI,CAAC,GAAGkF,SAASlF,KAAK,IAAK,CAACA,KAAK,CAAC;CAC9H;CACA,cAAA;EAAA,IAAAwF,QAAAC,QAAA,GAAAC,QAAAF,MAAApC,YAAAuC,QAAAD,MAAAtC,YAAAwC,QAAAD,MAAAE;EAAAvC,OAAAkC,OAAA3C,gBAEKlE,KAAG;GAAA,IAACgF,OAAI;IAAA,OAAE1C,MAAMuD,QAAQK;GAAS;GAAA9B,WAC9B+C,UAAUf,iBAAK;IAAA,IAAAgB,QAAAC,QAAA,GAAAC,SAAAF,MAAA3C,YAAA8C,SAAAD,OAAAJ;IAAAvC,OAAAyC,OAAAlD,gBAEZ/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEgD,SAASK;KAAM;KAAA,IAAApD,WAAA;MAAA,IAAAqD,QAAAC,QAAA;MAAA/C,OAAA8C,aAAwCN,SAASK,MAAM;MAAA,OAAAC;KAAA;IAAA,CAAA,GAAAH,MAAA;IAAA3C,OAAA2C,cAC9CH,SAASA,QAAQ;IAAAxC,OAAA4C,QAAArD,gBAElDlE,KAAG;KAAA,IAACgF,OAAI;MAAA,OAAEmC,SAASQ;KAAO;KAAAvD,WACvBwD,kBAAM;MAAA,IAAAC,SAAAC,QAAA,GAAAC,SAAAF,OAAApD;MAAAoD,OAAAG,gBAMWvB,OAAOL,MAAM,GAAGwB,OAAOvG,OAAO,CAAC,CAAC8F,SAAST,QAAQ;MAAC/B,OAAAoD,cAEpBH,OAAOvG,KAAK;MAAAsD,OAAAkD,QAAA3D,gBACxD/D,MAAI;OAAA,IAACgE,OAAI;QAAA,OAAEyD,OAAOK;OAAW;OAAA,IAAA7D,WAAA;QAAA,IAAA8D,SAAAC,QAAA;QAAAxD,OAAAuD,cAAqDN,OAAOK,WAAW;QAAA,OAAAC;OAAA;MAAA,CAAA,GAAA,IAAA;MAAAtD,QAAAW,QAAA;OAAA,IAAA6C,OAL/FjB,SAAST,WAAW,aAAa,SAAO2B,OAChCtC,QAAQ,CAAC,CAACK,MAAM,EAAE,EAAEO,SAASiB,OAAOvG,KAAK,KAAK;OAAK+G,SAAA7C,IAAAG,KAAAb,aAAAgD,QAAA,QAAAtC,IAAAG,IAAA0C,IAAA;OAAAC,SAAA9C,IAAAI,KAAAd,aAAAgD,QAAA,gBAAAtC,IAAAI,IAAA0C,IAAA;OAAA,OAAA9C;MAAA,GAAA;OAAAG,GAAAlC,KAAAA;OAAAmC,GAAAnC,KAAAA;MAAA,CAAA;MAAA,OAAAqE;KAAA,EAAA,CAAA;IAMpE,CAAA,CAAA;IAAAlD,OAAAyC,OAAAlD,gBAGJ/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEgD,SAASmB,WAAW;KAAK;KAAA,IAAAlE,WAAA;MAAA,IAAAmE,SAAAC,QAAA;MAAAD,OAAAE,WACoDC,UAAUvC,IAAIC,MAAM,GAAGsC,MAAMC,cAActC,MAAMuC,KAAK,IAAI,CAACF,MAAMC,cAActC,MAAMuC,KAAK,CAAC,IAAI,CAAA,CAAE;MAAC,OAAAL;KAAA;IAAA,CAAA,GAAA,IAAA;IAAA3D,aAAAC,aAAA0C,QAAA,QAjB/IJ,SAAST,WAAW,UAAU,YAAY,CAAA;IAAA,OAAAU;GAAA,EAAA,CAAA;EAoBzF,CAAA,GAAAL,KAAA;EAAAC,MAAAgB,gBAGgF1F,MAAM0D,OAAO;EAACiB,MAAAe,gBAC+C1F,MAAMwD,SAASC,QAAQ,CAAC;EAACnB,aAAAqC,MAAA4B,WAAzF,CAAC9C,QAAQ,CAAC,CAAC+C,OAAOC,WAAWA,OAAO5D,SAAS,CAAC,CAAC;EAAA,OAAA0B;CAAA,EAAA,CAAA;AAIrI;AAEA,SAASmC,eAAe1G,OAAkG;CACxH,MAAM6G,kBAAkB7G,MAAMuD,QAAQsD,YAAY,CAAA,EAAA,CAAIvC,OAAOwC,OAAO;CAEpE,MAAM,CAACC,SAASC,cAAcvJ,aAAa,KAAK;CAChD,MAAMwJ,SAASL,aAA2C;EACxD,IAAIG,QAAQ,GAAG;EACfC,WAAW,IAAI;EACfhH,MAAM2G,QAAQC,QAAQ;CACxB;CACA,cAAA;EAAA,IAAAM,SAAAC,QAAA,GAAAE,SAAAH,OAAA/E,WAAAyC,aAAA2C,SAAAF,OAAAlF,WAAAyC;EAAA2C,OAAA3C;EAAA,IAAA6C,SAAAJ,OAAAzC,aAAA8C,SAAAD,OAAAtF,YAAAwF,SAAAD,OAAA9C,aAAAgD,SAAAD,OAAA/C;EAAAvC,OAAAgF,cAGmErH,MAAMuD,QAAQsE,cAAc,UAAQN,MAAA;EAAAlF,OAAA6E,QAAAtF,gBAClG/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEgF,SAAS,CAAC,CAAChE;GAAM;GAAA,IAAAf,WAAA;IAAA,IAAAgG,SAAAC,QAAA;IAAA1F,OAAAyF,cAA4CjB,SAAS,CAAC,CAAClF,KAAK,IAAI,CAAC;IAAA,OAAAmG;GAAA;EAAA,CAAA,GAAAL,MAAA;EAAAC,OAAAhC,gBAE8BuB,MAAM,QAAQ;EAACU,OAAAjC,gBACfuB,MAAM,QAAQ;EAACW,OAAAlC,gBACfuB,MAAM,MAAM;EAAC3E,QAAAW,QAAA;GAAA,IAAA+E,OAFvCjB,QAAQ,GAACkB,OACTlB,QAAQ,GAACmB,OACTnB,QAAQ;GAACiB,SAAA/E,IAAAG,MAAAsE,OAAAnB,WAAAtD,IAAAG,IAAA4E;GAAAC,SAAAhF,IAAAI,MAAAsE,OAAApB,WAAAtD,IAAAI,IAAA4E;GAAAC,SAAAjF,IAAAkF,MAAAP,OAAArB,WAAAtD,IAAAkF,IAAAD;GAAA,OAAAjF;EAAA,GAAA;GAAAG,GAAAlC,KAAAA;GAAAmC,GAAAnC,KAAAA;GAAAiH,GAAAjH,KAAAA;EAAA,CAAA;EAAA,OAAAgG;CAAA,EAAA,CAAA;AAIjH;AAEA,SAAgBkB,KAAKpI,OAAkE;CACrF,MAAMqF,UAAUrF,MAAMqF;CACtB,MAAMiD,OAAOxK,qBAAqB;EAChCW,KAAK4G,QAAQ5G;EACbU,OAAOkG,QAAQlG;EACfC,cAAciG,QAAQjG;EACtBC,YAAYgG,QAAQhG;EACpBC,gBAAgB+F,QAAQ/F;EACxBC,cAAc8F,QAAQ9F;CACxB,CAAC;CACD,IAAIgJ;CACJ,IAAIE;CACJ,MAAM,CAACE,OAAOC,YAAYnL,aAAa,EAAE;CAEzC,MAAM0C,SAAS3C,kBAAkB;EAAE,GAAG8K,KAAKrJ,WAAW;EAAG,GAAGoG,QAAQpG;CAAW,EAAE;CAEjF,MAAM4J,aAAa;EACjBJ,MAAMK,MAAMC,SAAS;EACrBN,MAAMK,MAAMC,SAAS,GAAGC,KAAKC,IAAIR,MAAMS,cAAc,GAAG,EAAC;CAC3D;CACA,MAAMC,cAAc;EAClBV,MAAM1E,QAAQ;EACd6E,SAAS,EAAE;EACXC,KAAK;CACP;CACA,MAAMO,WAAWzJ,SAAiB;EAChC8I,MAAM1E,QAAQpE;EACdiJ,SAASjJ,IAAI;EACbkJ,KAAK;CACP;;CAEA,MAAMQ,WAAW,OAAO1J,SAAiB;EACvC,MAAMH,SAAS,MAAM8I,KAAK5I,KAAKC,IAAI;EACnC,IAAIH,WAAW,YAAY,CAACmJ,MAAM,GAAGS,QAAQzJ,IAAI;EACjD,OAAOH,WAAW;CACpB;CACA,MAAM8J,SAAS,YAAY;EACzB,MAAM3J,OAAOgJ,MAAM;EACnB,IAAI,CAAChJ,KAAK2G,KAAK,KAAK,CAACgC,KAAKiB,MAAM,GAAG;EACnCJ,MAAM;EACN,MAAME,SAAS1J,IAAI;CACrB;CAIA,IAAI6J,UAAqE,CAAA;CACzE,IAAIG,QAAQ/J,QAAQ6J,QAAQ;CAC5B,MAAMG,gBAAgBjK,SACpB,IAAIC,SAAkB6J,YAAY;EAChCD,QAAQK,KAAK;GAAElK;GAAM8J;EAAQ,CAAC;EAC9B,IAAInB,KAAKiB,MAAM,GAAGO,MAAM;CAC1B,CAAC;CACH,MAAMA,cAAc;EAClB,MAAMC,QAAQP;EACdA,UAAU,CAAA;EACV,KAAK,MAAM,EAAE7J,MAAM8J,aAAaM,OAAOJ,QAAQA,MAAMK,WAAWX,SAAS1J,IAAI,CAAC,CAACqK,KAAKP,eAAeA,QAAQ,KAAK,CAAC,CAAC;CACpH;CACAlM,aAAaI,GAAG2K,KAAKiB,QAAQA,UAAU;EAAE,IAAIA,OAAOO,MAAM;CAAE,CAAC,CAAC;CAC9DlM,gBAAgB;EAAE,KAAK,MAAM,EAAE6L,aAAaD,SAASC,QAAQ,KAAK;CAAE,CAAC;CACrE,MAAMQ,gBAAgB3B,KAAKpI,UAAU,KAAK,CAACyI,MAAM,CAAC,CAACrC,KAAK;CACxD,MAAM4D,iBAAiB;EAAE,MAAM5J,MAAMgI,KAAK6B,WAAW;EAAG,OAAO7J,IAAIuC,SAASyF,KAAKrI,KAAKK,IAAIA,IAAIuC,SAAS,EAAG,IAAI3B,KAAAA;CAAU;CACxH,MAAMkJ,sBAAsB9B,KAAKpI,UAAU,KAAKgK,SAAS,CAAC,EAAE9J,QAAQW,SAAS;CAI7E,IAAIsJ,SAAS;CACb,MAAMC,mBAAmB,CAAC/B,YAAYA,SAASW,eAAeX,SAASgC,YAAYhC,SAASiC,eAAe;CAC3GlN,eAAeK,GAAG2K,KAAKmC,eAAe;EAAEJ,SAASC,WAAW;CAAE,GAAG,EAAEI,OAAO,KAAK,CAAC,CAAC;CACjFnN,aAAaI,GAAG2K,KAAKmC,eAAe;EAClC,IAAIJ,QAAQ9B,SAASgC,YAAYhC,SAASW;EAE1C,IAAIX,SAASW,gBAAgBX,SAASiC,eAAe,KAAKlC,KAAKqC,MAAM;CACvE,GAAG,EAAED,OAAO,KAAK,CAAC,CAAC;CAEnB1K,MAAMqI,IAAI;EAAE3I,MAAMkK;EAAc/J,aAAa4I,OAAO5I,MAAM;EAAGC,eAAewI,KAAKxI,QAAQ;CAAE,CAAC;CAE5F,cAAA;EAAA,IAAA8K,SAAAC,SAAA,GAAAC,SAAAF,OAAAzI,YAAA4I,SAAAD,OAAA3I,YAAA6I,SAAAD,OAAA5I,YAAA8I,SAAAF,OAAAnG,aAAAsG,SAAAD,OAAA9I,YAAAgJ,SAAAF,OAAArG,aAAAwG,SAAAN,OAAAlG,aAAAyG,SAAAD,OAAAjJ,YAAAmJ,SAAAF,OAAAxG,aAAA2G,SAAAD,OAAAnJ,YAAAqJ,SAAAD,OAAApJ,YAAAuJ,SAAAF,OAAArJ,WAAAA,YAAA2J,SAAAN,OAAA5G,YAAAzC,WAAAA,WAAAA,YAAA6J,SAAAF,OAAA3J,WAAAA,YAAA8J,SAAAD,OAAApH,aAAAwH,SAAAN,OAAAlH,YAAAzC,WAAAA;EAAAE,OAAA2I,cAI0C3F,QAAQ3G,KAAK;EAAA2D,OAAA0I,QAAAnJ,gBAC9C/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEwD,QAAQ1G;GAAQ;GAAA,IAAAmD,WAAA;IAAA,IAAAuK,SAAAC,SAAA;IAAAjK,OAAAgK,cAAuChH,QAAQ1G,QAAQ;IAAA,OAAA0N;GAAA;EAAA,CAAA,GAAA,IAAA;EAAAhK,OAAA6I,cAG3C5C,KAAKiE,OAAO,CAAC,CAAC5M,IAAI;EAAAwL,OAAAzF,gBAE4G;GAAE,KAAU5F,QAAQ;GAAG2I,MAAM5I,MAAM;EAAE;EAACwC,OAAA8I,QAAAvJ,gBAC3MtD,MAAI,CAAA,CAAA,CAAA;EAAA8M,OAAAoB,iBAAA,gBAI6D;GAAE,IAAIjE,SAASgC,YAAY,KAAKjC,KAAKqC,MAAM;EAAE,CAAC;EAAA,IAAA8B,QAAxElE;EAAQ,OAAAkE,UAAA,aAAAC,IAAAD,OAAArB,MAAA,IAAR7C,WAAQ6C;EAAA/I,OAAA+I,QAAAxJ,gBACjD/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEe,WAAA0F,KAAK6B,WAAW,CAAC,CAACtH,WAAW,CAAC,CAAA,CAAA,KAAIyF,KAAKiB,MAAM;GAAC;GAAA,IAAAzH,WAAA;IAAA,IAAA6K,SAAAC,SAAA,GAAAC,SAAAF,OAAAxK;IAAAE,OAAAwK,cAEfxH,QAAQ3G,KAAK;IAAA2D,OAAAsK,QAAA/K,gBACnD/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEwD,QAAQ1G;KAAQ;KAAA,IAAAmD,WAAA;MAAA,IAAAgL,SAAAC,SAAA;MAAA1K,OAAAyK,cAA4CzH,QAAQ1G,QAAQ;MAAA,OAAAmO;KAAA;IAAA,CAAA,GAAA,IAAA;IAAAzK,OAAAsK,QAAA/K,gBACvF/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEwD,QAAQxG,YAAYgE;KAAM;KAAA,IAAAf,WAAA;MAAA,IAAAkL,SAAAC,SAAA;MAAA5K,OAAA2K,QAAApL,gBAEjClE,KAAG;OAAA,IAACgF,OAAI;QAAA,OAAE2C,QAAQxG;OAAW;OAAAiD,WAC1BoL,sBAAU;QAAA,IAAAC,SAAAC,SAAA;QAAAD,OAAAzH,gBAA0E,KAAK2D,SAAS6D,WAAWlO,MAAM;QAACqD,OAAA8K,cAAGD,WAAWnO,KAAK;QAAA,OAAAoO;OAAA,EAAA,CAAA;MAAU,CAAA,CAAA;MAAA,OAAAH;KAAA;IAAA,CAAA,GAAA,IAAA;IAAA,OAAAL;GAAA;EAAA,CAAA,GAAAtB,MAAA;EAAAhJ,OAAAgJ,QAAAzJ,gBAO1JlE,KAAG;GAAA,IAACgF,OAAI;IAAA,OAAE4F,KAAK6B,WAAW;GAAC;GAAArI,WAAIrB,OAAEmB,gBAAM7B,UAAQ;IAACE,YAAYqI,KAAKrI,KAAKQ,EAAE;IAAC,IAAEP,YAAS;KAAA,OAAEoI,KAAKpI;IAAS;IAAA,IAAEC,SAAM;KAAA,OAAEA,OAAO;IAAC;GAAA,CAAA;EAAI,CAAA,GAAA,IAAA;EAAAkC,OAAAgJ,QAAAzJ,gBAC1H/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEuI,cAAc;GAAC;GAAA,IAAAtI,WAAA;IAAA,IAAAuL,SAAAC,SAAA;IAAAjL,OAAAgL,QAAAzL,gBAC6B1D,aAAW;KAACQ,OAAK;KAAYoE,QAAQ;KAAMzB,MAAI;IAAA,CAAA,CAAA;IAAA,OAAAgM;GAAA;EAAA,CAAA,GAAA,IAAA;EAAAhL,OAAAiJ,QAAA1J,gBAMxG/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEyG,KAAKiF,YAAY,CAAC,CAAC;GAAE;GAAEC,OAAK;GAAA1L,WACpCyB,YAAO3B,gBAAM8E,gBAAc;IAAUnD;IAASoD,UAAUC,aAAa,KAAK0B,KAAKmF,gBAAgBlK,QAAQ9C,IAAImG,QAAQ;GAAC,CAAA;EAAI,CAAA,GAAA2E,MAAA;EAAAlJ,OAAAiJ,QAAA1J,gBAE3H/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEyG,KAAK1E,UAAU,CAAC,CAAC;GAAE;GAAE4J,OAAK;GAAA1L,WAClCyB,YAAO3B,gBAAM0B,cAAY;IAAUC;IAASC,WAAWC,YAAY,KAAK6E,KAAK7B,OAAOlD,QAAQ9C,IAAIgD,OAAO;IAAGC,cAAc,KAAK4E,KAAKoF,OAAOnK,QAAQ9C,EAAE;GAAC,CAAA;EAAI,CAAA,GAAA8K,MAAA;EAAAlJ,OAAAiJ,QAAA1J,gBAE3J/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEyG,KAAKnH,MAAM,KAAKmH,KAAKqF,YAAY;GAAC;GAAA,IAAA7L,WAAA;IAAA,IAAA8L,SAAAC,SAAA,GAAAC,SAAAF,OAAAzL;IAAAE,OAAAyL,cAEnCxF,KAAKnH,MAAM,KAAK,gDAAgD;IAAAkB,OAAAuL,QAAAhM,gBACtE/D,MAAI;KAAA,IAACgE,OAAI;MAAA,OAAEyG,KAAKqF,YAAY;KAAC;KAAA,IAAA7L,WAAA;MAAA,IAAAiM,SAAAC,SAAA;MAAAD,OAAArI,gBACyE,KAAK4C,KAAK2F,MAAM;MAAC,OAAAF;KAAA;IAAA,CAAA,GAAA,IAAA;IAAA,OAAAH;GAAA;EAAA,CAAA,GAAArC,MAAA;EAAAG,OAAAwC,aAcxG9H,UAAU;GACpB,IAAIA,MAAM+H,QAAQ,WAAW,CAAC/H,MAAMgI,YAAY,CAAChI,MAAMiI,aAAa;IAClEjI,MAAMkI,eAAe;IACrB,OAAY;GACd;EACF;EAAC5C,OAAAvF,WANSC,UAAU;GAAEwC,SAASxC,MAAMC,cAActC,KAAK;GAAG8E,KAAK;EAAE;EAAC,IAAA0F,SAL9D9F;EAAK,OAAA8F,WAAA,aAAA7B,IAAA6B,QAAA7C,MAAA,IAALjD,QAAKiD;EAAAM,OAAAQ,iBAAA,WAoBiGpG,UAAUkC,KAAKkG,YAAYpI,MAAMC,cAActC,KAAK,CAAC;EAAA1B,OAAA2J,QAAApK,gBACzJlE,KAAG;GAAA,IAACgF,OAAI;IAAA,OAAE4F,KAAKmG,YAAY;GAAC;GAAA3M,WACzB4M,iBAAK;IAAA,IAAAC,SAAAC,SAAA;IAAAvM,OAAAsM,QAAA/M,gBAEFlE,KAAG;KAAA,IAACgF,OAAI;MAAA,OAAEgM,MAAMG;KAAM;KAAA/M,WAAIgN,iBAAK;MAAA,IAAAC,SAAAC,SAAA;MAAA3M,OAAA0M,cAA+ED,MAAM/P,KAAK;MAAAuD,aAAAyM,OAAAE,WAA/CH,MAAM/K,UAAUuE,KAAK4G,WAAW,CAAC;MAAA5M,aAAAyM,OAAAhL,QAAxD+K,MAAM/K,KAAK;MAAA,OAAAgL;KAAA,EAAA,CAAA;IAAqE,CAAA,CAAA;IAAAzM,aAAAC,aAAAoM,QAAA,SADrHD,MAAM3P,KAAK,CAAA;IAAA,OAAA4P;GAAA,EAAA,CAAA;EAG7B,CAAA,CAAA;EAAAtM,OAAA4J,QAAArK,gBAGmCvD,aAAW,CAAA,CAAA,CAAA;EAAA+N,OAAA1G,gBAejCuE,QAAQ,IAAI,KAAK3B,KAAK6G,MAAM,IAAI,KAAK7F,OAAO;EAAEjH,OAAA+J,QAAAxK,gBAE7D/D,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEoI,QAAQ;GAAC;GAAA,IAAElI,WAAQ;IAAA,OAAAH,gBAAGxD,SAAO,CAAA,CAAA;GAAA;GAAA,IAAA0D,WAAA;IAAA,OAAAF,gBAAMrD,MAAI,CAAA,CAAA;GAAA;EAAA,CAAA,CAAA;EAAA+D,QAAAW,QAAA;GAAA,IAAAmM,OArGrB9G,KAAK+G,UAAU,KAAK,IAAEC,OAMrBhH,KAAKiE,OAAO,CAAC,CAACgD,MAAIC,OAASlH,KAAKiE,OAAO,CAAC,CAAC5M,MAAI8P,OA6CjC,CAACnH,KAAKiB,MAAM,GAACmG,QAOjDrK,QAAQzG,aAAW+Q,QACpBtK,QAAQzG,aAAWgR,QAgBqC,CAACtH,KAAKmG,YAAY,CAAC,CAAC5L,QAAMgN,QAqB1E5F,QAAQ,IAAI,KAAK/I,KAAAA,GAAS4O,QAC5B7F,QAAQ,IAAI,SAAS,QAAM8F,QAC7B9F,QAAQ,IAAI,QAAQ,CAAC3B,KAAKiB,MAAM,KAAK,CAACZ,MAAM,CAAC,CAACrC,KAAK;GAAC8I,SAAAnM,IAAAG,KAAAb,aAAAqI,QAAA,mBAAA3H,IAAAG,IAAAgM,IAAA;GAAAE,SAAArM,IAAAI,KAAAd,aAAA0I,QAAA,aAAAhI,IAAAI,IAAAiM,IAAA;GAAAE,SAAAvM,IAAAkF,KAAA5F,aAAA0I,QAAA,SAAAhI,IAAAkF,IAAAqH,IAAA;GAAAC,SAAAxM,IAAA+M,KAAAzN,aAAAgJ,QAAA,aAAAtI,IAAA+M,IAAAP,IAAA;GAAAC,UAAAzM,IAAAiB,KAAA3B,aAAAmJ,QAAA,eAAAzI,IAAAiB,IAAAwL,KAAA;GAAAC,UAAA1M,IAAAgN,KAAA1N,aAAAmJ,QAAA,cAAAzI,IAAAgN,IAAAN,KAAA;GAAAC,UAAA3M,IAAAiN,MAAAlE,OAAAzF,WAAAtD,IAAAiN,IAAAN;GAAAC,UAAA5M,IAAAkN,KAAA5N,aAAA6J,QAAA,gBAAAnJ,IAAAkN,IAAAN,KAAA;GAAAC,UAAA7M,IAAAmN,KAAA7N,aAAA6J,QAAA,cAAAnJ,IAAAmN,IAAAN,KAAA;GAAAC,UAAA9M,IAAAoN,MAAAjE,OAAA7F,WAAAtD,IAAAoN,IAAAN;GAAA,OAAA9M;EAAA,GAAA;GAAAG,GAAAlC,KAAAA;GAAAmC,GAAAnC,KAAAA;GAAAiH,GAAAjH,KAAAA;GAAA8O,GAAA9O,KAAAA;GAAAgD,GAAAhD,KAAAA;GAAA+O,GAAA/O,KAAAA;GAAAgP,GAAAhP,KAAAA;GAAAiP,GAAAjP,KAAAA;GAAAkP,GAAAlP,KAAAA;GAAAmP,GAAAnP,KAAAA;EAAA,CAAA;EAAA,OAAA0J;CAAA,EAAA,CAAA;AAcpF;AAAC0F,eAAA;CAAA;CAAA;CAAA;AAAA,CAAA;;;;;;;;ACtQD,SAAgBwC,aAAaC,MAAmBE,UAA0B,CAAC,GAAkB;CAC3F,MAAMC,OAAOH,KAAKI,cAAcJ,KAAKK,aAAa,EAAEC,MAAM,OAAO,CAAC;CAClEH,KAAKI,gBAAgB;CACrB,MAAMC,QAAQC,SAASC,cAAc,OAAO;CAC5CF,MAAMG,cAAcxC;CACpB,MAAMyC,YAAYH,SAASC,cAAc,KAAK;CAC9CE,UAAUJ,MAAMK,SAAS;CACzBV,KAAKW,OAAON,OAAOI,SAAS;CAC5B,IAAIV,QAAQd,UAAU,WAAWc,QAAQd,UAAU,QAAQY,KAAKe,aAAa,cAAcb,QAAQd,KAAK;MACnGY,KAAKgB,gBAAgB,YAAY;CAEtC,IAAIC;CACJ,MAAMnB,UAAU7B,aAAOiD,gBACpB9C,MAAI;EACH6C,MAAME,UAAWF,MAAME;EAAM,IAC7BjB,UAAO;GAAA,OAAE;IACP3B,KAAK2B,QAAQ3B,OAAO;IACpBC,OAAO0B,QAAQ1B,SAAS;IACxBC,UAAUyB,QAAQzB;IAClBC,aAAawB,QAAQxB,eAAe;IACpCC,aAAauB,QAAQvB,eAAe,CAAA;IACpCI,YAAYmB,QAAQnB,cAAc,CAAC;IACnCO,OAAOY,QAAQZ,SAAS;IACxBC,cAAcW,QAAQX,gBAAgB;IACtCF,YAAYa,QAAQb,cAAc;IAClCJ,gBAAgBiB,QAAQjB;IACxBC,cAAcgB,QAAQhB;GACxB;EAAC;CAAA,CAAA,GAEF0B,SAAS;CAEZ,OAAO;EACLnB,OAAOC,SAASuB,KAAKxB,KAAKC,IAAI,KAAKC,QAAQyB,QAAQ,KAAK;EACxDxB,aAAaqB,KAAKrB,MAAM;EACxBC,eAAeoB,KAAKpB,QAAQ,KAAKF,QAAQyB,QAAQ;EACjDtB,eAAe;GACbA,QAAQ;GACRK,KAAKI,gBAAgB;EACvB;CACF;AACF;;AAGA,SAAgBc,QAAQC,OAAoI;CAC1J,IAAItB;CACJjC,cAAc;EACZ,MAAM4D,SAAS5B,aAAaC,MAAMsB,KAAK;EACvCA,MAAMI,MAAMC,MAAM;EAClB7D,gBAAgB6D,OAAO7B,QAAQ,CAAC;CAClC,CAAC;CACD,cAAA;EAAA,IAAA+B,OAAAC,OAAA;EAAA,IAAAC,QAAiB/B;EAAI,OAAA+B,UAAA,aAAAC,IAAAD,OAAAF,IAAA,IAAJ7B,OAAI6B;EAAAI,QAAAC,QAAA;GAAA,IAAAC,MAAMb,MAAMC,IAAEa,OAASd,MAAME,OAAKa,OAASf,MAAMd;GAAK2B,QAAAD,IAAAI,KAAAC,aAAAV,MAAA,MAAAK,IAAAI,IAAAH,GAAA;GAAAC,SAAAF,IAAAM,KAAAC,UAAAZ,MAAAK,IAAAM,IAAAJ,IAAA;GAAAF,IAAAQ,IAAAC,MAAAd,MAAAQ,MAAAH,IAAAQ,CAAA;GAAA,OAAAR;EAAA,GAAA;GAAAI,GAAAM,KAAAA;GAAAJ,GAAAI,KAAAA;GAAAF,GAAAE,KAAAA;EAAA,CAAA;EAAA,OAAAf;CAAA,EAAA,CAAA;AAC7E"}
|
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Part, ProviderInventory, ToolPart, ToolState } from "@rohansguliani/mux-chat-core";
|
|
2
|
+
export type ModelOption = {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export type ModelGroup = {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
models: ModelOption[];
|
|
10
|
+
};
|
|
11
|
+
/** Connected providers and their models, in runtime order. */
|
|
12
|
+
export declare function modelGroups(inventory: ProviderInventory): ModelGroup[];
|
|
13
|
+
/**
|
|
14
|
+
* The model to use: the user's stored pick, else the app's preference, else a
|
|
15
|
+
* connected provider's default, else the first available. `undefined` when
|
|
16
|
+
* nothing is available.
|
|
17
|
+
*/
|
|
18
|
+
export declare function chooseModel(groups: ModelGroup[], inventory: ProviderInventory, stored?: string, preferred?: string): string | undefined;
|
|
19
|
+
export declare function parseModel(value: string | undefined): {
|
|
20
|
+
providerID: string;
|
|
21
|
+
modelID: string;
|
|
22
|
+
} | undefined;
|
|
23
|
+
/** Parts a reader sees, in order: text, non-empty reasoning, and tool calls. */
|
|
24
|
+
export declare function visibleParts(parts: readonly Part[]): Part[];
|
|
25
|
+
/** "add_to_watchlist" → "Add to watchlist". */
|
|
26
|
+
export declare const humanize: (name: string) => string;
|
|
27
|
+
export declare function toolTitle(tool: string, labels?: Record<string, string>): string;
|
|
28
|
+
/** One line under the tool name: the tool's own title once it has one, else its most telling input. */
|
|
29
|
+
export declare function toolSubtitle(state: ToolState): string;
|
|
30
|
+
export declare const toolActive: (part: ToolPart) => boolean;
|
|
31
|
+
export declare function toolDetail(state: ToolState): string;
|
|
32
|
+
export declare const seconds: (start: number, end: number) => string;
|
|
33
|
+
export declare const sameIDs: (a: readonly string[], b: readonly string[]) => boolean;
|
package/dist/mount.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type JSX } from "solid-js";
|
|
2
|
+
import type { ToolResult } from "./controller.js";
|
|
3
|
+
export type MuxChatOptions = {
|
|
4
|
+
/** Where the app mounts `mux.handle` (@rohansguliani/mux-chat-runtime). Default `/api/mux`. */
|
|
5
|
+
url?: string;
|
|
6
|
+
/** Header and empty-state title. Default "Assistant". */
|
|
7
|
+
title?: string;
|
|
8
|
+
subtitle?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
/** Starter prompts shown in an empty chat. */
|
|
11
|
+
suggestions?: Array<{
|
|
12
|
+
label: string;
|
|
13
|
+
prompt: string;
|
|
14
|
+
}>;
|
|
15
|
+
/** Overrides tool names in the transcript; by default they come from each tool's `label`. */
|
|
16
|
+
toolLabels?: Record<string, string>;
|
|
17
|
+
/** Model to select when the user has not picked one, as `provider/model`. */
|
|
18
|
+
preferredModel?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Called when a tool call finishes while the chat is open. `readOnly` is
|
|
21
|
+
* false when the tool may have changed app data: refresh it then.
|
|
22
|
+
*/
|
|
23
|
+
onToolResult?: (result: ToolResult) => void;
|
|
24
|
+
/** Default follows the operating system. */
|
|
25
|
+
theme?: "light" | "dark" | "system";
|
|
26
|
+
/** Prefix for the browser storage that remembers the open chat and model. Default `mux-chat`. */
|
|
27
|
+
storageKey?: string;
|
|
28
|
+
/** Agent that answers; embed grants force `assistant`. */
|
|
29
|
+
agent?: string;
|
|
30
|
+
/** Title of sessions the chat creates. */
|
|
31
|
+
sessionTitle?: string;
|
|
32
|
+
};
|
|
33
|
+
export type MuxChatHandle = {
|
|
34
|
+
/**
|
|
35
|
+
* Sends a message as the user, waiting for the chat to be ready if it is not
|
|
36
|
+
* yet. Resolves true once delivered; false otherwise (a refused message is
|
|
37
|
+
* put back into an empty composer).
|
|
38
|
+
*/
|
|
39
|
+
send(text: string): Promise<boolean>;
|
|
40
|
+
focus(): void;
|
|
41
|
+
/** Starts a new, empty chat. */
|
|
42
|
+
newChat(): Promise<void>;
|
|
43
|
+
dispose(): void;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Renders the Mux chat into `host` (inside its shadow root, with Mux's
|
|
47
|
+
* styles). Give `host` a height, e.g. a sidebar column.
|
|
48
|
+
*/
|
|
49
|
+
export declare function mountMuxChat(host: HTMLElement, options?: MuxChatOptions): MuxChatHandle;
|
|
50
|
+
/** Solid wrapper around `mountMuxChat`. Options are read once, at mount. */
|
|
51
|
+
export declare function MuxChat(props: MuxChatOptions & {
|
|
52
|
+
id?: string;
|
|
53
|
+
class?: string;
|
|
54
|
+
style?: JSX.CSSProperties | string;
|
|
55
|
+
ref?: (handle: MuxChatHandle) => void;
|
|
56
|
+
}): JSX.Element;
|