@amd-gaia/agent-ui 0.17.2 → 0.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/index-B4Qzv7Ys.js +443 -0
- package/dist/assets/index-eQemgF08.css +1 -0
- package/dist/index.html +2 -2
- package/main.cjs +20 -0
- package/package.json +1 -1
- package/services/agent-seeder.cjs +301 -0
- package/dist/assets/index-CmLC9Yd5.js +0 -437
- package/dist/assets/index-DdsmIsYZ.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-btns{display:flex;gap:2px;flex-shrink:0;align-items:center}.input-btns .icon-btn,.input-btns button:not(.send-btn):not(.stop-btn){opacity:.5;transition:opacity var(--duration) var(--ease),color var(--duration) var(--ease)}.input-btns .icon-btn:hover,.input-btns button:not(.send-btn):not(.stop-btn):hover{opacity:1;color:var(--text-primary)}.send-btn{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-md);background:var(--amd-red);color:#fff;transition:all var(--duration) var(--ease)}.send-btn:hover{background:var(--amd-red-dark);box-shadow:0 0 16px #ed1c2459;transform:translateY(-1px)}.send-btn:active{transform:scale(.96)}.send-btn:disabled{background:var(--bg-tertiary);color:var(--text-muted);transform:none;cursor:not-allowed;opacity:.4;box-shadow:none}.stop-btn{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-md);border:1.5px solid rgba(237,28,36,.5);color:var(--amd-red);background:var(--amd-red-dim2);transition:all var(--duration) var(--ease);animation:pulse 2s ease-in-out infinite}.stop-btn:hover{border-color:var(--amd-red);color:var(--amd-red-light);background:var(--amd-red-dim);box-shadow:0 0 12px #ed1c2433;animation:none}.scroll-bottom-btn{position:absolute;bottom:100px;left:50%;transform:translate(-50%);width:34px;height:34px;border-radius:var(--radius-md);background:var(--bg-card);border:1px solid var(--border);color:var(--text-secondary);display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-md);transition:opacity var(--duration) var(--ease),transform var(--duration) var(--ease),background var(--duration) var(--ease),color var(--duration) var(--ease),border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease);z-index:5;animation:scrollBtnSlideIn .2s var(--ease)}@keyframes scrollBtnSlideIn{0%{opacity:0;transform:translate(-50%) translateY(12px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.scroll-bottom-btn:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--amd-red);transform:translate(-50%) translateY(-3px);box-shadow:0 4px 16px #ed1c2426}.input-footer{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:8px;font-size:10px;font-family:var(--font-mono);color:var(--text-muted)}.input-footer-item{display:flex;align-items:center;gap:4px}.input-footer-sep{width:1px;height:10px;background:var(--border)}.kbd-hint{font-family:var(--font-mono);font-size:10px;padding:1px 5px;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-muted)}.create-agent-btn{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-full);cursor:pointer;transition:all .15s var(--ease);flex-shrink:0}.create-agent-btn:hover{border-color:var(--text-muted);color:var(--text-primary)}.agent-picker{position:relative}.agent-picker-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:10px;font-family:var(--font-mono);font-weight:500;color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-full);cursor:pointer;transition:all .15s var(--ease);white-space:nowrap;line-height:1;height:20px}.agent-picker-btn:hover{border-color:var(--text-muted);color:var(--text-primary)}.agent-picker-dropdown{position:absolute;bottom:calc(100% + 6px);left:0;min-width:160px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000040;padding:4px;z-index:100;display:flex;flex-direction:column;gap:2px}.agent-picker-option{display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:12px;font-family:var(--font-sans);color:var(--text-secondary);background:transparent;border:none;border-radius:6px;cursor:pointer;transition:background .12s var(--ease),color .12s var(--ease);text-align:left;white-space:nowrap}.agent-picker-option:hover{background:var(--bg-tertiary);color:var(--text-primary)}.agent-picker-option.active{color:#ed1c24;font-weight:600}.input-content{flex:1;display:flex;flex-direction:column;min-width:0;position:relative}.input-cursor{position:absolute;width:10px;height:18px;background:var(--amd-red);animation:cursorBlink 1s step-end infinite;pointer-events:none;box-shadow:0 0 8px #ed1c2480,0 0 2px #ed1c24cc}.input-box.has-attachments{flex-direction:column;align-items:stretch}.input-box.has-attachments .input-content{width:100%}.input-box.has-attachments .input-btns{align-self:flex-end}.attachment-strip{display:flex;gap:6px;padding:6px 0 4px;overflow-x:auto;flex-shrink:0}.attachment-strip::-webkit-scrollbar{height:3px}.attachment-strip::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.attachment-preview{display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-tertiary);font-size:11px;font-family:var(--font-sans);color:var(--text-secondary);flex-shrink:0;max-width:200px;position:relative;transition:border-color var(--duration) var(--ease),background var(--duration) var(--ease)}.attachment-preview:hover{border-color:var(--amd-red);background:var(--tint-subtle)}.attachment-preview.attachment-error{border-color:var(--amd-red);background:var(--amd-red-dim2)}.attachment-thumb{width:32px;height:32px;object-fit:cover;border-radius:var(--radius-sm);flex-shrink:0}.attachment-file-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:var(--bg-secondary);border-radius:var(--radius-sm);color:var(--text-muted);flex-shrink:0}.attachment-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.attachment-spinner{width:12px;height:12px;border:1.5px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite;flex-shrink:0}.attachment-error-text{color:var(--amd-red);font-size:10px;white-space:nowrap}.attachment-remove{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--bg-secondary);color:var(--text-muted);flex-shrink:0;opacity:0;transition:all var(--duration) var(--ease);cursor:pointer;border:none;padding:0}.attachment-preview:hover .attachment-remove,.attachment-preview:focus-within .attachment-remove{opacity:1}.attachment-remove:hover{background:var(--amd-red);color:#fff}@media (max-width: 768px){.chat-header{padding:10px 16px}.model-badge,.session-hash-badge{display:none}.input-area{padding:10px 12px max(10px,env(safe-area-inset-bottom))}.empty-chat{padding:40px 16px}.title-edit{width:180px}.send-btn,.stop-btn{width:44px;height:44px}.skeleton-msg{padding:12px 16px}.skeleton-lines{padding-left:0}.input-footer{gap:8px;flex-wrap:wrap}}.welcome{flex:1;display:flex;align-items:center;justify-content:center;padding:40px 40px 24px;overflow-y:auto;position:relative}[data-theme=dark] .welcome:before{content:"";position:absolute;top:-80px;right:-120px;width:600px;height:600px;background:radial-gradient(circle,rgba(237,28,36,.1) 0%,transparent 70%);pointer-events:none}[data-theme=dark] .welcome:after{content:"";position:absolute;bottom:-80px;left:-80px;width:450px;height:450px;background:radial-gradient(circle,rgba(78,201,50,.05) 0%,transparent 70%);pointer-events:none}.welcome-inner{max-width:680px;text-align:center;position:relative;z-index:1}@keyframes titleGlow{0%,to{filter:drop-shadow(0 0 20px rgba(237,28,36,.35)) drop-shadow(0 0 80px rgba(237,28,36,.12))}50%{filter:drop-shadow(0 0 28px rgba(237,28,36,.45)) drop-shadow(0 0 100px rgba(237,28,36,.18))}}@keyframes terminalBlink{0%,to{opacity:1}50%{opacity:0}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeInScale{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes chipFadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.welcome-title{font-size:clamp(32px,5vw,48px);font-weight:700;font-family:JetBrains Mono,Space Mono,monospace;letter-spacing:-1px;background:linear-gradient(135deg,var(--amd-red),#ff6b35);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:10px;line-height:1.1;display:inline-flex;align-items:center;filter:none}.welcome-title.typing-done{filter:drop-shadow(0 0 18px rgba(237,28,36,.25)) drop-shadow(0 0 60px rgba(237,28,36,.1))}[data-theme=dark] .welcome-title.typing-done{filter:drop-shadow(0 0 20px rgba(237,28,36,.35)) drop-shadow(0 0 80px rgba(237,28,36,.12));animation:titleGlow 4s ease-in-out infinite}.welcome-title>span{background:linear-gradient(135deg,var(--amd-red),#ff6b35);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;white-space:pre}.gaia-glow{filter:drop-shadow(0 0 6px rgba(237,28,36,.3));transition:filter .5s ease}.welcome-title.typing-done .gaia-glow{animation:gaiaGlow 3s ease-in-out infinite}@keyframes gaiaGlow{0%,to{filter:drop-shadow(0 0 8px rgba(237,28,36,.35))}50%{filter:drop-shadow(0 0 16px rgba(237,28,36,.55)) drop-shadow(0 0 40px rgba(237,28,36,.15))}}.terminal-cursor{display:inline-block;width:8px;height:1.15em;background:var(--amd-red);margin-left:2px;vertical-align:text-bottom;border-radius:0;image-rendering:pixelated;box-shadow:0 0 8px #ed1c2480,0 0 2px #ed1c24cc}.terminal-cursor.blink{animation:terminalBlink 1s step-end infinite}.terminal-cursor-sub{width:6px;height:1em}.terminal-cursor-sm{width:6px;height:.9em}.welcome-version{display:inline-flex;align-items:center;gap:8px;font-size:12px;font-weight:500;font-family:var(--font-mono);color:var(--text-muted);background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-full);padding:4px 14px;margin-bottom:12px;letter-spacing:.5px;opacity:0}.content-revealed .welcome-version{animation:fadeInUp .5s var(--ease) forwards}.welcome-sub{font-size:16px;color:var(--text-secondary);margin-bottom:40px;line-height:1.85;font-family:var(--font-sans);font-weight:300;max-width:520px;margin-left:auto;margin-right:auto;min-height:1.85em}.typewriter-text{display:inline}.features{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:36px}.feature-card{padding:22px 16px 32px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-card);text-align:center;position:relative;overflow:hidden;transition:border-color .3s var(--ease),transform .25s var(--ease);height:155px;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;opacity:0;transform:translateY(16px)}.content-revealed .feature-card{animation:fadeInUp .5s var(--ease) forwards}.content-revealed .feature-card:nth-child(1){animation-delay:0ms}.content-revealed .feature-card:nth-child(2){animation-delay:.12s}.content-revealed .feature-card:nth-child(3){animation-delay:.24s}.content-revealed .feature-card:nth-child(4){animation-delay:.36s}.feature-card:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,var(--amd-red),#ff6b35);opacity:0;transition:opacity .3s var(--ease)}.feature-card:hover{border-color:var(--amd-red);transform:translateY(-2px)}.feature-card:hover:before{opacity:1}[data-theme=dark] .feature-card{background:linear-gradient(168deg,rgba(20,8,8,.4) 0%,var(--bg-card) 40%)}.feature-icon,.feature-card h3,.feature-card>p{transition:opacity .15s var(--ease)}.feature-card.feature-hovered .feature-icon,.feature-card.feature-hovered h3,.feature-card.feature-hovered>p{opacity:0;pointer-events:none}.feature-icon{color:var(--amd-red);margin-bottom:10px;display:flex;justify-content:center}.feature-card h3{font-size:14px;font-weight:700;font-family:var(--font-sans);margin-bottom:4px;letter-spacing:-.2px}.feature-card p{font-size:12.5px;color:var(--text-secondary);line-height:1.5;font-family:var(--font-sans)}.feature-terminal{position:absolute;bottom:12px;left:14px;right:14px;font-size:10.5px;font-family:var(--font-mono);line-height:1.5;text-align:left;min-height:1.5em;border-top:1px solid var(--border-light);padding-top:6px;transition:all .2s var(--ease)}.feature-card.feature-hovered .feature-terminal{top:14px;bottom:14px;left:14px;right:14px;border-top:none;padding-top:0;display:flex;align-items:center}.feature-inline{display:inline;word-break:break-word}.feature-code-hint{color:var(--text-muted);opacity:.4;letter-spacing:.3px}.feature-code-erasing{opacity:.7;color:var(--amd-red)}.feature-expanded-text{color:var(--text-secondary);font-size:11px;line-height:1.6}.agent-pills{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-bottom:24px;opacity:0}.content-revealed .agent-pills{animation:fadeInUp .5s var(--ease) .42s forwards}.agent-pill{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 14px;font-size:12px;font-family:var(--font-sans);font-weight:500;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-full);cursor:pointer;transition:all .2s var(--ease);white-space:nowrap}.agent-pill:hover{border-color:var(--text-muted);color:var(--text-primary)}.agent-pill.active{background:#ed1c24;border-color:#ed1c24;color:#fff}.agent-pill.active:hover{background:#d41920;border-color:#d41920;color:#fff}.welcome-setup-hint{display:flex;align-items:flex-start;gap:8px;margin-bottom:20px;padding:10px 14px;border:1px solid #fed7aa;border-radius:var(--radius-md);background:#fffbeb;color:#92400e;font-size:12px;text-align:left;line-height:1.5;font-family:var(--font-sans)}.welcome-setup-hint svg{flex-shrink:0;margin-top:1px}.welcome-setup-hint code{font-family:var(--font-mono);font-size:11px;padding:1px 5px;border-radius:2px;background:#00000012}[data-theme=dark] .welcome-setup-hint{background:#120e05;border-color:#2a1e08;color:#fcd34d}[data-theme=dark] .welcome-setup-hint code{background:#ffffff14}.welcome-actions{display:flex;align-items:center;justify-content:center;gap:16px;margin-bottom:28px;opacity:0}.content-revealed .welcome-actions{animation:fadeInScale .5s var(--ease) .5s forwards}.start-btn{padding:14px 40px;font-size:14px;border-radius:var(--radius-lg)}.build-agent-btn{display:inline-flex;align-items:center;gap:6px;padding:13px 28px;font-size:14px;font-family:var(--font-sans);font-weight:500;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;transition:all .15s var(--ease)}.build-agent-btn:hover:not(:disabled){border-color:var(--text-muted);color:var(--text-primary);background:var(--bg-tertiary)}.build-agent-btn:disabled{opacity:.4;cursor:not-allowed}.suggestions{display:flex;flex-direction:column;align-items:center;gap:12px}.suggestions-label{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:2px;opacity:0}.content-revealed .suggestions-label{animation:chipFadeIn .4s var(--ease) .6s forwards}.suggestion-chips{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}.chip{padding:8px 18px;border:1px solid var(--border);border-radius:var(--radius-lg);font-size:13px;font-family:var(--font-sans);color:var(--text-secondary);background:var(--bg-card);transition:all .25s var(--ease);opacity:0}.content-revealed .chip{animation:chipFadeIn .4s var(--ease) forwards}.content-revealed .chip:nth-child(1){animation-delay:.7s}.content-revealed .chip:nth-child(2){animation-delay:.82s}.content-revealed .chip:nth-child(3){animation-delay:.94s}.content-revealed .chip:nth-child(4){animation-delay:1.06s}.chip:hover{border-color:var(--amd-red);color:var(--amd-red);background:var(--amd-red-dim2);transform:translateY(-1px)}.welcome-copyright{margin-top:32px;font-size:10px;font-family:var(--font-mono);color:var(--text-muted);opacity:.35;letter-spacing:.3px}@media (max-width: 768px){.welcome{padding:60px 16px 24px;align-items:flex-start}.welcome-title{font-size:28px}.welcome-sub{font-size:14px;margin-bottom:28px}.features{grid-template-columns:repeat(2,1fr);gap:10px}.feature-card{padding:16px 12px 14px;height:145px}.welcome-actions{flex-direction:column;gap:12px}}@media (max-width: 480px){.welcome-title{font-size:24px}.features{grid-template-columns:1fr 1fr;gap:8px}.suggestion-chips{flex-direction:column}.chip{width:100%;text-align:center}}.doc-modal{width:640px}.drop-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:36px;border:2px dashed var(--border);border-radius:var(--radius-lg);text-align:center;cursor:pointer;color:var(--text-secondary);transition:all .25s var(--ease);margin-bottom:18px}.drop-zone:hover,.drop-zone.drag-over{border-color:var(--amd-red);background:var(--amd-red-dim2);color:var(--amd-red);transform:translateY(-1px)}.drop-zone.uploading{border-color:var(--amd-red);cursor:default}.drop-zone p{margin-top:10px;font-size:14px;font-weight:500;font-family:var(--font-sans)}.drop-hint{font-size:12px;color:var(--text-muted);margin-top:4px;font-family:var(--font-sans)}.upload-spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}.path-input-form{display:flex;align-items:center;gap:8px;margin-bottom:16px}.path-icon{color:var(--text-muted);flex-shrink:0}.path-input{flex:1;padding:9px 14px;border:1px solid var(--border);border-radius:var(--radius-md);outline:none;font-size:13px;font-family:var(--font-mono);transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease)}.path-input:focus{border-color:var(--amd-red)}.path-input::placeholder{color:var(--text-muted)}.doc-stats{display:flex;gap:8px;align-items:center;font-size:12px;color:var(--text-muted);margin-bottom:12px;padding:0 2px}.doc-list{display:flex;flex-direction:column;gap:4px}.doc-row{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease),background var(--duration) var(--ease)}.doc-row:hover{border-color:var(--amd-red-light);background:var(--tint-subtle)}.doc-info{flex:1;min-width:0}.doc-name{display:block;font-weight:500;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.doc-meta{font-size:12px;color:var(--text-muted)}.doc-timestamp{display:inline-flex;align-items:center;gap:3px;margin-left:6px;padding-left:6px;border-left:1px solid var(--border-light);color:var(--text-muted);font-size:11px;cursor:default}.doc-timestamp svg{opacity:.6;flex-shrink:0}.doc-status-badge{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:2px 8px;border-radius:var(--radius-sm);font-family:var(--font-mono)}.doc-status-failed{color:var(--accent-danger);background:var(--accent-danger-dim)}.doc-status-cancelled{color:var(--text-muted);background:#80808014}.doc-status-missing{color:var(--accent-gold);background:var(--accent-gold-dim)}.doc-row-actions{display:flex;align-items:center;gap:2px;flex-shrink:0;opacity:0;transition:opacity .15s}.doc-row:hover .doc-row-actions{opacity:1}.doc-open-folder{color:var(--text-muted)}.doc-open-folder:hover{color:var(--amd-blue, #0096d6)}.doc-delete{color:var(--text-muted)}.doc-delete:hover{color:var(--amd-red)}.empty-docs{display:flex;flex-direction:column;align-items:center;padding:32px;color:var(--text-muted);text-align:center}.empty-docs p{font-size:14px;margin-top:8px}.empty-docs span{font-size:12px;margin-top:4px}.file-browser-modal{width:min(95vw,1000px);max-height:85vh;display:flex;flex-direction:column}.file-browser-modal.has-preview{width:min(95vw,1200px)}.file-browser-body{display:flex;flex-direction:column;flex:1;overflow:hidden;padding:0 16px 16px;gap:10px}.fb-quick-links{display:flex;gap:6px;flex-wrap:wrap;padding:4px 0}.fb-quick-link{display:flex;align-items:center;gap:5px;padding:5px 10px;border-radius:var(--radius-sm);border:1px solid var(--border-light);background:var(--bg-secondary);color:var(--text-secondary);font-size:12px;cursor:pointer;transition:all var(--duration) var(--ease)}.fb-quick-link:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border)}.fb-search-bar{display:flex;gap:8px;align-items:center}.fb-search-input-wrap{flex:1;position:relative;display:flex;align-items:center}.fb-search-icon{position:absolute;left:10px;color:var(--text-muted);pointer-events:none}.fb-search-input{width:100%;padding:8px 30px 8px 32px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:13px;font-family:var(--font-sans);outline:none;transition:border-color var(--duration) var(--ease),box-shadow var(--duration) var(--ease)}.fb-search-input:focus{border-color:#ed1c2466;box-shadow:0 0 12px #ed1c2414}.fb-search-clear{position:absolute;right:8px;background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px;display:flex}.fb-type-filter{padding:8px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:12px;font-family:var(--font-sans);outline:none;min-width:110px}.fb-search-btn{padding:8px 14px;border-radius:var(--radius-md);border:1px solid var(--amd-red);background:var(--amd-red);color:#fff;font-size:12px;font-weight:600;font-family:var(--font-mono);cursor:pointer;white-space:nowrap;transition:all var(--duration) var(--ease)}.fb-search-btn:hover{background:var(--amd-red-dark);box-shadow:0 0 12px #ed1c2433}.fb-search-btn:disabled{opacity:.4;cursor:not-allowed;box-shadow:none}.fb-breadcrumb{display:flex;align-items:center;gap:2px;padding:4px 0;font-size:12px;color:var(--text-secondary);overflow-x:auto;flex-wrap:nowrap}.fb-crumb{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:2px 4px;border-radius:var(--radius-sm);font-size:12px;white-space:nowrap;transition:all var(--duration) var(--ease)}.fb-crumb:hover{background:var(--bg-hover);color:var(--text-primary)}.fb-crumb-item{display:flex;align-items:center}.fb-crumb-sep{color:var(--text-muted);flex-shrink:0}.fb-up-btn{margin-left:auto;background:none;border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;padding:3px 6px;border-radius:var(--radius-sm);display:flex;align-items:center;transition:all var(--duration) var(--ease)}.fb-up-btn:hover{background:var(--bg-hover);border-color:var(--amd-red);color:var(--amd-red)}.fb-search-header{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--text-secondary);padding:4px 0}.fb-back-btn{background:none;border:none;color:var(--amd-red);cursor:pointer;font-size:12px;transition:color var(--duration) var(--ease)}.fb-back-btn:hover{color:var(--amd-red-light)}.fb-content{display:flex;flex:1;overflow:hidden;gap:12px;min-height:300px}.fb-file-list{flex:1;overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-lg);min-width:250px;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.fb-file-list::-webkit-scrollbar{width:5px}.fb-file-list::-webkit-scrollbar-track{background:transparent}.fb-file-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.fb-file-list::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.fb-entry{display:flex;align-items:center;padding:8px 10px;gap:8px;cursor:pointer;border-bottom:1px solid var(--border-light);transition:background var(--duration-fast) var(--ease);font-size:13px;font-family:var(--font-sans)}.fb-entry:hover{background:var(--bg-hover)}.fb-entry.selected{background:var(--amd-red-dim2);border-color:#ed1c241f}.fb-entry.folder .fb-entry-icon{color:var(--accent-gold)}.fb-entry .fb-entry-icon{color:var(--text-muted);flex-shrink:0}.fb-entry-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary)}.fb-entry.folder .fb-entry-name{font-weight:500}.fb-entry-size,.fb-entry-date{font-size:11px;color:var(--text-muted);white-space:nowrap;flex-shrink:0;font-family:var(--font-mono)}.fb-entry-size{min-width:55px;text-align:right}.fb-entry-date{min-width:65px;text-align:right}.fb-entry-checkbox{width:16px;height:16px;min-width:16px;min-height:16px;cursor:pointer;accent-color:var(--amd-red);flex-shrink:0}.fb-preview{width:280px;flex-shrink:0;border:1px solid var(--border);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden}.fb-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--border)}.fb-preview-name{font-size:12px;font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fb-preview-meta{display:flex;gap:10px;padding:6px 12px;font-size:11px;color:var(--text-muted);border-bottom:1px solid var(--border-light);font-family:var(--font-mono)}.fb-preview-columns{padding:6px 12px;font-size:11px;color:var(--text-secondary);border-bottom:1px solid var(--border-light);word-break:break-word}.fb-preview-content{flex:1;overflow:auto;padding:10px 12px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);white-space:pre-wrap;word-break:break-all;line-height:1.5;margin:0;background:var(--bg-code);scrollbar-width:thin;scrollbar-color:var(--border) transparent}.fb-preview-content::-webkit-scrollbar{width:5px;height:5px}.fb-preview-content::-webkit-scrollbar-track{background:transparent}.fb-preview-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.fb-preview-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.fb-preview-loading,.fb-preview-binary{padding:20px;text-align:center;color:var(--text-muted);font-size:12px}.fb-actions{display:flex;align-items:center;gap:10px;padding-top:12px;border-top:1px solid var(--border)}.fb-selection-info{font-size:12px;color:var(--text-muted);flex:1}.fb-index-status{font-size:11px;color:var(--amd-red);font-family:var(--font-mono)}.fb-action-btns{display:flex;gap:8px}.fb-action-btn{display:flex;align-items:center;gap:5px;padding:8px 16px;border-radius:var(--radius-md);font-size:12px;font-weight:500;font-family:var(--font-sans);cursor:pointer;transition:all var(--duration) var(--ease)}.fb-action-btn.secondary{border:1px solid var(--border);background:transparent;color:var(--text-primary)}.fb-action-btn.secondary:hover{background:var(--bg-hover);border-color:var(--text-muted)}.fb-action-btn.primary{border:1px solid var(--amd-red);background:var(--amd-red);color:#fff}.fb-action-btn.primary:hover{background:var(--amd-red-dark);box-shadow:0 0 12px #ed1c2433}.fb-action-btn:disabled{opacity:.4;cursor:not-allowed}.fb-loading,.fb-empty,.fb-error{padding:30px;text-align:center;color:var(--text-muted);font-size:13px}.fb-error{color:var(--amd-red);background:var(--amd-red-dim2);border-radius:var(--radius-md);padding:10px}@media (max-width: 768px){.file-browser-modal{width:100vw;max-height:100vh;border-radius:0}.fb-preview{display:none}.fb-search-bar{flex-wrap:wrap}.fb-type-filter{min-width:100%}}.settings-modal{width:560px}.settings-section{margin-bottom:28px}.settings-section:last-child{margin-bottom:0}.settings-section h4{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:2px;color:var(--text-muted);margin-bottom:14px}.status-grid{display:flex;flex-direction:column;gap:8px}.status-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:var(--radius-md);background:var(--bg-secondary);border:1px solid var(--border-light);transition:border-color var(--duration) var(--ease);gap:8px}.status-row:hover{border-color:var(--border)}.status-row--has-hint{align-items:flex-start}.status-label{font-size:13px;font-family:var(--font-sans);flex-shrink:0;padding-top:1px}.status-value-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:3px;min-width:0}.status-value{font-size:13px;font-weight:600;font-family:var(--font-mono)}.status-value.ok{color:var(--accent-green)}.status-value.warn{color:var(--accent-gold)}.status-hint{font-size:11px;color:var(--text-muted);font-weight:400}.status-hint code{font-family:var(--font-mono);font-size:10.5px;padding:1px 5px;border-radius:2px;background:#00000012;color:var(--text-secondary);white-space:nowrap}[data-theme=dark] .status-hint code{background:#ffffff12}.status-error{padding:20px;text-align:center;color:var(--text-muted);font-family:var(--font-sans)}.status-error code{display:inline-block;margin-top:10px;padding:5px 14px;background:var(--bg-tertiary);border-radius:var(--radius-md);font-family:var(--font-mono);font-size:13px;border:1px solid var(--border)}.setting-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0;font-size:14px;font-family:var(--font-sans)}.setting-path{font-family:var(--font-mono);font-size:12px;color:var(--text-secondary);background:var(--bg-tertiary);padding:3px 10px;border-radius:var(--radius-sm);border:1px solid var(--border-light)}.model-override-desc{font-size:13px;color:var(--text-secondary);line-height:1.5;margin-bottom:12px;font-family:var(--font-sans)}.lemonade-link,.lemonade-link-inline{color:var(--accent);text-decoration:none;font-weight:500;transition:color var(--duration) var(--ease)}.lemonade-link:hover,.lemonade-link-inline:hover{color:var(--accent-green);text-decoration:underline}.lemonade-link svg{vertical-align:-1px;margin-left:2px}.lemonade-link-inline{color:var(--accent-gold)}.model-input-row{display:flex;gap:8px;align-items:stretch}.model-input{flex:1;padding:8px 12px;font-size:13px;font-family:var(--font-mono);background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-md);color:var(--text-primary);outline:none;transition:border-color var(--duration) var(--ease)}.model-input:focus{border-color:var(--accent)}.model-input::placeholder{color:var(--text-muted);font-size:12px}.model-input.has-override{border-color:var(--accent-green)}.model-input:disabled{opacity:.6}.model-btn-group{display:flex;gap:6px;flex-shrink:0}.btn-model-save{padding:8px 16px;font-size:13px;font-weight:500;font-family:var(--font-sans);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-tertiary);color:var(--text-primary);cursor:pointer;transition:all var(--duration) var(--ease)}.btn-model-save:hover:not(:disabled){background:var(--accent);color:#fff;border-color:var(--accent)}.btn-model-save:disabled{opacity:.4;cursor:not-allowed}.btn-model-save.saved{color:var(--accent-green);border-color:var(--accent-green)}.btn-model-clear{padding:8px 12px;font-size:13px;font-weight:500;font-family:var(--font-sans);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-tertiary);color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease)}.btn-model-clear:hover:not(:disabled){color:var(--accent-red, #e55);border-color:var(--accent-red, #e55)}.btn-model-clear:disabled{opacity:.4;cursor:not-allowed}.model-warning{display:flex;gap:10px;margin-top:12px;padding:12px 14px;border-radius:var(--radius-md);background:#eab30814;border:1px solid rgba(234,179,8,.25);color:var(--accent-gold)}.model-warning svg{flex-shrink:0;margin-top:1px}.model-warning-content{flex:1}.model-warning-content strong{display:block;font-size:13px;font-weight:600;font-family:var(--font-sans);margin-bottom:4px}.model-warning-content p{font-size:12px;line-height:1.5;color:var(--text-secondary);font-family:var(--font-sans);margin-bottom:10px}.btn-model-confirm{padding:6px 14px;font-size:12px;font-weight:500;font-family:var(--font-sans);border:1px solid rgba(234,179,8,.4);border-radius:var(--radius-sm);background:#eab3081f;color:var(--accent-gold);cursor:pointer;transition:all var(--duration) var(--ease)}.btn-model-confirm:hover{background:#eab30833;border-color:var(--accent-gold)}.model-active-override{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:12px;color:var(--text-secondary);font-family:var(--font-sans)}.model-active-override code{font-family:var(--font-mono);font-size:12px;color:var(--accent-green);background:var(--bg-tertiary);padding:2px 8px;border-radius:var(--radius-sm);border:1px solid var(--border-light)}.model-active-dot{width:6px;height:6px;border-radius:50%;background:var(--accent-green);flex-shrink:0}.model-status-section{margin-top:10px}.model-status-indicators{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}.model-status-pill{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;font-size:11px;font-weight:500;font-family:var(--font-sans);border:1px solid var(--border-light);background:var(--bg-secondary)}.model-status-pill.ok{color:var(--accent-green);border-color:#22c55e40}.model-status-pill.warn{color:var(--text-muted);border-color:var(--border-light)}.model-status-pill-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0}.model-status-pill.ok .model-status-pill-dot{background:var(--accent-green)}.model-status-pill.warn .model-status-pill-dot{background:var(--text-muted);opacity:.5}.model-status-hint{font-size:12px;color:var(--text-muted);margin-top:8px;line-height:1.5;font-family:var(--font-sans)}.danger-zone{border-top:1px solid var(--border);padding-top:20px;margin-top:8px}.danger-divider{height:1px;background:var(--border);margin:16px 0}.danger-warning{font-size:12px;color:var(--text-muted);margin-bottom:12px;line-height:1.5;font-family:var(--font-sans)}.setting-actions{margin-top:4px}.loading-text{font-size:13px;color:var(--text-muted);padding:16px;text-align:center;font-family:var(--font-sans)}.about-info p{font-size:14px;font-weight:500;font-family:var(--font-sans)}.about-sub{font-size:13px;color:var(--text-secondary);margin-top:6px;line-height:1.6;font-weight:400;font-family:var(--font-sans)}.mobile-modal{width:420px}.mobile-modal-body{display:flex;flex-direction:column;gap:16px}.tunnel-status{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:13px;font-weight:500}.tunnel-status .status-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.tunnel-status .status-dot.active{background:var(--accent-green);box-shadow:0 0 8px #4ec93266}.tunnel-status .status-dot.starting{background:var(--accent-gold);animation:pulse-dot 1.2s ease-in-out infinite}.tunnel-status .status-dot.error{background:var(--accent-danger)}.tunnel-status .status-dot.inactive{background:var(--text-muted)}.tunnel-status .tunnel-spinner{margin-left:auto;width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.tunnel-error{padding:12px 16px;background:#ef444414;border:1px solid rgba(239,68,68,.25);border-radius:var(--radius-sm);color:var(--accent-danger);font-size:13px;line-height:1.5;word-break:break-word}.qr-code-area{display:flex;flex-direction:column;align-items:center;gap:12px}.qr-code-area canvas{border-radius:var(--radius-md);border:2px solid var(--border);box-shadow:var(--shadow-sm)}.qr-placeholder{width:200px;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:var(--bg-secondary);border:2px dashed var(--border);border-radius:var(--radius-md);color:var(--text-muted);font-size:14px}.qr-placeholder.error{border-color:#ef44444d;color:var(--accent-danger)}.qr-placeholder .placeholder-spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}.tunnel-url-area{display:flex;flex-direction:column;gap:6px}.tunnel-url-area label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted)}.tunnel-url-row{display:flex;gap:8px;align-items:center}.tunnel-url-row input{flex:1;padding:8px 12px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:12px;color:var(--text-primary);outline:none}.tunnel-url-row input:focus{border-color:var(--amd-red)}button.copy-url-btn{display:flex;align-items:center;gap:6px;padding:8px 14px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:12px;font-weight:500;white-space:nowrap;transition:all var(--duration) var(--ease)}button.copy-url-btn:hover{background:var(--bg-hover);border-color:var(--amd-red);color:var(--amd-red)}button.copy-url-btn.copied{color:var(--accent-green);border-color:var(--accent-green)}.tunnel-password-hint{padding:14px 16px;background:#f59e0b0f;border:1px solid rgba(245,158,11,.2);border-radius:var(--radius-sm);text-align:center}.tunnel-password-hint label{display:block;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--accent-gold);margin-bottom:6px}.tunnel-password-value{font-size:22px;font-family:var(--font-mono);font-weight:700;color:var(--text-primary);letter-spacing:1px;-webkit-user-select:all;user-select:all;cursor:text;margin-bottom:4px}.tunnel-password-note{font-size:11px;color:var(--text-muted)}.mobile-instructions{padding:14px 16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:13px;color:var(--text-secondary);line-height:1.6}.mobile-instructions ol{margin:0;padding-left:20px}.mobile-instructions li{margin-bottom:4px}.mobile-instructions li:last-child{margin-bottom:0}.mobile-access-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:4px}@media (max-width: 480px){.mobile-modal{width:100%}.qr-code-area canvas{width:160px!important;height:160px!important}.qr-placeholder{width:160px;height:160px}}.connection-banner{display:flex;align-items:center;gap:10px;padding:10px 24px;font-size:12px;font-weight:500;font-family:var(--font-sans);line-height:1.5;flex-shrink:0;animation:slideDown .2s var(--ease);z-index:40}.connection-banner--error{background:#fef2f2;color:#991b1b;border-bottom:1px solid #fecaca}.connection-banner--warning{background:#fffbeb;color:#92400e;border-bottom:1px solid #fed7aa}.connection-banner--device{background:#f0f9ff;color:#075985;border-bottom:1px solid #bae6fd}[data-theme=dark] .connection-banner--error{background:#ed1c240f;color:#fca5a5;border-bottom:1px solid rgba(237,28,36,.15)}[data-theme=dark] .connection-banner--warning{background:#e8a8300f;color:#fcd34d;border-bottom:1px solid rgba(232,168,48,.15)}[data-theme=dark] .connection-banner--device{background:#031624;color:#7dd3fc;border-bottom:1px solid #0c2d42}.connection-banner--init{background:#eff6ff;color:#1e40af;border-bottom:1px solid #bfdbfe}[data-theme=dark] .connection-banner--init{background:#3b82f60f;color:#93c5fd;border-bottom:1px solid rgba(59,130,246,.15)}.connection-banner__icon{flex-shrink:0;display:flex;align-items:center}.connection-banner__text{flex:1;min-width:0}.connection-banner__hint{font-weight:400;opacity:.8;font-size:11px}.connection-banner__hint code{font-family:var(--font-mono);padding:2px 7px;border-radius:var(--radius-sm);background:#0000000f;font-size:11px}[data-theme=dark] .connection-banner__hint code{background:#ffffff0f}.connection-banner__link{color:inherit;text-decoration:underline;opacity:.85}.connection-banner__link:hover{opacity:1}.connection-banner__dismiss{flex-shrink:0;width:26px;height:26px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);opacity:.5;transition:opacity var(--duration-fast) var(--ease)}.connection-banner__dismiss:hover{opacity:1}.connection-banner__retry{flex-shrink:0;padding:5px 14px;border-radius:var(--radius-md);font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;transition:all var(--duration) var(--ease)}.connection-banner--error .connection-banner__retry{background:#991b1b;color:#fff}.connection-banner--error .connection-banner__retry:hover{background:#7f1d1d}.connection-banner--warning .connection-banner__retry{background:#92400e;color:#fff}.connection-banner--warning .connection-banner__retry:hover{background:#78350f}[data-theme=dark] .connection-banner--error .connection-banner__retry{background:#fca5a5;color:#120808}[data-theme=dark] .connection-banner--warning .connection-banner__retry{background:#fcd34d;color:#120e05}.connection-banner__retry--secondary{opacity:.7;margin-left:-4px}.connection-banner__retry--secondary:hover{opacity:1}.connection-banner__loading{flex-shrink:0;display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;font-family:var(--font-mono);opacity:.7}.connection-banner__spinner{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes slideDown{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@media (max-width: 768px){.connection-banner{padding:8px 16px 8px 52px;font-size:11px}}.update-chip{position:fixed;right:16px;bottom:16px;z-index:1200;display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border-radius:999px;max-width:360px;font-size:12px;line-height:1.3;font-weight:500;white-space:nowrap;background:#1e1e28eb;color:#f0f0f5;border:1px solid rgba(255,255,255,.08);box-shadow:0 4px 14px #0000003d;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);animation:update-chip-fade-in .2s ease-out}@keyframes update-chip-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.update-chip__icon{flex-shrink:0;opacity:.85}.update-chip__label{overflow:hidden;text-overflow:ellipsis}.update-chip__action{background:transparent;border:none;color:inherit;font:inherit;cursor:pointer;padding:0;text-decoration:underline;text-underline-offset:2px}.update-chip__action:hover,.update-chip__action:focus-visible{color:#fff;outline:none}.update-chip__dismiss{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;color:inherit;opacity:.55;cursor:pointer;padding:2px;margin-left:2px;border-radius:50%}.update-chip__dismiss:hover,.update-chip__dismiss:focus-visible{opacity:1;background:#ffffff14;outline:none}.update-chip--available,.update-chip--downloading{border-color:#63b3ed66}.update-chip--ready{background:#2e7d32eb;border-color:#81c7848c;color:#fff}.update-chip--error{background:#641e1eeb;border-color:#ef53508c;color:#fff}@media (prefers-color-scheme: light){.update-chip{background:#fffffff5;color:#1a1a2e;border-color:#00000014;box-shadow:0 4px 14px #0000001f}.update-chip--ready{background:#2e7d32f5;color:#fff}.update-chip--error{background:#c62828f5;color:#fff}}.permission-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:var(--bg-modal-overlay, rgba(0, 0, 0, .5));animation:permFadeIn .15s var(--ease)}@keyframes permFadeIn{0%{opacity:0}to{opacity:1}}.permission-prompt{width:440px;max-width:calc(100vw - 32px);background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden;animation:permSlideUp .2s var(--ease)}@keyframes permSlideUp{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.permission-header{display:flex;align-items:center;gap:12px;padding:16px 20px;background:#e23c400f;border-bottom:1px solid var(--border-light)}[data-theme=dark] .permission-header{background:#e23c4014}.permission-header-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:var(--radius-md);background:var(--amd-red);color:#fff;flex-shrink:0}.permission-header-text{flex:1;min-width:0}.permission-title{font-size:15px;font-weight:700;color:var(--text-primary);margin:0}.permission-agent{font-size:12px;color:var(--text-secondary);font-weight:500}.permission-countdown{display:flex;align-items:center;gap:4px;padding:4px 10px;border-radius:var(--radius-full);background:var(--accent-danger-dim);color:var(--accent-danger);font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;flex-shrink:0;animation:permCountdownPulse 1s infinite}@keyframes permCountdownPulse{0%,to{opacity:1}50%{opacity:.7}}.permission-body{padding:16px 20px}.permission-message{font-size:14px;line-height:1.5;color:var(--text-primary);margin:0 0 12px}.permission-tool-info{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.permission-tool-header{display:flex;align-items:center;gap:6px;padding:8px 12px;background:var(--bg-tertiary);border-bottom:1px solid var(--border-light);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary)}.permission-tool-header svg{color:var(--accent-yellow)}.permission-tool-name{padding:8px 12px;border-bottom:1px solid var(--border-light)}.permission-tool-name code{font-family:var(--font-mono);font-size:13px;font-weight:600;color:var(--amd-red)}.permission-tool-args{padding:0;max-height:160px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.permission-tool-args::-webkit-scrollbar{width:5px}.permission-tool-args::-webkit-scrollbar-track{background:transparent}.permission-tool-args::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.permission-tool-args::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.permission-tool-args pre{margin:0;padding:10px 12px;font-family:var(--font-mono);font-size:12px;line-height:1.5;color:var(--text-secondary);white-space:pre-wrap;word-break:break-all}.permission-critical-banner{display:flex;align-items:center;gap:6px;padding:8px 12px;margin-top:12px;border-radius:var(--radius-sm);background:var(--accent-danger-dim);border:1px solid rgba(239,68,68,.2);color:var(--accent-danger);font-size:12px;font-weight:600}.permission-remember{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:13px;color:var(--text-secondary);cursor:pointer;border-top:1px solid var(--border-light);transition:background .15s var(--ease)}.permission-remember:hover{background:var(--bg-hover)}.permission-remember input[type=checkbox]{width:16px;height:16px;accent-color:var(--amd-red);cursor:pointer}.permission-remember code{font-family:var(--font-mono);font-size:12px;padding:1px 4px;border-radius:var(--radius-xs);background:var(--bg-tertiary);color:var(--text-primary)}.permission-actions{display:flex;gap:10px;padding:12px 20px;border-top:1px solid var(--border-light)}.permission-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:10px 16px;border-radius:var(--radius-md);font-size:14px;font-weight:600;transition:all .15s var(--ease)}.permission-btn:disabled{opacity:.6;cursor:not-allowed}.permission-btn-allow{background:var(--accent-green);color:#fff;border:1px solid var(--accent-green)}.permission-btn-allow:hover:not(:disabled){filter:brightness(1.1);box-shadow:0 2px 8px #22c55e4d}.permission-btn-deny{background:transparent;color:var(--text-secondary);border:1px solid var(--border)}.permission-btn-deny:hover:not(:disabled){color:var(--accent-danger);border-color:var(--accent-danger);background:#ef44440f}.permission-hints{display:flex;justify-content:center;gap:16px;padding:8px 20px 12px;font-size:11px;color:var(--text-muted)}.permission-hints kbd{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:18px;padding:0 5px;border-radius:var(--radius-xs);border:1px solid var(--border);background:var(--bg-secondary);font-family:var(--font-mono);font-size:10px;font-weight:600;color:var(--text-secondary);margin-right:4px}@media (max-width: 480px){.permission-prompt{width:100%;max-width:100%;border-radius:var(--radius-lg) var(--radius-lg) 0 0;position:fixed;bottom:0;left:0;right:0}.permission-overlay{align-items:flex-end}}@font-face{font-family:DM Sans;src:url(./dm-sans-latin-Xz1IZZA0.woff2) format("woff2");font-weight:300 700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Space Mono;src:url(./space-mono-400-Co7bH5Hm.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;src:url(./jetbrains-mono-latin-6fWv1k7M.woff2) format("woff2");font-weight:400 700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--amd-red: #ED1C24;--amd-red-dark: #c41820;--amd-red-light: #ff4f56;--amd-red-soft: #f04048;--amd-red-dim: rgba(237, 28, 36, .12);--amd-red-dim2: rgba(237, 28, 36, .06);--terminal-green: #4ec932;--terminal-green-dim: #3da826;--terminal-glow: 0 0 6px rgba(78, 201, 50, .15);--accent-green: #4ec932;--accent-green-dim: rgba(78, 201, 50, .12);--accent-yellow: #e8a830;--accent-blue: #3b9eff;--accent-cyan: #06b6d4;--accent-gold: #e8a830;--accent-gold-dim: rgba(232, 168, 48, .12);--accent-danger: #ef4444;--accent-danger-dim: rgba(239, 68, 68, .1);--text-code: #d4d4d4;--bg-primary: #ffffff;--bg-secondary: #f8f9fa;--bg-tertiary: #f0f1f3;--bg-sidebar: #f0f1f3;--bg-input: #ffffff;--bg-hover: #f0f0f0;--bg-active: #e5e7eb;--bg-code: #1e1e1e;--bg-user-msg: rgba(0, 0, 0, .02);--bg-assistant-msg: rgba(0, 0, 0, .015);--bg-modal-overlay: rgba(0, 0, 0, .5);--bg-card: #f8f9fa;--bg-image: none;--bg-image-opacity: 0;--tint-subtle: rgba(0, 0, 0, .03);--tint-hover: rgba(0, 0, 0, .05);--text-primary: #111827;--text-secondary: #6b7280;--text-muted: #9ca3af;--text-inverse: #ffffff;--border: #e5e7eb;--border-light: #f3f4f6;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .04);--shadow-md: 0 4px 16px rgba(0, 0, 0, .08);--shadow-lg: 0 12px 40px rgba(0, 0, 0, .12);--radius-xs: 3px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 10px;--radius-xl: 14px;--radius-full: 9999px;--font-sans: "DM Sans", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Roboto, Helvetica, Arial, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", "Fira Code", "Consolas", "Monaco", monospace;--font-display: "Space Mono", "JetBrains Mono", monospace;--sidebar-w: 300px;--ease: cubic-bezier(.22, 1, .36, 1);--ease-spring: cubic-bezier(.16, 0, .84, 1);--duration: .2s;--duration-fast: .12s}[data-theme=dark]{--bg-primary: #0e0e16;--bg-secondary: #0a0a12;--bg-tertiary: #1a1a28;--bg-sidebar: #08080d;--bg-input: #12121c;--bg-hover: #1e1e2e;--bg-active: #262638;--bg-code: #0a0a12;--bg-card: #12121c;--bg-user-msg: rgba(255, 255, 255, .015);--bg-assistant-msg: rgba(255, 255, 255, .02);--bg-modal-overlay: rgba(0, 0, 0, .88);--text-primary: #e8e8f0;--text-secondary: #9898b0;--text-muted: #8585a0;--border: #222236;--border-light: #1a1a2a;--shadow-sm: 0 1px 3px rgba(0, 0, 0, .6);--shadow-md: 0 4px 20px rgba(0, 0, 0, .7);--shadow-lg: 0 12px 48px rgba(0, 0, 0, .8);--tint-subtle: rgba(255, 255, 255, .02);--tint-hover: rgba(255, 255, 255, .04);--bg-image: none;--bg-image-opacity: 0}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}html,body,#root{height:100%;overflow:hidden;font-family:var(--font-sans);font-size:14px;color:var(--text-primary);background:var(--bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.72}#root:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:-1;background-image:var(--bg-image, none);background-size:cover;background-position:center;background-repeat:no-repeat;opacity:var(--bg-image-opacity, 0)}[data-theme=dark] #root:after{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:1;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)' opacity='0.025'/%3E%3C/svg%3E");opacity:.4}button{cursor:pointer;border:none;background:none;font:inherit;color:inherit}input,textarea{font:inherit;color:var(--text-primary);background:var(--bg-input)}a{color:var(--amd-red);text-decoration:none}a:hover{text-decoration:underline}::selection{background:#ed1c242e;color:inherit}::-moz-selection{background:#ed1c242e;color:inherit}.app{display:flex;height:100vh;height:100dvh;position:relative}.main-content{display:flex;flex-direction:column;flex:1;min-width:0;overflow:hidden;position:relative}.view-container{flex:1;display:flex;flex-direction:column;min-height:0;transition:opacity .22s var(--ease),transform .22s var(--ease);will-change:opacity,transform}.view-container.view-transitioning{opacity:0;transform:scale(.984) translateY(10px)}[data-theme=dark] .main-content:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse 600px 500px at 85% 10%,rgba(237,28,36,.06) 0%,transparent 70%),radial-gradient(ellipse 500px 400px at 10% 90%,rgba(78,201,50,.03) 0%,transparent 70%),radial-gradient(ellipse 400px 350px at 50% 50%,rgba(59,158,255,.025) 0%,transparent 70%)}:focus-visible{outline:2px solid var(--terminal-green);outline-offset:2px}button:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid var(--terminal-green);outline-offset:2px}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.btn-primary{display:inline-flex;align-items:center;gap:8px;padding:11px 28px;background:var(--amd-red);color:#fff;border-radius:var(--radius-md);font-weight:600;font-size:14px;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;transition:all var(--duration) var(--ease);position:relative;overflow:hidden}.btn-primary:hover{background:var(--amd-red-dark);box-shadow:0 0 20px #ed1c244d;transform:translateY(-1px)}.btn-primary:active{transform:translateY(0)}.btn-secondary{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border:1px solid var(--border);border-radius:var(--radius-md);font-weight:500;font-size:13px;font-family:var(--font-mono);transition:all var(--duration) var(--ease)}.btn-secondary:hover{border-color:var(--amd-red);color:var(--amd-red);background:var(--amd-red-dim2)}.btn-secondary:active{transform:translateY(0) scale(.98)}.btn-danger{display:inline-flex;align-items:center;gap:6px;padding:8px 18px;border:1px solid var(--amd-red);border-radius:var(--radius-md);color:var(--amd-red);font-weight:500;font-size:13px;font-family:var(--font-mono);transition:all var(--duration) var(--ease)}.btn-danger:hover{background:var(--amd-red);color:#fff}.btn-danger:active{transform:scale(.98)}.btn-icon{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:var(--radius-md);color:var(--text-secondary);transition:all var(--duration) var(--ease)}.btn-icon:hover{background:var(--bg-hover);color:var(--text-primary)}.btn-icon:active{transform:scale(.94)}.btn-icon-sm{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:var(--radius-sm);color:var(--text-secondary);transition:all var(--duration) var(--ease)}.btn-icon-sm:hover{background:var(--bg-hover);color:var(--text-primary)}.btn-icon-sm:active{transform:scale(.94)}.beta-badge{display:inline-block;font-size:9px;font-weight:700;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;padding:2px 8px;border-radius:var(--radius-sm);background:var(--accent-gold-dim);color:var(--accent-gold);border:1px solid rgba(232,168,48,.2);vertical-align:middle;line-height:1.3}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:var(--bg-modal-overlay);backdrop-filter:blur(16px) saturate(1.2);-webkit-backdrop-filter:blur(16px) saturate(1.2);display:flex;align-items:center;justify-content:center;animation:fadeIn var(--duration-fast) var(--ease)}.modal-panel{position:relative;width:560px;max-width:92%;max-height:85vh;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;overflow:hidden;animation:slideUp .25s var(--ease)}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;border-bottom:1px solid var(--border);flex-shrink:0}.modal-header h3{font-size:14px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-secondary)}.modal-body{padding:24px;overflow-y:auto;flex:1;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.modal-body::-webkit-scrollbar{width:5px}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.modal-body::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.animated-presence.exiting .modal-overlay{animation:modalOverlayOut .2s var(--ease) forwards}.animated-presence.exiting .modal-panel{animation:modalPanelOut .25s var(--ease) forwards}@keyframes modalOverlayOut{0%{opacity:1}to{opacity:0}}@keyframes modalPanelOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(12px)}}.sidebar-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#000000b3;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);animation:fadeIn var(--duration-fast) var(--ease)}.sidebar-toggle{display:none;position:fixed;top:10px;left:10px;z-index:51;width:38px;height:38px;border-radius:var(--radius-md);background:var(--bg-secondary);border:1px solid var(--border);align-items:center;justify-content:center;color:var(--text-primary);box-shadow:var(--shadow-sm);transition:all var(--duration) var(--ease);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.sidebar-toggle:hover{background:var(--bg-hover)}.loading-spinner{display:flex;align-items:center;justify-content:center;padding:40px;flex:1}.loading-spinner:after{content:"";width:24px;height:24px;border:2px solid var(--border);border-top-color:var(--amd-red);border-radius:50%;animation:spin .8s linear infinite}.toast{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:200;padding:12px 24px;background:var(--bg-card);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:13px;font-weight:500;font-family:var(--font-sans);box-shadow:var(--shadow-lg);animation:toastIn .2s var(--ease),toastOut .2s var(--ease) 2.5s forwards;pointer-events:none;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.toast-undo{pointer-events:all;cursor:pointer}.toast-undo .toast-action{color:var(--amd-red);font-weight:600;margin-left:12px;cursor:pointer;text-decoration:underline}@keyframes toastIn{0%{opacity:0;transform:translate(-50%) translateY(8px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@keyframes toastOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(8px)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes slideDown{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(12px)}}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes glow{0%,to{box-shadow:0 0 4px #00ff9f1a}50%{box-shadow:0 0 10px #00ff9f33}}@keyframes cursorBlink{0%,to{opacity:1}50%{opacity:0}}.thinking-dots span{animation:loadingDotGlow 2.4s ease-in-out infinite;opacity:.15;color:var(--amd-red, #ff3b3b);text-shadow:0 0 2px rgba(237,28,36,.2)}.thinking-dots span:nth-child(1){animation-delay:0s}.thinking-dots span:nth-child(2){animation-delay:.5s}.thinking-dots span:nth-child(3){animation-delay:1s}@keyframes loadingDotGlow{0%,15%{opacity:.15;text-shadow:0 0 2px rgba(237,28,36,.2)}25%{opacity:1;text-shadow:0 0 8px rgba(237,28,36,.8),0 0 3px rgba(237,28,36,1)}40%,to{opacity:.15;text-shadow:0 0 2px rgba(237,28,36,.2)}}@keyframes revealUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}html.theme-transitioning,html.theme-transitioning *,html.theme-transitioning *:before,html.theme-transitioning *:after{transition:background-color .4s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease!important}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}[data-theme=dark] #root:after{display:none}}@media (max-width: 900px){:root{--sidebar-w: 260px}}@media (max-width: 768px){.sidebar-toggle{display:flex}.sidebar-overlay.visible{display:block}.sidebar{position:fixed!important;left:0;top:0;bottom:0;z-index:50;width:var(--sidebar-w)!important;min-width:var(--sidebar-w)!important;transform:translate(-100%);transition:transform .25s var(--ease);box-shadow:none}.sidebar.open{transform:translate(0);box-shadow:var(--shadow-lg)}.sidebar.collapsed{width:var(--sidebar-w)!important;min-width:var(--sidebar-w)!important}.sidebar.collapsed .sidebar-brand .brand-text,.sidebar.collapsed .sidebar-search,.sidebar.collapsed .session-list,.sidebar.collapsed .privacy-badge span:not(.privacy-dot),.sidebar.collapsed .version-badge,.sidebar.collapsed .new-task-btn{display:revert}.sidebar.collapsed .sidebar-top{padding:16px 16px 12px;justify-content:space-between}.sidebar.collapsed .sidebar-brand{gap:10px}.sidebar.collapsed .sidebar-top-actions{gap:4px}.sidebar.collapsed .sidebar-bottom{flex-direction:row;padding:12px 14px;gap:0;align-items:center}.sidebar.collapsed .sidebar-actions{flex-direction:row;gap:2px}.collapse-btn{display:none}.sidebar-resize-handle{display:none!important}.chat-view,.welcome{padding-top:48px}.chat-header{padding-left:52px!important}.modal-panel{max-width:96%;max-height:90vh}.btn-icon{width:44px;height:44px}.btn-icon-sm{width:36px;height:36px}input,textarea,select{font-size:16px!important}}@media (max-width: 480px){:root{--sidebar-w: 280px}.modal-panel{max-width:100%;max-height:100vh;border-radius:0}}
|
package/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="icon" type="image/png" href="./favicon.png" />
|
|
7
7
|
<title>GAIA</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-B4Qzv7Ys.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-eQemgF08.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/main.cjs
CHANGED
|
@@ -26,6 +26,7 @@ const NotificationService = require("./services/notification-service.cjs");
|
|
|
26
26
|
const backendInstaller = require("./services/backend-installer.cjs");
|
|
27
27
|
const installerProgressDialog = require("./services/backend-installer-progress-dialog.cjs");
|
|
28
28
|
const autoUpdater = require("./services/auto-updater.cjs");
|
|
29
|
+
const agentSeeder = require("./services/agent-seeder.cjs");
|
|
29
30
|
|
|
30
31
|
// ── Configuration ──────────────────────────────────────────────────────────
|
|
31
32
|
|
|
@@ -454,6 +455,25 @@ app.on("second-instance", (_event, _argv, _cwd) => {
|
|
|
454
455
|
});
|
|
455
456
|
|
|
456
457
|
app.whenReady().then(async () => {
|
|
458
|
+
// Phase 0: seed bundled agents BEFORE the Python backend starts, so the
|
|
459
|
+
// agent registry sees them on its first discovery pass. Failures here are
|
|
460
|
+
// non-fatal — the app must still launch even if seeding is blocked (e.g.
|
|
461
|
+
// permission error on ~/.gaia/agents).
|
|
462
|
+
try {
|
|
463
|
+
const seedResult = await agentSeeder.seedBundledAgents();
|
|
464
|
+
if (seedResult.seeded.length > 0) {
|
|
465
|
+
console.log("[main] Seeded agents:", seedResult.seeded);
|
|
466
|
+
}
|
|
467
|
+
if (seedResult.errors.length > 0) {
|
|
468
|
+
console.warn(
|
|
469
|
+
"[main] Agent seeding errors:",
|
|
470
|
+
seedResult.errors.map((e) => e.id)
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
} catch (err) {
|
|
474
|
+
console.warn("[main] Agent seeding failed (non-fatal):", err);
|
|
475
|
+
}
|
|
476
|
+
|
|
457
477
|
// Phase A: ensure the Python backend is installed BEFORE creating the
|
|
458
478
|
// main window. The progress dialog owns the UI during this phase.
|
|
459
479
|
const bootstrapOk = await bootstrapBackend();
|
package/package.json
CHANGED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* agent-seeder.cjs — First-launch bundled-agent seeder.
|
|
6
|
+
*
|
|
7
|
+
* Copies agents bundled with the installer (placed at
|
|
8
|
+
* `<resourcesPath>/agents/` by electron-builder's extraResources rule) into
|
|
9
|
+
* the user's per-agent home directory at `~/.gaia/agents/<agent-id>/`. A
|
|
10
|
+
* `.seeded` sentinel file is written after a successful copy so subsequent
|
|
11
|
+
* launches skip the agent.
|
|
12
|
+
*
|
|
13
|
+
* Design invariants (see .claude/plans/bundle-path-contract.md):
|
|
14
|
+
* - Source: path.join(process.resourcesPath, "agents", "<id>")
|
|
15
|
+
* - Windows: <install>\resources\agents\<id>\
|
|
16
|
+
* - macOS: <Bundle>.app/Contents/Resources/agents/<id>/
|
|
17
|
+
* - Linux: /opt/<AppName>/resources/agents/<id>/
|
|
18
|
+
* - Target: path.join(os.homedir(), ".gaia", "agents", "<id>")
|
|
19
|
+
* - Sentinel: <target>/.seeded (exists → already seeded → skip)
|
|
20
|
+
*
|
|
21
|
+
* Write protocol (atomic-ish, crash-safe):
|
|
22
|
+
* 1. Remove any stale `<id>.partial/` sibling from a prior failed run.
|
|
23
|
+
* 2. Copy source → `<id>.partial/`.
|
|
24
|
+
* 3. `fs.renameSync(<id>.partial, <id>)` — atomic on the same filesystem.
|
|
25
|
+
* 4. Write `<id>/.seeded` last, so a partial seed never looks complete.
|
|
26
|
+
*
|
|
27
|
+
* Behaviour:
|
|
28
|
+
* - Target `<id>/` exists WITH `.seeded` → already seeded, skip.
|
|
29
|
+
* - Target `<id>/` exists WITHOUT `.seeded` → treat as user-owned data,
|
|
30
|
+
* log a warning, and skip (never clobber a hand-authored agent).
|
|
31
|
+
* - `process.resourcesPath` unset (dev / Jest) or source dir missing →
|
|
32
|
+
* empty result, no error.
|
|
33
|
+
* - Per-agent failures are isolated: they go into `errors[]` but do not
|
|
34
|
+
* stop the next agent from being seeded.
|
|
35
|
+
*
|
|
36
|
+
* Pure CommonJS. Only Node stdlib (fs / path / os). No Electron imports so
|
|
37
|
+
* the module is testable without spinning up Electron.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
"use strict";
|
|
41
|
+
|
|
42
|
+
const fs = require("fs");
|
|
43
|
+
const path = require("path");
|
|
44
|
+
const os = require("os");
|
|
45
|
+
|
|
46
|
+
// ── Path helpers ─────────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
function gaiaHome() {
|
|
49
|
+
return path.join(os.homedir(), ".gaia");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function agentsTargetRoot() {
|
|
53
|
+
return path.join(gaiaHome(), "agents");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function logsDir() {
|
|
57
|
+
return path.join(gaiaHome(), "logs");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function logFilePath() {
|
|
61
|
+
return path.join(logsDir(), "seeder.log");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ── Logging ──────────────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
function log(level, message) {
|
|
67
|
+
const line = `${new Date().toISOString()} [${level}] ${message}\n`;
|
|
68
|
+
try {
|
|
69
|
+
fs.mkdirSync(logsDir(), { recursive: true });
|
|
70
|
+
fs.appendFileSync(logFilePath(), line, { encoding: "utf8" });
|
|
71
|
+
} catch {
|
|
72
|
+
// If we cannot write the log, fall back to console so the message
|
|
73
|
+
// isn't lost entirely. We never let logging failure propagate.
|
|
74
|
+
}
|
|
75
|
+
// Also mirror to console so `electron .` tail-of-stdout users see it.
|
|
76
|
+
// eslint-disable-next-line no-console
|
|
77
|
+
const writer =
|
|
78
|
+
level === "ERROR" ? console.error : level === "WARN" ? console.warn : console.log;
|
|
79
|
+
writer(`[agent-seeder] ${message}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ── Filesystem helpers ───────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Recursive copy using fs.cpSync when available (Node 16.7+), falling back
|
|
86
|
+
* to a hand-rolled recursive copy for older runtimes. Electron 40 ships
|
|
87
|
+
* Node 20, so cpSync is always present in production — but we keep the
|
|
88
|
+
* fallback for test environments that might mock cpSync.
|
|
89
|
+
*/
|
|
90
|
+
function copyDirRecursive(src, dest) {
|
|
91
|
+
if (typeof fs.cpSync === "function") {
|
|
92
|
+
// dereference: true flattens symlinks into their targets rather than
|
|
93
|
+
// copying the symlink itself. This prevents a malicious or accidentally
|
|
94
|
+
// symlinked installer bundle from planting out-of-tree references in
|
|
95
|
+
// ~/.gaia/agents/<id>/.
|
|
96
|
+
fs.cpSync(src, dest, { recursive: true, errorOnExist: false, force: true, dereference: true });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Fallback path (shouldn't normally hit on Electron 40 / Node 20).
|
|
100
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
101
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
102
|
+
const s = path.join(src, entry.name);
|
|
103
|
+
const d = path.join(dest, entry.name);
|
|
104
|
+
if (entry.isDirectory()) {
|
|
105
|
+
copyDirRecursive(s, d);
|
|
106
|
+
} else if (entry.isSymbolicLink()) {
|
|
107
|
+
// Skip symlinks in the fallback path for the same reason as dereference:true above.
|
|
108
|
+
log("WARN", `Skipping symlink in installer bundle: ${s}`);
|
|
109
|
+
} else {
|
|
110
|
+
fs.copyFileSync(s, d);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function rmDirRecursive(target) {
|
|
116
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function isDirectory(p) {
|
|
120
|
+
try {
|
|
121
|
+
return fs.statSync(p).isDirectory();
|
|
122
|
+
} catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ── Seeding core ─────────────────────────────────────────────────────────
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Seed a single agent directory. Returns a category string:
|
|
131
|
+
* "seeded" — copied successfully, sentinel written.
|
|
132
|
+
* "skipped" — already seeded or user-owned; left untouched.
|
|
133
|
+
* "error" — copy failed; partial data cleaned up (best effort).
|
|
134
|
+
*
|
|
135
|
+
* Throws only on programmer error. All IO errors are caught and logged.
|
|
136
|
+
*/
|
|
137
|
+
function seedOneAgent(sourceDir, targetRoot, id) {
|
|
138
|
+
const src = path.join(sourceDir, id);
|
|
139
|
+
const target = path.join(targetRoot, id);
|
|
140
|
+
const partial = path.join(targetRoot, `${id}.partial`);
|
|
141
|
+
const sentinel = path.join(target, ".seeded");
|
|
142
|
+
|
|
143
|
+
// Already seeded?
|
|
144
|
+
if (fs.existsSync(sentinel)) {
|
|
145
|
+
log("INFO", `Skipping "${id}" — already seeded (sentinel present)`);
|
|
146
|
+
return { status: "skipped" };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Target exists but no sentinel → user-owned data. Do not touch.
|
|
150
|
+
if (fs.existsSync(target)) {
|
|
151
|
+
log(
|
|
152
|
+
"WARN",
|
|
153
|
+
`Skipping "${id}" — target exists without .seeded sentinel ` +
|
|
154
|
+
`(treating as user-owned data): ${target}`
|
|
155
|
+
);
|
|
156
|
+
return { status: "skipped" };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Verify the source is actually a directory before doing anything.
|
|
160
|
+
if (!isDirectory(src)) {
|
|
161
|
+
log("WARN", `Skipping "${id}" — source is not a directory: ${src}`);
|
|
162
|
+
return { status: "skipped" };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
// Clean up any leftover from a prior failed run.
|
|
167
|
+
if (fs.existsSync(partial)) {
|
|
168
|
+
log("INFO", `Removing stale partial directory for "${id}": ${partial}`);
|
|
169
|
+
rmDirRecursive(partial);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Ensure the parent exists.
|
|
173
|
+
fs.mkdirSync(targetRoot, { recursive: true });
|
|
174
|
+
|
|
175
|
+
// Copy into sibling, then atomically rename.
|
|
176
|
+
copyDirRecursive(src, partial);
|
|
177
|
+
fs.renameSync(partial, target);
|
|
178
|
+
|
|
179
|
+
// Write sentinel LAST — its presence means "copy completed".
|
|
180
|
+
fs.writeFileSync(
|
|
181
|
+
sentinel,
|
|
182
|
+
JSON.stringify(
|
|
183
|
+
{
|
|
184
|
+
seededAt: new Date().toISOString(),
|
|
185
|
+
source: src,
|
|
186
|
+
},
|
|
187
|
+
null,
|
|
188
|
+
2
|
|
189
|
+
),
|
|
190
|
+
{ encoding: "utf8" }
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
log("INFO", `Seeded "${id}" from ${src} to ${target}`);
|
|
194
|
+
return { status: "seeded" };
|
|
195
|
+
} catch (err) {
|
|
196
|
+
// Best-effort cleanup. If the rename already happened (partial no longer
|
|
197
|
+
// exists but target does and has no sentinel), remove target so the next
|
|
198
|
+
// launch retries cleanly instead of treating it as user-owned data.
|
|
199
|
+
try {
|
|
200
|
+
if (fs.existsSync(partial)) {
|
|
201
|
+
rmDirRecursive(partial);
|
|
202
|
+
} else if (fs.existsSync(target) && !fs.existsSync(sentinel)) {
|
|
203
|
+
rmDirRecursive(target);
|
|
204
|
+
}
|
|
205
|
+
} catch {
|
|
206
|
+
// ignore — original error is more important
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
log(
|
|
210
|
+
"ERROR",
|
|
211
|
+
`Failed to seed "${id}": ${err && err.message ? err.message : err}`
|
|
212
|
+
);
|
|
213
|
+
return { status: "error", error: err };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Seed all bundled agents found under `<resourcesPath>/agents/`.
|
|
219
|
+
*
|
|
220
|
+
* Idempotent — safe to call on every app launch.
|
|
221
|
+
*
|
|
222
|
+
* @returns {Promise<{seeded: string[], skipped: string[], errors: {id: string, error: Error}[]}>}
|
|
223
|
+
*/
|
|
224
|
+
async function seedBundledAgents() {
|
|
225
|
+
const result = { seeded: [], skipped: [], errors: [] };
|
|
226
|
+
|
|
227
|
+
// Guard against dev / test environments where resourcesPath is unset.
|
|
228
|
+
if (!process.resourcesPath) {
|
|
229
|
+
log(
|
|
230
|
+
"INFO",
|
|
231
|
+
"process.resourcesPath is undefined — skipping bundled-agent seeding"
|
|
232
|
+
);
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const sourceDir = path.join(process.resourcesPath, "agents");
|
|
237
|
+
|
|
238
|
+
if (!fs.existsSync(sourceDir) || !isDirectory(sourceDir)) {
|
|
239
|
+
// Not an error — a build might simply ship without bundled agents.
|
|
240
|
+
// In a packaged Electron app the directory is expected to exist, so raise
|
|
241
|
+
// to WARN; in dev/test contexts leave it at INFO.
|
|
242
|
+
let isPackaged = false;
|
|
243
|
+
try {
|
|
244
|
+
isPackaged = require("electron").app?.isPackaged === true;
|
|
245
|
+
} catch (_) {
|
|
246
|
+
// not in an Electron context (tests, CLI)
|
|
247
|
+
}
|
|
248
|
+
log(
|
|
249
|
+
isPackaged ? "WARN" : "INFO",
|
|
250
|
+
`No bundled agents directory at ${sourceDir} — nothing to seed`
|
|
251
|
+
);
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
let entries;
|
|
256
|
+
try {
|
|
257
|
+
entries = fs.readdirSync(sourceDir, { withFileTypes: true });
|
|
258
|
+
} catch (err) {
|
|
259
|
+
log(
|
|
260
|
+
"ERROR",
|
|
261
|
+
`Failed to read bundled agents directory ${sourceDir}: ${
|
|
262
|
+
err && err.message ? err.message : err
|
|
263
|
+
}`
|
|
264
|
+
);
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const targetRoot = agentsTargetRoot();
|
|
269
|
+
|
|
270
|
+
for (const entry of entries) {
|
|
271
|
+
if (!entry.isDirectory()) continue;
|
|
272
|
+
const id = entry.name;
|
|
273
|
+
|
|
274
|
+
const outcome = seedOneAgent(sourceDir, targetRoot, id);
|
|
275
|
+
if (outcome.status === "seeded") {
|
|
276
|
+
result.seeded.push(id);
|
|
277
|
+
} else if (outcome.status === "skipped") {
|
|
278
|
+
result.skipped.push(id);
|
|
279
|
+
} else {
|
|
280
|
+
result.errors.push({ id, error: outcome.error });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
log(
|
|
285
|
+
"INFO",
|
|
286
|
+
`Seeding complete — seeded=${result.seeded.length} ` +
|
|
287
|
+
`skipped=${result.skipped.length} errors=${result.errors.length}`
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
module.exports = {
|
|
294
|
+
seedBundledAgents,
|
|
295
|
+
// Exposed for tests — do not rely on these from production code.
|
|
296
|
+
_internals: {
|
|
297
|
+
seedOneAgent,
|
|
298
|
+
agentsTargetRoot,
|
|
299
|
+
logFilePath,
|
|
300
|
+
},
|
|
301
|
+
};
|