- Added a new state for managing search expansion and a ref for the search input.
- Implemented focus and selection behavior for the search input when expanded.
- Enhanced keyboard navigation to handle Escape key for collapsing the search.
- Updated the search input to be read-only until focused, allowing for a cleaner UI.
- Introduced a clear search button that resets the filter text and collapses the search when clicked.
- Introduced preventWindowControlMouseFocus to prevent focus shift on mouse down for window control buttons.
- Updated Header component to use this function on minimize, maximize, and close button mouse down events.
- Added tests for window control focus behavior to ensure expected functionality.
- Revised the English, Korean, Simplified Chinese, and Traditional Chinese translations for the reconnectRestoreCwdDesc key to clarify the behavior of reconnecting to the last known working directory in SSH sessions.
- Updated the default setting for reconnecting to the previous working directory from true to false across various components and settings.
- Adjusted related tests to reflect the new default behavior.
- Moved dynamic tab title components within LocalTerminal and SshForm for improved structure and consistency.
- Updated the layout to ensure proper alignment and spacing for better user experience.
- Retained functionality of dynamic tab title switches in both components.
- Enhanced the styling of the CodeMirror search panel by removing the light button gradient and implementing theme colors for buttons and inputs.
- Added focus ring and checkbox accent styles to improve accessibility and visual consistency.
- Updated tests to verify the new styling rules for the search panel.
- Updated the file drop logic in both useExternalFileDrop and useTerminalFileDrop hooks to utilize isDropPositionTopmostWithinElement, enhancing accuracy in determining if a drop event occurs over the intended target.
- Added unit tests for the new isDropPositionTopmostWithinElement function to ensure correct behavior in various scenarios, including covered elements and position validation.
- Added new localized strings for MCP unavailability errors in English, Korean, Simplified Chinese, and Traditional Chinese.
- Enhanced user experience by providing clear error messages related to Claude Code and Codex fallback scenarios.
- Introduced `classifyAIStreamControlEvent` to categorize AI stream events as "warning", "done", or "error", improving event management.
- Updated `AIAssistantPanel` to handle new event types, displaying appropriate warnings and error messages based on the event kind.
- Added localization for external agent MCP fallback and startup errors in multiple languages.
- Created tests for the new event classification logic and ensured proper handling of localized error messages.
When the terminal viewport is scrolled up and the user has a selection
over scrollback output, key presses were sent via terminal.input(data,
false) to preserve the selection (by design, it is only cleared on mouse
click). However, xterm.js gates both selection clearing and
scrollOnUserInput behind the same wasUserInput flag, so the viewport
never scrolled back to the cursor and the user could not see what they
typed.
Keep the selection-preservation behavior but explicitly scroll to the
bottom when the viewport is not at the cursor, replicating xterm's
scrollOnUserInput for every key path in the selection branch
(printable input, backspace/delete, enter, arrows, ctrl/alt combos).
Fixes#518
- Added a call to `focusOpenTabTerminal(tab)` in the `onTabChange` handler to ensure the terminal focuses on the active tab when changed, enhancing user experience.
- Added support for snapshot restoration in the terminal, allowing for smoother recovery of terminal state during hibernation and reconnection.
- Updated the `useTerminalRefreshEffects` hook to suppress refreshes while a snapshot is being restored, improving performance and user experience.
- Introduced a new `createXTerminalSnapshotRestoreController` to manage the snapshot restoration process, including phases for replaying and finalizing the restoration.
- Enhanced tests for terminal refresh effects and added new tests for snapshot restoration to ensure correct behavior during terminal state transitions.
- Added new translation keys for enabling full access and updated descriptions for permission modes in English, Korean, Simplified Chinese, and Traditional Chinese locale files.
- Enhanced existing translations for external MCP descriptions and permission confirmations to improve clarity and user understanding.
- Added support for handling MCP session open requests, including the ability to respond to session creation with success or error messages.
- Introduced new permission modes for AI interactions, including "full_access", and updated the permission handling logic to accommodate these changes.
- Refactored the AiPermissionSelect component to manage permission modes more effectively and added corresponding tests to ensure functionality.
- Updated translations for new permission modes and improved the UI to reflect changes in session handling.
- Introduced unit tests for the `useTerminalRefreshEffects` hook to validate terminal repainting behavior and texture invalidation on DPI scale changes.
- Updated the `useTerminalRefreshEffects` hook to prevent unnecessary texture atlas clearing during active terminal refreshes.
- Added a new `shouldSuspendKeywordHighlighter` function to manage keyword highlighting based on terminal visibility and performance mode, with corresponding tests to ensure correct behavior.
- Enhanced the `useKeywordHighlighter` hook to support session-specific keyword highlighting and cache management.
- Refactored performance configurations for keyword highlighting to optimize refresh rates and decoration limits.
The builtin file editor rendered selections in a pale white that
obscured file content, unlike the terminal.
- Publish the terminal theme's selectionBackground as the
--df-terminal-selection CSS variable and use it (with !important)
for .cm-selectionBackground, so the editor selection matches the
terminal selection color instead of CodeMirror's #d7d4f0 default.
- Move the .cm-activeLine highlight onto a ::before pseudo-element
with z-index -3 (below the selection layer at -2) and clear the
element background, so the active line highlight no longer washes
out the selection on the cursor line (visible when selecting
upwards, where the top line holds the cursor).
Add regression tests for the published CSS variable and the compiled
selection/active-line rules.
- Updated the TunnelRow component to improve the layout by ensuring the name display is properly truncated and responsive.
- Modified the TunnelRuntimeBadge component to include additional styling for better visual consistency and to prevent text overflow.
- Removed outdated right-click paste translations and added new keys for terminal right-click action settings in English, Korean, Simplified Chinese, and Traditional Chinese locale files.
- Updated descriptions to reflect the new options for right-click behavior in the terminal.
- Introduced a new setting for terminal right-click actions, allowing users to choose between "none", "menu", and "paste" options.
- Updated the InteractionTab component to include a tabbed interface for selecting the right-click action.
- Refactored the TerminalContextMenu to handle the new right-click action logic, ensuring appropriate behavior based on user selection.
- Added tests for the terminal right-click action functionality to validate expected behaviors and interactions.
- Migrated legacy right-click paste settings to the new terminal right-click action configuration.
- Modified the translation for "Allow for this MCP session" to "Allow for this connection" in English, Korean, Simplified Chinese, and Traditional Chinese locale files to enhance clarity and consistency in user messaging.
- Added `useMcpActiveSession` hook to manage and report the active MCP session ID.
- Integrated the hook into the main `App` component to ensure active session updates.
- Created tests for the `useMcpActiveSession` hook to validate session reporting behavior.
- Introduced `report_mcp_active_session` command in the Tauri backend to handle session updates from the frontend.
- Updated MCP tool definitions to include new capabilities and ensure proper session management.
- Added new translation keys for SFTP pipeline depth configuration in English, Korean, Simplified Chinese, and Traditional Chinese locale files.
- Included descriptions to enhance user understanding of the pipeline depth setting and its impact on SFTP performance.
- Introduced a new setting for SFTP pipeline depth in the SshForm component, allowing users to specify the depth for single-file SFTP requests.
- Updated SftpSettings interface and backend to support the new pipeline depth option, including validation for minimum and maximum values.
- Enhanced the SFTP backend to utilize the pipeline depth setting during file transfers, improving performance and control over SFTP operations.
- Added tests to ensure correct handling of pipeline depth configurations and their effects on transfer behavior.
- Reintroduced the 'sshConfigSource' translation key in English, Korean, Simplified Chinese, and Traditional Chinese locale files to ensure consistent localization for SSH configuration imports.
- P1: Add whoami 1.5.2 to Cargo.lock (was missing, breaks --locked builds)
- P1: Fix auth mode from invalid 'publicKey' to valid 'agent' for imported
connections with IdentityFile (key files need manual registration in
nyaterm's key store; identity path noted in description)
- P1: Wire ProxyJump relationships during import - jump hosts imported
first, their IDs linked via ConnectionNetwork.proxy_jump_id on targets
- P1: Localize SSH Config source label in all 4 locale files
(en, zh-CN, zh-TW, ko) per AGENTS.md L115-L119
- P2: Fix relative Include resolution - base_dir now derived from
config_path.parent() (~/.ssh/) instead of config_path itself
- Remove unused ConnectionNetwork import
- Add newline at EOF in cmd/ssh_config.rs
- Add test for relative include base_dir derivation
Add ability to import sessions from ~/.ssh/config into nyaterm.
Backend (Rust):
- New core/ssh_config module: parses OpenSSH config with Host patterns
(wildcards, negation), HostName, Port, User, IdentityFile, ProxyJump
(single and multi-hop chains), HostKeyAlias, and Include directives
(recursive with cycle detection and glob support)
- First-match-wins option resolution matching OpenSSH semantics
- New cmd/ssh_config module with 4 Tauri commands: list_ssh_config_hosts,
get_ssh_config, resolve_ssh_host, import_ssh_config_hosts
- Import skips duplicates by name, creates SavedConnection entries
with proper ConnectionType::Ssh config
- 5 unit tests covering glob matching, negation, proxy jump chains,
first-match-wins, and wildcard filtering
Frontend (React/TypeScript):
- New 'SSH Config' source in ImportDialog (no file picker needed,
reads ~/.ssh/config directly)
- New types: SshConfigEntry, SshConfigHop in global.d.ts
- Import flow: click SSH Config in import dialog, all concrete hosts
are imported as saved connections, duplicates skipped
Example ~/.ssh/config:
Host bastion
HostName bastion.example.com
User jumpuser
Host internal-db
HostName 10.0.0.42
User admin
ProxyJump bastion
IdentityFile ~/.ssh/db_key
Host deep-server
HostName 192.168.5.100
User root
ProxyJump bastion,internal-gateway
Wildcard patterns (web-*) are excluded. Only concrete host aliases
are imported. No real server data transmitted, reads local file only.