vibeteam 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +334 -38
- package/dist/server/server/index.js +2078 -1822
- package/mcp/server.js +389 -0
- package/package.json +5 -2
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/index-DURW-QlU.js +4330 -0
- package/public/assets/index-DgQWq5c0.css +1 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +14 -0
- package/public/index.html +21 -0
- package/public/logo.svg +22 -0
- package/public/models/.gitkeep +0 -0
- package/public/models/models/.gitkeep +0 -0
- package/public/site.webmanifest +25 -0
- package/public/sounds/sounds/yoshi.mp3 +0 -0
- package/public/sounds/yoshi.mp3 +0 -0
- package/dist/server/server/CommitWatcher.js +0 -307
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5;font-weight:400;color-scheme:dark;color:#fff;background-color:#0a0a0f;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html,body,#root{margin:0;padding:0;width:100%;height:100%;overflow:hidden}a{font-weight:500;color:#0ff;text-decoration:none}a:hover{color:#0af}button{border-radius:6px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#22222e;color:#fff;cursor:pointer;transition:all .15s ease}button:hover{background-color:#2a2a3a}button:focus,button:focus-visible{outline:2px solid #00ffff;outline-offset:2px}input,textarea{font-family:inherit}.tab-hidden *,.tab-hidden *:before,.tab-hidden *:after{animation-play-state:paused!important}.floating-panel{position:fixed;background:#12121af2;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.08);border-radius:12px;box-shadow:0 8px 32px #0006,0 0 1px #ffffff1a,inset 0 1px #ffffff0d;display:flex;flex-direction:column;overflow:hidden;transition:height .2s ease,box-shadow .15s ease}.floating-panel.dragging{transition:none;box-shadow:0 12px 48px #00000080,0 0 1px #00ffff4d,inset 0 1px #ffffff14}.floating-panel.collapsed{height:auto!important}.floating-panel.maximized{border-radius:8px}.floating-panel-header{display:flex;align-items:center;gap:8px;padding:10px 12px;background:linear-gradient(180deg,rgba(255,255,255,.04) 0%,transparent 100%);border-bottom:1px solid rgba(255,255,255,.06);cursor:grab;-webkit-user-select:none;user-select:none;flex-shrink:0}.floating-panel.dragging .floating-panel-header{cursor:grabbing}.floating-panel-title{font-size:.8rem;font-weight:600;color:#fff;letter-spacing:.3px;flex-shrink:0}.floating-panel-header-content{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.floating-panel-controls{display:flex;gap:4px;flex-shrink:0}.panel-control-btn{width:24px;height:24px;border:none;border-radius:6px;background:transparent;color:#666;font-size:.75rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s ease}.panel-control-btn:hover{background:#ffffff1a;color:#fff}.panel-control-btn.close:hover{background:#ef44444d;color:#ef4444}.floating-panel-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.resize-handle{position:absolute;z-index:10}.resize-n,.resize-s{height:6px;left:8px;right:8px;cursor:ns-resize}.resize-e,.resize-w{width:6px;top:8px;bottom:8px;cursor:ew-resize}.resize-n{top:0}.resize-s{bottom:0}.resize-e{right:0}.resize-w{left:0}.resize-ne,.resize-nw,.resize-se,.resize-sw{width:12px;height:12px}.resize-ne{top:0;right:0;cursor:nesw-resize}.resize-nw{top:0;left:0;cursor:nwse-resize}.resize-se{bottom:0;right:0;cursor:nwse-resize}.resize-sw{bottom:0;left:0;cursor:nesw-resize}.floating-panel:hover .resize-handle{background:transparent}.floating-panel .resize-se:after{content:"";position:absolute;bottom:3px;right:3px;width:8px;height:8px;border-right:2px solid rgba(255,255,255,.2);border-bottom:2px solid rgba(255,255,255,.2);opacity:0;transition:opacity .15s ease}.floating-panel:hover .resize-se:after{opacity:1}@keyframes panel-appear{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.floating-panel{animation:panel-appear .2s ease}.confirm-modal-overlay{position:fixed;inset:0;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:1001;animation:confirmFadeIn .15s ease}@keyframes confirmFadeIn{0%{opacity:0}to{opacity:1}}.confirm-modal{background:#1a1a24;border-radius:12px;border:1px solid #2a2a3a;width:90%;max-width:400px;box-shadow:0 8px 32px #00000080;animation:confirmSlideUp .2s ease}@keyframes confirmSlideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.confirm-modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #2a2a3a}.confirm-modal-header h2{margin:0;font-size:1.1rem;font-weight:500;color:#fff}.confirm-modal-close{background:none;border:none;color:#666;font-size:1.5rem;cursor:pointer;padding:0;line-height:1;transition:color .15s ease}.confirm-modal-close:hover{color:#fff}.confirm-modal-content{padding:20px}.confirm-message{margin:0;font-size:.95rem;color:#e0e0e0;line-height:1.5}.confirm-warning{display:flex;align-items:flex-start;gap:10px;margin-top:16px;padding:12px;background:#fbbf241a;border:1px solid rgba(251,191,36,.3);border-radius:8px;font-size:.85rem;color:#fbbf24}.warning-icon{flex-shrink:0}.confirm-modal-actions{display:flex;justify-content:flex-end;gap:10px;padding:16px 20px;border-top:1px solid #2a2a3a;background:#22222e;border-radius:0 0 12px 12px}.confirm-btn{padding:10px 20px;border-radius:8px;font-size:.9rem;font-weight:500;cursor:pointer;transition:all .15s ease}.confirm-btn.cancel{background:#2a2a3a;border:1px solid #3a3a4a;color:#e0e0e0}.confirm-btn.cancel:hover{background:#3a3a4a;border-color:#4a4a5a}.confirm-btn.danger{background:#ef444433;border:1px solid #ef4444;color:#ef4444}.confirm-btn.danger:hover{background:#ef44444d}.confirm-btn.primary{background:#0ff3;border:1px solid #00ffff;color:#0ff}.confirm-btn.primary:hover{background:#00ffff4d}.compact-agent-card{position:relative;background:#22222ee6;border-radius:6px;padding:8px 10px;cursor:pointer;border-left:3px solid transparent;transition:all .15s ease;display:flex;flex-direction:column;gap:4px;min-width:0}.compact-agent-card:hover{background:#2a2a3a}.compact-agent-card.selected{background:#2a2a3a;box-shadow:0 0 0 1px #00ffff80}.compact-agent-card.attention{background:#2a2520f2;animation:attention-glow 2s ease-in-out infinite}.compact-agent-card.pinned{background:#282637f2}.card-header{display:flex;align-items:center;gap:6px;min-width:0}.status-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.compact-agent-card.working .status-dot{animation:pulse 1s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.agent-name{font-size:.75rem;font-weight:600;color:#fff;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:text}.rename-input{background:#0a0a0f;border:1px solid #00ffff;border-radius:3px;color:#fff;font-size:.75rem;font-weight:600;padding:1px 4px;flex:1;min-width:0;outline:none}.compact-agent-card .project-tag{font-size:.5rem;font-weight:600;padding:1px 4px;border-radius:3px;border:1px solid;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:60px;text-transform:uppercase;letter-spacing:.3px;flex-shrink:0}.card-activity{display:flex;align-items:center;gap:4px;min-width:0}.activity-emoji{font-size:.7rem;flex-shrink:0}.activity-text{font-size:.65rem;color:#aaa;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phase-tag{font-size:.6rem;flex-shrink:0}.time-tag{font-size:.6rem;color:#666;flex-shrink:0;margin-left:auto}.card-task{font-size:.6rem;color:#60a5fa;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-style:italic;opacity:.9;padding-left:12px}.card-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}.git-info{display:flex;align-items:center;gap:4px;font-size:.55rem;background:#00000040;border-radius:3px;padding:2px 5px;min-width:0;overflow:hidden}.git-branch{color:#a78bfa;font-family:SF Mono,Monaco,monospace;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px}.git-changes{display:flex;align-items:center;gap:2px;flex-shrink:0}.git-added{color:#4ade80}.git-removed{color:#f87171}.cost-tag{font-size:.55rem;font-weight:600;padding:2px 5px;border-radius:3px;background:#ffffff14;flex-shrink:0}.cost-tag.cost-low{color:#4ade80}.cost-tag.cost-medium{color:#fbbf24}.cost-tag.cost-high{color:#fb923c}.cost-tag.cost-very-high{color:#f87171}.card-actions{position:absolute;top:6px;right:6px;display:flex;align-items:center;gap:2px;opacity:0;transition:opacity .15s ease;z-index:10}.compact-agent-card:hover .card-actions,.compact-agent-card.pinned .card-actions,.compact-agent-card.selected .card-actions{opacity:1}.action-btn{padding:4px 6px;border-radius:4px;border:none;font-size:.65rem;cursor:pointer;transition:all .15s ease;background:#00000080;opacity:.7;line-height:1}.action-btn:hover{opacity:1;background:#000000b3}.action-btn.pin-btn{opacity:.5}.action-btn.pin-btn:hover,.action-btn.pin-btn.active{background:#fbbf244d;opacity:1}.action-btn.restart-btn{color:#4ade80}.action-btn.restart-btn:hover{background:#4ade804d}.action-btn.stop-btn{color:#ef4444}.action-btn.stop-btn:hover{background:#ef44444d}.compact-agent-card.task-completed{background:#223c28e6;animation:task-complete-glow 2s ease-in-out infinite}.compact-agent-card.task-completed .activity-text{color:#4ade80}@keyframes task-complete-glow{0%,to{box-shadow:0 0 #4ade8000}50%{box-shadow:0 0 8px 2px #4ade8040}}@keyframes attention-glow{0%,to{box-shadow:0 0 #fbbf2400}50%{box-shadow:0 0 8px 2px #fbbf2440}}.control-panel{display:flex;flex-direction:column;height:100%;overflow:hidden}.control-panel-header{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid rgba(255,255,255,.06)}.header-title{font-size:.8rem;font-weight:600;color:#0ff}.header-count{background:#0ff3;color:#0ff;padding:2px 8px;border-radius:8px;font-size:.65rem;font-weight:500}.header-working{background:#4ade8033;color:#4ade80;padding:2px 8px;border-radius:8px;font-size:.6rem;font-weight:500;margin-left:auto}.header-attention{background:#fbbf2433;color:#fbbf24;padding:2px 8px;border-radius:8px;font-size:.6rem;font-weight:500}.control-panel-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.filter-section{padding:8px 10px;border-bottom:1px solid rgba(255,255,255,.04);display:flex;flex-direction:column;gap:6px}.filter-pills{display:flex;flex-wrap:wrap;gap:4px}.filter-pill{padding:3px 8px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:12px;color:#888;font-size:.65rem;font-weight:500;cursor:pointer;transition:all .15s ease;display:flex;align-items:center;gap:4px}.filter-pill:hover:not(:disabled){background:#ffffff1a;color:#fff}.filter-pill:disabled{opacity:.4;cursor:not-allowed}.filter-pill.active{background:#00ffff26;border-color:#0ff6;color:#0ff}.filter-pill.working{border-color:#4ade804d}.filter-pill.working.active{background:#4ade8026;border-color:#4ade8080;color:#4ade80}.filter-pill.idle{border-color:#60a5fa4d}.filter-pill.idle.active{background:#60a5fa26;border-color:#60a5fa80;color:#60a5fa}.filter-pill.attention{border-color:#fbbf244d}.filter-pill.attention.active{background:#fbbf2426;border-color:#fbbf2480;color:#fbbf24}.filter-pill.offline{border-color:#6b72804d}.filter-pill.offline.active{background:#6b728026;border-color:#6b728080;color:#9ca3af}.pill-count{font-size:.6rem;opacity:.8}.search-input{width:100%;padding:6px 10px;background:#0000004d;border:1px solid rgba(255,255,255,.08);border-radius:6px;color:#fff;font-size:.75rem;outline:none}.search-input:focus{border-color:#0ff6}.search-input::placeholder{color:#555}.agents-list{flex:1;overflow-y:auto;padding:8px;display:grid;grid-template-columns:repeat(2,1fr);gap:6px;align-content:start}.agents-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center;color:#888;grid-column:span 2}.agents-empty .empty-icon{font-size:2rem;margin-bottom:8px;opacity:.5}.agents-empty .empty-hint{font-size:.7rem;color:#666;margin-top:4px}.spawn-section{padding:8px 10px;border-top:1px solid rgba(255,255,255,.06)}.new-agent-btn{width:100%;padding:10px;background:linear-gradient(135deg,#00888840,#0055aa40);border:1px solid rgba(0,136,136,.4);border-radius:6px;color:#0ff;font-size:.8rem;font-weight:500;cursor:pointer;transition:all .15s ease}.new-agent-btn:hover{background:linear-gradient(135deg,#00888859,#0055aa59);transform:translateY(-1px)}.spawn-form{display:flex;flex-direction:column;gap:8px}.spawn-form input{width:100%;padding:8px 12px;background:#0000004d;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fff;font-size:.8rem;outline:none}.spawn-form input:focus{border-color:#00ffff80}.spawn-form input::placeholder{color:#555}.worktree-options{display:flex;flex-direction:column;gap:6px;padding:6px 0}.worktree-checkbox{display:flex;align-items:center;gap:8px;font-size:.75rem;color:#a78bfa;cursor:pointer}.worktree-checkbox input{width:14px;height:14px;accent-color:#8b5cf6}.worktree-branch{padding:6px 10px!important;font-size:.75rem!important;border-color:#8b5cf64d!important;color:#a78bfa!important}.git-checking{font-size:.7rem;color:#666;font-style:italic}.spawn-buttons{display:flex;gap:8px;margin-top:4px}.spawn-btn{flex:1;padding:8px;background:#00888880;border:none;border-radius:6px;color:#fff;font-size:.8rem;font-weight:500;cursor:pointer;transition:all .15s ease}.spawn-btn:hover{background:#0aa9}.cancel-btn{padding:8px 16px;background:transparent;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:#888;font-size:.8rem;cursor:pointer;transition:all .15s ease}.cancel-btn:hover{background:#ffffff0d;color:#fff}.interactive-modal-backdrop{position:fixed;inset:0;background:#000c;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:1100}.interactive-modal{background:linear-gradient(135deg,#1a1a2e,#141428);border:1px solid #2a2a4a;border-radius:16px;padding:24px;width:90%;max-width:480px;box-shadow:0 20px 60px #00000080}.interactive-modal-header{text-align:center;margin-bottom:16px}.interactive-modal-header h3{margin:0 0 4px;font-size:1rem;font-weight:600;color:#fff}.interactive-modal-header p{margin:0;font-size:.8rem;color:#888}.interactive-modal-body label{display:flex;flex-direction:column;gap:8px;font-size:.8rem;color:#888}.interactive-modal-body textarea{width:100%;padding:12px;background:#0000004d;border:1px solid rgba(255,255,255,.1);border-radius:8px;color:#fff;font-size:.85rem;font-family:inherit;resize:vertical;min-height:100px;outline:none}.interactive-modal-body textarea:focus{border-color:#06b6d480}.interactive-modal-body textarea::placeholder{color:#555}.interactive-modal-actions{display:flex;gap:12px;margin-top:16px}.modal-cancel-btn{padding:10px 18px;background:transparent;border:1px solid rgba(255,255,255,.15);border-radius:8px;color:#888;font-size:.85rem;cursor:pointer;transition:all .15s ease}.modal-cancel-btn:hover{background:#ffffff0d;color:#fff}.modal-submit-btn{flex:1;padding:10px 18px;background:linear-gradient(135deg,#06b6d4,#0891b2);border:none;border-radius:8px;color:#fff;font-size:.85rem;font-weight:600;cursor:pointer;transition:all .15s ease}.modal-submit-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 6px 15px #06b6d44d}.modal-submit-btn:disabled{opacity:.5;cursor:not-allowed}.template-picker{position:relative;display:inline-flex}.template-picker-btn{width:32px;height:32px;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0d;color:#888;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s ease}.template-picker-btn:hover{background:#ffffff1a;color:#fff;border-color:#ffffff40}.template-picker-btn.active{background:#00ffff26;border-color:#0ff6;color:#0ff}.picker-icon{font-size:1rem;font-weight:600}.template-picker-dropdown{position:absolute;bottom:100%;left:0;margin-bottom:8px;width:280px;max-height:350px;background:#1a1a2e;border:1px solid rgba(255,255,255,.15);border-radius:10px;box-shadow:0 10px 40px #00000080;overflow:hidden;display:flex;flex-direction:column;animation:picker-slide-up .15s ease;z-index:1000}@keyframes picker-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.picker-header{padding:10px;border-bottom:1px solid rgba(255,255,255,.08)}.picker-search{width:100%;padding:8px 12px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fff;font-size:.85rem;outline:none;transition:border-color .15s ease}.picker-search::placeholder{color:#666}.picker-search:focus{border-color:#0ff6}.picker-list{flex:1;overflow-y:auto;padding:6px}.picker-empty{padding:20px;text-align:center;color:#666;display:flex;flex-direction:column;gap:10px;align-items:center}.picker-create-btn{padding:6px 14px;background:#00ffff1a;border:1px solid rgba(0,255,255,.3);border-radius:6px;color:#0ff;font-size:.75rem;cursor:pointer;transition:all .15s ease}.picker-create-btn:hover{background:#0ff3}.picker-group{margin-bottom:6px}.picker-group-header{padding:6px 10px;font-size:.65rem;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.picker-item{width:100%;display:flex;justify-content:space-between;align-items:center;padding:10px 12px;background:transparent;border:none;border-radius:6px;color:#fff;text-align:left;cursor:pointer;transition:background .1s ease}.picker-item:hover{background:#ffffff14}.picker-item-name{font-size:.85rem;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-item-shortcut{font-size:.7rem;color:#0ff;background:#00ffff1a;padding:2px 8px;border-radius:4px;margin-left:8px;flex-shrink:0}.picker-footer{padding:8px;border-top:1px solid rgba(255,255,255,.08)}.picker-manage-btn{width:100%;padding:8px;background:transparent;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#888;font-size:.75rem;cursor:pointer;transition:all .15s ease}.picker-manage-btn:hover{background:#ffffff0d;color:#fff;border-color:#fff3}.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility,.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.terminal-wrapper{width:100%;height:100%;position:relative;display:flex;flex-direction:column}.terminal-container{width:100%;flex:1;min-height:0;padding:8px;background:#1a1a2e;border-radius:8px 8px 0 0;overflow:hidden;outline:none}.terminal-toolbar{display:flex;align-items:center;gap:12px;padding:8px 12px;background:#1a1a2ef2;border-top:1px solid rgba(255,255,255,.08);border-radius:0 0 8px 8px}.toolbar-hint{font-size:.7rem;color:#666}.terminal-container:focus{outline:none}.terminal-container .xterm{height:100%}.terminal-container .xterm-viewport{overflow-y:auto!important}.terminal-container .xterm-screen{height:100%}.image-upload-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 32px;background:#1a1a2ef2;border:1px solid rgba(0,212,255,.3);border-radius:12px;color:#eaeaea;font-size:14px;z-index:10}.image-upload-spinner{width:24px;height:24px;border:2px solid rgba(0,212,255,.3);border-top-color:#00d4ff;border-radius:50%;animation:spin .8s linear infinite}.pending-image-container{position:absolute;bottom:16px;right:16px;width:200px;background:#1a1a2ef2;border:1px solid rgba(0,212,255,.4);border-radius:8px;overflow:hidden;z-index:10;box-shadow:0 4px 20px #0006}.pending-image-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;background:#00d4ff1a;border-bottom:1px solid rgba(0,212,255,.2)}.pending-image-label{font-size:11px;font-weight:500;color:#00d4ff;text-transform:uppercase;letter-spacing:.5px}.pending-image-close{background:none;border:none;color:#888;font-size:18px;cursor:pointer;padding:0;line-height:1;transition:color .15s}.pending-image-close:hover{color:#f55}.pending-image-preview{width:100%;height:auto;max-height:150px;object-fit:contain;background:#12121f;display:block}.pending-image-path{padding:8px 12px;font-size:10px;color:#888;font-family:Menlo,Monaco,Courier New,monospace;word-break:break-all;background:#0003}.pending-image-hint{padding:8px 12px;font-size:11px;color:#50fa7b;text-align:center;border-top:1px solid rgba(0,212,255,.1)}.template-manager-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.template-manager-modal{background:#1a1a24;border-radius:12px;border:1px solid #2a2a3a;width:90%;max-width:700px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #00000080}.template-manager-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #2a2a3a}.template-manager-header h2{margin:0;font-size:1.1rem;font-weight:500;color:#fff}.template-manager-close{background:none;border:none;color:#666;font-size:1.5rem;cursor:pointer;padding:0;line-height:1;transition:color .15s ease}.template-manager-close:hover{color:#fff}.template-manager-content{display:flex;flex:1;min-height:0;overflow:hidden}.template-tabs{display:flex;border-bottom:1px solid #2a2a3a;padding:0 16px}.template-tab{background:none;border:none;padding:12px 16px;color:#666;font-size:.85rem;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:all .15s ease;display:flex;align-items:center;gap:8px}.template-tab:hover:not(:disabled){color:#aaa}.template-tab.active{color:#0ff;border-bottom-color:#0ff}.template-tab:disabled{opacity:.5;cursor:not-allowed}.template-tab-count{background:#2a2a3a;padding:2px 6px;border-radius:10px;font-size:.7rem;color:#888}.template-tab.active .template-tab-count{background:#0883;color:#0ff}.template-loading{display:flex;align-items:center;justify-content:center;padding:40px;color:#666;font-size:.9rem;width:100%}.template-no-project{display:flex;align-items:center;justify-content:center;padding:40px;color:#555;font-size:.9rem;text-align:center;width:100%}.template-list-section{width:250px;border-right:1px solid #2a2a3a;display:flex;flex-direction:column}.template-list-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #2a2a3a;font-size:.85rem;color:#888}.template-add-btn{background:#0885;border:none;border-radius:4px;padding:4px 10px;color:#0ff;font-size:.75rem;cursor:pointer;transition:all .15s ease}.template-add-btn:hover:not(:disabled){background:#0aa;color:#fff}.template-add-btn:disabled{opacity:.5;cursor:not-allowed}.template-list{flex:1;overflow-y:auto;padding:8px}.template-list-empty{padding:20px 16px;text-align:center;color:#555;font-size:.85rem}.template-list-item{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease;margin-bottom:4px}.template-list-item:hover{background:#22222e}.template-list-item.active{background:#0883;border:1px solid #00888855}.template-item-info{display:flex;flex-direction:column;gap:2px;min-width:0}.template-item-name{font-size:.85rem;color:#e0e0e0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.template-item-shortcut{font-size:.7rem;color:#0ff8;font-family:SF Mono,Fira Code,monospace}.template-delete-btn{background:none;border:none;color:#666;font-size:1.1rem;cursor:pointer;padding:2px 6px;opacity:0;transition:all .15s ease}.template-list-item:hover .template-delete-btn{opacity:1}.template-delete-btn:hover{color:#ef4444}.template-form-section{flex:1;padding:16px 20px;overflow-y:auto}.template-form-section h3{margin:0 0 16px;font-size:1rem;font-weight:500;color:#fff}.template-form{display:flex;flex-direction:column;gap:16px}.form-group{display:flex;flex-direction:column;gap:6px}.form-group label{font-size:.8rem;color:#888}.form-group input,.form-group textarea{background:#0a0a0f;border:1px solid #2a2a3a;border-radius:6px;padding:10px 12px;font-size:.9rem;color:#fff;font-family:inherit;transition:border-color .15s ease}.form-group input:focus,.form-group textarea:focus{outline:none;border-color:#0ff5}.form-group input::placeholder,.form-group textarea::placeholder{color:#555}.form-group textarea{resize:vertical;min-height:120px;font-family:SF Mono,Fira Code,monospace;font-size:.85rem;line-height:1.5}.template-error{color:#ef4444;font-size:.8rem;padding:8px 12px;background:#ef44441a;border-radius:6px}.template-form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:8px}.template-cancel-btn{background:transparent;border:1px solid #333;border-radius:6px;padding:8px 16px;color:#888;font-size:.85rem;cursor:pointer;transition:all .15s ease}.template-cancel-btn:hover{border-color:#555;color:#fff}.template-save-btn{background:#0888;border:none;border-radius:6px;padding:8px 16px;color:#fff;font-size:.85rem;font-weight:500;cursor:pointer;transition:all .15s ease}.template-save-btn:hover{background:#0aa}.chat-panel{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;background:#1a1a24;position:relative}.chat-panel.empty{align-items:center;justify-content:center}.chat-empty-state{display:flex;flex-direction:column;align-items:center;gap:12px;color:#666}.chat-empty-icon{font-size:2rem;opacity:.5}.chat-header{padding:12px 16px;border-bottom:1px solid #2a2a3a;background:#22222e;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px}.chat-agent-info,.chat-header-right{display:flex;align-items:center;gap:8px}.chat-agent-color{width:10px;height:10px;border-radius:50%}.chat-agent-name{font-weight:500;color:#fff}.chat-agent-status{font-size:.75rem;padding:2px 8px;border-radius:10px;background:#333;color:#888}.chat-agent-status.working{background:#4ade8033;color:#4ade80}.chat-agent-status.needs_attention,.chat-agent-status.waiting{background:#fbbf2433;color:#fbbf24;animation:attention-pulse 1.5s ease-in-out infinite}.chat-agent-status.error{background:#ef444433;color:#ef4444}@keyframes attention-pulse{0%,to{background:#fbbf2433;box-shadow:0 0 #fbbf2400}50%{background:#fbbf2455;box-shadow:0 0 8px 2px #fbbf244d}}.chat-project-tag{font-size:.7rem;font-weight:600;padding:2px 8px;border-radius:4px;border:1px solid;text-transform:uppercase;letter-spacing:.3px;white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.chat-current-task{margin-top:6px;font-size:.75rem;color:#888;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-agent-cost{font-size:.75rem;font-weight:500;padding:2px 8px;border-radius:10px;cursor:help}.chat-agent-cost.cost-low{background:#4ade8026;color:#4ade80}.chat-agent-cost.cost-medium{background:#fbbf2426;color:#fbbf24}.chat-agent-cost.cost-high{background:#fb923c26;color:#fb923c}.chat-agent-cost.cost-very-high{background:#f8717126;color:#f87171}.terminal-view{flex:1;min-height:0;overflow:hidden;background:#1a1a2e}.terminal-empty{display:flex;align-items:center;justify-content:center;height:100%;color:#555;font-size:.85rem}.template-manager-btn{padding:4px 10px;font-size:.7rem;background:#222;border:1px solid #333;border-radius:6px;color:#888;cursor:pointer;transition:all .15s ease}.template-manager-btn:hover{background:#333;color:#fff;border-color:#444}.floating-chat-panel .floating-panel-content{display:flex;flex-direction:column}.floating-chat-panel .chat-panel{background:transparent;border:none;border-radius:0;height:100%}.floating-chat-panel .chat-panel.empty{height:100%}.floating-chat-header-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.floating-chat-header-info .agent-color-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.floating-chat-header-info .agent-name{font-size:.8rem;font-weight:500;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.floating-chat-header-info .agent-status{font-size:.65rem;padding:2px 6px;border-radius:4px;text-transform:capitalize;flex-shrink:0}.floating-chat-header-info .agent-status.idle{background:#60a5fa33;color:#60a5fa}.floating-chat-header-info .agent-status.working{background:#4ade8033;color:#4ade80}.floating-chat-header-info .agent-status.needs_attention,.floating-chat-header-info .agent-status.waiting{background:#fbbf2433;color:#fbbf24}.floating-chat-header-info .agent-status.stopped,.floating-chat-header-info .agent-status.offline{background:#6b728033;color:#6b7280}.floating-chat-header-info .agent-status.error{background:#ef444433;color:#ef4444}.floating-chat-panel .chat-header{background:linear-gradient(180deg,rgba(255,255,255,.02) 0%,transparent 100%);border-bottom:1px solid rgba(255,255,255,.06);padding:8px 12px}.floating-chat-panel .terminal-view{border-radius:0 0 8px 8px}.floating-chat-panel .chat-empty-state{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px}.floating-chat-panel .chat-empty-icon{font-size:3rem;margin-bottom:12px;opacity:.5}.project-state-panel{display:flex;flex-direction:column;height:100%;color:#e0e0e0;font-size:.85rem}.project-state-empty,.project-state-loading,.project-state-error{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:20px;text-align:center;color:#888}.empty-icon,.error-icon{font-size:2rem;margin-bottom:12px}.empty-hint{font-size:.75rem;color:#666;margin-top:4px}.loading-spinner{width:24px;height:24px;border:2px solid #333;border-top-color:#0ff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:12px}@keyframes spin{to{transform:rotate(360deg)}}.retry-btn{margin-top:12px;padding:6px 16px;background:#0ff2;border:1px solid #00ffff44;border-radius:6px;color:#0ff;cursor:pointer;font-size:.8rem;transition:all .15s ease}.retry-btn:hover{background:#0ff3;border-color:#0ff6}.state-tabs{display:flex;gap:4px;padding:8px;border-bottom:1px solid #2a2a3a;background:#0003}.state-tab{padding:6px 12px;background:transparent;border:none;border-radius:6px;color:#888;font-size:.8rem;cursor:pointer;transition:all .15s ease;display:flex;align-items:center;gap:6px}.state-tab:hover{background:#ffffff0d;color:#aaa}.state-tab.active{background:#00ffff1a;color:#0ff}.tab-badge{padding:2px 6px;border-radius:10px;font-size:.7rem;font-weight:600}.tab-badge.warning{background:#fa03;color:#fa0}.refresh-btn{margin-left:auto;padding:6px 10px;background:transparent;border:1px solid #333;border-radius:6px;color:#888;cursor:pointer;font-size:.85rem;transition:all .15s ease}.refresh-btn:hover:not(:disabled){background:#ffffff0d;color:#aaa;border-color:#444}.refresh-btn:disabled{opacity:.5;cursor:not-allowed}.state-content{flex:1;overflow-y:auto;padding:12px}.overview-tab{display:flex;flex-direction:column;gap:12px}.state-card{background:#0000004d;border:1px solid #2a2a3a;border-radius:8px;overflow:hidden}.card-header{display:flex;align-items:center;gap:8px;padding:10px 12px;background:#0003;border-bottom:1px solid #2a2a3a}.card-icon{font-size:1rem}.card-title{font-weight:600;color:#fff;font-size:.85rem}.card-content{padding:12px}.branch-info{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.branch-name{font-family:SF Mono,Consolas,monospace;font-size:.85rem;color:#fff}.sync-badge{padding:3px 8px;border-radius:12px;font-size:.7rem;font-weight:600;text-transform:uppercase}.sync-badge.success{background:#00c86433;color:#00c864}.sync-badge.info{background:#00c8ff33;color:#00c8ff}.sync-badge.warning{background:#fa03;color:#fa0}.sync-badge.error{background:#ff505033;color:#ff5050}.sync-badge.neutral{background:#80808033;color:#888}.sync-details{display:flex;gap:12px;font-size:.75rem;color:#888;margin-bottom:8px}.sync-details .ahead{color:#00c8ff}.sync-details .behind{color:#fa0}.uncommitted-changes{margin-bottom:8px}.warning-text{color:#fa0;font-size:.8rem}.last-commit{display:flex;flex-direction:column;gap:4px;padding-top:8px;border-top:1px solid #2a2a3a}.commit-sha{font-family:SF Mono,Consolas,monospace;font-size:.75rem;color:#888}.commit-message{font-size:.8rem;color:#aaa;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.health-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.health-item{display:flex;flex-direction:column;align-items:center;padding:12px;background:#0003;border-radius:8px;border:1px solid #2a2a3a}.health-item.warning{border-color:#fa04;background:#ffaa000d}.health-value{font-size:1.5rem;font-weight:700;color:#fff}.health-item.warning .health-value{color:#fa0}.health-label{font-size:.7rem;color:#888;text-transform:uppercase;margin-top:4px}.worktrees-tab{display:flex;flex-direction:column;gap:12px}.cleanup-banner{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:#ffaa001a;border:1px solid #ffaa0044;border-radius:8px}.cleanup-btn{padding:6px 12px;background:#fa02;border:1px solid #ffaa0044;border-radius:6px;color:#fa0;font-size:.75rem;font-weight:600;cursor:pointer;transition:all .15s ease}.cleanup-btn:hover:not(:disabled){background:#fa03;border-color:#fa06}.cleanup-btn:disabled{opacity:.6;cursor:not-allowed}.worktrees-list,.tmux-list{display:flex;flex-direction:column;gap:8px}.empty-list{text-align:center;padding:20px;color:#666;font-size:.8rem}.worktree-item,.tmux-item{padding:10px 12px;background:#0000004d;border:1px solid #2a2a3a;border-radius:8px;transition:all .15s ease}.worktree-item:hover,.tmux-item:hover{background:#0006;border-color:#3a3a4a}.worktree-item.main{border-color:#0ff3;background:#00ffff0d}.worktree-item.orphaned{border-color:#fa04;background:#ffaa000d}.tmux-item.offline{opacity:.6}.worktree-header,.tmux-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.worktree-branch,.tmux-name{font-weight:600;font-size:.85rem;color:#fff}.main-badge,.orphaned-badge,.attached-badge{padding:2px 6px;border-radius:10px;font-size:.65rem;font-weight:600;text-transform:uppercase}.main-badge{background:#0ff3;color:#0ff}.orphaned-badge{background:#fa03;color:#fa0}.attached-badge{background:#64c86433;color:#64c864}.worktree-details{display:flex;align-items:center;justify-content:space-between;font-size:.75rem;color:#888;margin-bottom:4px}.worktree-path,.cwd-path{font-family:SF Mono,Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.worktree-commit{font-family:SF Mono,Consolas,monospace;color:#666}.worktree-agent,.tmux-agent{display:flex;align-items:center;gap:6px;font-size:.8rem;color:#0ff}.agent-indicator{font-size:.7rem}.tmux-tab{display:flex;flex-direction:column;gap:8px}.tmux-status{font-size:.75rem}.tmux-status.active{color:#64c864}.tmux-status.offline{color:#888}.tmux-cwd{font-size:.75rem;color:#888;margin-top:4px}.tmux-meta{display:flex;gap:6px;margin-top:6px}.project-state-panel-floating .floating-panel-content{padding:0}.kanban-editor-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:2000}.kanban-editor{background:#141423fa;border:1px solid rgba(255,255,255,.12);border-radius:12px;width:420px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 12px 48px #00000080}.kanban-editor.expanded{width:900px;max-height:85vh}.kanban-editor-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.08);flex-shrink:0}.kanban-editor-header h3{font-size:14px;font-weight:600;color:#ffffffe6;margin:0}.kanban-editor-close{background:none;border:none;color:#fff6;cursor:pointer;font-size:16px;padding:2px 6px;border-radius:4px}.kanban-editor-close:hover{color:#fffc;background:#ffffff14}.kanban-editor-layout{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.kanban-editor-layout.two-panel{flex-direction:row}.kanban-editor-left-panel{flex:0 0 420px;min-width:0;display:flex;flex-direction:column;min-height:0;overflow:hidden}.kanban-editor-layout.two-panel .kanban-editor-left-panel{border-right:1px solid rgba(255,255,255,.08)}.kanban-editor-right-panel{flex:1;min-width:0;display:flex;flex-direction:column;max-height:calc(85vh - 52px)}.kanban-editor-body{padding:14px 16px;display:flex;flex-direction:column;gap:12px;flex:1;overflow-y:auto;min-height:0}.kanban-editor-label{display:flex;flex-direction:column;gap:4px;font-size:11px;font-weight:500;color:#ffffff80}.kanban-editor-input,.kanban-editor-textarea,.kanban-editor-select{background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#ffffffe6;font-size:13px;padding:8px 10px;outline:none;transition:border-color .15s;font-family:inherit}.kanban-editor-input:focus,.kanban-editor-textarea:focus,.kanban-editor-select:focus{border-color:#60a5fa80}.kanban-editor-textarea{resize:vertical;min-height:60px}.kanban-editor-select{cursor:pointer}.kanban-editor-select option{background:#1a1a2e;color:#fff}.kanban-editor-row{display:flex;gap:12px}.kanban-editor-row .kanban-editor-label{flex:1}.kanban-editor-footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid rgba(255,255,255,.08);flex-shrink:0}.kanban-editor-btn{padding:7px 16px;border-radius:6px;font-size:12px;font-weight:500;cursor:pointer;transition:all .15s;border:none}.kanban-editor-btn.cancel{background:#ffffff0f;color:#fff9}.kanban-editor-btn.cancel:hover{background:#ffffff1a;color:#fffc}.kanban-editor-btn.save{background:#60a5fa33;color:#60a5fa;border:1px solid rgba(96,165,250,.3)}.kanban-editor-btn.save:hover{background:#60a5fa4d}.kanban-editor-btn.save:disabled{opacity:.4;cursor:not-allowed}.kanban-editor-btn.ship{background:#4ade8026;color:#4ade80;border:1px solid rgba(74,222,128,.3)}.kanban-editor-btn.ship:hover{background:#4ade8040}.kanban-editor-btn.request-changes{background:#fbbf2426;color:#fbbf24;border:1px solid rgba(251,191,36,.3)}.kanban-editor-btn.request-changes:hover:not(:disabled){background:#fbbf2440}.kanban-editor-btn.request-changes:disabled{opacity:.4;cursor:not-allowed}.plan-file-tabs{display:flex;gap:2px;padding:8px 12px;border-bottom:1px solid rgba(255,255,255,.08);flex-shrink:0}.plan-file-tab{padding:5px 12px;border:none;background:#ffffff0a;color:#ffffff80;font-size:11px;font-weight:500;border-radius:4px;cursor:pointer;transition:all .15s}.plan-file-tab:hover{background:#ffffff14;color:#ffffffb3}.plan-file-tab.active{background:#60a5fa26;color:#60a5fa}.plan-file-tabs-empty{font-size:11px;color:#ffffff4d;padding:5px 0}.plan-file-content{flex:1;overflow-y:auto;padding:12px;min-height:0}.plan-file-placeholder,.plan-file-loading{color:#ffffff4d;font-size:12px;text-align:center;padding:40px 16px}.plan-file-text{font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:11px;line-height:1.5;color:#fffc;white-space:pre-wrap;word-break:break-word;margin:0}.pipeline-log{background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:6px;padding:8px 10px}.pipeline-log-header{font-size:10px;font-weight:600;color:#fff6;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.pipeline-log-entry{display:flex;align-items:baseline;gap:6px;padding:3px 0;font-size:11px;line-height:1.4}.pipeline-log-phase{color:#60a5facc;font-weight:500;flex-shrink:0;text-transform:capitalize}.pipeline-log-summary{color:#fff9;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pipeline-log-time{color:#ffffff40;flex-shrink:0;font-size:10px}.plan-file-markdown{font-size:13px;line-height:1.6;color:#fffc}.plan-file-markdown h1{font-size:16px;font-weight:700;color:#fffffff2;margin:0 0 8px;padding-bottom:6px;border-bottom:1px solid rgba(255,255,255,.1)}.plan-file-markdown h2{font-size:14px;font-weight:600;color:#ffffffe6;margin:16px 0 6px;padding-bottom:4px;border-bottom:1px solid rgba(255,255,255,.06)}.plan-file-markdown h3{font-size:13px;font-weight:600;color:#ffffffd9;margin:12px 0 4px}.plan-file-markdown h4{font-size:12px;font-weight:600;color:#fffc;margin:10px 0 4px}.plan-file-markdown p{margin:0 0 10px}.plan-file-markdown ul,.plan-file-markdown ol{margin:0 0 10px;padding-left:20px}.plan-file-markdown li{margin-bottom:4px}.plan-file-markdown li>ul,.plan-file-markdown li>ol{margin-top:4px;margin-bottom:0}.plan-file-markdown pre{background:#0000004d;border-radius:6px;padding:10px 12px;overflow-x:auto;margin:0 0 10px}.plan-file-markdown pre code{font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:11px;line-height:1.5;color:#ffffffd9;background:none;padding:0;border-radius:0}.plan-file-markdown code{font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:11px;background:#ffffff14;padding:1px 5px;border-radius:3px;color:#ffffffe6}.plan-file-markdown table{width:100%;border-collapse:collapse;margin:0 0 10px;font-size:12px}.plan-file-markdown th{background:#ffffff0f;font-weight:600;color:#ffffffd9;text-align:left;padding:6px 8px;border:1px solid rgba(255,255,255,.08)}.plan-file-markdown td{padding:5px 8px;border:1px solid rgba(255,255,255,.06);color:#ffffffb3}.plan-file-markdown tr:nth-child(2n) td{background:#ffffff05}.plan-file-markdown blockquote{margin:0 0 10px;padding:6px 12px;border-left:3px solid rgba(96,165,250,.4);color:#fff9}.plan-file-markdown strong{font-weight:600;color:#fffffff2}.plan-file-markdown em{font-style:italic}.plan-file-markdown a{color:#60a5fa;text-decoration:none}.plan-file-markdown a:hover{text-decoration:underline}.plan-file-markdown hr{border:none;border-top:1px solid rgba(255,255,255,.08);margin:12px 0}.plan-file-markdown img{max-width:100%;border-radius:4px}.pipeline-info{background:#a78bfa0d;border:1px solid rgba(167,139,250,.12);border-radius:6px;padding:8px 10px}.pipeline-info-header{font-size:10px;font-weight:600;color:#fff6;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.pipeline-info-row{display:flex;align-items:center;gap:6px;padding:3px 0;font-size:11px}.pipeline-info-label{color:#fff6;font-weight:500;flex-shrink:0;width:60px}.pipeline-info-value{color:#a78bfad9;font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:10px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pipeline-info-copy{background:none;border:none;color:#ffffff4d;cursor:pointer;font-size:12px;padding:2px 4px;border-radius:3px;flex-shrink:0;transition:all .15s}.pipeline-info-copy:hover{color:#ffffffb3;background:#ffffff14}.worktree-status-badge{display:flex;align-items:center;gap:5px;font-size:11px;color:#fff9}.worktree-status-dot{width:7px;height:7px;border-radius:50%;display:inline-block}.worktree-status-dot.active{background:#4ade80}.worktree-status-dot.cleaned{background:#6b7280}.pipeline-cleanup-section{margin-top:8px;padding-top:8px;border-top:1px solid rgba(255,255,255,.06)}.pipeline-cleanup-btn{background:#f59e0b1a;border:1px solid rgba(245,158,11,.2);border-radius:6px;color:#f59e0be6;font-size:11px;padding:5px 10px;cursor:pointer;width:100%;transition:all .15s}.pipeline-cleanup-btn:hover{background:#f59e0b2e;border-color:#f59e0b59}.pipeline-cleanup-confirm{padding:8px;background:#f59e0b0f;border:1px solid rgba(245,158,11,.15);border-radius:6px}.pipeline-cleanup-warning{font-size:11px;color:#f59e0be6;line-height:1.4;margin-bottom:8px}.pipeline-cleanup-checkbox{display:flex;align-items:center;gap:6px;font-size:11px;color:#fff9;cursor:pointer;margin-bottom:8px}.pipeline-cleanup-checkbox input[type=checkbox]{width:13px;height:13px;cursor:pointer}.pipeline-cleanup-actions{display:flex;gap:6px;justify-content:flex-end}.pipeline-cleanup-cancel{background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:#fff9;font-size:11px;padding:4px 10px;cursor:pointer}.pipeline-cleanup-cancel:hover{background:#ffffff1a;color:#fffc}.pipeline-cleanup-delete{background:#ef444426;border:1px solid rgba(239,68,68,.3);border-radius:4px;color:#ef4444;font-size:11px;padding:4px 10px;cursor:pointer}.pipeline-cleanup-delete:hover{background:#ef444440}.pipeline-cleanup-delete:disabled{opacity:.5;cursor:not-allowed}.kanban-ship-actions{display:flex;align-items:center;gap:6px;margin-right:auto}.ship-branch-selector{display:flex;align-items:center;gap:4px}.ship-branch-selector label{font-size:10px;color:#fff6;white-space:nowrap}.ship-branch-select{background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:#fffc;font-size:11px;padding:4px 6px;outline:none;max-width:160px;font-family:SF Mono,Fira Code,Cascadia Code,monospace}.ship-branch-select:focus{border-color:#4ade8066}.ship-branch-select option{background:#1a1a2e;color:#fff}.plan-json-viewer{display:flex;flex-direction:column;gap:10px}.plan-json-header{background:#60a5fa14;border:1px solid rgba(96,165,250,.15);border-radius:6px;padding:10px 12px}.plan-json-title{font-size:14px;font-weight:600;color:#ffffffe6;margin-bottom:4px}.plan-json-summary{font-size:12px;color:#fff9;line-height:1.5}.plan-json-meta{font-size:11px;color:#60a5facc;margin-top:6px;font-weight:500}.kanban-editor.drag-over{border-color:#60a5fa80;box-shadow:0 12px 48px #00000080,0 0 0 2px #60a5fa33}.image-attachments-section{display:flex;flex-direction:column;gap:6px}.image-attachments-header{display:flex;align-items:center;gap:8px}.image-count-badge{font-size:10px;font-weight:500;color:#60a5fae6;background:#60a5fa1f;padding:1px 8px;border-radius:10px}.image-drop-zone{border:1.5px dashed rgba(255,255,255,.15);border-radius:6px;padding:14px;display:flex;align-items:center;justify-content:center;min-height:48px;cursor:pointer;transition:all .15s;background:#ffffff05}.image-drop-zone:hover{border-color:#ffffff40;background:#ffffff0a}.image-drop-zone.drag-over{border-color:#60a5fa99;background:#60a5fa14}.image-drop-zone-text{font-size:11px;color:#ffffff59;-webkit-user-select:none;user-select:none}.image-upload-error{font-size:11px;color:#ef4444;padding:4px 0}.image-preview-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:8px}.image-preview-item{position:relative;border:1px solid rgba(255,255,255,.08);border-radius:6px;overflow:hidden;background:#ffffff08}.image-preview-item img{width:100%;height:72px;object-fit:cover;display:block}.image-preview-icon-fallback{position:absolute;top:0;left:0;width:100%;height:72px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:#ffffff4d;background:#ffffff08;z-index:0}.image-preview-item img[style*="display: none"]+.image-preview-icon-fallback{z-index:1}.image-preview-remove{position:absolute;top:3px;right:3px;width:18px;height:18px;border-radius:50%;background:#000000b3;border:none;color:#fffc;font-size:10px;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s;z-index:2}.image-preview-item:hover .image-preview-remove{opacity:1}.image-preview-remove:hover{background:#ef4444cc;color:#fff}.image-preview-info{padding:4px 6px;display:flex;flex-direction:column;gap:1px}.image-preview-name{font-size:10px;color:#fff9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.image-preview-size{font-size:9px;color:#ffffff4d}.image-preview-item.uploading{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100px}.image-upload-spinner{width:20px;height:20px;border:2px solid rgba(255,255,255,.1);border-top-color:#60a5fab3;border-radius:50%;animation:image-spin .6s linear infinite}@keyframes image-spin{to{transform:rotate(360deg)}}.kanban-panel{display:flex;flex-direction:column;height:100%;overflow:hidden}.kanban-toolbar{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid rgba(255,255,255,.06);flex-shrink:0}.kanban-add-btn{background:#ffffff14;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fffc;padding:5px 12px;font-size:12px;cursor:pointer;transition:all .15s}.kanban-add-btn:hover{background:#ffffff1f;color:#fff}.kanban-empty-state{display:flex;align-items:center;justify-content:center;height:100%;color:#fff6;font-size:13px}.kanban-columns{display:flex;gap:8px;padding:8px;overflow-x:auto;overflow-y:hidden;flex:1;min-height:0}.kanban-columns::-webkit-scrollbar{height:6px}.kanban-columns::-webkit-scrollbar-track{background:#ffffff05}.kanban-columns::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:3px}.kanban-column{display:flex;flex-direction:column;min-width:180px;max-width:240px;flex:1;background:#ffffff05;border-radius:8px;border:1px solid rgba(255,255,255,.04);transition:border-color .2s}.kanban-column.drag-over{border-color:#ffffff26;background:#ffffff0a}.kanban-column-header{display:flex;align-items:center;gap:6px;padding:8px 10px;flex-shrink:0;position:relative}.kanban-column-color-bar{position:absolute;top:0;left:0;right:0;height:2px;border-radius:8px 8px 0 0}.kanban-column-icon{font-size:12px}.kanban-column-title{font-size:11px;font-weight:600;color:#ffffffb3;text-transform:uppercase;letter-spacing:.5px}.kanban-column-count{margin-left:auto;font-size:10px;color:#fff6;background:#ffffff0f;padding:1px 6px;border-radius:8px}.kanban-column-content{flex:1;overflow-y:auto;padding:4px 6px 6px;display:flex;flex-direction:column;gap:6px;min-height:40px}.kanban-column-content::-webkit-scrollbar{width:4px}.kanban-column-content::-webkit-scrollbar-thumb{background:#ffffff14;border-radius:2px}.kanban-column-empty{display:flex;align-items:center;justify-content:center;height:60px;color:#fff3;font-size:11px;border:1px dashed rgba(255,255,255,.08);border-radius:6px}.kanban-task-card{background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:8px 10px;cursor:grab;transition:all .15s;touch-action:none}.kanban-task-card:hover{background:#ffffff0f;border-color:#ffffff1f}.kanban-task-card.dragging{opacity:.4}.kanban-task-card.drag-overlay{background:#1e1e32f2;border:1px solid rgba(255,255,255,.15);box-shadow:0 8px 32px #0006;cursor:grabbing}.kanban-task-header{display:flex;align-items:flex-start;gap:6px}.kanban-task-title{font-size:12px;font-weight:500;color:#ffffffe6;flex:1;line-height:1.3;word-break:break-word}.kanban-task-priority{width:8px;height:8px;border-radius:50%;flex-shrink:0;margin-top:3px}.kanban-task-desc{font-size:11px;color:#ffffff73;margin:4px 0 0;line-height:1.4}.kanban-task-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}.kanban-task-tag{font-size:9px;background:#ffffff0f;color:#ffffff80;padding:1px 6px;border-radius:4px}.kanban-task-footer{display:flex;align-items:center;justify-content:space-between;margin-top:6px}.kanban-task-meta{display:flex;align-items:center;gap:6px}.kanban-task-agent{display:flex;align-items:center;gap:4px;font-size:10px;color:#ffffff80}.kanban-task-agent .agent-dot{width:6px;height:6px;border-radius:50%;background:#6b7280}.kanban-task-agent .agent-dot.working{background:#4ade80}.kanban-task-agent .agent-dot.idle{background:#60a5fa}.kanban-task-agent .agent-dot.needs_attention{background:#fbbf24}.kanban-task-agent .agent-dot.error{background:#ef4444}.kanban-task-review{font-size:12px}.kanban-task-actions{display:flex;gap:2px;opacity:0;transition:opacity .15s}.kanban-task-card:hover .kanban-task-actions{opacity:1}.kanban-task-action-btn{background:none;border:none;color:#fff6;cursor:pointer;font-size:11px;padding:2px 4px;border-radius:4px;transition:all .15s}.kanban-task-action-btn:hover{color:#fffc;background:#ffffff14}.kanban-task-action-btn.delete:hover{color:#ef4444}.kanban-task-action-btn.kanban-task-plan-btn:hover{color:#60a5fa;background:#60a5fa1f}.kanban-task-feedback{margin-top:6px;padding:4px 8px;border-radius:4px;font-size:10px;line-height:1.3}.kanban-task-feedback.passed{background:#4ade801a;color:#4ade80cc;border:1px solid rgba(74,222,128,.15)}.kanban-task-feedback.failed{background:#ef44441a;color:#ef4444cc;border:1px solid rgba(239,68,68,.15)}.kanban-task-feedback.pending{background:#22d3d81a;color:#22d3d8cc;border:1px solid rgba(34,211,216,.15)}.kanban-task-notes{margin-top:6px;padding:4px 8px;border-radius:4px;font-size:10px;background:#fbbf241a;color:#fbbf24cc;border:1px solid rgba(251,191,36,.15);line-height:1.3}.kanban-assign-overlay{position:fixed;inset:0;z-index:1000}.kanban-assign-dropdown{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#141423fa;border:1px solid rgba(255,255,255,.12);border-radius:8px;padding:4px;min-width:200px;box-shadow:0 8px 32px #00000080}.kanban-assign-header{font-size:11px;font-weight:600;color:#fff9;padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.06);margin-bottom:2px}.kanban-assign-option{display:flex;align-items:center;gap:8px;width:100%;background:none;border:none;color:#fffc;font-size:12px;padding:6px 8px;border-radius:4px;cursor:pointer;text-align:left}.kanban-assign-option:hover{background:#ffffff14}.kanban-assign-option .agent-dot{width:8px;height:8px;border-radius:50%;background:#6b7280}.kanban-task-branch{display:flex;align-items:center;gap:4px;margin-top:4px;padding:2px 6px;background:#a78bfa14;border:1px solid rgba(167,139,250,.15);border-radius:4px;font-size:9px;color:#a78bfacc;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:SF Mono,Fira Code,Cascadia Code,monospace}.kanban-task-branch-icon{font-size:10px;flex-shrink:0}.kanban-task-worktree-path{cursor:pointer;max-width:100%}.kanban-task-worktree-path:hover{background:#a78bfa26;color:#a78bfa}.kanban-pipeline-status{display:flex;align-items:center;gap:4px;margin-top:6px;padding:4px 6px;background:#60a5fa0f;border:1px solid rgba(96,165,250,.1);border-radius:6px}.kanban-pipeline-status.failed{background:#ef44440f;border-color:#ef44441a}.pipeline-phase{display:flex;align-items:center;gap:2px;font-size:10px;color:#ffffff4d;position:relative}.pipeline-phase.completed{color:#4ade80b3}.pipeline-phase.running{color:#60a5fae6}.pipeline-phase.failed{color:#ef4444cc}.pipeline-phase-icon{font-size:11px;line-height:1}.pipeline-spinner{width:8px;height:8px;border:1.5px solid rgba(96,165,250,.3);border-top-color:#60a5fae6;border-radius:50%;animation:pipeline-spin .8s linear infinite}@keyframes pipeline-spin{to{transform:rotate(360deg)}}.pipeline-error-hint{font-size:10px;font-weight:700;color:#ef4444;margin-left:2px}.kanban-task-cancel-pipeline-btn:hover{color:#ef4444!important;background:#ef44441f!important}.kanban-task-cleanup-btn{font-size:10px!important}.kanban-task-cleanup-btn:hover{color:#f59e0b!important;background:#f59e0b1f!important}.worktree-cleanup-confirm{margin-top:6px;padding:8px;background:#f59e0b0f;border:1px solid rgba(245,158,11,.15);border-radius:6px}.worktree-cleanup-warning{font-size:10px;color:#f59e0be6;line-height:1.4;margin-bottom:6px}.worktree-cleanup-checkbox{display:flex;align-items:center;gap:6px;font-size:10px;color:#fff9;cursor:pointer;margin-bottom:6px}.worktree-cleanup-checkbox input[type=checkbox]{width:12px;height:12px;cursor:pointer}.worktree-cleanup-actions{display:flex;gap:6px;justify-content:flex-end}.worktree-cleanup-cancel{background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:4px;color:#fff9;font-size:10px;padding:3px 8px;cursor:pointer}.worktree-cleanup-cancel:hover{background:#ffffff1a;color:#fffc}.worktree-cleanup-confirm-btn{background:#ef444426;border:1px solid rgba(239,68,68,.3);border-radius:4px;color:#ef4444;font-size:10px;padding:3px 8px;cursor:pointer}.worktree-cleanup-confirm-btn:hover{background:#ef444440}.worktree-cleanup-confirm-btn:disabled{opacity:.5;cursor:not-allowed}.kanban-panel-floating{z-index:100}.kanban-panel-floating .floating-panel-content{padding:0}.kanban-panel-floating .kanban-panel{border-radius:0;background:transparent}.project-settings-overlay{position:fixed;inset:0;background:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000}.project-settings-modal{background:#1a1a24;border:1px solid rgba(255,255,255,.1);border-radius:12px;width:90%;max-width:480px;max-height:90vh;overflow-y:auto;box-shadow:0 8px 32px #00000080}.project-settings-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid rgba(255,255,255,.1)}.project-settings-header h2{margin:0;font-size:18px;font-weight:600;color:#fff}.project-settings-header .close-btn{background:none;border:none;color:#ffffff80;font-size:24px;cursor:pointer;padding:0;line-height:1}.project-settings-header .close-btn:hover{color:#fff}.project-settings-modal form{padding:20px}.project-settings-error{background:#ef44441a;border:1px solid rgba(239,68,68,.3);border-radius:6px;padding:10px 12px;color:#ef4444;font-size:13px;margin-bottom:16px}.project-settings-field{margin-bottom:20px}.project-settings-field label{display:block;font-size:13px;font-weight:500;color:#ffffffb3;margin-bottom:6px}.project-settings-field input[type=text]{width:100%;padding:10px 12px;background:#0000004d;border:1px solid rgba(255,255,255,.1);border-radius:8px;color:#fff;font-size:14px;font-family:inherit;transition:border-color .15s ease}.project-settings-field input[type=text]:focus{outline:none;border-color:#0ff}.project-settings-field input[type=text]::placeholder{color:#ffffff4d}.field-hint{display:block;margin-top:4px;font-size:11px;color:#fff6}.path-input-row{display:flex;gap:8px}.path-input-row input[type=text]{flex:1}.browse-btn{padding:10px 16px;background:#ffffff0d;border:1px solid rgba(255,255,255,.15);border-radius:8px;color:#fffc;font-size:13px;font-weight:500;cursor:pointer;transition:all .15s ease;white-space:nowrap}.browse-btn:hover:not(:disabled){background:#ffffff1a;border-color:#ffffff40;color:#fff}.browse-btn:disabled{opacity:.5;cursor:wait}.checkbox-field label{display:flex;align-items:center;gap:8px;cursor:pointer}.checkbox-field input[type=checkbox]{width:16px;height:16px;accent-color:#00ffff}.theme-picker{display:flex;gap:8px;flex-wrap:wrap}.theme-option{display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px;background:#0003;border:2px solid rgba(255,255,255,.1);border-radius:8px;cursor:pointer;transition:all .15s ease;min-width:70px}.theme-option:hover{background:#0000004d;border-color:#fff3}.theme-option.selected{border-color:var(--theme-accent);box-shadow:0 0 12px rgba(var(--theme-accent-rgb, 0, 255, 255),.3)}.theme-preview{width:36px;height:36px;background:var(--theme-bg);border-radius:6px;display:flex;align-items:center;justify-content:center}.theme-preview-hex{width:20px;height:20px;background:var(--theme-grid);clip-path:polygon(50% 0%,100% 25%,100% 75%,50% 100%,0% 75%,0% 25%);border:1px solid var(--theme-accent)}.theme-name{font-size:11px;color:#fff9}.theme-option.selected .theme-name{color:var(--theme-accent)}.theme-preview-full{background:var(--preview-bg);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:16px;margin-bottom:20px;position:relative}.preview-hex-grid{width:100%;height:60px}.preview-hex-grid svg{width:100%;height:100%}.preview-label{position:absolute;bottom:4px;right:8px;font-size:10px;color:#ffffff4d;text-transform:uppercase;letter-spacing:.5px}.project-settings-actions{display:flex;gap:12px;justify-content:flex-end;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.1)}.project-settings-actions button{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:all .15s ease}.cancel-btn{background:#ffffff0d;border:1px solid rgba(255,255,255,.1);color:#ffffffb3}.cancel-btn:hover{background:#ffffff1a;color:#fff}.save-btn{background:linear-gradient(135deg,#0ff,#0cc);border:none;color:#000}.save-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 12px #00ffff4d}.save-btn:disabled{opacity:.5;cursor:not-allowed}.theme-option.custom-option{border-style:dashed}.theme-option.custom-option .theme-preview-hex{background:linear-gradient(135deg,var(--theme-grid) 0%,var(--theme-accent) 100%)}.custom-colors{margin-top:12px;padding:12px;background:#0003;border-radius:8px;display:flex;flex-direction:column;gap:10px}.color-picker-row{display:flex;align-items:center;gap:10px}.color-picker-row label{width:80px;font-size:12px;color:#fff9;margin-bottom:0}.color-picker-row input[type=color]{width:36px;height:28px;padding:0;border:none;border-radius:4px;cursor:pointer;background:transparent}.color-picker-row input[type=color]::-webkit-color-swatch-wrapper{padding:2px}.color-picker-row input[type=color]::-webkit-color-swatch{border-radius:4px;border:1px solid rgba(255,255,255,.2)}.color-text-input{flex:1;padding:6px 10px!important;font-family:monospace!important;font-size:12px!important;text-transform:lowercase}.claude-settings-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.claude-settings-modal{background:#1a1a24;border-radius:12px;border:1px solid #2a2a3a;width:90%;max-width:600px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #00000080}.claude-settings-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #2a2a3a}.claude-settings-header h2{margin:0;font-size:1.1rem;font-weight:500;color:#fff;display:flex;align-items:center;gap:8px}.claude-settings-icon{font-size:1.2rem;color:#0ff}.claude-settings-close{background:none;border:none;color:#666;font-size:1.5rem;cursor:pointer;padding:0;line-height:1;transition:color .15s ease}.claude-settings-close:hover{color:#fff}.claude-settings-content{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:16px}.claude-settings-loading{text-align:center;color:#666;padding:40px}.claude-settings-section-header{display:flex;justify-content:space-between;align-items:center;font-size:.85rem;color:#888;margin-bottom:4px}.claude-settings-preset-btn{background:linear-gradient(135deg,#7c3aed,#2563eb);border:none;border-radius:4px;padding:6px 12px;color:#fff;font-size:.75rem;font-weight:500;cursor:pointer;transition:all .15s ease}.claude-settings-preset-btn:hover{background:linear-gradient(135deg,#8b5cf6,#3b82f6);transform:translateY(-1px)}.claude-settings-list{display:flex;flex-direction:column;gap:8px}.claude-settings-list-header{display:grid;grid-template-columns:1fr 1.5fr 60px;gap:12px;padding:0 4px 8px;font-size:.75rem;color:#666;text-transform:uppercase;letter-spacing:.5px}.claude-settings-empty{text-align:center;color:#555;padding:24px;font-size:.9rem}.claude-settings-row{display:grid;grid-template-columns:1fr 1.5fr 60px;gap:12px;align-items:center}.claude-settings-key-input{background:#0a0a0f;border:1px solid #2a2a3a;border-radius:6px;padding:10px 12px;font-size:.85rem;color:#0ff;font-family:SF Mono,Fira Code,monospace;transition:border-color .15s ease}.claude-settings-key-input:focus{outline:none;border-color:#0ff5}.claude-settings-key-input::placeholder{color:#444}.claude-settings-value-wrapper{display:flex;position:relative}.claude-settings-value-input{flex:1;background:#0a0a0f;border:1px solid #2a2a3a;border-radius:6px;padding:10px 40px 10px 12px;font-size:.85rem;color:#fff;font-family:SF Mono,Fira Code,monospace;transition:border-color .15s ease}.claude-settings-value-input:focus{outline:none;border-color:#0ff5}.claude-settings-value-input::placeholder{color:#444}.claude-settings-toggle-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;padding:4px;cursor:pointer;font-size:.9rem;opacity:.5;transition:opacity .15s ease}.claude-settings-toggle-btn:hover{opacity:1}.claude-settings-delete-btn{background:none;border:1px solid #333;border-radius:6px;color:#666;font-size:1.2rem;cursor:pointer;padding:6px 12px;transition:all .15s ease}.claude-settings-delete-btn:hover{border-color:#ef4444;color:#ef4444}.claude-settings-add-btn{background:#0883;border:1px dashed #00888888;border-radius:6px;padding:12px;color:#0ff;font-size:.85rem;cursor:pointer;transition:all .15s ease}.claude-settings-add-btn:hover{background:#0885;border-style:solid}.claude-settings-info{display:flex;align-items:flex-start;gap:8px;padding:12px;background:#00c8ff1a;border-radius:6px;font-size:.8rem;color:#999;line-height:1.4}.claude-settings-info-icon{font-size:.9rem;flex-shrink:0;color:#0af}.claude-settings-error{color:#ef4444;font-size:.85rem;padding:10px 12px;background:#ef44441a;border-radius:6px}.claude-settings-footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 20px;border-top:1px solid #2a2a3a}.claude-settings-cancel-btn{background:transparent;border:1px solid #333;border-radius:6px;padding:10px 20px;color:#888;font-size:.85rem;cursor:pointer;transition:all .15s ease}.claude-settings-cancel-btn:hover{border-color:#555;color:#fff}.claude-settings-save-btn{background:#0888;border:none;border-radius:6px;padding:10px 20px;color:#fff;font-size:.85rem;font-weight:500;cursor:pointer;transition:all .15s ease}.claude-settings-save-btn:hover:not(:disabled){background:#0aa}.claude-settings-save-btn:disabled{opacity:.5;cursor:not-allowed}.setup-page{position:fixed;inset:0;background:#030712;overflow-y:auto;overflow-x:hidden}.setup-bg{position:fixed;inset:0;overflow:hidden;pointer-events:none}.gradient-orb{position:absolute;border-radius:50%;filter:blur(80px);opacity:.5;animation:float 20s ease-in-out infinite}.orb-1{width:600px;height:600px;background:radial-gradient(circle,rgba(0,255,255,.3) 0%,transparent 70%);top:-200px;left:-200px;animation-delay:0s}.orb-2{width:500px;height:500px;background:radial-gradient(circle,rgba(139,92,246,.25) 0%,transparent 70%);bottom:-150px;right:-150px;animation-delay:-7s}.orb-3{width:400px;height:400px;background:radial-gradient(circle,rgba(236,72,153,.2) 0%,transparent 70%);top:50%;left:50%;transform:translate(-50%,-50%);animation-delay:-14s}@keyframes float{0%,to{transform:translate(0) scale(1)}25%{transform:translate(30px,-30px) scale(1.05)}50%{transform:translate(-20px,20px) scale(.95)}75%{transform:translate(20px,30px) scale(1.02)}}.grid-lines{position:absolute;inset:0;opacity:.03}.grid-line{position:absolute;background:linear-gradient(90deg,transparent,rgba(0,255,255,.5),transparent)}.grid-line.horizontal{height:1px;width:100%;top:calc(var(--index) * 5%);animation:grid-pulse 4s ease-in-out infinite;animation-delay:calc(var(--index) * .1s)}.grid-line.vertical{width:1px;height:100%;left:calc(var(--index) * 3.33%);background:linear-gradient(180deg,transparent,rgba(0,255,255,.5),transparent);animation:grid-pulse 4s ease-in-out infinite;animation-delay:calc(var(--index) * .15s)}@keyframes grid-pulse{0%,to{opacity:.3}50%{opacity:1}}.floating-hex{position:absolute;left:var(--x);top:var(--y);color:#00ffff1a;animation:hex-float 12s ease-in-out infinite;animation-delay:var(--delay)}@keyframes hex-float{0%,to{transform:translateY(0) rotate(0);opacity:.1}50%{transform:translateY(-30px) rotate(180deg);opacity:.2}}.setup-container{position:relative;z-index:1;min-height:100vh;display:flex;flex-direction:column;align-items:center;padding:40px 20px 100px}.welcome-view{width:100%;max-width:1000px;animation:fade-up .8s ease-out}@keyframes fade-up{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}.hero-section{text-align:center;padding:60px 0 80px}.logo-container{display:flex;align-items:center;justify-content:center;gap:16px;margin-bottom:32px;position:relative}.logo-glow{position:absolute;width:120px;height:120px;background:radial-gradient(circle,rgba(0,255,255,.4) 0%,transparent 70%);filter:blur(30px);animation:logo-pulse 3s ease-in-out infinite}@keyframes logo-pulse{0%,to{opacity:.5;transform:scale(1)}50%{opacity:.8;transform:scale(1.1)}}.logo-hex{width:64px;height:64px;position:relative;animation:logo-spin 20s linear infinite}.logo-hex svg{width:100%;height:100%}.logo-hex polygon{fill:#00ffff1a;stroke:#0ff;stroke-width:2;filter:drop-shadow(0 0 10px rgba(0,255,255,.5))}@keyframes logo-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.logo-text{font-size:2.5rem;font-weight:700;background:linear-gradient(135deg,#0ff,#a855f7,#ec4899);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.02em}.hero-title{font-size:clamp(2rem,5vw,3.5rem);font-weight:700;color:#fff;margin:0 0 20px;line-height:1.2}.gradient-text{background:linear-gradient(135deg,#0ff,#a855f7);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.hero-subtitle{font-size:1.125rem;color:#fff9;max-width:600px;margin:0 auto 40px;line-height:1.7}.hero-cta{display:flex;gap:16px;justify-content:center;flex-wrap:wrap}.cta-primary{display:flex;align-items:center;gap:10px;padding:16px 32px;background:linear-gradient(135deg,#0ff,#0cc);border:none;border-radius:12px;color:#000;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s ease;position:relative;overflow:hidden}.cta-primary:before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,transparent 0%,rgba(255,255,255,.3) 100%);opacity:0;transition:opacity .3s ease}.cta-primary:hover{transform:translateY(-2px);box-shadow:0 8px 30px #0ff6}.cta-primary:hover:before{opacity:1}.cta-primary svg{width:20px;height:20px;transition:transform .3s ease}.cta-primary:hover svg{transform:translate(4px)}.cta-secondary{display:flex;align-items:center;gap:10px;padding:16px 28px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:12px;color:#fffc;font-size:1rem;font-weight:500;text-decoration:none;cursor:pointer;transition:all .3s ease}.cta-secondary:hover{background:#ffffff1a;border-color:#fff3;color:#fff}.cta-secondary svg{width:20px;height:20px}.features-section{padding:40px 0}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:20px}.feature-card{background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:16px;padding:28px;transition:all .4s ease;animation:card-appear .6s ease-out backwards;animation-delay:calc(var(--index) * .1s)}@keyframes card-appear{0%{opacity:0;transform:translateY(20px)}}.feature-card:hover{background:#ffffff0f;border-color:#0ff3;transform:translateY(-4px);box-shadow:0 12px 40px #00ffff1a}.feature-icon{font-size:2rem;margin-bottom:16px;display:inline-block;animation:icon-bounce 2s ease-in-out infinite;animation-delay:calc(var(--index) * .2s)}@keyframes icon-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}.feature-card h3{margin:0 0 8px;font-size:1.1rem;font-weight:600;color:#fff}.feature-card p{margin:0;font-size:.9rem;color:#ffffff80;line-height:1.6}.install-section{padding:60px 0;text-align:center}.install-section h2{font-size:1.75rem;font-weight:600;color:#fff;margin:0 0 40px}.install-steps{display:flex;flex-direction:column;gap:24px;max-width:600px;margin:0 auto 40px}.install-step{display:flex;gap:20px;text-align:left;padding:20px;background:#ffffff05;border:1px solid rgba(255,255,255,.05);border-radius:12px;transition:all .3s ease}.install-step:hover{background:#ffffff0a;border-color:#00ffff26}.step-badge{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#0ff3,#8b5cf633);border:1px solid rgba(0,255,255,.3);border-radius:10px;font-size:1rem;font-weight:700;color:#0ff;flex-shrink:0}.step-content{flex:1;min-width:0}.step-content h3{margin:0 0 8px;font-size:1rem;font-weight:600;color:#fff}.step-content p{margin:0;font-size:.9rem;color:#ffffff80}.step-note{margin-top:8px!important;font-size:.8rem!important;color:#fff6!important;font-style:italic}.code-box{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#0006;border:1px solid rgba(255,255,255,.1);border-radius:8px;overflow-x:auto}.code-box code{flex:1;font-family:SF Mono,Monaco,Consolas,monospace;font-size:.85rem;color:#0ff;white-space:nowrap}.copy-btn{padding:6px 10px;background:#ffffff1a;border:none;border-radius:6px;color:#fff9;font-size:.9rem;cursor:pointer;transition:all .2s ease;flex-shrink:0}.copy-btn:hover{background:#ffffff26;color:#fff}.connect-btn{position:relative;padding:18px 48px;background:linear-gradient(135deg,#00ffff1a,#8b5cf61a);border:1px solid rgba(0,255,255,.3);border-radius:14px;font-size:1.1rem;font-weight:600;color:#fff;cursor:pointer;overflow:hidden;transition:all .4s ease}.connect-btn .btn-glow{position:absolute;inset:-2px;background:linear-gradient(135deg,#0ff,#a855f7,#ec4899,#0ff);background-size:400% 400%;border-radius:16px;z-index:-1;opacity:0;animation:glow-rotate 3s linear infinite;transition:opacity .4s ease}@keyframes glow-rotate{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}.connect-btn:hover{transform:translateY(-2px);border-color:transparent}.connect-btn:hover .btn-glow{opacity:1}.connect-btn .btn-text{position:relative;z-index:1}.configure-view{display:flex;align-items:center;justify-content:center;min-height:80vh;animation:fade-up .5s ease-out}.config-card{width:100%;max-width:440px;background:#ffffff08;border:1px solid rgba(255,255,255,.08);border-radius:20px;overflow:hidden;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}.config-header{display:flex;align-items:flex-start;gap:16px;padding:24px 28px;border-bottom:1px solid rgba(255,255,255,.06)}.back-btn{padding:10px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:10px;color:#fff9;cursor:pointer;transition:all .2s ease}.back-btn:hover{background:#ffffff1a;color:#fff}.back-btn svg{width:18px;height:18px;display:block}.config-title h2{margin:0 0 4px;font-size:1.25rem;font-weight:600;color:#fff}.config-title p{margin:0;font-size:.9rem;color:#ffffff80}.config-form{padding:28px}.input-group{margin-bottom:20px}.input-group label{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:.9rem;font-weight:500;color:#ffffffb3}.input-group label svg{width:16px;height:16px;opacity:.5}.input-group input{width:100%;padding:14px 16px;background:#0000004d;border:1px solid rgba(255,255,255,.1);border-radius:10px;color:#fff;font-size:1rem;font-family:inherit;transition:all .2s ease}.input-group input:focus{outline:none;border-color:#0ff;box-shadow:0 0 0 3px #00ffff1a}.input-group input::placeholder{color:#ffffff4d}.connection-url{padding:16px;background:#00ffff0d;border:1px solid rgba(0,255,255,.15);border-radius:10px;margin-bottom:24px}.url-label{display:block;font-size:.75rem;color:#fff6;text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.url-value{font-family:SF Mono,Monaco,Consolas,monospace;font-size:.95rem}.url-value .protocol{color:#fff6}.url-value .host{color:#0ff}.url-value .separator{color:#fff6}.url-value .port{color:#a855f7}.test-btn{width:100%;padding:16px;background:linear-gradient(135deg,#0ff,#0cc);border:none;border-radius:12px;color:#000;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s ease}.test-btn:hover{transform:translateY(-2px);box-shadow:0 8px 25px #00ffff59}.test-btn .btn-content{display:flex;align-items:center;justify-content:center;gap:10px}.test-btn svg{width:20px;height:20px}.testing-view,.success-view,.error-view{display:flex;align-items:center;justify-content:center;min-height:80vh}.testing-card,.success-card,.error-card{text-align:center;padding:60px 40px;background:#ffffff08;border:1px solid rgba(255,255,255,.08);border-radius:20px;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);animation:fade-up .5s ease-out}.testing-animation{position:relative;width:100px;height:100px;margin:0 auto 30px}.signal-ring{position:absolute;inset:0;border:2px solid rgba(0,255,255,.3);border-radius:50%;animation:signal-expand 2s ease-out infinite}.signal-ring.delay-1{animation-delay:.4s}.signal-ring.delay-2{animation-delay:.8s}@keyframes signal-expand{0%{transform:scale(.5);opacity:1}to{transform:scale(1.5);opacity:0}}.signal-icon{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#0ff}.signal-icon svg{width:40px;height:40px;animation:signal-pulse 1s ease-in-out infinite}@keyframes signal-pulse{0%,to{opacity:.5}50%{opacity:1}}.testing-card h2,.success-card h2,.error-card h2{margin:0 0 8px;font-size:1.5rem;font-weight:600;color:#fff}.testing-card p,.success-card p{margin:0;font-size:.95rem;color:#ffffff80}.success-animation{position:relative;width:100px;height:100px;margin:0 auto 30px}.success-ring{position:absolute;inset:0;border:3px solid #4ade80;border-radius:50%;animation:success-pop .5s ease-out}@keyframes success-pop{0%{transform:scale(0);opacity:0}50%{transform:scale(1.1)}to{transform:scale(1);opacity:1}}.success-check{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#4ade80}.success-check svg{width:50px;height:50px;stroke-dasharray:50;stroke-dashoffset:50;animation:check-draw .5s ease-out .3s forwards}@keyframes check-draw{to{stroke-dashoffset:0}}.error-animation{position:relative;width:100px;height:100px;margin:0 auto 30px}.error-ring{position:absolute;inset:0;border:3px solid #ef4444;border-radius:50%;animation:error-shake .5s ease-out}@keyframes error-shake{0%,to{transform:translate(0)}20%,60%{transform:translate(-5px)}40%,80%{transform:translate(5px)}}.error-icon{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#ef4444}.error-icon svg{width:50px;height:50px}.error-msg{color:#ef4444!important;margin-bottom:24px!important}.troubleshoot-tips{text-align:left;padding:20px;background:#ffffff08;border-radius:12px;margin-bottom:24px}.troubleshoot-tips h3{margin:0 0 16px;font-size:.85rem;font-weight:600;color:#fff9;text-transform:uppercase;letter-spacing:.5px}.troubleshoot-tips ul{list-style:none;margin:0;padding:0}.troubleshoot-tips li{display:flex;align-items:center;gap:12px;padding:10px 0;font-size:.9rem;color:#ffffffb3;border-bottom:1px solid rgba(255,255,255,.05)}.troubleshoot-tips li:last-child{border-bottom:none}.troubleshoot-tips li svg{width:18px;height:18px;color:#fff6;flex-shrink:0}.test-backend-link{margin-top:16px;padding-top:16px;border-top:1px solid rgba(255,255,255,.08);display:flex;flex-direction:column;gap:8px}.test-backend-link a{display:inline-flex;align-items:center;gap:8px;color:#00d4ff;text-decoration:none;font-weight:500;font-size:.9rem;transition:color .2s ease}.test-backend-link a:hover{color:#0ff}.test-backend-link a svg{width:16px;height:16px}.test-hint{font-size:.8rem;color:#fff6}.browser-note{margin-top:16px;padding:12px;background:#ffc80014;border:1px solid rgba(255,200,0,.2);border-radius:8px;display:flex;align-items:flex-start;gap:10px;font-size:.85rem;color:#ffffffb3}.browser-note svg{width:18px;height:18px;color:#ffc800;flex-shrink:0;margin-top:2px}.browser-note strong{color:#ffffffe6}.retry-btn{display:inline-flex;align-items:center;gap:10px;padding:14px 28px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:10px;color:#fffc;font-size:1rem;font-weight:500;cursor:pointer;transition:all .2s ease}.retry-btn:hover{background:#ffffff1a;color:#fff}.retry-btn svg{width:18px;height:18px}.auto-connect-container{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:10}.pulse-ring{position:absolute;width:120px;height:120px;border:2px solid rgba(0,255,255,.3);border-radius:50%;animation:pulse-expand 2s ease-out infinite}.pulse-ring.delay-1{animation-delay:.5s}.pulse-ring.delay-2{animation-delay:1s}@keyframes pulse-expand{0%{transform:scale(.8);opacity:1}to{transform:scale(2);opacity:0}}.hex-spinner{width:80px;height:80px;position:relative;animation:hex-spin 3s linear infinite}.hex-spinner svg{width:100%;height:100%}.hex-spinner polygon{fill:#00ffff1a;stroke:#0ff;stroke-width:2;filter:drop-shadow(0 0 15px rgba(0,255,255,.5))}@keyframes hex-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.auto-connect-text{margin-top:30px;font-size:1rem;color:#fff9;animation:text-pulse 1.5s ease-in-out infinite}@keyframes text-pulse{0%,to{opacity:.6}50%{opacity:1}}.setup-footer{position:fixed;bottom:0;left:0;right:0;padding:20px;text-align:center;font-size:.85rem;color:#fff6;background:linear-gradient(to top,rgba(3,7,18,.9),transparent)}.setup-footer .divider{margin:0 12px}.setup-footer a{color:#ffffff80;text-decoration:none;transition:color .2s ease}.setup-footer a:hover{color:#0ff}@media(max-width:768px){.setup-container{padding:30px 16px 100px}.hero-section{padding:40px 0 60px}.logo-text{font-size:2rem}.hero-title{font-size:1.75rem}.hero-subtitle{font-size:1rem}.hero-cta{flex-direction:column}.cta-primary,.cta-secondary{width:100%;justify-content:center}.features-grid{grid-template-columns:1fr}.config-card,.testing-card,.success-card,.error-card{margin:0 16px}}.disconnected-overlay{position:fixed;top:0;left:0;right:0;z-index:1500;display:flex;justify-content:center;pointer-events:none}.disconnected-banner{margin-top:16px;background:#ef444426;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(239,68,68,.3);border-radius:12px;overflow:hidden;pointer-events:auto;transition:all .2s ease;min-width:320px}.disconnected-banner.expanded{min-width:400px}.banner-main{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;cursor:pointer;transition:background .15s ease}.banner-main:hover{background:#ef44441a}.banner-status{display:flex;align-items:center;gap:10px;color:#ef4444;font-size:13px;font-weight:500}.pulse-dot{width:8px;height:8px;background:#ef4444;border-radius:50%;animation:pulse 2s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.8)}}.banner-actions{display:flex;align-items:center;gap:12px}.reconnecting{font-size:12px;color:#ffffff80}.expand-btn{background:none;border:none;color:#fff6;font-size:10px;cursor:pointer;padding:4px;transition:color .15s ease}.expand-btn:hover{color:#fffc}.banner-details{padding:0 16px 16px;border-top:1px solid rgba(239,68,68,.2);margin-top:0}.detail-row{display:flex;align-items:center;gap:8px;padding:10px 0;border-bottom:1px solid rgba(255,255,255,.05)}.detail-row:last-of-type{border-bottom:none}.detail-label{font-size:12px;color:#ffffff80;min-width:100px}.detail-row code{font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;color:#fffc}.status-reconnecting{font-size:12px;color:#fbbf24}.detail-actions{padding-top:12px}.reconfigure-btn{width:100%;padding:10px 16px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fffc;font-size:13px;cursor:pointer;transition:all .15s ease}.reconfigure-btn:hover{background:#ffffff1a;border-color:#fff3;color:#fff}.usage-display{display:flex;flex-direction:column;background:#0009;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:8px 12px;cursor:pointer;transition:all .2s ease;min-width:140px}.usage-display:hover{background:#000000b3;border-color:#fff3}.usage-display.expanded{min-width:220px}.usage-display.loading,.usage-display.error{min-width:auto;padding:8px}.usage-icon{font-size:14px}.usage-compact{display:flex;align-items:center;gap:8px}.usage-label{font-size:11px;color:#ffffff80;text-transform:uppercase;letter-spacing:.5px}.usage-bar-container{flex:1;height:6px;background:#ffffff1a;border-radius:3px;overflow:hidden}.usage-bar{height:100%;border-radius:3px;transition:width .3s ease,background-color .3s ease}.usage-percent{font-size:12px;font-weight:600;min-width:36px;text-align:right}.usage-details{margin-top:10px;padding-top:10px;border-top:1px solid rgba(255,255,255,.1);display:flex;flex-direction:column;gap:8px}.usage-row{display:flex;align-items:center;gap:8px}.usage-row-label{font-size:11px;color:#fff9;min-width:45px}.usage-row-bar-container{flex:1;height:4px;background:#ffffff1a;border-radius:2px;overflow:hidden}.usage-row-bar{height:100%;border-radius:2px;transition:width .3s ease}.usage-row-value{font-size:11px;font-weight:600;color:#fffc;min-width:30px;text-align:right}.usage-row-reset{font-size:10px;color:#fff6;min-width:50px;text-align:right}.usage-refresh{margin-top:4px;padding:4px 8px;background:#ffffff1a;border:none;border-radius:4px;color:#fff9;font-size:10px;cursor:pointer;transition:all .15s ease}.usage-refresh:hover{background:#fff3;color:#fff}.usage-display.compact{min-width:auto;padding:6px 8px}.usage-display.compact .usage-compact{gap:6px}.usage-display.compact .usage-percent{font-size:11px;min-width:28px}.usage-display.compact.expanded{min-width:auto;position:relative}.usage-display.compact .usage-details{position:absolute;left:calc(100% + 8px);bottom:0;min-width:220px;background:#0f0f19f2;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:10px 12px;margin-top:0;z-index:60}.notification-settings-backdrop{position:fixed;inset:0;z-index:200;display:flex;align-items:flex-end;justify-content:flex-start;padding-left:var(--sidebar-current-width, 200px);padding-bottom:80px}.notification-settings-panel{background:#12121cf2;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,.1);border-radius:12px;width:280px;margin-left:12px;box-shadow:0 8px 32px #00000080;animation:notif-settings-in .15s ease-out}@keyframes notif-settings-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.notification-settings-header{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid rgba(255,255,255,.06)}.notification-settings-header h3{margin:0;font-size:.85rem;font-weight:600;color:#ccc}.notification-settings-close{background:transparent;border:none;color:#666;font-size:1.2rem;cursor:pointer;padding:0 4px;line-height:1;transition:color .15s ease}.notification-settings-close:hover{color:#fff}.notification-settings-body{padding:10px 14px 14px;display:flex;flex-direction:column;gap:10px}.notification-setting-row{display:flex;align-items:center;justify-content:space-between;gap:10px}.notification-setting-row.volume-row{flex-direction:column;align-items:stretch;gap:6px}.notification-setting-label{display:flex;align-items:center;gap:6px;font-size:.8rem;color:#aaa;white-space:nowrap}.notification-setting-icon{font-size:.9rem}.volume-value{margin-left:auto;color:#666;font-size:.75rem;font-variant-numeric:tabular-nums}.notification-toggle{position:relative;width:36px;height:20px;border-radius:10px;border:1px solid rgba(255,255,255,.15);background:#ffffff14;cursor:pointer;transition:all .2s ease;flex-shrink:0;padding:0}.notification-toggle.on{background:#00ffff40;border-color:#0ff6}.notification-toggle-thumb{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#666;transition:all .2s ease}.notification-toggle.on .notification-toggle-thumb{left:18px;background:#0ff;box-shadow:0 0 6px #0ff6}.notification-volume-slider{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;background:#ffffff1a;outline:none;cursor:pointer}.notification-volume-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:#0ff;box-shadow:0 0 6px #0ff6;cursor:pointer;transition:box-shadow .15s ease}.notification-volume-slider::-webkit-slider-thumb:hover{box-shadow:0 0 10px #0ff9}.notification-volume-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:#0ff;border:none;box-shadow:0 0 6px #0ff6;cursor:pointer}.notification-previews{border-top:1px solid rgba(255,255,255,.06);padding-top:10px;display:flex;flex-direction:column;gap:8px}.notification-previews-label{font-size:.72rem;color:#666;text-transform:uppercase;letter-spacing:.5px}.notification-preview-buttons{display:flex;gap:6px}.notification-preview-btn{flex:1;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:6px;padding:5px 4px;font-size:.72rem;color:#888;cursor:pointer;transition:all .15s ease;white-space:nowrap}.notification-preview-btn:hover{color:#0ff;border-color:#00ffff4d;background:#00ffff14}.notification-preview-btn:active{transform:scale(.95)}.app-sidebar{position:fixed;top:0;left:0;bottom:0;width:var(--sidebar-current-width, 200px);background:#0a0a12d9;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-right:1px solid rgba(255,255,255,.06);z-index:50;display:flex;flex-direction:column;transition:width .25s cubic-bezier(.4,0,.2,1);overflow:hidden}.sidebar-logo{display:flex;align-items:center;gap:10px;padding:16px;border-bottom:1px solid rgba(255,255,255,.06);min-height:52px}.sidebar-logo-icon{flex-shrink:0;filter:drop-shadow(0 0 6px rgba(0,255,255,.6))}.sidebar-logo-text{font-size:1.2rem;font-weight:600;background:linear-gradient(135deg,#0ff,#0af);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;white-space:nowrap;opacity:1;transition:opacity .2s ease}.app-sidebar.collapsed .sidebar-logo-text{opacity:0;width:0;overflow:hidden}.sidebar-settings{padding:8px 12px;border-bottom:1px solid rgba(255,255,255,.06)}.sidebar-settings-btn{display:flex;align-items:center;gap:10px;width:100%;background:transparent;border:1px solid transparent;border-radius:8px;padding:8px 10px;font-size:.85rem;color:#888;cursor:pointer;transition:all .15s ease;white-space:nowrap;overflow:hidden}.sidebar-settings-btn:hover{color:#0ff;background:#00ffff14;border-color:#00ffff26}.sidebar-settings-btn .sidebar-btn-icon{flex-shrink:0;font-size:1.1rem;width:20px;text-align:center}.sidebar-settings-btn .sidebar-nav-label{opacity:1;transition:opacity .2s ease}.app-sidebar.collapsed .sidebar-settings-btn .sidebar-nav-label{opacity:0;width:0;overflow:hidden}.sidebar-nav{display:flex;flex-direction:column;gap:2px;padding:8px 12px}.sidebar-nav-btn{display:flex;align-items:center;gap:10px;width:100%;background:transparent;border:1px solid transparent;border-radius:8px;padding:8px 10px;font-size:.85rem;color:#888;cursor:pointer;transition:all .15s ease;white-space:nowrap;overflow:hidden}.sidebar-nav-btn:hover{color:#0ff;background:#00ffff14}.sidebar-nav-btn.active{color:#0ff;background:#00ffff26;border-color:#0ff3}.sidebar-nav-btn .sidebar-btn-icon{flex-shrink:0;width:20px;text-align:center}.sidebar-nav-btn .sidebar-btn-icon svg{display:block;margin:0 auto}.sidebar-nav-btn .sidebar-nav-label{opacity:1;transition:opacity .2s ease}.app-sidebar.collapsed .sidebar-nav-btn .sidebar-nav-label{opacity:0;width:0;overflow:hidden}.sidebar-spacer{flex:1}.sidebar-bottom{padding:12px;border-top:1px solid rgba(255,255,255,.06);display:flex;flex-direction:column;gap:8px}.sidebar-connection{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:8px;font-size:.75rem;color:#888;white-space:nowrap;overflow:hidden;transition:background .15s ease}.sidebar-connection.clickable{cursor:pointer}.sidebar-connection.clickable:hover{background:#ffffff0d}.sidebar-connection .status-dot{flex-shrink:0;width:8px;height:8px;border-radius:50%;background:#666}.sidebar-connection .status-dot.connected{background:#4ade80;box-shadow:0 0 8px #4ade8088}.sidebar-connection .sidebar-conn-label{opacity:1;transition:opacity .2s ease}.app-sidebar.collapsed .sidebar-connection .sidebar-conn-label{opacity:0;width:0;overflow:hidden}.sidebar-connection .connection-gear{margin-left:auto;font-size:11px;color:#ffffff4d;transition:color .15s ease,opacity .2s ease}.sidebar-connection:hover .connection-gear{color:#ffffffb3}.app-sidebar.collapsed .sidebar-connection .connection-gear{opacity:0;width:0;overflow:hidden}.sidebar-notif-btn{display:flex;align-items:center;gap:10px;width:100%;background:transparent;border:1px solid transparent;border-radius:8px;padding:8px 10px;font-size:.8rem;color:#888;cursor:pointer;transition:all .15s ease;white-space:nowrap;overflow:hidden}.sidebar-notif-btn:hover{color:#0ff;background:#00ffff14}.sidebar-notif-btn.active{color:#0ff;background:#00ffff1f;border-color:#0ff3}.sidebar-notif-btn .sidebar-btn-icon{flex-shrink:0;width:20px;text-align:center}.sidebar-notif-btn .sidebar-btn-icon svg{display:block;margin:0 auto}.sidebar-notif-btn .sidebar-nav-label{opacity:1;transition:opacity .2s ease}.app-sidebar.collapsed .sidebar-notif-btn .sidebar-nav-label{opacity:0;width:0;overflow:hidden}.sidebar-collapse-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;background:transparent;border:1px solid transparent;border-radius:8px;padding:8px 10px;font-size:.75rem;color:#666;cursor:pointer;transition:all .15s ease;white-space:nowrap;overflow:hidden}.sidebar-collapse-btn:hover{color:#aaa;background:#ffffff0d}.sidebar-collapse-icon{flex-shrink:0;transition:transform .25s ease}.app-sidebar.collapsed .sidebar-collapse-icon{transform:rotate(180deg)}.sidebar-collapse-label{opacity:1;transition:opacity .2s ease}.app-sidebar.collapsed .sidebar-collapse-label{opacity:0;width:0;overflow:hidden}.app-sidebar.collapsed .sidebar-logo{padding:14px 0;justify-content:center;gap:0}.app-sidebar.collapsed .sidebar-settings{padding:8px 6px}.app-sidebar.collapsed .sidebar-settings-btn{padding:8px 0;justify-content:center;gap:0}.app-sidebar.collapsed .sidebar-nav{padding:8px 6px}.app-sidebar.collapsed .sidebar-nav-btn{padding:8px 0;justify-content:center;gap:0}.app-sidebar.collapsed .sidebar-bottom{padding:8px 6px;gap:4px}.app-sidebar.collapsed .sidebar-connection{padding:6px 0;justify-content:center;gap:0}.app-sidebar.collapsed .sidebar-collapse-btn{padding:8px 0;gap:0}.app-sidebar.collapsed .usage-display{padding:4px 6px}.app-sidebar.collapsed .usage-percent{display:none}.secrets-editor-overlay{position:fixed;inset:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.secrets-editor-modal{background:#1a1a24;border-radius:12px;border:1px solid #2a2a3a;width:90%;max-width:600px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #00000080}.secrets-editor-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #2a2a3a}.secrets-editor-header h2{margin:0;font-size:1.1rem;font-weight:500;color:#fff;display:flex;align-items:center;gap:8px}.secrets-icon{font-size:1.2rem}.secrets-editor-close{background:none;border:none;color:#666;font-size:1.5rem;cursor:pointer;padding:0;line-height:1;transition:color .15s ease}.secrets-editor-close:hover{color:#fff}.secrets-editor-content{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:16px}.secrets-loading{text-align:center;color:#666;padding:40px}.secrets-list{display:flex;flex-direction:column;gap:8px}.secrets-list-header{display:grid;grid-template-columns:1fr 1.5fr 60px;gap:12px;padding:0 4px 8px;font-size:.75rem;color:#666;text-transform:uppercase;letter-spacing:.5px}.secrets-empty{text-align:center;color:#555;padding:24px;font-size:.9rem}.secrets-row{display:grid;grid-template-columns:1fr 1.5fr 60px;gap:12px;align-items:center}.secrets-key-input{background:#0a0a0f;border:1px solid #2a2a3a;border-radius:6px;padding:10px 12px;font-size:.85rem;color:#0ff;font-family:SF Mono,Fira Code,monospace;transition:border-color .15s ease}.secrets-key-input:focus{outline:none;border-color:#0ff5}.secrets-key-input::placeholder{color:#444}.secrets-value-wrapper{display:flex;position:relative}.secrets-value-input{flex:1;background:#0a0a0f;border:1px solid #2a2a3a;border-radius:6px;padding:10px 40px 10px 12px;font-size:.85rem;color:#fff;font-family:SF Mono,Fira Code,monospace;transition:border-color .15s ease}.secrets-value-input:focus{outline:none;border-color:#0ff5}.secrets-value-input::placeholder{color:#444}.secrets-toggle-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;padding:4px;cursor:pointer;font-size:.9rem;opacity:.5;transition:opacity .15s ease}.secrets-toggle-btn:hover{opacity:1}.secrets-delete-btn{background:none;border:1px solid #333;border-radius:6px;color:#666;font-size:1.2rem;cursor:pointer;padding:6px 12px;transition:all .15s ease}.secrets-delete-btn:hover{border-color:#ef4444;color:#ef4444}.secrets-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.secrets-add-btn{background:#0883;border:1px dashed #00888888;border-radius:6px;padding:10px 16px;color:#0ff;font-size:.85rem;cursor:pointer;transition:all .15s ease}.secrets-add-btn:hover{background:#0885;border-style:solid}.secrets-import-btn{background:#4a4a5a33;border:1px dashed #4a4a5a88;border-radius:6px;padding:10px 16px;color:#aaa;font-size:.85rem;cursor:pointer;transition:all .15s ease}.secrets-import-btn:hover{background:#4a4a5a55;border-style:solid;color:#fff}.secrets-import-success{color:#22c55e;font-size:.8rem;padding:6px 10px;background:#22c55e1a;border-radius:4px;animation:fadeIn .3s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.secrets-info{display:flex;align-items:flex-start;gap:8px;padding:12px;background:#ffc8001a;border-radius:6px;font-size:.8rem;color:#999;line-height:1.4}.secrets-info-icon{font-size:.9rem;flex-shrink:0}.secrets-info code{background:#0000004d;padding:2px 6px;border-radius:3px;font-family:SF Mono,Fira Code,monospace;color:#0ff}.secrets-error{color:#ef4444;font-size:.85rem;padding:10px 12px;background:#ef44441a;border-radius:6px}.secrets-editor-footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 20px;border-top:1px solid #2a2a3a}.secrets-cancel-btn{background:transparent;border:1px solid #333;border-radius:6px;padding:10px 20px;color:#888;font-size:.85rem;cursor:pointer;transition:all .15s ease}.secrets-cancel-btn:hover{border-color:#555;color:#fff}.secrets-save-btn{background:#0888;border:none;border-radius:6px;padding:10px 20px;color:#fff;font-size:.85rem;font-weight:500;cursor:pointer;transition:all .15s ease}.secrets-save-btn:hover:not(:disabled){background:#0aa}.secrets-save-btn:disabled{opacity:.5;cursor:not-allowed}.project-tabs{display:flex;align-items:center;gap:4px;flex:1;min-width:0}.project-tabs-list{display:flex;gap:4px;flex:1;overflow-x:auto;scrollbar-width:none;background:#1a1a2499;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid #2a2a3a;border-radius:10px;padding:4px}.project-tabs-list::-webkit-scrollbar{display:none}.project-tab{display:flex;align-items:center;gap:6px;padding:5px 10px;background:transparent;border:1px solid transparent;border-radius:6px;color:#fff9;font-size:12px;font-weight:500;cursor:pointer;transition:all .15s ease;white-space:nowrap}.project-tab:hover{background:#ffffff1a;color:#ffffffe6}.project-tab.active{background:#ffffff1f;color:#fff;border-color:var(--accent-color, #00ffff);box-shadow:0 0 8px rgba(var(--accent-color-rgb, 0, 255, 255),.2)}.project-tab-indicator{width:6px;height:6px;border-radius:50%;flex-shrink:0}.project-tab-name{max-width:120px;overflow:hidden;text-overflow:ellipsis}.project-add-btn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fff9;font-size:16px;font-weight:400;cursor:pointer;transition:all .15s ease;flex-shrink:0}.project-add-btn:hover{background:#ffffff1a;color:#0ff;border-color:#00ffff4d}.project-context-menu{position:fixed;z-index:1000;background:#1a1a24;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:4px;box-shadow:0 4px 16px #0006;min-width:140px}.project-context-menu button{display:block;width:100%;padding:8px 12px;background:transparent;border:none;color:#fffc;font-size:12px;text-align:left;cursor:pointer;border-radius:4px;transition:background .15s ease}.project-context-menu button:hover{background:#ffffff1a}.project-context-menu button.delete{color:#ef4444}.project-context-menu button.delete:hover{background:#ef44441a}.project-tab-count{font-size:10px;font-weight:600;padding:2px 6px;background:#ffffff26;border-radius:10px;color:#fffc;min-width:18px;text-align:center}.project-tab.active .project-tab-count{background:#fff3;color:#fff}.project-tab.all-tab{background:#8888881a}.project-tab.all-tab.active{border-color:#888;box-shadow:0 0 8px #8883}.unassigned-hint{font-size:11px;color:#fff6;padding:4px 8px;cursor:default}.project-tab-edit{width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:#fff6;font-size:11px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;margin-left:4px;opacity:0;transition:all .15s ease;flex-shrink:0}.project-tab:hover .project-tab-edit{opacity:1}.project-tab-edit:hover{background:#60a5fa4d;color:#60a5fa}.project-tab.active .project-tab-edit{opacity:.6}.project-tab.active .project-tab-edit:hover{opacity:1}.project-tab-close{width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:#fff6;font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;margin-left:2px;opacity:0;transition:all .15s ease;flex-shrink:0}.project-tab:hover .project-tab-close{opacity:1}.project-tab-close:hover{background:#ef44444d;color:#ef4444}.project-tab.active .project-tab-close{opacity:.6}.project-tab.active .project-tab-close:hover{opacity:1}.project-tab-notification-dot{width:8px;height:8px;border-radius:50%;background:#4ade80;flex-shrink:0;animation:notification-glow 2s ease-in-out infinite}@keyframes notification-glow{0%,to{box-shadow:0 0 2px #4ade8066;opacity:.8}50%{box-shadow:0 0 8px 3px #4ade8099;opacity:1}}*{box-sizing:border-box}html,body,#root{margin:0;padding:0;width:100%;height:100%;overflow:hidden;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#0a0a0f;color:#fff}.app{width:100%;height:100%;display:flex;position:relative}.app.floating-layout{display:block;--sidebar-width: 200px;--sidebar-collapsed-width: 52px;--sidebar-current-width: var(--sidebar-width)}.app.floating-layout.sidebar-collapsed{--sidebar-current-width: var(--sidebar-collapsed-width)}.app.floating-layout .world-container{position:absolute;inset:0;z-index:1}.world-container{flex:1;position:relative;overflow:hidden}.world-container.fullscreen{width:100%;height:100%}.overlay-top{position:absolute;top:0;left:var(--sidebar-current-width, 0px);right:0;padding:16px 20px;display:flex;justify-content:center;align-items:center;pointer-events:none;z-index:10;transition:left .25s cubic-bezier(.4,0,.2,1);flex-wrap:wrap;gap:8px}.project-tabs-wrapper{flex:1;min-width:0;pointer-events:auto;display:flex}.overlay-bottom{position:absolute;bottom:0;left:var(--sidebar-current-width, 0px);right:0;padding:16px 20px;display:flex;justify-content:center;pointer-events:none;z-index:10;transition:left .25s cubic-bezier(.4,0,.2,1)}.controls-hint{padding:8px 16px;background:#1a1a2488;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:20px;font-size:.75rem;color:#666}@media(max-width:768px){.overlay-top{padding:10px 12px}.controls-hint{display:none}}@media(max-width:480px){.overlay-top{padding:8px;gap:6px}}.control-panel-floating{z-index:100}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#333;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#444}.resize-handle{width:6px;background:#2a2a3a;cursor:col-resize;transition:background .15s ease;flex-shrink:0}.resize-handle:hover,.resize-handle.active{background:#0aa}.right-panel{height:100%;display:flex;flex-direction:column;background:#12121a;border-left:1px solid #2a2a3a;flex-shrink:0}.right-panel>.sidebar{flex:0 0 auto;max-height:50%;min-height:200px;border-left:none;overflow-y:auto}.right-panel>.chat-panel{flex:1;min-height:0;border-top:1px solid #2a2a3a}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="fg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#00ffff" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#a855f7" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<polygon
|
|
9
|
+
points="50,5 93,27 93,73 50,95 7,73 7,27"
|
|
10
|
+
fill="none"
|
|
11
|
+
stroke="url(#fg)"
|
|
12
|
+
stroke-width="8"
|
|
13
|
+
/>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
|
6
|
+
<link rel="icon" type="image/png" sizes="32x32" href="./favicon-32x32.png" />
|
|
7
|
+
<link rel="icon" type="image/png" sizes="16x16" href="./favicon-16x16.png" />
|
|
8
|
+
<link rel="apple-touch-icon" sizes="180x180" href="./apple-touch-icon.png" />
|
|
9
|
+
<link rel="shortcut icon" href="./favicon.ico" />
|
|
10
|
+
<link rel="manifest" href="./site.webmanifest" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
12
|
+
<meta name="theme-color" content="#030712" />
|
|
13
|
+
<meta name="description" content="VibeTeam - Orchestrate AI Agents with Style" />
|
|
14
|
+
<title>VibeTeam</title>
|
|
15
|
+
<script type="module" crossorigin src="./assets/index-DURW-QlU.js"></script>
|
|
16
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DgQWq5c0.css">
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<div id="root"></div>
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
package/public/logo.svg
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="hexGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#00ffff;stop-opacity:0.2" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#a855f7;stop-opacity:0.1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<filter id="glow">
|
|
8
|
+
<feGaussianBlur stdDeviation="2" result="coloredBlur"/>
|
|
9
|
+
<feMerge>
|
|
10
|
+
<feMergeNode in="coloredBlur"/>
|
|
11
|
+
<feMergeNode in="SourceGraphic"/>
|
|
12
|
+
</feMerge>
|
|
13
|
+
</filter>
|
|
14
|
+
</defs>
|
|
15
|
+
<polygon
|
|
16
|
+
points="50,5 93,27 93,73 50,95 7,73 7,27"
|
|
17
|
+
fill="url(#hexGradient)"
|
|
18
|
+
stroke="#00ffff"
|
|
19
|
+
stroke-width="3"
|
|
20
|
+
filter="url(#glow)"
|
|
21
|
+
/>
|
|
22
|
+
</svg>
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "VibeTeam",
|
|
3
|
+
"short_name": "VibeTeam",
|
|
4
|
+
"description": "Orchestrate AI Agents with Style",
|
|
5
|
+
"icons": [
|
|
6
|
+
{
|
|
7
|
+
"src": "/favicon-16x16.png",
|
|
8
|
+
"sizes": "16x16",
|
|
9
|
+
"type": "image/png"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"src": "/favicon-32x32.png",
|
|
13
|
+
"sizes": "32x32",
|
|
14
|
+
"type": "image/png"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"src": "/apple-touch-icon.png",
|
|
18
|
+
"sizes": "180x180",
|
|
19
|
+
"type": "image/png"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"theme_color": "#030712",
|
|
23
|
+
"background_color": "#030712",
|
|
24
|
+
"display": "standalone"
|
|
25
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CommitWatcher - Monitor git repositories for new commits on specified branches
|
|
3
|
-
*
|
|
4
|
-
* Similar pattern to GitStatusManager, but focused on detecting new commits
|
|
5
|
-
* to trigger Lead agents.
|
|
6
|
-
*/
|
|
7
|
-
import { execFile } from 'child_process';
|
|
8
|
-
import { promisify } from 'util';
|
|
9
|
-
|
|
10
|
-
const execFileAsync = promisify(execFile);
|
|
11
|
-
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// CommitWatcher
|
|
14
|
-
// ============================================================================
|
|
15
|
-
export class CommitWatcher {
|
|
16
|
-
/** Map of projectId -> tracking info */
|
|
17
|
-
trackedProjects = new Map();
|
|
18
|
-
|
|
19
|
-
/** Polling interval reference */
|
|
20
|
-
pollInterval = null;
|
|
21
|
-
|
|
22
|
-
/** Callback when new commit is detected */
|
|
23
|
-
onNewCommit = null;
|
|
24
|
-
|
|
25
|
-
// Configuration
|
|
26
|
-
POLL_INTERVAL_MS = 10000; // Check every 10 seconds
|
|
27
|
-
EXEC_TIMEOUT_MS = 5000; // Timeout for git commands
|
|
28
|
-
FETCH_INTERVAL_MS = 30000; // Fetch from remote every 30 seconds
|
|
29
|
-
|
|
30
|
-
lastFetchTime = 0;
|
|
31
|
-
|
|
32
|
-
constructor() {}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Set callback for new commit detection
|
|
36
|
-
* @param {Function} handler - (projectId, commitInfo) => void
|
|
37
|
-
*/
|
|
38
|
-
setCommitHandler(handler) {
|
|
39
|
-
this.onNewCommit = handler;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Start tracking a project's branch for new commits
|
|
44
|
-
* @param {string} projectId - Project identifier
|
|
45
|
-
* @param {string} projectPath - Path to git repository
|
|
46
|
-
* @param {string} branch - Branch to watch (default: 'main')
|
|
47
|
-
*/
|
|
48
|
-
track(projectId, projectPath, branch = 'main') {
|
|
49
|
-
this.trackedProjects.set(projectId, {
|
|
50
|
-
path: projectPath,
|
|
51
|
-
branch,
|
|
52
|
-
lastCommit: null, // Will be set on first poll
|
|
53
|
-
lastChecked: null,
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Immediately check to get baseline
|
|
57
|
-
this.checkProject(projectId);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Stop tracking a project
|
|
62
|
-
* @param {string} projectId
|
|
63
|
-
*/
|
|
64
|
-
untrack(projectId) {
|
|
65
|
-
this.trackedProjects.delete(projectId);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Check if a project is being tracked
|
|
70
|
-
* @param {string} projectId
|
|
71
|
-
* @returns {boolean}
|
|
72
|
-
*/
|
|
73
|
-
isTracking(projectId) {
|
|
74
|
-
return this.trackedProjects.has(projectId);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Get tracking info for a project
|
|
79
|
-
* @param {string} projectId
|
|
80
|
-
* @returns {Object|null}
|
|
81
|
-
*/
|
|
82
|
-
getTrackingInfo(projectId) {
|
|
83
|
-
return this.trackedProjects.get(projectId) || null;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Start polling for new commits
|
|
88
|
-
*/
|
|
89
|
-
start() {
|
|
90
|
-
if (this.pollInterval) return;
|
|
91
|
-
|
|
92
|
-
this.pollInterval = setInterval(() => {
|
|
93
|
-
this.pollAll();
|
|
94
|
-
}, this.POLL_INTERVAL_MS);
|
|
95
|
-
|
|
96
|
-
// Initial poll
|
|
97
|
-
this.pollAll();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Stop polling
|
|
102
|
-
*/
|
|
103
|
-
stop() {
|
|
104
|
-
if (this.pollInterval) {
|
|
105
|
-
clearInterval(this.pollInterval);
|
|
106
|
-
this.pollInterval = null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Poll all tracked projects for new commits
|
|
112
|
-
*/
|
|
113
|
-
async pollAll() {
|
|
114
|
-
// Periodically fetch from remotes
|
|
115
|
-
const now = Date.now();
|
|
116
|
-
if (now - this.lastFetchTime > this.FETCH_INTERVAL_MS) {
|
|
117
|
-
this.lastFetchTime = now;
|
|
118
|
-
// Fetch in background for all tracked projects
|
|
119
|
-
for (const [projectId, info] of this.trackedProjects) {
|
|
120
|
-
this.execGit(['fetch', '--quiet'], info.path).catch(() => {}); // Silent fail
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Check each project
|
|
125
|
-
const promises = Array.from(this.trackedProjects.keys()).map(
|
|
126
|
-
(projectId) => this.checkProject(projectId)
|
|
127
|
-
);
|
|
128
|
-
await Promise.all(promises);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Check a single project for new commits
|
|
133
|
-
* @param {string} projectId
|
|
134
|
-
*/
|
|
135
|
-
async checkProject(projectId) {
|
|
136
|
-
const info = this.trackedProjects.get(projectId);
|
|
137
|
-
if (!info) return;
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
// Get the latest commit on the tracked branch (from remote)
|
|
141
|
-
const remoteRef = `origin/${info.branch}`;
|
|
142
|
-
const currentSha = await this.getLatestCommit(info.path, remoteRef);
|
|
143
|
-
|
|
144
|
-
info.lastChecked = Date.now();
|
|
145
|
-
|
|
146
|
-
if (!currentSha) return;
|
|
147
|
-
|
|
148
|
-
// First time - just record baseline
|
|
149
|
-
if (!info.lastCommit) {
|
|
150
|
-
info.lastCommit = currentSha;
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Check if commit changed
|
|
155
|
-
if (currentSha !== info.lastCommit) {
|
|
156
|
-
const previousCommit = info.lastCommit;
|
|
157
|
-
info.lastCommit = currentSha;
|
|
158
|
-
|
|
159
|
-
// Get commit details
|
|
160
|
-
const commitInfo = await this.getCommitInfo(info.path, currentSha);
|
|
161
|
-
|
|
162
|
-
if (commitInfo && this.onNewCommit) {
|
|
163
|
-
this.onNewCommit(projectId, commitInfo);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
} catch (err) {
|
|
167
|
-
// Silent fail - project might not have remote configured
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Get the latest commit SHA for a ref
|
|
173
|
-
* @param {string} path - Repository path
|
|
174
|
-
* @param {string} ref - Git ref (e.g., 'origin/main')
|
|
175
|
-
* @returns {Promise<string|null>}
|
|
176
|
-
*/
|
|
177
|
-
async getLatestCommit(path, ref) {
|
|
178
|
-
try {
|
|
179
|
-
const result = await this.execGit(
|
|
180
|
-
['log', '-1', '--format=%H', ref],
|
|
181
|
-
path
|
|
182
|
-
);
|
|
183
|
-
return result.trim() || null;
|
|
184
|
-
} catch {
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Get detailed commit information
|
|
191
|
-
* @param {string} path - Repository path
|
|
192
|
-
* @param {string} sha - Commit SHA
|
|
193
|
-
* @returns {Promise<Object|null>}
|
|
194
|
-
*/
|
|
195
|
-
async getCommitInfo(path, sha) {
|
|
196
|
-
try {
|
|
197
|
-
// Get commit details
|
|
198
|
-
const format = '%H|||%h|||%s|||%an|||%at';
|
|
199
|
-
const logResult = await this.execGit(
|
|
200
|
-
['show', '--format=' + format, '--stat', '--no-patch', sha],
|
|
201
|
-
path
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
const lines = logResult.trim().split('\n');
|
|
205
|
-
if (lines.length === 0) return null;
|
|
206
|
-
|
|
207
|
-
const [fullSha, shortSha, message, author, timestamp] = lines[0].split('|||');
|
|
208
|
-
|
|
209
|
-
// Get diff stats
|
|
210
|
-
const diffResult = await this.execGit(
|
|
211
|
-
['diff', '--shortstat', `${sha}^..${sha}`],
|
|
212
|
-
path
|
|
213
|
-
).catch(() => '');
|
|
214
|
-
|
|
215
|
-
let additions = 0;
|
|
216
|
-
let deletions = 0;
|
|
217
|
-
const addMatch = diffResult.match(/(\d+) insertion/);
|
|
218
|
-
const delMatch = diffResult.match(/(\d+) deletion/);
|
|
219
|
-
if (addMatch) additions = parseInt(addMatch[1], 10);
|
|
220
|
-
if (delMatch) deletions = parseInt(delMatch[1], 10);
|
|
221
|
-
|
|
222
|
-
// Get list of changed files
|
|
223
|
-
const filesResult = await this.execGit(
|
|
224
|
-
['diff', '--name-only', `${sha}^..${sha}`],
|
|
225
|
-
path
|
|
226
|
-
).catch(() => '');
|
|
227
|
-
|
|
228
|
-
const filesChanged = filesResult.trim().split('\n').filter(Boolean);
|
|
229
|
-
|
|
230
|
-
// Get the branch this commit is on
|
|
231
|
-
const branchResult = await this.execGit(
|
|
232
|
-
['branch', '-r', '--contains', sha],
|
|
233
|
-
path
|
|
234
|
-
).catch(() => '');
|
|
235
|
-
|
|
236
|
-
// Extract branch name (first one if multiple)
|
|
237
|
-
let branch = 'main';
|
|
238
|
-
const branchMatch = branchResult.match(/origin\/(\S+)/);
|
|
239
|
-
if (branchMatch) {
|
|
240
|
-
branch = branchMatch[1];
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return {
|
|
244
|
-
sha: fullSha,
|
|
245
|
-
shortSha,
|
|
246
|
-
message,
|
|
247
|
-
author,
|
|
248
|
-
timestamp: parseInt(timestamp, 10) * 1000, // Convert to ms
|
|
249
|
-
branch,
|
|
250
|
-
filesChanged,
|
|
251
|
-
additions,
|
|
252
|
-
deletions,
|
|
253
|
-
};
|
|
254
|
-
} catch {
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Force check a project (useful after manual trigger)
|
|
261
|
-
* @param {string} projectId
|
|
262
|
-
* @returns {Promise<Object|null>} - Returns commit info if found
|
|
263
|
-
*/
|
|
264
|
-
async forceCheck(projectId) {
|
|
265
|
-
const info = this.trackedProjects.get(projectId);
|
|
266
|
-
if (!info) return null;
|
|
267
|
-
|
|
268
|
-
try {
|
|
269
|
-
// Fetch first
|
|
270
|
-
await this.execGit(['fetch', '--quiet'], info.path);
|
|
271
|
-
|
|
272
|
-
// Get latest commit
|
|
273
|
-
const remoteRef = `origin/${info.branch}`;
|
|
274
|
-
const currentSha = await this.getLatestCommit(info.path, remoteRef);
|
|
275
|
-
|
|
276
|
-
if (!currentSha) return null;
|
|
277
|
-
|
|
278
|
-
return this.getCommitInfo(info.path, currentSha);
|
|
279
|
-
} catch {
|
|
280
|
-
return null;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Get commit info for a specific SHA in a project
|
|
286
|
-
* @param {string} path - Repository path
|
|
287
|
-
* @param {string} sha - Commit SHA
|
|
288
|
-
* @returns {Promise<Object|null>}
|
|
289
|
-
*/
|
|
290
|
-
async getCommitInfoForPath(path, sha) {
|
|
291
|
-
return this.getCommitInfo(path, sha);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Execute a git command in a directory
|
|
296
|
-
* @param {string[]} args - Git command arguments
|
|
297
|
-
* @param {string} cwd - Working directory
|
|
298
|
-
* @returns {Promise<string>}
|
|
299
|
-
*/
|
|
300
|
-
async execGit(args, cwd) {
|
|
301
|
-
const { stdout } = await execFileAsync('git', args, {
|
|
302
|
-
cwd,
|
|
303
|
-
timeout: this.EXEC_TIMEOUT_MS,
|
|
304
|
-
});
|
|
305
|
-
return stdout;
|
|
306
|
-
}
|
|
307
|
-
}
|