nterminal 1.2.13 → 1.2.14

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.
Files changed (38) hide show
  1. package/README.md +7 -34
  2. package/bin/nterminal.js +10 -23
  3. package/dist/client/assets/{MarkdownPreview-DfZZD0C0.js → MarkdownPreview-DBMjXHXe.js} +1 -1
  4. package/dist/client/assets/index-BprWaATf.css +1 -0
  5. package/dist/client/assets/index-DJRitqb8.js +44 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/scripts/onboarding.js +15 -53
  8. package/dist/scripts/onboarding.js.map +1 -1
  9. package/dist/scripts/proxySetup.js +1 -5
  10. package/dist/scripts/proxySetup.js.map +1 -1
  11. package/dist/server/agent/agentRoutes.js +4 -2
  12. package/dist/server/agent/agentRoutes.js.map +1 -1
  13. package/dist/server/auth/cookies.js +0 -8
  14. package/dist/server/auth/cookies.js.map +1 -1
  15. package/dist/server/config.js +1 -1
  16. package/dist/server/config.js.map +1 -1
  17. package/dist/server/routes/agentManagementRoutes.js +87 -13
  18. package/dist/server/routes/agentManagementRoutes.js.map +1 -1
  19. package/dist/server/routes/updateRoutes.js +2 -2
  20. package/dist/server/routes/updateRoutes.js.map +1 -1
  21. package/dist/server/update/{gitUpdate.d.ts → packageUpdate.d.ts} +1 -9
  22. package/dist/server/update/packageUpdate.js +140 -0
  23. package/dist/server/update/packageUpdate.js.map +1 -0
  24. package/dist/server/update/runtimeUninstall.d.ts +2 -0
  25. package/dist/server/update/runtimeUninstall.js +45 -0
  26. package/dist/server/update/runtimeUninstall.js.map +1 -0
  27. package/dist/shared/protocol.d.ts +6 -8
  28. package/dist/shared/protocol.js.map +1 -1
  29. package/docs/configuration.md +6 -23
  30. package/docs/features.md +1 -1
  31. package/docs/onboarding.md +3 -44
  32. package/docs/operations.md +26 -45
  33. package/package.json +1 -1
  34. package/scripts/nterminalctl +78 -69
  35. package/dist/client/assets/index-CMVGLebq.js +0 -43
  36. package/dist/client/assets/index-DiQ82H7w.css +0 -1
  37. package/dist/server/update/gitUpdate.js +0 -241
  38. package/dist/server/update/gitUpdate.js.map +0 -1
@@ -1 +0,0 @@
1
- .xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-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;inset: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}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Regular-Cxr8pvCI.ttf) format("truetype");font-display:block;font-weight:400;font-style:normal}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Bold-kN-HYz-g.ttf) format("truetype");font-display:block;font-weight:700;font-style:normal}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Italic-CMg1T6-G.ttf) format("truetype");font-display:block;font-weight:400;font-style:italic}@font-face{font-family:MesloLGS NF;src:url(/assets/MesloLGS-NF-Bold-Italic-DwFsXcwX.ttf) format("truetype");font-display:block;font-weight:700;font-style:italic}:root{color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-ui);font-synthesis:none;text-rendering:optimizeLegibility;text-size-adjust:100%;-webkit-text-size-adjust:100%;--nterminal-viewport-height: 100vh;--nterminal-keyboard-inset-bottom: 0px;--nterminal-safe-area-bottom: env(safe-area-inset-bottom, 0px);--nt-bg: #0a0d10;--nt-bg-2: #0d1216;--nt-bg-sidebar: #08090b;--nt-line: #1a2128;--nt-line-2: #2a3340;--nt-fg: #e2e8ee;--nt-fg-2: #8896a3;--nt-fg-3: #54616d;--nt-accent: #5eead4;--nt-accent-soft: rgba(94, 234, 212, .1);--nt-accent-glow: rgba(94, 234, 212, .55);--nt-ok: #34d399;--nt-danger: #f87171;--nt-font-ui: "Inter", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--nt-font-mono: "JetBrains Mono", "MesloLGS NF", ui-monospace, "SF Mono", monospace}@supports (height: 100dvh){:root{--nterminal-viewport-height: 100dvh}}*{box-sizing:border-box}html,body,#root{width:100%;min-width:320px;height:100%;min-height:100%;margin:0;overflow:hidden;overscroll-behavior:none}body{overflow:hidden;background:var(--nt-bg);touch-action:manipulation}button,input,textarea,select{font:inherit}button{color:inherit}button:disabled{cursor:not-allowed;opacity:.42}input{min-width:0;outline:none}textarea{min-width:0;resize:none;outline:none}.terminal-shell{display:grid;grid-template-columns:232px minmax(0,1fr);width:100%;height:var(--nterminal-viewport-height);min-height:0;overflow:hidden;padding-bottom:var(--nterminal-safe-area-bottom);background:var(--nt-bg);transition:grid-template-columns .16s ease}.terminal-shell[data-collapsed=true]{grid-template-columns:56px minmax(0,1fr)}.workspace-backdrop{display:none}.workspace-sidebar{display:grid;grid-template-rows:auto 1fr auto;min-width:0;min-height:0;border-right:1px solid var(--nt-line);background:var(--nt-bg-sidebar)}.workspace-brand{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:16px 16px 14px}.terminal-shell[data-collapsed=true] .workspace-brand{grid-template-columns:1fr;justify-items:center;gap:6px;padding:14px 0 12px}.workspace-brand-name{color:var(--nt-fg);font-size:13px;font-weight:600;letter-spacing:.02em}.nterminal-mark,.nterminal-wordmark{display:block;flex:0 0 auto}.sidebar-collapse-button,.sidebar-drawer-close-button,.workspace-sidebar-header button,.mobile-menu-button,.tab-add-button,.pane-action-button,.icon-button,.workspace-footer-icon-button,.workspace-close-button,.terminal-pane-close,.empty-workspace button,.secondary-button{display:grid;place-items:center;border:1px solid transparent;padding:0;color:var(--nt-fg-3);background:transparent;cursor:pointer}.sidebar-collapse-button,.sidebar-drawer-close-button{width:22px;height:22px;border-radius:4px}.sidebar-drawer-close-button{display:none}.terminal-shell[data-collapsed=true] .sidebar-collapse-button{width:28px;height:24px}.sidebar-collapse-button:hover:not(:disabled),.sidebar-drawer-close-button:hover:not(:disabled),.workspace-sidebar-header button:hover:not(:disabled),.mobile-menu-button:hover:not(:disabled),.pane-action-button:hover:not(:disabled),.icon-button:hover:not(:disabled),.workspace-footer-icon-button:hover:not(:disabled),.empty-workspace button:hover:not(:disabled),.secondary-button:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-bg-2)}.workspace-nav{display:grid;grid-template-rows:auto 1fr;min-height:0}.workspace-sidebar-content{display:grid;grid-template-rows:auto auto minmax(0,1fr);min-width:0;min-height:0}.workspace-sidebar-servers{border-bottom:1px solid var(--nt-line);padding:0 12px 10px}.server-list{display:flex;flex-direction:column;gap:6px}.server-list-row{display:flex;align-items:center;gap:4px}.server-list-item{display:grid;grid-template-rows:auto auto;gap:7px;flex:1;min-width:0;min-height:86px;padding:8px;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--nt-fg-3);font-size:12px;cursor:pointer;text-align:left}.server-list-item-header{display:flex;align-items:center;gap:8px;min-width:0}.server-list-item:hover{background:var(--nt-bg-2);color:var(--nt-fg)}.server-list-item--active{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.server-list-dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0}.server-list-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-list-stats{font-size:10px;font-variant-numeric:tabular-nums;color:var(--nt-fg-3)}.server-list-stats-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px;width:100%}.server-list-stats--offline{display:flex;align-items:center;min-height:48px;padding:0 6px;border:1px solid var(--nt-line);border-radius:5px;color:var(--nt-danger);background:var(--nt-bg)}.server-list-stat-cell{min-width:0;padding:5px 6px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg)}.server-list-stat-label,.server-list-stat-value,.server-list-stat-detail{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.server-list-stat-label{color:var(--nt-fg-3);font-size:9px;letter-spacing:0}.server-list-stat-value{margin-top:2px;color:var(--nt-fg);font-size:11px;font-weight:650}.server-list-stat-detail{margin-top:1px;color:var(--nt-fg-3);font-size:9px}.server-list-item--active .server-list-stats{color:var(--nt-accent)}.server-list-item--active .server-list-stat-cell{border-color:color-mix(in srgb,var(--nt-accent) 24%,var(--nt-line))}.server-list-item--active .server-list-stat-value{color:var(--nt-accent)}.server-list--compact{display:flex;flex-direction:column;align-items:center;gap:6px;padding:8px 0}.server-list-chip{position:relative;display:grid;place-items:center;width:36px;height:36px;border:1px solid transparent;border-radius:8px;background:var(--nt-bg-2);color:var(--nt-fg-3);font-size:14px;font-weight:600;cursor:pointer;padding:0}.server-list-chip:hover{color:var(--nt-fg);border-color:var(--nt-line)}.server-list-chip--active{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.server-list-chip-initial{line-height:1}.server-list-chip-pip{position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-radius:50%;border:1px solid var(--nt-bg-sidebar)}.server-list-chip-pip[data-status=ok]{background:var(--nt-accent)}.server-list-chip-pip[data-status=offline]{background:var(--nt-danger)}.server-list-chip-pip[data-status=unknown]{background:var(--nt-fg-3);opacity:.4}.workspace-nav--collapsed{padding:0}.server-list-editor{flex:1 1 auto;display:flex;align-items:center;min-width:0}.server-list-editor input{width:100%;height:28px;padding:0 22px 0 10px;border-radius:6px;border:1px solid var(--nt-accent);background:var(--nt-bg-2);color:var(--nt-fg);font:inherit;outline:none}.server-list-remove{width:22px;height:22px;border:none;border-radius:4px;background:transparent;color:var(--nt-fg-3);font-size:16px;line-height:1;cursor:pointer;flex-shrink:0}.server-list-remove:hover{color:var(--nt-danger);background:var(--nt-bg-2)}.server-list-add{height:28px;border:1px dashed var(--nt-line);border-radius:5px;background:transparent;color:var(--nt-fg-3);font-size:11px;cursor:pointer}.server-list-add:hover{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent)}.server-add-form{display:flex;flex-direction:column;gap:6px;padding:8px 0 2px}.server-add-form input{height:28px;padding:0 8px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg-2);color:var(--nt-fg);font-size:12px}.server-add-actions{display:flex;gap:6px}.server-add-actions button{flex:1;height:28px;font-size:11px}.totp-setup{display:flex;flex-direction:column;gap:14px}.totp-setup-instructions{color:var(--nt-fg-2);font-size:13px;line-height:1.5}.totp-qr-container{display:flex;justify-content:center;padding:12px;background:#fff;border-radius:8px;align-self:center}.totp-secret-details{font-size:12px;color:var(--nt-fg-3)}.totp-secret-text{margin-top:6px;padding:8px;border-radius:5px;background:var(--nt-bg-2);font-family:var(--nt-mono, monospace);letter-spacing:.1em;word-break:break-all;color:var(--nt-fg)}.auth-checkbox{display:inline-flex;flex-direction:row;align-items:center;gap:8px;font-size:12.5px;line-height:1.4;color:var(--nt-fg-2);cursor:pointer;-webkit-user-select:none;user-select:none}input[type=checkbox]{appearance:none;-webkit-appearance:none;width:16px;height:16px;margin:0;flex:0 0 16px;border:1px solid var(--nt-line-2);border-radius:4px;background:var(--nt-bg-2);cursor:pointer;position:relative;transition:border-color .12s ease,background .12s ease}input[type=checkbox]:hover{border-color:var(--nt-accent)}input[type=checkbox]:focus-visible{outline:none;border-color:var(--nt-accent);box-shadow:0 0 0 2px var(--nt-accent-soft)}input[type=checkbox]:checked{background:var(--nt-accent);border-color:var(--nt-accent)}input[type=checkbox]:checked:after{content:"";position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid var(--nt-bg);border-width:0 2px 2px 0;transform:rotate(45deg)}input[type=checkbox]:disabled{opacity:.5;cursor:not-allowed}.workspace-sidebar-footer-actions{display:flex;flex:0 0 auto;gap:5px}.security-overlay{position:fixed;inset:0;background:#0000008c;display:flex;align-items:center;justify-content:center;z-index:50;padding:16px}.security-panel{width:100%;max-width:520px;max-height:85vh;overflow:auto;background:var(--nt-bg-2);border:1px solid var(--nt-line);border-radius:10px;padding:20px;display:flex;flex-direction:column;gap:18px}.settings-panel{max-width:min(1080px,calc(100vw - 32px));max-height:min(86vh,820px);overflow:hidden;padding:0;gap:0}.settings-panel .security-panel-header{flex:0 0 auto;padding:18px 20px;border-bottom:1px solid var(--nt-line)}.settings-layout{display:grid;grid-template-columns:180px minmax(0,1fr);min-height:0}.settings-nav{display:flex;flex-direction:column;gap:4px;min-height:0;padding:12px;border-right:1px solid var(--nt-line);background:color-mix(in srgb,var(--nt-bg) 52%,transparent)}.settings-nav button{position:relative;height:32px;border:0;border-left:2px solid transparent;border-radius:5px;padding:0 10px;color:var(--nt-fg-2);background:transparent;text-align:left;font-size:12px;cursor:pointer}.settings-nav button:hover{color:var(--nt-fg);border-left-color:var(--nt-accent);background:var(--nt-accent-soft)}.settings-nav button[data-active=true]{color:var(--nt-accent);border-left-color:var(--nt-accent);background:var(--nt-accent-soft)}.settings-content{min-height:0;max-height:calc(min(86vh,820px) - 66px);overflow:auto;padding:18px 22px 22px;scroll-behavior:smooth;overscroll-behavior:contain}.settings-section,.settings-section-group>.security-section{scroll-margin-top:16px;padding-bottom:18px;border-bottom:1px solid var(--nt-line)}.settings-section+.settings-section,.settings-section+.settings-section-group,.settings-section-group+.settings-section-group{margin-top:18px}.settings-section-group:last-child>.security-section{border-bottom:0;padding-bottom:0}.settings-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.security-panel-header{display:flex;align-items:center;justify-content:space-between}.security-panel-header h2{margin:0;font-size:16px;color:var(--nt-fg)}.security-close{width:28px;height:28px;border:none;border-radius:5px;background:transparent;color:var(--nt-fg-2);font-size:20px;cursor:pointer}.security-close:hover{background:var(--nt-bg);color:var(--nt-fg)}.security-section h3{margin:0 0 4px;font-size:13px;color:var(--nt-fg)}.settings-control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;margin-top:10px;color:var(--nt-fg-2);font-size:12px}.settings-control-value{color:var(--nt-accent);font-family:var(--nt-font-mono);font-size:12px;font-variant-numeric:tabular-nums}.settings-control input[type=range]{grid-column:1 / -1;width:100%;accent-color:var(--nt-accent)}.settings-control select{grid-column:1 / -1;width:100%;height:30px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px}.settings-theme-swatches{display:flex;gap:8px;margin-top:8px}.settings-theme-swatch{width:28px;height:18px;border:1px solid var(--nt-line-2);border-radius:5px;background:linear-gradient(90deg,var(--settings-theme-accent) 0 50%,var(--nt-bg) 50% 100%)}.settings-theme-swatch[data-active=true]{border-color:var(--settings-theme-accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--settings-theme-accent) 18%,transparent)}.settings-checkbox{margin-top:12px}.settings-stepper-row{display:grid;grid-template-columns:32px minmax(72px,1fr) 32px 60px;gap:8px;align-items:center;margin-top:10px}.settings-duration-row{grid-template-columns:minmax(72px,1fr) 60px}.settings-stepper-row button{height:28px;border-radius:5px}.settings-stepper-button{width:32px;font-family:var(--nt-font-mono);font-size:13px;line-height:1}.settings-reset-button{padding:0 9px;font-family:var(--nt-font-mono);font-size:10.5px;letter-spacing:0}.settings-shortcut-list{display:grid;gap:8px;margin:12px 0 0;padding:0;list-style:none}.settings-shortcut-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;min-height:42px;border:1px solid var(--nt-line);border-radius:6px;padding:8px 10px}.settings-shortcut-label{display:block;color:var(--nt-fg);font-size:12px}.settings-shortcut-group{display:block;margin-top:2px;color:var(--nt-fg-3);font-size:10.5px}.settings-shortcut-actions{display:flex;align-items:center;gap:6px}.settings-shortcut-recorder{min-width:148px;height:28px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 9px;color:var(--nt-accent);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.settings-shortcut-recorder[data-recording=true]{border-color:var(--nt-accent);background:var(--nt-accent-soft);box-shadow:0 0 0 2px color-mix(in srgb,var(--nt-accent) 16%,transparent)}.settings-shortcut-reset{height:28px;padding:0 9px;border-radius:5px;font-family:var(--nt-font-mono);font-size:10.5px}.settings-stepper-row input{width:100%;height:28px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px}.settings-assets-header{display:flex;justify-content:space-between;gap:10px;margin-top:14px;color:var(--nt-fg-2);font-size:12px}.settings-assets-header span:last-child{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.settings-asset-input{display:none}.settings-upload-button{width:100%;height:30px;margin-top:8px;border-radius:5px;font-size:11px}.settings-error{margin:8px 0 0;color:var(--nt-danger);font-size:11px}.settings-asset-list{display:grid;gap:8px;margin:10px 0 0;padding:0;list-style:none}.settings-asset-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:58px;border:1px solid var(--nt-line);border-radius:6px;padding:6px;background:#ffffff05}.settings-asset-list li[data-enabled=true]{border-color:color-mix(in srgb,var(--nt-accent) 24%,transparent);background:color-mix(in srgb,var(--nt-accent) 3.5%,transparent)}.settings-asset-choice{display:grid;grid-template-columns:16px 64px minmax(0,1fr);align-items:center;gap:8px;min-width:0;cursor:pointer}.settings-asset-choice input{width:14px;height:14px;margin:0;accent-color:var(--nt-accent)}.settings-asset-list video{width:64px;height:46px;object-fit:contain;pointer-events:none}.settings-asset-copy,.settings-asset-copy span,.settings-asset-copy small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.settings-asset-copy{display:grid;gap:3px}.settings-asset-copy span{color:var(--nt-fg);font-size:11px}.settings-asset-copy small{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px}.settings-asset-delete{display:grid;width:24px;height:24px;place-items:center;border-radius:4px;padding:0;font-size:11px}.settings-save-assets-button{width:100%;height:30px;margin-top:8px;border-radius:5px;font-size:11px}.security-list{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}.security-list li{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border:1px solid var(--nt-line);border-radius:6px}.security-item-label{display:flex;align-items:center;gap:8px;color:var(--nt-fg);font-size:13px}.security-item-meta{display:block;color:var(--nt-fg-3);font-size:11px;margin-top:2px}.security-badge{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--nt-accent-soft);color:var(--nt-accent)}.security-remove{border:1px solid var(--nt-line);border-radius:5px;background:transparent;color:var(--nt-danger);font-size:11px;padding:4px 10px;cursor:pointer}.security-remove:hover{background:var(--nt-bg)}.security-add-form{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap}.security-add-form input{flex:1;min-width:120px;height:30px;padding:0 8px;border:1px solid var(--nt-line);border-radius:5px;background:var(--nt-bg);color:var(--nt-fg);font-size:12px}.security-add-form button{height:30px;padding:0 14px}.update-actions{display:flex;gap:8px}.update-actions button{height:30px;padding:0 14px;border-radius:5px;font-family:var(--nt-font-mono);font-size:12px;cursor:pointer;transition:color .12s ease,background .12s ease,border-color .12s ease,box-shadow .12s ease}.update-actions button:not(.secondary-button){border:1px solid var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft)}.update-actions button:not(.secondary-button):hover:not(:disabled){color:#062423;background:var(--nt-accent);box-shadow:0 0 16px var(--nt-accent-glow)}.security-list .secondary-button{height:28px;padding:0 12px;border-radius:5px;font-family:var(--nt-font-mono);font-size:11px}.workspace-sidebar-tabs{display:grid;grid-template-columns:1fr 1fr;gap:4px;border-bottom:1px solid var(--nt-line);padding:0 12px 10px}.workspace-sidebar-tabs button{height:26px;border:1px solid var(--nt-line);border-radius:5px;color:var(--nt-fg-3);background:transparent;font-size:11px;cursor:pointer}.workspace-sidebar-tabs button:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-bg-2)}.workspace-sidebar-tabs button[aria-selected=true]{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-accent);background:var(--nt-accent-soft)}.workspace-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:4px 16px 8px;color:var(--nt-fg-3);font-size:10.5px;letter-spacing:.06em}.workspace-sidebar-header button{width:20px;height:20px;border-radius:4px;font-size:16px}.workspace-sidebar-header button:hover:not(:disabled),.tab-add-button:hover:not(:disabled){color:var(--nt-accent)}.workspace-list{display:flex;min-height:0;flex-direction:column;overflow:auto;overscroll-behavior:contain;padding-bottom:8px;-webkit-overflow-scrolling:touch}.workspace-entry{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;min-width:0}.workspace-select-button,.workspace-name-editor{display:grid;min-width:0;gap:2px;border:0;border-left:2px solid transparent;border-radius:0;padding:7px 16px 7px 14px;color:var(--nt-fg-2);background:transparent;text-align:left}.workspace-select-button{cursor:pointer}.workspace-select-button:hover:not(:disabled){color:var(--nt-fg);background:#ffffff04}.workspace-entry[data-active=true] .workspace-select-button,.workspace-entry[data-active=true] .workspace-name-editor{color:var(--nt-fg);border-left-color:var(--nt-accent);background:linear-gradient(90deg,var(--nt-accent-soft),transparent 60%)}.workspace-entry strong{max-width:100%;overflow:hidden;color:currentColor;font-size:12.5px;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.workspace-entry[data-active=true] strong{font-weight:600}.workspace-entry-meta{display:flex;min-width:0;justify-content:space-between;gap:8px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.workspace-entry-cwd{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-name-editor{background:var(--nt-bg-2);border-left-color:var(--nt-accent)}.workspace-name-editor input{width:100%;border:1px solid var(--nt-accent);border-radius:3px;padding:2px 6px;color:var(--nt-fg);background:var(--nt-bg);box-shadow:0 0 8px var(--nt-accent-soft);font-size:12.5px;font-weight:600}.workspace-close-button{align-self:center;width:22px;height:22px;margin-right:10px;border-radius:3px;opacity:0;transition:opacity .12s ease,color .12s ease,background .12s ease}.workspace-entry:hover .workspace-close-button{opacity:1}.workspace-close-button:hover:not(:disabled),.terminal-pane-close:hover:not(:disabled){color:var(--nt-danger);background:#f871711a}.terminal-shell[data-collapsed=true] .workspace-list{align-items:center}.terminal-shell[data-collapsed=true] .workspace-entry{display:block}.terminal-shell[data-collapsed=true] .workspace-select-button{justify-items:center;border-left:0;padding:10px 0}.workspace-initial{display:grid;width:28px;height:28px;place-items:center;border:1px solid var(--nt-line);border-radius:6px;color:var(--nt-fg-2);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:12px;font-weight:700}.workspace-entry[data-active=true] .workspace-initial{border-color:var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft);box-shadow:0 0 12px var(--nt-accent-soft)}.workspace-sidebar-footer{display:flex;align-items:center;justify-content:space-between;gap:8px;border-top:1px solid var(--nt-line);padding:12px 16px;color:var(--nt-fg-3);font-size:10.5px}.workspace-sidebar-footer>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-footer-icon-button{position:relative;width:26px;height:26px;border-color:var(--nt-line);border-radius:5px;color:var(--nt-fg-2);background:#0a0d102e}.workspace-footer-icon-button:hover:not(:disabled){border-color:color-mix(in srgb,var(--nt-accent) 40%,transparent);color:var(--nt-accent)}.workspace-footer-icon{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.update-pulse-dot{position:absolute;top:4px;right:4px;width:7px;height:7px;border-radius:50%;background:var(--nt-accent);box-shadow:0 0 color-mix(in srgb,var(--nt-accent) 45%,transparent);animation:update-pulse 1.4s ease-out infinite;pointer-events:none}.settings-update-dot{top:7px;right:8px}@keyframes update-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--nt-accent) 45%,transparent)}70%{box-shadow:0 0 0 7px transparent}to{box-shadow:0 0 0 0 transparent}}@media(prefers-reduced-motion:reduce){.update-pulse-dot{animation:none}}.file-explorer{display:grid;grid-template-rows:auto auto minmax(0,1fr);min-width:0;min-height:0;color:var(--nt-fg-2)}.file-explorer-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;border-bottom:1px solid var(--nt-line);padding:8px 10px 8px 12px}.file-explorer-path{min-width:0;overflow:hidden;color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:10.5px;text-overflow:ellipsis;white-space:nowrap}.file-explorer-toolbar,.file-detail-actions,.file-mode-actions,.file-save-row{display:flex;align-items:center;gap:6px}.file-explorer-toolbar button,.file-detail-actions button,.file-mode-actions button,.file-save-row button,.file-conflict button{min-height:24px;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg-2);background:transparent;font-size:11px;cursor:pointer}.file-explorer-toolbar button{width:24px;padding:0}.file-explorer-toolbar button:hover:not(:disabled),.file-detail-actions button:hover:not(:disabled),.file-mode-actions button:hover:not(:disabled),.file-save-row button:hover:not(:disabled),.file-conflict button:hover:not(:disabled){border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-fg);background:var(--nt-accent-soft)}.file-explorer-alert,.file-conflict{border-bottom:1px solid rgba(248,113,113,.25);padding:7px 12px;color:#fca5a5;background:#f8717114;font-size:11px}.file-conflict{display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid rgba(248,113,113,.25);border-radius:6px}.file-explorer-layout{display:grid;grid-template-rows:minmax(110px,.7fr) minmax(0,1fr);min-width:0;min-height:0}.file-tree{min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;border-bottom:1px solid var(--nt-line);padding:6px 0;-webkit-overflow-scrolling:touch}.file-tree-children{display:grid}.file-entry-button{display:grid;grid-template-columns:13px minmax(0,1fr) auto;align-items:center;gap:6px;width:100%;min-width:0;border:0;border-left:2px solid transparent;padding:6px 12px 6px calc(10px + (var(--file-tree-depth, 0) * 14px));color:var(--nt-fg-2);background:transparent;text-align:left;cursor:pointer}.file-entry-button:hover:not(:disabled),.file-entry-button[data-active=true]{color:var(--nt-fg);background:#ffffff05}.file-entry-button[data-active=true]{border-left-color:var(--nt-accent)}.file-entry-button[data-kind=directory][data-expanded=true]{background:color-mix(in srgb,var(--nt-accent) 4.5%,transparent)}.file-entry-button:disabled{opacity:.44}.file-entry-disclosure{width:13px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px;text-align:center}.file-entry-name{min-width:0;overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.file-entry-button small{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px}.file-entry-button[data-kind=directory] .file-entry-name{color:var(--nt-accent)}.file-detail{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:8px;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;padding:10px 12px 12px;-webkit-overflow-scrolling:touch}.file-detail-header,.file-save-row{display:flex;min-width:0;align-items:center;justify-content:space-between;gap:8px}.file-detail-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.file-detail-actions{flex:0 0 auto}.file-detail-empty{display:grid;min-height:92px;place-items:center;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.file-preview-frame{min-height:180px;overflow:auto}.file-preview-frame img,.file-preview-frame iframe{width:100%;min-height:180px;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg-2)}.file-preview-frame img{height:auto;object-fit:contain}.file-markdown-panel,.file-editor-shell{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:8px;min-width:0;min-height:0}.file-markdown-preview{min-height:180px;overflow:auto;overscroll-behavior:contain;border:1px solid var(--nt-line);border-radius:6px;padding:10px;color:var(--nt-fg);background:var(--nt-bg-2);font-size:12px;line-height:1.45;-webkit-overflow-scrolling:touch}.file-text-preview{min-height:180px;overflow:auto;overscroll-behavior:contain;border:1px solid var(--nt-line);border-radius:6px;padding:10px;color:var(--nt-fg);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:12px;line-height:1.45;white-space:pre-wrap;word-break:break-word;-webkit-overflow-scrolling:touch}.file-markdown-preview :first-child{margin-top:0}.file-markdown-preview :last-child{margin-bottom:0}.file-editor{width:100%;min-height:190px;border:1px solid var(--nt-line);border-radius:6px;padding:10px;color:var(--nt-fg);background:var(--nt-bg-2);font-family:var(--nt-font-mono);font-size:12px;line-height:1.45}.file-editor:focus{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);box-shadow:0 0 0 2px var(--nt-accent-soft)}.file-save-row{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.terminal-main{position:relative;display:grid;grid-template-rows:40px minmax(0,1fr);min-width:0;min-height:0;background:var(--nt-bg)}.workspace-error{margin:0;border-bottom:1px solid rgba(248,113,113,.25);padding:6px 12px;color:#fca5a5;background:#f8717114;font-size:12px}.terminal-tabs{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:stretch;min-width:0;border-bottom:1px solid var(--nt-line);padding:0 8px 0 4px;background:var(--nt-bg)}.mobile-menu-button{display:none;align-self:center;width:32px;height:32px;margin:0 2px;border-radius:5px}.hamburger-lines{display:grid;gap:3px}.hamburger-lines span{display:block;width:16px;height:1px;background:currentColor}.terminal-tab-list{display:flex;min-width:0;max-width:100%;align-items:stretch;overflow-x:auto;overscroll-behavior:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch}.terminal-tab-list::-webkit-scrollbar{display:none}.terminal-tab-drop-slot{flex:0 0 6px;position:relative}.terminal-tab-drop-slot:before{content:"";position:absolute;top:8px;bottom:8px;left:50%;width:1px;background:var(--nt-line);pointer-events:none}.terminal-tab-drop-slot:first-child:before,.terminal-tab-drop-slot:last-child:before{display:none}.terminal-tab-drop-slot[data-over=true]:after{content:"";position:absolute;inset:4px 2px;background:var(--nt-accent);border-radius:2px;box-shadow:0 0 8px var(--nt-accent-glow);pointer-events:none}.terminal-tab{position:relative;display:flex;align-items:center;min-width:0;touch-action:none;user-select:none;-webkit-user-select:none}.terminal-tab[data-active=true]:after{position:absolute;right:12px;bottom:-1px;left:12px;height:2px;background:var(--nt-accent);box-shadow:0 0 10px var(--nt-accent-glow);content:""}.terminal-tab-status-dot{display:inline-block;flex:0 0 auto;width:7px;height:7px;border-radius:50%;margin:0 6px 0 10px;background:var(--nt-fg-3);vertical-align:middle}.terminal-tab-status-dot[data-activity=idle]{background:var(--nt-accent);box-shadow:0 0 4px var(--nt-accent-glow)}.terminal-tab-status-dot[data-activity=busy]{background:#f59e0b;box-shadow:0 0 6px #f59e0b8c;animation:nterminal-tab-status-pulse 1.5s ease-in-out infinite}.terminal-tab-status-dot[data-activity=exited]{background:var(--nt-danger)}@keyframes nterminal-tab-status-pulse{0%,to{opacity:1}50%{opacity:.5}}.terminal-tab[data-unread=true]:before{position:absolute;top:4px;right:6px;width:6px;height:6px;border-radius:50%;background:var(--nt-accent);box-shadow:0 0 6px var(--nt-accent-glow);content:"";pointer-events:none}.terminal-tab-select,.terminal-tab-editor{display:flex;flex:1 1 auto;align-items:center;gap:8px;min-width:0;height:40px;border:0;padding:0 4px 0 14px;color:var(--nt-fg-2);background:transparent;font-size:12px}.terminal-tab-select{max-width:200px;cursor:pointer}.terminal-tab-select:hover:not(:disabled),.terminal-tab[data-active=true] .terminal-tab-select{color:var(--nt-fg)}.terminal-tab-select>span,.terminal-tab-editor input{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.terminal-tab small,.terminal-tab-editor small{flex:0 0 auto;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10px}.terminal-tab[data-active=true] small,.terminal-tab-editor small{color:var(--nt-accent)}.terminal-tab-editor{padding:0 12px}.terminal-tab-editor input{width:min(180px,100%);border:1px solid var(--nt-accent);border-radius:3px;padding:2px 6px;color:var(--nt-fg);background:var(--nt-bg-2);box-shadow:0 0 8px var(--nt-accent-soft);font-size:12px}.icon-button{width:18px;height:18px;margin-right:6px;border-radius:3px;opacity:0;transition:opacity .12s ease,color .12s ease,background .12s ease}.terminal-tab:hover .icon-button,.terminal-tab[data-active=true] .icon-button{opacity:1}.icon-button:hover:not(:disabled){color:var(--nt-fg)}.tab-add-button{flex:0 0 auto;width:30px;height:40px;font-size:18px;font-weight:500}.terminal-detached-pills{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:0 6px;flex:0 1 auto;min-width:0}.terminal-detached-pill{display:inline-flex;align-items:stretch;height:24px;font-size:12px;background:var(--nt-bg-2);border:1px solid var(--nt-line);border-radius:999px;overflow:hidden;color:var(--nt-fg-2);transition:border-color .12s ease,color .12s ease}.terminal-detached-pill:hover{border-color:var(--nt-accent);color:var(--nt-fg)}.terminal-detached-pill-open{padding:0 10px;background:transparent;border:0;color:inherit;font:inherit;cursor:pointer;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.terminal-detached-pill-open:focus-visible{outline:2px solid var(--nt-accent-soft);outline-offset:-1px}.terminal-detached-pill-delete{display:inline-flex;align-items:center;justify-content:center;width:0;padding:0;background:transparent;border:0;color:var(--nt-fg-3);font-size:14px;line-height:1;cursor:pointer;overflow:hidden;transition:width .14s ease,color .12s ease}.terminal-detached-pill:hover .terminal-detached-pill-delete,.terminal-detached-pill-delete:focus-visible{width:22px;color:var(--nt-danger)}.terminal-delete-dialog{max-width:420px;gap:16px}.terminal-delete-dialog-body{display:grid;gap:8px}.terminal-delete-dialog-body p{margin:0;color:var(--nt-fg);font-size:13px}.terminal-delete-dialog-body span{min-width:0;overflow:hidden;padding:9px 10px;border:1px solid var(--nt-line);border-radius:6px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.terminal-delete-dialog-body small{color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.terminal-delete-dialog-actions{display:flex;justify-content:flex-end;gap:8px}.terminal-delete-dialog-actions button{height:32px;min-width:82px;border-radius:5px;padding:0 14px;font-family:var(--nt-font-mono);font-size:12px;cursor:pointer}.terminal-delete-confirm{border:1px solid rgba(248,113,113,.55);color:var(--nt-danger);background:#f871711a}.terminal-delete-confirm:hover:not(:disabled){color:#190607;background:var(--nt-danger)}.transcript-dialog{width:calc(100vw - 56px);height:calc(100vh - 56px);gap:12px;overflow:hidden}.transcript-dialog-title{display:grid;min-width:0;gap:2px}.transcript-dialog-title h2{margin:0}.transcript-dialog-title span{min-width:0;overflow:hidden;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px;text-overflow:ellipsis;white-space:nowrap}.transcript-dialog-controls{display:grid;grid-template-columns:minmax(160px,1fr) auto auto;align-items:end;gap:10px}.transcript-search{display:grid;min-width:0;gap:5px;color:var(--nt-fg-3);font-size:11px}.transcript-search input{min-width:0;height:32px;border:1px solid var(--nt-line);border-radius:6px;padding:0 10px;color:var(--nt-fg);background:var(--nt-bg);font:inherit}.transcript-search input:focus{border-color:color-mix(in srgb,var(--nt-accent) 58%,var(--nt-line));outline:none}.transcript-filter-group{display:flex;min-width:0;flex-wrap:wrap;gap:5px}.transcript-filter-group button{height:32px;border:1px solid var(--nt-line);border-radius:5px;padding:0 9px;color:var(--nt-fg-2);background:var(--nt-bg);font-size:11px;cursor:pointer}.transcript-filter-group button[data-active=true]{color:var(--nt-bg);border-color:var(--nt-accent);background:var(--nt-accent)}.transcript-result-count{justify-self:end;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px;white-space:nowrap}.transcript-dialog-scroll{min-height:0;flex:1 1 auto;overflow:auto;border:1px solid var(--nt-line);border-radius:6px;background:var(--nt-bg)}.transcript-block-list{display:grid;gap:8px;padding:8px}.transcript-block{min-width:0;overflow:hidden;border:1px solid var(--nt-line);border-radius:6px;background:#ffffff04}.transcript-block header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;border-bottom:1px solid var(--nt-line);padding:7px 9px;color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:11px}.transcript-block header span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.transcript-block header button{height:24px;border:1px solid var(--nt-line);border-radius:4px;padding:0 7px;color:var(--nt-fg-2);background:var(--nt-bg);font-size:10.5px;cursor:pointer}.transcript-block pre{margin:0;padding:10px;color:var(--nt-fg);font-family:var(--nt-font-mono);font-size:12px;line-height:1.45;overflow-wrap:anywhere;white-space:pre-wrap}.transcript-dialog-status,.transcript-dialog-hint,.transcript-dialog-error{padding:10px 12px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.transcript-dialog-hint{border-bottom:1px solid var(--nt-line);color:var(--nt-fg-4);text-align:center}.transcript-dialog-error{color:var(--nt-danger)}.terminal-pane-actions{display:flex;align-items:center;gap:2px;padding:0 4px}.pane-action-button{width:28px;height:28px;align-self:center;border-radius:5px}.pane-action-button:hover:not(:disabled){border-color:var(--nt-line)}.split-icon{position:relative;display:block;width:14px;height:14px;border:1px solid currentColor;color:currentColor}.split-icon:before{position:absolute;background:currentColor;content:""}.split-icon-right:before{top:0;bottom:0;left:6px;width:1px}.split-icon-down:before{top:6px;right:0;left:0;height:1px}.workspace-body{position:relative;min-width:0;min-height:0;overflow:hidden;background:var(--nt-bg)}.mobile-pane-switcher{display:none}.mobile-focused-split,.mobile-focused-pane{width:100%;height:100%;min-width:0;min-height:0}.mobile-focused-pane[data-active=false]{display:none}.workspace-server-surface,.workspace-tab-surface{position:absolute;inset:0;min-width:0;min-height:0}.workspace-server-surface[data-active=false],.workspace-tab-surface[data-active=false]{display:none}.workspace-placeholder,.empty-workspace,.missing-pane{display:grid;height:100%;min-height:220px;place-content:center;gap:10px;color:var(--nt-fg-3);font-family:var(--nt-font-mono)}.workspace-placeholder{display:flex;align-items:center;justify-content:center}.workspace-placeholder:before{display:inline-block;color:var(--nt-accent);animation:nt-blink 1.05s steps(2,end) infinite;content:"●"}@keyframes nt-blink{50%{opacity:0}}.empty-workspace{color:var(--nt-fg-2);text-align:center}.empty-workspace button{width:max-content;height:30px;justify-self:center;border-radius:5px;padding:0 12px;color:var(--nt-fg-2)}.split-pane{display:grid;width:100%;height:100%;min-width:0;min-height:0}.split-cell{min-width:0;min-height:0;overflow:hidden}.pane-drop-host{position:relative;width:100%;height:100%;min-width:0;min-height:0}.pane-drop-zone{position:absolute;z-index:5;pointer-events:auto;background:transparent;transition:background 80ms ease}.pane-drop-zone--left{top:0;bottom:0;left:0;width:42%}.pane-drop-zone--right{top:0;bottom:0;right:0;width:42%}.pane-drop-zone--top{top:0;left:42%;right:42%;height:42%}.pane-drop-zone--bottom{bottom:0;left:42%;right:42%;height:42%}.pane-drop-zone[data-over=true]{background:var(--nt-accent-soft);box-shadow:inset 0 0 0 2px var(--nt-accent),0 0 18px var(--nt-accent-glow)}.split-divider{position:relative;background:var(--nt-line);touch-action:none;transition:background .15s ease,box-shadow .15s ease}.split-divider[data-direction=vertical]{cursor:col-resize}.split-divider[data-direction=horizontal]{cursor:row-resize}.split-divider:before{position:absolute;inset:0;content:""}.split-divider[data-direction=vertical]:before{right:-4px;left:-4px}.split-divider[data-direction=horizontal]:before{top:-4px;bottom:-4px}.split-divider:hover,.split-divider.is-dragging{z-index:2;background:var(--nt-accent);box-shadow:0 0 10px var(--nt-accent-glow)}.split-divider-handle{position:absolute;top:50%;left:50%;width:28px;height:4px;border-radius:2px;background:transparent;transform:translate(-50%,-50%)}.split-divider[data-direction=horizontal] .split-divider-handle{width:4px;height:28px}.split-divider:hover .split-divider-handle,.split-divider.is-dragging .split-divider-handle{background:var(--nt-accent)}.terminal-pane{position:relative;display:grid;grid-template-rows:26px minmax(0,1fr);grid-auto-rows:auto;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;background:var(--nt-bg);cursor:text}.compose-drawer{display:flex;flex-direction:column;border-top:1px solid var(--nt-line);background:var(--nt-bg);font-family:var(--nt-font-mono);position:relative;z-index:2;min-width:0;max-width:100%}.compose-drawer--closed{flex:0 0 auto}.compose-drawer-handle{display:flex;align-items:center;gap:6px;width:100%;height:22px;border:0;padding:0 10px;font-size:10.5px;letter-spacing:.06em;text-transform:lowercase;color:var(--nt-fg-3);background:var(--nt-bg-2);cursor:pointer;transition:color .12s ease,background .12s ease}.compose-drawer-handle:hover{color:var(--nt-accent);background:var(--nt-bg)}.compose-drawer-handle-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--nt-accent);margin-left:2px}.compose-drawer--open{flex:0 0 auto;padding:4px 6px 6px;gap:4px;background:var(--nt-bg-2)}.compose-drawer-header{display:flex;align-items:center;gap:8px;width:100%;height:20px;border:0;padding:0 2px;font-size:10.5px;color:var(--nt-fg-3);background:transparent;cursor:pointer}.compose-drawer-header:hover{color:var(--nt-accent)}.compose-drawer-title{letter-spacing:.06em;text-transform:lowercase;color:var(--nt-fg-2)}.compose-drawer-hint{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--nt-fg-3);font-size:10px}.compose-drawer-close{width:16px;text-align:center;font-size:14px;color:var(--nt-fg-3)}.compose-drawer-input{width:100%;min-width:0;max-width:100%;min-height:38px;max-height:180px;resize:vertical;padding:4px 8px;border:1px solid var(--nt-line);border-radius:4px;background:var(--nt-bg);color:var(--nt-fg);font-family:var(--nt-font-mono);font-size:12.5px;line-height:1.35;outline:none;transition:border-color .12s ease,box-shadow .12s ease}.compose-drawer-input:focus{border-color:var(--nt-accent);box-shadow:0 0 0 2px var(--nt-accent-soft)}.compose-drawer-actions{display:flex;justify-content:flex-end;gap:4px}.compose-drawer-clear,.compose-drawer-send{height:22px;padding:0 10px;border-radius:4px;font-family:var(--nt-font-mono);font-size:10.5px;letter-spacing:.04em;cursor:pointer;transition:color .12s ease,background .12s ease,border-color .12s ease}.compose-drawer-clear{border:1px solid var(--nt-line);color:var(--nt-fg-3);background:transparent}.compose-drawer-clear:hover:not(:disabled){color:var(--nt-fg);background:var(--nt-bg)}.compose-drawer-send{border:1px solid var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft)}.compose-drawer-send:hover:not(:disabled){color:#062423;background:var(--nt-accent);box-shadow:0 0 12px var(--nt-accent-glow)}.compose-drawer-clear:disabled,.compose-drawer-send:disabled{cursor:not-allowed;opacity:.4}.terminal-pane[data-active=true]{background:linear-gradient(180deg,var(--nt-accent-soft),transparent 22%)}.terminal-pane[data-active=true]:before{position:absolute;top:0;bottom:0;left:0;z-index:1;width:2px;background:var(--nt-accent);box-shadow:0 0 14px var(--nt-accent-glow);content:"";pointer-events:none}.terminal-pane-header{display:flex;align-items:center;gap:6px;min-width:0;border-bottom:1px solid var(--nt-line);padding:0 12px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px;touch-action:none;user-select:none;-webkit-user-select:none}.terminal-pane-dot{flex:0 0 auto;width:5px;height:5px;border-radius:50%;background:var(--nt-fg-3)}.terminal-pane[data-active=true] .terminal-pane-dot{background:var(--nt-accent);box-shadow:0 0 8px var(--nt-accent)}.terminal-pane-cwd{min-width:0;overflow:hidden;color:var(--nt-fg-2);text-overflow:ellipsis;white-space:nowrap}.terminal-pane-spacer{flex:1 1 auto}.terminal-pane-state{flex:0 0 auto;font-weight:500}.terminal-pane-transcript{appearance:none;flex:0 0 auto;padding:1px 5px;border:1px solid color-mix(in srgb,var(--nt-accent) 45%,transparent);border-radius:3px;color:var(--nt-accent);background:color-mix(in srgb,var(--nt-accent) 10%,transparent);font-family:var(--nt-font-mono);font-size:9px;font-weight:700;line-height:1.35;cursor:pointer}.terminal-pane-transcript:hover{border-color:var(--nt-accent);background:color-mix(in srgb,var(--nt-accent) 18%,transparent)}.terminal-pane-transcript:focus-visible{outline:2px solid var(--nt-accent-soft);outline-offset:1px}.terminal-pane-state-running{color:var(--nt-ok)}.terminal-pane-state-exited{color:var(--nt-fg-3)}.terminal-pane-close{width:18px;height:18px;margin-left:4px;border-radius:3px;opacity:0;transition:opacity .12s ease,color .12s ease,background .12s ease}.terminal-pane:hover .terminal-pane-close,.terminal-pane[data-active=true] .terminal-pane-close,.editor-pane:hover .terminal-pane-close{opacity:1}.editor-pane{display:grid;grid-template-rows:28px auto auto minmax(0,1fr);width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;background:var(--nt-bg)}.editor-pane-header{display:flex;align-items:center;gap:8px;min-width:0;border-bottom:1px solid var(--nt-line);padding:0 10px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}.editor-pane-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.editor-pane-header button:not(.terminal-pane-close){min-height:20px;border:1px solid var(--nt-line-2);border-radius:4px;padding:0 8px;color:var(--nt-fg-2);background:transparent;font-size:10.5px}.editor-pane-header button:not(.terminal-pane-close):hover:not(:disabled){border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);color:var(--nt-fg);background:var(--nt-accent-soft)}.editor-pane-alert{border-bottom:1px solid rgba(248,113,113,.25);padding:7px 10px;color:#fca5a5;background:#f8717114;font-size:11px}.editor-pane-textarea{grid-row:4;width:100%;height:100%;min-width:0;min-height:0;border:0;padding:12px;resize:none;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:12px;line-height:1.5;outline:none}.editor-markdown-preview{grid-row:4;width:100%;height:100%;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;border:0;padding:14px 16px;color:var(--nt-fg);background:var(--nt-bg);font-size:13px;line-height:1.5;-webkit-overflow-scrolling:touch}.editor-markdown-preview :first-child{margin-top:0}.editor-markdown-preview :last-child{margin-bottom:0}.xterm-container{width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;overscroll-behavior:contain;padding:3px;touch-action:none}.xterm{width:100%;height:100%}.terminal-history-loader{position:absolute;top:34px;left:50%;z-index:3;display:grid;width:24px;height:24px;place-items:center;border:1px solid var(--nt-line);border-radius:999px;background:#0a0d10db;box-shadow:0 0 12px #00000047;transform:translate(-50%);pointer-events:none}.terminal-history-loader span{width:12px;height:12px;border:2px solid rgba(226,232,238,.28);border-top-color:var(--nt-accent);border-radius:50%;animation:terminal-history-spin .7s linear infinite}.terminal-scroll-progress{position:absolute;top:34px;right:10px;z-index:3;padding:2px 7px;border:1px solid rgba(148,163,184,.32);border-radius:6px;background:#0a0d10db;color:#e2e8eee6;font-size:11px;line-height:16px;font-variant-numeric:tabular-nums;opacity:.34;pointer-events:none;transition:opacity .12s ease,border-color .12s ease,color .12s ease}.terminal-scroll-progress[data-active=true]{border-color:#94a3b86b;color:#e2e8eef5;opacity:1}.terminal-scroll-progress[data-pending=true]{border-color:#94a3b83d;color:#e2e8eeb8;opacity:.42}.terminal-scroll-progress[data-buffer=alternate]{border-color:#f59e0b57;color:#fde68ad1}.terminal-scroll-bottom-button{position:absolute;top:auto;right:10px;bottom:10px;z-index:4;display:grid;width:28px;height:28px;place-items:center;border:1px solid color-mix(in srgb,var(--nt-accent) 28%,transparent);border-radius:999px;color:var(--nt-accent);background:#0a0d10db;box-shadow:0 10px 24px #00000052;font-family:var(--nt-font-mono);font-size:15px;line-height:1;cursor:pointer}.terminal-scroll-bottom-button:hover{border-color:color-mix(in srgb,var(--nt-accent) 55%,transparent);background:#0f171bf0}.terminal-scroll-handle{position:absolute;top:64px;right:0;bottom:60px;z-index:4;display:none;width:34px;border:0;padding:0;background:transparent;cursor:ns-resize;touch-action:none}.terminal-scroll-handle span{position:absolute;top:50%;right:8px;width:5px;height:54px;border-radius:999px;background:#94a3b85c;transform:translateY(-50%)}.terminal-scroll-handle:hover span,.terminal-scroll-handle:active span{background:color-mix(in srgb,var(--nt-accent) 68%,transparent)}@keyframes terminal-history-spin{to{transform:rotate(360deg)}}.mobile-terminal-key-bar,.mobile-terminal-key-toggle{display:none}.mobile-terminal-key{display:grid;min-width:34px;height:30px;place-items:center;border:1px solid var(--nt-line-2);border-radius:5px;padding:0 8px;color:var(--nt-fg-2);background:#0d1216f0;font-family:var(--nt-font-mono);font-size:11px;cursor:pointer}.mobile-terminal-key{-webkit-tap-highlight-color:transparent;touch-action:manipulation;border-color:var(--nt-line-2);color:var(--nt-fg-3);background:transparent;box-shadow:none;transition:none}.mobile-terminal-key:hover,.mobile-terminal-key:focus,.mobile-terminal-key:focus-visible,.mobile-terminal-key:active{outline:none;border-color:var(--nt-line-2);color:var(--nt-fg-3);background:transparent;box-shadow:none}.mobile-terminal-key.mobile-terminal-key[data-active=true]{border-color:var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft);box-shadow:0 0 8px var(--nt-accent-glow)}.completion-toast{position:absolute;right:16px;bottom:12px;z-index:13;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;align-items:start;gap:4px 8px;width:min(238px,calc(100% - 32px));border:1px solid color-mix(in srgb,var(--nt-accent) 28%,transparent);border-radius:8px;padding:7px;color:var(--nt-fg);background:#0a0d10f2;box-shadow:0 18px 48px #00000080,0 0 22px color-mix(in srgb,var(--nt-accent) 8%,transparent);cursor:pointer;animation:completion-toast-in .22s ease-out}.completion-toast:focus-visible{outline:2px solid color-mix(in srgb,var(--nt-accent) 60%,transparent);outline-offset:2px}.completion-toast-character{grid-column:1 / -1;width:100%;height:152px;object-fit:contain;pointer-events:none}.completion-toast-copy{display:flex;align-items:center;gap:6px;min-width:0;min-height:18px}.completion-toast-copy strong,.completion-toast-copy span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.completion-toast-copy strong{font-size:10px;font-weight:600}.completion-toast-copy span{color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:10px}.completion-toast button{display:grid;width:18px;height:18px;place-items:center;align-self:start;border:1px solid transparent;border-radius:4px;padding:0;color:var(--nt-fg-3);background:transparent;cursor:pointer}.completion-toast button:hover{color:var(--nt-fg);background:var(--nt-bg-2)}@keyframes completion-toast-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.completion-toast{animation:none}}.upload-toast{position:absolute;right:16px;bottom:12px;z-index:12;display:grid;width:min(360px,calc(100% - 32px));max-height:min(360px,calc(100% - 64px));overflow:hidden;border:1px solid var(--nt-line-2);border-radius:8px;color:var(--nt-fg);background:#0a0d10f5;box-shadow:0 18px 48px #00000080,0 0 0 1px #ffffff05}.upload-toast-partial,.upload-toast-failed{border-color:#f8717161}.upload-toast-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;border-bottom:1px solid var(--nt-line);padding:10px 10px 9px 12px}.upload-toast-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:12px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.upload-toast-header button{display:grid;width:22px;height:22px;place-items:center;border:1px solid transparent;border-radius:4px;padding:0;color:var(--nt-fg-3);background:transparent;cursor:pointer}.upload-toast-header button:hover{color:var(--nt-fg);background:var(--nt-bg-2)}.upload-toast-body{display:grid;gap:9px;min-width:0;overflow:auto;overscroll-behavior:contain;padding:10px 12px 12px;font-family:var(--nt-font-mono);font-size:11px;-webkit-overflow-scrolling:touch}.upload-queue-body{gap:8px}.upload-queue-item{display:grid;min-width:0;gap:8px;border:1px solid var(--nt-line);border-radius:6px;padding:9px;background:#ffffff04}.upload-queue-item[data-status=failed],.upload-queue-item[data-status=partial]{border-color:#f8717147}.upload-queue-item-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px}.upload-queue-item-header strong{min-width:0;overflow:hidden;color:var(--nt-fg);font-size:11.5px;text-overflow:ellipsis;white-space:nowrap}.upload-queue-actions{display:flex;align-items:center;gap:4px}.upload-queue-actions button{min-width:24px;height:24px;border:1px solid var(--nt-line);border-radius:4px;padding:0 7px;color:var(--nt-fg-2);background:var(--nt-bg);font-size:10.5px;cursor:pointer}.upload-queue-actions button:hover,.upload-queue-actions button:focus-visible{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,var(--nt-line));outline:none}.upload-toast-body p{margin:0}.upload-progress-row{display:flex;min-width:0;justify-content:space-between;gap:12px;color:var(--nt-fg-2)}.upload-progress-track{height:4px;overflow:hidden;border-radius:2px;background:var(--nt-line)}.upload-progress-track span{display:block;height:100%;max-width:100%;background:var(--nt-accent);transition:width .12s ease}.upload-toast-destination,.upload-toast-muted{min-width:0;overflow:hidden;color:var(--nt-fg-3);text-overflow:ellipsis;white-space:nowrap}.upload-result-list{display:grid;gap:6px;min-width:0;margin:0;padding:0;list-style:none}.upload-result-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;min-width:0;color:var(--nt-fg-2)}.upload-result-list li:before{width:5px;height:5px;border-radius:50%;background:var(--nt-ok);content:""}.upload-result-list li[data-status=failed]:before{background:var(--nt-danger)}.upload-result-path{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.upload-result-error{max-width:140px;overflow:hidden;color:#fca5a5;text-overflow:ellipsis;white-space:nowrap}.upload-result-renamed{max-width:72px;overflow:hidden;color:var(--nt-warn);text-overflow:ellipsis;white-space:nowrap}.auth-screen{position:relative;display:grid;width:100%;min-height:var(--nterminal-viewport-height);place-items:center;overflow:hidden;padding:24px 24px calc(24px + var(--nterminal-safe-area-bottom));color:var(--nt-fg);background:var(--nt-bg)}.auth-background{position:absolute;inset:0;overflow:hidden;pointer-events:none}.auth-grid{position:absolute;inset:0;background-image:linear-gradient(var(--nt-line) 1px,transparent 1px),linear-gradient(90deg,var(--nt-line) 1px,transparent 1px);background-size:32px 32px;opacity:.22;-webkit-mask-image:radial-gradient(ellipse at 50% 38%,#000 0,transparent 70%);mask-image:radial-gradient(ellipse at 50% 38%,#000 0,transparent 70%)}.auth-glow{position:absolute;top:30%;left:50%;width:720px;height:720px;background:radial-gradient(circle,var(--nt-accent-soft),transparent 60%);filter:blur(20px);transform:translate(-50%,-50%)}.auth-panel{position:relative;display:grid;width:min(440px,100%);gap:18px;border:1px solid var(--nt-line);border-radius:8px;padding:28px;background:linear-gradient(180deg,rgba(255,255,255,.02),transparent);box-shadow:0 30px 80px #0000008c,0 0 0 1px #ffffff05;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.auth-header{display:grid;gap:18px;border-bottom:1px dashed var(--nt-line);padding-bottom:18px}.auth-brand{display:flex;align-items:center;gap:10px}.eyebrow{margin:0;color:var(--nt-accent);font-family:var(--nt-font-mono);font-size:11px;font-weight:700;letter-spacing:.18em;text-transform:uppercase}.auth-host{margin:2px 0 0;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:10.5px}h1{margin:0;color:var(--nt-fg);font-size:22px;line-height:1.2}.auth-form{display:grid;gap:14px}.auth-form label{display:grid;gap:6px;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.auth-form input:not([type=checkbox]){width:100%;height:38px;border:1px solid var(--nt-line-2);border-radius:6px;padding:0 12px;color:var(--nt-fg);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:14px;letter-spacing:.16em;transition:border-color .12s ease,box-shadow .12s ease,background .12s ease}.auth-form input:not([type=checkbox]):focus{border-color:var(--nt-accent);background:var(--nt-bg-2);box-shadow:0 0 0 3px var(--nt-accent-soft)}.button-row,.workspace-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.auth-form button,.button-row button{display:inline-flex;align-items:center;justify-content:center;height:38px;border-radius:6px;padding:0 18px;font-family:var(--nt-font-mono);font-size:12px;letter-spacing:.04em;cursor:pointer;transition:color .12s ease,background .12s ease,border-color .12s ease,box-shadow .12s ease}.auth-form button[type=submit]{border:1px solid var(--nt-accent);color:var(--nt-accent);background:var(--nt-accent-soft)}.auth-form button[type=submit]:hover:not(:disabled){color:#062423;background:var(--nt-accent);box-shadow:0 0 16px var(--nt-accent-glow)}.secondary-button,.button-row .secondary-button{border:1px solid var(--nt-line-2);color:var(--nt-fg-2);background:transparent}.muted,.form-error{margin:0;color:var(--nt-fg-3);font-family:var(--nt-font-mono);font-size:11px}.form-error{border:1px solid rgba(248,113,113,.25);border-radius:5px;padding:6px 10px;color:var(--nt-danger);background:#f8717114}@media(max-width:760px){input,textarea,select{font-size:16px}.compose-drawer-input{min-height:32px;max-height:70px;resize:none}.compose-drawer--open{padding:3px 6px 4px;gap:3px}.xterm .xterm-helper-textarea{font-size:16px}.terminal-shell,.terminal-shell[data-collapsed=true]{display:block;height:var(--nterminal-viewport-height);min-height:var(--nterminal-viewport-height)}.workspace-backdrop{position:fixed;inset:0;z-index:20;min-height:0;border:0;background:#00000080;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.terminal-shell[data-sidebar-open=true] .workspace-backdrop{display:block}.workspace-sidebar{position:fixed;inset:0 auto 0 0;z-index:30;width:min(280px,86vw);padding-bottom:var(--nterminal-safe-area-bottom);transform:translate(-100%);transition:transform .18s ease;box-shadow:12px 0 32px #00000080}.terminal-shell[data-sidebar-open=true] .workspace-sidebar{transform:translate(0)}.terminal-shell[data-collapsed=true] .workspace-brand{grid-template-columns:minmax(0,1fr) auto;justify-items:stretch;padding:16px 16px 14px}.terminal-shell[data-collapsed=true] .workspace-list{align-items:stretch}.terminal-shell[data-collapsed=true] .workspace-select-button{justify-items:start;padding:7px 16px 7px 14px}.terminal-shell[data-collapsed=true] .workspace-initial,.sidebar-collapse-button{display:none}.sidebar-drawer-close-button{display:grid}.settings-panel{max-width:calc(100vw - 16px);max-height:calc(var(--nterminal-viewport-height) - 18px)}.settings-layout{grid-template-columns:minmax(0,1fr)}.settings-nav{position:sticky;top:0;z-index:1;flex-direction:row;gap:6px;overflow-x:auto;border-right:0;border-bottom:1px solid var(--nt-line);scrollbar-width:none}.settings-nav::-webkit-scrollbar{display:none}.settings-nav button{flex:0 0 auto;border-left:0;border-bottom:2px solid transparent;text-align:center}.settings-nav button:hover,.settings-nav button[data-active=true]{border-left-color:transparent;border-bottom-color:var(--nt-accent)}.settings-content{max-height:calc(var(--nterminal-viewport-height) - 118px);padding:14px}.transcript-dialog{width:calc(100vw - 16px);height:calc(var(--nterminal-viewport-height) - 18px)}.transcript-dialog-controls{grid-template-columns:minmax(0,1fr);align-items:stretch}.transcript-filter-group{flex-wrap:nowrap;overflow-x:auto}.transcript-result-count{justify-self:start}.settings-shortcut-list li{grid-template-columns:minmax(0,1fr)}.settings-shortcut-actions{justify-content:stretch}.settings-shortcut-recorder{min-width:0;flex:1}.workspace-brand-name,.terminal-shell[data-collapsed=true] .workspace-brand-name{display:block}.terminal-shell[data-collapsed=true] .workspace-sidebar-header,.terminal-shell[data-collapsed=true] .workspace-sidebar-footer{display:flex}.terminal-main{height:100%;grid-template-rows:48px minmax(0,1fr)}.terminal-main[data-mobile-pane-switcher=true]{grid-template-rows:48px 34px minmax(0,1fr)}.terminal-tabs{min-height:48px;padding:0 4px}.mobile-pane-switcher{display:flex;min-width:0;min-height:34px;align-items:center;gap:6px;border-bottom:1px solid var(--nt-line);padding:0 8px;background:color-mix(in srgb,var(--nt-bg-2) 70%,var(--nt-bg));color:var(--nt-fg-2);font-family:var(--nt-font-mono);font-size:11px}.mobile-pane-switcher>button{display:grid;width:28px;height:28px;flex:0 0 auto;place-items:center;border:1px solid var(--nt-line);border-radius:5px;color:var(--nt-fg-2);background:var(--nt-bg);font-family:var(--nt-font-mono);font-size:14px;line-height:1;cursor:pointer}.mobile-pane-switcher>button:hover,.mobile-pane-switcher>button:focus-visible{color:var(--nt-accent);border-color:color-mix(in srgb,var(--nt-accent) 55%,var(--nt-line));outline:none}.mobile-pane-switcher>.mobile-pane-current{width:auto;min-width:0;flex:1 1 auto;overflow:hidden;padding:0 8px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.mobile-pane-sheet-backdrop{position:fixed;inset:0;z-index:42;display:flex;align-items:flex-end;justify-content:center;padding:0 10px calc(10px + var(--nterminal-safe-area-bottom));background:#00000047}.mobile-pane-sheet{display:grid;width:min(520px,100%);max-height:min(58vh,420px);min-height:0;overflow:hidden;border:1px solid var(--nt-line-2);border-radius:8px 8px 6px 6px;background:#0a0d10fa;box-shadow:0 -18px 44px #00000080}.mobile-pane-sheet header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;border-bottom:1px solid var(--nt-line);padding:10px 10px 9px 12px}.mobile-pane-sheet header strong{color:var(--nt-fg);font-size:12px}.mobile-pane-sheet header button{display:grid;width:28px;height:28px;place-items:center;border:1px solid var(--nt-line);border-radius:5px;padding:0;color:var(--nt-fg-2);background:var(--nt-bg)}.mobile-pane-sheet-list{display:grid;min-height:0;gap:6px;overflow:auto;padding:8px;-webkit-overflow-scrolling:touch}.mobile-pane-sheet-list button{display:grid;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:52px;border:1px solid var(--nt-line);border-radius:6px;padding:8px;color:var(--nt-fg-2);background:var(--nt-bg);text-align:left}.mobile-pane-sheet-list button[data-active=true]{border-color:color-mix(in srgb,var(--nt-accent) 62%,var(--nt-line));background:color-mix(in srgb,var(--nt-accent) 11%,var(--nt-bg))}.mobile-pane-sheet-index{display:grid;width:24px;height:24px;place-items:center;border-radius:50%;color:var(--nt-bg);background:var(--nt-fg-3);font-size:11px;font-weight:700}.mobile-pane-sheet-list button[data-active=true] .mobile-pane-sheet-index{background:var(--nt-accent)}.mobile-pane-sheet-copy{display:grid;min-width:0;gap:3px}.mobile-pane-sheet-copy strong,.mobile-pane-sheet-copy small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mobile-pane-sheet-copy strong{color:var(--nt-fg);font-size:12px}.mobile-pane-sheet-copy small,.mobile-pane-sheet-type{color:var(--nt-fg-3);font-size:10.5px}.mobile-pane-sheet-type{text-transform:uppercase}.mobile-menu-button{display:grid;width:40px;height:40px}.terminal-tab-select,.terminal-tab-editor{gap:4px;height:48px;min-width:76px;max-width:140px;padding:0 6px 0 12px}.terminal-tab-select small,.terminal-tab-editor small{display:none}.icon-button{width:26px;height:26px;opacity:1}.tab-add-button{width:40px;height:48px}.pane-action-button{width:38px;height:38px}.terminal-pane-close{width:26px;height:26px;opacity:1}.terminal-scroll-bottom-button{top:auto;right:12px;bottom:max(52px,var(--nterminal-safe-area-bottom) + 52px);width:38px;height:38px;font-size:18px}.terminal-scroll-handle{top:76px;right:0;bottom:104px;display:block;width:42px}.terminal-scroll-handle span{right:12px;width:7px;height:76px}.terminal-pane[data-active=true] .xterm-container{padding-bottom:var(--nterminal-safe-area-bottom)}.mobile-terminal-key-bar{position:absolute;right:8px;bottom:max(8px,var(--nterminal-safe-area-bottom));left:8px;z-index:10;display:flex;max-width:calc(100% - 16px);align-items:center;justify-content:center;gap:4px;overflow-x:auto;overscroll-behavior:contain;border:1px solid rgba(42,51,64,.85);border-radius:8px;padding:4px;background:#08090bdb;box-shadow:0 10px 26px #00000059;scrollbar-width:none;-webkit-overflow-scrolling:touch}.mobile-terminal-key-toggle{position:absolute;right:10px;bottom:max(10px,var(--nterminal-safe-area-bottom));z-index:10;display:grid;width:32px;height:32px;place-items:center;border:1px solid rgba(42,51,64,.85);border-radius:50%;color:var(--nt-fg-3);background:#08090bb3;font-size:16px;cursor:pointer;box-shadow:0 4px 14px #00000059}.mobile-terminal-key-toggle:hover{color:var(--nt-accent);border-color:var(--nt-accent)}:root[data-nterminal-keyboard-visible=true] .mobile-terminal-key-toggle{position:fixed;bottom:calc(var(--nterminal-keyboard-inset-bottom) + 8px)}.mobile-terminal-key-bar::-webkit-scrollbar{display:none}:root[data-nterminal-keyboard-visible=true] .terminal-pane[data-active=true] .xterm-container{padding-bottom:3px}:root[data-nterminal-keyboard-visible=true] .mobile-terminal-key-bar{position:fixed;bottom:calc(var(--nterminal-keyboard-inset-bottom) + 4px)}}
@@ -1,241 +0,0 @@
1
- import { spawn, spawnSync } from 'node:child_process';
2
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
3
- import path from 'node:path';
4
- const updateLockStaleMs = 10 * 60 * 1000;
5
- const packageUpdateTimeoutMs = 5 * 60 * 1000;
6
- function appDir() {
7
- return process.env.NTERMINAL_APP_DIR ? path.resolve(process.env.NTERMINAL_APP_DIR) : process.cwd();
8
- }
9
- function git(args, cwd) {
10
- const result = spawnSync('git', args, { cwd, encoding: 'utf8', timeout: 60_000 });
11
- return {
12
- ok: result.status === 0,
13
- stdout: (result.stdout ?? '').trim(),
14
- stderr: (result.stderr ?? '').trim()
15
- };
16
- }
17
- function npm(args, cwd, timeout = 60_000) {
18
- const result = spawnSync(process.env.NTERMINAL_NPM_BIN || 'npm', args, { cwd, encoding: 'utf8', timeout });
19
- return {
20
- ok: result.status === 0,
21
- stdout: (result.stdout ?? '').trim(),
22
- stderr: (result.stderr ?? '').trim()
23
- };
24
- }
25
- function isGitRepo(cwd) {
26
- // Authoritative check — an empty/partial `.git` dir alone shouldn't count as a repo.
27
- const result = git(['rev-parse', '--is-inside-work-tree'], cwd);
28
- return result.ok && result.stdout === 'true';
29
- }
30
- function readPackageName(cwd) {
31
- try {
32
- const pkg = JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf8'));
33
- return typeof pkg.name === 'string' && pkg.name.trim() ? pkg.name.trim() : 'nterminal';
34
- }
35
- catch {
36
- return 'nterminal';
37
- }
38
- }
39
- function readPackageVersion(cwd) {
40
- try {
41
- const pkg = JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf8'));
42
- return typeof pkg.version === 'string' ? pkg.version : 'unknown';
43
- }
44
- catch {
45
- return 'unknown';
46
- }
47
- }
48
- function readCommit(cwd) {
49
- if (!isGitRepo(cwd)) {
50
- return null;
51
- }
52
- const commit = git(['rev-parse', 'HEAD'], cwd);
53
- return commit.ok ? commit.stdout : null;
54
- }
55
- // Frozen at process start. It only changes once a deploy has actually rebuilt and
56
- // restarted the server — so the UI can tell a real restart apart from a bare `git pull`.
57
- const startupVersion = readPackageVersion(appDir());
58
- const startupCommit = readCommit(appDir());
59
- // Cross-process guard (lockfile) so repeated clicks, multiple tabs, or a still-running deploy
60
- // don't spawn overlapping deploys. Auto-expires so a crashed/hung deploy doesn't wedge updates.
61
- function resolveRuntimePath(cwd, value) {
62
- return path.isAbsolute(value) ? value : path.resolve(cwd, value);
63
- }
64
- function runtimeStateDir(cwd) {
65
- const configured = process.env.NTERMINAL_STATE_PATH?.trim();
66
- return configured ? path.dirname(resolveRuntimePath(cwd, configured)) : path.join(cwd, '.nterminal');
67
- }
68
- function lockPath(cwd) {
69
- return path.join(runtimeStateDir(cwd), 'update.lock');
70
- }
71
- function updateLocked(cwd) {
72
- const file = lockPath(cwd);
73
- if (!existsSync(file)) {
74
- return false;
75
- }
76
- try {
77
- const stamped = Number(readFileSync(file, 'utf8').trim());
78
- return Number.isFinite(stamped) && Date.now() - stamped < updateLockStaleMs;
79
- }
80
- catch {
81
- return false;
82
- }
83
- }
84
- function acquireUpdateLock(cwd) {
85
- mkdirSync(runtimeStateDir(cwd), { recursive: true });
86
- writeFileSync(lockPath(cwd), String(Date.now()));
87
- }
88
- function releaseUpdateLock(cwd) {
89
- rmSync(lockPath(cwd), { force: true });
90
- }
91
- export function getVersionInfo(cwd = appDir()) {
92
- const version = readPackageVersion(cwd);
93
- if (!isGitRepo(cwd)) {
94
- return {
95
- version,
96
- runningVersion: startupVersion,
97
- commit: null,
98
- runningCommit: startupCommit,
99
- branch: null,
100
- dirty: false,
101
- isGit: false,
102
- installMode: 'package'
103
- };
104
- }
105
- const commit = git(['rev-parse', 'HEAD'], cwd);
106
- const branch = git(['rev-parse', '--abbrev-ref', 'HEAD'], cwd);
107
- const status = git(['status', '--porcelain'], cwd);
108
- return {
109
- version,
110
- runningVersion: startupVersion,
111
- commit: commit.ok ? commit.stdout : null,
112
- runningCommit: startupCommit,
113
- branch: branch.ok ? branch.stdout : null,
114
- dirty: status.ok ? status.stdout.length > 0 : false,
115
- isGit: true,
116
- installMode: 'git'
117
- };
118
- }
119
- export function checkBehind(cwd = appDir()) {
120
- if (!isGitRepo(cwd)) {
121
- return checkPackageUpdate(cwd);
122
- }
123
- return checkGitBehind(cwd);
124
- }
125
- function checkGitBehind(cwd) {
126
- const commit = git(['rev-parse', 'HEAD'], cwd);
127
- const upstream = git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], cwd);
128
- if (!upstream.ok) {
129
- return { behind: null, commit: commit.ok ? commit.stdout : null, error: 'no_upstream' };
130
- }
131
- const fetched = git(['fetch'], cwd);
132
- if (!fetched.ok) {
133
- return { behind: null, commit: commit.ok ? commit.stdout : null, error: fetched.stderr || 'fetch_failed' };
134
- }
135
- const count = git(['rev-list', '--count', 'HEAD..@{u}'], cwd);
136
- if (!count.ok) {
137
- return { behind: null, commit: commit.ok ? commit.stdout : null, error: count.stderr || 'rev_list_failed' };
138
- }
139
- return { behind: Number(count.stdout) || 0, commit: commit.ok ? commit.stdout : null };
140
- }
141
- function checkPackageUpdate(cwd) {
142
- const currentVersion = readPackageVersion(cwd);
143
- const packageName = readPackageName(cwd);
144
- const latest = npm(['view', `${packageName}@latest`, 'version'], cwd);
145
- if (!latest.ok) {
146
- return {
147
- behind: null,
148
- commit: null,
149
- currentVersion,
150
- latestVersion: null,
151
- updateAvailable: null,
152
- error: latest.stderr || latest.stdout || 'npm_view_failed'
153
- };
154
- }
155
- const latestVersion = latest.stdout.split(/\r?\n/).at(-1)?.trim() || null;
156
- return {
157
- behind: null,
158
- commit: null,
159
- currentVersion,
160
- latestVersion,
161
- updateAvailable: latestVersion ? latestVersion !== currentVersion : null
162
- };
163
- }
164
- export function runUpdate(cwd = appDir()) {
165
- if (!isGitRepo(cwd)) {
166
- return runPackageUpdate(cwd);
167
- }
168
- return runGitUpdate(cwd);
169
- }
170
- function runGitUpdate(cwd) {
171
- if (updateLocked(cwd)) {
172
- return { ok: false, changed: false, message: 'An update is already in progress on this server.', restarting: false };
173
- }
174
- // Refuse on any local modifications — ff-only alone only blocks *conflicting* changes,
175
- // which would otherwise leave a dirty tree mixed with newly pulled code.
176
- const status = git(['status', '--porcelain'], cwd);
177
- if (status.ok && status.stdout.length > 0) {
178
- return { ok: false, changed: false, message: 'Working tree has local changes — commit or discard them before updating.', restarting: false };
179
- }
180
- const pull = git(['pull', '--ff-only'], cwd);
181
- if (!pull.ok) {
182
- return {
183
- ok: false,
184
- changed: false,
185
- message: pull.stderr || pull.stdout || 'git pull --ff-only failed',
186
- restarting: false
187
- };
188
- }
189
- const changed = !/Already up to date/i.test(pull.stdout);
190
- if (!changed) {
191
- return { ok: true, changed: false, message: 'Already up to date.', restarting: false };
192
- }
193
- // Build + restart in a detached process so it survives this server restarting itself.
194
- acquireUpdateLock(cwd);
195
- const deploy = spawn('bash', [path.join(cwd, 'scripts/nterminalctl'), 'deploy'], {
196
- cwd,
197
- detached: true,
198
- env: { ...process.env, NTERMINAL_UPDATE_LOCK_PATH: lockPath(cwd) },
199
- stdio: 'ignore'
200
- });
201
- deploy.unref();
202
- return { ok: true, changed: true, message: pull.stdout || 'Updated; rebuilding and restarting.', restarting: true };
203
- }
204
- function runPackageUpdate(cwd) {
205
- if (updateLocked(cwd)) {
206
- return { ok: false, changed: false, message: 'An update is already in progress on this server.', restarting: false };
207
- }
208
- const check = checkPackageUpdate(cwd);
209
- if (check.error) {
210
- return { ok: false, changed: false, message: check.error, restarting: false };
211
- }
212
- if (!check.updateAvailable) {
213
- return { ok: true, changed: false, message: 'Already up to date.', restarting: false };
214
- }
215
- acquireUpdateLock(cwd);
216
- const packageName = readPackageName(cwd);
217
- const install = npm(['install', '-g', `${packageName}@latest`], cwd, packageUpdateTimeoutMs);
218
- if (!install.ok) {
219
- releaseUpdateLock(cwd);
220
- return {
221
- ok: false,
222
- changed: false,
223
- message: install.stderr || install.stdout || 'npm install -g failed',
224
- restarting: false
225
- };
226
- }
227
- const restart = spawn('sh', ['-c', 'sleep 0.2; exec bash "$1" restart', 'nterminal-restart', path.join(cwd, 'scripts/nterminalctl')], {
228
- cwd,
229
- detached: true,
230
- env: { ...process.env, NTERMINAL_UPDATE_LOCK_PATH: lockPath(cwd) },
231
- stdio: 'ignore'
232
- });
233
- restart.unref();
234
- return {
235
- ok: true,
236
- changed: true,
237
- message: `Updated ${packageName} ${check.currentVersion ?? ''} -> ${check.latestVersion ?? 'latest'}; restarting.`,
238
- restarting: true
239
- };
240
- }
241
- //# sourceMappingURL=gitUpdate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitUpdate.js","sourceRoot":"","sources":["../../../src/server/update/gitUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AA6B7C,SAAS,MAAM;IACb,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACrG,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAClF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,OAAO,GAAG,MAAM;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3G,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,qFAAqF;IACrF,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsB,CAAC;QAClG,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC;QACrG,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,kFAAkF;AAClF,yFAAyF;AACzF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AACpD,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAE3C,8FAA8F;AAC9F,gGAAgG;AAChG,SAAS,kBAAkB,CAAC,GAAW,EAAE,KAAa;IACpD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAC5D,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,iBAAiB,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG,GAAG,MAAM,EAAE;IAC3C,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,OAAO;YACP,cAAc,EAAE,cAAc;YAC9B,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,aAAa;YAC5B,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO;QACL,OAAO;QACP,cAAc,EAAE,cAAc;QAC9B,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACxC,aAAa,EAAE,aAAa;QAC5B,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACxC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;QACnD,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAG,GAAG,MAAM,EAAE;IACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACzF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;IAC7G,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,WAAW,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,cAAc;YACd,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,IAAI;YACrB,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,iBAAiB;SAC3D,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC1E,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,cAAc;QACd,aAAa;QACb,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAG,GAAG,MAAM,EAAE;IACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kDAAkD,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvH,CAAC;IACD,uFAAuF;IACvF,yEAAyE;IACzE,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0EAA0E,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/I,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,2BAA2B;YAClE,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACzF,CAAC;IACD,sFAAsF;IACtF,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,EAAE,QAAQ,CAAC,EAAE;QAC/E,GAAG;QACH,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,0BAA0B,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QAClE,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,qCAAqC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACtH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kDAAkD,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvH,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACzF,CAAC;IAED,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,WAAW,SAAS,CAAC,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAC7F,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,uBAAuB;YACpE,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,mCAAmC,EAAE,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,EAAE;QACpI,GAAG;QACH,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,0BAA0B,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QAClE,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,WAAW,WAAW,IAAI,KAAK,CAAC,cAAc,IAAI,EAAE,OAAO,KAAK,CAAC,aAAa,IAAI,QAAQ,eAAe;QAClH,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}