- Updated formatting and indentation in snippets.js for better code clarity.
- Enhanced error handling and notifications in sendToActiveSession method.
- Improved variable resolution logic for command snippets.
- Added new methods for managing session state in state.js.
- Introduced new split pane functionality in terminal.js for better user experience.
- Enhanced modal handling and user notifications across various components.
- Added a latency indicator to the status bar, displaying round-trip time for SSH sessions.
- Implemented functionality to select specific sessions for broadcasting input, allowing users to manage broadcast targets.
- Enhanced SFTP functionality with bookmark management, enabling users to bookmark directories and navigate to them easily.
- Introduced a modal for user-defined snippet variables, allowing dynamic command execution with placeholders.
- Added port forwarding management for SSH sessions, including the ability to start and stop port forwards.
- Improved terminal output export functionality, allowing users to download or copy terminal output to clipboard.
- Implemented context menu styles in components.css.
- Added SFTP transfer progress queue and related styles in sftp.css.
- Enhanced app.js to handle SFTP transfer progress events.
- Updated sftp.js to manage transfer progress and render the transfer queue.
- Modified terminal.js to include context menu shortcuts.
- Adjusted manager.go to emit SFTP transfer progress events with direction.
- Updated sshclient.go to modify terminal modes for better performance.
- Added aria-label and type attributes to the edit button in the sidebar.
- Implemented a mechanism to prevent multiple edit triggers using requestAnimationFrame.
- Updated mousedown event handling to allow real controls while preventing text selection in WKWebView.
feat: add reconnectSession method to TabManager
- Introduced reconnectSession method to facilitate session reconnections by ID.
feat: implement disconnected overlay in terminal
- Added setDisconnectedOverlay method to show/hide a disconnected overlay for terminal sessions.
- Created _ensureDisconnectOverlay method to manage the overlay's existence and content.
feat: extend Service API with file-related functions
- Added FileExists and FileIsPrivateKey functions to check file existence and identify private keys.
- Introduced ListSSHKeys function to retrieve SSH private key paths from the user's .ssh directory.
- Implemented SFTPStat and SFTPUploadData functions for enhanced SFTP operations.
refactor: clean up code formatting and improve readability
- Adjusted code formatting for better readability across various files, including consistent use of line breaks and indentation.
- Implemented drag-and-drop support for file uploads in the terminal.
- Added a modal for users to choose between uploading files or pasting contents.
- Enhanced SFTP browser with a directory picker for selecting upload destinations.
- Introduced methods for handling file uploads and reading file contents from the local system.
- Added a new API endpoint for uploading raw file data to the server.
- Implemented session management improvements to retrieve the current working directory for SSH sessions.
- Updated documentation to include an overview and quick start guide for Nexus Terminal.
Full command snippet library for saving and sending reusable commands:
Backend:
- SQLite migration 003 creates snippets table
- Snippet model with name, command, description, folder, tags
- Store CRUD methods and API endpoints
Frontend:
- SnippetLibrary class with searchable list + detail/editor split view
- Create, edit, delete snippets in modal dialog
- 'Send to Session' button writes command to active terminal
- 'Send Snippet' option in terminal right-click context menu
- Ctrl+Shift+S keyboard shortcut to open library
Broadcast mode sends keystrokes from the active terminal to all other
connected sessions simultaneously. Useful for applying the same
commands across multiple servers.
- Toggle via Ctrl+Shift+B keyboard shortcut or broadcast button in tab bar
- Visual indicator: broadcast button pulses red when active
- Only sends to sessions in 'connected' state
- Notification on toggle
- State stored in app state object
Right-clicking the terminal viewport shows a context menu with:
- Copy (enabled when text is selected)
- Paste (reads from clipboard)
- Select All
- Find (opens the search bar)
- Clear Terminal
- Reset Terminal
Uses the existing context-menu CSS classes for consistency with the
tab context menu. WKWebView mousedown prevention on menu items to
avoid deselecting text before copy.
Uses Wails runtime ClipboardGetText/ClipboardSetText for reliable
clipboard access in WKWebView. Falls back to navigator.clipboard API.
Cmd+C copies selected text (passes through as SIGINT when no selection).
Cmd+V pastes clipboard contents via xterm.js term.paste().
Split Pane Layout:
- Add SplitPaneManager with recursive tree-based pane splitting
- Support horizontal (Cmd+Shift+E) and vertical (Cmd+Shift+D) splits
- Draggable resize dividers with 100px minimum pane size
- Hover-visible close button to unsplit panes
- Session picker in new panes for connecting separate terminals
- Automatic xterm refit on all pane resize operations
Custom Terminal Themes:
- Add themes.js with 8 preset colour schemes: Charcoal (default),
Solarized Dark, Monokai, Nord, Dracula, One Dark, Gruvbox Dark,
Tokyo Night
- Add TerminalTheme preference to AppPreferences model
- Add colour scheme selector to Settings → Terminal tab
- Live-apply theme changes to all active terminals on save
- TerminalManager now uses themed colours instead of hardcoded values
Master Password Strength Meter:
- Add visual strength bar to vault creation dialog
- Entropy estimation based on length, character diversity, uniqueness
- Four levels: Weak (red), Fair (amber), Good (green), Strong (green)
- Animated transitions on strength changes
- Charcoal-themed CSS matching modal design
Root cause: The PTY is allocated at 80x24 during the SSH handshake.
The frontend xterm.js fits correctly to the container (e.g. 120x35),
but term.onResize fires before the backend connection is ready, so the
ResizeSession call is silently rejected. When the connection completes,
fitAddon.fit() sees the terminal already has the right cols/rows and
does NOT fire another onResize event. The PTY stays at 80x24.
Fix: On 'session:state → connected', explicitly read the current
terminal cols/rows and send them to the backend via ResizeSession,
bypassing the onResize event dependency.
Also fix empty-state ordering in addTab() — hide the empty-state
BEFORE activating the panel so the panel-container gets the full
workspace height immediately (empty-state has flex:1 and was stealing
half the height during initial layout).
Simplify createTerminal() fit logic — force a synchronous reflow
via offsetHeight access, then fit immediately.
Sidebar:
- Add -webkit-user-select: none to section headers (WebKit prefix)
- Fix class mismatches: sidebar-section-chevron → section-chevron,
sidebar-section-count → section-count, sidebar-section-list → sidebar-list
Terminal resize:
- Poll container dimensions after creation — retry fit every 50ms
until container has non-zero width/height (up to 20 attempts)
- Add flex: 1 and min-height: 0 to .xterm inside session-panel
so it participates in flex layout correctly
.gitignore:
- Comprehensive rewrite covering build output, Wails bindings,
frontend libs, IDE files, OS metadata, and application data
Theme:
- Replace all purple/blue-tinted backgrounds (#1a1a2e, #1f1f35, etc.)
with true neutral charcoal greys (#1c1c1c, #232323, #2a2a2a, etc.)
- Neutralise text colours (remove blue tint from secondary/tertiary)
- Update xterm.js theme and session overlay to match
Terminal resize:
- Add fitSession(sessionId) method for targeted terminal fitting
- Fire fit at 30ms, 150ms, and 500ms after 'connected' state event
- Ensures terminal fills container even when layout settles late
- Add pencil edit button on each sidebar profile item (visible on hover)
- Fire fitAddon.fit() multiple times after terminal creation (50/150/400ms)
to catch the panel finishing its CSS layout
- Re-fit terminal when session:state transitions to 'connected'
WebKit's WKWebView rejects top-level const/let declarations that shadow
global function names. Since utils.js defines functions like stateLabel()
at the global scope (non-module scripts), and later files destructure
the same names from window.NexusTerminal using const, WebKit throws:
SyntaxError: Can't create duplicate variable that shadows a global property
Fix: wrap every JS file in an IIFE so all declarations are function-scoped.
Also remove temporary diagnostic instrumentation.
Replace ES module import/export with a global namespace pattern to avoid
silent failures in the Wails v2 WKWebView which does not reliably support
<script type="module"> tags.
- Remove all import/export statements from JS files
- Register each module's exports on window.NexusTerminal
- Destructure dependencies from window.NexusTerminal at file top
- Load all scripts in dependency order in index.html as plain <script> tags