feat: harden local shell, SFTP, and desktop session reliability

Finder-launched terminals now inherit a login PATH so tools like ollama resolve, destructive SFTP/editor actions require confirmation, and terminal search plus window dragging work again. SSH forwards and RDP sessions keep listeners and survive reconnect without FastPath crashes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Logan.LiandCursor committed 2026-08-16 16:08:11 +08:00
1 parent 188f3556ed
commit 08696896f9
223 files changed
+13493 -3423

No files matched your search

+50 -18
View File
@@ -1,9 +1,7 @@
{
"nav": {
"general": "Workspace",
"generalDesc": "Layout and resources",
"appearance": "Appearance",
"appearanceDesc": "Theme and language",
"general": "General",
"generalDesc": "Theme, language, and layout",
"terminal": "Terminal",
"terminalDesc": "Font and colors",
"shortcuts": "Shortcuts",
@@ -15,11 +13,13 @@
"ai": "AI models",
"aiDesc": "AI providers",
"about": "About",
"aboutDesc": "Version and data"
"aboutDesc": "Version and data",
"account": "Account",
"accountDesc": "Email, license, and device"
},
"title": "Settings",
"search": {
"placeholder": "Search settings..."
"placeholder": "Search settings…"
},
"language": {
"label": "Language",
@@ -89,7 +89,7 @@
"ssh": {
"connection": "Connection",
"keepAlive": "Keep-alive",
"keepAliveDesc": "Send keep-alive when idle to reduce disconnects",
"keepAliveDesc": "Send SSH keep-alive while idle; disconnect only after several missed replies",
"autoReconnect": "Auto reconnect",
"autoReconnectDesc": "Automatically retry after unexpected disconnects",
"timeout": "Connection timeout",
@@ -102,7 +102,9 @@
"maxBackground": "Background connection limit",
"maxBackgroundDesc": "Evict least recently used connections when over limit",
"suspend": "Background suspend",
"suspendDesc": "Minutes before releasing active channels when a tab is in background"
"suspendDesc": "Minutes before idle background tabs suspend (active Shell/SFTP stay connected)",
"keepAliveInterval": "Keep-alive interval (sec)",
"keepAliveIntervalDesc": "How often to ping the server (like ClientAliveInterval). Use 15s or less on flaky Wi‑Fi / NAT"
},
"security": {
"credentials": "Credential protection",
@@ -119,7 +121,7 @@
"clearConfirm": "Clear all known host keys? You will be prompted again on next connect."
},
"about": {
"tagline": "A lightweight native SSH / SFTP ops terminal",
"tagline": "Simple, practical native ops terminal",
"appVersion": "App v{{version}}",
"copyVersion": "Copy version info",
"runtime": "Runtime",
@@ -127,8 +129,9 @@
"localData": "Local data",
"sessionsSettings": "Sessions and settings",
"masterKeyPath": "Master key",
"privacyNote": "Passwords and key passphrases are encrypted with AES-256-GCM in Rust. OpsXShell does not save terminal command history.",
"license": "MIT License · Rust · XTerm.js"
"privacyNote": "Passwords and key passphrases are AES-256-GCM encrypted in Rust. No terminal history, no bastion audit trail.",
"license": "MIT License · Rust · XTerm.js",
"logPath": "Application log"
},
"ai": {
"presets": "Provider presets",
@@ -162,13 +165,42 @@
"apiKeySaveFailed": "Failed to save API key",
"providerNotFound": "Provider not found",
"modelCatalogReadFailed": "Failed to read model catalog",
"catalogUnavailable": "models.dev is unavailable"
"catalogUnavailable": "models.dev is unavailable",
"family": {
"openai_compatible": "OpenAI compatible",
"standalone": "Native APIs",
"plan": "Subscription plans",
"local": "Self-hosted",
"custom": "Custom"
}
},
"family": {
"openai_compatible": "OpenAI compatible",
"standalone": "────────",
"plan": "Plan",
"local": "Self-hosted",
"custom": "Custom"
"account": {
"title": "Account",
"email": "Email",
"emailDesc": "Used for checkout and license claims",
"plan": "Current plan",
"planFree": "Free",
"planYearly": "Pro Yearly",
"planPerpetual": "Pro Perpetual",
"planTrial": "Pro Trial",
"expires": "Expires {{date}}",
"lifetime": "Lifetime",
"devices": "Seats: up to {{count}} devices",
"deviceId": "This device ID",
"saveEmail": "Save email",
"activate": "Activate license",
"pasteLicense": "Paste LIC- license key",
"clear": "Clear local license",
"deactivate": "Deactivate this device",
"upgrade": "Upgrade",
"saved": "Saved",
"activateOk": "Activated",
"deviceList": "Bound devices",
"loadingDevices": "Loading devices…",
"noDevices": "No bound devices",
"thisDevice": "This device",
"removeDevice": "Unbind",
"deviceRemoved": "Device unbound",
"seatFull": "All seats are in use. Unbind another device before activating on a new machine."
}
}