Creator / Owner: jiayizhen
Companies: MrToken & Nebulaedata
An AI‑agent‑powered SSH client / 由 AI 智能体驱动的运维终端
A modern SSH client with a built‑in AI ops agent that can run, diagnose, and operate your servers — with your confirmation.
Powered by MrToken & Nebulaedata · Created by jiayizhen
NebuShell is a cross‑platform desktop SSH client with a first‑class AI ops agent baked in. Connect to your servers, open multiple terminals, browse and edit remote files over SFTP, and let the built‑in agent run commands, read their output, and carry out operations for you — always behind an explicit plan‑and‑confirm workflow, so nothing runs on your machines without your say‑so.
Everything is stored locally and secured by a master‑password vault. No cloud account required.
- 🖥️ Multi‑tab terminals & flexible split view — xterm.js terminals with a fit addon, web links, and per‑theme styling. Split any pane right or down from the tab‑strip buttons, keep splitting the split‑out panes recursively into any grid, drag tabs between panes (drop on an edge to make a new split, on the center to merge), drag a tab out of the window to tear it off into its own window (the live session moves with it), and drag the dividers to resize.
- 🤖 Built‑in AI ops agent — an OpenAI‑compatible agent that can
run_command,transfer_file,read_command_output,ask_user, andpresent_plan. It proposes a plan, asks for confirmation, then executes across one or many terminals — and on your local machine (PowerShell on Windows,/bin/shon macOS/Linux), with the same approval flow. It can also move files between your machine, your hosts, and your containers — the confirm card tells you the file count and total size before you approve. Send it images too — paste a screenshot, pick a file, or drag one into the composer. - 🔐 Encrypted vault — hosts, passwords, and SSH keys are protected behind a master password; the keychain never leaves your machine. Trust this device to skip the password on future launches.
- 📁 SFTP file browser — dual‑pane remote/local file management with drag‑and‑drop transfers and a live transfer queue. Create files and folders from the toolbar or by right‑clicking blank space in the listing, and right‑click any entry to type its full path into the terminal next to it.
- 🐳 Docker container management — a per‑host container panel (live
docker ps, start/stop/restart, logs, sudo auto‑detect), one‑click container terminals viadocker execPTY, and a container file browser built ondocker cptar streaming — browse, edit‑and‑save, and drag files between your PC and any running container. - 📝 Built‑in editor — a Monaco (VS Code) editor for quickly editing remote and local files, with syntax highlighting. Ctrl+S saves a remote file straight back to the server (and snapshots a history version).
- 🖼️ Image preview — open remote images directly in a tab.
- 🖥️ Remote desktop control — a Sunlogin‑style remote desktop right in the left sidebar. On the machine you want to control, run NebuShell and click 启动被控端 (Start agent) — it shows that machine's LAN address and a random access code; on the controller, enter the IP + code for a live screen with full mouse & keyboard control. Video streams peer‑to‑peer over WebRTC on your LAN (no relay server, no cloud), input is injected natively on the remote, and it ships with multi‑monitor switching, two‑way text clipboard sync, file push straight into the remote machine's Downloads (with a progress bar), and a remote command line (a real PowerShell / cmd terminal running on the controlled machine). First step: LAN direct‑connect, Windows controlled‑side.
- 🗂️ Host management — organize connections into groups, search by name or address, right‑click a host to connect / duplicate / edit, edit host details inline with a save button, and rename & reorder groups from a group manager (the order flows through to the list). Duplicate sessions, reconnect, and jump between them from the tab bar.
- ⌨️ Command history & command palette — every command you type is saved locally per server (tagged User / Agent) and shared across that host's tabs; a history panel splits Local vs the server's own
~/.bash_history. Triple‑tap Ctrl to open a tabbed palette that searches history and runs quick actions — picking a command drops it into the prompt without executing. - 📜 History docs — keep track of past sessions and documents.
- 📊 System monitor — per‑core CPU with a live sparkline, a memory donut, network up/down rates, per‑mount disk usage with read/write I/O, and a process manager you can search and kill from.
- 🔄 Update check — Settings checks GitHub Releases for a newer version and hands you the installer for your platform; it can also check quietly at startup and flag the result on the sidebar.
- 🎨 Light / dark themes — a clean, modern UI that adapts to your OS.
Recent updates (July–August 2026)
- 🖱️ Right-click a file to type its path into the terminal (2026‑08‑20) — the sidebar SFTP panel (and the container file panel) gains an 输入路径到终端 (Type path into terminal) item in the right-click menu of any file or folder. It writes the item's full path into the terminal beside it, at the current input line, without pressing Enter, so you can put
tail -forcdin front and run it yourself. Paths containing spaces or shell metacharacters are quoted automatically, and a trailing space is appended the way dropping a file onto a terminal does, so a second path can follow straight after. The item appears only in a panel docked beside a terminal — the full-page explorer has no terminal to type into, so it isn't offered there. - 🔄 Check GitHub for a new release (2026‑08‑20) — Settings gains a 软件更新 (Software update) card. It shows the running version, and 检查更新 (Check for updates) asks the GitHub Releases API for the latest published release: if it is newer you get the version, publish date and release notes, plus one-click download of the installer matching your platform and architecture (falling back to the release page when that release has no matching asset). It also checks quietly a few seconds after startup — a red dot appears on the sidebar's 设置 entry and clears once you open it — and that startup check can be switched off from the same card. Download links are restricted to GitHub hosts, and a failed startup check stays silent rather than nagging.
- 🗂️ Drag hosts to reorder them (2026‑08‑20) — the hosts page now lets you drag a card to move it. Hovering over another card shows an insertion line on its left or right half, and dropping commits the whole new order to the vault, so it survives a restart. Dragging is limited to within a group (group membership is still changed from the host editor), and it's disabled while the search box has text, where the visible list is only a subset and a drop position would mean nothing.
- 🔎 Search containers by name (2026‑08‑20) — the container panel gains a search box under its title, filtering the list by container name as you type (case-insensitive substring). It only appears once a host actually has containers, and it's a pure client-side filter — the 4-second
docker pspolling keeps running underneath and the filter stays applied across refreshes. - 📄 Container logs in a read-only editor (2026‑08‑20) — container cards keep the existing log button (which types
logs -finto the current terminal to follow live) and add a second one that opens the logs in an editor tab instead:docker logs --tail 1000, with a 刷新 (Refresh) button to re-run it, the content read-only (Ctrl+S is disabled too, and the save button is hidden), and the view auto-scrolled to the end on load. Handy for reading and copying a log without giving up your terminal. - 📁 File panels remember their directory per session (2026‑08‑20) — closing the sidebar SFTP panel disconnects its session, so reopening it used to dump you back at
/. Each session now remembers the last directory it successfully listed and returns there (falling back to/if the directory is gone or no longer readable). 展开为整页 SFTP (Expand) carries the current directory over too, so the full-page explorer opens where you were rather than at the root. - 🧩 Add an already-open file panel to the explorer (2026‑08‑20) — the explorer's 添加面板 (Add panel) menu now lists the file panels you already have open — sidebar SFTP panels and container-file panels alike — each showing its host (or
container @ host) and its current directory. Picking one adds a panel pointed at the same target and the same directory. Panels belonging to the page you're on are filtered out. Note it opens a second connection rather than moving the live one: an SFTP /docker execsession is owned by the panel holding it and can't be shared. - 🪟 The Hosts tab can be closed in a split view (2026‑08‑20) — Hosts is the home tab and normally has no close button, but once the view is split it occupies a whole pane with no way to reclaim it. Each pane's tab strip now offers a close button for it as well; it's still refused when it is the last tab (which would leave an empty window), and the sidebar 主机 entry or + → 打开新主机 brings it right back.
- 🧱 Left · terminal · right three-column layout (2026‑08‑11) — the terminal's side-panel rail gains a dock-swap button at the top. Open a panel (智能体 / SFTP / 监控 …), click the button to move it to the left side, then open another from the rail — it lands on the right, giving you a left · terminal · right three-column view. With panels on both sides the button swaps them instead of dropping one. Each dock remembers its own width (drag whichever inner edge faces the terminal; both clamp to 280–900px), and a panel docked on the left still shows as active in the rail — click it again to close it, from whichever side it's on. The same panel can never be docked on both sides at once, since SFTP and container-files share one derived session and two copies would fight over the connection.
- 🚀 The agent panel no longer bogs down in long conversations (2026‑08‑11) — with a long chat open, typing a single character re-rendered the entire message list, and every streamed token did the same. Two causes compounding:
react-markdowndoes no memoization at all, so each render re-parsed every historical message from scratch (measured: 1.9ms at 1 message, 84ms at 100), and the composer's draft state lived in the same component as the list — one keystroke, one full re-parse (Chinese IME multiplies that by every composition event). Both are fixed: the input box moved into its own component, and message rows, tool cards and rendered Markdown are memoized, so finished messages are never re-parsed again. Fixed alongside: the context-token estimate no longer rescans the whole conversation on every token; tool results are looked up through aMapinstead of a linear scan per card (previously quadratic); off-screen messages skip layout and paint viacontent-visibility; and the scroll-follow no longer forces a synchronous layout on every token — it also stops pinning to the bottom once you scroll up, so you can read back while the model is still writing. - 🗂️ New tabs open next to the current one (2026‑08‑11) — opening a tab (expanding SFTP into the full explorer, opening a file in the editor, launching a terminal from the hosts page) used to append it at the far end of the tab strip, so closing it dropped you somewhere unrelated. New tabs now land immediately to the right of the tab you opened them from — close it and you are back where you started. Opening several in a row keeps their natural order, and dragging a tab onto another pane still appends as before.
- 🖱️ Code-block copy buttons no longer all light up at once (2026‑08‑11) — hovering anywhere in an agent reply revealed the 复制 (Copy) button on every code block in that message, because the block's hover group used Tailwind's unnamed
group— andgroup-hover:matches through any ancestor carrying that class, including the message row itself. Code blocks now use a named group, so only the block actually under the cursor shows its button. - 🖥️ Remote desktop control (2026‑08‑03) — a new 远程桌面 (Remote Desktop) tab in the left sidebar brings Sunlogin‑style screen sharing right into NebuShell. On the machine you want to control, open the tab and click 启动被控端 — it starts a controlled‑host service and shows the machine's LAN addresses and a random 6‑digit access code. On the controller, type that IP + code and you get a live screen with full mouse & keyboard control. The video streams peer‑to‑peer over WebRTC on your LAN (no relay server, no cloud), and input is injected natively on the remote. It also does multi‑monitor switching (pick the remote display from the session's right‑side menu), two‑way text clipboard sync, and file push — send a file from the controller straight into the remote machine's Downloads with a live progress bar. It also includes a remote command line — open a real PowerShell / cmd terminal (ConPTY via node‑pty) that runs on the controlled machine, straight from the session's side menu. The controlled side reuses NebuShell itself (no separate installer). First step: LAN direct‑connect, Windows controlled‑side.
- 🔌 The agent can reconnect a dropped terminal (2026‑08‑03) — when an SSH terminal drops (a command comes back with a connection error, or a result is flagged 终端卡死,建议重连), the agent can now call a new
reconnect_terminaltool to re-establish that terminal's connection itself and carry on — no more asking you to click reconnect first. It reuses the tab's own connect flow (you'll see 正在连接... in the terminal), reports success or failure back to the model, and runs in every mode including plan mode (reconnecting is a prerequisite for investigating, not a write operation). The tool only lists SSH targets — the local machine isn't a connection. - 🧩 Right-side panels are now per-tab (2026‑08‑03) — with multiple tabs open, switching the right-side panel (智能体 / 快捷操作 / 历史命令 / 监控 / 容器 / 主题 / SFTP) in one terminal used to switch it in every tab, because the selection was a single shared value. Each terminal now remembers its own open panel: open SFTP in one tab and the others are untouched, and the hosts page 查看容器 shortcut pre-opens the container panel only for the new tab. (Panel width stays shared as a global size preference.)
- 🚑 High-frequency output no longer freezes the UI (2026‑08‑03) — running a command that redraws hundreds of times a second (e.g.
rsync --info=progress2) could freeze the interface, because every tiny output chunk took its own trip through IPC plus a scrollback-buffer concatenation. Output is now batched per frame (~16ms): a burst of chunks collapses into a single broadcast and terminal write, cutting hundreds of messages/sec down to ~60 and keeping the UI smooth. The agent's own command-output capture was likewise changed from repeated full-string concat + sentinel scan to array accumulation with a bounded tail scan, removing an O(n²) stall on long high-output commands. - ⌨️ New terminals grab focus (2026‑07‑24) — opening a new terminal (or switching to an existing one) now focuses it automatically, so you can start typing right away without clicking first. Focus only follows the active tab, so a background terminal finishing its connection never steals focus from what you're doing.
- 📜 Scrollable dropdowns (2026‑07‑24) — long select menus (such as the server picker) no longer overflow the window — they now cap at the available height and scroll instead of being cut off.
- ⚡ Custom quick commands (2026‑07‑23) — the terminal's 快捷操作 (Quick actions) panel now lets you save your own batches of commands: give a title, description, and a block of commands, then run the whole batch into the current terminal with one click — a 测试 (Test) button tries it live while you edit. Pick a server in the form and the command becomes server‑bound — clicking it opens a new tab, connects to that host, and runs the batch on connect. A new 快捷操作 entry in the left sidebar lists every server‑bound command as a one‑click launch card, and everything shows up in the triple‑Ctrl command palette too. Commands are persisted locally.
- 🌲 Directory tree in the file browser (2026‑07‑23) — every file panel (SFTP, container files, and local) gains a lazy‑loaded directory tree down the left side. Click a folder to jump the listing there; the tree auto‑expands and highlights the current path, and right‑click a node to create / rename / delete a folder in place. A toolbar toggle shows/hides it — collapsed by default in the narrow embedded panel, expanded in the full‑page explorer. The local tree roots at the current drive.
- 📦 The agent can transfer files (2026‑07‑21) — the agent gains a
transfer_filetool that moves files and directories between your machine, your SSH hosts, and your containers — no morescp/rsyncguesswork. It reuses the app's own transfer pipeline (SFTP, ordocker cptar streaming for containers), so there is no password prompt to answer and no terminal timeout to hit — which is exactly why asking the model to improvise anscpnever worked. Supported routes: local ↔ SSH host, SSH host ↔ SSH host (streamed A→B inside the app), and local ↔ container; unsupported pairs (container ↔ SSH, container ↔ container) don't fail — they return clear guidance to relay via your machine in two steps. Before you approve, the confirm card runs a dry‑run scan and tells you exactly what you're agreeing to (N files · X MB), then shows a live progress bar, and the transfer lands in the same records panel as a drag‑and‑drop. Permissions follow the existing modes: in 替我审批 mode downloads auto‑run while uploads always ask, and plan mode blocks both. Directories go recursively;dest_pathis a directory and the source name is preserved. - 🛡️ Agent tool‑dispatch hardening (2026‑07‑21) — two silent‑failure paths closed. Unknown tool names used to fall through to the shell branch and get run as an empty command on a real terminal; they are now rejected explicitly. And transfer endpoints now resolve strictly — a target name that doesn't match is an error that lists the valid names, instead of quietly falling back to the first target, which would have written your files to the wrong machine.
- 🐳 Manage Docker containers on your hosts (2026‑07‑17) — every connected terminal gains a 容器 (Containers) side panel that live‑polls
docker ps -a: state badges, image & ports, start / stop / restart, and logs in one click (opensdocker logs --tail 500in an editor tab). Docker access is auto‑detected — plaindockerfirst, then passwordlesssudo -n docker, with a friendly hint (and re‑detect button) when neither works. Open a container terminal straight from the list: a dedicated exec‑PTY session runningdocker exec -it(bash with sh fallback) where resize, reconnect on exit, duplicate/split, and tear‑off all just work. Browse container files in the same dual‑pane explorer as SFTP — powered bydocker cptar streaming (binary‑safe, no tools required inside the container) plus GNU/busybox‑awarelsparsing: edit & save files back into the container (with version history), create/rename/delete, drag & drop between local and container with live transfer progress. Inside a container terminal, the right‑side file panel now browses the container's filesystem, not the host's. Also entry points from the hosts page: right‑click a host → 查看容器. - ⚡ Opening SFTP no longer freezes the app (2026‑07‑17) — the Windows drive probe used to check A:–Z: with synchronous calls on the main process, so a stale network drive could hang the whole app for 20+ seconds (measured 22.3s → 1.0s worst case). It now probes all drives in parallel, asynchronously, with a 1s per‑drive timeout and a short cache. Directory listing also stats entries in parallel instead of one‑by‑one (5,100‑entry folder: 435ms → 31ms).
- 💻 The agent can now operate your local machine (2026‑07‑16) — the agent panel gains an always‑available 本机 (local machine) target alongside your SSH terminals — ask it to browse local folders, inspect processes, or run any local command, and mix local + remote steps in one task. On Windows commands run through PowerShell with end‑to‑end UTF‑8 handling (Chinese file names and native tools like
ipconfig/systeminfodecode cleanly, no mojibake, no CLIXML noise); on macOS/Linux they run through/bin/sh. The system prompt teaches the model the right command set per OS (e.g.Select-Stringinstead ofgrepon Windows), and a PowerShell‑aware risk classifier keeps the existing permission modes working locally — reads auto‑run, writes still ask first, plan mode still blocks them. Every run is a fresh process with the same 12s‑idle / 180s hard timeout as SSH commands, the whole process tree is killed on timeout, and long output flows into the same#refpaged‑retrieval pipeline. - 🗂️ Host management, leveled up (2026‑07‑15) — the hosts page gains a search box that filters by name or address as you type; right‑click any host card for a quick menu (连接 / 复制 / 编辑), where 复制 clones a host with all of its connection settings; the host detail panel is now editable in place — hit 直接编辑, change the address / name / group / user / port / auth, and 保存 without opening a dialog; and a new 分组管理 dropdown beside 新建分组 lets you rename groups and reorder them, with the order driving how the group sections are arranged in the list.
- 🪟 Tear tabs off into their own windows (2026‑07‑15) — drag any content tab (a terminal, SFTP, editor or image tab — including one living inside a split pane) out of the window to pop it into a new window at the cursor; drop it onto another window to merge it there instead (both directions). The session moves without dropping — the SSH connection and any running command keep going untouched, and the terminal keeps its full scrollback, replayed into the new window. Close the original window and the torn‑off session is unaffected.
- 🖼️ Send images to the agent — the agent composer now takes images three ways: paste a screenshot straight into the input (
Ctrl+V), pick files from the new image button, or drag and drop them onto the box. Thumbnails sit above the input (click to zoom, × to remove), up to 6 per message. Screenshots are downscaled to 1568px before sending, so a 4K grab doesn't balloon the request or eat your context window — and the context meter counts the images too. Works with any vision-capable OpenAI-compatible model. - 🔓 Trust this device — the master-password screen gains a 信任此设备 checkbox. Tick it and the next launch unlocks the vault automatically, straight to the main window. The password is sealed with the OS credential store (DPAPI on Windows, Keychain on macOS) — never written in plaintext — and the trust record is dropped automatically if it stops working. Turn it back off any time from Settings; systems without a credential store disable the option rather than fall back to storing the password in the clear.
- 🗃️ Create files & folders in SFTP — the file listing gains a New file button next to New folder, and right‑clicking blank space (including an empty directory) offers 新建文件 / 新建文件夹. Right‑clicking a file still shows its own menu (open / download / rename / delete), so the two never collide. Both panes (remote and local) check for a name clash first, so creating a file can never blank out an existing one.
- 💾 Ctrl+S saves to the server — with a remote file open in the editor, Ctrl/Cmd+S now saves it straight back over SFTP and snapshots a history version, exactly like the 保存到服务器 button. Saving is blocked while the file is still loading, so a placeholder can never overwrite your file.
- 🧾 Breathing room under the prompt — the terminal now reserves two blank rows at the bottom, so the prompt no longer sits flush against the window edge. It is reserved in rows, not pixels, so the gap stays correct at any font size and is reapplied on resize, split, and font changes.
- 📋 Ctrl+Shift+V no longer pastes twice — the terminal's paste shortcut now calls
preventDefault(), stopping the browser's native "paste as plain text" from firing on top of our own paste handler. (Ctrl+Shift+C got the same treatment.) - 🪟 Draggable, recursive split view — split panes now keep splitting. Each pane's tab strip (and the top bar) gains 向右分屏 / 向下分屏 buttons that split a pane right or down — including the panes you already split, so you can build any grid. Drag a tab by mouse from one pane into another: drop on an edge to carve out a new split, or on the center to merge it into that pane. Splitting a single‑tab terminal pane duplicates the session into the new pane, and the dividers have a wider grab zone for easier resizing. (Dragging is pointer‑based rather than HTML5 drag‑and‑drop, so it works reliably inside the app window.)
- 📜 Persistent command history — commands you type are now saved locally per server (surviving restarts) and shared across every tab of that host, each tagged User or Agent — agent‑run commands are captured too, not just what you type. The history panel gains a Local / Server split, where the Server tab reads the box's own
~/.bash_history/~/.zsh_history. Click any command to drop it into the input line without running it, delete single entries, or clear a server's history. - ⌨️ Triple‑Ctrl command palette — tap Ctrl three times in a terminal to pop a tabbed palette: 历史记录 (History) searches your merged local + server history, 快捷操作 (Quick actions) fires common actions. Tab / Shift+Tab switch tabs, ↑/↓ + Enter pick, and the chosen command is inserted into the prompt (never auto‑run).
- 🛡️ Agent terminal anti-jam — the agent no longer hangs on blocking commands (
tail -f,top, interactive[Y/n]prompts). It actively probes whether the shell is at a prompt, and when a command jams the terminal it runs a recovery ladder (Ctrl‑C → Ctrl‑C → pagerq→ editor:q!→ Ctrl‑Z suspend +kill %1), reporting a clear interrupted / stuck state instead of silently timing out. Completion is judged by an idle+ceiling heartbeat, so long jobs (apt,docker build) run to the end while truly stuck ones are recovered — and the agent is guided to bound streaming commands (tail -n,top -bn1,timeout N …). - 📊 Rich system monitor — the monitor panel now covers system info (IP / OS / timezone / uptime), per‑core CPU with a live sparkline, a memory donut (used / cache / free), network up/down rates & cumulative traffic, disk usage per mount with read/write I/O, and a process manager (hotspot list plus a full searchable table with kill / force‑kill). All charts and colors adapt to the active theme.
- ⚡ Faster SFTP transfers — local↔remote uploads/downloads now use concurrent
fastPut/fastGet, saturating high-latency links instead of sending one 32 KB chunk per round-trip. Large files move dramatically faster. - 📈 Transfer speed & ETA — the transfer UI shows live throughput (MB/s) and estimated time remaining, not just a percentage.
- 🗂️ Per-window transfer records — transfers are grouped by the window that started them into a collapsible dock; finished transfers stay as browsable history until you clear them.
⚠️ Close-tab protection — closing a tab with an in-progress transfer now asks for confirmation, since closing tears down the SFTP connection.- 📊 Progress in the side-panel SFTP view — the embedded SFTP panel shows transfer progress too, and the toolbar upload button supports multi-select with a progress bar.
- ⚙️ Configurable transfer concurrency — a new Settings page lets you tune the SFTP concurrency (default 64, range 1–256); the value is persisted.
- 🎨 Terminal color fix — the built-in themes now ship full 16-color ANSI palettes, fixing colored (especially white) text that was invisible on the light theme.
A ready-made landing page lives at docs/index.html — open it in a browser or publish it via GitHub Pages.
| Vault setup | Add a host | Host management |
|---|---|---|
![]() |
![]() |
![]() |
| SSH terminal | Agent workspace | Agent mode control |
|---|---|---|
![]() |
![]() |
![]() |
| Plan and confirm | System checks | Execution plan |
|---|---|---|
![]() |
![]() |
![]() |
| Model provider | SFTP browser | Multi-pane SFTP |
|---|---|---|
![]() |
![]() |
![]() |
| Remote editor |
|---|
![]() |
| Layer | Tech |
|---|---|
| Shell | Electron + electron-vite |
| UI | React + TypeScript + Tailwind CSS |
| Terminal | @xterm/xterm |
| Editor | Monaco Editor |
| SSH / SFTP | ssh2 |
| State | Zustand |
Prerequisites: Node.js 18+ and npm.
# Clone the repo
git clone https://github.com/SoySauceJYZ/NebuShell.git
cd NebuShell
# Install dependencies
npm install
# Start in development mode
npm run devPrefer a prebuilt binary? Grab the latest from the Releases page.
# Windows → dist/NebuShell-<version>-setup.exe
npm run build:win
# macOS → dist/NebuShell-<version>.dmg (must be built on macOS)
npm run build:mac
# Linux → dist/NebuShell-<version>.AppImage (+ snap / deb)
npm run build:linux
# Unpacked directory (quick smoke test, no installer)
npm run build:unpackThe agent talks to any OpenAI‑compatible endpoint. Open the agent settings in‑app and provide:
- Base URL — e.g.
https://api.openai.com/v1or your own gateway - API Key
- Model — e.g.
gpt-4o,claude-...via a compatible proxy, or a local model
The agent will refuse to run until all three are set.
src/
├── main/ # Electron main process
│ ├── ssh/ # SSH connection manager
│ ├── sftp/ # SFTP manager
│ ├── vault/ # Encrypted credential vault
│ ├── llm/ # LLM client (OpenAI-compatible)
│ └── ipc/ # IPC handlers
├── preload/ # Preload bridge
└── renderer/ # React UI (terminals, SFTP, editor, agent panel)
- Creator / Owner: jiayizhen
- Companies: MrToken & Nebulaedata
- Built with: Claude & Codex
- AI compute: provided by MrToken & Nebulaedata
Released under the MIT License. © 2026 jiayizhen / MrToken & Nebulaedata.
NebuShell 是一款跨平台桌面 SSH 客户端,内置了一流的 AI 运维智能体。你可以连接服务器、打开多个终端、通过 SFTP 浏览与编辑远程文件,并让内置智能体替你执行命令、读取输出、完成运维操作——所有操作都遵循「先出计划、确认后执行」的流程,没有你的同意,不会在你的机器上跑任何命令。
所有数据都保存在本地,并由主密码保险库加密,无需注册云账号。
- 🖥️ 多标签终端与灵活分屏 —— 基于 xterm.js,支持自适应、网页链接识别和主题化。可在标签条上点击向右/向下分屏,并对分出来的屏递归继续分屏组成任意网格;支持拖动标签页在各屏之间移动(拖到边缘新建分屏,拖到中间合并到该屏),还能把标签页拖出窗口撕成独立窗口(会话原样跟着搬走),分隔条可拖动调整大小。
- 🤖 内置 AI 运维智能体 —— 兼容 OpenAI 接口,支持
run_command(执行命令)、transfer_file(传输文件)、read_command_output(读取输出)、ask_user(向你提问)、present_plan(给出计划)。先出方案、征得确认,再在一个或多个终端上执行——也能操作你的本机(Windows 用 PowerShell,macOS/Linux 用/bin/sh),审批流程完全一致。还能在本机、主机与容器之间搬运文件——确认卡片会先告诉你要传多少个文件、多大。还可以给它发图片——截图直接粘贴、选择文件,或拖进输入框。 - 🔐 加密保险库 —— 主机、密码和 SSH 密钥都由主密码保护,密钥库永不离开本机。可勾选「信任此设备」,下次打开免输主密码。
- 📁 SFTP 文件浏览器 —— 远程/本地双栏文件管理,支持拖拽传输和实时传输队列。可从工具栏或右键空白处新建文件 / 文件夹,右键任意条目还能把它的完整路径输入到旁边的终端。
- 🐳 Docker 容器管理 —— 每台主机的容器面板(实时
docker ps、启停重启、日志、sudo 自动探测);一键打开docker exec容器终端;基于docker cptar 流的容器文件浏览器——浏览、编辑保存、在本机与任意运行中容器之间拖拽传文件。 - 📝 内置编辑器 —— 集成 Monaco(VS Code 同款)编辑器,快速编辑远程与本地文件,支持语法高亮。打开服务器文件后按 Ctrl+S 即可直接保存回服务器(并自动存一个历史版本)。
- 🖼️ 图片预览 —— 直接在标签页中打开远程图片。
- 🖥️ 远程桌面控制 —— 左侧边栏内置类似向日葵的远程桌面。在想被控的机器上运行 NebuShell,点「启动被控端」即显示该机的局域网地址和一个随机访问码;在控制端输入 IP + 访问码,即可看到实时画面并完全操控其鼠标键盘。画面在局域网内经 WebRTC 点对点直传(无中转服务器、不走云),输入在被控端原生注入,并自带多显示器切换、文本剪贴板双向同步、把文件直接推送到被控机「下载」目录(带进度条),以及远程命令行(在被控机上打开真实的 PowerShell / cmd 终端)。第一步:局域网直连、被控端仅 Windows。
- 🗂️ 主机管理 —— 把连接整理进分组,支持按名称或地址搜索、右键主机连接 / 复制 / 编辑、带保存按钮的就地编辑主机详情,以及在分组管理里重命名与排序分组(顺序会同步到列表);并可复制会话、一键重连、在标签栏之间快速切换。
- ⌨️ 命令历史与命令面板 —— 你输入的每条命令都会按服务器本地持久化(标记 User / Agent),并在该主机的所有标签页间共享;历史面板分「本地 / 服务器」两个子标签,服务器标签直接读取机器自身的
~/.bash_history。在终端里连按三次 Ctrl 可呼出分标签命令面板,搜索历史或执行快捷操作——选中的命令只填入输入行、不自动执行。 - 📜 历史文档 —— 记录过往会话与文档。
- 📊 系统监控 —— 每核心 CPU 占用与实时折线、内存环形图、网络上下行速率、按挂载点的磁盘用量及读写 IO,以及可搜索、可结束进程的进程管理器。
- 🔄 更新检查 —— 设置页可查询 GitHub Releases 上的最新版本,并直接给出匹配你系统的安装包;也可在启动时静默检查,并在侧边栏提示结果。
- 🎨 明暗主题 —— 简洁现代的界面,随系统自动切换。
近期更新(2026 年 7–8 月)
- 🖱️ 右键把文件路径输入到终端 (2026‑08‑20) —— 侧边栏的 SFTP 面板(以及容器文件面板)在文件/文件夹的右键菜单里新增「输入路径到终端」。点它就把该项的完整路径写进旁边那个终端的当前输入行,并且不回车——你可以在前面补
tail -f、cd之类再自己执行。含空格或 shell 特殊字符的路径会自动加引号;末尾留一个空格,和往终端里拖文件的习惯一致,方便接着拼第二个路径。这条只在贴着终端的面板里出现:整页文件浏览器没有配套终端,菜单里也就不会有它。 - 🔄 检查 GitHub 上的最新发布包 (2026‑08‑20) —— 设置页新增「软件更新」卡片:显示当前运行的版本,点「检查更新」向 GitHub Releases 查询最新发布版本。有更新时列出版本号、发布日期和更新说明,并可一键下载与你的系统 / 架构匹配的安装包(该发布没有匹配产物时退回发布页自行挑选)。启动后几秒还会静默检查一次——有新版本时左侧边栏「设置」上出现一个小红点,进设置页即消——这次自动检查可以在同一张卡片里关掉。下载链接只允许 GitHub 域名;启动时的检查失败保持静默,不会打扰你。
- 🗂️ 主机页支持拖动排序 (2026‑08‑20) —— 主机卡片现在可以直接拖着挪位置。拖到另一张卡片上时,按鼠标落在它的左半还是右半,显示一条插入线提示落点;松手即把整份新顺序写回密码库,重启后依然保持。拖动限制在同一分组内(改分组归属仍在编辑主机里做);搜索框里有内容时禁用拖动——那时看到的只是子集,拖出来的位置没有意义。
- 🔎 容器支持按名称搜索 (2026‑08‑20) —— 容器面板标题下新增搜索框,按容器名实时过滤(大小写不敏感的子串匹配)。只在该主机确实有容器时才出现;它是纯前端过滤,底层 4 秒一次的
docker ps轮询照常进行,刷新后过滤依然生效。 - 📄 容器日志可在只读编辑器里看 (2026‑08‑20) —— 容器卡片保留原有的日志按钮(在当前终端里执行
logs -f实时跟随),并新增一个按钮改为在编辑器标签页里打开:执行docker logs --tail 1000,带一个「刷新」按钮重新拉取,内容只读(Ctrl+S 一并禁用、保存按钮隐藏),加载完成自动滚到末尾。适合安静地翻阅和复制日志,而不用占着终端。 - 📁 文件面板按会话记住目录 (2026‑08‑20) —— 关掉侧边栏的 SFTP 面板会断开该会话,再打开原本只会回到
/。现在每条会话都记住它最后成功列出的目录,重开时直接回到那里(目录已删除或不可读时退回/)。「展开为整页 SFTP」也会把当前目录带过去,整页视图接着你刚才的位置继续浏览,而不是从根目录开始。 - 🧩 「添加面板」可加入已打开的文件面板 (2026‑08‑20) —— 文件浏览器的「添加面板」菜单现在会列出你已经打开的文件面板——侧边栏的 SFTP 面板和容器文件面板都算——每条显示所在主机(容器则是「容器名 @ 主机」)和它当前所在目录。选中即在本页加一个指向同一目标、同一目录的面板;本页自己的面板会被排除。需要说明的是它是另开一条连接而非把原面板搬过来:一条 SFTP /
docker exec会话由持有它的面板独占,无法共用。 - 🪟 分栏后 Hosts 标签可以关闭 (2026‑08‑20) —— Hosts 是首页标签,平时不带关闭按钮;但一旦分栏,它就占着一整个 pane 而没法收回。现在分栏后每个 pane 的标签条也给它关闭按钮;它是最后一个标签时仍然拦下(否则会关成空窗口),而左侧边栏的「主机」或「+ → 打开新主机」随时能把它开回来。
- 🧱 面板支持左中右三栏 (2026‑08‑11) —— 终端侧边图标栏顶部新增「换边」按钮。先打开一个面板(智能体 / SFTP / 监控…),点它把该面板挪到左侧,再从图标栏开第二个——新的落在右侧,于是得到「左 · 终端 · 右」三栏。两侧都有面板时按钮变成互换,不会把任何一个弄丢。两个停靠位各记各自宽度(拖各自靠终端那一边,均限制在 280–900px);停在左侧的面板在图标栏里同样是高亮的,再点一次就关掉——不论它停在哪一侧。同一个面板不会同时停在两侧,因为 SFTP 与容器文件共用一条派生会话,开两份会争抢同一个连接。
- 🚀 智能体面板长会话不再卡顿 (2026‑08‑11) —— 对话一长,光是敲一个字就会把整个消息列表重渲染一遍,流式输出的每个 token 同样如此。两个原因叠加:
react-markdown完全没有记忆化,每渲染一次就把全部历史消息从头解析一遍(实测:1 条 1.9ms、100 条 84ms);而输入框的草稿状态又和消息列表同住一个组件——按一次键,全量重解析一次(中文输入法下一个汉字还要乘以若干次 composition 事件)。两条路径都已修复:输入区拆成独立组件,消息行、工具卡片与 Markdown 全部memo 化,已完成的消息从此一次都不会被重新解析。同时修掉的还有:上下文用量估算不再随每个 token 扫一遍整个会话;工具结果改用Map查表,不再每张卡片线性扫全表(原本是平方级);视口外的消息经content-visibility跳过布局与绘制;滚动跟随不再每个 token 强制同步一次布局——并且上滚之后不再被强制拽回底部,模型还在输出时也能回看前文。 - 🗂️ 新标签页紧跟当前标签打开 (2026‑08‑11) —— 打开新标签(把 SFTP 展开成整页文件浏览器、在编辑器里打开文件、从主机页新建终端)原本一律追加到标签条最末尾,关掉之后就落到了不相干的地方。现在新标签紧挨着你从中打开它的那个标签——关掉它就回到原处。连开多个仍保持自然顺序;把标签拖到别的面板仍按原来的规则追加。
- 🖱️ 代码块「复制」不再整片亮起 (2026‑08‑11) —— 鼠标停在智能体回复的任意位置,该条消息里每一个代码块的「复制」按钮都会一起亮,因为代码块用的是 Tailwind 的匿名
group,而group-hover:会穿透匹配任意一层带该类的祖先——包括消息行本身。代码块改用具名 group,现在只有光标真正停在上面的那一个才显示按钮。 - 🖥️ 远程桌面控制 (2026‑08‑03) —— 左侧新增「远程桌面」标签,把类似向日葵的远程控制直接做进 NebuShell。在想被控的机器上打开该标签点「启动被控端」,即进入被控模式并显示本机局域网地址和一个随机 6 位访问码;在控制端输入该 IP + 访问码,即可看到实时画面并完全操控其鼠标键盘。画面在局域网内经 WebRTC 点对点直传(无中转服务器、不走云),输入在被控端原生注入。还支持多显示器切换(在会话右侧菜单里选远程显示器)、文本剪贴板双向同步、以及文件推送——从控制端把文件直接发到被控机的「下载」目录,带实时进度条。还内置远程命令行——在会话侧边菜单直接打开一个运行在被控机上的真实 PowerShell / cmd 终端(基于 node‑pty 的 ConPTY,支持方向键、Tab 补全、颜色)。被控端直接复用 NebuShell 自身(无需另装程序)。第一步:局域网直连、被控端仅 Windows。
- 🔌 智能体可重连断线终端 (2026‑08‑03) —— 当某个 SSH 终端掉线(命令返回连接错误,或结果被标为「终端卡死,建议重连」)时,智能体现在可以调用新增的
reconnect_terminal工具自己把该终端重新连上再继续,不用再让你先点重连。它复用标签页原本的连接流程(终端里会显示「正在连接...」),把成功或失败回报给模型,并在包括计划模式在内的所有模式下都可执行(重连是继续调查的前提,不是写操作)。工具只列出 SSH 目标——本机不是网络连接。 - 🧩 右侧面板按标签页独立 (2026‑08‑03) —— 开着多个标签页时,在一个终端里切换右侧面板(智能体 / 快捷操作 / 历史命令 / 监控 / 容器 / 主题 / SFTP)原本会连带切换所有标签,因为选中项是一个全局共享值。现在每个终端各记各自打开的面板:在一个标签开 SFTP,其它标签不受影响;主机页「查看容器」也只为新开的那个标签预展开容器面板。(面板宽度仍作为全局尺寸偏好共享。)
- 🚑 高频输出不再卡死界面 (2026‑08‑03) —— 运行每秒刷新数百次的命令(如
rsync --info=progress2)可能把界面卡死,因为每个细碎输出块都要单独走一趟 IPC 加一次回放缓冲拼接。现在输出按帧(约 16ms)合批:一波数据块合并成一次广播和一次终端写入,把每秒数百条消息压到约 60 条,界面保持流畅。智能体自身的命令输出采集也从反复整段拼接 + 查找哨兵改为数组累积 + 只扫尾部,消除长时间高输出命令下的 O(n²) 卡顿。 - ⌨️ 新终端自动聚焦 (2026‑07‑24) —— 打开新终端(或切换到某个已有终端)时会自动聚焦,可以直接输入命令,不用再先点一下。只有当前活动标签页才会被聚焦,后台终端连接完成不会抢走你正在操作处的焦点。
- 📜 下拉框可滚动 (2026‑07‑24) —— 选项很多的下拉菜单(如服务器选择)不再顶穿窗口——现在会按可用高度封顶并出现滚动条,不会被截断。
- ⚡ 自定义快捷命令 (2026‑07‑23) —— 终端右侧「快捷操作」面板现在可以保存你自己的一批命令:填标题、描述和一段命令,点一下就把整批写入当前终端执行——编辑时还有「测试」按钮当场试跑。在表单里选一台服务器,这条命令就变成绑定服务器——点击会新开标签页、连接该主机、连上后自动执行这批命令。左侧菜单新增「快捷操作」入口,把所有绑定服务器的命令做成一键启动卡片,这些命令同样出现在三击 Ctrl 命令面板里。命令均本地持久化保存。
- 🌲 文件浏览器树状目录 (2026‑07‑23) —— 每个文件面板(SFTP、容器文件、本地)左侧新增懒加载目录树。点文件夹即把右侧列表定位过去;树会自动展开并高亮当前路径,右键节点可就地新建 / 重命名 / 删除文件夹。工具栏有开关控制显隐——终端右侧的窄面板默认收起,整页文件浏览器默认展开。本地树以当前盘符为根。
- 📦 智能体可以传文件了 (2026‑07‑21) —— 智能体新增
transfer_file工具,可在本机、SSH 主机、容器之间搬运文件和目录,不用再拼scp/rsync。底层直接复用应用自身的传输管线(SFTP;容器走docker cp的 tar 流),因此没有密码提示要应答,也不会被终端超时打断——这正是过去让模型自己拼scp必然失败的原因。支持的路线:本机 ↔ SSH 主机、SSH 主机 ↔ SSH 主机(在应用内 A→B 流式中转)、本机 ↔ 容器;不支持的组合(容器 ↔ SSH、容器 ↔ 容器)不会报错卡死,而是返回清晰引导,让它分两步经本机中转。确认卡片在你点之前会先做一次预扫描,明确告诉你要传多少个文件、多大,传输过程有实时进度条,记录也会进和拖拽传输同一个传输面板。权限沿用现有模式:「替我审批」下下载自动执行、上传仍需确认,计划模式两个方向都拦截。目录递归传输;dest_path填的是目标目录,源文件名会保留。 - 🛡️ 智能体工具分发加固 (2026‑07‑21) —— 修掉两处会静默出错的隐患。其一,未知工具名原本会掉进 shell 分支,被解析成空命令真的送到终端上执行,现在显式拒绝并告知模型。其二,传输端点改为严格解析——目标名对不上时直接报错并列出可用目标,而不是悄悄回退到第一个目标;后者意味着文件会被静默写到错误的机器上。
- 🐳 Docker 容器管理 (2026‑07‑17) —— 每个已连接终端新增「容器」侧边面板,实时轮询
docker ps -a:状态徽标、镜像与端口一目了然,启动 / 停止 / 重启一键完成,点「日志」直接在编辑器标签里打开docker logs --tail 500。Docker 权限自动探测——先试docker,再试免密sudo -n docker,都不行给出清晰提示和重新检测按钮。从列表一键打开容器终端:独立的 exec‑PTY 会话(bash 优先、sh 回退),窗口缩放、退出重连、复制分屏、撕出窗口全部可用。容器文件浏览器复用 SFTP 同款双栏体验——底层走docker cp的 tar 流(二进制安全,不依赖容器内任何工具)加 GNU/busybox 自适应ls解析:编辑并保存回容器(带版本历史)、新建重命名删除、本地与容器之间直接拖拽传输并显示实时进度。容器终端右侧的文件面板浏览的就是容器内部的文件系统,而不是宿主机。主机页右键也新增「查看容器」直达入口。 - ⚡ 打开 SFTP 不再卡死 (2026‑07‑17) —— 原来的 Windows 盘符探测在主进程上同步检查 A:–Z:,一块失联的网络映射盘就能把整个应用挂住 20 秒以上(实测最差 22.3 秒 → 现在 1 秒封顶)。现在改为全盘并行异步探测、每盘 1 秒超时、结果短缓存,应用永不冻结。目录列表也从逐个串行 stat 改为并行执行——5100 项的文件夹从 435ms 降到 31ms。
- 💻 智能体可以操作本机了 (2026‑07‑16) —— 智能体面板新增始终可用的「本机」目标,与 SSH 终端并列——可以让它浏览本地目录、查看进程、执行任意本机命令,还能在一个任务里混搭本机与远程步骤。Windows 上命令由 PowerShell 执行,全链路 UTF‑8 处理(中文文件名、
ipconfig/systeminfo等原生工具输出不乱码、无 CLIXML 杂音);macOS / Linux 上由/bin/sh执行。系统提示词按操作系统教模型用对命令集(如 Windows 用Select-String而不是grep),并且新增 PowerShell 风险识别,现有权限模式在本机同样生效——只读命令自动执行、写操作仍需确认、计划模式照旧拦截。每次执行都是全新进程,与 SSH 命令一样有 12 秒静默 / 180 秒硬超时,超时会清理整棵进程树,长输出也走同一套#ref分页检索管线。 - 🗂️ 主机管理增强 (2026‑07‑15) —— 主机页新增搜索框,可按名称或地址实时过滤主机;右键任意主机卡片弹出快捷菜单(连接 / 复制 / 编辑),其中「复制」会连同全部连接配置克隆一台主机;主机详情面板支持就地编辑——点「直接编辑」即可改地址 / 名称 / 分组 / 用户 / 端口 / 认证方式,再点「保存」,无需打开弹窗;新建分组旁新增「分组管理」下拉菜单,可重命名分组并调整顺序,顺序会决定主机列表中各分组的排列。
- 🪟 把标签页撕成独立窗口 (2026‑07‑15) —— 把任意内容标签(终端 / SFTP / 编辑器 / 图片,包括分屏面板里的某个标签)拖出窗口,即可在光标处弹出一个新窗口装它;若拖到另一个已有窗口上,则合并进那个窗口(双向都行)。会话原样搬移、不断开——SSH 连接和正在运行的命令都毫发无伤,终端保留完整历史滚屏(在新窗口里回放重建)。关掉原窗口也不会影响已经撕出去的会话。
- 🖼️ 给智能体发图片 —— 智能体输入框现在支持三种加图方式:截图直接粘贴(
Ctrl+V)、点新增的「图片」按钮选择文件、或把图片拖进输入框。缩略图排在输入框上方(点击放大,× 移除),单条消息最多 6 张。图片发送前会按最长边缩到 1568px,4K 截图不会把请求体撑爆、也不会吃光上下文——上下文用量表也会把图片算进去。任何支持视觉的 OpenAI 兼容模型都能用。 - 🔓 信任此设备 —— 主密码界面新增「信任此设备」勾选框。勾上之后,下次打开应用会自动解锁保险库,直接进主界面。主密码用操作系统凭据存储加密保存(Windows DPAPI / macOS 钥匙串),绝不明文落盘;万一记录失效(比如保险库被重建),会自动清掉并退回手输密码,不会卡死。随时可在「设置」里关掉。系统若不支持安全存储,该选项会被禁用,而不是退化成明文保存密码。
- 🗃️ SFTP 新建文件与文件夹 —— 文件列表在「新建文件夹」旁边新增了「新建文件」按钮,右键空白处(包括空目录)也会弹出「新建文件 / 新建文件夹」菜单。右键文件行仍然是原来的菜单(打开 / 下载 / 重命名 / 删除),两者互不冲突。远程和本地两个面板都会先查重名,所以新建文件绝不会把同名文件清空。
- 💾 Ctrl+S 保存到服务器 —— 在编辑器里打开服务器文件后,按 Ctrl/Cmd+S 就会通过 SFTP 直接保存回服务器,并存一个历史版本,效果与点「保存到服务器」按钮完全一致。文件还在加载时会阻止保存,避免把占位文本覆盖到你的文件上。
- 🧾 提示符不再贴底 —— 终端底部现在会保留两行空白,命令提示符不再紧贴窗口边缘。留白是按「行」而不是像素预留的,所以任何字号下间距都正确,并且在窗口缩放、分屏、改字号时都会重新生效。
- 📋 修复 Ctrl+Shift+V 重复粘贴 —— 终端的粘贴快捷键现在会调用
preventDefault(),阻止浏览器原生的「粘贴为纯文本」在我们自己的粘贴之外再粘一次。Ctrl+Shift+C 也做了同样处理。 - 🪟 可拖动的递归分屏 —— 分屏后还能继续分屏。每个面板的标签条(以及顶栏)新增了「向右分屏 / 向下分屏」按钮,可对已经分出来的面板继续分屏,组成任意网格。用鼠标把标签页从一个面板拖到另一个:拖到边缘新建分屏,拖到中间合并进该面板。对单标签的终端面板分屏时会复制会话到新面板,分隔条也有更宽的拖拽热区便于调整大小。(拖拽改用指针实现而非 HTML5 拖放,在应用窗口内更稳定可靠。)
- 📜 命令历史持久化 —— 你输入的命令现在会按服务器本地保存(重启后仍在),并在该主机的所有标签页间共享,每条标注来源 User 或 Agent(智能体执行的命令也会被记录,而不只是手输的)。历史面板新增「本地 / 服务器」子标签——服务器标签直接读取机器自身的
~/.bash_history/~/.zsh_history。点击任意命令即可填入输入行而不执行,并支持删除单条或清空某台服务器的历史。 - ⌨️ 三击 Ctrl 命令面板 —— 在终端里连按三次 Ctrl 弹出分标签面板:「历史记录」搜索本地 + 服务器合并的历史,「快捷操作」执行常用动作。Tab / Shift+Tab 切换标签,↑/↓ + 回车 选择,选中的命令会填入输入行(不自动执行)。
- 🛡️ 智能体终端防卡死 —— 智能体不再被
tail -f、top、交互式[Y/n]等阻塞命令卡住。它会主动探测 shell 是否停在提示符;当某条命令把终端卡死时,走恢复阶梯(Ctrl‑C → 再 Ctrl‑C → 分页器q→ 编辑器:q!→ Ctrl‑Z 挂起并kill %1)夺回提示符,并明确回报「已中断 / 终端卡死」状态,而不是默默超时。完成判定改用「空闲 + 硬上限」心跳,apt、docker build等长任务能跑到底,真正卡死的才被恢复;同时引导模型对持续输出型命令做有界化(tail -n、top -bn1、timeout N …)。 - 📊 系统监控大升级 —— 监控面板现覆盖:系统信息(IP / 系统 / 时区 / 运行时间)、每核心 CPU 占用与实时折线、内存环形图(已用 / 缓存 / 空闲)、网络上下行速率与累计流量、按挂载点的磁盘用量及读写 IO,以及进程管理(热点列表 + 可搜索全表,支持结束 / 强制结束进程)。所有图表与配色随当前主题自适应。
- ⚡ SFTP 传输提速 —— 本地↔远端的上传/下载改用并发
fastPut/fastGet,填满高延迟链路,不再"一次一个 32KB 分块等往返"。大文件传输速度大幅提升。 - 📈 传输速度与剩余时间 —— 传输界面新增实时速度(MB/s)与预计剩余时间,不再只有百分比。
- 🗂️ 按窗口保存的传输记录 —— 传输按所属窗口归集到可折叠的记录面板;完成后作为历史保留,可随时查看,直到手动清除。
⚠️ 关闭页面保护 —— 关闭仍有传输进行中的标签页时会弹出确认(关闭会中断 SFTP 连接)。- 📊 侧边栏 SFTP 也显示进度 —— 终端右侧内嵌 SFTP 面板同样显示传输进度,工具栏上传支持多选并带进度条。
- ⚙️ 传输并发数可调 —— 新增「设置」页,可调节 SFTP 并发数(默认 64,范围 1–256),并持久化保存。
- 🎨 终端配色修复 —— 内置主题补全了 16 色 ANSI 调色板,修复浅色主题下彩色(尤其是白色)文字看不见的问题。
项目自带一个介绍页 docs/index.html —— 用浏览器打开,或通过 GitHub Pages 发布即可。
| 主机与终端 | AI 智能体 | SFTP 与编辑器 |
|---|---|---|
![]() |
![]() |
![]() |
| 层级 | 技术 |
|---|---|
| 外壳 | Electron + electron-vite |
| 界面 | React + TypeScript + Tailwind CSS |
| 终端 | @xterm/xterm |
| 编辑器 | Monaco Editor |
| SSH/SFTP | ssh2 |
| 状态管理 | Zustand |
环境要求: Node.js 18+ 及 npm。
# 克隆仓库
git clone https://github.com/SoySauceJYZ/NebuShell.git
cd NebuShell
# 安装依赖
npm install
# 开发模式启动
npm run dev想直接用安装包?到 Releases 页面 下载最新版本。
# Windows → dist/NebuShell-<版本号>-setup.exe
npm run build:win
# macOS → dist/NebuShell-<版本号>.dmg (需在 macOS 上打包)
npm run build:mac
# Linux → dist/NebuShell-<版本号>.AppImage(以及 snap / deb)
npm run build:linux
# 仅解压目录(快速验证,不生成安装包)
npm run build:unpack智能体支持任意 兼容 OpenAI 的接口。在应用内打开智能体设置,填写:
- Base URL —— 例如
https://api.openai.com/v1或你自建的网关 - API Key
- 模型 —— 例如
gpt-4o、通过兼容代理的claude-...,或本地模型
三项未配置齐全前,智能体不会执行任何操作。
src/
├── main/ # Electron 主进程
│ ├── ssh/ # SSH 连接管理
│ ├── sftp/ # SFTP 管理
│ ├── vault/ # 加密凭据保险库
│ ├── llm/ # LLM 客户端(兼容 OpenAI)
│ └── ipc/ # IPC 处理
├── preload/ # 预加载桥接
└── renderer/ # React 界面(终端、SFTP、编辑器、智能体面板)
- 开发者 / 所有者: jiayizhen
- 公司: MrToken、Nebulaedata
- 构建开发: 由 Claude 与 Codex 构建开发
- AI 算力: 由 MrToken、Nebulaedata 提供
基于 MIT 协议 发布。© 2026 jiayizhen / MrToken、Nebulaedata。
Made with ❤️ · Powered by MrToken & Nebulaedata












