@amd-gaia/agent-ui 0.17.0 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/gaia-ui.cjs +370 -0
- package/dist/assets/index-CmLC9Yd5.js +437 -0
- package/dist/assets/index-DdsmIsYZ.css +1 -0
- package/dist/index.html +3 -3
- package/main.cjs +189 -54
- package/package.json +8 -11
- package/preload.cjs +42 -0
- package/services/auto-updater.cjs +437 -0
- package/services/backend-installer-progress-dialog.cjs +429 -0
- package/services/backend-installer.cjs +1082 -0
- package/services/tray-manager.cjs +1 -1
- package/bin/gaia-ui.mjs +0 -572
- package/dist/assets/index-C7oO2M6Q.js +0 -432
- package/dist/assets/index-TyWv9Ej0.css +0 -1
|
@@ -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-cursor{display:inline-block;width:8px;height:17px;background:var(--amd-red);animation:cursorBlink 1s step-end infinite;align-self:center;flex-shrink:0;border-radius:0;image-rendering:pixelated;box-shadow:0 0 8px #ed1c2480,0 0 2px #ed1c24cc;margin-right:4px}.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}.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
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<title>GAIA</title>
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-CmLC9Yd5.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DdsmIsYZ.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/main.cjs
CHANGED
|
@@ -16,16 +16,20 @@
|
|
|
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");
|
|
25
29
|
|
|
26
30
|
// ── Configuration ──────────────────────────────────────────────────────────
|
|
27
31
|
|
|
28
|
-
const APP_NAME = "GAIA
|
|
32
|
+
const APP_NAME = "GAIA";
|
|
29
33
|
const BACKEND_PORT = 4200;
|
|
30
34
|
const HEALTH_CHECK_URL = `http://localhost:${BACKEND_PORT}/api/health`;
|
|
31
35
|
const STARTUP_TIMEOUT = 30000;
|
|
@@ -73,35 +77,21 @@ let isQuitting = false;
|
|
|
73
77
|
|
|
74
78
|
// ── Backend Process ────────────────────────────────────────────────────────
|
|
75
79
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Start the GAIA Python backend. Expects the backend installer to have
|
|
82
|
+
* already ensured the venv is populated — callers should await
|
|
83
|
+
* `bootstrapBackend()` first.
|
|
84
|
+
*
|
|
85
|
+
* Returns the ChildProcess, or null if the gaia binary cannot be found
|
|
86
|
+
* (shouldn't happen post-ensureBackend, but we guard just in case).
|
|
87
|
+
*/
|
|
97
88
|
function startBackend() {
|
|
98
|
-
const gaiaCmd =
|
|
89
|
+
const gaiaCmd = backendInstaller.findGaiaBin();
|
|
99
90
|
|
|
100
91
|
if (!gaiaCmd) {
|
|
101
|
-
console.
|
|
102
|
-
"
|
|
92
|
+
console.error(
|
|
93
|
+
"[main] GAIA backend not found even after install — cannot start backend"
|
|
103
94
|
);
|
|
104
|
-
console.warn("Install with: pip install amd-gaia");
|
|
105
95
|
return null;
|
|
106
96
|
}
|
|
107
97
|
|
|
@@ -111,6 +101,7 @@ function startBackend() {
|
|
|
111
101
|
gaiaCmd,
|
|
112
102
|
["chat", "--ui", "--ui-port", String(BACKEND_PORT)],
|
|
113
103
|
{
|
|
104
|
+
cwd: os.homedir(), // Electron's cwd is "/" on macOS when launched from Finder
|
|
114
105
|
stdio: ["ignore", "pipe", "pipe"],
|
|
115
106
|
env: { ...process.env },
|
|
116
107
|
detached: false,
|
|
@@ -246,17 +237,9 @@ async function loadApp() {
|
|
|
246
237
|
const distPath = findDistPath();
|
|
247
238
|
|
|
248
239
|
if (distPath) {
|
|
249
|
-
//
|
|
250
|
-
//
|
|
251
|
-
|
|
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
|
|
240
|
+
// Always load the bundled frontend from the asar. The backend only
|
|
241
|
+
// serves the API (no frontend files in the pip package), so loading
|
|
242
|
+
// http://localhost:4200/ would show raw JSON instead of the UI.
|
|
260
243
|
const indexPath = path.join(distPath, "index.html");
|
|
261
244
|
console.log("Loading app from:", indexPath);
|
|
262
245
|
await mainWindow.loadFile(indexPath);
|
|
@@ -337,18 +320,149 @@ function setupJumpList() {
|
|
|
337
320
|
}
|
|
338
321
|
}
|
|
339
322
|
|
|
340
|
-
// ──
|
|
323
|
+
// ── Backend Bootstrap (Phase A) ───────────────────────────────────────────
|
|
341
324
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
325
|
+
/**
|
|
326
|
+
* Ensure the Python backend is installed before the main window loads.
|
|
327
|
+
*
|
|
328
|
+
* Shows a borderless progress window while the install runs. On failure,
|
|
329
|
+
* surfaces a retry / manual / quit dialog. Loops until the user either
|
|
330
|
+
* succeeds, chooses manual install, or quits.
|
|
331
|
+
*
|
|
332
|
+
* Returns true if the backend is ready, false if the user chose to quit.
|
|
333
|
+
*/
|
|
334
|
+
async function bootstrapBackend() {
|
|
335
|
+
// Fast-path: if an install is obviously not needed (binary present and
|
|
336
|
+
// version matches), skip the progress window entirely and go straight to
|
|
337
|
+
// ensureBackend which will confirm readiness.
|
|
338
|
+
const existingBin = backendInstaller.findGaiaBin();
|
|
339
|
+
if (existingBin) {
|
|
340
|
+
const installedVersion = backendInstaller.getInstalledVersion(existingBin);
|
|
341
|
+
let expectedVersion = null;
|
|
342
|
+
try {
|
|
343
|
+
const pkg = JSON.parse(
|
|
344
|
+
fs.readFileSync(path.join(__dirname, "package.json"), "utf8")
|
|
345
|
+
);
|
|
346
|
+
expectedVersion = pkg.version;
|
|
347
|
+
} catch {
|
|
348
|
+
// ignore
|
|
349
|
+
}
|
|
350
|
+
if (installedVersion && installedVersion === expectedVersion) {
|
|
351
|
+
console.log(
|
|
352
|
+
`[main] GAIA backend already at ${installedVersion} — skipping bootstrap UI`
|
|
353
|
+
);
|
|
354
|
+
// Clean up any stale state file so the state machine reflects reality.
|
|
355
|
+
backendInstaller.setState(backendInstaller.STATES.READY, {
|
|
356
|
+
version: expectedVersion,
|
|
357
|
+
installedVersion,
|
|
358
|
+
});
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
346
361
|
}
|
|
347
|
-
|
|
348
|
-
//
|
|
362
|
+
|
|
363
|
+
// Slow path: need to install or upgrade. Show the progress window.
|
|
364
|
+
let keepTrying = true;
|
|
365
|
+
while (keepTrying) {
|
|
366
|
+
const progress = installerProgressDialog.createProgressWindow();
|
|
367
|
+
|
|
368
|
+
try {
|
|
369
|
+
await backendInstaller.ensureBackend({
|
|
370
|
+
onProgress: progress.onProgress,
|
|
371
|
+
});
|
|
372
|
+
progress.close();
|
|
373
|
+
console.log("[main] Backend bootstrap complete");
|
|
374
|
+
return true;
|
|
375
|
+
} catch (err) {
|
|
376
|
+
progress.close();
|
|
377
|
+
console.error(
|
|
378
|
+
`[main] Backend bootstrap failed: ${err && err.message ? err.message : err}`
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
const errorInfo = {
|
|
382
|
+
message: (err && err.message) || "GAIA install failed.",
|
|
383
|
+
stage: (err && err.stage) || null,
|
|
384
|
+
suggestion: (err && err.suggestion) || null,
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
const choice = await installerProgressDialog.showFailureDialog(
|
|
388
|
+
null,
|
|
389
|
+
errorInfo
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
if (choice === "retry") {
|
|
393
|
+
continue; // loop
|
|
394
|
+
}
|
|
395
|
+
if (choice === "manual") {
|
|
396
|
+
// The user was directed to the docs in an external browser. Quit so
|
|
397
|
+
// they can complete the manual install and restart.
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
return false; // quit
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// ── App Lifecycle ──────────────────────────────────────────────────────────
|
|
407
|
+
|
|
408
|
+
// Note: electron-squirrel-startup was removed in Phase C of the
|
|
409
|
+
// desktop-installer plan. electron-builder's NSIS target does not need
|
|
410
|
+
// Squirrel's first-run shortcut bookkeeping — NSIS creates the Start Menu
|
|
411
|
+
// and Desktop shortcuts itself at install time.
|
|
412
|
+
|
|
413
|
+
// ── Single-instance lock ─────────────────────────────────────────────────
|
|
414
|
+
//
|
|
415
|
+
// GAIA Agent UI is a desktop app that the user may inadvertently launch
|
|
416
|
+
// twice (double-click in Finder, second click on the dock icon, second
|
|
417
|
+
// click in the Start Menu, autostart firing while the user already has
|
|
418
|
+
// the app open, etc.). Without a lock, two Electron instances would race:
|
|
419
|
+
//
|
|
420
|
+
// • Both call backend-installer.cjs concurrently — interleaved log
|
|
421
|
+
// writes, state file (~/.gaia/electron-install-state.json) flapping
|
|
422
|
+
// between INSTALLING records, possibly half-installed venvs.
|
|
423
|
+
// • Both spawn the Python backend on port 4200 — second crashes.
|
|
424
|
+
// • Both register IPC handlers via ipcMain.handle(...) — Electron
|
|
425
|
+
// throws "Attempted to register a second handler" and the second
|
|
426
|
+
// instance dies.
|
|
427
|
+
// • Two tray icons, two auto-updater singletons.
|
|
428
|
+
//
|
|
429
|
+
// requestSingleInstanceLock() is the standard Electron pattern: the first
|
|
430
|
+
// process to call it gets `true`, every subsequent launch on the same
|
|
431
|
+
// machine gets `false` and should immediately quit. The first instance
|
|
432
|
+
// receives a `second-instance` event and surfaces its window.
|
|
433
|
+
const gotTheSingleInstanceLock = app.requestSingleInstanceLock();
|
|
434
|
+
if (!gotTheSingleInstanceLock) {
|
|
435
|
+
console.log("[main] Another GAIA Agent UI instance is already running — quitting");
|
|
436
|
+
app.quit();
|
|
437
|
+
// Use process.exit so we bail BEFORE app.whenReady() fires below.
|
|
438
|
+
// app.quit() alone is async and the rest of this file would still
|
|
439
|
+
// execute, racing with the first instance.
|
|
440
|
+
process.exit(0);
|
|
349
441
|
}
|
|
350
442
|
|
|
443
|
+
app.on("second-instance", (_event, _argv, _cwd) => {
|
|
444
|
+
// A second launch happened while we were running. Surface our window
|
|
445
|
+
// (the user almost certainly wanted to see it). mainWindow may be null
|
|
446
|
+
// if we're still in the bootstrap phase — in that case the first
|
|
447
|
+
// instance is already showing the install progress dialog and there's
|
|
448
|
+
// nothing else to do.
|
|
449
|
+
if (typeof mainWindow !== "undefined" && mainWindow && !mainWindow.isDestroyed()) {
|
|
450
|
+
if (mainWindow.isMinimized()) mainWindow.restore();
|
|
451
|
+
if (!mainWindow.isVisible()) mainWindow.show();
|
|
452
|
+
mainWindow.focus();
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
|
|
351
456
|
app.whenReady().then(async () => {
|
|
457
|
+
// Phase A: ensure the Python backend is installed BEFORE creating the
|
|
458
|
+
// main window. The progress dialog owns the UI during this phase.
|
|
459
|
+
const bootstrapOk = await bootstrapBackend();
|
|
460
|
+
if (!bootstrapOk) {
|
|
461
|
+
console.log("[main] Backend bootstrap aborted — quitting");
|
|
462
|
+
app.quit();
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
|
|
352
466
|
// Start the Python backend
|
|
353
467
|
backendProcess = startBackend();
|
|
354
468
|
|
|
@@ -358,25 +472,36 @@ app.whenReady().then(async () => {
|
|
|
358
472
|
// Initialize services (tray, agent manager, notifications)
|
|
359
473
|
initializeServices();
|
|
360
474
|
|
|
475
|
+
// Phase F: start the auto-updater (non-blocking). First check runs on
|
|
476
|
+
// a 10s delay inside the module so it never competes with app launch.
|
|
477
|
+
// Any failure here is logged and swallowed — the app continues to run
|
|
478
|
+
// even if auto-update is unavailable.
|
|
479
|
+
try {
|
|
480
|
+
autoUpdater.init(mainWindow);
|
|
481
|
+
} catch (err) {
|
|
482
|
+
console.error(
|
|
483
|
+
"[main] Failed to init auto-updater:",
|
|
484
|
+
err && err.message ? err.message : err
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
|
|
361
488
|
// Setup Windows Jump List (T11)
|
|
362
489
|
setupJumpList();
|
|
363
490
|
|
|
364
491
|
// Show loading state
|
|
365
492
|
await loadApp();
|
|
366
493
|
|
|
367
|
-
// Wait for backend to be
|
|
494
|
+
// Wait for backend API to be reachable. The bundled frontend
|
|
495
|
+
// (loaded from dist/index.html in the asar) auto-detects when the
|
|
496
|
+
// API becomes available and dismisses its "Cannot connect" banner.
|
|
497
|
+
// We do NOT reload the window with http://localhost:4200/ because
|
|
498
|
+
// the pip-installed backend has no frontend files — only the API.
|
|
368
499
|
if (backendProcess) {
|
|
369
500
|
console.log("Waiting for backend to start...");
|
|
370
501
|
const ready = await waitForBackend(STARTUP_TIMEOUT);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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) {
|
|
502
|
+
if (ready) {
|
|
503
|
+
console.log("Backend API is ready on port", BACKEND_PORT);
|
|
504
|
+
} else {
|
|
380
505
|
console.warn("Backend did not respond within timeout.");
|
|
381
506
|
}
|
|
382
507
|
}
|
|
@@ -450,6 +575,16 @@ app.on("will-quit", (event) => {
|
|
|
450
575
|
});
|
|
451
576
|
|
|
452
577
|
async function cleanup() {
|
|
578
|
+
// Phase F: tear down auto-updater timers and IPC handlers.
|
|
579
|
+
try {
|
|
580
|
+
autoUpdater.destroy();
|
|
581
|
+
} catch (err) {
|
|
582
|
+
console.error(
|
|
583
|
+
"[main] Error tearing down auto-updater:",
|
|
584
|
+
err && err.message ? err.message : err
|
|
585
|
+
);
|
|
586
|
+
}
|
|
587
|
+
|
|
453
588
|
// Clean up notification timers
|
|
454
589
|
if (notificationService) {
|
|
455
590
|
notificationService.destroy();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amd-gaia/agent-ui",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"productName": "GAIA Agent UI",
|
|
6
6
|
"description": "Privacy-first agentic AI interface with document Q&A - runs 100% locally on AMD Ryzen AI",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"main": "main.cjs",
|
|
31
31
|
"bin": {
|
|
32
|
-
"gaia-ui": "bin/gaia-ui.
|
|
32
|
+
"gaia-ui": "bin/gaia-ui.cjs"
|
|
33
33
|
},
|
|
34
34
|
"files": [
|
|
35
35
|
"bin/",
|
|
@@ -50,24 +50,21 @@
|
|
|
50
50
|
"build": "tsc && vite build",
|
|
51
51
|
"preview": "vite preview",
|
|
52
52
|
"start": "electron .",
|
|
53
|
-
"package": "npm run build && electron-
|
|
54
|
-
"
|
|
53
|
+
"package": "npm run build && electron-builder --config electron-builder.yml",
|
|
54
|
+
"package:win": "npm run build && electron-builder --win --config electron-builder.yml",
|
|
55
|
+
"package:mac": "npm run build && electron-builder --mac --config electron-builder.yml",
|
|
56
|
+
"package:linux": "npm run build && electron-builder --linux --config electron-builder.yml",
|
|
55
57
|
"prepublishOnly": "npm run build"
|
|
56
58
|
},
|
|
57
|
-
"config": {
|
|
58
|
-
"forge": "./forge.config.cjs"
|
|
59
|
-
},
|
|
60
59
|
"dependencies": {
|
|
61
|
-
"electron-
|
|
60
|
+
"electron-updater": "^6.8.3"
|
|
62
61
|
},
|
|
63
62
|
"devDependencies": {
|
|
64
|
-
"@electron-forge/cli": "^7.2.0",
|
|
65
|
-
"@electron-forge/maker-deb": "^7.2.0",
|
|
66
|
-
"@electron-forge/maker-squirrel": "^7.2.0",
|
|
67
63
|
"@types/react": "^18.2.48",
|
|
68
64
|
"@types/react-dom": "^18.2.18",
|
|
69
65
|
"@vitejs/plugin-react": "^4.2.1",
|
|
70
66
|
"electron": "^40.6.1",
|
|
67
|
+
"electron-builder": "^26.8.1",
|
|
71
68
|
"lucide-react": "^0.312.0",
|
|
72
69
|
"qrcode": "^1.5.4",
|
|
73
70
|
"react": "^18.2.0",
|