@amd-gaia/agent-ui 0.17.4 → 0.17.5

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.
@@ -0,0 +1 @@
1
+ .sidebar{width:var(--sidebar-w);min-width:var(--sidebar-w);display:flex;flex-direction:column;background:var(--bg-sidebar);border-right:1px solid var(--border);-webkit-user-select:none;user-select:none;transition:width .2s var(--ease),min-width .2s var(--ease),transform .2s var(--ease);position:relative;font-family:var(--font-sans)}[data-theme=dark] .sidebar{background:#08080deb;backdrop-filter:blur(24px) saturate(1.2);-webkit-backdrop-filter:blur(24px) saturate(1.2)}.sidebar.resizing{transition:none}.sidebar-top{display:flex;align-items:center;justify-content:space-between;padding:16px 16px 12px;gap:8px}.sidebar-brand{display:flex;align-items:center;gap:10px;overflow:hidden;flex-shrink:1;min-width:0}.brand-icon{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:var(--radius-md);flex-shrink:0;overflow:hidden}.brand-icon img{width:100%;height:100%;object-fit:cover}.brand-text{display:flex;align-items:baseline;gap:6px;white-space:nowrap;overflow:hidden}.brand-name{font-size:15px;font-weight:700;font-family:var(--font-display);letter-spacing:2px;text-transform:uppercase;background:linear-gradient(135deg,var(--amd-red),#ff6b35);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.brand-label{font-size:12px;font-weight:500;font-family:var(--font-sans);color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.brand-version{font-size:10px;font-weight:500;font-family:var(--font-mono);color:var(--text-muted);opacity:.5;align-self:center;margin-left:2px}.sidebar-top-actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.new-task-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:var(--radius-md);border:1px solid var(--border);transition:all var(--duration) var(--ease)}.new-task-btn:hover{background:var(--amd-red-dim);border-color:var(--amd-red);color:var(--amd-red);transform:translateY(-1px)}.collapse-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:var(--radius-md);color:var(--text-muted);transition:all var(--duration) var(--ease)}.collapse-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.sidebar-search{position:relative;padding:0 12px 10px;transition:opacity .15s var(--ease)}.sidebar-search .search-icon{position:absolute;left:22px;top:50%;transform:translateY(-60%);color:var(--text-muted);pointer-events:none}.sidebar-search input{width:100%;padding:9px 12px 9px 32px;border:1px solid var(--border);border-radius:var(--radius-lg);outline:none;font-size:12px;font-family:var(--font-sans);background:var(--bg-tertiary);box-shadow:inset 0 1px 1px #00000008;transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease),background var(--duration) var(--ease)}.sidebar-search input:hover{border-color:var(--border-light)}.sidebar-search input:focus{border-color:#ed1c2459;background:var(--bg-secondary);box-shadow:inset 0 1px 1px #0000000a,0 0 0 3px #ed1c2414}.sidebar-search input::placeholder{color:var(--text-muted);font-family:var(--font-sans)}.session-list{flex:1;overflow-y:auto;padding:4px 8px;transition:opacity .15s var(--ease)}.session-group-label{padding:12px 10px 6px;font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:2px;color:var(--text-muted);-webkit-user-select:none;user-select:none}.session-list>div+div>.session-group-label{margin-top:4px;border-top:1px solid var(--border-light);padding-top:12px}.session-item{display:flex;align-items:center;padding:9px 10px 9px 14px;border-radius:var(--radius-lg);cursor:pointer;margin-bottom:3px;position:relative;border:1px solid transparent;transition:background-color .22s var(--ease),border-color .22s var(--ease),box-shadow .28s var(--ease),transform var(--duration-fast) var(--ease);outline:none}.session-item:hover{background:var(--bg-hover);border-color:var(--border-light)}.session-item:active:not(.session-deleting){transform:scale(.985);transition-duration:80ms}.session-item.active{background:var(--bg-active);border-color:var(--border);box-shadow:inset 0 1px #ffffff0a,0 1px 1px #0000000a,0 4px 10px -2px #0000001a,0 8px 20px -8px #00000014;animation:sessionActivate .32s var(--ease)}.session-item.active .session-title{text-shadow:0 0 .4px var(--text-primary)}[data-theme=dark] .session-item.active{background:#ffffff0a;border-color:#ffffff14;box-shadow:inset 0 1px #ffffff0f,0 1px 2px #0000004d,0 6px 16px -2px #00000073,0 12px 28px -10px #0000004d;animation:sessionActivate .32s var(--ease)}@keyframes sessionActivate{0%{transform:translate(-4px);opacity:.65}to{transform:translate(0);opacity:1}}.session-item:focus-visible{outline:2px solid var(--terminal-green);outline-offset:-2px}.session-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-family:var(--font-sans);font-weight:400}.session-hash{font-size:9px;font-family:var(--font-mono);color:var(--text-muted);opacity:0;margin-left:4px;flex-shrink:0;padding:1px 5px;border-radius:var(--radius-sm);text-decoration:none;letter-spacing:.5px;transition:all .15s var(--ease);cursor:pointer;white-space:nowrap}.session-item:hover .session-hash,.session-item:focus-within .session-hash,.session-item.active .session-hash{opacity:.5}.session-hash:hover{opacity:1!important;color:var(--amd-red);background:var(--amd-red-dim2)}.session-hash.copied{opacity:1!important;color:var(--accent-green);background:#4ec9321a}.session-time{font-size:10px;font-family:var(--font-mono);color:var(--text-muted);margin-left:8px;flex-shrink:0;transition:opacity .1s var(--ease)}.session-item:hover .session-time,.session-item:focus-within .session-time{opacity:0}.session-delete{display:none;align-items:center;position:absolute;right:8px;padding:4px;border-radius:var(--radius-sm);color:var(--text-muted);transition:all var(--duration) var(--ease)}.session-item:hover .session-delete,.session-item:focus-within .session-delete{display:flex}.session-delete:hover{background:var(--amd-red);color:#fff}.session-delete.confirm{display:flex;align-items:center;gap:4px;padding:3px 10px;background:var(--amd-red);color:#fff;border-radius:var(--radius-sm);font-size:10px;font-weight:600;font-family:var(--font-mono);white-space:nowrap;text-transform:uppercase;letter-spacing:.5px;animation:confirmPop .15s var(--ease)}.session-delete.confirm:hover{background:var(--amd-red-dark)}.confirm-label{line-height:1}.session-item:has(.session-delete.confirm) .session-time{opacity:0}.session-item:has(.session-delete.confirm) .session-title{mask-image:linear-gradient(to right,black 60%,transparent 90%);-webkit-mask-image:linear-gradient(to right,black 60%,transparent 90%)}@keyframes confirmPop{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.session-item.session-deleting{animation:sessionDelete .25s var(--ease) forwards;pointer-events:none}@keyframes sessionDelete{0%{opacity:1;max-height:50px;margin-bottom:0;transform:translate(0)}to{opacity:0;max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;transform:translate(-20px)}}.sidebar-bottom{padding:12px 14px;border-top:1px solid var(--border);box-shadow:inset 0 1px #ffffff05;display:flex;align-items:center;justify-content:space-between}.privacy-badge{display:flex;align-items:center;gap:7px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);overflow:hidden;white-space:nowrap;text-transform:uppercase;letter-spacing:1px}.privacy-dot{width:6px;height:6px;border-radius:50%;background:var(--accent-green);animation:pulse 2s infinite;flex-shrink:0;box-shadow:0 0 6px #4ec93266}.version-badge{margin-left:auto;font-size:9px;font-family:var(--font-mono);color:var(--text-muted);opacity:.5}.sidebar-actions{display:flex;gap:2px;flex-shrink:0;transition:opacity .15s var(--ease)}.mobile-toggle-btn{position:relative;transition:all var(--duration) var(--ease)}.mobile-toggle-btn.active{color:var(--accent-green)}.mobile-toggle-btn.active:after{content:"";position:absolute;top:4px;right:4px;width:6px;height:6px;border-radius:50%;background:var(--accent-green);box-shadow:0 0 8px #4ec93299;animation:pulse 2s infinite}.mobile-toggle-btn.loading{opacity:.6;cursor:wait}.mobile-toggle-btn.loading svg{animation:pulse 1s ease-in-out infinite}.empty-hint{text-align:center;padding:28px 16px;font-size:13px;font-family:var(--font-sans);color:var(--text-muted);line-height:1.7}.sidebar-resize-handle{position:absolute;top:0;right:0;width:4px;height:100%;cursor:col-resize;z-index:10;transition:background .15s var(--ease)}.sidebar-resize-handle:hover,.sidebar-resize-handle:active{background:var(--amd-red);opacity:.6}.sidebar.collapsed .brand-version,.sidebar.collapsed .sidebar-brand .brand-text,.sidebar.collapsed .sidebar-search,.sidebar.collapsed .session-list,.sidebar.collapsed .privacy-badge span:not(.privacy-dot),.sidebar.collapsed .version-badge,.sidebar.collapsed .new-task-btn{display:none}.sidebar.collapsed .sidebar-top{padding:16px 8px 12px;justify-content:center}.sidebar.collapsed .sidebar-brand,.sidebar.collapsed .sidebar-top-actions{gap:0}.sidebar.collapsed .sidebar-bottom{flex-direction:column;padding:8px 4px;gap:4px;align-items:center}.sidebar.collapsed .sidebar-actions{flex-direction:column;align-items:center;gap:4px}.sidebar.collapsed .privacy-badge{justify-content:center}.sidebar.collapsed .sidebar-resize-handle{display:none}.agent-activity{max-width:900px;margin:0 auto;width:100%;padding:0 24px}.agent-summary-bar{display:inline-flex;align-items:center;justify-content:flex-start;width:auto;max-width:100%;gap:6px;padding:2px 8px 2px 4px;border-radius:var(--radius-xs);background:transparent;border:1px solid transparent;font-size:10px;font-family:var(--font-mono);color:var(--text-muted);opacity:.55;transition:opacity var(--duration-fast) var(--ease),background var(--duration-fast) var(--ease),border-color var(--duration-fast) var(--ease),color var(--duration-fast) var(--ease);cursor:pointer;text-transform:uppercase;letter-spacing:.4px}.agent-summary-bar:hover,.agent-summary-bar:focus-visible{opacity:1;background:var(--bg-tertiary);border-color:var(--border);color:var(--text-secondary)}.agent-activity.active .agent-summary-bar,.agent-activity.has-errors .agent-summary-bar{opacity:1}.agent-activity:has(.flow-expanded) .agent-summary-bar{opacity:1;background:var(--bg-tertiary);border-color:var(--border);color:var(--text-secondary)}.agent-summary-left{display:flex;align-items:center;gap:6px}.agent-summary-right{display:flex;align-items:center;color:var(--text-muted);transition:transform var(--duration-fast) var(--ease)}.agent-summary-text{font-weight:500}.agent-icon-done{color:var(--text-muted)}.agent-icon-error{color:var(--amd-red)}.agent-spinner-wrap{display:flex;align-items:center;justify-content:center}.agent-spinner{animation:spin 1s linear infinite;color:var(--amd-red)}.agent-flow-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .35s var(--ease),opacity .3s var(--ease),margin-top .35s var(--ease);opacity:1;margin-top:6px}.agent-flow-wrap.flow-collapsed{grid-template-rows:0fr;opacity:0;margin-top:0;pointer-events:none}.agent-flow-wrap>.agent-flow{overflow:hidden;min-height:0}.agent-flow{padding:8px 12px;border-radius:var(--radius-xs);background:var(--bg-secondary);border:1px solid var(--border);display:flex;flex-direction:column;gap:6px;animation:flowSlideDown .3s var(--ease)}@keyframes flowSlideDown{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.flow-thought{display:flex;align-items:flex-start;gap:6px;padding:3px 0;font-size:11px;font-family:var(--font-mono);color:var(--text-muted);line-height:1.5;animation:thoughtSlideIn .25s var(--ease)}@keyframes thoughtSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.flow-thought.active{color:var(--text-secondary)}.flow-thought-text{font-style:italic;word-break:break-word}.flow-thought-hacker{max-height:200px;overflow-y:auto;padding:6px 8px;font-size:11px;font-family:var(--font-mono);color:#ffffff80;line-height:1.6;word-break:break-word;white-space:pre-wrap;border-radius:var(--radius-xs);background:#00000040;border:none}[data-theme=light] .flow-thought-hacker{color:#00000073;background:#0000000a}.flow-thought-hacker::-webkit-scrollbar{width:4px}.flow-thought-hacker::-webkit-scrollbar-track{background:transparent}.flow-thought-hacker::-webkit-scrollbar-thumb{background:#ed1c2433;border-radius:0}.flow-thought-cursor{display:inline-block;width:.55em;height:1.1em;background:var(--amd-red);vertical-align:text-bottom;margin-left:1px;animation:cursorBlink .6s steps(2,start) infinite}.flow-tool{border-radius:var(--radius-xs);background:var(--bg-tertiary);border:1px solid var(--border);transition:border-color var(--duration-fast) var(--ease);animation:toolSlideIn .25s var(--ease) both}@keyframes toolSlideIn{0%{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.flow-tool:nth-child(1){animation-delay:0ms}.flow-tool:nth-child(2){animation-delay:80ms}.flow-tool:nth-child(3){animation-delay:.16s}.flow-tool:nth-child(4){animation-delay:.24s}.flow-tool:nth-child(5){animation-delay:.32s}.flow-tool.active{border-color:#e23c4040}.flow-tool.error{border-color:#ef444440}.flow-tool-header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 10px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);transition:background var(--duration-fast) var(--ease);cursor:pointer}.flow-tool-header:hover{background:var(--bg-hover)}.flow-tool-left{display:flex;align-items:center;gap:7px;min-width:0}.flow-tool-left>svg{transition:transform .2s var(--ease),color .2s var(--ease);flex-shrink:0}.flow-tool-left>svg:not(.flow-tool-spinner){animation:toolStatusPop .25s var(--ease)}@keyframes toolStatusPop{0%{transform:scale(.6);opacity:0}60%{transform:scale(1.15)}to{transform:scale(1);opacity:1}}.flow-tool-right{display:flex;align-items:center;flex-shrink:0}.flow-tool-spinner{animation:spin 1s linear infinite;flex-shrink:0}.flow-tool-label{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-primary);font-size:11px;font-family:var(--font-mono)}.flow-tool-badge{font-family:var(--font-mono);font-size:9px;padding:1px 6px;border-radius:2px;background:color-mix(in srgb,var(--badge-color, #3b82f6) 8%,transparent);color:var(--badge-color, #3b82f6);white-space:nowrap;border:1px solid color-mix(in srgb,var(--badge-color, #3b82f6) 15%,transparent);font-weight:600;letter-spacing:.3px;text-transform:uppercase}@supports not (background: color-mix(in srgb,red 50%,blue)){.flow-tool-badge{background:var(--bg-tertiary);color:var(--text-muted);border-color:var(--border-light)}}.activity-filter-bar{display:flex;gap:6px;padding:6px 10px;border-bottom:1px solid var(--border-light)}.activity-filter-input{flex:1;font-family:var(--font-mono);font-size:10px;padding:3px 8px;border:1px solid var(--border-light);border-radius:3px;background:var(--bg-primary);color:var(--text-primary);outline:none}.activity-filter-input:focus{border-color:var(--accent-color, #3b82f6)}.activity-filter-select{font-family:var(--font-mono);font-size:10px;padding:3px 6px;border:1px solid var(--border-light);border-radius:3px;background:var(--bg-primary);color:var(--text-primary);outline:none;cursor:pointer}.flow-tool-mcp-server{font-family:var(--font-mono);font-size:9px;padding:1px 5px;border-radius:2px;background:color-mix(in srgb,#7c3aed 10%,transparent);color:#7c3aed;white-space:nowrap;font-weight:500}.flow-tool-latency{font-family:var(--font-mono);font-size:9px;color:var(--text-muted);white-space:nowrap;margin-right:4px}.flow-tool-chevron{display:flex;align-items:center;color:var(--text-muted);transition:transform var(--duration-fast) var(--ease)}.flow-tool-chevron.expanded{transform:rotate(90deg)}.flow-tool-detail{padding:0 10px 8px;display:flex;flex-direction:column;gap:6px;animation:detailExpand .25s var(--ease);overflow:hidden;border-top:1px solid var(--border-light)}@keyframes detailExpand{0%{opacity:0;max-height:0;padding-top:0;padding-bottom:0}to{opacity:1;max-height:500px}}.flow-plan{padding:6px 8px;border-radius:var(--radius-xs);background:#f59e0b0a;border:1px solid rgba(245,158,11,.12);animation:fadeIn .1s var(--ease)}[data-theme=dark] .flow-plan{background:#f59e0b0f;border-color:#f59e0b26}.flow-plan-header{display:flex;align-items:center;gap:5px;font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;color:var(--accent-yellow);margin-bottom:4px}.flow-plan-toggle{width:100%;background:none;border:none;padding:0;cursor:pointer;text-align:left;margin-bottom:0}.flow-plan-toggle:hover{opacity:.8}.flow-plan-count{font-size:9px;opacity:.7;margin-left:1px}.flow-plan-list{margin:4px 0 0 16px;padding:0;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary)}.flow-plan-item{margin-bottom:2px;line-height:1.4}.flow-error{display:flex;align-items:flex-start;gap:6px;padding:6px 8px;border-radius:var(--radius-xs);background:#ef44440a;border:1px solid rgba(239,68,68,.15);font-size:11px;font-family:var(--font-mono);color:var(--amd-red);animation:errorSlideIn .3s var(--ease)}@keyframes errorSlideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}[data-theme=dark] .flow-error{background:#ef44440f}.detail-section-label{display:block;font-size:9px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.8px;color:var(--text-muted);margin-bottom:4px;margin-top:6px}.step-detail-args{padding:8px 10px 10px;border-radius:var(--radius-xs);background:var(--bg-secondary);border:1px solid var(--border-light)}.detail-args-content{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);line-height:1.6}.args-grid{display:flex;flex-direction:column;gap:3px}.arg-row{display:flex;gap:8px;align-items:baseline}.arg-key{font-family:var(--font-mono);font-size:11px;font-weight:600;color:var(--text-muted);flex-shrink:0;min-width:60px}.arg-key:after{content:":"}.arg-value{font-family:var(--font-mono);font-size:11px;color:var(--text-primary);word-break:break-word;line-height:1.6}.step-detail-result{padding:8px 10px 10px;border-radius:var(--radius-xs);font-size:11px;line-height:1.6}.step-detail-result.result-success{background:#00ff9f08;border:1px solid rgba(0,255,159,.1)}.step-detail-result.result-error{background:#ef44440a;border:1px solid rgba(239,68,68,.12)}[data-theme=dark] .step-detail-result.result-success{background:#00ff9f0a;border-color:#00ff9f1f}[data-theme=dark] .step-detail-result.result-error{background:#ef44440f;border-color:#ef444426}.detail-result-content{font-family:var(--font-mono);font-size:11px;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;line-height:1.6}.tool-result-path{display:inline-flex;align-items:center;gap:3px;color:var(--terminal-green-dim);cursor:pointer;border-radius:0;padding:0 2px;transition:background .1s var(--ease);text-decoration:underline;text-decoration-style:dashed}.tool-result-path:hover{background:#00ff9f0f;color:var(--terminal-green);text-decoration-style:solid}.chunks-view{margin-top:2px}.chunks-list{display:flex;flex-direction:column;gap:3px}.chunk-card{border-radius:var(--radius-xs);background:var(--bg-secondary);border:1px solid var(--border-light);overflow:hidden;transition:border-color var(--duration-fast) var(--ease)}.chunk-card.expanded{border-color:#06b6d440}.chunk-header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 10px;font-size:10px;font-family:var(--font-mono);color:var(--text-secondary);cursor:pointer;transition:background var(--duration-fast) var(--ease)}.chunk-header:hover{background:var(--bg-hover)}.chunk-header-left{display:flex;align-items:center;gap:6px;min-width:0}.chunk-source{font-family:var(--font-mono);font-size:10px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.chunk-page{font-family:var(--font-mono);font-size:9px;color:var(--text-muted);padding:0 4px;border-radius:2px;background:var(--bg-tertiary);white-space:nowrap}.chunk-score{font-family:var(--font-mono);font-size:9px;color:var(--accent-cyan);padding:0 4px;border-radius:2px;background:#06b6d414;border:1px solid rgba(6,182,212,.15);white-space:nowrap}.chunk-chevron{display:flex;align-items:center;color:var(--text-muted);transition:transform var(--duration-fast) var(--ease);flex-shrink:0}.chunk-chevron.expanded{transform:rotate(90deg)}.chunk-body{overflow:hidden}.chunk-body:not(.show){max-height:0;padding:0}.chunk-body.show{max-height:400px;overflow-y:auto}.chunk-preview{padding:3px 8px 5px;font-size:10px;font-family:var(--font-mono);color:var(--text-muted);font-style:italic;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chunk-content{margin:0;padding:6px 10px 8px;font-family:var(--font-mono);font-size:11px;line-height:1.6;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;background:#06b6d408;border-top:1px solid rgba(6,182,212,.1)}[data-theme=dark] .chunk-content{background:#06b6d40d}.chunk-body.show::-webkit-scrollbar{width:4px}.chunk-body.show::-webkit-scrollbar-track{background:transparent}.chunk-body.show::-webkit-scrollbar-thumb{background:var(--tint-hover);border-radius:0}.cmd-output{border-radius:var(--radius-xs);overflow:hidden;border:1px solid var(--border);background:var(--bg-code, #1e1e1e);font-family:var(--font-mono);font-size:11px;line-height:1.55;margin-top:6px}.cmd-output.cmd-error{border-color:#ef44444d}.cmd-header{display:flex;align-items:center;justify-content:space-between;padding:5px 10px;background:#ffffff0a;border-bottom:1px solid rgba(255,255,255,.06)}.cmd-header-left{display:flex;align-items:center;gap:6px}.cmd-header-icon{color:var(--text-muted)}.cmd-header-title{font-size:10px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px}.cmd-cwd{font-size:9px;color:var(--text-muted);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-header-right{display:flex;align-items:center;gap:8px}.cmd-duration{font-size:9px;color:var(--text-muted)}.cmd-exit-code{font-size:9px;font-weight:600;color:var(--amd-red);padding:0 4px;border-radius:2px;background:#ef44441a}.cmd-copy{display:flex;align-items:center;padding:2px 4px;border-radius:2px;color:var(--text-muted);transition:all var(--duration-fast) var(--ease);cursor:pointer}.cmd-copy:hover{background:var(--tint-hover);color:var(--text-secondary)}.cmd-copy.copied{color:var(--accent-green)}.cmd-line{display:flex;align-items:flex-start;gap:6px;padding:8px 10px 4px;color:var(--text-primary)}.cmd-prompt{color:var(--accent-green);font-weight:700;flex-shrink:0;-webkit-user-select:none;user-select:none}.cmd-text{color:var(--text-primary);word-break:break-all}.cmd-stdout{padding:4px 10px 8px 22px;margin:0;color:var(--text-secondary);white-space:pre-wrap;word-break:break-word;max-height:300px;overflow-y:auto}.cmd-stdout::-webkit-scrollbar{width:4px}.cmd-stdout::-webkit-scrollbar-track{background:transparent}.cmd-stdout::-webkit-scrollbar-thumb{background:var(--tint-hover);border-radius:0}.cmd-stdout::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.cmd-stderr{padding:4px 10px 8px 22px;margin:0;color:var(--amd-red);white-space:pre-wrap;word-break:break-word;max-height:200px;overflow-y:auto;background:#ef44440a;border-top:1px solid rgba(239,68,68,.1)}.cmd-truncated{padding:4px 10px;font-size:10px;color:var(--accent-yellow);text-align:center;background:#f59e0b0d;border-top:1px solid rgba(245,158,11,.1)}.cmd-empty{padding:6px 10px 8px 22px;color:var(--text-muted);font-style:italic}@media (prefers-reduced-motion: reduce){.agent-spinner,.flow-tool-spinner{animation:none}.agent-flow-wrap{transition:none}.agent-flow,.flow-thought,.flow-thought-hacker,.flow-tool,.flow-tool-detail,.flow-plan,.flow-error{animation:none}.flow-thought-cursor{animation:none;opacity:1}.flow-tool-left>svg,.flow-tool-left>svg:not(.flow-tool-spinner){animation:none;transition:none}.flow-tool-chevron{transition:none}}@media (max-width: 768px){.agent-activity{padding:0 16px}.flow-tool-badge{display:none}}.msg{padding:16px 24px;max-width:900px;margin:0 auto;width:100%;position:relative;animation:msgFadeIn .38s cubic-bezier(.22,.61,.36,1) both}@keyframes msgFadeIn{0%{opacity:0;transform:translateY(6px);filter:blur(2px)}to{opacity:1;transform:translateY(0);filter:blur(0)}}.msg-user{background:transparent;border-left:none;border-bottom:1px solid var(--border-light)}.msg-user .msg-inner{text-align:right}.msg-user .msg-header{justify-content:flex-end}.msg-user .msg-header-left{order:1}.msg-user .msg-actions{order:0}.msg-user .msg-body{padding-left:0;text-align:right}[data-theme=dark] .msg-user{background:transparent}.msg-assistant{background:var(--bg-assistant-msg);border-radius:var(--radius-xl);border:1px solid var(--border-light);width:calc(100% - 16px);margin:4px auto 8px;padding:14px 22px;box-shadow:inset 0 1px #ffffff0a,0 1px 1px #0000000a,0 4px 10px -2px #0000001a,0 8px 20px -8px #00000014;transition:box-shadow var(--duration) var(--ease),transform var(--duration) var(--ease);animation:msgFadeIn .45s cubic-bezier(.22,.61,.36,1) both}.msg-assistant:hover{transform:translateY(-1px);box-shadow:inset 0 1px #ffffff0d,0 2px 2px #0000000d,0 6px 14px -2px #0000001f,0 12px 28px -10px #0000001a}[data-theme=dark] .msg-assistant{box-shadow:inset 0 1px #ffffff0f,0 1px 2px #0000004d,0 6px 16px -2px #00000073,0 12px 28px -10px #0000004d}[data-theme=dark] .msg-assistant:hover{box-shadow:inset 0 1px #ffffff14,0 2px 3px #00000059,0 8px 22px -2px #0000008c,0 16px 36px -12px #0006}.msg-inner{max-width:100%}.msg-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.msg-header-left{display:flex;align-items:center;gap:4px}.msg-avatar{width:24px;height:24px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;font-family:var(--font-mono);flex-shrink:0;letter-spacing:0}.msg-avatar-user{background:var(--amd-red);color:#fff}.msg-avatar-assistant{background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-secondary);overflow:hidden}[data-theme=dark] .msg-avatar-assistant{border-color:var(--border);box-shadow:0 0 0 1px #ffffff05}.msg-avatar-assistant img{width:100%;height:100%;object-fit:cover}.msg-role{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted)}.role-assistant{color:var(--amd-red)}.msg-role-brand{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--amd-red);margin:0 4px}.msg-role-agent{font-size:11px;font-weight:600;font-family:var(--font-mono);color:var(--text-muted)}.msg-header-sep{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);opacity:.4;-webkit-user-select:none;user-select:none}.msg-timestamp{font-size:10px;font-family:var(--font-mono);color:var(--text-muted);opacity:.6;transition:opacity .2s var(--ease);white-space:nowrap}.msg:hover .msg-timestamp{opacity:1}.msg-actions{display:flex;gap:2px;opacity:0;transition:opacity .2s var(--ease)}.msg:hover .msg-actions,.msg:focus-within .msg-actions{opacity:1}.msg-action-btn,.msg-copy{display:flex;align-items:center;gap:4px;padding:5px 10px;border-radius:var(--radius-sm);font-size:10px;font-family:var(--font-mono);color:var(--text-muted);transition:all var(--duration-fast) var(--ease)}.msg-action-btn:hover,.msg-copy:hover{background:var(--bg-hover);color:var(--text-primary)}.msg-copy.copied{color:var(--accent-green);background:var(--accent-green-dim)}.msg-delete:hover{color:var(--amd-red)}.msg-delete.confirm{color:var(--amd-red);background:var(--amd-red-dim);opacity:1}.msg-body{font-size:14.5px;line-height:1.78;word-wrap:break-word;overflow-wrap:break-word;padding-left:32px;overflow-y:hidden;min-width:0}.msg-assistant .msg-body{font-family:var(--font-sans)}.msg-user .msg-body{font-family:var(--font-sans);font-size:14px;color:var(--text-secondary)}.msg-user .md-content{color:var(--text-secondary)}.msg-user .md-p,.msg-user .md-ul,.msg-user .md-ol{text-align:right}.msg-error{background:#ef44440a;border-left:2px solid var(--amd-red)}[data-theme=dark] .msg-error{background:#ef44440d}.error-banner{display:flex;align-items:center;gap:6px;padding:6px 12px;margin-bottom:8px;border-radius:var(--radius-sm);background:#ef444414;color:var(--amd-red);font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px}.msg-error .msg-body{color:var(--text-secondary)}.msg-error .msg-body .md-p,.msg-error .msg-body .md-content{font-family:var(--font-mono);font-size:13px}.md-content{color:var(--text-primary)}.md-content>:first-child{margin-top:0}.md-content>:last-child{margin-bottom:0}.md-p{margin-bottom:10px}.md-p:last-child{margin-bottom:0}.md-h2{font-size:18px;font-weight:700;font-family:var(--font-sans);margin:20px 0 10px;color:var(--text-primary);letter-spacing:-.3px}.md-h3{font-size:16px;font-weight:600;font-family:var(--font-sans);margin:16px 0 8px;color:var(--text-primary)}.md-h4{font-size:14.5px;font-weight:600;font-family:var(--font-sans);margin:14px 0 6px;color:var(--text-primary)}.md-ul,.md-ol{margin:8px 0;padding-left:24px}.md-ul{list-style-type:disc}.md-ol{list-style-type:decimal}.md-li{margin-bottom:4px;padding-left:4px}.md-li>.md-p{margin-bottom:4px}.md-li>.md-ul,.md-li>.md-ol{margin:4px 0}.md-content strong{font-weight:700;color:var(--text-primary)}.md-content em{font-style:italic}.inline-code{font-family:var(--font-mono);font-size:12.5px;padding:2px 7px;border-radius:var(--radius-sm);background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-light)}.md-link{color:var(--amd-red);text-decoration:none;border-bottom:1px solid transparent;transition:border-color .2s var(--ease)}.md-link:hover{border-bottom-color:var(--amd-red)}.file-path-link{display:inline-flex;align-items:center;gap:4px;color:var(--terminal-green-dim);cursor:pointer;border-bottom:1px dashed var(--terminal-green-dim);transition:color var(--duration-fast) var(--ease),background var(--duration-fast) var(--ease);border-radius:0;padding:0 3px;font-family:var(--font-mono);font-size:12px}.file-path-link:hover{color:var(--terminal-green);border-bottom-color:var(--terminal-green);background:#4ec9320d}.file-path-icon{flex-shrink:0;opacity:.7}.file-path-link:hover .file-path-icon{opacity:1}.inline-image-wrap{display:block;margin:8px 0}.inline-image{display:block;max-width:100%;max-height:400px;border-radius:var(--radius);border:1px solid var(--border);object-fit:contain;background:var(--bg-secondary)}.inline-image-caption{display:block;margin-top:4px;font-size:11px}.md-blockquote{margin:12px 0;padding:10px 18px;border-left:2px solid var(--amd-red);background:var(--tint-subtle);border-radius:0 var(--radius-md) var(--radius-md) 0;color:var(--text-secondary)}.md-blockquote .md-p{margin-bottom:6px}.md-blockquote .md-p:last-child{margin-bottom:0}.md-hr{margin:20px 0;border:none;border-top:1px solid var(--border)}.md-table-wrap{margin:14px 0;overflow-x:auto;border-radius:var(--radius-lg);border:1px solid var(--border)}.md-table{width:100%;border-collapse:collapse;font-size:13px;font-family:var(--font-sans);line-height:1.6}.md-table th{text-align:left;padding:8px 14px;font-weight:600;font-size:10.5px;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted);background:var(--bg-tertiary);border-bottom:1px solid var(--border);white-space:nowrap}.md-table td{padding:7px 14px;border-bottom:1px solid var(--border-light);color:var(--text-primary)}.md-table tr:last-child td{border-bottom:none}.md-table tr:hover td{background:var(--tint-subtle)}.md-table td:last-child,.md-table th:last-child{text-align:right}.md-content details{margin:8px 0;border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.md-content details summary{padding:8px 14px;font-size:13px;font-weight:600;font-family:var(--font-mono);color:var(--amd-red);cursor:pointer;background:var(--tint-subtle);transition:background var(--duration) var(--ease);-webkit-user-select:none;user-select:none;list-style:none}.md-content details summary::-webkit-details-marker{display:none}.md-content details summary:before{content:"▶";display:inline-block;margin-right:8px;font-size:10px;transition:transform var(--duration) var(--ease)}.md-content details[open] summary:before{transform:rotate(90deg)}.md-content details summary:hover{background:var(--tint-hover)}.md-content details>:not(summary){padding:4px 14px}.md-content details[open]{border-color:#ed1c2433}.md-content del{text-decoration:line-through;color:var(--text-muted)}.md-content .task-list-item{list-style:none;margin-left:-20px}.md-content .task-list-item input[type=checkbox]{margin-right:6px}.code-block{margin:14px 0;border-radius:var(--radius-lg);overflow:hidden;background:var(--bg-code);border:1px solid var(--border)}.code-header{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;background:#ffffff0d;border-bottom:1px solid rgba(255,255,255,.08)}.code-lang{font-size:10px;font-family:var(--font-mono);color:var(--text-muted);text-transform:lowercase;letter-spacing:.5px}.code-copy{display:flex;align-items:center;gap:4px;padding:3px 10px;border-radius:var(--radius-sm);font-size:10px;font-family:var(--font-mono);color:var(--text-muted);transition:all var(--duration) var(--ease)}.code-copy:hover{background:#ffffff14;color:#d4d4d4}.code-copy.copied{color:var(--accent-green);background:#4ec93214}.code-block pre{padding:16px 18px;overflow-x:auto;margin:0;white-space:pre;word-wrap:normal;overflow-wrap:normal}.code-block code{font-family:var(--font-mono);font-size:13px;line-height:1.65;color:var(--text-code);background:none;padding:0;white-space:pre;word-wrap:normal;overflow-wrap:normal}.md-content>.cursor{display:inline-block}.md-content:has(>.cursor)>:last-of-type:not(.cursor){display:inline}.md-content>pre:empty,.md-content>pre:has(>code:empty){display:none}.inline-code:empty{display:none}.cursor{display:inline-block;width:8px;height:16px;background:var(--amd-red);margin-left:2px;vertical-align:text-bottom;border-radius:0;image-rendering:pixelated;box-shadow:0 0 8px #ed1c2480,0 0 2px #ed1c24cc;animation:cursorBlink .6s steps(2,start) infinite}@media (max-width: 768px){.msg{padding:12px 16px}.msg-body{padding-left:0}.md-table-wrap{margin:8px -8px;border-radius:0;border-left:none;border-right:none}}.thinking-indicator{font-family:var(--font-mono, "JetBrains Mono", "SF Mono", monospace);font-size:11px;color:var(--text-muted);white-space:nowrap}.thinking-indicator .cursor{width:6px;height:12px}.msg-stats{display:flex;flex-wrap:wrap;gap:10px;margin-top:6px;padding-top:5px;border-top:1px solid var(--border-subtle, rgba(128,128,128,.12));font-size:10.5px;color:var(--text-muted);font-family:var(--font-mono, "SF Mono", "Fira Code", monospace);opacity:0;transition:opacity .18s var(--ease);pointer-events:none;-webkit-user-select:none;user-select:none}.msg:hover .msg-stats{opacity:1;pointer-events:auto;-webkit-user-select:text;user-select:text}.msg-stats-ts{color:var(--text-muted);opacity:.75}.msg:hover .msg-stats-ts{opacity:1}.msg-stats>span+span:before{content:"·";margin-right:6px;opacity:.4}.unsupported-banner{display:flex;flex-direction:column;gap:10px;padding:14px 16px;border-radius:var(--radius-lg);border:1px solid var(--border);background:var(--bg-card);margin:8px 0;font-size:13px;line-height:1.5}.unsupported-banner-header{display:flex;align-items:center;gap:8px;font-weight:600;color:var(--text-primary)}.unsupported-banner-header svg{color:var(--accent-gold);flex-shrink:0}.unsupported-banner-body{color:var(--text-secondary);padding-left:26px}.unsupported-banner-body p{margin:0 0 6px}.unsupported-alternatives{margin:8px 0 4px;padding:0;list-style:none}.unsupported-alternatives li{position:relative;padding-left:16px;margin-bottom:4px;color:var(--text-secondary)}.unsupported-alternatives li:before{content:"✓";position:absolute;left:0;color:var(--accent-green);font-weight:600;font-size:12px}.unsupported-feature-request{display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:var(--radius-md);background:var(--bg-secondary);border:1px dashed var(--border);margin-top:4px;font-size:12px;color:var(--text-secondary)}.unsupported-feature-request svg{color:var(--amd-red);flex-shrink:0}.unsupported-feature-request a{color:var(--amd-red);text-decoration:none;font-weight:600}.unsupported-feature-request a:hover{text-decoration:underline;color:var(--amd-red-light)}.upload-error-toast{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:var(--radius-md);background:var(--amd-red-dim2);border:1px solid rgba(237,28,36,.15);margin:8px 0;font-size:12.5px;line-height:1.5;color:var(--text-primary);animation:toast-slide-in .25s var(--ease)}.upload-error-toast svg{color:var(--amd-red);flex-shrink:0;margin-top:1px}.upload-error-content{flex:1;min-width:0}.upload-error-title{font-weight:600;margin-bottom:2px}.upload-error-detail{color:var(--text-secondary);font-size:12px}.upload-error-detail a{color:var(--amd-red);text-decoration:none;font-weight:500}.upload-error-detail a:hover{text-decoration:underline}.upload-error-dismiss{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:2px;border-radius:var(--radius-sm);flex-shrink:0;transition:all var(--duration) var(--ease)}.upload-error-dismiss:hover{color:var(--text-primary);background:var(--bg-hover)}.fb-entry.unsupported{opacity:.55}.fb-unsupported-badge{font-size:10px;color:var(--text-secondary);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:1px 6px;white-space:nowrap;margin-left:auto}@keyframes toast-slide-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.chat-view{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--bg-primary);position:relative;overflow:hidden}.chat-view.drag-active{outline:2px dashed var(--amd-red);outline-offset:-4px}.chat-header{display:flex;align-items:center;justify-content:space-between;padding:10px 24px;border-bottom:1px solid var(--border);min-height:48px;flex-shrink:0;background:var(--bg-secondary);font-family:var(--font-sans)}[data-theme=dark] .chat-header{background:#0a0a12e0;backdrop-filter:blur(20px) saturate(1.2);-webkit-backdrop-filter:blur(20px) saturate(1.2)}.chat-header-left{display:flex;align-items:center;gap:8px;min-width:0}.chat-header-right{display:flex;align-items:center;gap:6px;flex-shrink:0}.chat-title{font-size:13px;font-weight:600;font-family:var(--font-sans);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:.2px}.title-edit{font-size:13px;font-weight:600;font-family:var(--font-sans);padding:4px 10px;border:1px solid var(--amd-red);border-radius:var(--radius-md);outline:none;width:280px;max-width:100%;transition:box-shadow var(--duration) var(--ease)}.title-edit:focus{box-shadow:0 0 0 3px #ed1c241f}.session-hash-badge{display:inline-flex;align-items:center;gap:4px;font-size:10px;padding:3px 8px;border-radius:var(--radius-sm);background:var(--bg-tertiary);color:var(--text-muted);font-weight:500;font-family:var(--font-mono);white-space:nowrap;border:1px solid var(--border);letter-spacing:.5px;text-decoration:none;cursor:pointer;transition:all var(--duration) var(--ease)}.session-hash-badge:hover{border-color:var(--amd-red);color:var(--amd-red);background:var(--amd-red-dim2)}.session-hash-badge.copied{border-color:var(--accent-green);color:var(--accent-green);background:#4ec93214}.session-hash-badge.copied:after{content:"copied";font-size:9px;text-transform:uppercase;letter-spacing:.5px}.model-badge{font-size:10px;padding:3px 10px;border-radius:var(--radius-sm);background:var(--bg-tertiary);color:var(--text-muted);font-weight:500;font-family:var(--font-mono);white-space:nowrap;border:1px solid var(--border);text-transform:lowercase;letter-spacing:.3px}.model-badge.no-model{color:var(--accent-gold);border-color:#eab30840}.model-badge .model-ctx-size{color:var(--text-muted);opacity:.75;font-weight:400}.doc-context-bar{display:flex;align-items:center;gap:8px;padding:6px 24px;border-bottom:1px solid var(--border);font-size:11px;font-family:var(--font-sans);color:var(--text-secondary);background:var(--bg-secondary);transition:all var(--duration) var(--ease);flex-shrink:0;width:100%;text-align:left}.doc-context-expanded{flex-wrap:wrap}.doc-context-icon{flex-shrink:0;color:var(--accent-green)}.doc-context-label{font-weight:600;white-space:nowrap;color:var(--text-secondary);text-transform:uppercase;font-size:10px;letter-spacing:1px;font-family:var(--font-mono);cursor:pointer;border-radius:var(--radius-sm);padding:2px 6px;transition:background var(--duration) var(--ease)}.doc-context-label:hover{background:var(--bg-hover);color:var(--text-primary)}.doc-context-pills{display:flex;align-items:center;gap:6px;overflow:hidden;flex:1;min-width:0}.doc-context-pills-expanded{flex-wrap:wrap;overflow:visible}.doc-pill{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);font-size:10px;font-family:var(--font-mono);color:var(--text-secondary);white-space:nowrap;max-width:180px;flex-shrink:0;position:relative;transition:border-color var(--duration) var(--ease),color var(--duration) var(--ease)}.doc-pill:hover{border-color:var(--amd-red);color:var(--text-primary)}.doc-pill-name{overflow:hidden;text-overflow:ellipsis}.doc-pill-icon{flex-shrink:0;color:var(--accent-green)}.doc-pill-remove{display:none;align-items:center;justify-content:center;flex-shrink:0;width:14px;height:14px;padding:0;margin-left:1px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease)}.doc-pill:hover .doc-pill-remove,.doc-pill:focus-within .doc-pill-remove{display:inline-flex}.doc-pill-remove:hover{background:var(--amd-red);color:var(--bg-primary)}.doc-pill-more,.doc-pill-collapse{font-size:10px;font-family:var(--font-mono);color:var(--text-muted);white-space:nowrap;flex-shrink:0;background:none;border:1px solid transparent;border-radius:var(--radius-sm);padding:2px 8px;cursor:pointer;transition:all var(--duration) var(--ease)}.doc-pill-more:hover,.doc-pill-collapse:hover{color:var(--text-primary);background:var(--bg-tertiary);border-color:var(--border)}.messages-scroll{flex:1;overflow-y:auto;padding:24px 0;scroll-behavior:smooth}.empty-chat{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:60px 24px;height:100%;min-height:300px;animation:emptyFadeIn .4s var(--ease)}@keyframes emptyFadeIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.empty-chat-icon{color:var(--text-muted);margin-bottom:18px;opacity:.3}.empty-chat-title{font-size:20px;font-weight:700;font-family:var(--font-sans);margin-bottom:8px;color:var(--text-primary);letter-spacing:-.3px}.empty-chat-desc{font-size:14px;font-family:var(--font-sans);color:var(--text-muted);margin-bottom:32px;line-height:1.75;max-width:440px}.empty-chat-suggestions{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;max-width:560px}.empty-chat-chip{padding:9px 18px;border:1px solid var(--border);border-radius:var(--radius-lg);font-size:13px;font-family:var(--font-sans);color:var(--text-secondary);background:var(--bg-card);transition:all var(--duration) var(--ease);animation:chipCascade .3s var(--ease) both}.empty-chat-chip:nth-child(1){animation-delay:.45s}.empty-chat-chip:nth-child(2){animation-delay:.53s}.empty-chat-chip:nth-child(3){animation-delay:.61s}.empty-chat-chip:nth-child(4){animation-delay:.69s}@keyframes chipCascade{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.empty-chat-chip:hover{border-color:var(--amd-red);color:var(--amd-red);background:var(--amd-red-dim2);transform:translateY(-1px);box-shadow:0 4px 12px #ed1c241a}.skeleton-messages{padding:16px 0;max-width:900px;margin:0 auto;width:100%;transition:opacity .2s var(--ease)}.skeleton-msg{padding:16px 24px;display:flex;flex-direction:column;gap:8px}.skeleton-header{display:flex;align-items:center;gap:8px}.skeleton-avatar{width:24px;height:24px;border-radius:var(--radius-md);background:var(--bg-tertiary);animation:skeletonPulse 1.5s ease-in-out infinite}.skeleton-role{width:48px;height:10px;border-radius:var(--radius-sm);background:var(--bg-tertiary);animation:skeletonPulse 1.5s ease-in-out infinite;animation-delay:50ms}.skeleton-lines{display:flex;flex-direction:column;gap:6px;padding-left:32px}.skeleton-line{height:12px;border-radius:var(--radius-sm);background:var(--bg-tertiary);animation:skeletonPulse 1.5s ease-in-out infinite}.skeleton-line:nth-child(1){width:85%;animation-delay:.1s}.skeleton-line:nth-child(2){width:65%;animation-delay:.2s}.skeleton-line:nth-child(3){width:40%;animation-delay:.3s}@keyframes skeletonPulse{0%,to{opacity:.25}50%{opacity:.6}}.skeleton-msg{transition:opacity .2s var(--ease)}.drag-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:var(--amd-red-dim2);border:2px dashed var(--amd-red);border-radius:var(--radius-lg);margin:8px;color:var(--amd-red);font-weight:600;font-size:15px;font-family:var(--font-sans);letter-spacing:.3px;pointer-events:none;animation:fadeIn .1s var(--ease);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.streaming-bubble{transition:opacity .35s var(--ease),transform .35s var(--ease),filter .35s var(--ease)}.streaming-bubble.stream-active{animation:streamBubbleIn .35s var(--ease)}.streaming-bubble.stream-ending{pointer-events:none}@keyframes streamBubbleIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.msg-deleting{animation:msgDelete .25s var(--ease) forwards;pointer-events:none}@keyframes msgDelete{0%{opacity:1;max-height:500px;transform:scale(1)}to{opacity:0;max-height:0;padding:0;margin:0;transform:scale(.97);overflow:hidden}}.typing-row{padding:16px 24px;max-width:900px;margin:0 auto;width:100%;animation:typingRowFadeIn .25s var(--ease)}@keyframes typingRowFadeIn{0%{opacity:0}to{opacity:1}}.typing-label{font-size:11px;font-weight:600;font-family:var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px;display:block;margin-bottom:8px}.typing-dots{display:flex;gap:4px;align-items:center}.typing-dots span{width:6px;height:14px;border-radius:0;background:var(--amd-red);box-shadow:0 0 8px #ed1c2473;image-rendering:pixelated;animation:typingBounce 1.4s infinite}.typing-dots span:nth-child(1){animation-delay:0ms}.typing-dots span:nth-child(2){animation-delay:.15s}.typing-dots span:nth-child(3){animation-delay:.3s}@keyframes typingBounce{0%,60%,to{transform:translateY(0);opacity:.4}30%{transform:translateY(-6px);opacity:1}}.input-area{padding:14px 24px 12px;flex-shrink:0;background:var(--bg-primary);border-top:1px solid var(--border)}[data-theme=dark] .input-area{background:#0e0e16e6}.input-box{max-width:900px;margin:0 auto;display:flex;align-items:flex-end;gap:10px;padding:8px 12px 8px 16px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-input, var(--bg-secondary));transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease)}[data-theme=dark] .input-box{background:var(--bg-card);border-color:var(--border);box-shadow:inset 0 1px 3px #00000040}.input-box:focus-within{border-color:#ed1c2466;box-shadow:0 0 20px #ed1c241a;animation:inputFocusPulse .4s var(--ease)}@keyframes inputFocusPulse{0%{box-shadow:0 0 #ed1c2400}50%{box-shadow:0 0 24px #ed1c2424}to{box-shadow:0 0 20px #ed1c241a}}.msg-input{flex:1;border:none;outline:none;resize:none;background:transparent;padding:6px 2px;max-height:200px;line-height:1.6;font-size:14px;font-family:var(--font-sans);color:var(--text-primary);transition:height .1s var(--ease)}.msg-input:focus-visible{outline:none}.msg-input::placeholder{color:var(--text-muted);opacity:.6;font-family:var(--font-sans)}.msg-input:disabled{opacity:.5}.input-btns{display:flex;gap:2px;flex-shrink:0;align-items:center}.input-btns .icon-btn,.input-btns button:not(.send-btn):not(.stop-btn){opacity:.5;transition:opacity var(--duration) var(--ease),color var(--duration) var(--ease)}.input-btns .icon-btn:hover,.input-btns button:not(.send-btn):not(.stop-btn):hover{opacity:1;color:var(--text-primary)}.send-btn{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-md);background:var(--amd-red);color:#fff;transition:all var(--duration) var(--ease)}.send-btn:hover{background:var(--amd-red-dark);box-shadow:0 0 16px #ed1c2459;transform:translateY(-1px)}.send-btn:active{transform:scale(.96)}.send-btn:disabled{background:var(--bg-tertiary);color:var(--text-muted);transform:none;cursor:not-allowed;opacity:.4;box-shadow:none}.stop-btn{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-md);border:1.5px solid rgba(237,28,36,.5);color:var(--amd-red);background:var(--amd-red-dim2);transition:all var(--duration) var(--ease);animation:pulse 2s ease-in-out infinite}.stop-btn:hover{border-color:var(--amd-red);color:var(--amd-red-light);background:var(--amd-red-dim);box-shadow:0 0 12px #ed1c2433;animation:none}.scroll-bottom-btn{position:absolute;bottom:100px;left:50%;transform:translate(-50%);width:34px;height:34px;border-radius:var(--radius-md);background:var(--bg-card);border:1px solid var(--border);color:var(--text-secondary);display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-md);transition:opacity var(--duration) var(--ease),transform var(--duration) var(--ease),background var(--duration) var(--ease),color var(--duration) var(--ease),border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease);z-index:5;animation:scrollBtnSlideIn .2s var(--ease)}@keyframes scrollBtnSlideIn{0%{opacity:0;transform:translate(-50%) translateY(12px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.scroll-bottom-btn:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--amd-red);transform:translate(-50%) translateY(-3px);box-shadow:0 4px 16px #ed1c2426}.input-footer{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:8px;font-size:10px;font-family:var(--font-mono);color:var(--text-muted)}.input-footer-item{display:flex;align-items:center;gap:4px}.input-footer-sep{width:1px;height:10px;background:var(--border)}.kbd-hint{font-family:var(--font-mono);font-size:10px;padding:1px 5px;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-muted)}.create-agent-btn{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-full);cursor:pointer;transition:all .15s var(--ease);flex-shrink:0}.create-agent-btn:hover{border-color:var(--text-muted);color:var(--text-primary)}.agent-picker{position:relative}.agent-picker-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:10px;font-family:var(--font-mono);font-weight:500;color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-full);cursor:pointer;transition:all .15s var(--ease);white-space:nowrap;line-height:1;height:20px}.agent-picker-btn:hover{border-color:var(--text-muted);color:var(--text-primary)}.agent-picker-dropdown{position:absolute;bottom:calc(100% + 6px);left:0;min-width:160px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000040;padding:4px;z-index:100;display:flex;flex-direction:column;gap:2px}.agent-picker-option{display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:12px;font-family:var(--font-sans);color:var(--text-secondary);background:transparent;border:none;border-radius:6px;cursor:pointer;transition:background .12s var(--ease),color .12s var(--ease);text-align:left;white-space:nowrap}.agent-picker-option:hover{background:var(--bg-tertiary);color:var(--text-primary)}.agent-picker-option.active{color:#ed1c24;font-weight:600}.input-content{flex:1;display:flex;flex-direction:column;min-width:0;position:relative}.input-box.has-attachments{flex-direction:column;align-items:stretch}.input-box.has-attachments .input-content{width:100%}.input-box.has-attachments .input-btns{align-self:flex-end}.attachment-strip{display:flex;gap:6px;padding:6px 0 4px;overflow-x:auto;flex-shrink:0}.attachment-strip::-webkit-scrollbar{height:3px}.attachment-strip::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.attachment-preview{display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-tertiary);font-size:11px;font-family:var(--font-sans);color:var(--text-secondary);flex-shrink:0;max-width:200px;position:relative;transition:border-color var(--duration) var(--ease),background var(--duration) var(--ease)}.attachment-preview:hover{border-color:var(--amd-red);background:var(--tint-subtle)}.attachment-preview.attachment-error{border-color:var(--amd-red);background:var(--amd-red-dim2)}.attachment-thumb{width:32px;height:32px;object-fit:cover;border-radius:var(--radius-sm);flex-shrink:0}.attachment-file-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:var(--bg-secondary);border-radius:var(--radius-sm);color:var(--text-muted);flex-shrink:0}.attachment-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.attachment-spinner{width:12px;height:12px;border:1.5px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite;flex-shrink:0}.attachment-error-text{color:var(--amd-red);font-size:10px;white-space:nowrap}.attachment-remove{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--bg-secondary);color:var(--text-muted);flex-shrink:0;opacity:0;transition:all var(--duration) var(--ease);cursor:pointer;border:none;padding:0}.attachment-preview:hover .attachment-remove,.attachment-preview:focus-within .attachment-remove{opacity:1}.attachment-remove:hover{background:var(--amd-red);color:#fff}@media (max-width: 768px){.chat-header{padding:10px 16px}.model-badge,.session-hash-badge{display:none}.input-area{padding:10px 12px max(10px,env(safe-area-inset-bottom))}.empty-chat{padding:40px 16px}.title-edit{width:180px}.send-btn,.stop-btn{width:44px;height:44px}.skeleton-msg{padding:12px 16px}.skeleton-lines{padding-left:0}.input-footer{gap:8px;flex-wrap:wrap}}.welcome{flex:1;display:flex;align-items:center;justify-content:center;padding:40px 40px 24px;overflow-y:auto;position:relative}[data-theme=dark] .welcome:before{content:"";position:absolute;top:-80px;right:-120px;width:600px;height:600px;background:radial-gradient(circle,rgba(237,28,36,.1) 0%,transparent 70%);pointer-events:none}[data-theme=dark] .welcome:after{content:"";position:absolute;bottom:-80px;left:-80px;width:450px;height:450px;background:radial-gradient(circle,rgba(78,201,50,.05) 0%,transparent 70%);pointer-events:none}.welcome-inner{max-width:680px;text-align:center;position:relative;z-index:1}@keyframes titleGlow{0%,to{filter:drop-shadow(0 0 20px rgba(237,28,36,.35)) drop-shadow(0 0 80px rgba(237,28,36,.12))}50%{filter:drop-shadow(0 0 28px rgba(237,28,36,.45)) drop-shadow(0 0 100px rgba(237,28,36,.18))}}@keyframes terminalBlink{0%,to{opacity:1}50%{opacity:0}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeInScale{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes chipFadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.welcome-title{font-size:clamp(32px,5vw,48px);font-weight:700;font-family:JetBrains Mono,Space Mono,monospace;letter-spacing:-1px;background:linear-gradient(135deg,var(--amd-red),#ff6b35);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:10px;line-height:1.1;display:inline-flex;align-items:center;filter:none}.welcome-title.typing-done{filter:drop-shadow(0 0 18px rgba(237,28,36,.25)) drop-shadow(0 0 60px rgba(237,28,36,.1))}[data-theme=dark] .welcome-title.typing-done{filter:drop-shadow(0 0 20px rgba(237,28,36,.35)) drop-shadow(0 0 80px rgba(237,28,36,.12));animation:titleGlow 4s ease-in-out infinite}.welcome-title>span{background:linear-gradient(135deg,var(--amd-red),#ff6b35);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;white-space:pre}.gaia-glow{filter:drop-shadow(0 0 6px rgba(237,28,36,.3));transition:filter .5s ease}.welcome-title.typing-done .gaia-glow{animation:gaiaGlow 3s ease-in-out infinite}@keyframes gaiaGlow{0%,to{filter:drop-shadow(0 0 8px rgba(237,28,36,.35))}50%{filter:drop-shadow(0 0 16px rgba(237,28,36,.55)) drop-shadow(0 0 40px rgba(237,28,36,.15))}}.terminal-cursor{display:inline-block;width:8px;height:1.15em;background:var(--amd-red);margin-left:2px;vertical-align:text-bottom;border-radius:0;image-rendering:pixelated;box-shadow:0 0 8px #ed1c2480,0 0 2px #ed1c24cc}.terminal-cursor.blink{animation:terminalBlink 1s step-end infinite}.terminal-cursor-sub{width:6px;height:1em}.terminal-cursor-sm{width:6px;height:.9em}.welcome-version{display:inline-flex;align-items:center;gap:8px;font-size:12px;font-weight:500;font-family:var(--font-mono);color:var(--text-muted);background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-full);padding:4px 14px;margin-bottom:12px;letter-spacing:.5px;opacity:0}.content-revealed .welcome-version{animation:fadeInUp .5s var(--ease) forwards}.welcome-sub{font-size:16px;color:var(--text-secondary);margin-bottom:40px;line-height:1.85;font-family:var(--font-sans);font-weight:300;max-width:520px;margin-left:auto;margin-right:auto;min-height:1.85em}.typewriter-text{display:inline}.features{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:36px}.feature-card{padding:22px 16px 32px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-card);text-align:center;position:relative;overflow:hidden;transition:border-color .3s var(--ease),transform .25s var(--ease);height:155px;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;opacity:0;transform:translateY(16px)}.content-revealed .feature-card{animation:fadeInUp .5s var(--ease) forwards}.content-revealed .feature-card:nth-child(1){animation-delay:0ms}.content-revealed .feature-card:nth-child(2){animation-delay:.12s}.content-revealed .feature-card:nth-child(3){animation-delay:.24s}.content-revealed .feature-card:nth-child(4){animation-delay:.36s}.feature-card:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,var(--amd-red),#ff6b35);opacity:0;transition:opacity .3s var(--ease)}.feature-card:hover{border-color:var(--amd-red);transform:translateY(-2px)}.feature-card:hover:before{opacity:1}[data-theme=dark] .feature-card{background:linear-gradient(168deg,rgba(20,8,8,.4) 0%,var(--bg-card) 40%)}.feature-icon,.feature-card h3,.feature-card>p{transition:opacity .15s var(--ease)}.feature-card.feature-hovered .feature-icon,.feature-card.feature-hovered h3,.feature-card.feature-hovered>p{opacity:0;pointer-events:none}.feature-icon{color:var(--amd-red);margin-bottom:10px;display:flex;justify-content:center}.feature-card h3{font-size:14px;font-weight:700;font-family:var(--font-sans);margin-bottom:4px;letter-spacing:-.2px}.feature-card p{font-size:12.5px;color:var(--text-secondary);line-height:1.5;font-family:var(--font-sans)}.feature-terminal{position:absolute;bottom:12px;left:14px;right:14px;font-size:10.5px;font-family:var(--font-mono);line-height:1.5;text-align:left;min-height:1.5em;border-top:1px solid var(--border-light);padding-top:6px;transition:all .2s var(--ease)}.feature-card.feature-hovered .feature-terminal{top:14px;bottom:14px;left:14px;right:14px;border-top:none;padding-top:0;display:flex;align-items:center}.feature-inline{display:inline;word-break:break-word}.feature-code-hint{color:var(--text-muted);opacity:.4;letter-spacing:.3px}.feature-code-erasing{opacity:.7;color:var(--amd-red)}.feature-expanded-text{color:var(--text-secondary);font-size:11px;line-height:1.6}.agent-pills{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-bottom:24px;opacity:0}.content-revealed .agent-pills{animation:fadeInUp .5s var(--ease) .42s forwards}.agent-pill{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 14px;font-size:12px;font-family:var(--font-sans);font-weight:500;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-full);cursor:pointer;transition:all .2s var(--ease);white-space:nowrap}.agent-pill:hover{border-color:var(--text-muted);color:var(--text-primary)}.agent-pill.active{background:#ed1c24;border-color:#ed1c24;color:#fff}.agent-pill.active:hover{background:#d41920;border-color:#d41920;color:#fff}.welcome-setup-hint{display:flex;align-items:flex-start;gap:8px;margin-bottom:20px;padding:10px 14px;border:1px solid #fed7aa;border-radius:var(--radius-md);background:#fffbeb;color:#92400e;font-size:12px;text-align:left;line-height:1.5;font-family:var(--font-sans)}.welcome-setup-hint svg{flex-shrink:0;margin-top:1px}.welcome-setup-hint code{font-family:var(--font-mono);font-size:11px;padding:1px 5px;border-radius:2px;background:#00000012}[data-theme=dark] .welcome-setup-hint{background:#120e05;border-color:#2a1e08;color:#fcd34d}[data-theme=dark] .welcome-setup-hint code{background:#ffffff14}.welcome-actions{display:flex;align-items:center;justify-content:center;gap:16px;margin-bottom:28px;opacity:0}.content-revealed .welcome-actions{animation:fadeInScale .5s var(--ease) .5s forwards}.start-btn{padding:14px 40px;font-size:14px;border-radius:var(--radius-lg)}.build-agent-btn{display:inline-flex;align-items:center;gap:6px;padding:13px 28px;font-size:14px;font-family:var(--font-sans);font-weight:500;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;transition:all .15s var(--ease)}.build-agent-btn:hover:not(:disabled){border-color:var(--text-muted);color:var(--text-primary);background:var(--bg-tertiary)}.build-agent-btn:disabled{opacity:.4;cursor:not-allowed}.suggestions{display:flex;flex-direction:column;align-items:center;gap:12px}.suggestions-label{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:2px;opacity:0}.content-revealed .suggestions-label{animation:chipFadeIn .4s var(--ease) .6s forwards}.suggestion-chips{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}.chip{padding:8px 18px;border:1px solid var(--border);border-radius:var(--radius-lg);font-size:13px;font-family:var(--font-sans);color:var(--text-secondary);background:var(--bg-card);transition:all .25s var(--ease);opacity:0}.content-revealed .chip{animation:chipFadeIn .4s var(--ease) forwards}.content-revealed .chip:nth-child(1){animation-delay:.7s}.content-revealed .chip:nth-child(2){animation-delay:.82s}.content-revealed .chip:nth-child(3){animation-delay:.94s}.content-revealed .chip:nth-child(4){animation-delay:1.06s}.chip:hover{border-color:var(--amd-red);color:var(--amd-red);background:var(--amd-red-dim2);transform:translateY(-1px)}.welcome-copyright{margin-top:32px;font-size:10px;font-family:var(--font-mono);color:var(--text-muted);opacity:.35;letter-spacing:.3px}@media (max-width: 768px){.welcome{padding:60px 16px 24px;align-items:flex-start}.welcome-title{font-size:28px}.welcome-sub{font-size:14px;margin-bottom:28px}.features{grid-template-columns:repeat(2,1fr);gap:10px}.feature-card{padding:16px 12px 14px;height:145px}.welcome-actions{flex-direction:column;gap:12px}}@media (max-width: 480px){.welcome-title{font-size:24px}.features{grid-template-columns:1fr 1fr;gap:8px}.suggestion-chips{flex-direction:column}.chip{width:100%;text-align:center}}.doc-modal{width:640px}.drop-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:36px;border:2px dashed var(--border);border-radius:var(--radius-lg);text-align:center;cursor:pointer;color:var(--text-secondary);transition:all .25s var(--ease);margin-bottom:18px}.drop-zone:hover,.drop-zone.drag-over{border-color:var(--amd-red);background:var(--amd-red-dim2);color:var(--amd-red);transform:translateY(-1px)}.drop-zone.uploading{border-color:var(--amd-red);cursor:default}.drop-zone p{margin-top:10px;font-size:14px;font-weight:500;font-family:var(--font-sans)}.drop-hint{font-size:12px;color:var(--text-muted);margin-top:4px;font-family:var(--font-sans)}.upload-spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}.path-input-form{display:flex;align-items:center;gap:8px;margin-bottom:16px}.path-icon{color:var(--text-muted);flex-shrink:0}.path-input{flex:1;padding:9px 14px;border:1px solid var(--border);border-radius:var(--radius-md);outline:none;font-size:13px;font-family:var(--font-mono);transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease)}.path-input:focus{border-color:var(--amd-red)}.path-input::placeholder{color:var(--text-muted)}.doc-stats{display:flex;gap:8px;align-items:center;font-size:12px;color:var(--text-muted);margin-bottom:12px;padding:0 2px}.doc-list{display:flex;flex-direction:column;gap:4px}.doc-row{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease),background var(--duration) var(--ease)}.doc-row:hover{border-color:var(--amd-red-light);background:var(--tint-subtle)}.doc-info{flex:1;min-width:0}.doc-name{display:block;font-weight:500;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.doc-meta{font-size:12px;color:var(--text-muted)}.doc-timestamp{display:inline-flex;align-items:center;gap:3px;margin-left:6px;padding-left:6px;border-left:1px solid var(--border-light);color:var(--text-muted);font-size:11px;cursor:default}.doc-timestamp svg{opacity:.6;flex-shrink:0}.doc-status-badge{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:2px 8px;border-radius:var(--radius-sm);font-family:var(--font-mono)}.doc-status-failed{color:var(--accent-danger);background:var(--accent-danger-dim)}.doc-status-cancelled{color:var(--text-muted);background:#80808014}.doc-status-missing{color:var(--accent-gold);background:var(--accent-gold-dim)}.doc-row-actions{display:flex;align-items:center;gap:2px;flex-shrink:0;opacity:0;transition:opacity .15s}.doc-row:hover .doc-row-actions{opacity:1}.doc-open-folder{color:var(--text-muted)}.doc-open-folder:hover{color:var(--amd-blue, #0096d6)}.doc-delete{color:var(--text-muted)}.doc-delete:hover{color:var(--amd-red)}.empty-docs{display:flex;flex-direction:column;align-items:center;padding:32px;color:var(--text-muted);text-align:center}.empty-docs p{font-size:14px;margin-top:8px}.empty-docs span{font-size:12px;margin-top:4px}.file-browser-modal{width:min(95vw,1000px);max-height:85vh;display:flex;flex-direction:column}.file-browser-modal.has-preview{width:min(95vw,1200px)}.file-browser-body{display:flex;flex-direction:column;flex:1;overflow:hidden;padding:0 16px 16px;gap:10px}.fb-quick-links{display:flex;gap:6px;flex-wrap:wrap;padding:4px 0}.fb-quick-link{display:flex;align-items:center;gap:5px;padding:5px 10px;border-radius:var(--radius-sm);border:1px solid var(--border-light);background:var(--bg-secondary);color:var(--text-secondary);font-size:12px;cursor:pointer;transition:all var(--duration) var(--ease)}.fb-quick-link:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border)}.fb-search-bar{display:flex;gap:8px;align-items:center}.fb-search-input-wrap{flex:1;position:relative;display:flex;align-items:center}.fb-search-icon{position:absolute;left:10px;color:var(--text-muted);pointer-events:none}.fb-search-input{width:100%;padding:8px 30px 8px 32px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:13px;font-family:var(--font-sans);outline:none;transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease)}.fb-search-input:focus{border-color:#ed1c2466;box-shadow:0 0 12px #ed1c2414}.fb-search-clear{position:absolute;right:8px;background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px;display:flex}.fb-type-filter{padding:8px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:12px;font-family:var(--font-sans);outline:none;min-width:110px}.fb-search-btn{padding:8px 14px;border-radius:var(--radius-md);border:1px solid var(--amd-red);background:var(--amd-red);color:#fff;font-size:12px;font-weight:600;font-family:var(--font-mono);cursor:pointer;white-space:nowrap;transition:all var(--duration) var(--ease)}.fb-search-btn:hover{background:var(--amd-red-dark);box-shadow:0 0 12px #ed1c2433}.fb-search-btn:disabled{opacity:.4;cursor:not-allowed;box-shadow:none}.fb-breadcrumb{display:flex;align-items:center;gap:2px;padding:4px 0;font-size:12px;color:var(--text-secondary);overflow-x:auto;flex-wrap:nowrap}.fb-crumb{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:2px 4px;border-radius:var(--radius-sm);font-size:12px;white-space:nowrap;transition:all var(--duration) var(--ease)}.fb-crumb:hover{background:var(--bg-hover);color:var(--text-primary)}.fb-crumb-item{display:flex;align-items:center}.fb-crumb-sep{color:var(--text-muted);flex-shrink:0}.fb-up-btn{margin-left:auto;background:none;border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;padding:3px 6px;border-radius:var(--radius-sm);display:flex;align-items:center;transition:all var(--duration) var(--ease)}.fb-up-btn:hover{background:var(--bg-hover);border-color:var(--amd-red);color:var(--amd-red)}.fb-search-header{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-secondary);padding:4px 0}.fb-back-btn{background:none;border:none;color:var(--amd-red);cursor:pointer;font-size:12px;transition:color var(--duration) var(--ease)}.fb-back-btn:hover{color:var(--amd-red-light)}.fb-content{display:flex;flex:1;overflow:hidden;gap:12px;min-height:300px}.fb-file-list{flex:1;overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-lg);min-width:250px;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.fb-file-list::-webkit-scrollbar{width:5px}.fb-file-list::-webkit-scrollbar-track{background:transparent}.fb-file-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.fb-file-list::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.fb-entry{display:flex;align-items:center;padding:8px 10px;gap:8px;cursor:pointer;border-bottom:1px solid var(--border-light);transition:background var(--duration-fast) var(--ease);font-size:13px;font-family:var(--font-sans)}.fb-entry:hover{background:var(--bg-hover)}.fb-entry.selected{background:var(--amd-red-dim2);border-color:#ed1c241f}.fb-entry.folder .fb-entry-icon{color:var(--accent-gold)}.fb-entry .fb-entry-icon{color:var(--text-muted);flex-shrink:0}.fb-entry-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary)}.fb-entry.folder .fb-entry-name{font-weight:500}.fb-entry-size,.fb-entry-date{font-size:11px;color:var(--text-muted);white-space:nowrap;flex-shrink:0;font-family:var(--font-mono)}.fb-entry-size{min-width:55px;text-align:right}.fb-entry-date{min-width:65px;text-align:right}.fb-entry-checkbox{width:16px;height:16px;min-width:16px;min-height:16px;cursor:pointer;accent-color:var(--amd-red);flex-shrink:0}.fb-preview{width:280px;flex-shrink:0;border:1px solid var(--border);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden}.fb-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--border)}.fb-preview-name{font-size:12px;font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fb-preview-meta{display:flex;gap:10px;padding:6px 12px;font-size:11px;color:var(--text-muted);border-bottom:1px solid var(--border-light);font-family:var(--font-mono)}.fb-preview-columns{padding:6px 12px;font-size:11px;color:var(--text-secondary);border-bottom:1px solid var(--border-light);word-break:break-word}.fb-preview-content{flex:1;overflow:auto;padding:10px 12px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);white-space:pre-wrap;word-break:break-all;line-height:1.5;margin:0;background:var(--bg-code);scrollbar-width:thin;scrollbar-color:var(--border) transparent}.fb-preview-content::-webkit-scrollbar{width:5px;height:5px}.fb-preview-content::-webkit-scrollbar-track{background:transparent}.fb-preview-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.fb-preview-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.fb-preview-loading,.fb-preview-binary{padding:20px;text-align:center;color:var(--text-muted);font-size:12px}.fb-actions{display:flex;align-items:center;gap:10px;padding-top:12px;border-top:1px solid var(--border)}.fb-selection-info{font-size:12px;color:var(--text-muted);flex:1}.fb-index-status{font-size:11px;color:var(--amd-red);font-family:var(--font-mono)}.fb-action-btns{display:flex;gap:8px}.fb-action-btn{display:flex;align-items:center;gap:5px;padding:8px 16px;border-radius:var(--radius-md);font-size:12px;font-weight:500;font-family:var(--font-sans);cursor:pointer;transition:all var(--duration) var(--ease)}.fb-action-btn.secondary{border:1px solid var(--border);background:transparent;color:var(--text-primary)}.fb-action-btn.secondary:hover{background:var(--bg-hover);border-color:var(--text-muted)}.fb-action-btn.primary{border:1px solid var(--amd-red);background:var(--amd-red);color:#fff}.fb-action-btn.primary:hover{background:var(--amd-red-dark);box-shadow:0 0 12px #ed1c2433}.fb-action-btn:disabled{opacity:.4;cursor:not-allowed}.fb-loading,.fb-empty,.fb-error{padding:30px;text-align:center;color:var(--text-muted);font-size:13px}.fb-error{color:var(--amd-red);background:var(--amd-red-dim2);border-radius:var(--radius-md);padding:10px}@media (max-width: 768px){.file-browser-modal{width:100vw;max-height:100vh;border-radius:0}.fb-preview{display:none}.fb-search-bar{flex-wrap:wrap}.fb-type-filter{min-width:100%}}.settings-modal{width:560px}.settings-section{margin-bottom:28px}.settings-section:last-child{margin-bottom:0}.settings-section h4{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:2px;color:var(--text-muted);margin-bottom:14px}.status-grid{display:flex;flex-direction:column;gap:8px}.status-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:var(--radius-md);background:var(--bg-secondary);border:1px solid var(--border-light);transition:border-color var(--duration) var(--ease);gap:8px}.status-row:hover{border-color:var(--border)}.status-row--has-hint{align-items:flex-start}.status-label{font-size:13px;font-family:var(--font-sans);flex-shrink:0;padding-top:1px}.status-value-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:3px;min-width:0}.status-value{font-size:13px;font-weight:600;font-family:var(--font-mono)}.status-value.ok{color:var(--accent-green)}.status-value.warn{color:var(--accent-gold)}.status-hint{font-size:11px;color:var(--text-muted);font-weight:400}.status-hint code{font-family:var(--font-mono);font-size:10.5px;padding:1px 5px;border-radius:2px;background:#00000012;color:var(--text-secondary);white-space:nowrap}[data-theme=dark] .status-hint code{background:#ffffff12}.status-error{padding:20px;text-align:center;color:var(--text-muted);font-family:var(--font-sans)}.status-error code{display:inline-block;margin-top:10px;padding:5px 14px;background:var(--bg-tertiary);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:13px;border:1px solid var(--border)}.setting-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0;font-size:14px;font-family:var(--font-sans)}.setting-path{font-family:var(--font-mono);font-size:12px;color:var(--text-secondary);background:var(--bg-tertiary);padding:3px 10px;border-radius:var(--radius-sm);border:1px solid var(--border-light)}.model-override-desc{font-size:13px;color:var(--text-secondary);line-height:1.5;margin-bottom:12px;font-family:var(--font-sans)}.lemonade-link,.lemonade-link-inline{color:var(--accent);text-decoration:none;font-weight:500;transition:color var(--duration) var(--ease)}.lemonade-link:hover,.lemonade-link-inline:hover{color:var(--accent-green);text-decoration:underline}.lemonade-link svg{vertical-align:-1px;margin-left:2px}.lemonade-link-inline{color:var(--accent-gold)}.model-input-row{display:flex;gap:8px;align-items:stretch}.model-input{flex:1;padding:8px 12px;font-size:13px;font-family:var(--font-mono);background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-md);color:var(--text-primary);outline:none;transition:border-color var(--duration) var(--ease)}.model-input:focus{border-color:var(--accent)}.model-input::placeholder{color:var(--text-muted);font-size:12px}.model-input.has-override{border-color:var(--accent-green)}.model-input:disabled{opacity:.6}.model-btn-group{display:flex;gap:6px;flex-shrink:0}.btn-model-save{padding:8px 16px;font-size:13px;font-weight:500;font-family:var(--font-sans);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-tertiary);color:var(--text-primary);cursor:pointer;transition:all var(--duration) var(--ease)}.btn-model-save:hover:not(:disabled){background:var(--accent);color:#fff;border-color:var(--accent)}.btn-model-save:disabled{opacity:.4;cursor:not-allowed}.btn-model-save.saved{color:var(--accent-green);border-color:var(--accent-green)}.btn-model-clear{padding:8px 12px;font-size:13px;font-weight:500;font-family:var(--font-sans);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-tertiary);color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease)}.btn-model-clear:hover:not(:disabled){color:var(--accent-red, #e55);border-color:var(--accent-red, #e55)}.btn-model-clear:disabled{opacity:.4;cursor:not-allowed}.model-warning{display:flex;gap:10px;margin-top:12px;padding:12px 14px;border-radius:var(--radius-md);background:#eab30814;border:1px solid rgba(234,179,8,.25);color:var(--accent-gold)}.model-warning svg{flex-shrink:0;margin-top:1px}.model-warning-content{flex:1}.model-warning-content strong{display:block;font-size:13px;font-weight:600;font-family:var(--font-sans);margin-bottom:4px}.model-warning-content p{font-size:12px;line-height:1.5;color:var(--text-secondary);font-family:var(--font-sans);margin-bottom:10px}.btn-model-confirm{padding:6px 14px;font-size:12px;font-weight:500;font-family:var(--font-sans);border:1px solid rgba(234,179,8,.4);border-radius:var(--radius-sm);background:#eab3081f;color:var(--accent-gold);cursor:pointer;transition:all var(--duration) var(--ease)}.btn-model-confirm:hover{background:#eab30833;border-color:var(--accent-gold)}.model-active-override{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:12px;color:var(--text-secondary);font-family:var(--font-sans)}.model-active-override code{font-family:var(--font-mono);font-size:12px;color:var(--accent-green);background:var(--bg-tertiary);padding:2px 8px;border-radius:var(--radius-sm);border:1px solid var(--border-light)}.model-active-dot{width:6px;height:6px;border-radius:50%;background:var(--accent-green);flex-shrink:0}.model-status-section{margin-top:10px}.model-status-indicators{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}.model-status-pill{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;font-size:11px;font-weight:500;font-family:var(--font-sans);border:1px solid var(--border-light);background:var(--bg-secondary)}.model-status-pill.ok{color:var(--accent-green);border-color:#22c55e40}.model-status-pill.warn{color:var(--text-muted);border-color:var(--border-light)}.model-status-pill-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0}.model-status-pill.ok .model-status-pill-dot{background:var(--accent-green)}.model-status-pill.warn .model-status-pill-dot{background:var(--text-muted);opacity:.5}.model-status-hint{font-size:12px;color:var(--text-muted);margin-top:8px;line-height:1.5;font-family:var(--font-sans)}.model-status-hint code{font-family:var(--font-mono);font-size:11px;padding:1px 6px;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border-light);color:var(--text-secondary);white-space:nowrap}.memory-warning-value{display:inline-flex;align-items:center;gap:5px}.ctx-preset-row{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0 10px}.btn-ctx-preset{padding:4px 10px;font-size:12px;font-family:var(--font-mono);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);color:var(--text-secondary);cursor:pointer;transition:border-color .12s,color .12s,background .12s}.btn-ctx-preset:hover:not(:disabled){border-color:var(--border);color:var(--text-primary)}.btn-ctx-preset.active{background:var(--bg-accent, var(--bg-secondary));border-color:var(--text-accent, var(--text-primary));color:var(--text-primary)}.btn-ctx-preset:disabled{opacity:.5;cursor:not-allowed}.danger-zone{border-top:1px solid var(--border);padding-top:20px;margin-top:8px}.danger-divider{height:1px;background:var(--border);margin:16px 0}.danger-warning{font-size:12px;color:var(--text-muted);margin-bottom:12px;line-height:1.5;font-family:var(--font-sans)}.setting-actions{margin-top:4px}.loading-text{font-size:13px;color:var(--text-muted);padding:16px;text-align:center;font-family:var(--font-sans)}.about-info p{font-size:14px;font-weight:500;font-family:var(--font-sans)}.about-sub{font-size:13px;color:var(--text-secondary);margin-top:6px;line-height:1.6;font-weight:400;font-family:var(--font-sans)}.mobile-modal{width:420px}.mobile-modal-body{display:flex;flex-direction:column;gap:16px}.tunnel-status{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:13px;font-weight:500}.tunnel-status .status-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.tunnel-status .status-dot.active{background:var(--accent-green);box-shadow:0 0 8px #4ec93266}.tunnel-status .status-dot.starting{background:var(--accent-gold);animation:pulse-dot 1.2s ease-in-out infinite}.tunnel-status .status-dot.error{background:var(--accent-danger)}.tunnel-status .status-dot.inactive{background:var(--text-muted)}.tunnel-status .tunnel-spinner{margin-left:auto;width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.tunnel-error{padding:12px 16px;background:#ef444414;border:1px solid rgba(239,68,68,.25);border-radius:var(--radius-sm);color:var(--accent-danger);font-size:13px;line-height:1.5;word-break:break-word;white-space:pre-line}.tunnel-error a{color:var(--accent-danger);text-decoration:underline}.qr-code-area{display:flex;flex-direction:column;align-items:center;gap:12px}.qr-code-area canvas{border-radius:var(--radius-md);border:2px solid var(--border);box-shadow:var(--shadow-sm)}.qr-placeholder{width:200px;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:var(--bg-secondary);border:2px dashed var(--border);border-radius:var(--radius-md);color:var(--text-muted);font-size:14px}.qr-placeholder.error{border-color:#ef44444d;color:var(--accent-danger)}.qr-placeholder .placeholder-spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}.tunnel-url-area{display:flex;flex-direction:column;gap:6px}.tunnel-url-area label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted)}.tunnel-url-row{display:flex;gap:8px;align-items:center}.tunnel-url-row input{flex:1;padding:8px 12px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:12px;color:var(--text-primary);outline:none}.tunnel-url-row input:focus{border-color:var(--amd-red)}button.copy-url-btn{display:flex;align-items:center;gap:6px;padding:8px 14px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:12px;font-weight:500;white-space:nowrap;transition:all var(--duration) var(--ease)}button.copy-url-btn:hover{background:var(--bg-hover);border-color:var(--amd-red);color:var(--amd-red)}button.copy-url-btn.copied{color:var(--accent-green);border-color:var(--accent-green)}.tunnel-password-hint{padding:14px 16px;background:#f59e0b0f;border:1px solid rgba(245,158,11,.2);border-radius:var(--radius-sm);text-align:center}.tunnel-password-hint label{display:block;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--accent-gold);margin-bottom:6px}.tunnel-password-value{font-size:22px;font-family:var(--font-mono);font-weight:700;color:var(--text-primary);letter-spacing:1px;-webkit-user-select:all;user-select:all;cursor:text;margin-bottom:4px}.tunnel-password-note{font-size:11px;color:var(--text-muted)}.mobile-instructions{padding:14px 16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:13px;color:var(--text-secondary);line-height:1.6}.mobile-instructions ol{margin:0;padding-left:20px}.mobile-instructions li{margin-bottom:4px}.mobile-instructions li:last-child{margin-bottom:0}.mobile-access-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:4px}@media (max-width: 480px){.mobile-modal{width:100%}.qr-code-area canvas{width:160px!important;height:160px!important}.qr-placeholder{width:160px;height:160px}}.connection-banner{display:flex;align-items:center;gap:10px;padding:10px 24px;font-size:12px;font-weight:500;font-family:var(--font-sans);line-height:1.5;flex-shrink:0;animation:slideDown .2s var(--ease);z-index:40}.connection-banner--error{background:#fef2f2;color:#991b1b;border-bottom:1px solid #fecaca}.connection-banner--warning{background:#fffbeb;color:#92400e;border-bottom:1px solid #fed7aa}.connection-banner--device{background:#f0f9ff;color:#075985;border-bottom:1px solid #bae6fd}[data-theme=dark] .connection-banner--error{background:#ed1c240f;color:#fca5a5;border-bottom:1px solid rgba(237,28,36,.15)}[data-theme=dark] .connection-banner--warning{background:#e8a8300f;color:#fcd34d;border-bottom:1px solid rgba(232,168,48,.15)}[data-theme=dark] .connection-banner--device{background:#031624;color:#7dd3fc;border-bottom:1px solid #0c2d42}.connection-banner--init{background:#eff6ff;color:#1e40af;border-bottom:1px solid #bfdbfe}[data-theme=dark] .connection-banner--init{background:#3b82f60f;color:#93c5fd;border-bottom:1px solid rgba(59,130,246,.15)}.connection-banner__icon{flex-shrink:0;display:flex;align-items:center}.connection-banner__text{flex:1;min-width:0}.connection-banner__hint{font-weight:400;opacity:.8;font-size:11px}.connection-banner__hint code{font-family:var(--font-mono);padding:2px 7px;border-radius:var(--radius-sm);background:#0000000f;font-size:11px}[data-theme=dark] .connection-banner__hint code{background:#ffffff0f}.connection-banner__link{color:inherit;text-decoration:underline;opacity:.85}.connection-banner__link:hover{opacity:1}.connection-banner__dismiss{flex-shrink:0;width:26px;height:26px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);opacity:.5;transition:opacity var(--duration-fast) var(--ease)}.connection-banner__dismiss:hover{opacity:1}.connection-banner__retry{flex-shrink:0;padding:5px 14px;border-radius:var(--radius-md);font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;transition:all var(--duration) var(--ease)}.connection-banner--error .connection-banner__retry{background:#991b1b;color:#fff}.connection-banner--error .connection-banner__retry:hover{background:#7f1d1d}.connection-banner--warning .connection-banner__retry{background:#92400e;color:#fff}.connection-banner--warning .connection-banner__retry:hover{background:#78350f}[data-theme=dark] .connection-banner--error .connection-banner__retry{background:#fca5a5;color:#120808}[data-theme=dark] .connection-banner--warning .connection-banner__retry{background:#fcd34d;color:#120e05}.connection-banner__retry--secondary{opacity:.7;margin-left:-4px}.connection-banner__retry--secondary:hover{opacity:1}.connection-banner__loading{flex-shrink:0;display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;font-family:var(--font-mono);opacity:.7}.connection-banner__spinner{animation:spin 1s linear infinite}.connection-banner__progress{opacity:1;gap:8px}.connection-banner__progress-bar{display:inline-block;width:100px;height:6px;border-radius:3px;background-color:#ffffff26;overflow:hidden;flex-shrink:0}.connection-banner__progress-fill{display:block;height:100%;background-color:currentColor;transition:width .2s ease-out;max-width:100%}.connection-banner__progress-label{font-variant-numeric:tabular-nums;white-space:nowrap}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes slideDown{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@media (max-width: 768px){.connection-banner{padding:8px 16px 8px 52px;font-size:11px}}.update-chip{position:fixed;right:16px;bottom:16px;z-index:1200;display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border-radius:999px;max-width:360px;font-size:12px;line-height:1.3;font-weight:500;white-space:nowrap;background:#1e1e28eb;color:#f0f0f5;border:1px solid rgba(255,255,255,.08);box-shadow:0 4px 14px #0000003d;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);animation:update-chip-fade-in .2s ease-out}@keyframes update-chip-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.update-chip__icon{flex-shrink:0;opacity:.85}.update-chip__label{overflow:hidden;text-overflow:ellipsis}.update-chip__action{background:transparent;border:none;color:inherit;font:inherit;cursor:pointer;padding:0;text-decoration:underline;text-underline-offset:2px}.update-chip__action:hover,.update-chip__action:focus-visible{color:#fff;outline:none}.update-chip__dismiss{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;color:inherit;opacity:.55;cursor:pointer;padding:2px;margin-left:2px;border-radius:50%}.update-chip__dismiss:hover,.update-chip__dismiss:focus-visible{opacity:1;background:#ffffff14;outline:none}.update-chip--available,.update-chip--downloading{border-color:#63b3ed66}.update-chip--ready{background:#2e7d32eb;border-color:#81c7848c;color:#fff}.update-chip--error{background:#641e1eeb;border-color:#ef53508c;color:#fff}@media (prefers-color-scheme: light){.update-chip{background:#fffffff5;color:#1a1a2e;border-color:#00000014;box-shadow:0 4px 14px #0000001f}.update-chip--ready{background:#2e7d32f5;color:#fff}.update-chip--error{background:#c62828f5;color:#fff}}.permission-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:var(--bg-modal-overlay, rgba(0, 0, 0, .5));animation:permFadeIn .15s var(--ease)}@keyframes permFadeIn{0%{opacity:0}to{opacity:1}}.permission-prompt{width:440px;max-width:calc(100vw - 32px);background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden;animation:permSlideUp .2s var(--ease)}@keyframes permSlideUp{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.permission-header{display:flex;align-items:center;gap:12px;padding:16px 20px;background:#e23c400f;border-bottom:1px solid var(--border-light)}[data-theme=dark] .permission-header{background:#e23c4014}.permission-header-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:var(--radius-md);background:var(--amd-red);color:#fff;flex-shrink:0}.permission-header-text{flex:1;min-width:0}.permission-title{font-size:15px;font-weight:700;color:var(--text-primary);margin:0}.permission-agent{font-size:12px;color:var(--text-secondary);font-weight:500}.permission-countdown{display:flex;align-items:center;gap:4px;padding:4px 10px;border-radius:var(--radius-full);background:var(--accent-danger-dim);color:var(--accent-danger);font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;flex-shrink:0;animation:permCountdownPulse 1s infinite}@keyframes permCountdownPulse{0%,to{opacity:1}50%{opacity:.7}}.permission-body{padding:16px 20px}.permission-message{font-size:14px;line-height:1.5;color:var(--text-primary);margin:0 0 12px}.permission-tool-info{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.permission-tool-header{display:flex;align-items:center;gap:6px;padding:8px 12px;background:var(--bg-tertiary);border-bottom:1px solid var(--border-light);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary)}.permission-tool-header svg{color:var(--accent-yellow)}.permission-tool-name{padding:8px 12px;border-bottom:1px solid var(--border-light)}.permission-tool-name code{font-family:var(--font-mono);font-size:13px;font-weight:600;color:var(--amd-red)}.permission-tool-args{padding:0;max-height:160px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.permission-tool-args::-webkit-scrollbar{width:5px}.permission-tool-args::-webkit-scrollbar-track{background:transparent}.permission-tool-args::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.permission-tool-args::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.permission-tool-args pre{margin:0;padding:10px 12px;font-family:var(--font-mono);font-size:12px;line-height:1.5;color:var(--text-secondary);white-space:pre-wrap;word-break:break-all}.permission-critical-banner{display:flex;align-items:center;gap:6px;padding:8px 12px;margin-top:12px;border-radius:var(--radius-sm);background:var(--accent-danger-dim);border:1px solid rgba(239,68,68,.2);color:var(--accent-danger);font-size:12px;font-weight:600}.permission-remember{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:13px;color:var(--text-secondary);cursor:pointer;border-top:1px solid var(--border-light);transition:background .15s var(--ease)}.permission-remember:hover{background:var(--bg-hover)}.permission-remember input[type=checkbox]{width:16px;height:16px;accent-color:var(--amd-red);cursor:pointer}.permission-remember code{font-family:var(--font-mono);font-size:12px;padding:1px 4px;border-radius:var(--radius-xs);background:var(--bg-tertiary);color:var(--text-primary)}.permission-actions{display:flex;gap:10px;padding:12px 20px;border-top:1px solid var(--border-light)}.permission-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:10px 16px;border-radius:var(--radius-md);font-size:14px;font-weight:600;transition:all .15s var(--ease)}.permission-btn:disabled{opacity:.6;cursor:not-allowed}.permission-btn-allow{background:var(--accent-green);color:#fff;border:1px solid var(--accent-green)}.permission-btn-allow:hover:not(:disabled){filter:brightness(1.1);box-shadow:0 2px 8px #22c55e4d}.permission-btn-deny{background:transparent;color:var(--text-secondary);border:1px solid var(--border)}.permission-btn-deny:hover:not(:disabled){color:var(--accent-danger);border-color:var(--accent-danger);background:#ef44440f}.permission-hints{display:flex;justify-content:center;gap:16px;padding:8px 20px 12px;font-size:11px;color:var(--text-muted)}.permission-hints kbd{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:18px;padding:0 5px;border-radius:var(--radius-xs);border:1px solid var(--border);background:var(--bg-secondary);font-family:var(--font-mono);font-size:10px;font-weight:600;color:var(--text-secondary);margin-right:4px}@media (max-width: 480px){.permission-prompt{width:100%;max-width:100%;border-radius:var(--radius-lg) var(--radius-lg) 0 0;position:fixed;bottom:0;left:0;right:0}.permission-overlay{align-items:flex-end}}@font-face{font-family:DM Sans;src:url(./dm-sans-latin-Xz1IZZA0.woff2) format("woff2");font-weight:300 700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Mono;src:url(./space-mono-400-Co7bH5Hm.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;src:url(./jetbrains-mono-latin-6fWv1k7M.woff2) format("woff2");font-weight:400 700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--amd-red: #ED1C24;--amd-red-dark: #c41820;--amd-red-light: #ff4f56;--amd-red-soft: #f04048;--amd-red-dim: rgba(237, 28, 36, .12);--amd-red-dim2: rgba(237, 28, 36, .06);--terminal-green: #4ec932;--terminal-green-dim: #3da826;--terminal-glow: 0 0 6px rgba(78, 201, 50, .15);--accent-green: #4ec932;--accent-green-dim: rgba(78, 201, 50, .12);--accent-yellow: #e8a830;--accent-blue: #3b9eff;--accent-cyan: #06b6d4;--accent-gold: #e8a830;--accent-gold-dim: rgba(232, 168, 48, .12);--accent-danger: #ef4444;--accent-danger-dim: rgba(239, 68, 68, .1);--text-code: #d4d4d4;--bg-primary: #ffffff;--bg-secondary: #f8f9fa;--bg-tertiary: #f0f1f3;--bg-sidebar: #f0f1f3;--bg-input: #ffffff;--bg-hover: #f0f0f0;--bg-active: #e5e7eb;--bg-code: #1e1e1e;--bg-user-msg: rgba(0, 0, 0, .02);--bg-assistant-msg: rgba(0, 0, 0, .015);--bg-modal-overlay: rgba(0, 0, 0, .5);--bg-card: #f8f9fa;--bg-image: none;--bg-image-opacity: 0;--tint-subtle: rgba(0, 0, 0, .03);--tint-hover: rgba(0, 0, 0, .05);--text-primary: #111827;--text-secondary: #6b7280;--text-muted: #9ca3af;--text-inverse: #ffffff;--border: #e5e7eb;--border-light: #f3f4f6;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .04);--shadow-md: 0 4px 16px rgba(0, 0, 0, .08);--shadow-lg: 0 12px 40px rgba(0, 0, 0, .12);--radius-xs: 3px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 10px;--radius-xl: 14px;--radius-full: 9999px;--font-sans: "DM Sans", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Roboto, Helvetica, Arial, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", "Fira Code", "Consolas", "Monaco", monospace;--font-display: "Space Mono", "JetBrains Mono", monospace;--sidebar-w: 300px;--ease: cubic-bezier(.22, 1, .36, 1);--ease-spring: cubic-bezier(.16, 0, .84, 1);--duration: .2s;--duration-fast: .12s}[data-theme=dark]{--bg-primary: #0e0e16;--bg-secondary: #0a0a12;--bg-tertiary: #1a1a28;--bg-sidebar: #08080d;--bg-input: #12121c;--bg-hover: #1e1e2e;--bg-active: #262638;--bg-code: #0a0a12;--bg-card: #12121c;--bg-user-msg: rgba(255, 255, 255, .015);--bg-assistant-msg: rgba(255, 255, 255, .02);--bg-modal-overlay: rgba(0, 0, 0, .88);--text-primary: #e8e8f0;--text-secondary: #9898b0;--text-muted: #8585a0;--border: #222236;--border-light: #1a1a2a;--shadow-sm: 0 1px 3px rgba(0, 0, 0, .6);--shadow-md: 0 4px 20px rgba(0, 0, 0, .7);--shadow-lg: 0 12px 48px rgba(0, 0, 0, .8);--tint-subtle: rgba(255, 255, 255, .02);--tint-hover: rgba(255, 255, 255, .04);--bg-image: none;--bg-image-opacity: 0}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}html,body,#root{height:100%;overflow:hidden;font-family:var(--font-sans);font-size:14px;color:var(--text-primary);background:var(--bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.72}#root:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:-1;background-image:var(--bg-image, none);background-size:cover;background-position:center;background-repeat:no-repeat;opacity:var(--bg-image-opacity, 0)}[data-theme=dark] #root:after{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:1;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='0.025'/%3E%3C/svg%3E");opacity:.4}button{cursor:pointer;border:none;background:none;font:inherit;color:inherit}input,textarea{font:inherit;color:var(--text-primary);background:var(--bg-input)}a{color:var(--amd-red);text-decoration:none}a:hover{text-decoration:underline}::selection{background:#3884ff38;color:inherit}::-moz-selection{background:#3884ff38;color:inherit}.app{display:flex;height:100vh;height:100dvh;position:relative}.main-content{display:flex;flex-direction:column;flex:1;min-width:0;overflow:hidden;position:relative}.view-container{flex:1;display:flex;flex-direction:column;min-height:0;transition:opacity .22s var(--ease),transform .22s var(--ease);will-change:opacity,transform}.view-container.view-transitioning{opacity:0;transform:scale(.984) translateY(10px)}[data-theme=dark] .main-content:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse 600px 500px at 85% 10%,rgba(237,28,36,.06) 0%,transparent 70%),radial-gradient(ellipse 500px 400px at 10% 90%,rgba(78,201,50,.03) 0%,transparent 70%),radial-gradient(ellipse 400px 350px at 50% 50%,rgba(59,158,255,.025) 0%,transparent 70%)}:focus-visible{outline:2px solid var(--terminal-green);outline-offset:2px}button:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid var(--terminal-green);outline-offset:2px}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.btn-primary{display:inline-flex;align-items:center;gap:8px;padding:11px 28px;background:var(--amd-red);color:#fff;border-radius:var(--radius-md);font-weight:600;font-size:14px;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;transition:all var(--duration) var(--ease);position:relative;overflow:hidden}.btn-primary:hover{background:var(--amd-red-dark);box-shadow:0 0 20px #ed1c244d;transform:translateY(-1px)}.btn-primary:active{transform:translateY(0)}.btn-secondary{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border:1px solid var(--border);border-radius:var(--radius-md);font-weight:500;font-size:13px;font-family:var(--font-mono);transition:all var(--duration) var(--ease)}.btn-secondary:hover{border-color:var(--amd-red);color:var(--amd-red);background:var(--amd-red-dim2)}.btn-secondary:active{transform:translateY(0) scale(.98)}.btn-danger{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border:1px solid var(--amd-red);border-radius:var(--radius-md);color:var(--amd-red);font-weight:500;font-size:13px;font-family:var(--font-mono);transition:all var(--duration) var(--ease)}.btn-danger:hover{background:var(--amd-red);color:#fff}.btn-danger:active{transform:scale(.98)}.btn-icon{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-md);color:var(--text-secondary);transition:all var(--duration) var(--ease)}.btn-icon:hover{background:var(--bg-hover);color:var(--text-primary)}.btn-icon:active{transform:scale(.94)}.btn-icon-sm{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:var(--radius-sm);color:var(--text-secondary);transition:all var(--duration) var(--ease)}.btn-icon-sm:hover{background:var(--bg-hover);color:var(--text-primary)}.btn-icon-sm:active{transform:scale(.94)}.beta-badge{display:inline-block;font-size:9px;font-weight:700;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;padding:2px 8px;border-radius:var(--radius-sm);background:var(--accent-gold-dim);color:var(--accent-gold);border:1px solid rgba(232,168,48,.2);vertical-align:middle;line-height:1.3}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:var(--bg-modal-overlay);backdrop-filter:blur(16px) saturate(1.2);-webkit-backdrop-filter:blur(16px) saturate(1.2);display:flex;align-items:center;justify-content:center;animation:fadeIn var(--duration-fast) var(--ease)}.modal-panel{position:relative;width:560px;max-width:92%;max-height:85vh;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;overflow:hidden;animation:slideUp .25s var(--ease)}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;border-bottom:1px solid var(--border);flex-shrink:0}.modal-header h3{font-size:14px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-secondary)}.modal-body{padding:24px;overflow-y:auto;flex:1;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.modal-body::-webkit-scrollbar{width:5px}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.modal-body::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.animated-presence.exiting .modal-overlay{animation:modalOverlayOut .2s var(--ease) forwards}.animated-presence.exiting .modal-panel{animation:modalPanelOut .25s var(--ease) forwards}@keyframes modalOverlayOut{0%{opacity:1}to{opacity:0}}@keyframes modalPanelOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(12px)}}.sidebar-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#000000b3;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);animation:fadeIn var(--duration-fast) var(--ease)}.sidebar-toggle{display:none;position:fixed;top:10px;left:10px;z-index:51;width:38px;height:38px;border-radius:var(--radius-md);background:var(--bg-secondary);border:1px solid var(--border);align-items:center;justify-content:center;color:var(--text-primary);box-shadow:var(--shadow-sm);transition:all var(--duration) var(--ease);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.sidebar-toggle:hover{background:var(--bg-hover)}.loading-spinner{display:flex;align-items:center;justify-content:center;padding:40px;flex:1}.loading-spinner:after{content:"";width:24px;height:24px;border:2px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}.toast{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:200;padding:12px 24px;background:var(--bg-card);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:13px;font-weight:500;font-family:var(--font-sans);box-shadow:var(--shadow-lg);animation:toastIn .2s var(--ease),toastOut .2s var(--ease) 2.5s forwards;pointer-events:none;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.toast-undo{pointer-events:all;cursor:pointer}.toast-undo .toast-action{color:var(--amd-red);font-weight:600;margin-left:12px;cursor:pointer;text-decoration:underline}@keyframes toastIn{0%{opacity:0;transform:translate(-50%) translateY(8px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@keyframes toastOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(8px)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes slideDown{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(12px)}}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes glow{0%,to{box-shadow:0 0 4px #00ff9f1a}50%{box-shadow:0 0 10px #00ff9f33}}@keyframes cursorBlink{0%,to{opacity:1}50%{opacity:0}}.thinking-dots span{animation:loadingDotGlow 2.4s ease-in-out infinite;opacity:.15;color:var(--amd-red, #ff3b3b);text-shadow:0 0 2px rgba(237,28,36,.2)}.thinking-dots span:nth-child(1){animation-delay:0s}.thinking-dots span:nth-child(2){animation-delay:.5s}.thinking-dots span:nth-child(3){animation-delay:1s}@keyframes loadingDotGlow{0%,15%{opacity:.15;text-shadow:0 0 2px rgba(237,28,36,.2)}25%{opacity:1;text-shadow:0 0 8px rgba(237,28,36,.8),0 0 3px rgba(237,28,36,1)}40%,to{opacity:.15;text-shadow:0 0 2px rgba(237,28,36,.2)}}@keyframes revealUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}html.theme-transitioning,html.theme-transitioning *,html.theme-transitioning *:before,html.theme-transitioning *:after{transition:background-color .4s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease!important}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}[data-theme=dark] #root:after{display:none}}@media (max-width: 900px){:root{--sidebar-w: 260px}}@media (max-width: 768px){.sidebar-toggle{display:flex}.sidebar-overlay.visible{display:block}.sidebar{position:fixed!important;left:0;top:0;bottom:0;z-index:50;width:var(--sidebar-w)!important;min-width:var(--sidebar-w)!important;transform:translate(-100%);transition:transform .25s var(--ease);box-shadow:none}.sidebar.open{transform:translate(0);box-shadow:var(--shadow-lg)}.sidebar.collapsed{width:var(--sidebar-w)!important;min-width:var(--sidebar-w)!important}.sidebar.collapsed .sidebar-brand .brand-text,.sidebar.collapsed .sidebar-search,.sidebar.collapsed .session-list,.sidebar.collapsed .privacy-badge span:not(.privacy-dot),.sidebar.collapsed .version-badge,.sidebar.collapsed .new-task-btn{display:revert}.sidebar.collapsed .sidebar-top{padding:16px 16px 12px;justify-content:space-between}.sidebar.collapsed .sidebar-brand{gap:10px}.sidebar.collapsed .sidebar-top-actions{gap:4px}.sidebar.collapsed .sidebar-bottom{flex-direction:row;padding:12px 14px;gap:0;align-items:center}.sidebar.collapsed .sidebar-actions{flex-direction:row;gap:2px}.collapse-btn{display:none}.sidebar-resize-handle{display:none!important}.chat-view,.welcome{padding-top:48px}.chat-header{padding-left:52px!important}.modal-panel{max-width:96%;max-height:90vh}.btn-icon{width:44px;height:44px}.btn-icon-sm{width:36px;height:36px}input,textarea,select{font-size:16px!important}}@media (max-width: 480px){:root{--sidebar-w: 280px}.modal-panel{max-width:100%;max-height:100vh;border-radius:0}}
package/dist/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/png" href="./favicon.png" />
7
7
  <title>GAIA</title>
8
- <script type="module" crossorigin src="./assets/index-iAjQas0m.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-eQemgF08.css">
8
+ <script type="module" crossorigin src="./assets/index-CdffaS1a.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-CzObDlwu.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -0,0 +1,172 @@
1
+ // Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
2
+ // SPDX-License-Identifier: MIT
3
+
4
+ /**
5
+ * main-safety-net.cjs — Hardened Electron main-process error handling.
6
+ *
7
+ * Extracted from main.cjs so tests can require this module without triggering
8
+ * main.cjs side effects. All Electron objects are dependency-injected.
9
+ *
10
+ * Fixes for issue #934 (ERR_STREAM_WRITE_AFTER_END after fresh install):
11
+ * - process.on('uncaughtException') catches stream 'error' events that
12
+ * propagate because the write stream has no listener.
13
+ * - process.on('unhandledRejection') catches rejected app.whenReady() chain.
14
+ * - installLogTee() attaches stream.on('error') so stream errors are handled
15
+ * before they can become uncaughtException (root-cause fix).
16
+ */
17
+
18
+ "use strict";
19
+
20
+ const fs = require("fs");
21
+ const path = require("path");
22
+ const os = require("os");
23
+
24
+ // ── Counter helpers ───────────────────────────────────────────────────────────
25
+ // The counter is currently forensic only — post-mortem grep of
26
+ // ~/.gaia/electron-startup-failures.json.
27
+ // TODO(#938): on next launch, if count >= 3, skip log-tee init and show
28
+ // a "reset state?" dialog (safe-mode entry point).
29
+
30
+ function counterPath(homedir) {
31
+ return path.join(homedir(), ".gaia", "electron-startup-failures.json");
32
+ }
33
+
34
+ function readCount(homedir) {
35
+ try {
36
+ return JSON.parse(fs.readFileSync(counterPath(homedir), "utf8")).count || 0;
37
+ } catch {
38
+ return 0;
39
+ }
40
+ }
41
+
42
+ function writeCount(n, homedir) {
43
+ const p = counterPath(homedir);
44
+ try {
45
+ fs.mkdirSync(path.dirname(p), { recursive: true });
46
+ fs.writeFileSync(p, JSON.stringify({ count: n }), { encoding: "utf8" });
47
+ } catch (err) {
48
+ try { process.stderr.write(`[safety-net] writeCount failed: ${err.message}\n`); } catch { }
49
+ }
50
+ }
51
+
52
+ // ── Log helper ────────────────────────────────────────────────────────────────
53
+
54
+ function appendLog(logPath, msg) {
55
+ try {
56
+ fs.mkdirSync(path.dirname(logPath), { recursive: true });
57
+ fs.appendFileSync(logPath, msg + "\n", { encoding: "utf8" });
58
+ } catch (err) {
59
+ try { process.stderr.write(`[safety-net] log append failed: ${err.message}\n`); } catch { }
60
+ }
61
+ }
62
+
63
+ // ── Core installer ────────────────────────────────────────────────────────────
64
+
65
+ /**
66
+ * Install the safety-net handlers on the current process.
67
+ *
68
+ * @param {object} opts
69
+ * @param {string} opts.logPath - Path to append FATAL lines into.
70
+ * @param {object} opts.dialogModule - Electron dialog (injected for tests).
71
+ * @param {object} opts.appModule - Electron app EventEmitter (injected).
72
+ * @param {Function} [opts.homedirFn] - Override for os.homedir (tests).
73
+ */
74
+ function installSafetyNet({ logPath, dialogModule, appModule, homedirFn }) {
75
+ const homedir = homedirFn || (() => os.homedir());
76
+
77
+ // Per-handler re-entry guard (closure-scoped — each installSafetyNet
78
+ // call gets its own, intentionally; see test_main_error_handling.js).
79
+ let _inFatalHandler = false;
80
+
81
+ function fatal(err) {
82
+ if (_inFatalHandler) {
83
+ try { process.exit(2); } catch { }
84
+ return;
85
+ }
86
+ _inFatalHandler = true;
87
+
88
+ const stack = (err && err.stack) ? err.stack : String(err);
89
+ const ts = new Date().toISOString();
90
+
91
+ // Write to log BEFORE showing dialog so the entry survives even if
92
+ // dialog.showErrorBox itself crashes.
93
+ appendLog(logPath, `[${ts}] FATAL ${stack}`);
94
+
95
+ // Increment crash-loop counter.
96
+ writeCount(readCount(homedir) + 1, homedir);
97
+
98
+ // Pre-app.ready on Windows, showMessageBoxSync silently no-ops;
99
+ // showErrorBox is the only dialog that works in that window.
100
+ // Bare catch: intentional swallow — we are already in the fatal-exit
101
+ // path with no upstream caller to surface errors to.
102
+ try {
103
+ if (appModule.isReady()) {
104
+ dialogModule.showMessageBoxSync({
105
+ type: "error",
106
+ title: "GAIA crashed",
107
+ message: stack,
108
+ buttons: ["OK"],
109
+ });
110
+ } else {
111
+ dialogModule.showErrorBox("GAIA failed to start", stack);
112
+ }
113
+ } catch { } // intentional: fatal path, no upstream
114
+
115
+ try { process.exit(1); } catch { } // intentional: fatal path
116
+ }
117
+
118
+ // Wire process-level handlers.
119
+ process.on("uncaughtException", (err) => fatal(err));
120
+ process.on("unhandledRejection", (reason) => {
121
+ const err = reason instanceof Error ? reason : new Error(String(reason));
122
+ fatal(err);
123
+ });
124
+
125
+ // Reset counter on the first successful user interaction. Resetting at
126
+ // loadApp() is too early — the user may crash before their first focus.
127
+ appModule.on("browser-window-focus", () => writeCount(0, homedir));
128
+
129
+ // Renderer and GPU-process crashes don't fire uncaughtException — route
130
+ // them through fatal() so they get the same dialog + counter treatment.
131
+ appModule.on("render-process-gone", (_event, _webContents, details) => {
132
+ fatal(new Error(`render-process-gone: reason=${details && details.reason}`));
133
+ });
134
+
135
+ appModule.on("child-process-gone", (_event, details) => {
136
+ const reason = details && details.reason;
137
+ // Ignore expected terminations during shutdown so the crash dialog
138
+ // doesn't flash on a clean quit.
139
+ if (reason === "clean-exit" || reason === "killed") return;
140
+ fatal(new Error(
141
+ `child-process-gone: type=${details && details.type} reason=${reason}`
142
+ ));
143
+ });
144
+
145
+ return { fatal };
146
+ }
147
+
148
+ // ── Log-tee helper ────────────────────────────────────────────────────────────
149
+
150
+ /**
151
+ * Attach an 'error' listener to a write stream so that asynchronous stream
152
+ * errors (e.g. ERR_STREAM_WRITE_AFTER_END) are absorbed before they can
153
+ * become uncaughtException. This is the direct root-cause fix for #934.
154
+ *
155
+ * @param {object} opts
156
+ * @param {EventEmitter} opts.stream - The writable stream to guard.
157
+ * @param {string} opts.logPath - Path for fallback error logging.
158
+ * @note The internal WeakSet guard is module-scoped, so idempotency is
159
+ * process-global. A second call on the same stream is a no-op regardless
160
+ * of which caller site invokes it.
161
+ */
162
+ const _teedStreams = new WeakSet();
163
+ function installLogTee({ stream, logPath }) {
164
+ if (_teedStreams.has(stream)) return;
165
+ _teedStreams.add(stream);
166
+ stream.on("error", (err) => {
167
+ const detail = (err && err.message) || (err && err.stack) || String(err);
168
+ appendLog(logPath, `[${new Date().toISOString()}] STREAM_ERROR ${detail}`);
169
+ });
170
+ }
171
+
172
+ module.exports = { installSafetyNet, installLogTee };
package/main.cjs CHANGED
@@ -18,12 +18,46 @@ const path = require("path");
18
18
  const fs = require("fs");
19
19
  const os = require("os");
20
20
  const { spawn } = require("child_process");
21
+ const { pathToFileURL } = require("url");
22
+
23
+ // ── Shared log path ───────────────────────────────────────────────────────────
24
+ // Single source of truth used by installSafetyNet AND installMainLogTee so
25
+ // both write to the same file without independent path computations that
26
+ // could drift apart.
27
+ const _GAIA_DIR = path.join(os.homedir(), ".gaia");
28
+ const _MAIN_LOG_PATH = path.join(_GAIA_DIR, "electron-main.log");
29
+
30
+ // ── Safety net (issue #934) ───────────────────────────────────────────────────
31
+ // Install top-level error handlers BEFORE any service module is required so
32
+ // that synchronous throws at module-load time are caught and shown as a
33
+ // GAIA-branded error box instead of Electron's bare JS-error dialog.
34
+ // Extracted into main-safety-net.cjs so tests can require it without
35
+ // triggering main.cjs side effects (Electron modules, service requires).
36
+ // Wrapped in try/catch: a corrupt ASAR or bad path would otherwise bypass the
37
+ // very handler we are trying to install, falling through to Electron's bare
38
+ // JS-error dialog.
39
+ let installSafetyNet, installLogTee, _fatalHandler;
40
+ try {
41
+ ({ installSafetyNet, installLogTee } = require("./main-safety-net.cjs"));
42
+ ({ fatal: _fatalHandler } = installSafetyNet({
43
+ logPath: _MAIN_LOG_PATH,
44
+ dialogModule: dialog,
45
+ appModule: app,
46
+ }));
47
+ } catch (err) {
48
+ try { process.stderr.write(`[main] safety-net load failed: ${err.message}\n`); } catch { }
49
+ try { dialog.showErrorBox("GAIA failed to start", String((err && err.stack) || err)); } catch { }
50
+ // Synchronous exit: service module requires below have no uncaughtException
51
+ // handler installed, so execution cannot safely continue.
52
+ process.exit(1);
53
+ }
21
54
 
22
55
  // Services (loaded after app.whenReady)
23
56
  const TrayManager = require("./services/tray-manager.cjs");
24
57
  const AgentProcessManager = require("./services/agent-process-manager.cjs");
25
58
  const NotificationService = require("./services/notification-service.cjs");
26
59
  const PortManager = require("./services/port-manager.cjs");
60
+ const { buildIndexQuery } = require("./services/index-query.cjs");
27
61
  const backendInstaller = require("./services/backend-installer.cjs");
28
62
  const installerProgressDialog = require("./services/backend-installer-progress-dialog.cjs");
29
63
  const autoUpdater = require("./services/auto-updater.cjs");
@@ -52,9 +86,8 @@ if (process.platform === "linux") {
52
86
  // diagnostics bundler has something to attach.
53
87
  (function installMainLogTee() {
54
88
  try {
55
- const gaiaDir = path.join(os.homedir(), ".gaia");
56
- try { fs.mkdirSync(gaiaDir, { recursive: true }); } catch { /* ignore */ }
57
- const logPath = path.join(gaiaDir, "electron-main.log");
89
+ try { fs.mkdirSync(_GAIA_DIR, { recursive: true }); } catch { /* ignore */ }
90
+ const logPath = _MAIN_LOG_PATH;
58
91
 
59
92
  // Rotate if > 5 MB — truncate to last ~5 MB on startup.
60
93
  try {
@@ -80,6 +113,10 @@ if (process.platform === "linux") {
80
113
  }
81
114
 
82
115
  const stream = fs.createWriteStream(logPath, { flags: "a" });
116
+ // Root-cause fix for #934: stream.write() after end emits 'error'
117
+ // asynchronously — the try/catch in wrap() below doesn't catch it.
118
+ // This listener absorbs the event before it becomes uncaughtException.
119
+ installLogTee({ stream, logPath });
83
120
  stream.write(
84
121
  `\n──── electron-main opened (${new Date().toISOString()}) pid=${process.pid} ────\n`
85
122
  );
@@ -155,6 +192,11 @@ let backendStderrTail = [];
155
192
  let isIntentionalKill = false;
156
193
  let mainWindow = null;
157
194
 
195
+ // True until createWindow() runs. Guards window-all-closed from firing app.quit()
196
+ // while the backend-installer progress dialog is open (it's the only window during
197
+ // bootstrap, so destroying it would trigger a premature quit — issue #934).
198
+ let isBootstrapping = true;
199
+
158
200
  /** @type {TrayManager | null} */
159
201
  let trayManager = null;
160
202
 
@@ -421,13 +463,18 @@ async function loadApp() {
421
463
  // http://localhost:4200/ would show raw JSON instead of the UI.
422
464
  //
423
465
  // Pass the real backend base URL as a query parameter so the renderer
424
- // can reach whatever random port port-manager picked (see #851).
425
- // Without this, the compiled bundle falls back to its hardcoded
426
- // `http://localhost:4200/api` and every API call 404s.
466
+ // can reach whatever random port port-manager picked (see #851). The
467
+ // renderer (apiBase.ts) validates this value against an allowlist
468
+ // before using it keep buildIndexQuery in sync with TRUSTED_API_RE.
427
469
  const indexPath = path.join(distPath, "index.html");
428
- const apiBase = `http://127.0.0.1:${backendPort}/api`;
429
- console.log("Loading app from:", indexPath, "api:", apiBase);
430
- await mainWindow.loadFile(indexPath, { query: { api: apiBase } });
470
+ const indexQuery = buildIndexQuery(backendPort);
471
+ console.log("Loading app from:", indexPath, "api:", indexQuery.api);
472
+ // Use pathToFileURL so the file:// URL always has forward slashes on
473
+ // Windows — Chromium 130+ (Electron 40) rejects backslash file URLs
474
+ // that Node's url.format() (used by loadFile) produces on Windows.
475
+ const fileUrl = pathToFileURL(indexPath);
476
+ fileUrl.search = new URLSearchParams(indexQuery).toString();
477
+ await mainWindow.loadURL(fileUrl.href);
431
478
  } else {
432
479
  // Show a simple loading/error page
433
480
  mainWindow.loadURL(
@@ -673,6 +720,7 @@ app.whenReady().then(async () => {
673
720
 
674
721
  // Create the window (hidden until ready-to-show)
675
722
  createWindow();
723
+ isBootstrapping = false; // progress dialog is gone; window-all-closed may now quit
676
724
 
677
725
  // Initialize services (tray, agent manager, notifications)
678
726
  initializeServices();
@@ -736,11 +784,21 @@ app.whenReady().then(async () => {
736
784
  mainWindow.show();
737
785
  }
738
786
  });
787
+ }).catch((err) => {
788
+ // Route explicit rejection through the safety-net so the user gets a
789
+ // GAIA-branded dialog and a stack trace in the log (issue #934).
790
+ _fatalHandler(err);
739
791
  });
740
792
 
741
793
  // ── Window-all-closed (C4 fix) ────────────────────────────────────────────
742
794
  // Don't quit when window is hidden — tray keeps app alive
743
795
  app.on("window-all-closed", () => {
796
+ // During bootstrap the progress dialog is the only open window. Destroying
797
+ // it (progress.close()) fires this event before the main window exists, which
798
+ // would trigger a premature app.quit() that races with the startup sequence
799
+ // and causes loadURL() to fail with ERR_FAILED (-2) — issue #934.
800
+ if (isBootstrapping) return;
801
+
744
802
  // If minimize-to-tray is active, the window is just hidden, not closed.
745
803
  // Only quit on macOS if the user explicitly quit (Cmd+Q).
746
804
  const trayActive = trayManager && trayManager.minimizeToTray;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amd-gaia/agent-ui",
3
- "version": "0.17.4",
3
+ "version": "0.17.5",
4
4
  "type": "module",
5
5
  "productName": "GAIA Agent UI",
6
6
  "description": "Privacy-first agentic AI interface with document Q&A - runs 100% locally on AMD Ryzen AI",
@@ -35,6 +35,7 @@
35
35
  "bin/",
36
36
  "dist/",
37
37
  "main.cjs",
38
+ "main-safety-net.cjs",
38
39
  "preload.cjs",
39
40
  "services/",
40
41
  "assets/",