⚡ OxideTerm

面向遠端伺服器、具備 AI 能力的原生維運工作區 —— 純 Rust 原生應用
SSH、Telnet、序列埠、RDP/VNC、SFTP、連接埠轉發 和輕量編輯,集中在一個原生工作區。
GPU 直接渲染。免費,無需註冊。
不使用 Electron。 不捆綁 WebView。不蒐集遙測。無需訂閱。BYOK 優先。純 Rust SSH,不依賴 OpenSSL/libssh2。

版本 平台 授權 Rust 2024 GPUI

開源、本機優先,使用 GPUI 進行 GPU 繪製。

English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Português | Tiếng Việt

OxideTerm 功能概覽

--- ## OxideTerm 是什麼 OxideTerm 是面向 SSH 與遠端維運的開源工作區。終端、檔案、連接埠轉發、主機工具和遠端桌面都集中在同一個工作區中。 **你可以做什麼:** - 在同一個工作區中管理 SSH、Telnet、序列埠、RDP/VNC、SFTP、連接埠轉發、本機 Shell 與輕量編輯 - 透過 Grace Period 重連機制,應對短暫網路中斷並維持遠端工作 - 使用你自己的 AI 服務商,讓 OxideSens 檢查作用中的工作階段並執行經過核准的工作區操作 連線資訊與維運資料始終由你掌控。OxideSens 使用你自己的 AI 服務商,無需註冊帳號。 --- ## 為什麼選擇 OxideTerm? | 如果你在意…… | OxideTerm 提供…… | |---|---| | 一個遠端節點,多種工具 | 終端、SFTP、連接埠轉發、RDP/VNC、trzsz、原生 IDE、監控和 OxideSens AI 都附屬於同一工作區 | | 沒有 Electron 或捆綁 WebView 的桌面應用程式 | GPUI 直接在 GPU 表面繪製介面,無需附帶瀏覽器執行環境 | | 本機優先的維運流程 | SSH、Telnet、SFTP、轉發、RDP/VNC、本機 Shell、序列埠終端和設定無需註冊即可使用 | | 自帶金鑰的 OxideSens AI,而非平台額度 | OxideSens 使用你的 OpenAI、Anthropic、Gemini、Ollama 或 OpenAI 相容端點,並支援 MCP、本機 RAG、依服務商適配的推理控制和經核准的工作區操作 | | 重連穩定性 | Grace Period 會在替換連線前探測舊連線 30 秒,讓 TUI 應用程式能穿越短暫的網路中斷 | | 純 Rust SSH 與憑證安全 | SSH 堆疊透過 `russh` + `ring` 提供,不依賴 OpenSSL/libssh2;已儲存憑證使用系統鑰匙圈,`.oxide` 套件使用 ChaCha20-Poly1305 + Argon2id | --- ## 截圖 以下截圖展示了 OxideTerm 的終端、檔案、編輯與連接埠轉發工作流程。
SSH 終端 + OxideSens AI

帶有 OxideSens AI 的 SSH 終端
SFTP 檔案管理員

SFTP 雙窗格檔案管理員與傳輸佇列
內建 IDE

內建 IDE 模式
智慧連接埠轉發

帶自動偵測的智慧連接埠轉發
--- ## 為遠端維運而設計 OxideTerm 將連線、檔案、轉發、主機工具、自動化與 AI 上下文放在同一個 Rust 工作區中。各項工具共享同一台伺服器的身分與工作階段生命週期。 | 面向 | 捆綁瀏覽器的方案 | OxideTerm | |---|---|---| | **繪製** | 瀏覽器引擎與網頁版面 | GPU 表面上的 GPUI | | **終端資料流** | WebSocket → JavaScript 事件迴圈 → xterm.js | Rust 輸入 → `TerminalState` 變更 → GPUI 繪製 | | **連線生命週期** | 分散在前端與後端層 | 單一行程內連線與重連流程 | | **AI 上下文** | 經由應用程式橋接複製 | 在使用者核准下從作用中的工作區建立 | | **外掛執行階段** | 瀏覽器腳本環境 | 具能力範圍的 WASM 執行階段 | | **CLI** | 需要桌面應用程式正在執行 | 獨立二進位檔,直接連結 crate | | **執行階段邊界** | 桌面外殼加瀏覽器執行階段 | 不帶捆綁瀏覽器執行階段的原生行程 | --- ## 功能 | 類別 | 功能 | |---|---| | **終端與連線** | 本機 Shell、SSH、Telnet、序列埠、分割窗格、自由輸入模式、高階多目標命令傳送、多跳路由與穩定重連 | | **檔案與遠端編輯** | SFTP、傳輸佇列、收藏夾、安全寫入、專案樹與多分頁編輯 | | **轉發與網路** | 本機、遠端與動態 SOCKS5 轉發、已儲存規則與 Socket 除錯 | | **主機維運與遠端桌面** | 監控、行程、服務、日誌、連接埠、工作、磁碟、套件、容器、tmux、RDP 與 VNC | | **OxideSens 與自動化** | 自有 AI 服務商、MCP、本機 RAG、Agent Skills、已核准操作、加密雲端同步與 CLI | | **擴充與個人化** | manifest-only、WASM 與程序外掛、自訂分頁、快速命令、主題、背景圖片、快捷鍵與 11 種介面語言 | ---
OxideSens 在 OxideTerm 中開啟終端 *觀看 OxideSens 依照使用者請求,在 OxideTerm 中開啟一個終端。*
--- ## 內部實作 OxideTerm 將終端、SSH、Telnet、RDP、VNC、SFTP、轉發、IDE、AI、插件和 CLI 整合在同一套 Rust 架構中。下方列出了面向開發者的技術細節。
架構、SSH 內部、GPUI 外殼、重連、AI、插件與更多細節
### 核心行程內直連,無 WebView 橋接 ```text GPUI 渲染迴圈 WorkspaceApp / 分頁介面 / GPUI 檢視 │ in-程序 Arc<> / async 領域 Crate NodeRouter → SshConnectionRegistry TerminalState ← SSH PTY channel SftpSession / ForwardingRuntime / IdeWorkspace Ai/ACP Entities / CloudSync / Plugin Runtimes ``` 介面與 SSH/終端後端之間沒有序列化邊界。終端位元組直接修改 `TerminalState`,GPUI 讀取狀態並發出 GPU 繪製命令。 ### 純 Rust SSH — russh (ring) - **SSH 堆疊不依賴 OpenSSL/libssh2**:SSH 密碼學能力由 `ring` 提供 - 完整 SSH2:金鑰交換、通道、SFTP 子系統與連接埠轉發 - ChaCha20-Poly1305 / AES-GCM、Ed25519/RSA/ECDSA 金鑰 - SSH Agent:Unix `SSH_AUTH_SOCK` 與 Windows `\\.\pipe\openssh-ssh-agent` - 多跳 ProxyJump,每一跳獨立認證 ### Grace Period 智慧重連 1. 透過 SSH keepalive 偵測連線逾時,沒有 JavaScript timer throttle 2. 快照終端分割窗格、SFTP 傳輸、連接埠轉發與 IDE 檔案狀態 3. **Grace Period**:先探測舊連線 30 秒,網路切換時 TUI 應用有機會原地存活 4. 舊連線無法恢復時,新 SSH 連線會恢復轉發,並依傳輸策略重試或續傳,再重新開啟 IDE 檔案 Pipeline: `queued → snapshot → grace-period → ssh-connect → await-terminal → restore-forwards → retry-or-resume-transfers → restore-ide → verify → done` ### SSH 連線池與節點路由 - 一個實體 SSH 連線可被 terminal、SFTP、port forward 和 IDE 同時使用 - 每條連線都有 `connecting → active → idle → link_down → reconnecting` 狀態機 - UI 只按 `nodeId` 操作,`NodeRouter` 原子解析到底層 `connectionId` - `NodeRuntimeStore` 保存程序內節點執行狀態並匯出拓撲快照;由工作區 helper 將快照寫入 `session_tree.json`,啟動時重新建立執行中的 handle - 跳板機失效會級聯標記下游節點為 `link_down` ### OxideSens AI OxideSens 採用 BYOK 模式,並在行程內建立上下文: - 提供商:OpenAI、Anthropic、Gemini、Ollama 或任何 OpenAI 相容端點 - MCP:stdio 與 SSE 傳輸,支援工具探索與呼叫 - RAG:BM25 全文檢索、HNSW 向量索引、RRF 融合與 CJK 雙字詞斷詞器 - 傳送至提供商的訊息會過濾憑證模式;工作區上下文與操作仍由使用者控制 - API 金鑰存入系統鑰匙圈,並明確排除在結構化日誌和桌面核心訊息內容之外 ### GPUI 桌面外殼 整個 UI 使用 GPUI 直接繪製,沒有 DOM/CSS/JavaScript rendering pipeline: - 工作區分頁類型:本地終端、SSH、Telnet、序列埠、RDP、VNC、SFTP、IDE、Forwards、Settings、Plugin、Topology 等 - Binary pane tree 與可拖曳 divider,每個 terminal tab 最多 4 個 pane - Command palette、global key bindings 與 sidebar 都使用 GPUI primitive - 即時模式渲染直接回應 Rust 狀態變化,無需序列化往返 ### 終端狀態與渲染 終端渲染先建模為 Rust 狀態,再由 GPUI 繪製: - PTY 輸出進入 `TerminalState`;scrollback、cursor、selection、marks 與搜尋狀態都留在 Rust 中 - 渲染策略可在 Boost、Normal、Idle 之間切換,不需要等待瀏覽器事件迴圈配合 - Sixel 與 Kitty graphics 作為 terminal-owned assets 追蹤,而不是 DOM node 或 canvas overlay - 分割窗格共享同一套工作區狀態,分頁恢復與重連可以一起快照終端拓撲 ### SFTP 與 IDE 工作區 遠端檔案屬於同一個 node 工作區,而不是割裂的附屬功能: - SFTP session 透過 `NodeRouter` 與連線代次解析;重連時可以重新取得有效 session,但舊代次操作不會被新連線靜默替換 - 傳輸佇列獨立追蹤方向、進度、重試狀態與速度限制,不依賴目前可見的檔案窗格 - IDE 分頁同時保存未儲存緩衝區、遠端路徑、衝突狀態與復原中繼資料 - Backend 支援時,remote writes 使用 staged/atomic behavior,避免普通 editing flow 出現 partial writes ### 外掛、CLI 與診斷 原生分支把擴充功能與支援介面保持在 Rust 原生邊界內: - 外掛支援 manifest-only、WASM 與一般程序三種路徑。WASM 使用內建的 Wasmtime/WASI 執行階段;程序外掛是沒有作業系統級沙箱的本機程序,需要另外判斷信任邊界。 - CLI 直接連結領域 crate,涵蓋 doctor、settings、connections、forwards、便攜包、備份與報告 - 診斷優先輸出計數、路徑、功能旗標與脫敏提示,避免暴露含密鑰的原始負載 - 會修改狀態的 CLI flows 使用 dry-run 計畫、`--yes` guards 與回滾備份 ### 連接埠轉發 — 無鎖 I/O - Local `-L`、Remote `-R`、Dynamic SOCKS5 `-D` - SSH Channel 由單一 `ssh_io` task 持有,避免 `Arc>` - 支援重連自動恢復、終止回報與閒置逾時 ### trzsz 內聯檔案傳輸 trzsz 繼續走 terminal stream,不需要額外 port 或 remote agent: - Upload/download 復用既有 terminal stream - 可穿透 ProxyJump chain - Native file picker 不受 browser memory 限制 - 支援 bidirectional、directory transfer 與 configurable limits ### `.oxide` 加密匯出 - **ChaCha20-Poly1305 AEAD** authenticated encryption - **Argon2id KDF**:256 MB memory cost、4 iterations,提高 GPU brute-force 成本 - 覆蓋 connections、forwards、settings、快捷命令、外掛設定與便攜密鑰
--- ## 從原始碼執行 **需求:**Rust 工具鏈(2024 Edition)以及能夠執行 GPUI 的桌面環境。 ```sh cargo run OXIDETERM_RENDER_PROFILE=compatibility cargo run ./scripts/build/build-cli.sh ./scripts/build/build-agent.sh ``` ## CLI 無介面的 `oxideterm` CLI 無需啟動桌面應用程式,適合自動化、CI 與診斷。 ```sh cargo run -p oxideterm-cli -- doctor --strict cargo run -p oxideterm-cli -- settings validate --strict --json cargo run -p oxideterm-cli -- connections search prod cargo run -p oxideterm-cli -- forwards list --format json cargo run -p oxideterm-cli -- cloud-sync push --dry-run --json cargo run -p oxideterm-cli -- oxide export ./profile.oxide --connection prod --password-stdin cargo run -p oxideterm-cli -- report --bundle ./oxideterm-report.zip cargo run -p oxideterm-cli -- completion install zsh --force ``` ## 技術棧 | 層級 | 技術 | 說明 | |---|---|---| | 介面框架 | GPUI(Zed) | GPU 加速的即時模式介面,純 Rust 實作 | | 執行環境 | Tokio + DashMap | 非同步執行環境與並行映射 | | SSH | russh(`ring`) | SSH 堆疊不依賴 OpenSSL/libssh2,支援 SSH Agent | | 終端 | portable-pty + alacritty_terminal | 本機偽終端、終端模擬與 Sixel/Kitty 圖形 | | 外掛 | Wasmtime/WASI 與程序路徑 | manifest-only、受控 WASM 宿主呼叫,以及需要明確授權的本機程序 | | AI 與檢索 | SSE + BM25 + HNSW | 提供商串流、CJK 雙字詞與 RRF 融合 | | 編輯器 | tree-sitter(語法)、自訂緩衝區 | 多語言,基於 SFTP | | 加密 | ChaCha20-Poly1305 + Argon2id | AEAD + 記憶體困難型 KDF(256 MB) | | 國際化 | oxideterm-i18n | 內建載入器,內建 11 種介面語言 | ## 安全 | 關注點 | 實作 | |---|---| | 已儲存憑證 | macOS 鑰匙圈 / Windows Credential Manager / libsecret | | 記憶體中的秘密 | 持有秘密的型別和暫存緩衝區在支援的所有權邊界使用 `zeroize` / `Zeroizing` | | 診斷 | 支援報告優先輸出結構化中繼資料和脫敏提示,避免攜帶秘密的原始內容 | | AI 上下文 | 傳送至提供商的訊息會過濾憑證模式;工作區上下文與操作仍由使用者控制 | | `.oxide` | ChaCha20-Poly1305 + Argon2id | | CLI 寫入 | dry-run 計畫、`--yes` 保護和回滾備份 | | 主機金鑰 | 使用 `~/.ssh/known_hosts` 的 TOFU,拒絕未預期變更 | | 外掛 | manifest-only、受控 WASM 宿主 API 或需要明確授權的本機程序 | ## 合法使用提醒 OxideTerm 依 GPL-3.0-only 授權發布,不附加額外的授權限制。使用時,請僅存取你擁有或已取得明確授權的系統、網路和裝置,並遵守適用法律。請勿使用 OxideTerm 從事未經授權的存取、服務干擾或規避存取控制。 ## 貢獻 歡迎貢獻程式碼、文件、翻譯、插件、測試與問題重現。較大的改動或範圍明確的修正請先透過 Issue 討論。 ```sh cargo run -p oxideterm-cli -- report --bundle ./oxideterm-report.zip ``` --- ## 支援與維護 帶有可重現步驟和脫敏診斷資訊的 bug 回報與回歸問題會優先處理。功能請求會根據範圍、安全性以及是否符合 OxideTerm 的遠端伺服器工作區方向來評估。

GitHub stars

如果 OxideTerm 幫助了你的工作流,GitHub Star、問題重現、翻譯修正或插件都能讓專案更容易繼續推進。 --- ## 授權 **GPL-3.0-only**。詳細的第三方聲明請見 [`THIRD_PARTY_NOTICES.md`](../../THIRD_PARTY_NOTICES.md),其他通知請見 [`NOTICE`](../../NOTICE)。 ## 致謝 感謝 `russh`、`GPUI`、`alacritty_terminal`、`portable-pty`、`wasmtime` 和 `tree-sitter`。