nterminal 1.2.12 → 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.
- package/README.md +9 -36
- package/bin/nterminal.js +10 -23
- package/dist/client/assets/{MarkdownPreview-DfZZD0C0.js → MarkdownPreview-DBMjXHXe.js} +1 -1
- package/dist/client/assets/index-BprWaATf.css +1 -0
- package/dist/client/assets/index-DJRitqb8.js +44 -0
- package/dist/client/index.html +2 -2
- package/dist/scripts/onboarding.js +31 -15
- package/dist/scripts/onboarding.js.map +1 -1
- package/dist/scripts/proxySetup.js +4 -1
- package/dist/scripts/proxySetup.js.map +1 -1
- package/dist/server/agent/agentRoutes.js +4 -2
- package/dist/server/agent/agentRoutes.js.map +1 -1
- package/dist/server/auth/cookies.js +0 -8
- package/dist/server/auth/cookies.js.map +1 -1
- package/dist/server/config.js +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/routes/agentManagementRoutes.js +87 -13
- package/dist/server/routes/agentManagementRoutes.js.map +1 -1
- package/dist/server/routes/updateRoutes.js +2 -2
- package/dist/server/routes/updateRoutes.js.map +1 -1
- package/dist/server/update/{gitUpdate.d.ts → packageUpdate.d.ts} +1 -9
- package/dist/server/update/packageUpdate.js +140 -0
- package/dist/server/update/packageUpdate.js.map +1 -0
- package/dist/server/update/runtimeUninstall.d.ts +2 -0
- package/dist/server/update/runtimeUninstall.js +45 -0
- package/dist/server/update/runtimeUninstall.js.map +1 -0
- package/dist/shared/protocol.d.ts +6 -8
- package/dist/shared/protocol.js.map +1 -1
- package/docs/configuration.md +7 -24
- package/docs/features.md +1 -1
- package/docs/onboarding.md +5 -46
- package/docs/operations.md +26 -45
- package/package.json +1 -1
- package/scripts/nterminalctl +93 -57
- package/dist/client/assets/index-CMVGLebq.js +0 -43
- package/dist/client/assets/index-DiQ82H7w.css +0 -1
- package/dist/server/update/gitUpdate.js +0 -241
- 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"}
|