diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json
index cbb7a41..6aa9115 100644
--- a/src-tauri/capabilities/default.json
+++ b/src-tauri/capabilities/default.json
@@ -1,7 +1,7 @@
{
"identifier": "default",
"description": "Default capabilities for the main Wraith window",
- "windows": ["main", "tool-*"],
+ "windows": ["main", "tool-*", "detached-*", "editor-*", "help-*"],
"permissions": [
"core:default",
"core:event:default",
diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json
index eb80d06..df63b60 100644
--- a/src-tauri/gen/schemas/capabilities.json
+++ b/src-tauri/gen/schemas/capabilities.json
@@ -1 +1 @@
-{"default":{"identifier":"default","description":"Default capabilities for the main Wraith window","local":true,"windows":["main","tool-*"],"permissions":["core:default","core:event:default","core:window:default","core:window:allow-create","core:webview:default","core:webview:allow-create-webview-window","shell:allow-open","updater:default"]}}
\ No newline at end of file
+{"default":{"identifier":"default","description":"Default capabilities for the main Wraith window","local":true,"windows":["main","tool-*","detached-*","editor-*","help-*"],"permissions":["core:default","core:event:default","core:window:default","core:window:allow-create","core:webview:default","core:webview:allow-create-webview-window","shell:allow-open","updater:default"]}}
\ No newline at end of file
diff --git a/src/components/session/SessionContainer.vue b/src/components/session/SessionContainer.vue
index 751d501..0b65c37 100644
--- a/src/components/session/SessionContainer.vue
+++ b/src/components/session/SessionContainer.vue
@@ -91,16 +91,17 @@ function setTerminalRef(sessionId: string, el: unknown): void {
const sessionStore = useSessionStore();
+// Only render sessions that are active (not detached to separate windows)
const sshSessions = computed(() =>
- sessionStore.sessions.filter((s) => s.protocol === "ssh"),
+ sessionStore.sessions.filter((s) => s.protocol === "ssh" && s.active),
);
const localSessions = computed(() =>
- sessionStore.sessions.filter((s) => s.protocol === "local"),
+ sessionStore.sessions.filter((s) => s.protocol === "local" && s.active),
);
const rdpSessions = computed(() =>
- sessionStore.sessions.filter((s) => s.protocol === "rdp"),
+ sessionStore.sessions.filter((s) => s.protocol === "rdp" && s.active),
);
/**
diff --git a/src/components/tools/HelpWindow.vue b/src/components/tools/HelpWindow.vue
new file mode 100644
index 0000000..b14dcb5
--- /dev/null
+++ b/src/components/tools/HelpWindow.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
Getting Started with Wraith
+
Wraith is a native desktop SSH/SFTP/RDP client with an integrated AI copilot.
+
+
Creating a Connection
+
+ - Click File → New Connection or the + Host button in the sidebar
+ - Enter hostname, port, and protocol (SSH or RDP)
+ - Optionally link a credential from the vault
+ - Double-click the connection to connect
+
+
+
Quick Connect
+
Type user@host:port in the Quick Connect bar and press Enter.
+
+
AI Copilot
+
Press Ctrl+Shift+G to open the AI copilot panel. Select a shell, click Launch, and run your AI CLI (Claude Code, Gemini, Codex).
+
Configure one-click launch presets in Settings → AI Copilot.
+
+
Local Terminals
+
Click the + button in the tab bar to open a local shell (PowerShell, CMD, Git Bash, WSL, bash, zsh).
+
+
SFTP Browser
+
Switch to the SFTP tab in the sidebar. It follows the active SSH session and tracks the current working directory.
+
Right-click files for Edit, Download, Rename, Delete.
+
+
Tab Management
+
+ - Drag tabs to reorder
+ - Right-click tab → Detach to Window (pop out to separate window)
+ - Close the detached window to reattach
+ - Tabs pulse blue when there's new activity in the background
+
+
+
Remote Monitoring
+
Every SSH session shows a monitoring bar at the bottom with CPU, RAM, disk, and network stats — polled every 5 seconds. No agent needed.
+
+
+
+
+
Keyboard Shortcuts
+
+ | Shortcut | Action |
+
+ | Ctrl+K | Command Palette |
+ | Ctrl+Shift+G | Toggle AI Copilot |
+ | Ctrl+B | Toggle Sidebar |
+ | Ctrl+W | Close Active Tab |
+ | Ctrl+Tab | Next Tab |
+ | Ctrl+Shift+Tab | Previous Tab |
+ | Ctrl+1-9 | Switch to Tab N |
+ | Ctrl+F | Find in Terminal |
+ | Ctrl+S | Save (in editor windows) |
+
+
+
+
Terminal
+
+ | Action | How |
+
+ | Copy | Select text (auto-copies) |
+ | Paste | Right-click |
+
+
+
+
+
+
+
MCP Integration (AI Tool Access)
+
Wraith includes an MCP (Model Context Protocol) server that gives AI CLI tools programmatic access to your active sessions.
+
+
Setup
+
The MCP bridge binary is automatically downloaded to:
+
{{ bridgePath }}
+
Register with Claude Code:
+
claude mcp add wraith -- "{{ bridgePath }}"
+
+
Available MCP Tools (18)
+
+
Session Management
+
+ | Tool | Description |
+
+ list_sessions | List all active SSH/RDP/PTY sessions |
+
+
+
+
Terminal
+
+ | Tool | Description |
+
+ terminal_read | Read recent terminal output (ANSI stripped) |
+ terminal_execute | Run a command and capture output |
+ terminal_screenshot | Capture RDP frame as PNG |
+
+
+
+
SFTP
+
+ | Tool | Description |
+
+ sftp_list | List remote directory |
+ sftp_read | Read remote file |
+ sftp_write | Write remote file |
+
+
+
+
Network
+
+ | Tool | Description |
+
+ network_scan | ARP + ping sweep subnet discovery |
+ port_scan | TCP port scan |
+ ping | Ping a host |
+ traceroute | Traceroute to host |
+ dns_lookup | DNS query (A, MX, TXT, etc.) |
+ whois | Whois lookup |
+ wake_on_lan | Send WoL magic packet |
+ bandwidth_test | Internet speed test |
+
+
+
+
Utilities (no session needed)
+
+ | Tool | Description |
+
+ subnet_calc | Subnet calculator |
+ generate_ssh_key | Generate SSH key pair |
+ generate_password | Generate secure password |
+
+
+
+
How It Works
+
+ - Wraith starts an HTTP server on
localhost (random port)
+ - Port written to
mcp-port in data directory
+ - Bridge binary reads the port and proxies JSON-RPC over stdio
+ - AI CLI spawns the bridge as an MCP server
+
+
+
+
+
+
About Wraith
+
WRAITH
+
Exists everywhere, all at once.
+
+
+
+ | Version | {{ version }} |
+ | Runtime | Tauri v2 + Rust |
+ | Frontend | Vue 3 + TypeScript |
+ | Terminal | xterm.js 6 |
+ | SSH | russh 0.48 |
+ | RDP | ironrdp 0.14 |
+ | License | Proprietary |
+ | Publisher | Vigilance Cyber / Vigilsynth |
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/tools/ToolWindow.vue b/src/components/tools/ToolWindow.vue
index 64e2aca..edf1900 100644
--- a/src/components/tools/ToolWindow.vue
+++ b/src/components/tools/ToolWindow.vue
@@ -13,6 +13,7 @@
+
Unknown tool: {{ tool }}
@@ -33,6 +34,7 @@ import DockerPanel from "./DockerPanel.vue";
import FileEditor from "./FileEditor.vue";
import SshKeyGen from "./SshKeyGen.vue";
import PasswordGen from "./PasswordGen.vue";
+import HelpWindow from "./HelpWindow.vue";
defineProps<{
tool: string;
diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue
index f66ad5b..ba707f9 100644
--- a/src/layouts/MainLayout.vue
+++ b/src/layouts/MainLayout.vue
@@ -141,6 +141,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -309,6 +350,7 @@ const sessionContainer = ref | null>(null)
const showFileMenu = ref(false);
const showToolsMenu = ref(false);
+const showHelpMenu = ref(false);
function closeFileMenuDeferred(): void {
setTimeout(() => { showFileMenu.value = false; }, 150);
@@ -318,6 +360,24 @@ function closeToolsMenuDeferred(): void {
setTimeout(() => { showToolsMenu.value = false; }, 150);
}
+function closeHelpMenuDeferred(): void {
+ setTimeout(() => { showHelpMenu.value = false; }, 150);
+}
+
+async function handleHelpAction(page: string): Promise {
+ showHelpMenu.value = false;
+ const { WebviewWindow } = await import("@tauri-apps/api/webviewWindow");
+ const label = `help-${page}-${Date.now()}`;
+ new WebviewWindow(label, {
+ title: `Wraith — Help`,
+ width: 750,
+ height: 600,
+ resizable: true,
+ center: true,
+ url: `index.html#/tool/help?page=${page}`,
+ });
+}
+
async function handleToolAction(tool: string): Promise {
showToolsMenu.value = false;