@amd-gaia/agent-ui 0.17.1 → 0.17.3

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:8px 12px 8px 32px;border:1px solid var(--border);border-radius:var(--radius-md);outline:none;font-size:12px;font-family:var(--font-sans);transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease)}.sidebar-search input:focus{border-color:#ed1c2466;box-shadow:0 0 12px #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:8px 10px 8px 12px;border-radius:var(--radius-md);cursor:pointer;margin-bottom:2px;position:relative;transition:background-color .22s var(--ease),box-shadow .28s var(--ease),transform var(--duration-fast) var(--ease);outline:none}.session-item:before{content:"";position:absolute;left:0;top:20%;width:2px;height:60%;background:linear-gradient(180deg,var(--amd-red-light) 0%,var(--amd-red) 60%);border-radius:0 2px 2px 0;transform:scaleY(0);transform-origin:center;transition:transform .3s var(--ease),opacity .2s var(--ease),box-shadow .3s var(--ease);opacity:0}.session-item:hover{background:var(--bg-hover)}.session-item:hover:before{transform:scaleY(.35);opacity:.45}.session-item:active:not(.session-deleting){transform:scale(.982);transition-duration:80ms}.session-item.active{background:var(--bg-active);animation:sessionActivate .32s var(--ease)}.session-item.active .session-title{text-shadow:0 0 .4px var(--text-primary)}.session-item.active:before{transform:scaleY(1);opacity:1;box-shadow:2px 0 10px #ed1c2473}[data-theme=dark] .session-item.active{background:#ed1c2414;box-shadow:inset 0 0 28px #ed1c2412;animation:sessionActivate .32s var(--ease),sessionActivateDarkBg .38s var(--ease)}@keyframes sessionActivate{0%{transform:translate(-4px);opacity:.65}55%{transform:translate(1.5px)}to{transform:translate(0);opacity:1}}@keyframes sessionActivateDarkBg{0%{background:transparent;box-shadow:none}55%{background:#ed1c241f}to{background:#ed1c2414;box-shadow:inset 0 0 28px #ed1c2412}}.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);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:flex;align-items:center;justify-content:space-between;width:100%;padding:7px 12px;border-radius:var(--radius-xs);background:var(--bg-tertiary);border:1px solid var(--border);font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);transition:all var(--duration) var(--ease);cursor:pointer;text-transform:uppercase;letter-spacing:.5px}.agent-summary-bar:hover{background:var(--bg-hover);border-color:var(--text-muted)}.agent-summary-left{display:flex;align-items:center;gap:8px}.agent-summary-right{display:flex;align-items:center;color:var(--text-muted);transition:transform var(--duration-fast) var(--ease)}.agent-summary-text{font-weight:600}.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:msgSlideIn .2s var(--ease)}@keyframes msgSlideIn{0%{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}.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-bottom:1px solid var(--border-light);border-left:2px solid var(--amd-red);animation:msgSlideIn .25s var(--ease)}[data-theme=dark] .msg-assistant{border-left-color:var(--amd-red);background:#ed1c2405}.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:#ed1c2440;box-shadow:0 0 8px #ed1c241f}.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: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}.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-cursor{position:absolute;width:10px;height:18px;background:var(--amd-red);animation:cursorBlink 1s step-end infinite;pointer-events:none;box-shadow:0 0 8px #ed1c2480,0 0 2px #ed1c24cc}.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)}.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}.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}@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:#ed1c242e;color:inherit}::-moz-selection{background:#ed1c242e;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
@@ -4,9 +4,9 @@
4
4
  <meta charset="UTF-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
- <title>GAIA Agent UI</title>
8
- <script type="module" crossorigin src="./assets/index-DFaWywBV.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-TyWv9Ej0.css">
7
+ <title>GAIA</title>
8
+ <script type="module" crossorigin src="./assets/index-B4Qzv7Ys.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-eQemgF08.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/main.cjs CHANGED
@@ -16,16 +16,21 @@
16
16
  const { app, BrowserWindow, shell } = require("electron");
17
17
  const path = require("path");
18
18
  const fs = require("fs");
19
+ const os = require("os");
19
20
  const { spawn } = require("child_process");
20
21
 
21
22
  // Services (loaded after app.whenReady)
22
23
  const TrayManager = require("./services/tray-manager.cjs");
23
24
  const AgentProcessManager = require("./services/agent-process-manager.cjs");
24
25
  const NotificationService = require("./services/notification-service.cjs");
26
+ const backendInstaller = require("./services/backend-installer.cjs");
27
+ const installerProgressDialog = require("./services/backend-installer-progress-dialog.cjs");
28
+ const autoUpdater = require("./services/auto-updater.cjs");
29
+ const agentSeeder = require("./services/agent-seeder.cjs");
25
30
 
26
31
  // ── Configuration ──────────────────────────────────────────────────────────
27
32
 
28
- const APP_NAME = "GAIA Agent UI";
33
+ const APP_NAME = "GAIA";
29
34
  const BACKEND_PORT = 4200;
30
35
  const HEALTH_CHECK_URL = `http://localhost:${BACKEND_PORT}/api/health`;
31
36
  const STARTUP_TIMEOUT = 30000;
@@ -73,35 +78,21 @@ let isQuitting = false;
73
78
 
74
79
  // ── Backend Process ────────────────────────────────────────────────────────
75
80
 
76
- function findGaiaCommand() {
77
- const isWindows = process.platform === "win32";
78
-
79
- // Check common locations
80
- const candidates = isWindows
81
- ? ["gaia.exe", "gaia", "gaia.cmd"]
82
- : ["gaia"];
83
-
84
- for (const cmd of candidates) {
85
- try {
86
- const { execSync } = require("child_process");
87
- const check = isWindows ? `where ${cmd}` : `which ${cmd}`;
88
- execSync(check, { stdio: "ignore" });
89
- return cmd;
90
- } catch {
91
- continue;
92
- }
93
- }
94
- return null;
95
- }
96
-
81
+ /**
82
+ * Start the GAIA Python backend. Expects the backend installer to have
83
+ * already ensured the venv is populated — callers should await
84
+ * `bootstrapBackend()` first.
85
+ *
86
+ * Returns the ChildProcess, or null if the gaia binary cannot be found
87
+ * (shouldn't happen post-ensureBackend, but we guard just in case).
88
+ */
97
89
  function startBackend() {
98
- const gaiaCmd = findGaiaCommand();
90
+ const gaiaCmd = backendInstaller.findGaiaBin();
99
91
 
100
92
  if (!gaiaCmd) {
101
- console.warn(
102
- "Warning: gaia CLI not found. Backend will not start automatically."
93
+ console.error(
94
+ "[main] GAIA backend not found even after install — cannot start backend"
103
95
  );
104
- console.warn("Install with: pip install amd-gaia");
105
96
  return null;
106
97
  }
107
98
 
@@ -111,6 +102,7 @@ function startBackend() {
111
102
  gaiaCmd,
112
103
  ["chat", "--ui", "--ui-port", String(BACKEND_PORT)],
113
104
  {
105
+ cwd: os.homedir(), // Electron's cwd is "/" on macOS when launched from Finder
114
106
  stdio: ["ignore", "pipe", "pipe"],
115
107
  env: { ...process.env },
116
108
  detached: false,
@@ -246,17 +238,9 @@ async function loadApp() {
246
238
  const distPath = findDistPath();
247
239
 
248
240
  if (distPath) {
249
- // Load the built frontend directly (for when backend serves it)
250
- // First try loading from the backend URL
251
- try {
252
- await mainWindow.loadURL(`http://localhost:${BACKEND_PORT}`);
253
- console.log("Loaded app from backend server");
254
- return;
255
- } catch {
256
- // Fall through to loading from file
257
- }
258
-
259
- // Load from built files
241
+ // Always load the bundled frontend from the asar. The backend only
242
+ // serves the API (no frontend files in the pip package), so loading
243
+ // http://localhost:4200/ would show raw JSON instead of the UI.
260
244
  const indexPath = path.join(distPath, "index.html");
261
245
  console.log("Loading app from:", indexPath);
262
246
  await mainWindow.loadFile(indexPath);
@@ -337,18 +321,168 @@ function setupJumpList() {
337
321
  }
338
322
  }
339
323
 
340
- // ── App Lifecycle ──────────────────────────────────────────────────────────
324
+ // ── Backend Bootstrap (Phase A) ───────────────────────────────────────────
341
325
 
342
- // Handle creating/removing shortcuts on Windows when installing/uninstalling
343
- try {
344
- if (require("electron-squirrel-startup")) {
345
- app.quit();
326
+ /**
327
+ * Ensure the Python backend is installed before the main window loads.
328
+ *
329
+ * Shows a borderless progress window while the install runs. On failure,
330
+ * surfaces a retry / manual / quit dialog. Loops until the user either
331
+ * succeeds, chooses manual install, or quits.
332
+ *
333
+ * Returns true if the backend is ready, false if the user chose to quit.
334
+ */
335
+ async function bootstrapBackend() {
336
+ // Fast-path: if an install is obviously not needed (binary present and
337
+ // version matches), skip the progress window entirely and go straight to
338
+ // ensureBackend which will confirm readiness.
339
+ const existingBin = backendInstaller.findGaiaBin();
340
+ if (existingBin) {
341
+ const installedVersion = backendInstaller.getInstalledVersion(existingBin);
342
+ let expectedVersion = null;
343
+ try {
344
+ const pkg = JSON.parse(
345
+ fs.readFileSync(path.join(__dirname, "package.json"), "utf8")
346
+ );
347
+ expectedVersion = pkg.version;
348
+ } catch {
349
+ // ignore
350
+ }
351
+ if (installedVersion && installedVersion === expectedVersion) {
352
+ console.log(
353
+ `[main] GAIA backend already at ${installedVersion} — skipping bootstrap UI`
354
+ );
355
+ // Clean up any stale state file so the state machine reflects reality.
356
+ backendInstaller.setState(backendInstaller.STATES.READY, {
357
+ version: expectedVersion,
358
+ installedVersion,
359
+ });
360
+ return true;
361
+ }
362
+ }
363
+
364
+ // Slow path: need to install or upgrade. Show the progress window.
365
+ let keepTrying = true;
366
+ while (keepTrying) {
367
+ const progress = installerProgressDialog.createProgressWindow();
368
+
369
+ try {
370
+ await backendInstaller.ensureBackend({
371
+ onProgress: progress.onProgress,
372
+ });
373
+ progress.close();
374
+ console.log("[main] Backend bootstrap complete");
375
+ return true;
376
+ } catch (err) {
377
+ progress.close();
378
+ console.error(
379
+ `[main] Backend bootstrap failed: ${err && err.message ? err.message : err}`
380
+ );
381
+
382
+ const errorInfo = {
383
+ message: (err && err.message) || "GAIA install failed.",
384
+ stage: (err && err.stage) || null,
385
+ suggestion: (err && err.suggestion) || null,
386
+ };
387
+
388
+ const choice = await installerProgressDialog.showFailureDialog(
389
+ null,
390
+ errorInfo
391
+ );
392
+
393
+ if (choice === "retry") {
394
+ continue; // loop
395
+ }
396
+ if (choice === "manual") {
397
+ // The user was directed to the docs in an external browser. Quit so
398
+ // they can complete the manual install and restart.
399
+ return false;
400
+ }
401
+ return false; // quit
402
+ }
346
403
  }
347
- } catch {
348
- // electron-squirrel-startup not available
404
+ return false;
405
+ }
406
+
407
+ // ── App Lifecycle ──────────────────────────────────────────────────────────
408
+
409
+ // Note: electron-squirrel-startup was removed in Phase C of the
410
+ // desktop-installer plan. electron-builder's NSIS target does not need
411
+ // Squirrel's first-run shortcut bookkeeping — NSIS creates the Start Menu
412
+ // and Desktop shortcuts itself at install time.
413
+
414
+ // ── Single-instance lock ─────────────────────────────────────────────────
415
+ //
416
+ // GAIA Agent UI is a desktop app that the user may inadvertently launch
417
+ // twice (double-click in Finder, second click on the dock icon, second
418
+ // click in the Start Menu, autostart firing while the user already has
419
+ // the app open, etc.). Without a lock, two Electron instances would race:
420
+ //
421
+ // • Both call backend-installer.cjs concurrently — interleaved log
422
+ // writes, state file (~/.gaia/electron-install-state.json) flapping
423
+ // between INSTALLING records, possibly half-installed venvs.
424
+ // • Both spawn the Python backend on port 4200 — second crashes.
425
+ // • Both register IPC handlers via ipcMain.handle(...) — Electron
426
+ // throws "Attempted to register a second handler" and the second
427
+ // instance dies.
428
+ // • Two tray icons, two auto-updater singletons.
429
+ //
430
+ // requestSingleInstanceLock() is the standard Electron pattern: the first
431
+ // process to call it gets `true`, every subsequent launch on the same
432
+ // machine gets `false` and should immediately quit. The first instance
433
+ // receives a `second-instance` event and surfaces its window.
434
+ const gotTheSingleInstanceLock = app.requestSingleInstanceLock();
435
+ if (!gotTheSingleInstanceLock) {
436
+ console.log("[main] Another GAIA Agent UI instance is already running — quitting");
437
+ app.quit();
438
+ // Use process.exit so we bail BEFORE app.whenReady() fires below.
439
+ // app.quit() alone is async and the rest of this file would still
440
+ // execute, racing with the first instance.
441
+ process.exit(0);
349
442
  }
350
443
 
444
+ app.on("second-instance", (_event, _argv, _cwd) => {
445
+ // A second launch happened while we were running. Surface our window
446
+ // (the user almost certainly wanted to see it). mainWindow may be null
447
+ // if we're still in the bootstrap phase — in that case the first
448
+ // instance is already showing the install progress dialog and there's
449
+ // nothing else to do.
450
+ if (typeof mainWindow !== "undefined" && mainWindow && !mainWindow.isDestroyed()) {
451
+ if (mainWindow.isMinimized()) mainWindow.restore();
452
+ if (!mainWindow.isVisible()) mainWindow.show();
453
+ mainWindow.focus();
454
+ }
455
+ });
456
+
351
457
  app.whenReady().then(async () => {
458
+ // Phase 0: seed bundled agents BEFORE the Python backend starts, so the
459
+ // agent registry sees them on its first discovery pass. Failures here are
460
+ // non-fatal — the app must still launch even if seeding is blocked (e.g.
461
+ // permission error on ~/.gaia/agents).
462
+ try {
463
+ const seedResult = await agentSeeder.seedBundledAgents();
464
+ if (seedResult.seeded.length > 0) {
465
+ console.log("[main] Seeded agents:", seedResult.seeded);
466
+ }
467
+ if (seedResult.errors.length > 0) {
468
+ console.warn(
469
+ "[main] Agent seeding errors:",
470
+ seedResult.errors.map((e) => e.id)
471
+ );
472
+ }
473
+ } catch (err) {
474
+ console.warn("[main] Agent seeding failed (non-fatal):", err);
475
+ }
476
+
477
+ // Phase A: ensure the Python backend is installed BEFORE creating the
478
+ // main window. The progress dialog owns the UI during this phase.
479
+ const bootstrapOk = await bootstrapBackend();
480
+ if (!bootstrapOk) {
481
+ console.log("[main] Backend bootstrap aborted — quitting");
482
+ app.quit();
483
+ return;
484
+ }
485
+
352
486
  // Start the Python backend
353
487
  backendProcess = startBackend();
354
488
 
@@ -358,25 +492,36 @@ app.whenReady().then(async () => {
358
492
  // Initialize services (tray, agent manager, notifications)
359
493
  initializeServices();
360
494
 
495
+ // Phase F: start the auto-updater (non-blocking). First check runs on
496
+ // a 10s delay inside the module so it never competes with app launch.
497
+ // Any failure here is logged and swallowed — the app continues to run
498
+ // even if auto-update is unavailable.
499
+ try {
500
+ autoUpdater.init(mainWindow);
501
+ } catch (err) {
502
+ console.error(
503
+ "[main] Failed to init auto-updater:",
504
+ err && err.message ? err.message : err
505
+ );
506
+ }
507
+
361
508
  // Setup Windows Jump List (T11)
362
509
  setupJumpList();
363
510
 
364
511
  // Show loading state
365
512
  await loadApp();
366
513
 
367
- // Wait for backend to be ready, then reload
514
+ // Wait for backend API to be reachable. The bundled frontend
515
+ // (loaded from dist/index.html in the asar) auto-detects when the
516
+ // API becomes available and dismisses its "Cannot connect" banner.
517
+ // We do NOT reload the window with http://localhost:4200/ because
518
+ // the pip-installed backend has no frontend files — only the API.
368
519
  if (backendProcess) {
369
520
  console.log("Waiting for backend to start...");
370
521
  const ready = await waitForBackend(STARTUP_TIMEOUT);
371
-
372
- if (ready && mainWindow && !mainWindow.isDestroyed()) {
373
- console.log("Backend is ready! Loading app...");
374
- try {
375
- await mainWindow.loadURL(`http://localhost:${BACKEND_PORT}`);
376
- } catch (error) {
377
- console.error("Failed to load from backend:", error.message);
378
- }
379
- } else if (!ready) {
522
+ if (ready) {
523
+ console.log("Backend API is ready on port", BACKEND_PORT);
524
+ } else {
380
525
  console.warn("Backend did not respond within timeout.");
381
526
  }
382
527
  }
@@ -450,6 +595,16 @@ app.on("will-quit", (event) => {
450
595
  });
451
596
 
452
597
  async function cleanup() {
598
+ // Phase F: tear down auto-updater timers and IPC handlers.
599
+ try {
600
+ autoUpdater.destroy();
601
+ } catch (err) {
602
+ console.error(
603
+ "[main] Error tearing down auto-updater:",
604
+ err && err.message ? err.message : err
605
+ );
606
+ }
607
+
453
608
  // Clean up notification timers
454
609
  if (notificationService) {
455
610
  notificationService.destroy();