@mmmbuto/nexuscrew 0.9.34 → 0.9.36

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.
@@ -29,4 +29,4 @@
29
29
  * The original design remains. The terminal itself
30
30
  * has been extended to include xterm CSI codes, among
31
31
  * other features.
32
- */.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;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.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:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.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}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.nc-terminal{position:absolute;top:0;right:0;bottom:0;left:0;background:#0a0e0a}.nc-terminal-host{position:absolute;top:0;right:0;bottom:0;left:0;padding:4px}.nc-terminal .xterm{height:100%}.nc-terminal-host,.nc-terminal .xterm,.nc-terminal .xterm-viewport{touch-action:none}.nc-terminal.selecting{box-shadow:inset 0 0 0 2px #d6a600}.nc-touch-selection-caret{position:absolute;z-index:8;box-sizing:border-box;pointer-events:none;border:2px solid #baff79;background:#40822c57;box-shadow:0 0 0 1px #040c04e0,0 0 8px #baff798c}.nc-selection-tools{position:absolute;z-index:9;right:10px;top:10px;display:flex;gap:6px;align-items:center;background:#0e140ef0;border:1px solid #586b2a;border-radius:8px;padding:5px 7px;color:#edda8a;font-size:11px}.nc-selection-tools button{background:#172417;border:1px solid #486044;color:#d8ffe8;border-radius:6px;padding:5px 9px}.nc-selection-tools textarea{width:180px;height:48px;background:#071007;color:#d8ffe8}.nc-zoom-bubble{position:absolute;z-index:10;max-width:calc(100% - 8px);box-sizing:border-box;background:#0e140ef5;border:1px solid #586b2a;border-radius:10px;padding:4px 8px;overflow:hidden;box-shadow:0 4px 18px #0000008c,0 0 0 1px #040c0499}.nc-zoom-bubble.flipped{box-shadow:0 -4px 18px #0000008c,0 0 0 1px #040c0499}.nc-zoom-line{margin:0;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;line-height:1.25;color:#d8ffe8;white-space:pre;overflow-x:auto}.nc-zoom-sel{background:#baff794d;border-radius:2px;box-shadow:inset 0 -2px #baff79}.nc-selection-held{color:#b7c98a;font-size:10px;opacity:.85;max-width:190px}.nc-sel-handle{position:absolute;z-index:9;width:2px;height:26px;background:#baff79;box-shadow:0 0 0 1px #040c04e0,0 0 8px #baff798c;touch-action:none;cursor:grab}.nc-sel-handle:after{content:"";position:absolute;top:-12px;bottom:-16px}.nc-sel-handle.start:after{left:-28px;right:-14px}.nc-sel-handle.end:after{left:-14px;right:-28px}.nc-sel-handle:before{content:"";position:absolute;top:100%;width:14px;height:14px;border-radius:50%;background:#baff79;box-shadow:0 0 0 1px #040c04e0}.nc-sel-handle.start:before{left:-15px}.nc-sel-handle.start.flip:after{left:-14px;right:-28px}.nc-sel-handle.start.flip:before{left:3px}.nc-sel-handle.end.flip:after{left:-28px;right:-14px}.nc-sel-handle.end.flip:before{left:-15px}.nc-sel-handle.end:before{left:3px}.nc-sel-handle.tight.end:before{top:calc(100% + 10px)}.nc-sel-handle.tight.end:after{bottom:-26px}.nc-sel-handle.dragging{background:#eaffb0;cursor:grabbing;z-index:12}.nc-sel-handle.dragging:before{background:#eaffb0;transform:scale(1.25)}.nc-selection-changed{color:#edda8a;font-size:10px;opacity:.9;max-width:210px}.nc-upload-state{position:absolute;z-index:10;left:50%;top:12px;transform:translate(-50%);max-width:min(520px,calc(100% - 24px));padding:6px 10px;border-radius:7px;border:1px solid #2e7d32;background:#0a140af5;color:#cfe;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.nc-upload-state.error{border-color:#a44;color:#fbb}.nc-keybar{background:#0a0e0a;border-top:1px solid #1c241c;position:relative}.nc-keybar.termux{padding:2px 0}.nc-keygrid{display:grid;grid-template-columns:minmax(0,8fr) minmax(40px,1fr)}.nc-keygrid.no-enter{grid-template-columns:minmax(0,1fr)}.nc-keygrid.expanded{grid-template-columns:minmax(40px,1fr) minmax(0,8fr) minmax(40px,1fr)}.nc-keygrid.expanded.no-enter{grid-template-columns:minmax(40px,1fr) minmax(0,1fr)}.nc-keygrid.compact{grid-template-columns:minmax(0,8fr) minmax(40px,1fr)}.nc-keygrid.compact.no-enter{grid-template-columns:minmax(0,1fr)}.nc-keygrid.compact .row button{padding-inline:0;overflow:hidden;white-space:nowrap;font-size:clamp(10px,3vw,12px);letter-spacing:0}.nc-keygrid.compact .row button:nth-last-child(-n+2){font-size:10px}.nc-keyrows{display:flex;flex-direction:column;min-width:0}.nc-keybar .row{display:flex}.nc-keybar .row button,.nc-keybar .nc-enter-key,.nc-keybar .nc-retract-key{flex:1 1 0;min-width:0;padding:10px 2px;background:none;border:none;border-radius:0;color:#e6ffe6;font-size:14px;font-weight:600;letter-spacing:.5px;font-family:inherit}.nc-keybar .nc-enter-key{display:inline-flex;align-items:center;justify-content:center;border-left:1px solid #1c241c}.nc-keybar .nc-retract-key{display:inline-flex;align-items:center;justify-content:center;border-right:1px solid #1c241c}.nc-keybar .row button:active,.nc-keybar .nc-enter-key:active,.nc-keybar .nc-retract-key:active{background:#1d2a1d}.nc-keybar .row button.armed{color:#021;background:#0c6}.nc-keymenu{position:absolute;bottom:100%;left:8px;right:8px;z-index:30;display:flex;flex-wrap:wrap;gap:6px;padding:8px;background:#101810;border:1px solid #2a3a2a;border-radius:10px 10px 0 0}.nc-keymenu button{flex:1 0 30%;padding:10px 6px;border-radius:8px;border:1px solid #243;background:#122;color:#9fd;font-size:13px}.nc-keymenu button:active{background:#0c6;color:#021}.nc-keybar.copy{display:flex;gap:6px;overflow-x:auto;padding:8px;background:#14210f}.nc-keybar.copy button{flex:0 0 auto;padding:10px 12px;min-width:48px;border-radius:8px;border:1px solid #243;background:#122;color:#9fd;font-size:13px}.nc-keybar.copy button:active{background:#0c6;color:#021}.nc-keybar .tag{flex:0 0 auto;align-self:center;padding:0 8px;color:#8e8;font-size:12px}@media(pointer:coarse){.nc-keybar .row button,.nc-keybar .nc-enter-key,.nc-keybar .nc-retract-key{padding:12px 2px;font-size:15px}.nc-keygrid.compact .row button{padding-inline:0;font-size:clamp(10px,3vw,12px);letter-spacing:0}.nc-keygrid.compact .row button:nth-last-child(-n+2){font-size:10px}}.nc-files{position:fixed;top:0;right:0;bottom:0;width:min(340px,90vw);background:var(--bg, #111511);border-left:1px solid #2a332a;display:flex;flex-direction:column;z-index:30}.nc-files header{display:flex;justify-content:space-between;align-items:center;padding:8px 10px;border-bottom:1px solid #2a332a}.nc-files nav{display:flex;gap:6px;padding:8px 10px}.nc-files nav button{flex:0 0 auto;padding:4px 10px;border-radius:6px}.nc-files nav button.on{background:#2e7d32;color:#fff}.nc-files nav .up{margin-left:auto}.nc-files ul{list-style:none;margin:0;padding:0;overflow-y:auto;flex:1}.nc-files li{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid #1c231c}.nc-files li .name{flex:1;cursor:pointer;overflow-wrap:anywhere}.nc-files li.empty{opacity:.5;justify-content:center}.nc-busy{padding:4px 10px;font-size:12px;color:#e0a030}@media(pointer:coarse){.nc-files nav button,.nc-files li{min-height:42px}}.nc-files header button,.nc-files nav button,.nc-files li button{display:inline-flex;align-items:center;justify-content:center;gap:6px}.nc-composer{border-top:1px solid #2a332a;padding:6px max(8px,env(safe-area-inset-right)) max(6px,env(safe-area-inset-bottom)) max(8px,env(safe-area-inset-left));background:var(--bg, #111511)}.nc-composer-row{display:flex;gap:6px;align-items:flex-end}.nc-composer textarea{flex:1;min-width:0;min-height:42px;max-height:42vh;max-height:42dvh;resize:vertical;overflow-y:auto;background:#0a0e0a;color:#d8e0d8;border:1px solid #2a332a;border-radius:8px;padding:6px 8px;font:13px/1.4 inherit}.nc-composer textarea.expanded{height:clamp(128px,32dvh,320px)}.nc-composer .mic.on{background:#b02a2a;color:#fff}.nc-composer-err{font-size:12px;color:#e0a030;padding-bottom:4px}.nc-composer-info{font-size:12px;color:#baff79;padding-bottom:4px}@media(pointer:coarse){.nc-composer .mic,.nc-composer .go,.nc-composer .attach,.nc-composer .history{min-width:46px;min-height:46px;font-size:20px}.nc-composer textarea{resize:none;font-size:16px}.nc-attach-menu button,.nc-composer-history-menu button{min-height:48px}}.nc-composer .mic,.nc-composer .go,.nc-composer .attach,.nc-composer .history{display:inline-flex;align-items:center;justify-content:center;background:none;border:1px solid #243;color:#9fd;border-radius:8px;cursor:pointer}.nc-composer .go{color:#7ee787;border-color:#2e7d32}.nc-composer .go:disabled{opacity:.5;cursor:wait}.nc-composer .attach.busy{opacity:.5;animation:nc-attach-pulse 1s ease-in-out infinite}@keyframes nc-attach-pulse{50%{opacity:.9}}.nc-attach-menu{position:fixed;z-index:1000;min-width:180px;display:flex;flex-direction:column;padding:4px;background:#0e130e;border:1px solid #2e7d32;border-radius:10px;box-shadow:0 6px 24px #0000008c}.nc-attach-menu button{display:flex;align-items:center;gap:10px;text-align:left;min-height:40px;padding:8px 12px;border:0;border-radius:7px;background:none;color:#d8e0d8;font:14px/1 inherit;cursor:pointer}.nc-attach-menu button:hover,.nc-attach-menu button:focus-visible{background:#1a241a;color:#7ee787}.nc-composer-history-menu{position:fixed;z-index:1000;max-height:min(55dvh,420px);overflow-y:auto;display:flex;flex-direction:column;padding:4px;background:#0e130e;border:1px solid #2e7d32;border-radius:10px;box-shadow:0 6px 24px #0000008c}.nc-composer-history-menu button{border:0;border-radius:7px;background:none;color:#d8e0d8;font:13px/1.35 inherit;cursor:pointer}.nc-composer-history-menu button:hover,.nc-composer-history-menu button:focus-visible{background:#1a241a;color:#7ee787}.nc-composer-history-action{display:flex;align-items:center;gap:8px;min-height:38px;padding:7px 10px;text-align:left;border-bottom:1px solid #243!important;border-radius:7px 7px 0 0!important}.nc-composer-history-title{padding:8px 10px 5px;color:#7fb89a;font-size:11px;text-transform:uppercase;letter-spacing:.08em}.nc-composer-history-empty{padding:10px;color:#789a87;font-size:12px}.nc-composer-history-entry{display:flex;flex-direction:column;gap:2px;width:100%;padding:8px 10px;text-align:left}.nc-composer-history-entry span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-composer-history-entry small{color:#789a87;font-size:10px}.nc-composer-history-clear{min-height:36px;margin-top:3px;padding:7px 10px;color:#f99!important;text-align:left}@media(max-width:420px)and (pointer:coarse){.nc-composer-row{gap:4px}.nc-composer .mic,.nc-composer .go,.nc-composer .attach,.nc-composer .history{min-width:42px;width:42px}}.nc-live-host{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:1.3;color:#9fb3a4;padding:2px 0;min-width:0}.nc-live-host-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-live-host-remote{color:#7f8f84;font-size:11px;white-space:nowrap}.nc-live-host-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;background:#5c6b60;border:1px solid rgba(255,255,255,.18)}.nc-live-host-dot.none{background:#5c6b60}.nc-live-host-dot.designated{background:#7fe3ff}.nc-live-host-dot.present{background:#69b7ff}.nc-live-host-dot.active{background:#ff5a5a}.nc-live-host-dot.unknown{background:#e0b020}.nc-live-host-dot-header{margin-left:6px;vertical-align:middle}.nc-popup-velo{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;display:flex;align-items:center;justify-content:center;padding:2vmin;background:#0000009e}.nc-popup{display:flex;flex-direction:column;width:min(1100px,96vw);height:min(820px,92vh);overflow:hidden;position:relative;border:1px solid var(--nc-border, #1f3f2f);border-radius:10px;background:var(--nc-bg, #0b0f0d);box-shadow:0 10px 40px #0000008c}.nc-popup-testa{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--nc-border, #1f3f2f);flex:0 0 auto}.nc-popup-titolo{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600}.nc-popup-sub{opacity:.65;font-weight:400;font-size:.82em}.nc-popup-chiudi{flex:0 0 auto;min-width:40px;min-height:40px;border:1px solid var(--nc-border, #1f3f2f);border-radius:8px;background:transparent;color:inherit;cursor:pointer}.nc-popup-corpo{flex:1 1 auto;min-height:0;position:relative;overflow:auto}.nc-popup-corpo>iframe,.nc-popup-corpo>.nc-cellpanel{width:100%;height:100%;border:0}.nc-popup-libera{position:fixed;z-index:2}.nc-popup-angolo{position:absolute;right:0;bottom:0;width:18px;height:18px;cursor:nwse-resize;z-index:3}.nc-popup-angolo:after{content:"";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid var(--nc-border, #1f3f2f);border-bottom:2px solid var(--nc-border, #1f3f2f)}.nc-popup-velo-drag{position:fixed;top:0;right:0;bottom:0;left:0;z-index:4;background:transparent;cursor:grabbing}@media(max-width:720px){.nc-popup-velo{padding:0}.nc-popup{width:100vw;height:100vh;border:0;border-radius:0}.nc-popup-angolo{display:none}}.nc-cellpanel{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;background:var(--nc-bg, #0b1014)}.nc-cellpanel-frame{width:100%;height:100%;border:0;background:#fff}.nc-cellpanel-msg{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;color:var(--nc-fg, #cfe3ee);text-align:center;font-size:14px;line-height:1.5}.nc-cellpanel-actions{display:flex;gap:8px}.nc-cellpanel-actions button{padding:8px 14px;background:#122;border:1px solid #243;color:#9fd;border-radius:6px;cursor:pointer;font-size:14px}.nc-cellpanel-actions button:hover{background:#1a2a33}.nc-cellpanel-loading{position:absolute;top:10px;left:50%;transform:translate(-50%);z-index:6;padding:4px 12px;background:#0b1014d9;border:1px solid #243;border-radius:12px;color:#9fd;font-size:12px;pointer-events:none}.nc-cell-switcher-telemetry{color:#9fd8c2}.nc-peek-sorgenti{display:flex;gap:6px;margin-bottom:8px}.nc-peek-sorgente{border:1px solid rgba(216,255,232,.25);background:transparent;color:#d8ffe8;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer}.nc-peek-sorgente.attiva{background:#d8ffe829}.nc-peek-stream{min-height:46vh;display:flex;flex-direction:column}.nc-peek-testo{margin:0;padding:12px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.86rem;line-height:1.45}.nc-side-peek{border:none;background:transparent;padding:4px 6px;margin-left:-6px;cursor:pointer;display:inline-flex;align-items:center}.nc-side-peek .nc-dot{pointer-events:none}.nc-sidebar{display:flex;flex-direction:column;gap:8px;padding:12px 10px;color:#cfe;min-height:0;position:relative;overflow:hidden;box-sizing:border-box;border-right:1px solid #1c241c;background:#0a0e0a}.nc-sidebar.mini{padding:12px 4px;align-items:center;gap:6px}.nc-side-resize{position:absolute;top:0;right:0;bottom:0;width:6px;cursor:col-resize;z-index:5}.nc-side-resize:hover{background:#1c3a1c}.nc-collapse-btn{flex:0 0 auto;background:none;border:1px solid #243;color:#9fd;border-radius:8px;min-width:26px;min-height:26px;cursor:pointer;font-size:13px;line-height:1}.nc-collapse-btn:hover{border-color:#2e7d32;color:#d8ffe8}.nc-side-head{display:flex;align-items:center;gap:6px;justify-content:space-between;padding:2px 4px 6px}.nc-side-head.mini{padding:2px 0 6px;justify-content:center}.nc-side-scroll{min-height:0;flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:8px;padding-right:2px}.nc-side-scroll.mini{width:100%;align-items:center}.nc-side-group.mini{align-items:center;gap:6px}.nc-mini-dot,.nc-mini-init{display:flex;align-items:center;justify-content:center;width:34px;height:34px;box-sizing:border-box;border:1px solid #1c241c;background:#0e140e;border-radius:9px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#d8ffe8;padding:0}.nc-mini-init{font-size:13px;font-weight:700}.nc-mini-dot:hover,.nc-mini-init:hover{border-color:#244}.nc-mini-dot.active,.nc-mini-init.active{border-color:#2e7d32;background:#14200f}.nc-side-title{font-size:13px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;opacity:.8}.nc-side-fleet-stale{color:#e0b020;font-size:12px;cursor:help}.nc-side-fleet-off{color:#8fa08f;font-size:12px;cursor:help}.nc-new-btn{background:#2e7d32;color:#fff;border:none;border-radius:8px;padding:4px 10px;font-size:12px;cursor:pointer}.nc-new-btn:active{background:#255028}.nc-side-group{display:flex;flex-direction:column;gap:6px}.nc-side-group-title{font-size:11px;opacity:.55;text-transform:uppercase;letter-spacing:.5px;padding:10px 4px 2px}.nc-node-title{display:flex;align-items:center;gap:6px;opacity:.8}.nc-node-title[role=button]{cursor:pointer;border-radius:6px}.nc-node-title[role=button]:focus-visible{outline:1px solid #2e7d32}.nc-node-title .nc-dot{width:7px;height:7px;flex:0 0 auto}.nc-node-title b{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.nc-node-title small{text-transform:none;letter-spacing:0;opacity:.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-node-chevron{flex:0 0 10px;font-size:13px}.nc-node-filter{flex:0 0 auto;max-width:82px;min-width:58px;padding:3px 18px 3px 5px;border:1px solid #243;border-radius:6px;background:#0a0e0a;color:#9fd;font:10px/1.2 inherit;text-transform:lowercase}.nc-node-title>.nc-roster-handle{flex-basis:20px;width:20px;min-width:20px;height:24px}.nc-node-rename{flex:0 0 auto;width:26px;height:26px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:#7fa892;cursor:pointer;font:15px/1 inherit}.nc-node-rename:hover,.nc-node-rename:focus-visible{color:#caffe0;border-color:#00cc6659;outline:none}.nc-node-order-wrap.nc-roster-dragging{opacity:.62}.nc-node-order-wrap.nc-roster-over{outline:2px solid rgba(0,204,102,.72);outline-offset:2px;border-radius:8px}.nc-cell{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid #1c241c;background:#0e140e;border-radius:10px;overflow:hidden}.nc-cell-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.nc-cell-main b{font-size:13px;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.nc-cell-main small{font-size:11px;opacity:.6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.nc-power,.nc-boot{flex:0 0 auto;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;border-radius:50%;cursor:pointer}.nc-power.on{color:#0c6;border-color:#00cc668c;background:#00cc661a}.nc-boot.on{color:#69b7ff;border-color:#69b7ff94;background:#69b7ff1a}.nc-power.warn{color:#e8c547;border-color:#e8c5478c;background:#e8c5471a}.nc-power:hover,.nc-boot:hover{filter:brightness(1.25)}.nc-boot:disabled{cursor:wait;opacity:.55}.nc-dot{flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:#355}.nc-dot.on{background:#0c6;box-shadow:0 0 6px #0c68}.nc-dot.warn{background:#e0b020;box-shadow:0 0 6px #e0b02088}.nc-side-card{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid #1c241c;background:#0e140e;border-radius:10px;cursor:grab;-webkit-user-select:none;user-select:none}.nc-side-card:hover{border-color:#244}.nc-side-card.active{border-color:#2e7d32;background:#14200f}.nc-side-card:active{cursor:grabbing}.nc-card-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.nc-card-main b{font-size:13px;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-card-main small{font-size:11px;opacity:.55;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-rel{flex:0 0 auto;font-size:10px;opacity:.45}.nc-menu{flex:0 0 auto;width:26px;height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:#9fd;cursor:pointer;font-size:15px;line-height:1;border-radius:50%}.nc-menu:active{color:#f88}.nc-empty{opacity:.4;padding:8px 4px;font-size:12px}.nc-side-gear{display:flex;align-items:center;gap:8px;background:none;border:1px solid #1c241c;border-radius:10px;color:#9fd;font-size:12px;padding:7px 10px;cursor:pointer;margin-top:0;flex:0 0 auto}.nc-side-gear:hover{border-color:#2e7d32;color:#d8ffe8}.nc-side-gear.mini{justify-content:center;width:34px;height:34px;box-sizing:border-box;padding:0;border-radius:9px;margin:6px auto 0}.nc-side-lang{flex:0 0 auto;padding:4px;display:flex;align-items:center;gap:2px;font-size:11px;opacity:.6}.nc-lang-btn{background:none;border:none;color:inherit;cursor:pointer;font-size:11px;padding:0 1px;opacity:.5;text-transform:uppercase}.nc-lang-btn.on{opacity:1;font-weight:700;color:#d8ffe8}.nc-cell.live{cursor:pointer}.nc-cell.live:hover{background:#ffffff0f}.nc-cell.active{outline:1px solid rgba(0,204,102,.5)}.nc-cell.preserved{opacity:.55;border-style:dashed;cursor:default}.nc-cell.preserved .nc-cell-main b{color:#8fa08f}.nc-cell.preserved .nc-cell-main small{font-style:italic}.nc-side-presets{display:flex;gap:4px;padding:2px 8px 6px}.nc-side-presets button{background:none;border:1px solid rgba(255,255,255,.15);border-radius:4px;color:inherit;cursor:pointer;padding:2px 8px}.nc-side-presets button:hover{background:#ffffff14}.nc-pin{flex:0 0 auto;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;cursor:pointer;border-radius:50%;font-size:14px;line-height:1}.nc-pin:hover{filter:brightness(1.25)}.nc-pin.on{color:#e8c547;border-color:#e8c5478c;background:#e8c54714}.nc-pin.designated{color:#c8a6ff;border-color:#c8a6ff99;background:#c8a6ff1f}.nc-pin.thread-present{color:#69b7ff;border-color:#69b7ff99;background:#69b7ff1f}.nc-pin.thread-active{color:#ff5a5a;border-color:#ff5a5a99;background:#ff5a5a1f}.nc-pin.thread-unknown{color:#e0b020;border-color:#e0b02099;background:#e0b0201f}.nc-technical{flex:0 0 auto;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;cursor:pointer;border-radius:50%;font:12px/1 monospace}.nc-technical.on{color:#d8a8ff;border-color:#b478ff8c;background:#b478ff1a}.nc-mini-tip{position:fixed;left:56px;transform:translateY(-50%);background:#161b16;color:#e6ffe6;border:1px solid rgba(0,204,102,.4);padding:3px 10px;border-radius:4px;white-space:nowrap;z-index:1000;pointer-events:none;font-size:12px}.nc-roster-handle{flex:0 0 24px;width:24px;min-width:24px;height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:6px;background:transparent;color:#668875;cursor:grab;font:15px/1 monospace;touch-action:none}.nc-roster-handle:hover,.nc-roster-handle:focus-visible,.nc-roster-handle.active{color:#9fd;background:#00cc661a;outline:none}.nc-roster-handle:active,.nc-roster-handle.active{cursor:grabbing}.nc-side-card.nc-roster-dragging,.nc-cell.nc-roster-dragging{opacity:.62}.nc-side-card.nc-roster-over,.nc-cell.nc-roster-over{outline:2px solid rgba(0,204,102,.72);outline-offset:2px}.nc-tile{display:flex;flex-direction:column;min-height:0;min-width:0;position:relative;background:#0a0e0a;border:1px solid #1c241c;border-radius:8px;overflow:hidden}.nc-tile.focused{border-color:#2e7d32;box-shadow:0 0 0 1px #2e7d3244 inset}.nc-tile-head{flex:0 0 auto;display:flex;align-items:center;gap:6px;padding:3px 6px;background:#0e140e;border-bottom:1px solid #1c241c;height:28px}.nc-tile-name{flex:1 1 auto;min-width:0;display:inline-flex;align-items:center;gap:6px;background:none;border:none;color:#cfe;cursor:pointer;padding:0}.nc-tile-name b{font-size:12px;font-weight:600;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-tile .nc-dot{width:7px;height:7px;flex:0 0 auto}.nc-tile-actions{flex:0 0 auto;display:inline-flex;gap:2px}.nc-tile-actions button{background:none;border:none;color:#9fd;cursor:pointer;min-width:22px;height:22px;font-size:13px;border-radius:4px;padding:0 3px}.nc-tile-actions button:hover{color:#d8ffe8}.nc-tile-actions .nc-tile-close:hover{color:#f88}.nc-tile-body{flex:1 1 auto;position:relative;min-height:0}.nc-tile-body .nc-terminal{width:100%;height:100%}.nc-tile-unavailable{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:20px;color:#789a87;text-align:center;font-size:12px;background:repeating-linear-gradient(135deg,#0a0e0a,#0a0e0a 12px,#0d130d 12px,#0d130d 24px)}.nc-tile-composer{flex:0 0 auto;border-top:1px solid #1c241c}.nc-tile-files{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;background:#0e140e}.nc-tile-head{cursor:grab}.nc-tile-head:active{cursor:grabbing}.nc-grid{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:row;padding:6px;gap:0;position:relative;background:#070a07}.nc-col{display:flex;flex-direction:column;min-width:120px;min-height:0;position:relative}.nc-col.drop-newcol:before{content:"";position:absolute;left:-3px;top:0;bottom:0;width:3px;background:#0c6;border-radius:2px;z-index:6}.nc-tile-slot{display:flex;flex-direction:column;min-height:60px;min-width:0;position:relative}.nc-tile-slot>.nc-tile{flex:1 1 auto;min-height:0}.nc-tile-slot.drop-left:after,.nc-tile-slot.drop-right:after,.nc-tile-slot.drop-top:after,.nc-tile-slot.drop-bottom:after{content:"";position:absolute;z-index:7;pointer-events:none;background:#00cc6647;border:2px solid #00cc66;border-radius:4px}.nc-tile-slot.drop-left:after{left:0;top:0;bottom:0;width:50%}.nc-tile-slot.drop-right:after{right:0;top:0;bottom:0;width:50%}.nc-tile-slot.drop-top:after{left:0;right:0;top:0;height:50%}.nc-tile-slot.drop-bottom:after{left:0;right:0;bottom:0;height:50%}.nc-grid-toolbar{position:absolute;top:10px;right:12px;z-index:8;display:flex;gap:4px;background:#0a100ad1;border:1px solid #1c241c;border-radius:8px;padding:3px}.nc-grid-toolbar button{background:none;border:none;color:#9fd;cursor:pointer;font-size:15px;line-height:1;padding:4px 7px;border-radius:6px}.nc-grid-toolbar button:hover{background:#1c3a1c;color:#d8ffe8}.nc-divider-v{flex:0 0 6px;cursor:col-resize;margin:0 1px;border-radius:2px}.nc-divider-v:hover{background:#1c3a1c}.nc-divider-h{flex:0 0 6px;cursor:row-resize;margin:1px 0;border-radius:2px}.nc-divider-h:hover{background:#1c3a1c}.nc-drop-line-v{flex:0 0 3px;align-self:stretch;background:#0c6;border-radius:2px}.nc-drop-line-end{margin-left:3px}.nc-grid-empty{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:#cfe;opacity:.4;font-size:13px;text-align:center;padding:20px}.nc-deckbar{display:flex;align-items:center;gap:8px;flex:0 0 auto;min-width:0;padding:5px 8px;background:#0e140e;border-bottom:1px solid #1c2a1c;overflow-x:auto;white-space:nowrap}.nc-deckbar-label{font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.5;color:#9fd;flex:0 0 auto}.nc-deck-sidebar-toggle{flex:0 0 auto;min-width:28px;height:26px;border:1px solid #243;border-radius:6px;background:#0a0e0a;color:#9fd;cursor:pointer;font:inherit}.nc-deck-sidebar-toggle:hover{border-color:#7aa903}.nc-deck-chips{display:flex;align-items:center;gap:6px;flex:0 1 auto;min-width:0}.nc-deck-owner-group{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 2px;border:1px solid #182318;border-radius:8px;background:#0b100b;flex:0 0 auto}.nc-deck-owner{max-width:120px;padding:0 4px;overflow:hidden;text-overflow:ellipsis;color:#789a87;font-size:9px;text-transform:uppercase;letter-spacing:.04em}.nc-deck-chip{display:inline-flex;align-items:center;border:1px solid #243;border-radius:6px;overflow:hidden;background:#0a0e0a}.nc-deck-chip.current{border-color:#7aa903}.nc-deck-chip.offline{opacity:.58;border-style:dashed}.nc-deck-chip.nc-deck-dragging{opacity:.58}.nc-deck-chip.nc-deck-over{box-shadow:0 0 0 2px #0c6 inset}.nc-deck-handle{align-self:stretch;min-width:25px;padding:0 5px;background:#ffffff09;border:0;border-right:1px solid #1c2a1c;color:#789a87;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;font:11px/1 monospace}.nc-deck-handle:hover,.nc-deck-handle:focus-visible,.nc-deck-handle.active{color:#bfffd8;background:#00cc661f;outline:none}.nc-deck-handle.active{cursor:grabbing}.nc-deck-open{background:none;border:none;color:#cfe;padding:3px 8px;font:inherit;font-size:12px;cursor:pointer;max-width:180px;overflow:hidden;text-overflow:ellipsis}.nc-deck-chip.current .nc-deck-open{color:#d9f7c7}.nc-deck-open:hover{background:#132013}.nc-deck-open:disabled,.nc-deck-mini:disabled,.nc-deck-newbtn:disabled{cursor:not-allowed;opacity:.55}.nc-deck-mini{background:none;border:none;border-left:1px solid #1c2a1c;color:#7a9;padding:3px 6px;font:inherit;font-size:11px;cursor:pointer}.nc-deck-mini:hover{background:#132013;color:#9fd}.nc-deck-del:hover{color:#f99}.nc-deck-newbtn{background:none;border:1px dashed #2a3a2a;color:#9fd;border-radius:6px;padding:3px 7px;font:inherit;font-size:11px;cursor:pointer;flex:0 0 auto}.nc-deck-newbtn:hover{border-color:#7aa903}.nc-deck-add{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto}.nc-deck-add input{padding:3px 8px;background:#122;border:1px solid #243;color:#cfe;border-radius:6px;font:inherit;font-size:12px;width:130px}.nc-deck-add input.invalid{border-color:#a44}.nc-deck-slug{color:#7a9;font-size:10px;max-width:130px;overflow:hidden;text-overflow:ellipsis}.nc-deck-ok,.nc-deck-cancel{background:#122;border:1px solid #243;color:#9fd;border-radius:6px;padding:3px 9px;font:inherit;font-size:12px;cursor:pointer}.nc-deck-ok:disabled{opacity:.4;cursor:default}.nc-deck-state{font-size:10px;color:#7a9;min-width:64px}.nc-deck-state.error,.nc-deck-error{color:#f88;font-size:10px}.nc-deck-fallback{color:#fd8;font-size:11px}.nc-tile-deck{background:#0a0e0a;border:1px solid #243;color:#9fd;border-radius:5px;font:inherit;font-size:11px;padding:1px 3px;max-width:92px}.nc-deck-owner-toggle{display:inline-flex;align-items:center;gap:2px;background:none;border:0;padding:0 2px;margin:0;color:inherit;font:inherit;cursor:pointer;border-radius:4px;flex:0 0 auto;max-width:140px}.nc-deck-owner-toggle:hover{background:#00cc6614}.nc-deck-owner-toggle:focus-visible{outline:2px solid #7aa903;outline-offset:1px}.nc-deck-owner-toggle .nc-deck-owner{padding:0 2px}.nc-deck-owner-caret{color:#5a7a68;font-size:9px;flex:0 0 auto}.nc-deck-owner-group.collapsed{background:#090d09}.nc-deck-owner-content{display:inline-flex;align-items:center;gap:4px}.nc-deck-owner-content[hidden]{display:none}.nc-deck-owner-group.collapsed .nc-deck-owner-content{gap:3px}.nc-deck-summary{display:inline-flex;align-items:center;gap:3px;padding:0 3px 0 1px;font-size:9px;color:#6f8c7c;max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-deck-summary-count{background:#15241a;color:#9fd;border-radius:8px;padding:0 5px;font-size:9px;flex:0 0 auto}.nc-deck-summary-current{color:#d9f7c7}.nc-deck-dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin:0 3px 0 4px;flex:0 0 auto;background:#2a3a2a}.nc-deck-dot.working{background:#0c6;box-shadow:0 0 5px #0c6}.nc-deck-dot.on{background:#6a9}.nc-deck-dot.neutral{background:#526652}.nc-deck-dot.warn{background:#d93}.nc-deck-chip.offline .nc-deck-dot{opacity:.7}.nc-pair-card{border:1px solid #2f5;border-radius:8px;box-shadow:0 0 0 1px #22ff5514}.nc-pair-input{width:100%;min-width:0;box-sizing:border-box;font-size:15px;padding:10px}.nc-pair-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.nc-pair-status{min-height:1em}.nc-pair-progress{color:#9f9;animation:nc-pair-pulse 1.2s ease-in-out infinite}@keyframes nc-pair-pulse{0%,to{opacity:1}50%{opacity:.45}}.nc-pair-hint{opacity:.85;margin-top:4px;font-size:12px}.nc-pair-notice{display:block}.nc-pair-advanced-toggle{align-self:flex-start}.nc-pair-advanced{display:flex;flex-direction:column;gap:8px;min-width:0}.nc-qr-overlay{z-index:80}.nc-qr-modal{max-width:min(480px,calc(100vw - 32px));width:100%}.nc-qr-video{width:100%;max-height:60dvh;border-radius:6px;background:#000;object-fit:cover}.nc-qr-upload{display:inline-flex;align-items:center;cursor:pointer}.nc-authkeys{display:flex;flex-direction:column;gap:6px;margin-top:10px;padding:10px;border:1px solid #2f5;border-radius:8px;background:#22ff550a}.nc-authkeys-line{width:100%;min-width:0;box-sizing:border-box;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;word-break:break-all;resize:vertical}.nc-authkeys .nc-btn{align-self:flex-start}.nc-detail-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:75;background:#0009;display:flex;align-items:flex-end;justify-content:center;overscroll-behavior:contain}.nc-detail-sheet{width:100%;max-height:88dvh;display:flex;flex-direction:column;min-height:0;background:#0e140e;color:#cfe;border:1px solid #243;border-bottom:none;border-radius:14px 14px 0 0;box-shadow:0 -12px 40px #0000008c;outline:none}.nc-detail-head{display:flex;align-items:flex-start;gap:10px;padding:14px 14px 10px;border-bottom:1px solid #1b2a1b;position:sticky;top:0;background:#0e140e;z-index:1}.nc-detail-title{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.nc-detail-title b{font-size:16px;color:#d8ffe8;overflow-wrap:anywhere}.nc-detail-title small{font-size:12px;opacity:.65;overflow-wrap:anywhere}.nc-detail-close{padding:6px 8px;flex:none}.nc-detail-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:12px 14px;display:flex;flex-direction:column;gap:16px}.nc-detail-body.plain{padding:0;gap:0}.nc-detail-section{display:flex;flex-direction:column;gap:8px;min-width:0}.nc-detail-foot{display:flex;flex-wrap:wrap;gap:8px;padding:10px 14px;border-top:1px solid #1b2a1b;background:#0b110b;padding-bottom:max(10px,env(safe-area-inset-bottom))}.nc-detail-foot .nc-btn{white-space:nowrap;display:inline-flex;align-items:center;gap:6px}.nc-detail-facts{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 10px;padding:10px;border:1px solid #243;border-radius:8px;background:#0a0e0a;font-size:13px;min-width:0;overflow-wrap:anywhere}.nc-detail-facts dt{opacity:.65}.nc-detail-facts dd{margin:0}.nc-detail-grants{display:flex;flex-direction:column;gap:6px}.nc-detail-grant{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #243;border-radius:8px;background:#0a0e0a;font-size:13px;min-width:0}.nc-detail-grant>span{flex:1;min-width:0;overflow-wrap:anywhere}.nc-detail-grant.unknown>span{opacity:.6;font-style:italic}.nc-detail-picker{display:flex;flex-direction:column;gap:6px}.nc-detail-picker input{padding:9px 10px;font:14px/1.2 inherit;box-sizing:border-box;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;width:100%;min-width:0}.nc-detail-picker input:focus{outline:none;border-color:#2e7d32}.nc-detail-picker-list{display:flex;flex-wrap:wrap;gap:6px}@media(min-width:600px){.nc-detail-overlay{align-items:stretch;justify-content:flex-end}.nc-detail-sheet{width:min(440px,100%);max-height:none;height:100%;border:none;border-left:1px solid #243;border-radius:0;box-shadow:-12px 0 40px #0000008c}}.nc-vl-prompt{display:flex;gap:8px;align-items:flex-end}.nc-vl-prompt textarea{flex:1 1 auto;min-height:64px;resize:vertical;background:#101810;color:#d8ffe8;border:1px solid #2d4634;border-radius:4px;padding:6px 8px;font:inherit}.nc-set-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;background:#0000008c;display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.nc-set-panel{width:100%;max-width:560px;max-height:90vh;background:#0e140e;color:#cfe;border:1px solid #243;border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:12px;box-shadow:0 12px 40px #00000080;overflow:hidden}@media(max-width:1023px){.nc-set-overlay{padding:0}.nc-set-panel{max-width:none;max-height:none;height:100%;border-radius:0;border:none}}.nc-set-head{display:flex;align-items:center;gap:8px}.nc-set-head b{font-size:16px;color:#d8ffe8;flex:1}.nc-set-close{background:none;border:none;color:#9fd;cursor:pointer;padding:4px}.nc-set-readonly{font-size:12px;color:#e0b020;border:1px solid #4a3a10;border-radius:8px;padding:8px 10px;background:#171307}.nc-set-tabs-wrap{position:relative;min-width:0}.nc-set-tabs-wrap:before,.nc-set-tabs-wrap:after{content:"";position:absolute;z-index:1;top:0;bottom:9px;width:28px;opacity:0;pointer-events:none;transition:opacity .16s ease}.nc-set-tabs-wrap:before{left:0;background:linear-gradient(90deg,#0e140e 10%,#0e140e00)}.nc-set-tabs-wrap:after{right:0;background:linear-gradient(270deg,#0e140e 10%,#0e140e00)}.nc-set-tabs-wrap.has-start-overflow:before,.nc-set-tabs-wrap.has-end-overflow:after{opacity:1}.nc-set-tabs{display:flex;gap:6px;min-width:0;overflow-x:auto;overflow-y:hidden;border-bottom:1px solid #1c241c;padding-bottom:8px;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;scrollbar-width:thin;scrollbar-color:rgba(159,255,221,.35) transparent}.nc-set-tabs .nc-set-tabbtn{flex:0 0 auto;min-height:44px;white-space:nowrap}.nc-set-tabbtn{background:none;border:1px solid #1c241c;border-radius:8px;color:#9fd;font-size:12px;padding:6px 12px;cursor:pointer;text-transform:uppercase;letter-spacing:.5px}.nc-set-tabbtn.on{border-color:#2e7d32;background:#14200f;color:#d8ffe8}.nc-system-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.nc-system-tabs .nc-set-tabbtn{min-width:0;text-transform:none}.nc-system-group{display:flex;flex-direction:column;gap:8px}.nc-system-group>h3{margin:0;color:#d8ffe8;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.nc-system-diagnostics{gap:12px}.nc-alternate-screen-settings{border:1px solid #243;border-radius:10px;padding:10px}.nc-set-body{overflow-y:auto;flex:1;min-height:120px}.nc-set-tab{display:flex;flex-direction:column;gap:12px}.nc-set-tab .nc-check span{display:flex;flex-direction:column;gap:2px}.nc-set-tab .nc-check small{opacity:.6;font-size:11px}.nc-set-info{font-size:12px;opacity:.7;line-height:1.6}.nc-set-note{font-size:12px;color:#9fd}.nc-set-hint{font-size:11px;opacity:.7}.nc-set-form{display:flex;flex-direction:column;gap:8px}.nc-set-form .nc-field{display:flex;flex-direction:column;gap:4px;font-size:12px;opacity:.82}.nc-set-form .nc-field small{font-size:10px;opacity:.7;line-height:1.3}.nc-set-ports{display:grid;grid-template-columns:1fr 1fr;gap:8px}@media(max-width:520px){.nc-set-ports{grid-template-columns:1fr}}.nc-set-form input:not([type=checkbox]):not([type=file]){padding:9px 10px;font:14px/1.2 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;width:100%;min-width:0;max-width:100%;box-sizing:border-box}.nc-set-form input:focus{outline:none;border-color:#2e7d32}.nc-set-form input:disabled{opacity:.5}.nc-set-form textarea,.nc-set-form select{padding:9px 10px;font:13px/1.3 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;min-height:36px;width:100%;min-width:0;max-width:100%;box-sizing:border-box}.nc-set-form textarea{min-height:72px;resize:vertical}.nc-fleet-editor{gap:10px}.nc-fleet-view-tabs{display:grid;grid-template-columns:1fr 1fr;gap:6px;position:sticky;top:0;z-index:2;background:#0e140e;padding-bottom:6px}.nc-fleet-view-tabs .nc-set-tabbtn{width:100%;text-transform:none}.nc-fleet-section-head,.nc-fleet-item{display:flex;align-items:center;justify-content:space-between;gap:8px}.nc-fleet-section-head{margin-top:4px;border-bottom:1px solid #243;padding-bottom:6px}.nc-fleet-item{border:1px solid #1c241c;border-radius:8px;padding:8px}.nc-fleet-label{color:#9fb89f;font-style:italic}.nc-fleet-item>span{display:flex;gap:6px;align-items:center;min-width:0}.nc-fleet-item>span:first-child{flex-direction:column;align-items:flex-start;min-width:0}.nc-fleet-item>span:last-child{flex-wrap:wrap;justify-content:flex-end}.nc-fleet-item>span:first-child b,.nc-fleet-item>span:first-child small{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-fleet-item small{opacity:.6}.nc-fleet-tag{display:inline-block;padding:1px 6px;border-radius:6px;font-size:11px;font-weight:600;line-height:1.5;border:1px solid rgba(224,176,32,.55);color:#e0b020;background:#e0b0201f}.nc-fleet-tag.nc-fleet-tag-warn{color:#e8c547;border-color:#e8c5478c;background:#e8c5471a}.nc-cwd-rel-row{display:flex;align-items:center;gap:6px}.nc-cwd-rel-prefix{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;opacity:.85;flex:0 0 auto}.nc-cwd-rel-row input{flex:1;min-width:0}.nc-cwd-preview{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;opacity:.85;word-break:break-all}.nc-cwd-suggestion{display:flex;flex-wrap:wrap;align-items:center;gap:6px;font-size:12px;color:#e8c547;border:1px solid rgba(232,197,71,.4);background:#e8c54714;border-radius:8px;padding:6px 8px}.nc-cwd-no-source{font-size:12px;opacity:.65}.nc-fleet-form{border:1px solid #2e7d32;border-radius:10px;padding:10px}.nc-fleet-key{display:flex;flex-direction:column;gap:7px;border:1px solid #36523b;border-radius:9px;padding:10px;background:#0a100b}.nc-fleet-key-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.nc-fleet-key-head>b{letter-spacing:.08em}.nc-fleet-key-head>span{font-size:11px;opacity:.72}.nc-fleet-key-input{display:flex;gap:6px}.nc-fleet-key-input>input{flex:1;min-width:0}.nc-fleet-key-missing{align-items:flex-start;color:#ffca80}.nc-fleet-provider-notice{border-left:2px solid #6b7f3e;padding-left:8px;line-height:1.35}.nc-fleet-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:75;padding:16px;display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:#000000b8;overscroll-behavior:contain}.nc-fleet-modal-dialog{width:min(680px,100%);max-height:calc(100dvh - 32px);overflow-y:auto;border-radius:12px;background:#0e140e;box-shadow:0 14px 50px #000000b3;overscroll-behavior:contain}.nc-fleet-modal-dialog .nc-fleet-form{margin:0;padding:14px}.nc-fleet-head-actions{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}.nc-fleet-pair,.nc-fleet-env{display:flex;gap:6px}.nc-fleet-pair input,.nc-fleet-pair select,.nc-fleet-env input{flex:1;min-width:0}@media(max-width:520px){.nc-fleet-modal{padding:0;align-items:stretch}.nc-fleet-modal-dialog{width:100%;max-height:100dvh;border-radius:0}.nc-fleet-item{align-items:stretch;flex-direction:column}.nc-fleet-item>span:last-child{width:100%;justify-content:flex-start}.nc-fleet-pair{flex-direction:column}}.nc-invite-endpoint{border:1px solid #243;border-radius:8px;padding:9px 10px;overflow-wrap:anywhere}.nc-local-share{border:1px solid #243;border-radius:10px;padding:10px;background:#0a0e0a}.nc-local-share .nc-node-share{padding:2px 0}.nc-invite-advanced{display:flex;flex-direction:column;gap:8px;padding:9px;border-left:2px solid #243}.nc-invite-actions{flex-wrap:wrap}.nc-update-settings,.nc-backup-dialog{border:1px solid #243;border-radius:10px;padding:10px}.nc-backup-tabs{margin:0}.nc-backup-list{display:flex;flex-direction:column;gap:6px;max-height:42vh;overflow-y:auto}.nc-backup-row,.nc-backup-import-row{border:1px solid #1c241c;border-radius:8px;padding:8px}.nc-backup-import-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(160px,.7fr);gap:8px;align-items:center}@media(max-width:520px){.nc-backup-import-row{grid-template-columns:1fr}}.nc-set-node{border:1px solid #1c241c;border-radius:10px;padding:10px;display:flex;flex-direction:column;gap:8px;background:#0a0e0a}.nc-peer-group{display:flex;flex-direction:column;gap:8px}.nc-peer-group-title{display:flex;align-items:center;justify-content:space-between;color:#9fd;font-size:12px;font-weight:600;padding:2px 1px}.nc-peer-group-title span{color:#789;font-variant-numeric:tabular-nums}.nc-set-node.routed{border-style:dashed;background:#090d0b}.nc-node-editor{border-top:1px solid #243;padding-top:10px}.nc-node-row{flex-direction:row;align-items:center;gap:8px;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:48px}.nc-node-row:hover{border-color:#2e7d32}.nc-node-row:focus-visible{outline:2px solid #2e7d32;outline-offset:2px}.nc-node-row-text{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.nc-node-row-text b{color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-node-row-text small{opacity:.6;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-node-row-more{flex:none;opacity:.5;display:flex}.nc-set-node-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.nc-set-node-head b{color:#d8ffe8}.nc-set-node-head small{opacity:.6;font-size:11px}.nc-set-tunnel{margin-left:auto;font-size:11px;color:#f88}.nc-set-tunnel.up{color:#6c6}.nc-set-node-actions{display:flex;gap:6px;flex-wrap:wrap}.nc-set-node-actions .nc-btn{padding:5px 10px;font-size:12px}.nc-set-test{font-size:11px}.nc-set-test.ok{color:#6c6}.nc-set-test.ko{color:#f88}.nc-diagnostics .nc-field{display:flex;flex-direction:column;gap:4px;font-size:12px}.nc-diag-controls{border:1px solid #243;border-radius:10px;padding:10px}.nc-diag-filters{display:grid;grid-template-columns:minmax(110px,.45fr) minmax(0,1fr);gap:8px}.nc-diag-filters select,.nc-diag-filters input,.nc-diagnostics>.nc-field select{padding:8px 9px;font:12px/1.3 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;min-width:0;width:100%;box-sizing:border-box}.nc-diag-log{min-height:220px;max-height:42vh;margin:0;padding:10px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text;background:#070a07;color:#bde8c8;border:1px solid #1c241c;border-radius:8px;font:11px/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:520px){.nc-set-tabs{scrollbar-width:none;-ms-overflow-style:none}.nc-set-tabs::-webkit-scrollbar{display:none}.nc-set-tabs .nc-set-tabbtn{min-width:max-content;padding-inline:12px}.nc-diag-filters{grid-template-columns:1fr}.nc-diag-log{min-height:35vh;max-height:48vh}}.nc-set-copyline{display:flex;gap:8px;align-items:center}.nc-set-copyline code{flex:1;font-size:10px;word-break:break-all;-webkit-user-select:all;user-select:all;background:#0a0e0a;border:1px solid #1c241c;border-radius:6px;padding:6px;max-height:72px;overflow-y:auto}.nc-set-akeys{display:flex;flex-direction:column;gap:6px}.nc-set-row{display:flex;gap:8px;flex-wrap:wrap}.nc-set-confirm{border:1px solid #4a3a10;border-radius:10px;padding:10px;background:#171307;font-size:12px;color:#e8d8a0;display:flex;flex-direction:column;gap:10px}.nc-set-panel .nc-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.nc-set-panel .nc-check input{accent-color:#2e7d32;margin-top:2px}.nc-set-panel .nc-btn{border:none;border-radius:8px;padding:8px 16px;font-size:13px;cursor:pointer}.nc-set-panel .nc-btn.ghost{background:none;border:1px solid #243;color:#9fd}.nc-set-panel .nc-btn.primary{background:#2e7d32;color:#fff}.nc-set-panel .nc-btn.danger{background:none;border:1px solid #532;color:#f88}.nc-set-panel .nc-btn:disabled{opacity:.5;cursor:default}.nc-set-panel .nc-sheet-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.nc-set-panel .nc-sheet-label{font-size:12px;opacity:.7;text-transform:uppercase;letter-spacing:.5px}.nc-set-panel .nc-err{color:#f88;font-size:12px}.nc-set-panel .nc-empty{opacity:.5;font-size:12px}.nc-set-panel .nc-dot{width:8px;height:8px;border-radius:50%;background:#333;display:inline-block;flex:0 0 8px}.nc-set-panel .nc-dot.on{background:#2e7d32}.nc-model-test{font-weight:600}.nc-model-test.ok{color:var(--success)}.nc-model-test.unknown-model{color:var(--error)}.nc-model-test.auth,.nc-model-test.unreachable{color:var(--warning)}.nc-model-test.unverified{color:var(--text-secondary);font-style:italic}.nc-wiz-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;background:#000000b3;display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.nc-wiz{width:100%;max-width:420px;max-height:90vh;overflow-y:auto;background:#0e140e;color:#cfe;border:1px solid #243;border-radius:14px;padding:18px;display:flex;flex-direction:column;gap:14px;box-shadow:0 12px 40px #00000080}.nc-wiz-head{display:flex;flex-direction:column;gap:4px}.nc-wiz-head b{font-size:17px;color:#d8ffe8}.nc-wiz-head small{font-size:12px;opacity:.65;text-transform:uppercase;letter-spacing:.5px}.nc-wiz-body{display:flex;flex-direction:column;gap:10px}.nc-wiz-body input{padding:9px 10px;font:14px/1.2 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px}.nc-wiz-body input:focus{outline:none;border-color:#2e7d32}.nc-wiz-body .nc-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:#bfe8cd}.nc-wiz-body .nc-field small{font-size:10px;opacity:.58;line-height:1.3}.nc-wiz-help{margin:0;font-size:11px;line-height:1.4;opacity:.7}.nc-wiz-ports{display:grid;grid-template-columns:1fr 1fr;gap:10px}@media(max-width:420px){.nc-wiz-ports{grid-template-columns:1fr}}.nc-wiz-done{font-size:13px;opacity:.85}.nc-wiz .nc-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.nc-wiz .nc-check input{accent-color:#2e7d32;margin-top:2px}.nc-wiz .nc-check span{display:flex;flex-direction:column;gap:2px}.nc-wiz .nc-check small{opacity:.6;font-size:11px}.nc-wiz .nc-btn{border:none;border-radius:8px;padding:8px 16px;font-size:13px;cursor:pointer}.nc-wiz .nc-btn.ghost{background:none;border:1px solid #243;color:#9fd}.nc-wiz .nc-btn.primary{background:#2e7d32;color:#fff}.nc-wiz .nc-btn:disabled{opacity:.5;cursor:default}.nc-wiz .nc-sheet-actions{display:flex;justify-content:flex-end;gap:8px}.nc-wiz .nc-err{color:#f88;font-size:12px}.nc-wiz-skip{background:none;border:none;color:#9fd;opacity:.6;font-size:12px;cursor:pointer;text-decoration:underline;align-self:center;padding:4px}.nc-wiz-skip:hover{opacity:1}.nc-ntf-toasts{position:fixed;top:10px;right:10px;z-index:2100;display:flex;flex-direction:column;gap:8px;max-width:min(360px,calc(100vw - 20px))}.nc-ntf-toast{display:flex;align-items:flex-start;gap:8px;background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:10px;padding:8px 8px 8px 12px;font-size:13px;box-shadow:0 2px 12px #0000008c}.nc-ntf-toast.high{border-left-color:var(--warning)}.nc-ntf-toast-txt{display:flex;flex-direction:column;gap:2px;min-width:0}.nc-ntf-toast-txt b{word-break:break-word}.nc-ntf-toast-txt small{color:var(--text-secondary);word-break:break-word}.nc-ntf-from{color:var(--text-tertiary);font-size:11px;font-family:var(--font-mono)}.nc-ntf-x{margin-left:auto;background:none;border:none;color:var(--text-tertiary);cursor:pointer;padding:2px;display:inline-flex;border-radius:6px}.nc-ntf-x:hover{color:var(--text-primary);background:var(--bg-hover)}.nc-ask-badge{position:fixed;bottom:64px;right:12px;z-index:2100;display:inline-flex;align-items:center;gap:6px;background:var(--accent);color:#fff;border:none;border-radius:999px;padding:8px 14px;font-size:14px;font-weight:700;cursor:pointer;box-shadow:0 2px 12px #0000008c}.nc-ask-badge:hover{background:var(--accent-hover)}.nc-ask-count{background:#00000059;border-radius:999px;padding:0 7px;font-size:12px;line-height:18px}.nc-ask-panel{position:fixed;bottom:10px;right:10px;z-index:2100;width:min(420px,calc(100vw - 20px));max-height:min(70vh,560px);display:flex;flex-direction:column;background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;box-shadow:0 4px 20px #0009}.nc-ask-panel-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--border);font-size:13px}.nc-ask-panel-head .nc-ask-count{background:var(--accent)}.nc-ask-panel-body{overflow-y:auto;padding:10px 12px;display:flex;flex-direction:column;gap:10px}.nc-ask-card{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:10px;padding:10px;display:flex;flex-direction:column;gap:8px}.nc-ask-head{display:flex;align-items:center;gap:8px}.nc-ask-id{color:var(--text-tertiary);font-size:11px;margin-left:auto}.nc-ask-q{font-size:13px;white-space:pre-wrap;word-break:break-word}.nc-ask-opts{display:flex;flex-wrap:wrap;gap:6px}.nc-ask-reply{display:flex;gap:6px;align-items:flex-end}.nc-ask-reply textarea{flex:1;resize:vertical;min-height:34px;background:var(--bg-primary);color:var(--text-primary);border:1px solid var(--border);border-radius:8px;padding:6px 8px;font:inherit;font-size:13px}.nc-ask-card .nc-err{color:var(--error);font-size:12px}.nc-cell-switcher-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;display:flex;align-items:flex-end;background:#0000008c}.nc-cell-switcher{width:min(88vw,360px);min-height:260px;max-height:72vh;max-height:min(72dvh,540px);box-sizing:border-box;padding:12px 12px max(12px,env(safe-area-inset-bottom)) max(12px,env(safe-area-inset-left));display:flex;flex-direction:column;gap:8px;background:#0e140e;color:#cfe;border-right:1px solid #243;border-top:1px solid #243;border-radius:0 14px 0 0;box-shadow:10px -6px 30px #00000073;outline:none}.nc-cell-switcher-list{min-height:0;flex:1 1 auto;overflow-y:auto;display:flex;flex-direction:column;gap:6px;overscroll-behavior-y:contain}.nc-cell-switcher-row{min-height:44px;width:100%;display:flex;align-items:stretch;gap:6px;box-sizing:border-box;padding:0 6px 0 0;border:1px solid #1c241c;border-radius:9px;background:#0a0e0a;color:#cfe}.nc-cell-switcher-row.current{border-color:#2e7d32;background:#14200f}.nc-cell-switcher-row.selected{border-color:#79d9ff;background:#112637;box-shadow:0 0 0 2px #79d9ff33}.nc-cell-switcher-row.off{opacity:.48}.nc-cell-switcher-row-select{min-width:0;min-height:44px;flex:1 1 auto;display:flex;align-items:center;gap:10px;padding:8px 4px 8px 0;border:0;background:transparent;color:#cfe;text-align:left}.nc-cell-switcher-row-select[aria-disabled=true]{cursor:default}.nc-cell-switcher .nc-roster-handle{flex:0 0 36px;width:36px;min-width:36px;min-height:44px;margin:0;border:1px solid transparent;border-radius:8px;background:#ffffff06;color:#688475;touch-action:none}.nc-cell-switcher .nc-roster-handle.active,.nc-cell-switcher .nc-roster-handle:focus-visible{color:#bfffd8;border-color:#00cc6673;background:#00cc661f}.nc-cell-switcher-row.nc-roster-dragging{opacity:.62}.nc-cell-switcher-row.nc-roster-over{outline:2px solid rgba(0,204,102,.72);outline-offset:2px}.nc-cell-switcher-dot{flex:0 0 9px;width:9px;height:9px;border-radius:50%;background:#355}.nc-cell-switcher-dot.on{background:#0c6;box-shadow:0 0 6px #0c68}.nc-cell-switcher-dot.warn{background:#e0b020;box-shadow:0 0 6px #e0b02088}.nc-cell-switcher-dot.working{animation:nc-cell-switcher-pulse 1.1s ease-in-out infinite}.nc-cell-switcher-copy{min-width:0;display:flex;flex-direction:column;gap:2px}.nc-cell-switcher-copy b,.nc-cell-switcher-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-cell-switcher-copy b{color:#d8ffe8;font-size:14px}.nc-cell-switcher-copy small{opacity:.62;font-size:11px}.nc-cell-switcher-copy .nc-cell-switcher-state{opacity:.88;color:#d8ffe8}.nc-cell-switcher-copy .nc-cell-switcher-telemetry{color:#9fd8c2}.nc-cell-switcher-acts{display:none;gap:4px}.nc-cell-switcher-act{display:none;border:1px solid rgba(216,255,232,.25);background:#d8ffe80f;color:#d8ffe8;border-radius:6px;min-width:34px;min-height:34px;font-size:14px}@media(max-width:640px){.nc-cell-switcher-acts{display:inline-flex}.nc-cell-switcher-act{display:inline-flex;align-items:center;justify-content:center}}.nc-cell-switcher-notice{color:#ffd36b;font-size:12px}.nc-cell-switcher-actions{display:flex;min-width:0}.nc-cell-switcher-open{min-width:0;min-height:44px;width:100%;padding:0 12px;border:1px solid #79d9ff;border-radius:9px;background:#16445e;color:#effcff;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-cell-switcher-open:disabled{border-color:#2b3c2b;background:#14200f;color:#8fa898;opacity:.7}.nc-cell-switcher-controls{display:flex;align-items:center;gap:6px;min-width:0}.nc-cell-switcher-controls b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#d8ffe8;font-size:14px}.nc-cell-switcher-controls button{min-width:44px;min-height:44px;border:1px solid #2b3c2b;border-radius:9px;background:#14200f;color:#cfe}.nc-cell-switcher-controls .nc-cell-switcher-filter{padding:0 9px}.nc-cell-switcher-controls .nc-cell-switcher-close{font-size:24px}@keyframes nc-cell-switcher-pulse{50%{opacity:.45}}@media(prefers-reduced-motion:reduce){.nc-cell-switcher-dot.working{animation:none}}.nc-cell-switcher-peek{flex:0 0 auto;display:flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:0;border-radius:8px;background:transparent;cursor:pointer}.nc-cell-switcher-peek:hover,.nc-cell-switcher-peek:focus-visible{background:#ffffff0f}.nc-cell-switcher-star{display:inline-flex;align-items:center;justify-content:center;min-width:40px;min-height:40px;padding:0;flex:0 0 auto;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;border-radius:8px;font-size:15px;line-height:1;cursor:pointer}.nc-cell-switcher-act.nc-cell-switcher-host{min-width:40px;min-height:40px;padding:0;flex:0 0 auto;border-radius:8px}.nc-cell-switcher-host.on,.nc-cell-switcher-star.on{color:#e8c547;border-color:#e8c5478c;background:#e8c54714}.nc-cell-switcher-star.designated{color:#c8a6ff;border-color:#c8a6ff99;background:#c8a6ff1f}.nc-cell-switcher-star.thread-present{color:#69b7ff;border-color:#69b7ff99;background:#69b7ff1f}.nc-cell-switcher-star.thread-active{color:#ff5a5a;border-color:#ff5a5a99;background:#ff5a5a1f}.nc-cell-switcher-star.thread-unknown{color:#e0b020;border-color:#e0b02099;background:#e0b0201f}.nc-vl-session-view{display:flex;flex-direction:column;height:100%;min-height:0;background:#0a0e0a;color:#cfe}.nc-vl-session-body{flex:1 1 auto;min-height:0;overflow-y:auto;padding:16px 20px 32px}.nc-vl-session-body .nc-vl-events{max-width:70ch;margin:0 auto}.nc-vl-session-body .nc-vl-events-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.nc-vl-session-body .nc-vl-ev{white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.45}.nc-vl-session-body .nc-vl-ev-thinking{color:#7fa88f;font-style:italic}.nc-vl-session-body .nc-vl-ev-tool_start,.nc-vl-session-body .nc-vl-ev-tool_end,.nc-vl-session-body .nc-vl-ev-usage,.nc-vl-session-body .nc-vl-ev-writer_epoch{color:#6f8f7a;font-size:12px}.nc-vl-session-body .nc-vl-ev-turn_end,.nc-vl-session-body .nc-vl-ev-done{color:#8fd0a8}.nc-vl-session-body .nc-vl-ev.error{color:#e08a8a}.nc-vl-session-body .nc-vl-ev.gap{color:#c9b46a;font-size:12px}:root{color-scheme:dark}body,#root{margin:0;height:100vh;height:100dvh;background:#0a0e0a;font-family:ui-monospace,monospace}.nc-app{display:flex;flex-direction:column;height:100vh;height:100dvh;min-height:0}.nc-keybar{flex:0 0 auto}.nc-bar{display:flex;gap:10px;align-items:center;padding:8px;color:#cfe;background:#0e140e}.nc-bar button{background:none;border:1px solid #243;color:#9fd;border-radius:6px;padding:4px 10px}.nc-termwrap{position:relative;flex:1}.nc-auth{color:#cfe;padding:20px;display:flex;flex-direction:column;gap:10px;max-width:420px}.nc-auth input[type=text],.nc-auth input:not([type]){padding:10px;background:#122;border:1px solid #243;color:#cfe;border-radius:6px}.nc-auth button{padding:10px;background:#122;border:1px solid #243;color:#9fd;border-radius:6px}.nc-bar-right{margin-left:auto;display:flex;gap:4px}@media(pointer:coarse){.nc-bar button,.nc-bar-right button{min-height:42px;min-width:42px;font-size:20px}}.nc-bar button,.nc-bar-right button{display:inline-flex;align-items:center;justify-content:center;gap:6px}.nc-bar>button{flex:0 0 auto}.nc-bar>b{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600}.nc-bar-right{flex:0 0 auto}@media(max-width:480px){.nc-bar-label{display:none}}.nc-workspace{display:flex;flex-direction:row;height:100vh;height:100dvh;min-height:0;background:#0a0e0a;color:#cfe}.nc-workspace-main{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column}.nc-single-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:40;background:#0a0e0a}.nc-bar-single .nc-bar-center{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1.15}.nc-bar-single .nc-bar-center b{font-size:13px;font-weight:600;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.nc-bar-sub{font-size:10px;opacity:.55}.nc-app{animation:nc-slide-in .2s ease-out}@keyframes nc-slide-in{0%{transform:translate(12%);opacity:0}to{transform:translate(0);opacity:1}}@media(prefers-reduced-motion:reduce){.nc-app{animation:none}}@keyframes nc-cell-working-blip{0%,to{opacity:1;transform:scale(1);box-shadow:0 0 7px #0c6c}50%{opacity:.22;transform:scale(.72);box-shadow:0 0 1px #0c62}}.nc-dot.on.working,.dot.on.working{animation:nc-cell-working-blip 1.1s ease-in-out infinite;transform-origin:center}@media(prefers-reduced-motion:reduce){.nc-dot.on.working,.dot.on.working{animation:none}}.nc-stale{position:fixed;top:8px;left:50%;transform:translate(-50%);z-index:2000;cursor:pointer;background:#1a2410;color:#d9f7c7;border:1px solid #7aa903;border-radius:8px;padding:6px 14px;font-size:13px;box-shadow:0 2px 10px #00000080}.nc-pin-error{display:flex;align-items:center;gap:8px;padding:6px 10px;margin:6px;border:1px solid rgba(255,90,90,.55);background:#ff5a5a1f;color:#ff8a8a;border-radius:8px;font-size:12px}.nc-pin-error-text{flex:1}.nc-pin-error-retry{cursor:pointer;background:#ff5a5a33;border:1px solid rgba(255,90,90,.5);color:#ffb3b3;border-radius:6px;padding:2px 8px;font-size:12px}.nc-pin-error-retry:hover{filter:brightness(1.2)}.nc-pin-error-close{cursor:pointer;background:transparent;border:none;color:#ff8a8a;font-size:16px;line-height:1;padding:0 2px}.nc-renderer-toggle{opacity:.55}.nc-renderer-toggle.on{opacity:1;color:#7fe3ff}.nc-update{position:fixed;bottom:8px;left:50%;transform:translate(-50%);z-index:2000;display:flex;align-items:center;gap:10px;background:#0f1a0f;color:#d9f7c7;border:1px solid #2e7d32;border-radius:10px;padding:6px 8px 6px 14px;font-size:13px;box-shadow:0 2px 12px #0000008c}.nc-update-msg{white-space:nowrap}.nc-update-btn{display:inline-flex;align-items:center;justify-content:center;background:#2e7d32;border:1px solid #2e7d32;color:#06120a;border-radius:7px;padding:4px 12px;font:inherit;font-size:13px;cursor:pointer}.nc-update-btn:hover{background:#3a9d42}@media(prefers-reduced-motion:reduce){.nc-update{transition:none}}.nc-update-close{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;background:transparent;border:1px solid #2e7d32;color:#d9f7c7;border-radius:7px;font:inherit;font-size:14px;line-height:1;cursor:pointer}.nc-update-close:hover{background:#2e7d32;color:#06120a}:root{--bg-primary: #0d1117;--bg-secondary: #161b22;--bg-tertiary: #21262d;--bg-hover: #30363d;--text-primary: #e6edf3;--text-secondary: #8b949e;--text-tertiary: #6e7681;--border: #30363d;--accent: #6c5ce7;--accent-hover: #7c6cf7;--success: #3fb950;--warning: #d29922;--error: #f85149;--user-bg: #1c2333;--assistant-bg: transparent;--font-mono: "SF Mono", monospace;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;width:100%;overflow:hidden}body{font-family:var(--font-sans);background:var(--bg-primary);color:var(--text-primary);-webkit-font-smoothing:antialiased}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-tertiary);border-radius:3px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spinning{animation:spin 1s linear infinite}
32
+ */.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;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.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:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.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}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.nc-terminal{position:absolute;top:0;right:0;bottom:0;left:0;background:#0a0e0a}.nc-terminal-host{position:absolute;top:0;right:0;bottom:0;left:0;padding:4px}.nc-terminal .xterm{height:100%}.nc-terminal-host,.nc-terminal .xterm,.nc-terminal .xterm-viewport{touch-action:none}.nc-terminal.selecting{box-shadow:inset 0 0 0 2px #d6a600}.nc-touch-selection-caret{position:absolute;z-index:8;box-sizing:border-box;pointer-events:none;border:2px solid #baff79;background:#40822c57;box-shadow:0 0 0 1px #040c04e0,0 0 8px #baff798c}.nc-selection-tools{position:absolute;z-index:9;right:10px;top:10px;display:flex;gap:6px;align-items:center;background:#0e140ef0;border:1px solid #586b2a;border-radius:8px;padding:5px 7px;color:#edda8a;font-size:11px}.nc-selection-tools button{background:#172417;border:1px solid #486044;color:#d8ffe8;border-radius:6px;padding:5px 9px}.nc-selection-tools textarea{width:180px;height:48px;background:#071007;color:#d8ffe8}.nc-zoom-bubble{position:absolute;z-index:10;max-width:calc(100% - 8px);box-sizing:border-box;background:#0e140ef5;border:1px solid #586b2a;border-radius:10px;padding:4px 8px;overflow:hidden;box-shadow:0 4px 18px #0000008c,0 0 0 1px #040c0499}.nc-zoom-bubble.flipped{box-shadow:0 -4px 18px #0000008c,0 0 0 1px #040c0499}.nc-zoom-line{margin:0;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;line-height:1.25;color:#d8ffe8;white-space:pre;overflow-x:auto}.nc-zoom-sel{background:#baff794d;border-radius:2px;box-shadow:inset 0 -2px #baff79}.nc-selection-held{color:#b7c98a;font-size:10px;opacity:.85;max-width:190px}.nc-sel-handle{position:absolute;z-index:9;width:2px;height:26px;background:#baff79;box-shadow:0 0 0 1px #040c04e0,0 0 8px #baff798c;touch-action:none;cursor:grab}.nc-sel-handle:after{content:"";position:absolute;top:-12px;bottom:-16px}.nc-sel-handle.start:after{left:-28px;right:-14px}.nc-sel-handle.end:after{left:-14px;right:-28px}.nc-sel-handle:before{content:"";position:absolute;top:100%;width:14px;height:14px;border-radius:50%;background:#baff79;box-shadow:0 0 0 1px #040c04e0}.nc-sel-handle.start:before{left:-15px}.nc-sel-handle.start.flip:after{left:-14px;right:-28px}.nc-sel-handle.start.flip:before{left:3px}.nc-sel-handle.end.flip:after{left:-28px;right:-14px}.nc-sel-handle.end.flip:before{left:-15px}.nc-sel-handle.end:before{left:3px}.nc-sel-handle.tight.end:before{top:calc(100% + 10px)}.nc-sel-handle.tight.end:after{bottom:-26px}.nc-sel-handle.dragging{background:#eaffb0;cursor:grabbing;z-index:12}.nc-sel-handle.dragging:before{background:#eaffb0;transform:scale(1.25)}.nc-selection-changed{color:#edda8a;font-size:10px;opacity:.9;max-width:210px}.nc-upload-state{position:absolute;z-index:10;left:50%;top:12px;transform:translate(-50%);max-width:min(520px,calc(100% - 24px));padding:6px 10px;border-radius:7px;border:1px solid #2e7d32;background:#0a140af5;color:#cfe;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.nc-upload-state.error{border-color:#a44;color:#fbb}.nc-keybar{background:#0a0e0a;border-top:1px solid #1c241c;position:relative}.nc-keybar.termux{padding:2px 0}.nc-keygrid{display:grid;grid-template-columns:minmax(0,8fr) minmax(40px,1fr)}.nc-keygrid.no-enter{grid-template-columns:minmax(0,1fr)}.nc-keygrid.expanded{grid-template-columns:minmax(40px,1fr) minmax(0,8fr) minmax(40px,1fr)}.nc-keygrid.expanded.no-enter{grid-template-columns:minmax(40px,1fr) minmax(0,1fr)}.nc-keygrid.compact{grid-template-columns:minmax(0,8fr) minmax(40px,1fr)}.nc-keygrid.compact.no-enter{grid-template-columns:minmax(0,1fr)}.nc-keygrid.compact .row button{padding-inline:0;overflow:hidden;white-space:nowrap;font-size:clamp(10px,3vw,12px);letter-spacing:0}.nc-keygrid.compact .row button:nth-last-child(-n+2){font-size:10px}.nc-keyrows{display:flex;flex-direction:column;min-width:0}.nc-keybar .row{display:flex}.nc-keybar .row button,.nc-keybar .nc-enter-key,.nc-keybar .nc-retract-key{flex:1 1 0;min-width:0;padding:10px 2px;background:none;border:none;border-radius:0;color:#e6ffe6;font-size:14px;font-weight:600;letter-spacing:.5px;font-family:inherit}.nc-keybar .nc-enter-key{display:inline-flex;align-items:center;justify-content:center;border-left:1px solid #1c241c}.nc-keybar .nc-retract-key{display:inline-flex;align-items:center;justify-content:center;border-right:1px solid #1c241c}.nc-keybar .row button:active,.nc-keybar .nc-enter-key:active,.nc-keybar .nc-retract-key:active{background:#1d2a1d}.nc-keybar .row button.armed{color:#021;background:#0c6}.nc-keymenu{position:absolute;bottom:100%;left:8px;right:8px;z-index:30;display:flex;flex-wrap:wrap;gap:6px;padding:8px;background:#101810;border:1px solid #2a3a2a;border-radius:10px 10px 0 0}.nc-keymenu button{flex:1 0 30%;padding:10px 6px;border-radius:8px;border:1px solid #243;background:#122;color:#9fd;font-size:13px}.nc-keymenu button:active{background:#0c6;color:#021}.nc-keybar.copy{display:flex;gap:6px;overflow-x:auto;padding:8px;background:#14210f}.nc-keybar.copy button{flex:0 0 auto;padding:10px 12px;min-width:48px;border-radius:8px;border:1px solid #243;background:#122;color:#9fd;font-size:13px}.nc-keybar.copy button:active{background:#0c6;color:#021}.nc-keybar .tag{flex:0 0 auto;align-self:center;padding:0 8px;color:#8e8;font-size:12px}@media(pointer:coarse){.nc-keybar .row button,.nc-keybar .nc-enter-key,.nc-keybar .nc-retract-key{padding:12px 2px;font-size:15px}.nc-keygrid.compact .row button{padding-inline:0;font-size:clamp(10px,3vw,12px);letter-spacing:0}.nc-keygrid.compact .row button:nth-last-child(-n+2){font-size:10px}}.nc-files{position:fixed;top:0;right:0;bottom:0;width:min(340px,90vw);background:var(--bg, #111511);border-left:1px solid #2a332a;display:flex;flex-direction:column;z-index:30}.nc-files header{display:flex;justify-content:space-between;align-items:center;padding:8px 10px;border-bottom:1px solid #2a332a}.nc-files nav{display:flex;gap:6px;padding:8px 10px}.nc-files nav button{flex:0 0 auto;padding:4px 10px;border-radius:6px}.nc-files nav button.on{background:#2e7d32;color:#fff}.nc-files nav .up{margin-left:auto}.nc-files ul{list-style:none;margin:0;padding:0;overflow-y:auto;flex:1}.nc-files li{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid #1c231c}.nc-files li .name{flex:1;cursor:pointer;overflow-wrap:anywhere}.nc-files li.empty{opacity:.5;justify-content:center}.nc-busy{padding:4px 10px;font-size:12px;color:#e0a030}@media(pointer:coarse){.nc-files nav button,.nc-files li{min-height:42px}}.nc-files header button,.nc-files nav button,.nc-files li button{display:inline-flex;align-items:center;justify-content:center;gap:6px}.nc-composer{border-top:1px solid #2a332a;padding:6px max(8px,env(safe-area-inset-right)) max(6px,env(safe-area-inset-bottom)) max(8px,env(safe-area-inset-left));background:var(--bg, #111511)}.nc-composer-row{display:flex;gap:6px;align-items:flex-end}.nc-composer textarea{flex:1;min-width:0;min-height:42px;max-height:42vh;max-height:42dvh;resize:vertical;overflow-y:auto;background:#0a0e0a;color:#d8e0d8;border:1px solid #2a332a;border-radius:8px;padding:6px 8px;font:13px/1.4 inherit}.nc-composer textarea.expanded{height:clamp(128px,32dvh,320px)}.nc-composer .mic.on{background:#b02a2a;color:#fff}.nc-composer-err{font-size:12px;color:#e0a030;padding-bottom:4px}.nc-composer-info{font-size:12px;color:#baff79;padding-bottom:4px}@media(pointer:coarse){.nc-composer .mic,.nc-composer .go,.nc-composer .attach,.nc-composer .history{min-width:46px;min-height:46px;font-size:20px}.nc-composer textarea{resize:none;font-size:16px}.nc-attach-menu button,.nc-composer-history-menu button{min-height:48px}}.nc-composer .mic,.nc-composer .go,.nc-composer .attach,.nc-composer .history{display:inline-flex;align-items:center;justify-content:center;background:none;border:1px solid #243;color:#9fd;border-radius:8px;cursor:pointer}.nc-composer .go{color:#7ee787;border-color:#2e7d32}.nc-composer .go:disabled{opacity:.5;cursor:wait}.nc-composer .attach.busy{opacity:.5;animation:nc-attach-pulse 1s ease-in-out infinite}@keyframes nc-attach-pulse{50%{opacity:.9}}.nc-attach-menu{position:fixed;z-index:1000;min-width:180px;display:flex;flex-direction:column;padding:4px;background:#0e130e;border:1px solid #2e7d32;border-radius:10px;box-shadow:0 6px 24px #0000008c}.nc-attach-menu button{display:flex;align-items:center;gap:10px;text-align:left;min-height:40px;padding:8px 12px;border:0;border-radius:7px;background:none;color:#d8e0d8;font:14px/1 inherit;cursor:pointer}.nc-attach-menu button:hover,.nc-attach-menu button:focus-visible{background:#1a241a;color:#7ee787}.nc-composer-history-menu{position:fixed;z-index:1000;max-height:min(55dvh,420px);overflow-y:auto;display:flex;flex-direction:column;padding:4px;background:#0e130e;border:1px solid #2e7d32;border-radius:10px;box-shadow:0 6px 24px #0000008c}.nc-composer-history-menu button{border:0;border-radius:7px;background:none;color:#d8e0d8;font:13px/1.35 inherit;cursor:pointer}.nc-composer-history-menu button:hover,.nc-composer-history-menu button:focus-visible{background:#1a241a;color:#7ee787}.nc-composer-history-action{display:flex;align-items:center;gap:8px;min-height:38px;padding:7px 10px;text-align:left;border-bottom:1px solid #243!important;border-radius:7px 7px 0 0!important}.nc-composer-history-title{padding:8px 10px 5px;color:#7fb89a;font-size:11px;text-transform:uppercase;letter-spacing:.08em}.nc-composer-history-empty{padding:10px;color:#789a87;font-size:12px}.nc-composer-history-entry{display:flex;flex-direction:column;gap:2px;width:100%;padding:8px 10px;text-align:left}.nc-composer-history-entry span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-composer-history-entry small{color:#789a87;font-size:10px}.nc-composer-history-clear{min-height:36px;margin-top:3px;padding:7px 10px;color:#f99!important;text-align:left}@media(max-width:420px)and (pointer:coarse){.nc-composer-row{gap:4px}.nc-composer .mic,.nc-composer .go,.nc-composer .attach,.nc-composer .history{min-width:42px;width:42px}}.nc-live-host{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:1.3;color:#9fb3a4;padding:2px 0;min-width:0}.nc-live-host-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-live-host-remote{color:#7f8f84;font-size:11px;white-space:nowrap}.nc-live-host-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;background:#5c6b60;border:1px solid rgba(255,255,255,.18)}.nc-live-host-dot.none{background:#5c6b60}.nc-live-host-dot.designated{background:#7fe3ff}.nc-live-host-dot.present{background:#69b7ff}.nc-live-host-dot.active{background:#ff5a5a}.nc-live-host-dot.unknown{background:#e0b020}.nc-live-host-dot-header{margin-left:6px;vertical-align:middle}.nc-popup-velo{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;display:flex;align-items:center;justify-content:center;padding:2vmin;background:#0000009e}.nc-popup{display:flex;flex-direction:column;width:min(1100px,96vw);height:min(820px,92vh);overflow:hidden;position:relative;border:1px solid var(--nc-border, #1f3f2f);border-radius:10px;background:var(--nc-bg, #0b0f0d);box-shadow:0 10px 40px #0000008c}.nc-popup-testa{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--nc-border, #1f3f2f);flex:0 0 auto}.nc-popup-titolo{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600}.nc-popup-sub{opacity:.65;font-weight:400;font-size:.82em}.nc-popup-chiudi{flex:0 0 auto;min-width:40px;min-height:40px;border:1px solid var(--nc-border, #1f3f2f);border-radius:8px;background:transparent;color:inherit;cursor:pointer}.nc-popup-corpo{flex:1 1 auto;min-height:0;position:relative;overflow:auto}.nc-popup-corpo>iframe,.nc-popup-corpo>.nc-cellpanel{width:100%;height:100%;border:0}.nc-popup-libera{position:fixed;z-index:2}.nc-popup-angolo{position:absolute;right:0;bottom:0;width:18px;height:18px;cursor:nwse-resize;z-index:3}.nc-popup-angolo:after{content:"";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid var(--nc-border, #1f3f2f);border-bottom:2px solid var(--nc-border, #1f3f2f)}.nc-popup-velo-drag{position:fixed;top:0;right:0;bottom:0;left:0;z-index:4;background:transparent;cursor:grabbing}@media(max-width:720px){.nc-popup-velo{padding:0}.nc-popup{width:100vw;height:100vh;border:0;border-radius:0}.nc-popup-angolo{display:none}}.nc-cellpanel{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;background:var(--nc-bg, #0b1014)}.nc-cellpanel-frame{width:100%;height:100%;border:0;background:#fff}.nc-cellpanel-msg{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;color:var(--nc-fg, #cfe3ee);text-align:center;font-size:14px;line-height:1.5}.nc-cellpanel-actions{display:flex;gap:8px}.nc-cellpanel-actions button{padding:8px 14px;background:#122;border:1px solid #243;color:#9fd;border-radius:6px;cursor:pointer;font-size:14px}.nc-cellpanel-actions button:hover{background:#1a2a33}.nc-cellpanel-loading{position:absolute;top:10px;left:50%;transform:translate(-50%);z-index:6;padding:4px 12px;background:#0b1014d9;border:1px solid #243;border-radius:12px;color:#9fd;font-size:12px;pointer-events:none}.nc-cell-switcher-telemetry{color:#9fd8c2}.nc-peek-sorgenti{display:flex;gap:6px;margin-bottom:8px}.nc-peek-sorgente{border:1px solid rgba(216,255,232,.25);background:transparent;color:#d8ffe8;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer}.nc-peek-sorgente.attiva{background:#d8ffe829}.nc-peek-stream{min-height:46vh;display:flex;flex-direction:column}.nc-peek-testo{margin:0;padding:12px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.86rem;line-height:1.45}.nc-side-peek{border:none;background:transparent;padding:4px 6px;margin-left:-6px;cursor:pointer;display:inline-flex;align-items:center}.nc-side-peek .nc-dot{pointer-events:none}.nc-sidebar{display:flex;flex-direction:column;gap:8px;padding:12px 10px;color:#cfe;min-height:0;position:relative;overflow:hidden;box-sizing:border-box;border-right:1px solid #1c241c;background:#0a0e0a}.nc-sidebar.mini{padding:12px 4px;align-items:center;gap:6px}.nc-side-resize{position:absolute;top:0;right:0;bottom:0;width:6px;cursor:col-resize;z-index:5}.nc-side-resize:hover{background:#1c3a1c}.nc-collapse-btn{flex:0 0 auto;background:none;border:1px solid #243;color:#9fd;border-radius:8px;min-width:26px;min-height:26px;cursor:pointer;font-size:13px;line-height:1}.nc-collapse-btn:hover{border-color:#2e7d32;color:#d8ffe8}.nc-side-head{display:flex;align-items:center;gap:6px;justify-content:space-between;padding:2px 4px 6px}.nc-side-head.mini{padding:2px 0 6px;justify-content:center}.nc-side-scroll{min-height:0;flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:8px;padding-right:2px}.nc-side-scroll.mini{width:100%;align-items:center}.nc-side-group.mini{align-items:center;gap:6px}.nc-mini-dot,.nc-mini-init{display:flex;align-items:center;justify-content:center;width:34px;height:34px;box-sizing:border-box;border:1px solid #1c241c;background:#0e140e;border-radius:9px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#d8ffe8;padding:0}.nc-mini-init{font-size:13px;font-weight:700}.nc-mini-dot:hover,.nc-mini-init:hover{border-color:#244}.nc-mini-dot.active,.nc-mini-init.active{border-color:#2e7d32;background:#14200f}.nc-side-title{font-size:13px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;opacity:.8}.nc-side-fleet-stale{color:#e0b020;font-size:12px;cursor:help}.nc-side-fleet-off{color:#8fa08f;font-size:12px;cursor:help}.nc-new-btn{background:#2e7d32;color:#fff;border:none;border-radius:8px;padding:4px 10px;font-size:12px;cursor:pointer}.nc-new-btn:active{background:#255028}.nc-side-group{display:flex;flex-direction:column;gap:6px}.nc-side-group-title{font-size:11px;opacity:.55;text-transform:uppercase;letter-spacing:.5px;padding:10px 4px 2px}.nc-node-title{display:flex;align-items:center;gap:6px;opacity:.8}.nc-node-title[role=button]{cursor:pointer;border-radius:6px}.nc-node-title[role=button]:focus-visible{outline:1px solid #2e7d32}.nc-node-title .nc-dot{width:7px;height:7px;flex:0 0 auto}.nc-node-title b{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.nc-node-title small{text-transform:none;letter-spacing:0;opacity:.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-node-chevron{flex:0 0 10px;font-size:13px}.nc-node-filter{flex:0 0 auto;max-width:82px;min-width:58px;padding:3px 18px 3px 5px;border:1px solid #243;border-radius:6px;background:#0a0e0a;color:#9fd;font:10px/1.2 inherit;text-transform:lowercase}.nc-node-title>.nc-roster-handle{flex-basis:20px;width:20px;min-width:20px;height:24px}.nc-node-rename{flex:0 0 auto;width:26px;height:26px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:#7fa892;cursor:pointer;font:15px/1 inherit}.nc-node-rename:hover,.nc-node-rename:focus-visible{color:#caffe0;border-color:#00cc6659;outline:none}.nc-node-order-wrap.nc-roster-dragging{opacity:.62}.nc-node-order-wrap.nc-roster-over{outline:2px solid rgba(0,204,102,.72);outline-offset:2px;border-radius:8px}.nc-cell{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid #1c241c;background:#0e140e;border-radius:10px;overflow:hidden}.nc-cell-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.nc-cell-main b{font-size:13px;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.nc-cell-main small{font-size:11px;opacity:.6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.nc-power,.nc-boot{flex:0 0 auto;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;border-radius:50%;cursor:pointer}.nc-power.on{color:#0c6;border-color:#00cc668c;background:#00cc661a}.nc-boot.on{color:#69b7ff;border-color:#69b7ff94;background:#69b7ff1a}.nc-power.warn{color:#e8c547;border-color:#e8c5478c;background:#e8c5471a}.nc-power:hover,.nc-boot:hover{filter:brightness(1.25)}.nc-boot:disabled{cursor:wait;opacity:.55}.nc-dot{flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:#355}.nc-dot.on{background:#0c6;box-shadow:0 0 6px #0c68}.nc-dot.warn{background:#e0b020;box-shadow:0 0 6px #e0b02088}.nc-side-card{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid #1c241c;background:#0e140e;border-radius:10px;cursor:grab;-webkit-user-select:none;user-select:none}.nc-side-card:hover{border-color:#244}.nc-side-card.active{border-color:#2e7d32;background:#14200f}.nc-side-card:active{cursor:grabbing}.nc-card-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.nc-card-main b{font-size:13px;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-card-main small{font-size:11px;opacity:.55;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-rel{flex:0 0 auto;font-size:10px;opacity:.45}.nc-menu{flex:0 0 auto;width:26px;height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:#9fd;cursor:pointer;font-size:15px;line-height:1;border-radius:50%}.nc-menu:active{color:#f88}.nc-empty{opacity:.4;padding:8px 4px;font-size:12px}.nc-side-gear{display:flex;align-items:center;gap:8px;background:none;border:1px solid #1c241c;border-radius:10px;color:#9fd;font-size:12px;padding:7px 10px;cursor:pointer;margin-top:0;flex:0 0 auto}.nc-side-gear:hover{border-color:#2e7d32;color:#d8ffe8}.nc-side-gear.mini{justify-content:center;width:34px;height:34px;box-sizing:border-box;padding:0;border-radius:9px;margin:6px auto 0}.nc-side-lang{flex:0 0 auto;padding:4px;display:flex;align-items:center;gap:2px;font-size:11px;opacity:.6}.nc-lang-btn{background:none;border:none;color:inherit;cursor:pointer;font-size:11px;padding:0 1px;opacity:.5;text-transform:uppercase}.nc-lang-btn.on{opacity:1;font-weight:700;color:#d8ffe8}.nc-cell.live{cursor:pointer}.nc-cell.live:hover{background:#ffffff0f}.nc-cell.active{outline:1px solid rgba(0,204,102,.5)}.nc-cell.preserved{opacity:.55;border-style:dashed;cursor:default}.nc-cell.preserved .nc-cell-main b{color:#8fa08f}.nc-cell.preserved .nc-cell-main small{font-style:italic}.nc-side-presets{display:flex;gap:4px;padding:2px 8px 6px}.nc-side-presets button{background:none;border:1px solid rgba(255,255,255,.15);border-radius:4px;color:inherit;cursor:pointer;padding:2px 8px}.nc-side-presets button:hover{background:#ffffff14}.nc-pin{flex:0 0 auto;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;cursor:pointer;border-radius:50%;font-size:14px;line-height:1}.nc-pin:hover{filter:brightness(1.25)}.nc-pin.on{color:#e8c547;border-color:#e8c5478c;background:#e8c54714}.nc-pin.designated{color:#c8a6ff;border-color:#c8a6ff99;background:#c8a6ff1f}.nc-pin.thread-present{color:#69b7ff;border-color:#69b7ff99;background:#69b7ff1f}.nc-pin.thread-active{color:#ff5a5a;border-color:#ff5a5a99;background:#ff5a5a1f}.nc-pin.thread-unknown{color:#e0b020;border-color:#e0b02099;background:#e0b0201f}.nc-technical{flex:0 0 auto;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;cursor:pointer;border-radius:50%;font:12px/1 monospace}.nc-technical.on{color:#d8a8ff;border-color:#b478ff8c;background:#b478ff1a}.nc-mini-tip{position:fixed;left:56px;transform:translateY(-50%);background:#161b16;color:#e6ffe6;border:1px solid rgba(0,204,102,.4);padding:3px 10px;border-radius:4px;white-space:nowrap;z-index:1000;pointer-events:none;font-size:12px}.nc-roster-handle{flex:0 0 24px;width:24px;min-width:24px;height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:6px;background:transparent;color:#668875;cursor:grab;font:15px/1 monospace;touch-action:none}.nc-roster-handle:hover,.nc-roster-handle:focus-visible,.nc-roster-handle.active{color:#9fd;background:#00cc661a;outline:none}.nc-roster-handle:active,.nc-roster-handle.active{cursor:grabbing}.nc-side-card.nc-roster-dragging,.nc-cell.nc-roster-dragging{opacity:.62}.nc-side-card.nc-roster-over,.nc-cell.nc-roster-over{outline:2px solid rgba(0,204,102,.72);outline-offset:2px}.nc-tile{display:flex;flex-direction:column;min-height:0;min-width:0;position:relative;background:#0a0e0a;border:1px solid #1c241c;border-radius:8px;overflow:hidden}.nc-tile.focused{border-color:#2e7d32;box-shadow:0 0 0 1px #2e7d3244 inset}.nc-tile-head{flex:0 0 auto;display:flex;align-items:center;gap:6px;padding:3px 6px;background:#0e140e;border-bottom:1px solid #1c241c;height:28px}.nc-tile-name{flex:1 1 auto;min-width:0;display:inline-flex;align-items:center;gap:6px;background:none;border:none;color:#cfe;cursor:pointer;padding:0}.nc-tile-name b{font-size:12px;font-weight:600;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-tile .nc-dot{width:7px;height:7px;flex:0 0 auto}.nc-tile-actions{flex:0 0 auto;display:inline-flex;gap:2px}.nc-tile-actions button{background:none;border:none;color:#9fd;cursor:pointer;min-width:22px;height:22px;font-size:13px;border-radius:4px;padding:0 3px}.nc-tile-actions button:hover{color:#d8ffe8}.nc-tile-actions .nc-tile-close:hover{color:#f88}.nc-tile-body{flex:1 1 auto;position:relative;min-height:0}.nc-tile-body .nc-terminal{width:100%;height:100%}.nc-tile-unavailable{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:20px;color:#789a87;text-align:center;font-size:12px;background:repeating-linear-gradient(135deg,#0a0e0a,#0a0e0a 12px,#0d130d 12px,#0d130d 24px)}.nc-tile-stale{position:absolute;top:6px;right:8px;z-index:4;pointer-events:none;padding:1px 6px;border-radius:8px;font-size:10px;letter-spacing:.02em;color:#b8a24e;background:#1e1a0abf;border:1px solid #4a3f1c}.nc-tile-composer{flex:0 0 auto;border-top:1px solid #1c241c}.nc-tile-files{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;background:#0e140e}.nc-tile-head{cursor:grab}.nc-tile-head:active{cursor:grabbing}.nc-grid{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:row;padding:6px;gap:0;position:relative;background:#070a07}.nc-col{display:flex;flex-direction:column;min-width:120px;min-height:0;position:relative}.nc-col.drop-newcol:before{content:"";position:absolute;left:-3px;top:0;bottom:0;width:3px;background:#0c6;border-radius:2px;z-index:6}.nc-tile-slot{display:flex;flex-direction:column;min-height:60px;min-width:0;position:relative}.nc-tile-slot>.nc-tile{flex:1 1 auto;min-height:0}.nc-tile-slot.drop-left:after,.nc-tile-slot.drop-right:after,.nc-tile-slot.drop-top:after,.nc-tile-slot.drop-bottom:after{content:"";position:absolute;z-index:7;pointer-events:none;background:#00cc6647;border:2px solid #00cc66;border-radius:4px}.nc-tile-slot.drop-left:after{left:0;top:0;bottom:0;width:50%}.nc-tile-slot.drop-right:after{right:0;top:0;bottom:0;width:50%}.nc-tile-slot.drop-top:after{left:0;right:0;top:0;height:50%}.nc-tile-slot.drop-bottom:after{left:0;right:0;bottom:0;height:50%}.nc-grid-toolbar{position:absolute;top:10px;right:12px;z-index:8;display:flex;gap:4px;background:#0a100ad1;border:1px solid #1c241c;border-radius:8px;padding:3px}.nc-grid-toolbar button{background:none;border:none;color:#9fd;cursor:pointer;font-size:15px;line-height:1;padding:4px 7px;border-radius:6px}.nc-grid-toolbar button:hover{background:#1c3a1c;color:#d8ffe8}.nc-divider-v{flex:0 0 6px;cursor:col-resize;margin:0 1px;border-radius:2px}.nc-divider-v:hover{background:#1c3a1c}.nc-divider-h{flex:0 0 6px;cursor:row-resize;margin:1px 0;border-radius:2px}.nc-divider-h:hover{background:#1c3a1c}.nc-drop-line-v{flex:0 0 3px;align-self:stretch;background:#0c6;border-radius:2px}.nc-drop-line-end{margin-left:3px}.nc-grid-empty{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:#cfe;opacity:.4;font-size:13px;text-align:center;padding:20px}.nc-deckbar{display:flex;align-items:center;gap:8px;flex:0 0 auto;min-width:0;padding:5px 8px;background:#0e140e;border-bottom:1px solid #1c2a1c;overflow-x:auto;white-space:nowrap}.nc-deckbar-label{font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.5;color:#9fd;flex:0 0 auto}.nc-deck-sidebar-toggle{flex:0 0 auto;min-width:28px;height:26px;border:1px solid #243;border-radius:6px;background:#0a0e0a;color:#9fd;cursor:pointer;font:inherit}.nc-deck-sidebar-toggle:hover{border-color:#7aa903}.nc-deck-chips{display:flex;align-items:center;gap:6px;flex:0 1 auto;min-width:0}.nc-deck-owner-group{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 2px;border:1px solid #182318;border-radius:8px;background:#0b100b;flex:0 0 auto}.nc-deck-owner{max-width:120px;padding:0 4px;overflow:hidden;text-overflow:ellipsis;color:#789a87;font-size:9px;text-transform:uppercase;letter-spacing:.04em}.nc-deck-chip{display:inline-flex;align-items:center;border:1px solid #243;border-radius:6px;overflow:hidden;background:#0a0e0a}.nc-deck-chip.current{border-color:#7aa903}.nc-deck-chip.offline{opacity:.58;border-style:dashed}.nc-deck-chip.nc-deck-dragging{opacity:.58}.nc-deck-chip.nc-deck-over{box-shadow:0 0 0 2px #0c6 inset}.nc-deck-handle{align-self:stretch;min-width:25px;padding:0 5px;background:#ffffff09;border:0;border-right:1px solid #1c2a1c;color:#789a87;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;font:11px/1 monospace}.nc-deck-handle:hover,.nc-deck-handle:focus-visible,.nc-deck-handle.active{color:#bfffd8;background:#00cc661f;outline:none}.nc-deck-handle.active{cursor:grabbing}.nc-deck-open{background:none;border:none;color:#cfe;padding:3px 8px;font:inherit;font-size:12px;cursor:pointer;max-width:180px;overflow:hidden;text-overflow:ellipsis}.nc-deck-chip.current .nc-deck-open{color:#d9f7c7}.nc-deck-open:hover{background:#132013}.nc-deck-open:disabled,.nc-deck-mini:disabled,.nc-deck-newbtn:disabled{cursor:not-allowed;opacity:.55}.nc-deck-mini{background:none;border:none;border-left:1px solid #1c2a1c;color:#7a9;padding:3px 6px;font:inherit;font-size:11px;cursor:pointer}.nc-deck-mini:hover{background:#132013;color:#9fd}.nc-deck-del:hover{color:#f99}.nc-deck-newbtn{background:none;border:1px dashed #2a3a2a;color:#9fd;border-radius:6px;padding:3px 7px;font:inherit;font-size:11px;cursor:pointer;flex:0 0 auto}.nc-deck-newbtn:hover{border-color:#7aa903}.nc-deck-add{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto}.nc-deck-add input{padding:3px 8px;background:#122;border:1px solid #243;color:#cfe;border-radius:6px;font:inherit;font-size:12px;width:130px}.nc-deck-add input.invalid{border-color:#a44}.nc-deck-slug{color:#7a9;font-size:10px;max-width:130px;overflow:hidden;text-overflow:ellipsis}.nc-deck-ok,.nc-deck-cancel{background:#122;border:1px solid #243;color:#9fd;border-radius:6px;padding:3px 9px;font:inherit;font-size:12px;cursor:pointer}.nc-deck-ok:disabled{opacity:.4;cursor:default}.nc-deck-state{font-size:10px;color:#7a9;min-width:64px}.nc-deck-state.error,.nc-deck-error{color:#f88;font-size:10px}.nc-deck-fallback{color:#fd8;font-size:11px}.nc-tile-deck{background:#0a0e0a;border:1px solid #243;color:#9fd;border-radius:5px;font:inherit;font-size:11px;padding:1px 3px;max-width:92px}.nc-deck-owner-toggle{display:inline-flex;align-items:center;gap:2px;background:none;border:0;padding:0 2px;margin:0;color:inherit;font:inherit;cursor:pointer;border-radius:4px;flex:0 0 auto;max-width:140px}.nc-deck-owner-toggle:hover{background:#00cc6614}.nc-deck-owner-toggle:focus-visible{outline:2px solid #7aa903;outline-offset:1px}.nc-deck-owner-toggle .nc-deck-owner{padding:0 2px}.nc-deck-owner-caret{color:#5a7a68;font-size:9px;flex:0 0 auto}.nc-deck-owner-group.collapsed{background:#090d09}.nc-deck-owner-content{display:inline-flex;align-items:center;gap:4px}.nc-deck-owner-content[hidden]{display:none}.nc-deck-owner-group.collapsed .nc-deck-owner-content{gap:3px}.nc-deck-summary{display:inline-flex;align-items:center;gap:3px;padding:0 3px 0 1px;font-size:9px;color:#6f8c7c;max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-deck-summary-count{background:#15241a;color:#9fd;border-radius:8px;padding:0 5px;font-size:9px;flex:0 0 auto}.nc-deck-summary-current{color:#d9f7c7}.nc-deck-dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin:0 3px 0 4px;flex:0 0 auto;background:#2a3a2a}.nc-deck-dot.working{background:#0c6;box-shadow:0 0 5px #0c6}.nc-deck-dot.on{background:#6a9}.nc-deck-dot.neutral{background:#526652}.nc-deck-dot.warn{background:#d93}.nc-deck-chip.offline .nc-deck-dot{opacity:.7}.nc-pair-card{border:1px solid #2f5;border-radius:8px;box-shadow:0 0 0 1px #22ff5514}.nc-pair-input{width:100%;min-width:0;box-sizing:border-box;font-size:15px;padding:10px}.nc-pair-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.nc-pair-status{min-height:1em}.nc-pair-progress{color:#9f9;animation:nc-pair-pulse 1.2s ease-in-out infinite}@keyframes nc-pair-pulse{0%,to{opacity:1}50%{opacity:.45}}.nc-pair-hint{opacity:.85;margin-top:4px;font-size:12px}.nc-pair-notice{display:block}.nc-pair-advanced-toggle{align-self:flex-start}.nc-pair-advanced{display:flex;flex-direction:column;gap:8px;min-width:0}.nc-qr-overlay{z-index:80}.nc-qr-modal{max-width:min(480px,calc(100vw - 32px));width:100%}.nc-qr-video{width:100%;max-height:60dvh;border-radius:6px;background:#000;object-fit:cover}.nc-qr-upload{display:inline-flex;align-items:center;cursor:pointer}.nc-authkeys{display:flex;flex-direction:column;gap:6px;margin-top:10px;padding:10px;border:1px solid #2f5;border-radius:8px;background:#22ff550a}.nc-authkeys-line{width:100%;min-width:0;box-sizing:border-box;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;word-break:break-all;resize:vertical}.nc-authkeys .nc-btn{align-self:flex-start}.nc-detail-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:75;background:#0009;display:flex;align-items:flex-end;justify-content:center;overscroll-behavior:contain}.nc-detail-sheet{width:100%;max-height:88dvh;display:flex;flex-direction:column;min-height:0;background:#0e140e;color:#cfe;border:1px solid #243;border-bottom:none;border-radius:14px 14px 0 0;box-shadow:0 -12px 40px #0000008c;outline:none}.nc-detail-head{display:flex;align-items:flex-start;gap:10px;padding:14px 14px 10px;border-bottom:1px solid #1b2a1b;position:sticky;top:0;background:#0e140e;z-index:1}.nc-detail-title{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.nc-detail-title b{font-size:16px;color:#d8ffe8;overflow-wrap:anywhere}.nc-detail-title small{font-size:12px;opacity:.65;overflow-wrap:anywhere}.nc-detail-close{padding:6px 8px;flex:none}.nc-detail-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:12px 14px;display:flex;flex-direction:column;gap:16px}.nc-detail-body.plain{padding:0;gap:0}.nc-detail-section{display:flex;flex-direction:column;gap:8px;min-width:0}.nc-detail-foot{display:flex;flex-wrap:wrap;gap:8px;padding:10px 14px;border-top:1px solid #1b2a1b;background:#0b110b;padding-bottom:max(10px,env(safe-area-inset-bottom))}.nc-detail-foot .nc-btn{white-space:nowrap;display:inline-flex;align-items:center;gap:6px}.nc-detail-facts{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 10px;padding:10px;border:1px solid #243;border-radius:8px;background:#0a0e0a;font-size:13px;min-width:0;overflow-wrap:anywhere}.nc-detail-facts dt{opacity:.65}.nc-detail-facts dd{margin:0}.nc-detail-grants{display:flex;flex-direction:column;gap:6px}.nc-detail-grant{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #243;border-radius:8px;background:#0a0e0a;font-size:13px;min-width:0}.nc-detail-grant>span{flex:1;min-width:0;overflow-wrap:anywhere}.nc-detail-grant.unknown>span{opacity:.6;font-style:italic}.nc-detail-picker{display:flex;flex-direction:column;gap:6px}.nc-detail-picker input{padding:9px 10px;font:14px/1.2 inherit;box-sizing:border-box;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;width:100%;min-width:0}.nc-detail-picker input:focus{outline:none;border-color:#2e7d32}.nc-detail-picker-list{display:flex;flex-wrap:wrap;gap:6px}@media(min-width:600px){.nc-detail-overlay{align-items:stretch;justify-content:flex-end}.nc-detail-sheet{width:min(440px,100%);max-height:none;height:100%;border:none;border-left:1px solid #243;border-radius:0;box-shadow:-12px 0 40px #0000008c}}.nc-vl-prompt{display:flex;gap:8px;align-items:flex-end}.nc-vl-prompt textarea{flex:1 1 auto;min-height:64px;resize:vertical;background:#101810;color:#d8ffe8;border:1px solid #2d4634;border-radius:4px;padding:6px 8px;font:inherit}.nc-set-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;background:#0000008c;display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.nc-set-panel{width:100%;max-width:560px;max-height:90vh;background:#0e140e;color:#cfe;border:1px solid #243;border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:12px;box-shadow:0 12px 40px #00000080;overflow:hidden}@media(max-width:1023px){.nc-set-overlay{padding:0}.nc-set-panel{max-width:none;max-height:none;height:100%;border-radius:0;border:none}}.nc-set-head{display:flex;align-items:center;gap:8px}.nc-set-head b{font-size:16px;color:#d8ffe8;flex:1}.nc-set-close{background:none;border:none;color:#9fd;cursor:pointer;padding:4px}.nc-set-readonly{font-size:12px;color:#e0b020;border:1px solid #4a3a10;border-radius:8px;padding:8px 10px;background:#171307}.nc-set-tabs-wrap{position:relative;min-width:0}.nc-set-tabs-wrap:before,.nc-set-tabs-wrap:after{content:"";position:absolute;z-index:1;top:0;bottom:9px;width:28px;opacity:0;pointer-events:none;transition:opacity .16s ease}.nc-set-tabs-wrap:before{left:0;background:linear-gradient(90deg,#0e140e 10%,#0e140e00)}.nc-set-tabs-wrap:after{right:0;background:linear-gradient(270deg,#0e140e 10%,#0e140e00)}.nc-set-tabs-wrap.has-start-overflow:before,.nc-set-tabs-wrap.has-end-overflow:after{opacity:1}.nc-set-tabs{display:flex;gap:6px;min-width:0;overflow-x:auto;overflow-y:hidden;border-bottom:1px solid #1c241c;padding-bottom:8px;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;scrollbar-width:thin;scrollbar-color:rgba(159,255,221,.35) transparent}.nc-set-tabs .nc-set-tabbtn{flex:0 0 auto;min-height:44px;white-space:nowrap}.nc-set-tabbtn{background:none;border:1px solid #1c241c;border-radius:8px;color:#9fd;font-size:12px;padding:6px 12px;cursor:pointer;text-transform:uppercase;letter-spacing:.5px}.nc-set-tabbtn.on{border-color:#2e7d32;background:#14200f;color:#d8ffe8}.nc-system-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.nc-system-tabs .nc-set-tabbtn{min-width:0;text-transform:none}.nc-system-group{display:flex;flex-direction:column;gap:8px}.nc-system-group>h3{margin:0;color:#d8ffe8;font-size:12px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.nc-system-diagnostics{gap:12px}.nc-alternate-screen-settings{border:1px solid #243;border-radius:10px;padding:10px}.nc-set-body{overflow-y:auto;flex:1;min-height:120px}.nc-set-tab{display:flex;flex-direction:column;gap:12px}.nc-set-tab .nc-check span{display:flex;flex-direction:column;gap:2px}.nc-set-tab .nc-check small{opacity:.6;font-size:11px}.nc-set-info{font-size:12px;opacity:.7;line-height:1.6}.nc-set-note{font-size:12px;color:#9fd}.nc-set-hint{font-size:11px;opacity:.7}.nc-set-form{display:flex;flex-direction:column;gap:8px}.nc-set-form .nc-field{display:flex;flex-direction:column;gap:4px;font-size:12px;opacity:.82}.nc-set-form .nc-field small{font-size:10px;opacity:.7;line-height:1.3}.nc-set-ports{display:grid;grid-template-columns:1fr 1fr;gap:8px}@media(max-width:520px){.nc-set-ports{grid-template-columns:1fr}}.nc-set-form input:not([type=checkbox]):not([type=file]){padding:9px 10px;font:14px/1.2 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;width:100%;min-width:0;max-width:100%;box-sizing:border-box}.nc-set-form input:focus{outline:none;border-color:#2e7d32}.nc-set-form input:disabled{opacity:.5}.nc-set-form textarea,.nc-set-form select{padding:9px 10px;font:13px/1.3 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;min-height:36px;width:100%;min-width:0;max-width:100%;box-sizing:border-box}.nc-set-form textarea{min-height:72px;resize:vertical}.nc-fleet-editor{gap:10px}.nc-fleet-view-tabs{display:grid;grid-template-columns:1fr 1fr;gap:6px;position:sticky;top:0;z-index:2;background:#0e140e;padding-bottom:6px}.nc-fleet-view-tabs .nc-set-tabbtn{width:100%;text-transform:none}.nc-fleet-section-head,.nc-fleet-item{display:flex;align-items:center;justify-content:space-between;gap:8px}.nc-fleet-section-head{margin-top:4px;border-bottom:1px solid #243;padding-bottom:6px}.nc-fleet-item{border:1px solid #1c241c;border-radius:8px;padding:8px}.nc-fleet-label{color:#9fb89f;font-style:italic}.nc-fleet-item>span{display:flex;gap:6px;align-items:center;min-width:0}.nc-fleet-item>span:first-child{flex-direction:column;align-items:flex-start;min-width:0}.nc-fleet-item>span:last-child{flex-wrap:wrap;justify-content:flex-end}.nc-fleet-item>span:first-child b,.nc-fleet-item>span:first-child small{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-fleet-item small{opacity:.6}.nc-fleet-tag{display:inline-block;padding:1px 6px;border-radius:6px;font-size:11px;font-weight:600;line-height:1.5;border:1px solid rgba(224,176,32,.55);color:#e0b020;background:#e0b0201f}.nc-fleet-tag.nc-fleet-tag-warn{color:#e8c547;border-color:#e8c5478c;background:#e8c5471a}.nc-cwd-rel-row{display:flex;align-items:center;gap:6px}.nc-cwd-rel-prefix{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;opacity:.85;flex:0 0 auto}.nc-cwd-rel-row input{flex:1;min-width:0}.nc-cwd-preview{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;opacity:.85;word-break:break-all}.nc-cwd-suggestion{display:flex;flex-wrap:wrap;align-items:center;gap:6px;font-size:12px;color:#e8c547;border:1px solid rgba(232,197,71,.4);background:#e8c54714;border-radius:8px;padding:6px 8px}.nc-cwd-no-source{font-size:12px;opacity:.65}.nc-fleet-form{border:1px solid #2e7d32;border-radius:10px;padding:10px}.nc-fleet-key{display:flex;flex-direction:column;gap:7px;border:1px solid #36523b;border-radius:9px;padding:10px;background:#0a100b}.nc-fleet-key-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.nc-fleet-key-head>b{letter-spacing:.08em}.nc-fleet-key-head>span{font-size:11px;opacity:.72}.nc-fleet-key-input{display:flex;gap:6px}.nc-fleet-key-input>input{flex:1;min-width:0}.nc-fleet-key-missing{align-items:flex-start;color:#ffca80}.nc-fleet-provider-notice{border-left:2px solid #6b7f3e;padding-left:8px;line-height:1.35}.nc-fleet-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:75;padding:16px;display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:#000000b8;overscroll-behavior:contain}.nc-fleet-modal-dialog{width:min(680px,100%);max-height:calc(100dvh - 32px);overflow-y:auto;border-radius:12px;background:#0e140e;box-shadow:0 14px 50px #000000b3;overscroll-behavior:contain}.nc-fleet-modal-dialog .nc-fleet-form{margin:0;padding:14px}.nc-fleet-head-actions{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}.nc-fleet-pair,.nc-fleet-env{display:flex;gap:6px}.nc-fleet-pair input,.nc-fleet-pair select,.nc-fleet-env input{flex:1;min-width:0}@media(max-width:520px){.nc-fleet-modal{padding:0;align-items:stretch}.nc-fleet-modal-dialog{width:100%;max-height:100dvh;border-radius:0}.nc-fleet-item{align-items:stretch;flex-direction:column}.nc-fleet-item>span:last-child{width:100%;justify-content:flex-start}.nc-fleet-pair{flex-direction:column}}.nc-invite-endpoint{border:1px solid #243;border-radius:8px;padding:9px 10px;overflow-wrap:anywhere}.nc-local-share{border:1px solid #243;border-radius:10px;padding:10px;background:#0a0e0a}.nc-local-share .nc-node-share{padding:2px 0}.nc-invite-advanced{display:flex;flex-direction:column;gap:8px;padding:9px;border-left:2px solid #243}.nc-invite-actions{flex-wrap:wrap}.nc-update-settings,.nc-backup-dialog{border:1px solid #243;border-radius:10px;padding:10px}.nc-backup-tabs{margin:0}.nc-backup-list{display:flex;flex-direction:column;gap:6px;max-height:42vh;overflow-y:auto}.nc-backup-row,.nc-backup-import-row{border:1px solid #1c241c;border-radius:8px;padding:8px}.nc-backup-import-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(160px,.7fr);gap:8px;align-items:center}@media(max-width:520px){.nc-backup-import-row{grid-template-columns:1fr}}.nc-set-node{border:1px solid #1c241c;border-radius:10px;padding:10px;display:flex;flex-direction:column;gap:8px;background:#0a0e0a}.nc-peer-group{display:flex;flex-direction:column;gap:8px}.nc-peer-group-title{display:flex;align-items:center;justify-content:space-between;color:#9fd;font-size:12px;font-weight:600;padding:2px 1px}.nc-peer-group-title span{color:#789;font-variant-numeric:tabular-nums}.nc-set-node.routed{border-style:dashed;background:#090d0b}.nc-node-editor{border-top:1px solid #243;padding-top:10px}.nc-node-row{flex-direction:row;align-items:center;gap:8px;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:48px}.nc-node-row:hover{border-color:#2e7d32}.nc-node-row:focus-visible{outline:2px solid #2e7d32;outline-offset:2px}.nc-node-row-text{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.nc-node-row-text b{color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-node-row-text small{opacity:.6;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-node-row-more{flex:none;opacity:.5;display:flex}.nc-set-node-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.nc-set-node-head b{color:#d8ffe8}.nc-set-node-head small{opacity:.6;font-size:11px}.nc-set-tunnel{margin-left:auto;font-size:11px;color:#f88}.nc-set-tunnel.up{color:#6c6}.nc-set-node-actions{display:flex;gap:6px;flex-wrap:wrap}.nc-set-node-actions .nc-btn{padding:5px 10px;font-size:12px}.nc-set-test{font-size:11px}.nc-set-test.ok{color:#6c6}.nc-set-test.ko{color:#f88}.nc-diagnostics .nc-field{display:flex;flex-direction:column;gap:4px;font-size:12px}.nc-diag-controls{border:1px solid #243;border-radius:10px;padding:10px}.nc-diag-filters{display:grid;grid-template-columns:minmax(110px,.45fr) minmax(0,1fr);gap:8px}.nc-diag-filters select,.nc-diag-filters input,.nc-diagnostics>.nc-field select{padding:8px 9px;font:12px/1.3 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px;min-width:0;width:100%;box-sizing:border-box}.nc-diag-log{min-height:220px;max-height:42vh;margin:0;padding:10px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text;background:#070a07;color:#bde8c8;border:1px solid #1c241c;border-radius:8px;font:11px/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:520px){.nc-set-tabs{scrollbar-width:none;-ms-overflow-style:none}.nc-set-tabs::-webkit-scrollbar{display:none}.nc-set-tabs .nc-set-tabbtn{min-width:max-content;padding-inline:12px}.nc-diag-filters{grid-template-columns:1fr}.nc-diag-log{min-height:35vh;max-height:48vh}}.nc-set-copyline{display:flex;gap:8px;align-items:center}.nc-set-copyline code{flex:1;font-size:10px;word-break:break-all;-webkit-user-select:all;user-select:all;background:#0a0e0a;border:1px solid #1c241c;border-radius:6px;padding:6px;max-height:72px;overflow-y:auto}.nc-set-akeys{display:flex;flex-direction:column;gap:6px}.nc-set-row{display:flex;gap:8px;flex-wrap:wrap}.nc-set-confirm{border:1px solid #4a3a10;border-radius:10px;padding:10px;background:#171307;font-size:12px;color:#e8d8a0;display:flex;flex-direction:column;gap:10px}.nc-set-panel .nc-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.nc-set-panel .nc-check input{accent-color:#2e7d32;margin-top:2px}.nc-set-panel .nc-btn{border:none;border-radius:8px;padding:8px 16px;font-size:13px;cursor:pointer}.nc-set-panel .nc-btn.ghost{background:none;border:1px solid #243;color:#9fd}.nc-set-panel .nc-btn.primary{background:#2e7d32;color:#fff}.nc-set-panel .nc-btn.danger{background:none;border:1px solid #532;color:#f88}.nc-set-panel .nc-btn:disabled{opacity:.5;cursor:default}.nc-set-panel .nc-sheet-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.nc-set-panel .nc-sheet-label{font-size:12px;opacity:.7;text-transform:uppercase;letter-spacing:.5px}.nc-set-panel .nc-err{color:#f88;font-size:12px}.nc-set-panel .nc-empty{opacity:.5;font-size:12px}.nc-set-panel .nc-dot{width:8px;height:8px;border-radius:50%;background:#333;display:inline-block;flex:0 0 8px}.nc-set-panel .nc-dot.on{background:#2e7d32}.nc-model-test{font-weight:600}.nc-model-test.ok{color:var(--success)}.nc-model-test.unknown-model{color:var(--error)}.nc-model-test.auth,.nc-model-test.unreachable{color:var(--warning)}.nc-model-test.unverified{color:var(--text-secondary);font-style:italic}.nc-wiz-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;background:#000000b3;display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.nc-wiz{width:100%;max-width:420px;max-height:90vh;overflow-y:auto;background:#0e140e;color:#cfe;border:1px solid #243;border-radius:14px;padding:18px;display:flex;flex-direction:column;gap:14px;box-shadow:0 12px 40px #00000080}.nc-wiz-head{display:flex;flex-direction:column;gap:4px}.nc-wiz-head b{font-size:17px;color:#d8ffe8}.nc-wiz-head small{font-size:12px;opacity:.65;text-transform:uppercase;letter-spacing:.5px}.nc-wiz-body{display:flex;flex-direction:column;gap:10px}.nc-wiz-body input{padding:9px 10px;font:14px/1.2 inherit;background:#0a0e0a;color:#cfe;border:1px solid #243;border-radius:8px}.nc-wiz-body input:focus{outline:none;border-color:#2e7d32}.nc-wiz-body .nc-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:#bfe8cd}.nc-wiz-body .nc-field small{font-size:10px;opacity:.58;line-height:1.3}.nc-wiz-help{margin:0;font-size:11px;line-height:1.4;opacity:.7}.nc-wiz-ports{display:grid;grid-template-columns:1fr 1fr;gap:10px}@media(max-width:420px){.nc-wiz-ports{grid-template-columns:1fr}}.nc-wiz-done{font-size:13px;opacity:.85}.nc-wiz .nc-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.nc-wiz .nc-check input{accent-color:#2e7d32;margin-top:2px}.nc-wiz .nc-check span{display:flex;flex-direction:column;gap:2px}.nc-wiz .nc-check small{opacity:.6;font-size:11px}.nc-wiz .nc-btn{border:none;border-radius:8px;padding:8px 16px;font-size:13px;cursor:pointer}.nc-wiz .nc-btn.ghost{background:none;border:1px solid #243;color:#9fd}.nc-wiz .nc-btn.primary{background:#2e7d32;color:#fff}.nc-wiz .nc-btn:disabled{opacity:.5;cursor:default}.nc-wiz .nc-sheet-actions{display:flex;justify-content:flex-end;gap:8px}.nc-wiz .nc-err{color:#f88;font-size:12px}.nc-wiz-skip{background:none;border:none;color:#9fd;opacity:.6;font-size:12px;cursor:pointer;text-decoration:underline;align-self:center;padding:4px}.nc-wiz-skip:hover{opacity:1}.nc-ntf-toasts{position:fixed;top:10px;right:10px;z-index:2100;display:flex;flex-direction:column;gap:8px;max-width:min(360px,calc(100vw - 20px))}.nc-ntf-toast{display:flex;align-items:flex-start;gap:8px;background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:10px;padding:8px 8px 8px 12px;font-size:13px;box-shadow:0 2px 12px #0000008c}.nc-ntf-toast.high{border-left-color:var(--warning)}.nc-ntf-toast-txt{display:flex;flex-direction:column;gap:2px;min-width:0}.nc-ntf-toast-txt b{word-break:break-word}.nc-ntf-toast-txt small{color:var(--text-secondary);word-break:break-word}.nc-ntf-from{color:var(--text-tertiary);font-size:11px;font-family:var(--font-mono)}.nc-ntf-x{margin-left:auto;background:none;border:none;color:var(--text-tertiary);cursor:pointer;padding:2px;display:inline-flex;border-radius:6px}.nc-ntf-x:hover{color:var(--text-primary);background:var(--bg-hover)}.nc-ask-badge{position:fixed;bottom:64px;right:12px;z-index:2100;display:inline-flex;align-items:center;gap:6px;background:var(--accent);color:#fff;border:none;border-radius:999px;padding:8px 14px;font-size:14px;font-weight:700;cursor:pointer;box-shadow:0 2px 12px #0000008c}.nc-ask-badge:hover{background:var(--accent-hover)}.nc-ask-count{background:#00000059;border-radius:999px;padding:0 7px;font-size:12px;line-height:18px}.nc-ask-panel{position:fixed;bottom:10px;right:10px;z-index:2100;width:min(420px,calc(100vw - 20px));max-height:min(70vh,560px);display:flex;flex-direction:column;background:var(--bg-secondary);border:1px solid var(--border);border-radius:12px;box-shadow:0 4px 20px #0009}.nc-ask-panel-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--border);font-size:13px}.nc-ask-panel-head .nc-ask-count{background:var(--accent)}.nc-ask-panel-body{overflow-y:auto;padding:10px 12px;display:flex;flex-direction:column;gap:10px}.nc-ask-card{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:10px;padding:10px;display:flex;flex-direction:column;gap:8px}.nc-ask-head{display:flex;align-items:center;gap:8px}.nc-ask-id{color:var(--text-tertiary);font-size:11px;margin-left:auto}.nc-ask-q{font-size:13px;white-space:pre-wrap;word-break:break-word}.nc-ask-opts{display:flex;flex-wrap:wrap;gap:6px}.nc-ask-reply{display:flex;gap:6px;align-items:flex-end}.nc-ask-reply textarea{flex:1;resize:vertical;min-height:34px;background:var(--bg-primary);color:var(--text-primary);border:1px solid var(--border);border-radius:8px;padding:6px 8px;font:inherit;font-size:13px}.nc-ask-card .nc-err{color:var(--error);font-size:12px}.nc-cell-switcher-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:70;display:flex;align-items:flex-end;background:#0000008c}.nc-cell-switcher{width:min(88vw,360px);min-height:260px;max-height:72vh;max-height:min(72dvh,540px);box-sizing:border-box;padding:12px 12px max(12px,env(safe-area-inset-bottom)) max(12px,env(safe-area-inset-left));display:flex;flex-direction:column;gap:8px;background:#0e140e;color:#cfe;border-right:1px solid #243;border-top:1px solid #243;border-radius:0 14px 0 0;box-shadow:10px -6px 30px #00000073;outline:none}.nc-cell-switcher-list{min-height:0;flex:1 1 auto;overflow-y:auto;display:flex;flex-direction:column;gap:6px;overscroll-behavior-y:contain}.nc-cell-switcher-row{min-height:44px;width:100%;display:flex;align-items:stretch;gap:6px;box-sizing:border-box;padding:0 6px 0 0;border:1px solid #1c241c;border-radius:9px;background:#0a0e0a;color:#cfe}.nc-cell-switcher-row.current{border-color:#2e7d32;background:#14200f}.nc-cell-switcher-row.selected{border-color:#79d9ff;background:#112637;box-shadow:0 0 0 2px #79d9ff33}.nc-cell-switcher-row.off{opacity:.48}.nc-cell-switcher-row-select{min-width:0;min-height:44px;flex:1 1 auto;display:flex;align-items:center;gap:10px;padding:8px 4px 8px 0;border:0;background:transparent;color:#cfe;text-align:left}.nc-cell-switcher-row-select[aria-disabled=true]{cursor:default}.nc-cell-switcher .nc-roster-handle{flex:0 0 36px;width:36px;min-width:36px;min-height:44px;margin:0;border:1px solid transparent;border-radius:8px;background:#ffffff06;color:#688475;touch-action:none}.nc-cell-switcher .nc-roster-handle.active,.nc-cell-switcher .nc-roster-handle:focus-visible{color:#bfffd8;border-color:#00cc6673;background:#00cc661f}.nc-cell-switcher-row.nc-roster-dragging{opacity:.62}.nc-cell-switcher-row.nc-roster-over{outline:2px solid rgba(0,204,102,.72);outline-offset:2px}.nc-cell-switcher-dot{flex:0 0 9px;width:9px;height:9px;border-radius:50%;background:#355}.nc-cell-switcher-dot.on{background:#0c6;box-shadow:0 0 6px #0c68}.nc-cell-switcher-dot.warn{background:#e0b020;box-shadow:0 0 6px #e0b02088}.nc-cell-switcher-dot.working{animation:nc-cell-switcher-pulse 1.1s ease-in-out infinite}.nc-cell-switcher-copy{min-width:0;display:flex;flex-direction:column;gap:2px}.nc-cell-switcher-copy b,.nc-cell-switcher-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-cell-switcher-copy b{color:#d8ffe8;font-size:14px}.nc-cell-switcher-copy small{opacity:.62;font-size:11px}.nc-cell-switcher-copy .nc-cell-switcher-state{opacity:.88;color:#d8ffe8}.nc-cell-switcher-copy .nc-cell-switcher-telemetry{color:#9fd8c2}.nc-cell-switcher-acts{display:none;gap:4px}.nc-cell-switcher-act{display:none;border:1px solid rgba(216,255,232,.25);background:#d8ffe80f;color:#d8ffe8;border-radius:6px;min-width:34px;min-height:34px;font-size:14px}@media(max-width:640px){.nc-cell-switcher-acts{display:inline-flex}.nc-cell-switcher-act{display:inline-flex;align-items:center;justify-content:center}}.nc-cell-switcher-notice{color:#ffd36b;font-size:12px}.nc-cell-switcher-actions{display:flex;min-width:0}.nc-cell-switcher-open{min-width:0;min-height:44px;width:100%;padding:0 12px;border:1px solid #79d9ff;border-radius:9px;background:#16445e;color:#effcff;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nc-cell-switcher-open:disabled{border-color:#2b3c2b;background:#14200f;color:#8fa898;opacity:.7}.nc-cell-switcher-controls{display:flex;align-items:center;gap:6px;min-width:0}.nc-cell-switcher-controls b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#d8ffe8;font-size:14px}.nc-cell-switcher-controls button{min-width:44px;min-height:44px;border:1px solid #2b3c2b;border-radius:9px;background:#14200f;color:#cfe}.nc-cell-switcher-controls .nc-cell-switcher-filter{padding:0 9px}.nc-cell-switcher-controls .nc-cell-switcher-close{font-size:24px}@keyframes nc-cell-switcher-pulse{50%{opacity:.45}}@media(prefers-reduced-motion:reduce){.nc-cell-switcher-dot.working{animation:none}}.nc-cell-switcher-peek{flex:0 0 auto;display:flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:0;border-radius:8px;background:transparent;cursor:pointer}.nc-cell-switcher-peek:hover,.nc-cell-switcher-peek:focus-visible{background:#ffffff0f}.nc-cell-switcher-star{display:inline-flex;align-items:center;justify-content:center;min-width:40px;min-height:40px;padding:0;flex:0 0 auto;background:#ffffff0d;border:1px solid rgba(255,255,255,.22);color:#9aa89a;border-radius:8px;font-size:15px;line-height:1;cursor:pointer}.nc-cell-switcher-act.nc-cell-switcher-host{min-width:40px;min-height:40px;padding:0;flex:0 0 auto;border-radius:8px}.nc-cell-switcher-host.on,.nc-cell-switcher-star.on{color:#e8c547;border-color:#e8c5478c;background:#e8c54714}.nc-cell-switcher-star.designated{color:#c8a6ff;border-color:#c8a6ff99;background:#c8a6ff1f}.nc-cell-switcher-star.thread-present{color:#69b7ff;border-color:#69b7ff99;background:#69b7ff1f}.nc-cell-switcher-star.thread-active{color:#ff5a5a;border-color:#ff5a5a99;background:#ff5a5a1f}.nc-cell-switcher-star.thread-unknown{color:#e0b020;border-color:#e0b02099;background:#e0b0201f}.nc-vl-session-view{display:flex;flex-direction:column;height:100%;min-height:0;background:#0a0e0a;color:#cfe}.nc-vl-session-body{flex:1 1 auto;min-height:0;overflow-y:auto;padding:16px 20px 32px}.nc-vl-session-body .nc-vl-events{max-width:70ch;margin:0 auto}.nc-vl-session-body .nc-vl-events-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.nc-vl-session-body .nc-vl-ev{white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.45}.nc-vl-session-body .nc-vl-ev-thinking{color:#7fa88f;font-style:italic}.nc-vl-session-body .nc-vl-ev-tool_start,.nc-vl-session-body .nc-vl-ev-tool_end,.nc-vl-session-body .nc-vl-ev-usage,.nc-vl-session-body .nc-vl-ev-writer_epoch{color:#6f8f7a;font-size:12px}.nc-vl-session-body .nc-vl-ev-turn_end,.nc-vl-session-body .nc-vl-ev-done{color:#8fd0a8}.nc-vl-session-body .nc-vl-ev.error{color:#e08a8a}.nc-vl-session-body .nc-vl-ev.gap{color:#c9b46a;font-size:12px}:root{color-scheme:dark}body,#root{margin:0;height:100vh;height:100dvh;background:#0a0e0a;font-family:ui-monospace,monospace}.nc-app{display:flex;flex-direction:column;height:100vh;height:100dvh;min-height:0}.nc-keybar{flex:0 0 auto}.nc-bar{display:flex;gap:10px;align-items:center;padding:8px;color:#cfe;background:#0e140e}.nc-bar button{background:none;border:1px solid #243;color:#9fd;border-radius:6px;padding:4px 10px}.nc-termwrap{position:relative;flex:1}.nc-auth{color:#cfe;padding:20px;display:flex;flex-direction:column;gap:10px;max-width:420px}.nc-auth input[type=text],.nc-auth input:not([type]){padding:10px;background:#122;border:1px solid #243;color:#cfe;border-radius:6px}.nc-auth button{padding:10px;background:#122;border:1px solid #243;color:#9fd;border-radius:6px}.nc-bar-right{margin-left:auto;display:flex;gap:4px}@media(pointer:coarse){.nc-bar button,.nc-bar-right button{min-height:42px;min-width:42px;font-size:20px}}.nc-bar button,.nc-bar-right button{display:inline-flex;align-items:center;justify-content:center;gap:6px}.nc-bar>button{flex:0 0 auto}.nc-bar>b{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600}.nc-bar-right{flex:0 0 auto}@media(max-width:480px){.nc-bar-label{display:none}}.nc-workspace{display:flex;flex-direction:row;height:100vh;height:100dvh;min-height:0;background:#0a0e0a;color:#cfe}.nc-workspace-main{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column}.nc-single-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:40;background:#0a0e0a}.nc-bar-single .nc-bar-center{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1.15}.nc-bar-single .nc-bar-center b{font-size:13px;font-weight:600;color:#d8ffe8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.nc-bar-sub{font-size:10px;opacity:.55}.nc-app{animation:nc-slide-in .2s ease-out}@keyframes nc-slide-in{0%{transform:translate(12%);opacity:0}to{transform:translate(0);opacity:1}}@media(prefers-reduced-motion:reduce){.nc-app{animation:none}}@keyframes nc-cell-working-blip{0%,to{opacity:1;transform:scale(1);box-shadow:0 0 7px #0c6c}50%{opacity:.22;transform:scale(.72);box-shadow:0 0 1px #0c62}}.nc-dot.on.working,.dot.on.working{animation:nc-cell-working-blip 1.1s ease-in-out infinite;transform-origin:center}@media(prefers-reduced-motion:reduce){.nc-dot.on.working,.dot.on.working{animation:none}}.nc-stale{position:fixed;top:8px;left:50%;transform:translate(-50%);z-index:2000;cursor:pointer;background:#1a2410;color:#d9f7c7;border:1px solid #7aa903;border-radius:8px;padding:6px 14px;font-size:13px;box-shadow:0 2px 10px #00000080}.nc-pin-error{display:flex;align-items:center;gap:8px;padding:6px 10px;margin:6px;border:1px solid rgba(255,90,90,.55);background:#ff5a5a1f;color:#ff8a8a;border-radius:8px;font-size:12px}.nc-pin-error-text{flex:1}.nc-pin-error-retry{cursor:pointer;background:#ff5a5a33;border:1px solid rgba(255,90,90,.5);color:#ffb3b3;border-radius:6px;padding:2px 8px;font-size:12px}.nc-pin-error-retry:hover{filter:brightness(1.2)}.nc-pin-error-close{cursor:pointer;background:transparent;border:none;color:#ff8a8a;font-size:16px;line-height:1;padding:0 2px}.nc-renderer-toggle{opacity:.55}.nc-renderer-toggle.on{opacity:1;color:#7fe3ff}.nc-update{position:fixed;bottom:8px;left:50%;transform:translate(-50%);z-index:2000;display:flex;align-items:center;gap:10px;background:#0f1a0f;color:#d9f7c7;border:1px solid #2e7d32;border-radius:10px;padding:6px 8px 6px 14px;font-size:13px;box-shadow:0 2px 12px #0000008c}.nc-update-msg{white-space:nowrap}.nc-update-btn{display:inline-flex;align-items:center;justify-content:center;background:#2e7d32;border:1px solid #2e7d32;color:#06120a;border-radius:7px;padding:4px 12px;font:inherit;font-size:13px;cursor:pointer}.nc-update-btn:hover{background:#3a9d42}@media(prefers-reduced-motion:reduce){.nc-update{transition:none}}.nc-update-close{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;background:transparent;border:1px solid #2e7d32;color:#d9f7c7;border-radius:7px;font:inherit;font-size:14px;line-height:1;cursor:pointer}.nc-update-close:hover{background:#2e7d32;color:#06120a}:root{--bg-primary: #0d1117;--bg-secondary: #161b22;--bg-tertiary: #21262d;--bg-hover: #30363d;--text-primary: #e6edf3;--text-secondary: #8b949e;--text-tertiary: #6e7681;--border: #30363d;--accent: #6c5ce7;--accent-hover: #7c6cf7;--success: #3fb950;--warning: #d29922;--error: #f85149;--user-bg: #1c2333;--assistant-bg: transparent;--font-mono: "SF Mono", monospace;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;width:100%;overflow:hidden}body{font-family:var(--font-sans);background:var(--bg-primary);color:var(--text-primary);-webkit-font-smoothing:antialiased}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-tertiary);border-radius:3px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spinning{animation:spin 1s linear infinite}
@@ -11,8 +11,8 @@
11
11
  <meta name="apple-mobile-web-app-title" content="NexusCrew" />
12
12
  <link rel="manifest" href="/manifest.json" />
13
13
  <title>NexusCrew</title>
14
- <script type="module" crossorigin src="/assets/index-5eCvm3HF.js"></script>
15
- <link rel="stylesheet" crossorigin href="/assets/index-DqCfZFGi.css">
14
+ <script type="module" crossorigin src="/assets/index-DS1VyIuo.js"></script>
15
+ <link rel="stylesheet" crossorigin href="/assets/index-XusWm2UG.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -1 +1 @@
1
- {"version":"0.9.34"}
1
+ {"version":"0.9.36"}
@@ -72,6 +72,24 @@ function draftFrom(defs) {
72
72
  ...(Array.isArray(defs.models) && defs.models.length
73
73
  ? { models: defs.models.map((m) => ({ ...m })) }
74
74
  : {}),
75
+ // Gli capabilityProfiles dichiarati vanno RIPORTATI come i models: la
76
+ // bozza e' la base di ogni scrittura, e una chiave non copiata o sparisce
77
+ // (nessun riferimento) o rende il file non scrivibile (una cella che
78
+ // riferisce un profilo non piu' dichiarato). Copia profonda: per ogni
79
+ // profilo, per ogni chiave array, array copiato.
80
+ ...(defs.capabilityProfiles && Object.keys(defs.capabilityProfiles).length
81
+ ? {
82
+ capabilityProfiles: Object.fromEntries(Object.entries(defs.capabilityProfiles).map(([nome, profilo]) => [
83
+ nome,
84
+ {
85
+ ...profilo,
86
+ ...(Array.isArray(profilo.mcp) ? { mcp: [...profilo.mcp] } : {}),
87
+ ...(Array.isArray(profilo.skills) ? { skills: [...profilo.skills] } : {}),
88
+ ...(Array.isArray(profilo.ondemand) ? { ondemand: [...profilo.ondemand] } : {}),
89
+ },
90
+ ])),
91
+ }
92
+ : {}),
75
93
  engines: defs.engines.map((e) => ({
76
94
  ...e,
77
95
  ...(e.managed ? { managed: { ...e.managed } } : {}),
@@ -1433,6 +1451,12 @@ async function createBuiltinFleet(cfg = {}) {
1433
1451
  // vuoto — si poteva dichiarare un modello e non vederlo mai, ne' ritirarlo.
1434
1452
  // I test CRUD non se ne accorgevano perche' leggevano fleet.json diretto.
1435
1453
  ...(Array.isArray(defs.models) && defs.models.length ? { models: defs.models } : {}),
1454
+ // I capabilityProfiles dichiarati escono dalla VISTA come dal file: la
1455
+ // finestra li legge da qui per vederli e ritirarli, e la API li conferma
1456
+ // senza rileggere fleet.json.
1457
+ ...(defs.capabilityProfiles && Object.keys(defs.capabilityProfiles).length
1458
+ ? { capabilityProfiles: defs.capabilityProfiles }
1459
+ : {}),
1436
1460
  managedCatalog,
1437
1461
  // I NOMI dei server MCP disponibili, per la finestra che sceglie quali
1438
1462
  // strumenti dare a una cella. Solo nomi: le definizioni non escono di qui,
package/lib/mcp/tools.js CHANGED
@@ -252,7 +252,7 @@ async function readVlDirectory(ctx) {
252
252
  const localId = String(config && config.instanceId || '');
253
253
  if (!NODE_ID_RE.test(localId)) throw new Error('instanceId locale non disponibile');
254
254
  const owners = [{ instanceId: localId, route: [], label: 'Local', stale: false },
255
- ...topologyOwners(topology).filter((owner) => !owner.stale && owner.instanceId !== localId)];
255
+ ...topologyOwners(topology).filter((owner) => owner.instanceId !== localId)];
256
256
  const nodes = [];
257
257
  const availableOwners = [];
258
258
  const unavailable = [];
@@ -455,7 +455,9 @@ const TOOLS = [
455
455
  if (!NODE_ID_RE.test(localNodeId)) throw new Error('instanceId locale non disponibile');
456
456
  if (!localDecks || !Array.isArray(localDecks.decks)) throw new Error('risposta deck non valida');
457
457
 
458
- const remotes = topologyOwners(topology).filter((owner) => !owner.stale && owner.instanceId !== localNodeId);
458
+ // Gli owner stale restano interrogabili con la loro route (best-effort):
459
+ // un ramo lento degrada a stale, non sparisce dalla directory dei deck.
460
+ const remotes = topologyOwners(topology).filter((owner) => owner.instanceId !== localNodeId);
459
461
  const viewerById = new Map([[localNodeId, []], ...remotes.map((owner) => [owner.instanceId, owner.route])]);
460
462
  const sources = [{
461
463
  owner: { instanceId: localNodeId, route: [], label: 'Local' },
@@ -19,6 +19,24 @@ const { COOKIE_NAME: PANEL_COOKIE_NAME } = require('./panel-auth.js');
19
19
  const MAX_HOPS = 4;
20
20
  const ROUTE_DELIMITER = '_';
21
21
  const TOPOLOGY_PEER_TIMEOUT_MS = 1500;
22
+ // Budget per hop della topologia federata: quando la richiesta arriva da un
23
+ // peer, il fan-out verso i propri figli si tiene questo margine sotto il
24
+ // budget del chiamante, cosi' la risposta rientra sempre in chi chiama.
25
+ const HOP_MARGIN_MS = 500;
26
+ const CHILD_BUDGET_FLOOR_MS = 300;
27
+ // Ultimo snapshot riuscito per figlio diretto (cache in memoria, chiave
28
+ // store+figlio): serve i rami lenti come stale invece di farli sparire dal
29
+ // ramo del chiamante.
30
+ const CHILD_SNAPSHOT_MAX = 64;
31
+ const childSnapshotsByNodeId = new Map();
32
+
33
+ function recordChildSnapshot(nodesPath, nodeId, nodes) {
34
+ childSnapshotsByNodeId.set(`${nodesPath}::${nodeId}`, { ts: Date.now(), nodes });
35
+ if (childSnapshotsByNodeId.size <= CHILD_SNAPSHOT_MAX) return;
36
+ let oldest = null;
37
+ for (const [id, snap] of childSnapshotsByNodeId) if (!oldest || snap.ts < oldest[1].ts) oldest = [id, snap];
38
+ if (oldest) childSnapshotsByNodeId.delete(oldest[0]);
39
+ }
22
40
  // Finestra di attesa del reverse channel su Share ON: limitata per non
23
41
  // diventare un retry storm, ma sufficiente al bind subito dopo un pairing.
24
42
  const SHARE_HEALTH_ATTEMPTS = 10;
@@ -959,7 +977,7 @@ async function fetchPeerTopology({ node, ttl, seen, fetchImpl, timeoutMs }) {
959
977
  }, budget);
960
978
  });
961
979
  const request = (async () => {
962
- const u = `http://127.0.0.1:${node.localPort}/federation/topology?ttl=${ttl - 1}&visited=${encodeURIComponent([...seen].join(','))}`;
980
+ const u = `http://127.0.0.1:${node.localPort}/federation/topology?ttl=${ttl - 1}&visited=${encodeURIComponent([...seen].join(','))}&budget=${budget}`;
963
981
  const response = await fetchImpl(u, {
964
982
  headers: { authorization: `Bearer ${node.token}` }, signal: ctrl.signal,
965
983
  });
@@ -969,14 +987,49 @@ async function fetchPeerTopology({ node, ttl, seen, fetchImpl, timeoutMs }) {
969
987
  finally { clearTimeout(timer); }
970
988
  }
971
989
 
990
+ // Validazione dei nodi figli riportati da un peer (stesso gate del loop
991
+ // storico): identita' strict, route valida e aciclica verso il padre, nome
992
+ // coerente con l'ultimo hop. Le entry valide sono relative al figlio.
993
+ // Lo stato stale/lastSeen che il salto precedente aveva gia' calcolato
994
+ // VIAGGIA con il figlio (ben formato: stale===true, lastSeen intero): senza
995
+ // questa propagazione l'ultimo hop ricompatterebbe tutto come fresco e il
996
+ // badge veritiero non arriverebbe mai a chi guarda.
997
+ function validatedChildNodes(n, seen, ttl, body) {
998
+ if (!body || body.instanceId !== n.nodeId || !Array.isArray(body.nodes)) return null;
999
+ const out = [];
1000
+ for (const child of body.nodes) {
1001
+ if (!child || !store.NODE_ID_RE.test(child.instanceId) || child.instanceId === n.nodeId || seen.has(child.instanceId)
1002
+ || !store.NODE_NAME_RE.test(child.name)
1003
+ || !Array.isArray(child.route) || child.route.length < 1 || child.route.length >= ttl
1004
+ || child.route.some((x) => !store.NODE_NAME_RE.test(x))
1005
+ || new Set(child.route).size !== child.route.length
1006
+ || child.name !== child.route[child.route.length - 1]
1007
+ || child.route.includes(n.name)) continue;
1008
+ out.push({
1009
+ instanceId: child.instanceId, name: child.name, route: [...child.route],
1010
+ label: store.validLabel(child.label) ? child.label.trim() : '',
1011
+ ...(child.stale === true
1012
+ ? { stale: true, ...(Number.isSafeInteger(child.lastSeen) ? { lastSeen: child.lastSeen } : {}) }
1013
+ : {}),
1014
+ });
1015
+ }
1016
+ return out;
1017
+ }
1018
+
972
1019
  async function collectTopologyDetailed({
973
1020
  nodesPath, ingress = null, ttl = MAX_HOPS, visited = [], fetchImpl = fetch,
974
- timeoutMs = TOPOLOGY_PEER_TIMEOUT_MS,
1021
+ timeoutMs = TOPOLOGY_PEER_TIMEOUT_MS, childSnapshots = true,
975
1022
  }) {
976
1023
  const st = store.loadStore(nodesPath);
977
1024
  if (!st) return { instanceId: null, nodes: [], authoritative: [] };
978
1025
  const seen = new Set(visited.filter((x) => store.NODE_ID_RE.test(x)));
979
1026
  seen.add(st.nodeId);
1027
+ const budget = Number.isFinite(timeoutMs)
1028
+ ? Math.max(1, Math.min(30000, Math.floor(timeoutMs))) : TOPOLOGY_PEER_TIMEOUT_MS;
1029
+ // Richiesta da un peer: il fan-out verso i figli usa un budget inferiore a
1030
+ // quello del chiamante, cosi' questa risposta rientra sempre nel suo budget.
1031
+ const childBudget = ingress
1032
+ ? Math.max(CHILD_BUDGET_FLOOR_MS, budget - HOP_MARGIN_MS) : budget;
980
1033
  const out = [];
981
1034
  const authoritative = [];
982
1035
  const probes = [];
@@ -995,22 +1048,17 @@ async function collectTopologyDetailed({
995
1048
  label: store.validLabel(n.label) ? n.label.trim() : '',
996
1049
  });
997
1050
  if (ttl <= 1 || !n.token) continue;
998
- probes.push({ n, pending: fetchPeerTopology({ node: n, ttl, seen, fetchImpl, timeoutMs }) });
1051
+ probes.push({ n, pending: fetchPeerTopology({ node: n, ttl, seen, fetchImpl, timeoutMs: childBudget }) });
999
1052
  }
1000
1053
  const results = await Promise.all(probes.map(async ({ n, pending }) => {
1001
1054
  try { return { n, ...(await pending) }; } catch (_) { return { n, response: null, body: null }; }
1002
1055
  }));
1003
1056
  for (const { n, response, body } of results) {
1004
- if (!response || !response.ok || body.instanceId !== n.nodeId || !Array.isArray(body.nodes)) continue;
1005
- authoritative.push(n.name);
1006
- for (const child of body.nodes) {
1007
- if (!child || !store.NODE_ID_RE.test(child.instanceId) || child.instanceId === n.nodeId || seen.has(child.instanceId)
1008
- || !store.NODE_NAME_RE.test(child.name)
1009
- || !Array.isArray(child.route) || child.route.length < 1 || child.route.length >= ttl
1010
- || child.route.some((x) => !store.NODE_NAME_RE.test(x))
1011
- || new Set(child.route).size !== child.route.length
1012
- || child.name !== child.route[child.route.length - 1]
1013
- || child.route.includes(n.name)) continue;
1057
+ const children = response && response.ok ? validatedChildNodes(n, seen, ttl, body) : null;
1058
+ if (children) {
1059
+ authoritative.push(n.name);
1060
+ recordChildSnapshot(nodesPath, n.nodeId, children);
1061
+ for (const child of children) {
1014
1062
  // La label di un nodo in transito e' testo AUTO-DICHIARATO da un altro
1015
1063
  // nodo: si accetta solo se rispetta la stessa forma di una label locale,
1016
1064
  // altrimenti si resta senza nome invece di propagare qualcosa di
@@ -1018,8 +1066,37 @@ async function collectTopologyDetailed({
1018
1066
  out.push({
1019
1067
  instanceId: child.instanceId, name: child.name,
1020
1068
  route: [n.name, ...child.route], direct: false,
1021
- label: store.validLabel(child.label) ? child.label.trim() : '',
1069
+ label: child.label,
1070
+ ...(child.stale === true
1071
+ ? { stale: true, ...(Number.isSafeInteger(child.lastSeen) ? { lastSeen: child.lastSeen } : {}) }
1072
+ : {}),
1022
1073
  });
1074
+ }
1075
+ continue;
1076
+ }
1077
+ // Figlio che non ha risposto in tempo (failure di trasporto: response null):
1078
+ // si serve l'ultimo snapshot riuscito marcando le entry stale con lastSeen,
1079
+ // invece di far sparire l'intero ramo dalla topologia di chi chiama. Una
1080
+ // risposta ARRIVATA ma non valida (binding instanceId sbagliato, errore
1081
+ // HTTP) non resuscita nulla: il ramo resta assente, come prima. (Raccolta
1082
+ // locale esclusa: la sua cache su disco ha gia' questa semantica con il
1083
+ // proprio clock.)
1084
+ const snapshot = childSnapshots && !response
1085
+ ? childSnapshotsByNodeId.get(`${nodesPath}::${n.nodeId}`) : null;
1086
+ if (!snapshot) continue;
1087
+ const lastSeen = Math.floor(snapshot.ts / 1000);
1088
+ for (const child of snapshot.nodes) {
1089
+ if (child.instanceId === n.nodeId || seen.has(child.instanceId)) continue;
1090
+ if (!Array.isArray(child.route) || child.route.length < 1 || child.route.length >= ttl
1091
+ || child.route.includes(n.name)) continue;
1092
+ out.push({
1093
+ instanceId: child.instanceId, name: child.name,
1094
+ route: [n.name, ...child.route], direct: false,
1095
+ label: child.label, stale: true,
1096
+ // il lastSeen piu' veritiero e' quello che il figlio stesso aveva
1097
+ // riportato (se era gia' stale); altrimenti il momento dello snapshot
1098
+ lastSeen: Number.isSafeInteger(child.lastSeen) ? child.lastSeen : lastSeen,
1099
+ });
1023
1100
  }
1024
1101
  }
1025
1102
  const ids = new Set(); const routes = new Set(); const unique = [];
@@ -1037,12 +1114,14 @@ async function collectTopology(opts) {
1037
1114
  }
1038
1115
 
1039
1116
  // Local roster: live topology plus a credential-free cache of previously seen
1040
- // transitive nodes. Stale entries are never returned by the peer endpoint.
1117
+ // transitive nodes. Slow children fall back to the last good in-memory
1118
+ // snapshot (stale:true); the peer endpoint returns them too, so a branch that
1119
+ // misses one poll degrades to stale instead of disappearing.
1041
1120
  async function collectLocalTopology({
1042
1121
  nodesPath, cachePath, fetchImpl = fetch, now = Math.floor(Date.now() / 1000),
1043
1122
  timeoutMs = TOPOLOGY_PEER_TIMEOUT_MS,
1044
1123
  }) {
1045
- const live = await collectTopologyDetailed({ nodesPath, fetchImpl, timeoutMs });
1124
+ const live = await collectTopologyDetailed({ nodesPath, fetchImpl, timeoutMs, childSnapshots: false });
1046
1125
  const st = store.loadStore(nodesPath);
1047
1126
  const directNames = new Set(((st && st.nodes) || [])
1048
1127
  .filter((n) => n.direction !== 'inbound' || n.shared === true)
@@ -1063,11 +1142,14 @@ async function collectLocalTopology({
1063
1142
  for (const n of live.nodes) {
1064
1143
  // La cache conserva anche la label: senza, un nodo che torna stale perde il
1065
1144
  // nome e ricompare come slug, cioe' esattamente il difetto che si voleva
1066
- // togliere. Resta un dato riferito, non una prova.
1145
+ // togliere. Resta un dato riferito, non una prova. Per i nodi arrivati
1146
+ // gia' stale dal salto precedente, il lastSeen ORIGINALE e' il dato vero:
1147
+ // "ora" mentirebbe su quando sono stati visti l'ultima volta.
1067
1148
  if (n.route.length > 1) {
1068
1149
  next.set(n.instanceId, {
1069
1150
  instanceId: n.instanceId, name: n.name, route: [...n.route],
1070
- ...(n.label ? { label: n.label } : {}), lastSeen: now,
1151
+ ...(n.label ? { label: n.label } : {}),
1152
+ lastSeen: n.stale === true && Number.isSafeInteger(n.lastSeen) ? n.lastSeen : now,
1071
1153
  });
1072
1154
  }
1073
1155
  }
@@ -1077,7 +1159,13 @@ async function collectLocalTopology({
1077
1159
  try { topologyCache.atomicWriteCache(cacheFile, serialized); } catch (_) {}
1078
1160
  }
1079
1161
 
1080
- const nodes = live.nodes.map((n) => ({ ...n, stale: false, lastSeen: now }));
1162
+ // Solo i nodi visti DIRETTAMENTE vivi prendono stale:false + lastSeen=now:
1163
+ // un nodo che il peer aveva gia' marcato stale resta stale col suo lastSeen.
1164
+ const nodes = live.nodes.map((n) => ({
1165
+ ...n,
1166
+ stale: n.stale === true,
1167
+ lastSeen: n.stale === true && Number.isSafeInteger(n.lastSeen) ? n.lastSeen : now,
1168
+ }));
1081
1169
  for (const n of cached) {
1082
1170
  if (!liveIds.has(n.instanceId) && !liveRoutes.has(n.route.join('/'))) nodes.push({ ...n, direct: false, stale: true });
1083
1171
  }
@@ -1302,7 +1390,12 @@ function peerRouter({ nodesPath, localPort, localCredential, fetchImpl, readonly
1302
1390
  r.get('/topology', async (req, res) => {
1303
1391
  const ttl = Math.max(0, Math.min(MAX_HOPS, Number(req.query.ttl) || MAX_HOPS));
1304
1392
  const visited = String(req.query.visited || '').split(',');
1305
- res.json(await collectTopology({ nodesPath, ingress: req.peer, ttl, visited, fetchImpl }));
1393
+ // Il budget residuo del chiamante viaggia nella richiesta: il fan-out
1394
+ // interno se ne tiene un margine (budget per hop) per rispondere in tempo.
1395
+ const rawBudget = Number(req.query.budget);
1396
+ const timeoutMs = Number.isFinite(rawBudget)
1397
+ ? Math.max(CHILD_BUDGET_FLOOR_MS, Math.min(30000, Math.floor(rawBudget))) : TOPOLOGY_PEER_TIMEOUT_MS;
1398
+ res.json(await collectTopology({ nodesPath, ingress: req.peer, ttl, visited, fetchImpl, timeoutMs }));
1306
1399
  });
1307
1400
  // A connected client publishes itself through the SAME SSH connection by
1308
1401
  // toggling its optional -R channel. The hub records that intent only after a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmmbuto/nexuscrew",
3
- "version": "0.9.34",
3
+ "version": "0.9.36",
4
4
  "description": "Faithful browser tmux client — attach to live sessions over a real PTY, localhost-only, mobile-easy",
5
5
  "main": "lib/server.js",
6
6
  "bin": {