Full Code of xpipe-io/xpipe for AI

master 0194ed313d82 cached
1457 files
6.4 MB
1.8M tokens
7765 symbols
1 requests
Download .txt
Showing preview only (7,075K chars total). Download the full file or copy to clipboard to get everything.
Repository: xpipe-io/xpipe
Branch: master
Commit: 0194ed313d82
Files: 1457
Total size: 6.4 MB

Directory structure:
gitextract_ign71aq1/

├── .gitattributes
├── .github/
│   └── dependabot.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── app/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── io/
│       │   │   │   └── xpipe/
│       │   │   │       └── app/
│       │   │   │           ├── Main.java
│       │   │   │           ├── action/
│       │   │   │           │   ├── AbstractAction.java
│       │   │   │           │   ├── ActionConfigComp.java
│       │   │   │           │   ├── ActionConfirmComp.java
│       │   │   │           │   ├── ActionConfirmation.java
│       │   │   │           │   ├── ActionJacksonMapper.java
│       │   │   │           │   ├── ActionPickComp.java
│       │   │   │           │   ├── ActionProvider.java
│       │   │   │           │   ├── ActionShortcutComp.java
│       │   │   │           │   ├── ActionUrls.java
│       │   │   │           │   ├── LauncherUrlProvider.java
│       │   │   │           │   ├── SerializableAction.java
│       │   │   │           │   ├── StoreContextAction.java
│       │   │   │           │   └── XPipeUrlProvider.java
│       │   │   │           ├── beacon/
│       │   │   │           │   ├── AppBeaconCache.java
│       │   │   │           │   ├── AppBeaconServer.java
│       │   │   │           │   ├── BeaconRequestHandler.java
│       │   │   │           │   ├── BeaconSession.java
│       │   │   │           │   ├── BeaconShellSession.java
│       │   │   │           │   ├── BlobManager.java
│       │   │   │           │   ├── impl/
│       │   │   │           │   │   ├── ActionExchangeImpl.java
│       │   │   │           │   │   ├── AskpassExchangeImpl.java
│       │   │   │           │   │   ├── CategoryAddExchangeImpl.java
│       │   │   │           │   │   ├── CategoryInfoExchangeImpl.java
│       │   │   │           │   │   ├── CategoryQueryExchangeImpl.java
│       │   │   │           │   │   ├── CategoryRemoveExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionAddExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionInfoExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionQueryExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionRefreshExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionRemoveExchangeImpl.java
│       │   │   │           │   │   ├── DaemonFocusExchangeImpl.java
│       │   │   │           │   │   ├── DaemonModeExchangeImpl.java
│       │   │   │           │   │   ├── DaemonOpenExchangeImpl.java
│       │   │   │           │   │   ├── DaemonStatusExchangeImpl.java
│       │   │   │           │   │   ├── DaemonStopExchangeImpl.java
│       │   │   │           │   │   ├── DaemonVersionExchangeImpl.java
│       │   │   │           │   │   ├── FsBlobExchangeImpl.java
│       │   │   │           │   │   ├── FsReadExchangeImpl.java
│       │   │   │           │   │   ├── FsScriptExchangeImpl.java
│       │   │   │           │   │   ├── FsWriteExchangeImpl.java
│       │   │   │           │   │   ├── HandshakeExchangeImpl.java
│       │   │   │           │   │   ├── SecretDecryptExchangeImpl.java
│       │   │   │           │   │   ├── SecretEncryptExchangeImpl.java
│       │   │   │           │   │   ├── ShellExecExchangeImpl.java
│       │   │   │           │   │   ├── ShellStartExchangeImpl.java
│       │   │   │           │   │   ├── ShellStopExchangeImpl.java
│       │   │   │           │   │   ├── SshLaunchExchangeImpl.java
│       │   │   │           │   │   ├── TerminalExternalLaunchExchangeImpl.java
│       │   │   │           │   │   ├── TerminalLaunchExchangeImpl.java
│       │   │   │           │   │   ├── TerminalPrepareExchangeImpl.java
│       │   │   │           │   │   ├── TerminalRegisterExchangeImpl.java
│       │   │   │           │   │   └── TerminalWaitExchangeImpl.java
│       │   │   │           │   └── mcp/
│       │   │   │           │       ├── AppMcpServer.java
│       │   │   │           │       ├── HttpStreamableServerTransportProvider.java
│       │   │   │           │       ├── McpSchemaFiles.java
│       │   │   │           │       ├── McpToolHandler.java
│       │   │   │           │       └── McpTools.java
│       │   │   │           ├── browser/
│       │   │   │           │   ├── BrowserAbstractSessionModel.java
│       │   │   │           │   ├── BrowserFileChooserSessionComp.java
│       │   │   │           │   ├── BrowserFileChooserSessionModel.java
│       │   │   │           │   ├── BrowserFullSessionComp.java
│       │   │   │           │   ├── BrowserFullSessionModel.java
│       │   │   │           │   ├── BrowserSessionTab.java
│       │   │   │           │   ├── BrowserSessionTabsComp.java
│       │   │   │           │   ├── BrowserStoreSessionTab.java
│       │   │   │           │   ├── action/
│       │   │   │           │   │   ├── BrowserAction.java
│       │   │   │           │   │   ├── BrowserActionProvider.java
│       │   │   │           │   │   ├── BrowserActionProviders.java
│       │   │   │           │   │   └── impl/
│       │   │   │           │   │       ├── ApplyFileEditActionProvider.java
│       │   │   │           │   │       ├── BrowseInNativeManagerActionProvider.java
│       │   │   │           │   │       ├── ChgrpActionProvider.java
│       │   │   │           │   │       ├── ChmodActionProvider.java
│       │   │   │           │   │       ├── ChownActionProvider.java
│       │   │   │           │   │       ├── ComputeDirectorySizesActionProvider.java
│       │   │   │           │   │       ├── DeleteActionProvider.java
│       │   │   │           │   │       ├── MoveFileActionProvider.java
│       │   │   │           │   │       ├── NewDirectoryActionProvider.java
│       │   │   │           │   │       ├── NewFileActionProvider.java
│       │   │   │           │   │       ├── NewLinkActionProvider.java
│       │   │   │           │   │       ├── OpenDirectoryActionProvider.java
│       │   │   │           │   │       ├── OpenFileDefaultActionProvider.java
│       │   │   │           │   │       ├── OpenFileNativeDetailsActionProvider.java
│       │   │   │           │   │       ├── OpenFileNativeManagerActionProvider.java
│       │   │   │           │   │       ├── OpenFileWithActionProvider.java
│       │   │   │           │   │       ├── RunCommandInBackgroundActionProvider.java
│       │   │   │           │   │       ├── RunCommandInBrowserActionProvider.java
│       │   │   │           │   │       ├── RunCommandInTerminalActionProvider.java
│       │   │   │           │   │       └── TransferFilesActionProvider.java
│       │   │   │           │   ├── file/
│       │   │   │           │   │   ├── BrowserBreadcrumbBar.java
│       │   │   │           │   │   ├── BrowserClipboard.java
│       │   │   │           │   │   ├── BrowserConnectionListComp.java
│       │   │   │           │   │   ├── BrowserConnectionListFilterComp.java
│       │   │   │           │   │   ├── BrowserContextMenu.java
│       │   │   │           │   │   ├── BrowserDialogs.java
│       │   │   │           │   │   ├── BrowserEntry.java
│       │   │   │           │   │   ├── BrowserFileDuplicates.java
│       │   │   │           │   │   ├── BrowserFileInput.java
│       │   │   │           │   │   ├── BrowserFileListComp.java
│       │   │   │           │   │   ├── BrowserFileListCompEntry.java
│       │   │   │           │   │   ├── BrowserFileListFilterComp.java
│       │   │   │           │   │   ├── BrowserFileListModel.java
│       │   │   │           │   │   ├── BrowserFileListNameCell.java
│       │   │   │           │   │   ├── BrowserFileOpener.java
│       │   │   │           │   │   ├── BrowserFileOutput.java
│       │   │   │           │   │   ├── BrowserFileOverviewComp.java
│       │   │   │           │   │   ├── BrowserFileSelectionListComp.java
│       │   │   │           │   │   ├── BrowserFileSystemHelper.java
│       │   │   │           │   │   ├── BrowserFileSystemHistory.java
│       │   │   │           │   │   ├── BrowserFileSystemSavedState.java
│       │   │   │           │   │   ├── BrowserFileSystemTabComp.java
│       │   │   │           │   │   ├── BrowserFileSystemTabModel.java
│       │   │   │           │   │   ├── BrowserFileTransferMode.java
│       │   │   │           │   │   ├── BrowserFileTransferOperation.java
│       │   │   │           │   │   ├── BrowserGreetingComp.java
│       │   │   │           │   │   ├── BrowserHistorySavedState.java
│       │   │   │           │   │   ├── BrowserHistorySavedStateImpl.java
│       │   │   │           │   │   ├── BrowserHistoryTabComp.java
│       │   │   │           │   │   ├── BrowserHistoryTabModel.java
│       │   │   │           │   │   ├── BrowserLocalFileSystem.java
│       │   │   │           │   │   ├── BrowserNavBarComp.java
│       │   │   │           │   │   ├── BrowserOverviewComp.java
│       │   │   │           │   │   ├── BrowserQuickAccessButtonComp.java
│       │   │   │           │   │   ├── BrowserQuickAccessContextMenu.java
│       │   │   │           │   │   ├── BrowserStatusBarComp.java
│       │   │   │           │   │   ├── BrowserTerminalDockTabModel.java
│       │   │   │           │   │   ├── BrowserTransferComp.java
│       │   │   │           │   │   ├── BrowserTransferModel.java
│       │   │   │           │   │   └── BrowserTransferProgress.java
│       │   │   │           │   ├── icon/
│       │   │   │           │   │   ├── BrowserIconDirectoryType.java
│       │   │   │           │   │   ├── BrowserIconFileType.java
│       │   │   │           │   │   ├── BrowserIconManager.java
│       │   │   │           │   │   ├── BrowserIconVariant.java
│       │   │   │           │   │   └── BrowserIcons.java
│       │   │   │           │   └── menu/
│       │   │   │           │       ├── BrowserApplicationPathMenuProvider.java
│       │   │   │           │       ├── BrowserMenuBranchProvider.java
│       │   │   │           │       ├── BrowserMenuCategory.java
│       │   │   │           │       ├── BrowserMenuItemProvider.java
│       │   │   │           │       ├── BrowserMenuLeafProvider.java
│       │   │   │           │       ├── BrowserMenuProviders.java
│       │   │   │           │       ├── FileTypeMenuProvider.java
│       │   │   │           │       ├── MultiExecuteMenuProvider.java
│       │   │   │           │       └── impl/
│       │   │   │           │           ├── BackMenuProvider.java
│       │   │   │           │           ├── BrowseInNativeManagerMenuProvider.java
│       │   │   │           │           ├── ChgrpMenuProvider.java
│       │   │   │           │           ├── ChmodMenuProvider.java
│       │   │   │           │           ├── ChownMenuProvider.java
│       │   │   │           │           ├── ComputeDirectorySizesMenuProvider.java
│       │   │   │           │           ├── CopyMenuProvider.java
│       │   │   │           │           ├── CopyPathMenuProvider.java
│       │   │   │           │           ├── DeleteMenuProvider.java
│       │   │   │           │           ├── DownloadMenuProvider.java
│       │   │   │           │           ├── EditFileMenuProvider.java
│       │   │   │           │           ├── FollowLinkMenuProvider.java
│       │   │   │           │           ├── ForwardMenuProvider.java
│       │   │   │           │           ├── GradleRunMenuProvider.java
│       │   │   │           │           ├── JarMenuProvider.java
│       │   │   │           │           ├── JavapMenuProvider.java
│       │   │   │           │           ├── NewItemMenuProvider.java
│       │   │   │           │           ├── OpenDirectoryInNewTabMenuProvider.java
│       │   │   │           │           ├── OpenDirectoryMenuProvider.java
│       │   │   │           │           ├── OpenFileDefaultMenuProvider.java
│       │   │   │           │           ├── OpenFileWithMenuProvider.java
│       │   │   │           │           ├── OpenNativeFileDetailsMenuProvider.java
│       │   │   │           │           ├── OpenTerminalInDirectoryMenuProvider.java
│       │   │   │           │           ├── PasteMenuProvider.java
│       │   │   │           │           ├── RefreshDirectoryMenuProvider.java
│       │   │   │           │           ├── RenameMenuProvider.java
│       │   │   │           │           ├── RunFileMenuProvider.java
│       │   │   │           │           └── compress/
│       │   │   │           │               ├── BaseUntarMenuProvider.java
│       │   │   │           │               ├── BaseUnzipUnixMenuProvider.java
│       │   │   │           │               ├── BaseUnzipWindowsActionProvider.java
│       │   │   │           │               ├── CompressMenuProvider.java
│       │   │   │           │               ├── TarActionProvider.java
│       │   │   │           │               ├── UntarActionProvider.java
│       │   │   │           │               ├── UntarDirectoryMenuProvider.java
│       │   │   │           │               ├── UntarGzDirectoryMenuProvider.java
│       │   │   │           │               ├── UntarGzHereMenuProvider.java
│       │   │   │           │               ├── UntarHereMenuProvider.java
│       │   │   │           │               ├── UnzipActionProvider.java
│       │   │   │           │               ├── UnzipDirectoryUnixMenuProvider.java
│       │   │   │           │               ├── UnzipDirectoryWindowsActionProvider.java
│       │   │   │           │               ├── UnzipHereUnixMenuProvider.java
│       │   │   │           │               ├── UnzipHereWindowsActionProvider.java
│       │   │   │           │               └── ZipActionProvider.java
│       │   │   │           ├── comp/
│       │   │   │           │   ├── BaseRegionBuilder.java
│       │   │   │           │   ├── RegionBuilder.java
│       │   │   │           │   ├── RegionDescriptor.java
│       │   │   │           │   ├── RegionStructure.java
│       │   │   │           │   ├── RegionStructureBuilder.java
│       │   │   │           │   ├── SimpleRegionBuilder.java
│       │   │   │           │   ├── augment/
│       │   │   │           │   │   └── ContextMenuAugment.java
│       │   │   │           │   └── base/
│       │   │   │           │       ├── AnchorComp.java
│       │   │   │           │       ├── AppLayoutComp.java
│       │   │   │           │       ├── AppMainWindowContentComp.java
│       │   │   │           │       ├── ButtonComp.java
│       │   │   │           │       ├── ChoiceComp.java
│       │   │   │           │       ├── ChoicePaneComp.java
│       │   │   │           │       ├── ComboTextFieldComp.java
│       │   │   │           │       ├── ContextualFileReferenceChoiceComp.java
│       │   │   │           │       ├── ContextualFileReferenceSync.java
│       │   │   │           │       ├── CountComp.java
│       │   │   │           │       ├── DelayedInitComp.java
│       │   │   │           │       ├── FilterComp.java
│       │   │   │           │       ├── FontIconComp.java
│       │   │   │           │       ├── HorizontalComp.java
│       │   │   │           │       ├── IconButtonComp.java
│       │   │   │           │       ├── InputGroupComp.java
│       │   │   │           │       ├── IntComboFieldComp.java
│       │   │   │           │       ├── IntFieldComp.java
│       │   │   │           │       ├── IntegratedTextAreaComp.java
│       │   │   │           │       ├── IntroComp.java
│       │   │   │           │       ├── IntroListComp.java
│       │   │   │           │       ├── LabelComp.java
│       │   │   │           │       ├── LazyTextFieldComp.java
│       │   │   │           │       ├── LeftSplitPaneComp.java
│       │   │   │           │       ├── ListBoxViewComp.java
│       │   │   │           │       ├── ListSelectorComp.java
│       │   │   │           │       ├── LoadingIconComp.java
│       │   │   │           │       ├── LoadingOverlayComp.java
│       │   │   │           │       ├── MarkdownComp.java
│       │   │   │           │       ├── MarkdownEditorComp.java
│       │   │   │           │       ├── ModalButton.java
│       │   │   │           │       ├── ModalOverlay.java
│       │   │   │           │       ├── ModalOverlayComp.java
│       │   │   │           │       ├── ModalOverlayContentComp.java
│       │   │   │           │       ├── ModalOverlayStackComp.java
│       │   │   │           │       ├── MultiContentComp.java
│       │   │   │           │       ├── OptionsComp.java
│       │   │   │           │       ├── PrettyImageComp.java
│       │   │   │           │       ├── PrettyImageHelper.java
│       │   │   │           │       ├── ScrollComp.java
│       │   │   │           │       ├── SecretFieldComp.java
│       │   │   │           │       ├── SideMenuBarComp.java
│       │   │   │           │       ├── SimpleTitledPaneComp.java
│       │   │   │           │       ├── StackComp.java
│       │   │   │           │       ├── TextAreaComp.java
│       │   │   │           │       ├── TextFieldComp.java
│       │   │   │           │       ├── TileButtonComp.java
│       │   │   │           │       ├── ToggleGroupComp.java
│       │   │   │           │       ├── ToggleSwitchComp.java
│       │   │   │           │       ├── TooltipHelper.java
│       │   │   │           │       └── VerticalComp.java
│       │   │   │           ├── core/
│       │   │   │           │   ├── App.java
│       │   │   │           │   ├── AppAotTrain.java
│       │   │   │           │   ├── AppArguments.java
│       │   │   │           │   ├── AppCache.java
│       │   │   │           │   ├── AppConfigurationDialog.java
│       │   │   │           │   ├── AppDataLock.java
│       │   │   │           │   ├── AppDesktopIntegration.java
│       │   │   │           │   ├── AppDisplayScale.java
│       │   │   │           │   ├── AppExecutableCache.java
│       │   │   │           │   ├── AppExtensionManager.java
│       │   │   │           │   ├── AppFileWatcher.java
│       │   │   │           │   ├── AppFont.java
│       │   │   │           │   ├── AppFontSizes.java
│       │   │   │           │   ├── AppGreetingsDialog.java
│       │   │   │           │   ├── AppI18n.java
│       │   │   │           │   ├── AppI18nData.java
│       │   │   │           │   ├── AppImages.java
│       │   │   │           │   ├── AppInstallation.java
│       │   │   │           │   ├── AppInstance.java
│       │   │   │           │   ├── AppLayoutModel.java
│       │   │   │           │   ├── AppLocalTemp.java
│       │   │   │           │   ├── AppLogs.java
│       │   │   │           │   ├── AppNames.java
│       │   │   │           │   ├── AppOpenArguments.java
│       │   │   │           │   ├── AppPreloader.java
│       │   │   │           │   ├── AppProperties.java
│       │   │   │           │   ├── AppResources.java
│       │   │   │           │   ├── AppRestart.java
│       │   │   │           │   ├── AppSid.java
│       │   │   │           │   ├── AppStyle.java
│       │   │   │           │   ├── AppSystemInfo.java
│       │   │   │           │   ├── AppTheme.java
│       │   │   │           │   ├── AppTray.java
│       │   │   │           │   ├── AppTrayIcon.java
│       │   │   │           │   ├── AppVersion.java
│       │   │   │           │   ├── AppWindowsLock.java
│       │   │   │           │   ├── AppWindowsShutdown.java
│       │   │   │           │   ├── check/
│       │   │   │           │   │   ├── AppAndroidLinuxTerminalCheck.java
│       │   │   │           │   │   ├── AppAvCheck.java
│       │   │   │           │   │   ├── AppDebugModeCheck.java
│       │   │   │           │   │   ├── AppDirectoryPermissionsCheck.java
│       │   │   │           │   │   ├── AppGpuCheck.java
│       │   │   │           │   │   ├── AppJavaOptionsCheck.java
│       │   │   │           │   │   ├── AppPathCorruptCheck.java
│       │   │   │           │   │   ├── AppPtbDialog.java
│       │   │   │           │   │   ├── AppRosettaCheck.java
│       │   │   │           │   │   ├── AppShellCheck.java
│       │   │   │           │   │   ├── AppShellChecker.java
│       │   │   │           │   │   ├── AppSystemFontCheck.java
│       │   │   │           │   │   ├── AppTestCommandCheck.java
│       │   │   │           │   │   ├── AppWindowsArmCheck.java
│       │   │   │           │   │   └── AppWindowsTempCheck.java
│       │   │   │           │   ├── mode/
│       │   │   │           │   │   ├── AppBaseMode.java
│       │   │   │           │   │   ├── AppGuiMode.java
│       │   │   │           │   │   ├── AppOperationMode.java
│       │   │   │           │   │   └── AppTrayMode.java
│       │   │   │           │   └── window/
│       │   │   │           │       ├── AppDialog.java
│       │   │   │           │       ├── AppMainWindow.java
│       │   │   │           │       ├── AppModifiedStage.java
│       │   │   │           │       ├── AppSideWindow.java
│       │   │   │           │       ├── AppWindowBounds.java
│       │   │   │           │       ├── AppWindowStyle.java
│       │   │   │           │       └── AppWindowTitle.java
│       │   │   │           ├── ext/
│       │   │   │           │   ├── CloudSetupProvider.java
│       │   │   │           │   ├── ConnectionFileSystem.java
│       │   │   │           │   ├── ContainerImageStore.java
│       │   │   │           │   ├── ContainerStoreState.java
│       │   │   │           │   ├── CountGroupStoreProvider.java
│       │   │   │           │   ├── DataStorageExtensionProvider.java
│       │   │   │           │   ├── DataStore.java
│       │   │   │           │   ├── DataStoreCreationCategory.java
│       │   │   │           │   ├── DataStoreProvider.java
│       │   │   │           │   ├── DataStoreProviders.java
│       │   │   │           │   ├── DataStoreState.java
│       │   │   │           │   ├── DataStoreUsageCategory.java
│       │   │   │           │   ├── EnabledStoreState.java
│       │   │   │           │   ├── ExpandedLifecycleStore.java
│       │   │   │           │   ├── ExtensionException.java
│       │   │   │           │   ├── FileEntry.java
│       │   │   │           │   ├── FileInfo.java
│       │   │   │           │   ├── FileKind.java
│       │   │   │           │   ├── FileSystem.java
│       │   │   │           │   ├── FileSystemStore.java
│       │   │   │           │   ├── FixedChildStore.java
│       │   │   │           │   ├── FixedHierarchyStore.java
│       │   │   │           │   ├── GroupStore.java
│       │   │   │           │   ├── GuiDialog.java
│       │   │   │           │   ├── HostAddress.java
│       │   │   │           │   ├── InternalCacheDataStore.java
│       │   │   │           │   ├── LinkFileEntry.java
│       │   │   │           │   ├── LocalStore.java
│       │   │   │           │   ├── NameableStore.java
│       │   │   │           │   ├── NetworkTunnelSession.java
│       │   │   │           │   ├── NetworkTunnelStore.java
│       │   │   │           │   ├── PrefsChoiceValue.java
│       │   │   │           │   ├── PrefsHandler.java
│       │   │   │           │   ├── PrefsProvider.java
│       │   │   │           │   ├── PrefsValue.java
│       │   │   │           │   ├── ProcessControlProvider.java
│       │   │   │           │   ├── ScanProvider.java
│       │   │   │           │   ├── SelfReferentialStore.java
│       │   │   │           │   ├── Session.java
│       │   │   │           │   ├── SessionListener.java
│       │   │   │           │   ├── SetupToolActionProvider.java
│       │   │   │           │   ├── ShellControlFunction.java
│       │   │   │           │   ├── ShellControlParentStoreFunction.java
│       │   │   │           │   ├── ShellDialectChoiceComp.java
│       │   │   │           │   ├── ShellDialectIcons.java
│       │   │   │           │   ├── ShellSession.java
│       │   │   │           │   ├── ShellStore.java
│       │   │   │           │   ├── SingletonSessionStore.java
│       │   │   │           │   ├── SingletonSessionStoreProvider.java
│       │   │   │           │   ├── StartOnInitStore.java
│       │   │   │           │   ├── StatefulDataStore.java
│       │   │   │           │   ├── UserScopeStore.java
│       │   │   │           │   ├── ValidatableStore.java
│       │   │   │           │   ├── ValidationException.java
│       │   │   │           │   └── WrapperFileSystem.java
│       │   │   │           ├── hub/
│       │   │   │           │   ├── action/
│       │   │   │           │   │   ├── BatchHubProvider.java
│       │   │   │           │   │   ├── BatchStoreAction.java
│       │   │   │           │   │   ├── HubBranchProvider.java
│       │   │   │           │   │   ├── HubLeafProvider.java
│       │   │   │           │   │   ├── HubMenuItemProvider.java
│       │   │   │           │   │   ├── MultiStoreAction.java
│       │   │   │           │   │   ├── StoreAction.java
│       │   │   │           │   │   ├── StoreActionCategory.java
│       │   │   │           │   │   └── impl/
│       │   │   │           │   │       ├── BrowseHubLeafProvider.java
│       │   │   │           │   │       ├── CloneHubLeafProvider.java
│       │   │   │           │   │       ├── EditHubLeafProvider.java
│       │   │   │           │   │       ├── InitHubLeafProvider.java
│       │   │   │           │   │       ├── OpenHubMenuLeafProvider.java
│       │   │   │           │   │       ├── OpenSplitHubBatchProvider.java
│       │   │   │           │   │       ├── RefreshActionProvider.java
│       │   │   │           │   │       ├── RefreshChildrenHubLeafProvider.java
│       │   │   │           │   │       ├── RefreshHubLeafProvider.java
│       │   │   │           │   │       ├── SampleHubLeafProvider.java
│       │   │   │           │   │       ├── ScanHubBatchProvider.java
│       │   │   │           │   │       ├── ScanHubLeafProvider.java
│       │   │   │           │   │       ├── StartOnInitHubLeafProvider.java
│       │   │   │           │   │       └── ToggleActionProvider.java
│       │   │   │           │   └── comp/
│       │   │   │           │       ├── DataStoreCategoryChoiceComp.java
│       │   │   │           │       ├── DenseStoreEntryComp.java
│       │   │   │           │       ├── OsLogoComp.java
│       │   │   │           │       ├── StandardStoreEntryComp.java
│       │   │   │           │       ├── StoreActiveComp.java
│       │   │   │           │       ├── StoreCategoryComp.java
│       │   │   │           │       ├── StoreCategoryConfigComp.java
│       │   │   │           │       ├── StoreCategoryListComp.java
│       │   │   │           │       ├── StoreCategoryWrapper.java
│       │   │   │           │       ├── StoreChoiceComp.java
│       │   │   │           │       ├── StoreChoicePopover.java
│       │   │   │           │       ├── StoreComboChoiceComp.java
│       │   │   │           │       ├── StoreCreationComp.java
│       │   │   │           │       ├── StoreCreationConsumer.java
│       │   │   │           │       ├── StoreCreationDialog.java
│       │   │   │           │       ├── StoreCreationMenu.java
│       │   │   │           │       ├── StoreCreationModel.java
│       │   │   │           │       ├── StoreCreationQueueEntry.java
│       │   │   │           │       ├── StoreEntryBatchSelectComp.java
│       │   │   │           │       ├── StoreEntryComp.java
│       │   │   │           │       ├── StoreEntryListBatchBarComp.java
│       │   │   │           │       ├── StoreEntryListComp.java
│       │   │   │           │       ├── StoreEntryListOverviewComp.java
│       │   │   │           │       ├── StoreEntryWrapper.java
│       │   │   │           │       ├── StoreIconChoiceComp.java
│       │   │   │           │       ├── StoreIconChoiceDialog.java
│       │   │   │           │       ├── StoreIconComp.java
│       │   │   │           │       ├── StoreIdentitiesIntroComp.java
│       │   │   │           │       ├── StoreIntroComp.java
│       │   │   │           │       ├── StoreLayoutComp.java
│       │   │   │           │       ├── StoreListChoiceComp.java
│       │   │   │           │       ├── StoreNotFoundComp.java
│       │   │   │           │       ├── StoreNotesComp.java
│       │   │   │           │       ├── StoreOrderIndexDialog.java
│       │   │   │           │       ├── StoreProviderChoiceComp.java
│       │   │   │           │       ├── StoreQuickAccessButtonComp.java
│       │   │   │           │       ├── StoreScriptSourcesIntroComp.java
│       │   │   │           │       ├── StoreScriptsIntroComp.java
│       │   │   │           │       ├── StoreSection.java
│       │   │   │           │       ├── StoreSectionBaseComp.java
│       │   │   │           │       ├── StoreSectionComp.java
│       │   │   │           │       ├── StoreSectionMiniComp.java
│       │   │   │           │       ├── StoreSectionSortMode.java
│       │   │   │           │       ├── StoreSidebarComp.java
│       │   │   │           │       ├── StoreToggleComp.java
│       │   │   │           │       ├── StoreViewState.java
│       │   │   │           │       └── SystemStateComp.java
│       │   │   │           ├── icon/
│       │   │   │           │   ├── SystemIcon.java
│       │   │   │           │   ├── SystemIconCache.java
│       │   │   │           │   ├── SystemIconManager.java
│       │   │   │           │   ├── SystemIconSource.java
│       │   │   │           │   ├── SystemIconSourceData.java
│       │   │   │           │   └── SystemIconSourceFile.java
│       │   │   │           ├── issue/
│       │   │   │           │   ├── AttachmentHelper.java
│       │   │   │           │   ├── ErrorAction.java
│       │   │   │           │   ├── ErrorEvent.java
│       │   │   │           │   ├── ErrorEventFactory.java
│       │   │   │           │   ├── ErrorHandler.java
│       │   │   │           │   ├── ErrorHandlerComp.java
│       │   │   │           │   ├── ErrorHandlerDialog.java
│       │   │   │           │   ├── EventHandler.java
│       │   │   │           │   ├── EventHandlerImpl.java
│       │   │   │           │   ├── GuiErrorHandler.java
│       │   │   │           │   ├── GuiErrorHandlerBase.java
│       │   │   │           │   ├── LogErrorHandler.java
│       │   │   │           │   ├── SentryErrorHandler.java
│       │   │   │           │   ├── SyncErrorHandler.java
│       │   │   │           │   ├── TerminalErrorHandler.java
│       │   │   │           │   ├── TrackEvent.java
│       │   │   │           │   └── UserReportComp.java
│       │   │   │           ├── platform/
│       │   │   │           │   ├── BindingsHelper.java
│       │   │   │           │   ├── BooleanAnimationTimer.java
│       │   │   │           │   ├── ChainedValidator.java
│       │   │   │           │   ├── Check.java
│       │   │   │           │   ├── ClipboardHelper.java
│       │   │   │           │   ├── ColorHelper.java
│       │   │   │           │   ├── DerivedObservableList.java
│       │   │   │           │   ├── ExclusiveValidator.java
│       │   │   │           │   ├── GlobalBooleanProperty.java
│       │   │   │           │   ├── GlobalClipboard.java
│       │   │   │           │   ├── GlobalDoubleProperty.java
│       │   │   │           │   ├── GlobalObjectProperty.java
│       │   │   │           │   ├── GlobalStringProperty.java
│       │   │   │           │   ├── InputHelper.java
│       │   │   │           │   ├── JfxHelper.java
│       │   │   │           │   ├── LabelGraphic.java
│       │   │   │           │   ├── MacOsPermissions.java
│       │   │   │           │   ├── MarkdownHelper.java
│       │   │   │           │   ├── MenuHelper.java
│       │   │   │           │   ├── NativeBridge.java
│       │   │   │           │   ├── NativeMacOsWindowControl.java
│       │   │   │           │   ├── NativeWinWindowControl.java
│       │   │   │           │   ├── NodeHelper.java
│       │   │   │           │   ├── OptionsBuilder.java
│       │   │   │           │   ├── OptionsChoiceBuilder.java
│       │   │   │           │   ├── PlatformInit.java
│       │   │   │           │   ├── PlatformState.java
│       │   │   │           │   ├── PlatformThread.java
│       │   │   │           │   ├── PlatformThreadWatcher.java
│       │   │   │           │   ├── SimpleValidator.java
│       │   │   │           │   └── Validator.java
│       │   │   │           ├── prefs/
│       │   │   │           │   ├── AboutCategory.java
│       │   │   │           │   ├── ApiCategory.java
│       │   │   │           │   ├── AppPrefs.java
│       │   │   │           │   ├── AppPrefsCategory.java
│       │   │   │           │   ├── AppPrefsComp.java
│       │   │   │           │   ├── AppPrefsSidebarComp.java
│       │   │   │           │   ├── AppPrefsStorageHandler.java
│       │   │   │           │   ├── CloseBehaviour.java
│       │   │   │           │   ├── CloseBehaviourDialog.java
│       │   │   │           │   ├── ConnectionHubCategory.java
│       │   │   │           │   ├── DeveloperCategory.java
│       │   │   │           │   ├── DisplayCategory.java
│       │   │   │           │   ├── EditorCategory.java
│       │   │   │           │   ├── ExternalApplicationHelper.java
│       │   │   │           │   ├── ExternalApplicationType.java
│       │   │   │           │   ├── ExternalEditorType.java
│       │   │   │           │   ├── FileBrowserCategory.java
│       │   │   │           │   ├── HibernateBehaviour.java
│       │   │   │           │   ├── IconsCategory.java
│       │   │   │           │   ├── LinksCategory.java
│       │   │   │           │   ├── LoggingCategory.java
│       │   │   │           │   ├── McpCategory.java
│       │   │   │           │   ├── PasswordManagerCategory.java
│       │   │   │           │   ├── PasswordManagerTestComp.java
│       │   │   │           │   ├── PersonalizationCategory.java
│       │   │   │           │   ├── RdpCategory.java
│       │   │   │           │   ├── SecurityCategory.java
│       │   │   │           │   ├── SshCategory.java
│       │   │   │           │   ├── StartupBehaviour.java
│       │   │   │           │   ├── SupportedLocale.java
│       │   │   │           │   ├── SyncCategory.java
│       │   │   │           │   ├── SyncMode.java
│       │   │   │           │   ├── SystemCategory.java
│       │   │   │           │   ├── TerminalCategory.java
│       │   │   │           │   ├── ThirdPartyDependency.java
│       │   │   │           │   ├── ThirdPartyDependencyListComp.java
│       │   │   │           │   ├── TroubleshootCategory.java
│       │   │   │           │   ├── UpdateCheckComp.java
│       │   │   │           │   ├── UpdatesCategory.java
│       │   │   │           │   ├── VaultAuthentication.java
│       │   │   │           │   ├── VaultCategory.java
│       │   │   │           │   ├── WorkspaceCreationDialog.java
│       │   │   │           │   └── WorkspacesCategory.java
│       │   │   │           ├── process/
│       │   │   │           │   ├── BaseElevationHandler.java
│       │   │   │           │   ├── CommandBuilder.java
│       │   │   │           │   ├── CommandConfiguration.java
│       │   │   │           │   ├── CommandControl.java
│       │   │   │           │   ├── CommandSupport.java
│       │   │   │           │   ├── CommandView.java
│       │   │   │           │   ├── CommandViewBase.java
│       │   │   │           │   ├── CountDown.java
│       │   │   │           │   ├── ElevationFunction.java
│       │   │   │           │   ├── ElevationHandler.java
│       │   │   │           │   ├── LocalProcessInputStream.java
│       │   │   │           │   ├── LocalProcessOutputStream.java
│       │   │   │           │   ├── LocalShell.java
│       │   │   │           │   ├── NewLine.java
│       │   │   │           │   ├── OsFileSystem.java
│       │   │   │           │   ├── ParentSystemAccess.java
│       │   │   │           │   ├── ProcessControl.java
│       │   │   │           │   ├── ProcessExceptionConverter.java
│       │   │   │           │   ├── ProcessOutputException.java
│       │   │   │           │   ├── PropertiesFormatsParser.java
│       │   │   │           │   ├── ScriptHelper.java
│       │   │   │           │   ├── SecretReference.java
│       │   │   │           │   ├── ShellControl.java
│       │   │   │           │   ├── ShellDialect.java
│       │   │   │           │   ├── ShellDialectAskpass.java
│       │   │   │           │   ├── ShellDialects.java
│       │   │   │           │   ├── ShellDumbMode.java
│       │   │   │           │   ├── ShellLaunchCommand.java
│       │   │   │           │   ├── ShellOpenFunction.java
│       │   │   │           │   ├── ShellScript.java
│       │   │   │           │   ├── ShellSecurityPolicy.java
│       │   │   │           │   ├── ShellSpawnException.java
│       │   │   │           │   ├── ShellStoreState.java
│       │   │   │           │   ├── ShellTemp.java
│       │   │   │           │   ├── ShellTerminalInitCommand.java
│       │   │   │           │   ├── ShellTtyState.java
│       │   │   │           │   ├── ShellView.java
│       │   │   │           │   ├── StubShellControl.java
│       │   │   │           │   ├── SudoCache.java
│       │   │   │           │   ├── SystemState.java
│       │   │   │           │   ├── TerminalInitFunction.java
│       │   │   │           │   ├── TerminalInitScriptConfig.java
│       │   │   │           │   ├── WorkingDirectoryFunction.java
│       │   │   │           │   └── WrapperShellControl.java
│       │   │   │           ├── pwman/
│       │   │   │           │   ├── BitwardenPasswordManager.java
│       │   │   │           │   ├── DashlanePasswordManager.java
│       │   │   │           │   ├── EnpassPasswordManager.java
│       │   │   │           │   ├── KeePassXcAssociationComp.java
│       │   │   │           │   ├── KeePassXcAssociationKey.java
│       │   │   │           │   ├── KeePassXcPasswordManager.java
│       │   │   │           │   ├── KeePassXcProxyClient.java
│       │   │   │           │   ├── KeeperPasswordManager.java
│       │   │   │           │   ├── LastpassPasswordManager.java
│       │   │   │           │   ├── OnePasswordManager.java
│       │   │   │           │   ├── PassboltPasswordManager.java
│       │   │   │           │   ├── PasswordManager.java
│       │   │   │           │   ├── PasswordManagerCommand.java
│       │   │   │           │   ├── PasswordManagerCommandTemplate.java
│       │   │   │           │   ├── PsonoPasswordManager.java
│       │   │   │           │   ├── TweetNaClHelper.java
│       │   │   │           │   └── WindowsCredentialManager.java
│       │   │   │           ├── rdp/
│       │   │   │           │   ├── CustomRdpClient.java
│       │   │   │           │   ├── DevolutionsRdpClient.java
│       │   │   │           │   ├── ExternalRdpClient.java
│       │   │   │           │   ├── FreeRdpClient.java
│       │   │   │           │   ├── MstscRdpClient.java
│       │   │   │           │   ├── RdpLaunchConfig.java
│       │   │   │           │   ├── RemminaRdpClient.java
│       │   │   │           │   ├── RemoteDesktopAppRdpClient.java
│       │   │   │           │   └── WindowsAppRdpClient.java
│       │   │   │           ├── secret/
│       │   │   │           │   ├── EncryptedValue.java
│       │   │   │           │   ├── EncryptionKey.java
│       │   │   │           │   ├── EncryptionToken.java
│       │   │   │           │   ├── PasswordLockSecretValue.java
│       │   │   │           │   ├── SecretCustomCommandStrategy.java
│       │   │   │           │   ├── SecretInPlaceStrategy.java
│       │   │   │           │   ├── SecretManager.java
│       │   │   │           │   ├── SecretNoneStrategy.java
│       │   │   │           │   ├── SecretPasswordManagerStrategy.java
│       │   │   │           │   ├── SecretPromptStrategy.java
│       │   │   │           │   ├── SecretQuery.java
│       │   │   │           │   ├── SecretQueryFilter.java
│       │   │   │           │   ├── SecretQueryFormatter.java
│       │   │   │           │   ├── SecretQueryProgress.java
│       │   │   │           │   ├── SecretQueryResult.java
│       │   │   │           │   ├── SecretQueryState.java
│       │   │   │           │   ├── SecretRetrievalStrategy.java
│       │   │   │           │   ├── SecretStrategyChoiceConfig.java
│       │   │   │           │   └── VaultKeySecretValue.java
│       │   │   │           ├── spice/
│       │   │   │           │   ├── CustomSpiceClient.java
│       │   │   │           │   ├── ExternalSpiceClient.java
│       │   │   │           │   ├── RemoteViewerSpiceClient.java
│       │   │   │           │   └── SpiceLaunchConfig.java
│       │   │   │           ├── storage/
│       │   │   │           │   ├── ContextualFileReference.java
│       │   │   │           │   ├── DataStateHandler.java
│       │   │   │           │   ├── DataStorage.java
│       │   │   │           │   ├── DataStorageGroupStrategy.java
│       │   │   │           │   ├── DataStorageNode.java
│       │   │   │           │   ├── DataStorageQuery.java
│       │   │   │           │   ├── DataStorageSecret.java
│       │   │   │           │   ├── DataStorageSyncHandler.java
│       │   │   │           │   ├── DataStorageUserHandler.java
│       │   │   │           │   ├── DataStoreCategory.java
│       │   │   │           │   ├── DataStoreCategoryConfig.java
│       │   │   │           │   ├── DataStoreColor.java
│       │   │   │           │   ├── DataStoreEntry.java
│       │   │   │           │   ├── DataStoreEntryRef.java
│       │   │   │           │   ├── ImpersistentStorage.java
│       │   │   │           │   ├── StandardStorage.java
│       │   │   │           │   ├── StorageElement.java
│       │   │   │           │   └── StorageListener.java
│       │   │   │           ├── terminal/
│       │   │   │           │   ├── AlacrittyTerminalType.java
│       │   │   │           │   ├── ClinkHelper.java
│       │   │   │           │   ├── CmdTerminalType.java
│       │   │   │           │   ├── ConfigFileTerminalPrompt.java
│       │   │   │           │   ├── ControllableTerminalSession.java
│       │   │   │           │   ├── CustomTerminalType.java
│       │   │   │           │   ├── ExternalTerminalType.java
│       │   │   │           │   ├── FootTerminalType.java
│       │   │   │           │   ├── GhosttyTerminalType.java
│       │   │   │           │   ├── GnomeConsoleType.java
│       │   │   │           │   ├── GnomeTerminalType.java
│       │   │   │           │   ├── ITerm2TerminalType.java
│       │   │   │           │   ├── KittyTerminalType.java
│       │   │   │           │   ├── KonsoleTerminalType.java
│       │   │   │           │   ├── MacOsTerminalType.java
│       │   │   │           │   ├── MobaXTermTerminalType.java
│       │   │   │           │   ├── OhMyPoshTerminalPrompt.java
│       │   │   │           │   ├── OhMyZshTerminalPrompt.java
│       │   │   │           │   ├── PowerShellTerminalType.java
│       │   │   │           │   ├── PtyxisTerminalType.java
│       │   │   │           │   ├── PwshTerminalType.java
│       │   │   │           │   ├── ScreenTerminalMultiplexer.java
│       │   │   │           │   ├── SecureCrtTerminalType.java
│       │   │   │           │   ├── StarshipTerminalPrompt.java
│       │   │   │           │   ├── TabbyTerminalType.java
│       │   │   │           │   ├── TerminalDockBrowserComp.java
│       │   │   │           │   ├── TerminalDockHubComp.java
│       │   │   │           │   ├── TerminalDockHubManager.java
│       │   │   │           │   ├── TerminalDockMode.java
│       │   │   │           │   ├── TerminalDockView.java
│       │   │   │           │   ├── TerminalLaunch.java
│       │   │   │           │   ├── TerminalLaunchConfiguration.java
│       │   │   │           │   ├── TerminalLaunchRequest.java
│       │   │   │           │   ├── TerminalLaunchResult.java
│       │   │   │           │   ├── TerminalLauncher.java
│       │   │   │           │   ├── TerminalLauncherManager.java
│       │   │   │           │   ├── TerminalMultiplexer.java
│       │   │   │           │   ├── TerminalMultiplexerManager.java
│       │   │   │           │   ├── TerminalOpenFormat.java
│       │   │   │           │   ├── TerminalPaneConfiguration.java
│       │   │   │           │   ├── TerminalPrompt.java
│       │   │   │           │   ├── TerminalPromptManager.java
│       │   │   │           │   ├── TerminalProxyManager.java
│       │   │   │           │   ├── TerminalSplitStrategy.java
│       │   │   │           │   ├── TerminalView.java
│       │   │   │           │   ├── TermiusTerminalType.java
│       │   │   │           │   ├── TmuxTerminalMultiplexer.java
│       │   │   │           │   ├── TrackableTerminalType.java
│       │   │   │           │   ├── WarpTerminalType.java
│       │   │   │           │   ├── WaveTerminalType.java
│       │   │   │           │   ├── WezTerminalType.java
│       │   │   │           │   ├── WindowsTerminalSession.java
│       │   │   │           │   ├── WindowsTerminalType.java
│       │   │   │           │   ├── XShellTerminalType.java
│       │   │   │           │   ├── YakuakeTerminalType.java
│       │   │   │           │   └── ZellijTerminalMultiplexer.java
│       │   │   │           ├── test/
│       │   │   │           │   ├── ExtensionTest.java
│       │   │   │           │   ├── LocalExtensionTest.java
│       │   │   │           │   └── TestModule.java
│       │   │   │           ├── update/
│       │   │   │           │   ├── AppDistributionType.java
│       │   │   │           │   ├── AppDownloads.java
│       │   │   │           │   ├── AppInstaller.java
│       │   │   │           │   ├── AppRelease.java
│       │   │   │           │   ├── ChocoUpdater.java
│       │   │   │           │   ├── CommandUpdater.java
│       │   │   │           │   ├── GitHubUpdater.java
│       │   │   │           │   ├── PortableUpdater.java
│       │   │   │           │   ├── UpdateAvailableDialog.java
│       │   │   │           │   ├── UpdateChangelogDialog.java
│       │   │   │           │   ├── UpdateHandler.java
│       │   │   │           │   ├── UpdateNagDialog.java
│       │   │   │           │   ├── WebtopUpdater.java
│       │   │   │           │   └── WingetUpdater.java
│       │   │   │           ├── util/
│       │   │   │           │   ├── AppJacksonModule.java
│       │   │   │           │   ├── AskpassAlert.java
│       │   │   │           │   ├── AsktextAlert.java
│       │   │   │           │   ├── BooleanScope.java
│       │   │   │           │   ├── CommandDialog.java
│       │   │   │           │   ├── DataStoreFormatter.java
│       │   │   │           │   ├── Deobfuscator.java
│       │   │   │           │   ├── DesktopHelper.java
│       │   │   │           │   ├── DesktopShortcuts.java
│       │   │   │           │   ├── DocumentationLink.java
│       │   │   │           │   ├── FileBridge.java
│       │   │   │           │   ├── FileOpener.java
│       │   │   │           │   ├── FileReference.java
│       │   │   │           │   ├── FixedSizeInputStream.java
│       │   │   │           │   ├── FlatpakCache.java
│       │   │   │           │   ├── GithubReleaseDownloader.java
│       │   │   │           │   ├── GlobalTimer.java
│       │   │   │           │   ├── GroupFile.java
│       │   │   │           │   ├── HostHelper.java
│       │   │   │           │   ├── HttpHelper.java
│       │   │   │           │   ├── HumanReadableFormat.java
│       │   │   │           │   ├── Hyperlinks.java
│       │   │   │           │   ├── IniFile.java
│       │   │   │           │   ├── LicenseProvider.java
│       │   │   │           │   ├── LicenseRequiredException.java
│       │   │   │           │   ├── LicensedFeature.java
│       │   │   │           │   ├── LocalExec.java
│       │   │   │           │   ├── LocalFileTracker.java
│       │   │   │           │   ├── ModuleAccess.java
│       │   │   │           │   ├── ObservableSubscriber.java
│       │   │   │           │   ├── PasswdFile.java
│       │   │   │           │   ├── RdpConfig.java
│       │   │   │           │   ├── Rect.java
│       │   │   │           │   ├── RemminaHelper.java
│       │   │   │           │   ├── ScanDialog.java
│       │   │   │           │   ├── ScanDialogAction.java
│       │   │   │           │   ├── ScanDialogBase.java
│       │   │   │           │   ├── ScanMultiDialogComp.java
│       │   │   │           │   ├── ScanSingleDialogComp.java
│       │   │   │           │   ├── SimpleFilterInputStream.java
│       │   │   │           │   ├── SshLocalBridge.java
│       │   │   │           │   ├── StoreStateFormat.java
│       │   │   │           │   ├── ThreadHelper.java
│       │   │   │           │   ├── Translatable.java
│       │   │   │           │   ├── User32Ex.java
│       │   │   │           │   ├── Validators.java
│       │   │   │           │   └── WindowsRegistry.java
│       │   │   │           └── vnc/
│       │   │   │               ├── CustomVncClient.java
│       │   │   │               ├── ExternalVncClient.java
│       │   │   │               ├── InternalVncClient.java
│       │   │   │               ├── RealVncClient.java
│       │   │   │               ├── RemminaVncClient.java
│       │   │   │               ├── RemoteViewerVncClient.java
│       │   │   │               ├── ScreenSharingVncClient.java
│       │   │   │               ├── TigerVncClient.java
│       │   │   │               ├── TightVncClient.java
│       │   │   │               ├── VncBaseStore.java
│       │   │   │               ├── VncCategory.java
│       │   │   │               └── VncLaunchConfig.java
│       │   │   └── module-info.java
│       │   └── resources/
│       │       └── io/
│       │           └── xpipe/
│       │               └── app/
│       │                   └── resources/
│       │                       ├── file_list.txt
│       │                       ├── folder_list.txt
│       │                       ├── font-config/
│       │                       │   └── font.css
│       │                       ├── mcp/
│       │                       │   ├── create_directory.json
│       │                       │   ├── create_file.json
│       │                       │   ├── find_file.json
│       │                       │   ├── get_file_info.json
│       │                       │   ├── help.json
│       │                       │   ├── list_files.json
│       │                       │   ├── list_systems.json
│       │                       │   ├── open_terminal.json
│       │                       │   ├── open_terminal_inline.json
│       │                       │   ├── read_file.json
│       │                       │   ├── run_command.json
│       │                       │   ├── run_script.json
│       │                       │   ├── toggle_state.json
│       │                       │   └── write_file.json
│       │                       ├── misc/
│       │                       │   ├── antivirus.md
│       │                       │   ├── eula.md
│       │                       │   ├── github-markdown-dark.css
│       │                       │   ├── github-markdown-light.css
│       │                       │   ├── notes_default.md
│       │                       │   ├── report_privacy_policy.md
│       │                       │   ├── vault.md
│       │                       │   ├── vault_empty.md
│       │                       │   └── welcome.md
│       │                       ├── style/
│       │                       │   ├── about.css
│       │                       │   ├── alert.css
│       │                       │   ├── bookmark.css
│       │                       │   ├── browser.css
│       │                       │   ├── category.css
│       │                       │   ├── choice-comp.css
│       │                       │   ├── color-box.css
│       │                       │   ├── data-store-list-choice-comp.css
│       │                       │   ├── dialog-comp.css
│       │                       │   ├── dropdown-comp.css
│       │                       │   ├── error-handler-comp.css
│       │                       │   ├── file-drop-augment.css
│       │                       │   ├── frame.css
│       │                       │   ├── header-bars.css
│       │                       │   ├── intro.css
│       │                       │   ├── lazy-text-field-comp.css
│       │                       │   ├── modal-overlay-comp.css
│       │                       │   ├── options-comp.css
│       │                       │   ├── popover.css
│       │                       │   ├── popup-menu.css
│       │                       │   ├── prefs.css
│       │                       │   ├── scrollbar.css
│       │                       │   ├── side-split-pane-comp.css
│       │                       │   ├── sidebar-comp.css
│       │                       │   ├── store-entry-comp.css
│       │                       │   ├── store-mini-section.css
│       │                       │   ├── style.css
│       │                       │   ├── third-party.css
│       │                       │   ├── tile-button-comp.css
│       │                       │   ├── toggle-switch-comp.css
│       │                       │   └── tooltip.css
│       │                       └── theme/
│       │                           ├── cupertinoDark.css
│       │                           ├── cupertinoLight.css
│       │                           ├── custom.css
│       │                           ├── dark.css
│       │                           ├── dracula.css
│       │                           ├── light.css
│       │                           ├── mocha.css
│       │                           ├── nordDark.css
│       │                           └── nordLight.css
│       └── test/
│           └── java/
│               └── Test.java
├── beacon/
│   ├── README.md
│   ├── build.gradle
│   ├── publish.gradle
│   └── src/
│       └── main/
│           ├── java/
│           │   ├── io/
│           │   │   └── xpipe/
│           │   │       └── beacon/
│           │   │           ├── BeaconAuthMethod.java
│           │   │           ├── BeaconClient.java
│           │   │           ├── BeaconClientErrorResponse.java
│           │   │           ├── BeaconClientException.java
│           │   │           ├── BeaconClientInformation.java
│           │   │           ├── BeaconConfig.java
│           │   │           ├── BeaconConnectorException.java
│           │   │           ├── BeaconInterface.java
│           │   │           ├── BeaconJacksonModule.java
│           │   │           ├── BeaconServer.java
│           │   │           ├── BeaconServerErrorResponse.java
│           │   │           ├── BeaconServerException.java
│           │   │           └── api/
│           │   │               ├── ActionExchange.java
│           │   │               ├── AskpassExchange.java
│           │   │               ├── CategoryAddExchange.java
│           │   │               ├── CategoryInfoExchange.java
│           │   │               ├── CategoryQueryExchange.java
│           │   │               ├── CategoryRemoveExchange.java
│           │   │               ├── ConnectionAddExchange.java
│           │   │               ├── ConnectionInfoExchange.java
│           │   │               ├── ConnectionQueryExchange.java
│           │   │               ├── ConnectionRefreshExchange.java
│           │   │               ├── ConnectionRemoveExchange.java
│           │   │               ├── DaemonFocusExchange.java
│           │   │               ├── DaemonModeExchange.java
│           │   │               ├── DaemonOpenExchange.java
│           │   │               ├── DaemonStatusExchange.java
│           │   │               ├── DaemonStopExchange.java
│           │   │               ├── DaemonVersionExchange.java
│           │   │               ├── FsBlobExchange.java
│           │   │               ├── FsReadExchange.java
│           │   │               ├── FsScriptExchange.java
│           │   │               ├── FsWriteExchange.java
│           │   │               ├── HandshakeExchange.java
│           │   │               ├── SecretDecryptExchange.java
│           │   │               ├── SecretEncryptExchange.java
│           │   │               ├── ShellExecExchange.java
│           │   │               ├── ShellStartExchange.java
│           │   │               ├── ShellStopExchange.java
│           │   │               ├── SshLaunchExchange.java
│           │   │               ├── TerminalExternalLaunchExchange.java
│           │   │               ├── TerminalLaunchExchange.java
│           │   │               ├── TerminalPrepareExchange.java
│           │   │               ├── TerminalRegisterExchange.java
│           │   │               └── TerminalWaitExchange.java
│           │   └── module-info.java
│           └── resources/
│               └── META-INF/
│                   └── services/
│                       └── io.xpipe.core.ModuleLayerLoader
├── build.gradle
├── core/
│   ├── README.md
│   ├── build.gradle
│   ├── publish.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── io/
│       │   │   │   └── xpipe/
│       │   │   │       └── core/
│       │   │   │           ├── AesSecretValue.java
│       │   │   │           ├── CoreJacksonModule.java
│       │   │   │           ├── EncryptedSecretValue.java
│       │   │   │           ├── FailableBiFunction.java
│       │   │   │           ├── FailableConsumer.java
│       │   │   │           ├── FailableFunction.java
│       │   │   │           ├── FailableRunnable.java
│       │   │   │           ├── FailableSupplier.java
│       │   │   │           ├── FilePath.java
│       │   │   │           ├── InPlaceSecretValue.java
│       │   │   │           ├── JacksonMapper.java
│       │   │   │           ├── KeyValue.java
│       │   │   │           ├── ModuleLayerLoader.java
│       │   │   │           ├── OsType.java
│       │   │   │           ├── SecretValue.java
│       │   │   │           ├── StorePath.java
│       │   │   │           ├── StreamCharset.java
│       │   │   │           ├── UuidHelper.java
│       │   │   │           └── XPipeDaemonMode.java
│       │   │   └── module-info.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── services/
│       │               ├── com.fasterxml.jackson.databind.Module
│       │               └── io.xpipe.core.ModuleLayerLoader
│       └── test/
│           └── java/
│               ├── io/
│               │   └── xpipe/
│               │       └── core/
│               │           └── test/
│               │               └── StorePathTest.java
│               └── module-info.java
├── dist/
│   ├── base.gradle
│   ├── build.gradle
│   ├── changelog/
│   │   ├── 1.0.0.md
│   │   ├── 1.0.1.md
│   │   ├── 1.1.0.md
│   │   ├── 1.1.1.md
│   │   ├── 1.1.2.md
│   │   ├── 1.1.3.md
│   │   ├── 1.2.0.md
│   │   ├── 1.3.0.md
│   │   ├── 1.3.1.md
│   │   ├── 1.3.2.md
│   │   ├── 1.4.0.md
│   │   ├── 1.4.1.md
│   │   ├── 1.4.2.md
│   │   ├── 1.5.0.md
│   │   ├── 1.5.1.md
│   │   ├── 1.5.2.md
│   │   ├── 1.5.3.md
│   │   ├── 1.6.0.md
│   │   ├── 1.7.0.md
│   │   ├── 1.7.1.md
│   │   ├── 1.7.10.md
│   │   ├── 1.7.11.md
│   │   ├── 1.7.12.md
│   │   ├── 1.7.13.md
│   │   ├── 1.7.14.md
│   │   ├── 1.7.15.md
│   │   ├── 1.7.16.md
│   │   ├── 1.7.2.md
│   │   ├── 1.7.3.md
│   │   ├── 1.7.4.md
│   │   ├── 1.7.5.md
│   │   ├── 1.7.6.md
│   │   ├── 1.7.7.md
│   │   ├── 1.7.8.md
│   │   ├── 1.7.9.md
│   │   ├── 10.0.1_incremental.md
│   │   ├── 10.0.2_incremental.md
│   │   ├── 10.0.3_incremental.md
│   │   ├── 10.0.4_incremental.md
│   │   ├── 10.0.md
│   │   ├── 10.1.1.md
│   │   ├── 10.1.1_incremental.md
│   │   ├── 10.1.md
│   │   ├── 10.1_incremental.md
│   │   ├── 10.2.1.md
│   │   ├── 10.2.1_incremental.md
│   │   ├── 10.2.2.md
│   │   ├── 10.2.2_incremental.md
│   │   ├── 10.2.md
│   │   ├── 10.2_incremental.md
│   │   ├── 11.0.md
│   │   ├── 11.1.md
│   │   ├── 11.1_incremental.md
│   │   ├── 11.2.md
│   │   ├── 11.2_incremental.md
│   │   ├── 11.3.md
│   │   ├── 11.3_incremental.md
│   │   ├── 12.0.md
│   │   ├── 12.1.md
│   │   ├── 12.1_incremental.md
│   │   ├── 12.2.md
│   │   ├── 12.2_incremental.md
│   │   ├── 12.3.1.md
│   │   ├── 12.3.1_incremental.md
│   │   ├── 12.3.2.md
│   │   ├── 12.3.2_incremental.md
│   │   ├── 12.3.3.md
│   │   ├── 12.3.3_incremental.md
│   │   ├── 12.3.4.md
│   │   ├── 12.3.4_incremental.md
│   │   ├── 12.3.5_incremental.md
│   │   ├── 12.3.md
│   │   ├── 12.3_incremental.md
│   │   ├── 13.0.1.md
│   │   ├── 13.0.1_incremental.md
│   │   ├── 13.0.md
│   │   ├── 13.1.1.md
│   │   ├── 13.1.1_incremental.md
│   │   ├── 13.1.md
│   │   ├── 13.1_incremental.md
│   │   ├── 13.2.md
│   │   ├── 13.2_incremental.md
│   │   ├── 13.3.1.md
│   │   ├── 13.3.1_incremental.md
│   │   ├── 13.3.2.md
│   │   ├── 13.3.2_incremental.md
│   │   ├── 13.3.md
│   │   ├── 13.3_incremental.md
│   │   ├── 13.4.1.md
│   │   ├── 13.4.1_incremental.md
│   │   ├── 13.4.2.md
│   │   ├── 13.4.2_incremental.md
│   │   ├── 13.4.3.md
│   │   ├── 13.4.3_incremental.md
│   │   ├── 13.4.4.md
│   │   ├── 13.4.4_incremental.md
│   │   ├── 13.4.md
│   │   ├── 13.4_incremental.md
│   │   ├── 14.0.md
│   │   ├── 14.1.1.md
│   │   ├── 14.1.1_incremental.md
│   │   ├── 14.1.md
│   │   ├── 14.1_incremental.md
│   │   ├── 14.2.md
│   │   ├── 14.2_incremental.md
│   │   ├── 15.0.1.md
│   │   ├── 15.0.1_incremental.md
│   │   ├── 15.0.2.md
│   │   ├── 15.0.2_incremental.md
│   │   ├── 15.0.md
│   │   ├── 15.1.md
│   │   ├── 15.1_incremental.md
│   │   ├── 15.2.md
│   │   ├── 15.2_incremental.md
│   │   ├── 15.3.md
│   │   ├── 15.3_incremental.md
│   │   ├── 15.4.md
│   │   ├── 15.4_incremental.md
│   │   ├── 15.5.md
│   │   ├── 15.5_incremental.md
│   │   ├── 15.6.md
│   │   ├── 15.6_incremental.md
│   │   ├── 15.7.1.md
│   │   ├── 15.7.1_incremental.md
│   │   ├── 15.7.md
│   │   ├── 15.7_incremental.md
│   │   ├── 15.8.md
│   │   ├── 15.8_incremental.md
│   │   ├── 16.0.md
│   │   ├── 16.1.md
│   │   ├── 16.1_incremental.md
│   │   ├── 16.2.1.md
│   │   ├── 16.2.1_incremental.md
│   │   ├── 16.2.md
│   │   ├── 16.2_incremental.md
│   │   ├── 16.3.md
│   │   ├── 16.3_incremental.md
│   │   ├── 16.4.1.md
│   │   ├── 16.4.1_incremental.md
│   │   ├── 16.4.md
│   │   ├── 16.4_incremental.md
│   │   ├── 16.5.md
│   │   ├── 16.5_incremental.md
│   │   ├── 16.6.md
│   │   ├── 16.6_incremental.md
│   │   ├── 16.7.md
│   │   ├── 16.7_incremental.md
│   │   ├── 17.0.md
│   │   ├── 17.1.md
│   │   ├── 17.1_incremental.md
│   │   ├── 17.2.md
│   │   ├── 17.2_incremental.md
│   │   ├── 17.3.md
│   │   ├── 17.3_incremental.md
│   │   ├── 17.4.md
│   │   ├── 17.4_incremental.md
│   │   ├── 17.5.md
│   │   ├── 17.5_incremental.md
│   │   ├── 18.0.1.md
│   │   ├── 18.0.1_incremental.md
│   │   ├── 18.0.md
│   │   ├── 18.1.1.md
│   │   ├── 18.1.1_incremental.md
│   │   ├── 18.1.md
│   │   ├── 18.1_incremental.md
│   │   ├── 18.2.md
│   │   ├── 18.2_incremental.md
│   │   ├── 18.3.md
│   │   ├── 18.3_incremental.md
│   │   ├── 18.4.md
│   │   ├── 18.4_incremental.md
│   │   ├── 18.5.md
│   │   ├── 18.5_incremental.md
│   │   ├── 18.6.md
│   │   ├── 18.6_incremental.md
│   │   ├── 18.7.md
│   │   ├── 18.7_incremental.md
│   │   ├── 19.0.1.md
│   │   ├── 19.0.2_incremental.md
│   │   ├── 19.0.md
│   │   ├── 19.1_incremental.md
│   │   ├── 19.2_incremental.md
│   │   ├── 19.3.1_incremental.md
│   │   ├── 19.3_incremental.md
│   │   ├── 19.4_incremental.md
│   │   ├── 19.5_incremental.md
│   │   ├── 19.6_incremental.md
│   │   ├── 20.0.1.md
│   │   ├── 20.0.md
│   │   ├── 20.1.md
│   │   ├── 20.2.md
│   │   ├── 20.3.md
│   │   ├── 20.4.md
│   │   ├── 21.0.md
│   │   ├── 21.1.1.md
│   │   ├── 21.1.md
│   │   ├── 21.2.1.md
│   │   ├── 21.2.md
│   │   ├── 21.3.md
│   │   ├── 21.4.md
│   │   ├── 21.5.md
│   │   ├── 21.6.md
│   │   ├── 8.0-6.md
│   │   ├── 8.0.1.md
│   │   ├── 8.0.md
│   │   ├── 8.1.md
│   │   ├── 8.1_incremental.md
│   │   ├── 8.2.md
│   │   ├── 8.2_incremental.md
│   │   ├── 8.3.md
│   │   ├── 8.3_incremental.md
│   │   ├── 8.4.md
│   │   ├── 8.4_incremental.md
│   │   ├── 8.5.md
│   │   ├── 8.5_incremental.md
│   │   ├── 8.6.md
│   │   ├── 8.6_incremental.md
│   │   ├── 9.0.1.md
│   │   ├── 9.0.1_incremental.md
│   │   ├── 9.0.md
│   │   ├── 9.1.md
│   │   ├── 9.1_incremental.md
│   │   ├── 9.2.md
│   │   ├── 9.2_incremental.md
│   │   ├── 9.3.md
│   │   ├── 9.3_incremental.md
│   │   ├── 9.4.1.md
│   │   ├── 9.4.1_incremental.md
│   │   ├── 9.4.md
│   │   └── 9.4_incremental.md
│   ├── debug/
│   │   ├── debug_arguments.txt
│   │   ├── linux/
│   │   │   └── xpiped_debug.sh
│   │   ├── mac/
│   │   │   └── xpiped_debug.sh
│   │   └── windows/
│   │       └── xpiped_debug.bat
│   ├── fonts/
│   │   ├── allfonts.properties
│   │   └── logicalfonts.properties
│   ├── jpackage/
│   │   └── Info.plist
│   ├── jpackage.gradle
│   ├── licenses/
│   │   ├── antlr.license
│   │   ├── antlr.properties
│   │   ├── atlantafx.license
│   │   ├── atlantafx.properties
│   │   ├── bc-java.license
│   │   ├── bc-java.properties
│   │   ├── commons-io.license
│   │   ├── commons-io.properties
│   │   ├── commons-lang.license
│   │   ├── commons-lang.properties
│   │   ├── flexmark.license
│   │   ├── flexmark.properties
│   │   ├── fx-builders.license
│   │   ├── fx-builders.properties
│   │   ├── github-markdown-css.license
│   │   ├── github-markdown-css.properties
│   │   ├── graalvm.license
│   │   ├── graalvm.properties
│   │   ├── ikonli.license
│   │   ├── ikonli.properties
│   │   ├── inter.license
│   │   ├── inter.properties
│   │   ├── jackson.license
│   │   ├── jackson.properties
│   │   ├── java-annotations.license
│   │   ├── java-annotations.properties
│   │   ├── jna.license
│   │   ├── jna.properties
│   │   ├── json-schema-validator.license
│   │   ├── json-schema-validator.properties
│   │   ├── jsvg.license
│   │   ├── jsvg.properties
│   │   ├── lombok.license
│   │   ├── lombok.properties
│   │   ├── material2.license
│   │   ├── material2.properties
│   │   ├── materialdesign2.license
│   │   ├── materialdesign2.properties
│   │   ├── mcp-sdk.license
│   │   ├── mcp-sdk.properties
│   │   ├── musl.license
│   │   ├── musl.properties
│   │   ├── openjfx.license
│   │   ├── openjfx.properties
│   │   ├── picocli.license
│   │   ├── picocli.properties
│   │   ├── reactive-streams.license
│   │   ├── reactive-streams.properties
│   │   ├── reactor-core.license
│   │   ├── reactor-core.properties
│   │   ├── roboto.license
│   │   ├── roboto.properties
│   │   ├── sentry.license
│   │   ├── sentry.properties
│   │   ├── slf4j.license
│   │   ├── slf4j.properties
│   │   ├── stringtemplate.license
│   │   ├── stringtemplate.properties
│   │   ├── validatorfx.license
│   │   ├── validatorfx.properties
│   │   ├── vernacular-vnc.license
│   │   ├── vernacular-vnc.properties
│   │   ├── vscode-icons.license
│   │   ├── vscode-icons.properties
│   │   ├── zlib.license
│   │   └── zlib.properties
│   └── logo/
│       ├── Assets.car
│       ├── logo.icns
│       └── logo_composer.icon/
│           └── icon.json
├── ext/
│   ├── base/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   ├── io/
│   │           │   │   └── xpipe/
│   │           │   │       └── ext/
│   │           │   │           └── base/
│   │           │   │               ├── desktop/
│   │           │   │               │   ├── DesktopApplicationStore.java
│   │           │   │               │   ├── DesktopApplicationStoreProvider.java
│   │           │   │               │   └── DesktopBaseStore.java
│   │           │   │               ├── host/
│   │           │   │               │   ├── AbstractHostCreationActionProvider.java
│   │           │   │               │   ├── AbstractHostStore.java
│   │           │   │               │   ├── AbstractHostStoreProvider.java
│   │           │   │               │   ├── AbstractHostTransformStore.java
│   │           │   │               │   ├── HostAddressChoice.java
│   │           │   │               │   ├── HostAddressChoiceComp.java
│   │           │   │               │   ├── HostAddressGatewayStore.java
│   │           │   │               │   ├── HostAddressIdentityStore.java
│   │           │   │               │   ├── HostAddressStore.java
│   │           │   │               │   ├── HostAddressSwitchBranchProvider.java
│   │           │   │               │   ├── HostAddressSwitchStore.java
│   │           │   │               │   └── HostAddressTunnelStore.java
│   │           │   │               ├── identity/
│   │           │   │               │   ├── IdentityApplyDialog.java
│   │           │   │               │   ├── IdentityApplyHubLeafProvider.java
│   │           │   │               │   ├── IdentityChoiceBuilder.java
│   │           │   │               │   ├── IdentityMigrationDeserializer.java
│   │           │   │               │   ├── IdentitySelectComp.java
│   │           │   │               │   ├── IdentityStore.java
│   │           │   │               │   ├── IdentityStoreProvider.java
│   │           │   │               │   ├── IdentitySummary.java
│   │           │   │               │   ├── IdentitySwitchStore.java
│   │           │   │               │   ├── IdentityValue.java
│   │           │   │               │   ├── LocalIdentityConvertHubLeafProvider.java
│   │           │   │               │   ├── LocalIdentityStore.java
│   │           │   │               │   ├── LocalIdentityStoreProvider.java
│   │           │   │               │   ├── PasswordManagerIdentityStore.java
│   │           │   │               │   ├── PasswordManagerIdentityStoreProvider.java
│   │           │   │               │   ├── SyncedIdentityStore.java
│   │           │   │               │   ├── SyncedIdentityStoreProvider.java
│   │           │   │               │   ├── UsernameStrategy.java
│   │           │   │               │   └── ssh/
│   │           │   │               │       ├── CustomAgentStrategy.java
│   │           │   │               │       ├── CustomPkcs11LibraryStrategy.java
│   │           │   │               │       ├── GpgAgentStrategy.java
│   │           │   │               │       ├── InPlaceKeyStrategy.java
│   │           │   │               │       ├── KeyFileStrategy.java
│   │           │   │               │       ├── NoIdentityStrategy.java
│   │           │   │               │       ├── OpenSshAgentStrategy.java
│   │           │   │               │       ├── OtherExternalAgentStrategy.java
│   │           │   │               │       ├── PageantStrategy.java
│   │           │   │               │       ├── SshIdentityStateManager.java
│   │           │   │               │       ├── SshIdentityStrategy.java
│   │           │   │               │       ├── SshIdentityStrategyChoiceConfig.java
│   │           │   │               │       └── YubikeyPivStrategy.java
│   │           │   │               ├── script/
│   │           │   │               │   ├── PredefinedScriptStore.java
│   │           │   │               │   ├── RunBackgroundScriptActionProvider.java
│   │           │   │               │   ├── RunFileScriptMenuProvider.java
│   │           │   │               │   ├── RunHubBatchScriptActionProvider.java
│   │           │   │               │   ├── RunHubScriptActionProvider.java
│   │           │   │               │   ├── RunScriptActionProviderMenu.java
│   │           │   │               │   ├── RunTerminalScriptActionProvider.java
│   │           │   │               │   ├── ScriptCollectionSource.java
│   │           │   │               │   ├── ScriptCollectionSourceBrowseActionProvider.java
│   │           │   │               │   ├── ScriptCollectionSourceEntry.java
│   │           │   │               │   ├── ScriptCollectionSourceImportDialog.java
│   │           │   │               │   ├── ScriptCollectionSourceImportHubProvider.java
│   │           │   │               │   ├── ScriptCollectionSourceRefreshHubProvider.java
│   │           │   │               │   ├── ScriptCollectionSourceStore.java
│   │           │   │               │   ├── ScriptCollectionSourceStoreProvider.java
│   │           │   │               │   ├── ScriptDataStorageProvider.java
│   │           │   │               │   ├── ScriptDialects.java
│   │           │   │               │   ├── ScriptHierarchy.java
│   │           │   │               │   ├── ScriptQuickEditHubLeafProvider.java
│   │           │   │               │   ├── ScriptStore.java
│   │           │   │               │   ├── ScriptStoreMigrationDeserializer.java
│   │           │   │               │   ├── ScriptStoreProvider.java
│   │           │   │               │   ├── ScriptStoreSetup.java
│   │           │   │               │   ├── ScriptTextSource.java
│   │           │   │               │   └── ScriptUrlSourceRefreshHubProvider.java
│   │           │   │               ├── service/
│   │           │   │               │   ├── AbstractServiceGroupStore.java
│   │           │   │               │   ├── AbstractServiceGroupStoreProvider.java
│   │           │   │               │   ├── AbstractServiceStore.java
│   │           │   │               │   ├── AbstractServiceStoreProvider.java
│   │           │   │               │   ├── CustomServiceGroupStore.java
│   │           │   │               │   ├── CustomServiceGroupStoreProvider.java
│   │           │   │               │   ├── CustomServiceStore.java
│   │           │   │               │   ├── CustomServiceStoreProvider.java
│   │           │   │               │   ├── FixedServiceCreatorStore.java
│   │           │   │               │   ├── FixedServiceGroupStore.java
│   │           │   │               │   ├── FixedServiceGroupStoreProvider.java
│   │           │   │               │   ├── FixedServiceStore.java
│   │           │   │               │   ├── FixedServiceStoreProvider.java
│   │           │   │               │   ├── MappedServiceStore.java
│   │           │   │               │   ├── MappedServiceStoreProvider.java
│   │           │   │               │   ├── ServiceAddressRotation.java
│   │           │   │               │   ├── ServiceCopyAddressHubLeafProvider.java
│   │           │   │               │   ├── ServiceProtocolType.java
│   │           │   │               │   ├── ServiceProtocolTypeHelper.java
│   │           │   │               │   └── ServiceRefreshHubProvider.java
│   │           │   │               └── store/
│   │           │   │                   ├── PauseableStore.java
│   │           │   │                   ├── ShellStoreProvider.java
│   │           │   │                   ├── StartableStore.java
│   │           │   │                   ├── StoppableStore.java
│   │           │   │                   ├── StorePauseActionProvider.java
│   │           │   │                   ├── StoreRestartActionProvider.java
│   │           │   │                   ├── StoreStartActionProvider.java
│   │           │   │                   └── StoreStopActionProvider.java
│   │           │   └── module-info.java
│   │           └── resources/
│   │               └── io/
│   │                   └── xpipe/
│   │                       └── ext/
│   │                           └── base/
│   │                               └── resources/
│   │                                   ├── extension.properties
│   │                                   └── scripts/
│   │                                       ├── apt_upgrade.sh
│   │                                       ├── clink.bat
│   │                                       ├── crlf_to_lf.sh
│   │                                       ├── diff.sh
│   │                                       ├── git_config.sh
│   │                                       └── system_health.sh
│   ├── proc/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── module-info.java
│   ├── system/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   ├── io/
│   │           │   │   └── xpipe/
│   │           │   │       └── ext/
│   │           │   │           └── system/
│   │           │   │               ├── incus/
│   │           │   │               │   ├── IncusCommandView.java
│   │           │   │               │   ├── IncusContainerActionProviderMenu.java
│   │           │   │               │   ├── IncusContainerConsoleActionProvider.java
│   │           │   │               │   ├── IncusContainerEditConfigActionProvider.java
│   │           │   │               │   ├── IncusContainerEditRunConfigActionProvider.java
│   │           │   │               │   ├── IncusContainerStore.java
│   │           │   │               │   ├── IncusContainerStoreProvider.java
│   │           │   │               │   ├── IncusInstallStore.java
│   │           │   │               │   ├── IncusInstallStoreProvider.java
│   │           │   │               │   └── IncusScanProvider.java
│   │           │   │               ├── lxd/
│   │           │   │               │   ├── LxdCmdStore.java
│   │           │   │               │   ├── LxdCmdStoreProvider.java
│   │           │   │               │   ├── LxdCommandView.java
│   │           │   │               │   ├── LxdContainerActionProviderMenu.java
│   │           │   │               │   ├── LxdContainerConsoleActionProvider.java
│   │           │   │               │   ├── LxdContainerEditConfigActionProvider.java
│   │           │   │               │   ├── LxdContainerEditRunConfigActionProvider.java
│   │           │   │               │   ├── LxdContainerStore.java
│   │           │   │               │   ├── LxdContainerStoreProvider.java
│   │           │   │               │   └── LxdScanProvider.java
│   │           │   │               └── podman/
│   │           │   │                   ├── PodmanCmdStore.java
│   │           │   │                   ├── PodmanCmdStoreProvider.java
│   │           │   │                   ├── PodmanCommandView.java
│   │           │   │                   ├── PodmanContainerActionProviderMenu.java
│   │           │   │                   ├── PodmanContainerAttachActionProvider.java
│   │           │   │                   ├── PodmanContainerInspectActionProvider.java
│   │           │   │                   ├── PodmanContainerLogsActionProvider.java
│   │           │   │                   ├── PodmanContainerStore.java
│   │           │   │                   ├── PodmanContainerStoreProvider.java
│   │           │   │                   └── PodmanScanProvider.java
│   │           │   └── module-info.java
│   │           └── resources/
│   │               └── io/
│   │                   └── xpipe/
│   │                       └── ext/
│   │                           └── system/
│   │                               └── resources/
│   │                                   └── extension.properties
│   └── uacc/
│       ├── build.gradle
│       └── src/
│           └── main/
│               └── java/
│                   └── module-info.java
├── get-xpipe.ps1
├── get-xpipe.sh
├── gradle/
│   ├── gradle_scripts/
│   │   ├── README.md
│   │   ├── atlantafx-base-2.0.2.jar
│   │   ├── dev_default.properties
│   │   ├── extension.gradle
│   │   ├── fx-builders-1.0.0-SNAPSHOT.jar
│   │   ├── java.gradle
│   │   ├── javafx.gradle
│   │   ├── jna.gradle
│   │   ├── junit.gradle
│   │   ├── local_junit_suite.gradle
│   │   ├── lombok.gradle
│   │   ├── modules.gradle
│   │   ├── publish-base.gradle
│   │   └── remote_junit_suite.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lang/
│   ├── README.md
│   ├── strings/
│   │   ├── fixed_en.properties
│   │   ├── translations_da.properties
│   │   ├── translations_de.properties
│   │   ├── translations_en.properties
│   │   ├── translations_es.properties
│   │   ├── translations_fr.properties
│   │   ├── translations_id.properties
│   │   ├── translations_it.properties
│   │   ├── translations_ja.properties
│   │   ├── translations_ko.properties
│   │   ├── translations_nl.properties
│   │   ├── translations_pl.properties
│   │   ├── translations_pt.properties
│   │   ├── translations_ru.properties
│   │   ├── translations_sv.properties
│   │   ├── translations_tr.properties
│   │   ├── translations_vi.properties
│   │   ├── translations_zh-Hans.properties
│   │   └── translations_zh-Hant.properties
│   └── texts/
│       ├── termiusSetup_da.md
│       ├── termiusSetup_de.md
│       ├── termiusSetup_en.md
│       ├── termiusSetup_es.md
│       ├── termiusSetup_fr.md
│       ├── termiusSetup_id.md
│       ├── termiusSetup_it.md
│       ├── termiusSetup_ja.md
│       ├── termiusSetup_ko.md
│       ├── termiusSetup_nl.md
│       ├── termiusSetup_pl.md
│       ├── termiusSetup_pt.md
│       ├── termiusSetup_ru.md
│       ├── termiusSetup_sv.md
│       ├── termiusSetup_tr.md
│       ├── termiusSetup_vi.md
│       ├── termiusSetup_zh-Hans.md
│       ├── termiusSetup_zh-Hant.md
│       ├── xshellSetup_da.md
│       ├── xshellSetup_de.md
│       ├── xshellSetup_en.md
│       ├── xshellSetup_es.md
│       ├── xshellSetup_fr.md
│       ├── xshellSetup_id.md
│       ├── xshellSetup_it.md
│       ├── xshellSetup_ja.md
│       ├── xshellSetup_ko.md
│       ├── xshellSetup_nl.md
│       ├── xshellSetup_pl.md
│       ├── xshellSetup_pt.md
│       ├── xshellSetup_ru.md
│       ├── xshellSetup_sv.md
│       ├── xshellSetup_tr.md
│       ├── xshellSetup_vi.md
│       ├── xshellSetup_zh-Hans.md
│       └── xshellSetup_zh-Hant.md
├── settings.gradle
└── version

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
*.xcf binary
*.properties linguist-generated



================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "gradle"
    directory: "/"
    schedule:
      interval: "daily"
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: "daily"


================================================
FILE: .gitignore
================================================
.gradle/
build/
.idea/*
!.idea/codeStyles
!.idea/inspectionProfiles
lib/
dev.properties
extensions.txt
dev_storage
local/
local*/
local_*/
.vs
.vscode
obj
out
bin
.DS_Store
ComponentsGenerated.wxs
!dist/javafx/**/lib
!dist/javafx/**/bin
xcuserdata/
*.dylib
project.xcworkspace
translations_patch


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement via [hello@xpipe.io](mailto:hello@xpipe.io).
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

================================================
FILE: CONTRIBUTING.md
================================================
# Development

Any contribution is welcomed!
There are no real formal contribution guidelines right now, they will maybe come later.

## Repository Structure

- [core](core) - Shared core classes of the XPipe Java API, XPipe extensions, and the XPipe daemon implementation.
  This mainly concerns API classes not a lot of implementation.
- [beacon](beacon) - The XPipe beacon component is responsible for handling all communications between the XPipe
  daemon and the client applications, for example APIs and the CLI
- [app](app) - Contains the XPipe daemon implementation and the XPipe desktop application
- [dist](dist) - Tools to create a distributable package of XPipe
- [ext](ext) - Available XPipe extensions. Essentially every concrete feature implementation is implemented as an extension

## Development Setup

You need to have JDK for Java 25 installed to compile the project.
If you are on Linux or macOS, you can easily accomplish that by using [SDKMAN](https://sdkman.io/) and running
```bash
curl -s "https://get.sdkman.io" | bash
. "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 25.0.2-graalce
sdk default java 25.0.2-graalce
```

On Windows, you have to manually install a JDK, e.g. from [Adoptium](https://adoptium.net/temurin/releases/?version=25).

You can configure a few development options in the file `app/dev.properties` which will be automatically generated when gradle is first run.

You need to have an up-to-date version of XPipe installed on your local system in order to properly
run XPipe in a development environment.
This is due to the fact that some components are only included in the release version and not in this repository.
XPipe is able to automatically detect your local installation and fetch the required
components from it when it is run in a development environment.

To disable the local installation check, you can set the property `io.xpipe.app.locator.disableInstallationVersionCheck=false` in the file `app/dev.properties`. This allows it to start up even if there are version mismatches. Some things might not work as expected though. You can also use a local PTB installation instead of the stable release version by setting the property `io.xpipe.app.locator.usePtbInstallation=true` in the file `app/dev.properties`.

Note that in case the current master branch is ahead of the latest release, it might happen that there are some incompatibilities when loading data from your local XPipe installation.
You should therefore always check out the matching version tag for your local repository and local XPipe installation.
You can find the available version tags at https://github.com/xpipe-io/xpipe/tags.
So for example if you currently have XPipe `21.0` installed, you should run `git reset --hard 21.0` first to properly compile against it.

## Building and Running

You can use the gradle wrapper to build and run the project:
- `gradlew app:run` will run the desktop application. You can set various useful properties in `app/build.gradle`
- `gradlew clean dist` will create a distributable production version in `dist/build/dist/base`.
- `gradlew <project>:test` will run the tests of the specified project.

You are also able to properly debug the built production application:
- The `dist/build/dist/base/app/scripts/xpiped_debug` script will launch the application in debug mode and with a console attached to it

## Modularity and IDEs

All XPipe components target [Java 25](https://openjdk.java.net/projects/jdk/25/) and make full use of the Java Module System (JPMS).
All components are modularized, including all their dependencies.
In case a dependency is (sadly) not modularized yet, module information is manually added using [extra-java-module-info](https://github.com/gradlex-org/extra-java-module-info).
Further, note that as this is a pretty complicated Java project that fully utilizes modularity,
many IDEs still have problems building this project properly.

For example, you can't build this project in eclipse or vscode as it will complain about missing modules.
The tested and recommended IDE is IntelliJ.
When setting up the project in IntelliJ, make sure that the correct JDK (Java 25)
is selected both for the project and for gradle itself.

## Contributing guide

Especially when starting out, it might be a good idea to start with easy tasks first. Here's a selection of suitable common tasks that are very easy to implement:

### Interacting via the HTTP API

You can create clients that communicate with the XPipe daemon via its HTTP API.
To get started, see the [OpenAPI spec](https://docs.xpipe.io/api).

### Implementing support for a new editor

All code for handling external editors can be found [here](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java). There you will find plenty of working examples that you can use as a base for your own implementation.

### Implementing support for a new terminal

All code for handling external terminals can be found [here](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/java/io/xpipe/app/terminal/). There you will find plenty of working examples that you can use as a base for your own implementation.

### Adding more context menu actions in the file browser

In case you want to implement your own actions for certain file types in the file browser, you can easily do so. You can find most existing actions [here](https://github.com/xpipe-io/xpipe/tree/master/ext/base/src/main/java/io/xpipe/ext/base/browser) to get some inspiration.
Once you created your custom classes, you have to register them in your module info, just like [here](https://github.com/xpipe-io/xpipe/blob/master/ext/base/src/main/java/module-info.java).

### Implementing custom actions for the connection hub

All actions that you can perform for certain connections in the connection overview tab are implemented using an [Action API](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/java/io/xpipe/app/ext/ActionProvider.java). You can find a sample implementation [here](https://github.com/xpipe-io/xpipe/blob/master/ext/base/src/main/java/io/xpipe/ext/base/action/SampleAction.java) and many common action implementations [here](https://github.com/xpipe-io/xpipe/tree/master/ext/base/src/main/java/io/xpipe/ext/base/action).

### Adding more predefined scripts

You can add custom script definitions [here](https://github.com/xpipe-io/xpipe/tree/master/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java) and [here](https://github.com/xpipe-io/xpipe/tree/master/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts).

### Adding more file icons for specific types

You can register file types [here](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/resources/io/xpipe/app/resources/file_list.txt) and add the respective icons [here](https://github.com/xpipe-io/xpipe/tree/master/app/src/main/resources/io/xpipe/app/resources/img/browser).

The existing file list and icons are taken from the [vscode-icons](https://github.com/vscode-icons/vscode-icons) project. Due to limitations in the file definition list compatibility, some file types might not be listed by their proper extension and are therefore not being applied correctly even though the images and definitions exist already.

### Implementing something else

if you want to work on something that was not listed here, you can still do so of course. You can reach out on the [Discord server](https://discord.gg/8y89vS8cRb) to discuss any development plans and get you started.

### Adding translations

See the [translation guide](/lang) for details.


================================================
FILE: LICENSE.md
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

   "License" shall mean the terms and conditions for use, reproduction,
   and distribution as defined by Sections 1 through 9 of this document.

   "Licensor" shall mean the copyright owner or entity authorized by
   the copyright owner that is granting the License.

   "Legal Entity" shall mean the union of the acting entity and all
   other entities that control, are controlled by, or are under common
   control with that entity. For the purposes of this definition,
   "control" means (i) the power, direct or indirect, to cause the
   direction or management of such entity, whether by contract or
   otherwise, or (ii) ownership of fifty percent (50%) or more of the
   outstanding shares, or (iii) beneficial ownership of such entity.

   "You" (or "Your") shall mean an individual or Legal Entity
   exercising permissions granted by this License.

   "Source" form shall mean the preferred form for making modifications,
   including but not limited to software source code, documentation
   source, and configuration files.

   "Object" form shall mean any form resulting from mechanical
   transformation or translation of a Source form, including but
   not limited to compiled object code, generated documentation,
   and conversions to other media types.

   "Work" shall mean the work of authorship, whether in Source or
   Object form, made available under the License, as indicated by a
   copyright notice that is included in or attached to the work
   (an example is provided in the Appendix below).

   "Derivative Works" shall mean any work, whether in Source or Object
   form, that is based on (or derived from) the Work and for which the
   editorial revisions, annotations, elaborations, or other modifications
   represent, as a whole, an original work of authorship. For the purposes
   of this License, Derivative Works shall not include works that remain
   separable from, or merely link (or bind by name) to the interfaces of,
   the Work and Derivative Works thereof.

   "Contribution" shall mean any work of authorship, including
   the original version of the Work and any modifications or additions
   to that Work or Derivative Works thereof, that is intentionally
   submitted to Licensor for inclusion in the Work by the copyright owner
   or by an individual or Legal Entity authorized to submit on behalf of
   the copyright owner. For the purposes of this definition, "submitted"
   means any form of electronic, verbal, or written communication sent
   to the Licensor or its representatives, including but not limited to
   communication on electronic mailing lists, source code control systems,
   and issue tracking systems that are managed by, or on behalf of, the
   Licensor for the purpose of discussing and improving the Work, but
   excluding communication that is conspicuously marked or otherwise
   designated in writing by the copyright owner as "Not a Contribution."

   "Contributor" shall mean Licensor and any individual or Legal Entity
   on behalf of whom a Contribution has been received by Licensor and
   subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   copyright license to reproduce, prepare Derivative Works of,
   publicly display, publicly perform, sublicense, and distribute the
   Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
   this License, each Contributor hereby grants to You a perpetual,
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   (except as stated in this section) patent license to make, have made,
   use, offer to sell, sell, import, and otherwise transfer the Work,
   where such license applies only to those patent claims licensable
   by such Contributor that are necessarily infringed by their
   Contribution(s) alone or by combination of their Contribution(s)
   with the Work to which such Contribution(s) was submitted. If You
   institute patent litigation against any entity (including a
   cross-claim or counterclaim in a lawsuit) alleging that the Work
   or a Contribution incorporated within the Work constitutes direct
   or contributory patent infringement, then any patent licenses
   granted to You under this License for that Work shall terminate
   as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
   Work or Derivative Works thereof in any medium, with or without
   modifications, and in Source or Object form, provided that You
   meet the following conditions:

   (a) You must give any other recipients of the Work or
   Derivative Works a copy of this License; and

   (b) You must cause any modified files to carry prominent notices
   stating that You changed the files; and

   (c) You must retain, in the Source form of any Derivative Works
   that You distribute, all copyright, patent, trademark, and
   attribution notices from the Source form of the Work,
   excluding those notices that do not pertain to any part of
   the Derivative Works; and

   (d) If the Work includes a "NOTICE" text file as part of its
   distribution, then any Derivative Works that You distribute must
   include a readable copy of the attribution notices contained
   within such NOTICE file, excluding those notices that do not
   pertain to any part of the Derivative Works, in at least one
   of the following places: within a NOTICE text file distributed
   as part of the Derivative Works; within the Source form or
   documentation, if provided along with the Derivative Works; or,
   within a display generated by the Derivative Works, if and
   wherever such third-party notices normally appear. The contents
   of the NOTICE file are for informational purposes only and
   do not modify the License. You may add Your own attribution
   notices within Derivative Works that You distribute, alongside
   or as an addendum to the NOTICE text from the Work, provided
   that such additional attribution notices cannot be construed
   as modifying the License.

   You may add Your own copyright statement to Your modifications and
   may provide additional or different license terms and conditions
   for use, reproduction, or distribution of Your modifications, or
   for any such Derivative Works as a whole, provided Your use,
   reproduction, and distribution of the Work otherwise complies with
   the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
   any Contribution intentionally submitted for inclusion in the Work
   by You to the Licensor shall be under the terms and conditions of
   this License, without any additional terms or conditions.
   Notwithstanding the above, nothing herein shall supersede or modify
   the terms of any separate license agreement you may have executed
   with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
   names, trademarks, service marks, or product names of the Licensor,
   except as required for reasonable and customary use in describing the
   origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
   agreed to in writing, Licensor provides the Work (and each
   Contributor provides its Contributions) on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
   implied, including, without limitation, any warranties or conditions
   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
   PARTICULAR PURPOSE. You are solely responsible for determining the
   appropriateness of using or redistributing the Work and assume any
   risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
   whether in tort (including negligence), contract, or otherwise,
   unless required by applicable law (such as deliberate and grossly
   negligent acts) or agreed to in writing, shall any Contributor be
   liable to You for damages, including any direct, indirect, special,
   incidental, or consequential damages of any character arising as a
   result of this License or out of the use or inability to use the
   Work (including but not limited to damages for loss of goodwill,
   work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses), even if such Contributor
   has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
   the Work or Derivative Works thereof, You may choose to offer,
   and charge a fee for, acceptance of support, warranty, indemnity,
   or other liability obligations and/or rights consistent with this
   License. However, in accepting such obligations, You may act only
   on Your own behalf and on Your sole responsibility, not on behalf
   of any other Contributor, and only if You agree to indemnify,
   defend, and hold each Contributor harmless for any liability
   incurred by, or claims asserted against, such Contributor by reason
   of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

Copyright 2023 Christopher Schnick
Copyright 2023 XPipe UG (haftungsbeschränkt)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


================================================
FILE: README.md
================================================
<p align="center">
    <a href="https://xpipe.io" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/img/banner.png" alt="XPipe Banner" />
    </a>
</p>

<h1></h1>

## About

XPipe is a connection hub that allows you to access your entire server infrastructure from your local desktop. It works on top of your installed command-line programs like SSH, docker, or others, and does not require any setup on your remote systems. It integrates with your favourite text editors, terminals, shells, VNC/RDP clients, password managers, and command-line tools. The platform is designed to be extensible, allowing anyone to add easily support for more tools or to implement custom functionality through a modular extension system.

It currently supports:

- [SSH](https://docs.xpipe.io/guide/ssh) connections, config files, and tunnels
- [Docker](https://docs.xpipe.io/guide/docker) + compose, [Podman](https://docs.xpipe.io/guide/podman), [LXD](https://docs.xpipe.io/guide/lxc), and [incus](https://docs.xpipe.io/guide/lxc) containers
- [Proxmox PVE](https://docs.xpipe.io/guide/proxmox), [Hyper-V](https://docs.xpipe.io/guide/hyperv), [KVM](https://docs.xpipe.io/guide/kvm), and [VMware Player/Workstation/Fusion](https://docs.xpipe.io/guide/vmware) virtual machines
- [Tailscale](https://docs.xpipe.io/guide/tailscale), [Netbird](https://docs.xpipe.io/guide/netbird), and [Teleport](https://docs.xpipe.io/guide/teleport) connections
- [AWS](https://docs.xpipe.io/guide/aws) and [Hetzner Cloud](https://docs.xpipe.io/guide/hcloud) servers
- [RDP](https://docs.xpipe.io/guide/rdp) and [VNC](https://docs.xpipe.io/guide/vnc) connections
- Windows Subsystem for Linux, Cygwin, and MSYS2 environments
- [Kubernetes](https://docs.xpipe.io/guide/kubernetes) clusters, pods, and containers
- [Powershell Remote Sessions](https://docs.xpipe.io/guide/pssession)

---

<div align="center">
    <a href="https://docs.xpipe.io/guide/ssh" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/ssh.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/docker" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/docker.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/docker#compose" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/compose.png" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/lxc" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/lxd.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/podman" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/podman.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/aws" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/aws.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/kubernetes" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/k8s.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/proxmox" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/proxmox.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/vmware" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/vmware.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/kvm" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/virsh.png" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/tailscale" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/tailscale.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/netbird" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/netbird.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/hcloud" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/hetzner.svg" width=40 height=40 />
    </a>
    <a href="#"><img width=10 /></a>
    <a href="https://docs.xpipe.io/guide/teleport" target="_blank" rel="noopener">
        <img src="https://github.com/xpipe-io/.github/raw/main/icons/teleport.png" width=40 height=40 />
    </a>
</div>

## Connection hub

- Easily establish and manage connections to remote systems from a central hub interface
- Organize all your connections in hierarchical categories to maintain an overview over hundreds of connections.
- Create custom shell login environments to instantly jump into a properly set up shell for every use case
- Quickly perform various commonly used actions like starting/stopping systems, establishing tunnels, and more
- Create desktop shortcuts and macros that automatically open remote connections in your terminal without having to open any GUI

![Connection hub](https://github.com/xpipe-io/.github/raw/main/img/hub_shadow.png)

## File browser

- Interact with the file system of any remote system using a workflow optimized for professionals
- Utilize your entire arsenal of locally installed programs to open and edit remote files
- Dynamically elevate sessions with sudo when required without having to restart the session
- Seamlessly transfer files from and to your system desktop environment
- Work and perform transfers on multiple systems at the same time with the built-in tabbed multitasking
- Quickly open a terminal session into any directory in your favourite terminal emulator
- Customize every action through the scripting system

![Browser](https://github.com/xpipe-io/.github/raw/main/img/browser_shadow.png)

## Terminal launcher

- Launches you into a shell session in your favourite terminal with one click. Automatically fills password prompts and more
- Comes with support for all commonly used terminal emulators across all operating systems
- Supports opening custom terminal emulators as well via a custom command-line spec
- Works with all command shells such as bash, zsh, fish, cmd, PowerShell, and more, locally and remote
- Integrates with multiplexers like tmux and zellij, plus prompts like starship and oh-my-zsh
- Supports opening multiple sessions in split terminal pane views
- Connects to a system while the terminal is still starting up, allowing for faster connections than otherwise possible

![Terminal](https://github.com/xpipe-io/.github/raw/main/img/terminal_shadow.png)

## Versatile scripting system

- Create reusable simple shell scripts, templates, and groups to run on connected remote systems
- Automatically make your scripts available in the PATH on any remote system without any setup
- Setup shell init environments for connections to fully customize your work environment for every purpose
- Open custom shells and custom remote connections by providing your own commands
- Use custom scripts in the file browser 

![scripts](https://github.com/xpipe-io/.github/raw/main/img/scripts_shadow.png)

## And much more

- You can synchronize your vault across multiple systems and share it with other team members via your own self-hosted git repository
- All data is stored exclusively on your systems in a cryptographically secure vault. You can also choose to increase security by using a custom master passphrase for further encryption
- XPipe is able to retrieve secrets automatically from your installed password manager and doesn't have store secrets itself
- There are no servers involved, all your information stays on your systems. The XPipe application does not send any personal or sensitive information to outside services
- XPipe has an integrated MCP server that you can enable. This allows you to easily use all of XPipe's features from an AI agent
- Run coherent desktop applications remotely via the uniform desktop application system in XPipe for RDP, VNC, and X11 forwards
- Securely tunnel and automatically open remote services with one click with the services integration

# Downloads

Note that this is a desktop application that should be run on your local desktop workstation, not on any server or containers. It will be able to connect to your server infrastructure from there.

For a full reference and instructions, see the [installation docs](https://docs.xpipe.io/guide/installation) and [managed installation docs](https://docs.xpipe.io/guide/managed-installation).

## Windows

Installers are the easiest way to get started and come with an optional automatic update functionality:

- [Windows .msi Installer (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-windows-x86_64.msi)
- [Windows .msi Installer (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-windows-arm64.msi)

If you don't like installers, you can also use a portable version that is packaged as an archive:

- [Windows .zip Portable (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-windows-x86_64.zip)
- [Windows .zip Portable (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-windows-arm64.zip)

Alternatively, you can also use the following package managers:
- [choco](https://community.chocolatey.org/packages/xpipe) to install it with `choco install xpipe`.
- [winget](https://github.com/microsoft/winget-cli) to install it with `winget install xpipe-io.xpipe --source winget`.
- [scoop](https://github.com/microsoft/winget-cli) to install it with `scoop install extras/xpipe`.

## macOS

Installers are the easiest way to get started and come with an optional automatic update functionality:

- [MacOS .pkg Installer (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-macos-x86_64.pkg)
- [MacOS .pkg Installer (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-macos-arm64.pkg)

If you don't like installers, you can also use a portable version that is packaged as an archive:

- [MacOS .dmg Portable (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-macos-x86_64.dmg)
- [MacOS .dmg Portable (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-macos-arm64.dmg)

Alternatively, you can also use [Homebrew](https://github.com/xpipe-io/homebrew-tap) to install XPipe with `brew install --cask xpipe-io/tap/xpipe`.

## Linux

You can install XPipe the fastest by pasting the installation command into your terminal. This will perform the setup automatically.
The script supports installation via `apt`, `dnf`, `yum`, `zypper`, `rpm`, and `pacman` on Linux:

```
bash <(curl -sL https://github.com/xpipe-io/xpipe/raw/master/get-xpipe.sh)
```

Of course, there are also other installation methods available.

### Debian-based distros

The following debian installers are available:

- [Linux .deb Installer (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-linux-x86_64.deb)
- [Linux .deb Installer (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-linux-arm64.deb)

Note that you should use apt to install the package with `sudo apt install <file>` as other package managers, for example dpkg,
are not able to resolve and install any dependency packages.

### RHEL-based distros

The rpm releases are signed with the GPG key https://xpipe.io/signatures/crschnick.asc.
You can import it via `rpm --import https://xpipe.io/signatures/crschnick.asc` to allow your rpm-based package manager to verify the release signature. 

The following rpm installers are available:

- [Linux .rpm Installer (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-linux-x86_64.rpm)
- [Linux .rpm Installer (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-linux-arm64.rpm)

### Arch

There is an official [AUR package](https://aur.archlinux.org/packages/xpipe) available that you can either install manually or via an AUR helper such as with `yay -S xpipe`.

### AppImages

Alternatively, there are also AppImages available. These can be useful if you are using an immutable distro.

- [Linux .AppImage Portable (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-linux-x86_64.AppImage)
- [Linux .AppImage Portable (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-linux-arm64.AppImage)

### NixOS

There's an official [xpipe nixpkg](https://search.nixos.org/packages?channel=unstable&show=xpipe&from=0&size=50&sort=relevance&type=packages&query=xpipe) available that you can install with `nix-env -iA nixos.xpipe` on x86_64 Linux systems. This package is however usually not up to date.

There is also a custom repository that contains the latest up-to-date release flakes for Linux and macOS systems: https://github.com/xpipe-io/nixpkg.

### Tarball

In case you prefer to use an archive version that you can extract anywhere, you can use these:

- [Linux .tar.gz Portable (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-linux-x86_64.tar.gz)
- [Linux .tar.gz Portable (ARM 64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-portable-linux-arm64.tar.gz)

### Docker container

XPipe is a desktop application first and foremost. It requires a full desktop environment to function with various installed applications such as terminals, editors, shells, CLI tools, and more. So there is no true web-based interface for XPipe.

Since it might make sense however to access your XPipe environment from the web, there is also a so-called webtop docker container image for XPipe. [XPipe Webtop](https://github.com/xpipe-io/xpipe-webtop) is a web-based desktop environment that can be run in a container and accessed from a browser via KasmVNC. The desktop environment comes with XPipe and various terminals and editors preinstalled and configured. This image is also available for Kasm Workspaces in the [XPipe Kasm Registry](https://github.com/xpipe-io/kasm-registry).

# Further information

## Contributing

See [CONTRIBUTING.md](/CONTRIBUTING.md) for details.

<img src="https://contrib.rocks/image?repo=xpipe-io/xpipe" alt="contrib.rocks image" />

## Open source model

XPipe follows an open core model, which essentially means that the main application is open source while certain other components are not. This mainly concerns the features only available in the homelab/professional plan and the shell handling library implementation. Furthermore, some CI pipelines and tests that run on private servers are also not included in the open repository.

The distributed XPipe application consists out of two parts:
- The open-source core that you can find this repository. It is licensed under the [Apache License 2.0](/LICENSE.md).
- The closed-source extensions, mostly for homelab/professional plan features, which are not included in this repository

Additional features are available in the homelab/professional plan. For more details see https://xpipe.io/pricing.
If your enterprise puts great emphasis on having access to the full source code, there are also full source-available enterprise options available.

## Documentation

You can find the documentation at https://docs.xpipe.io.

## Discord

[![Discord](https://discordapp.com/api/guilds/979695018782646285/widget.png?style=banner2)](https://discord.gg/8y89vS8cRb)


================================================
FILE: SECURITY.md
================================================
# Security 

Due to its nature, XPipe has to handle a lot of sensitive information. Therefore, the security, integrity, and privacy of your data has topmost priority.

More information about the security approach of the XPipe application can be found on the documentation website at https://docs.xpipe.io/reference/security.

You can report security vulnerabilities in this GitHub repository in a confidential manner. We will get back to you as soon as possible if you do.


================================================
FILE: app/build.gradle
================================================
plugins {
    id 'application'
    id 'jvm-test-suite'
    id 'java-library'
}

repositories {
    mavenCentral()
}

apply from: "$rootDir/gradle/gradle_scripts/java.gradle"
apply from: "$rootDir/gradle/gradle_scripts/javafx.gradle"
apply from: "$rootDir/gradle/gradle_scripts/jna.gradle"
apply from: "$rootDir/gradle/gradle_scripts/lombok.gradle"

configurations {
    implementation.extendsFrom(javafx)
    api.extendsFrom(jna)
}

dependencies {
    api project(':core')
    api project(':beacon')

    compileOnly 'org.hamcrest:hamcrest:3.0'
    compileOnly 'org.junit.jupiter:junit-jupiter-api:5.14.2'
    compileOnly 'org.junit.jupiter:junit-jupiter-params:5.14.2'

    api 'com.vladsch.flexmark:flexmark:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-options:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-data:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-ast:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-builder:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-sequence:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-misc:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-dependency:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-collection:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-format:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-html:0.64.8'
    api 'com.vladsch.flexmark:flexmark-util-visitor:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-tables:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-gfm-strikethrough:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-gfm-tasklist:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-footnotes:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-definition:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-anchorlink:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-yaml-front-matter:0.64.8'
    api 'com.vladsch.flexmark:flexmark-ext-toc:0.64.8'

    api ('io.modelcontextprotocol.sdk:mcp-core:0.17.2')  {
        exclude group: "com.ethlo.time", module: "itu"
    }
    api ('io.modelcontextprotocol.sdk:mcp-json:0.17.2')  {
        exclude group: "com.ethlo.time", module: "itu"
    }
    api ('io.modelcontextprotocol.sdk:mcp-json-jackson2:0.17.2')  {
        exclude group: "com.ethlo.time", module: "itu"
        exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-yaml"
    }

    api "io.projectreactor:reactor-core:3.7.9"
    api "org.reactivestreams:reactive-streams:1.0.4"
    api ("com.networknt:json-schema-validator:1.5.8") {
        exclude group: "com.ethlo.time", module: "itu"
        exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-yaml"
    }

    api "com.github.weisj:jsvg:1.7.2"
    api 'io.xpipe:vernacular:1.16'
    api 'org.bouncycastle:bcprov-jdk18on:1.83'
    api 'info.picocli:picocli:4.7.7'
    api 'org.apache.commons:commons-lang3:3.20.0'
    api 'io.sentry:sentry:8.20.0'
    api 'commons-io:commons-io:2.21.0'
    api "com.fasterxml.jackson.core:jackson-databind:2.21.0"
    api "com.fasterxml.jackson.core:jackson-annotations:2.21"
    api "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.0"
    api "org.kordamp.ikonli:ikonli-material2-pack:12.4.0"
    api "org.kordamp.ikonli:ikonli-materialdesign2-pack:12.4.0"
    api 'org.kordamp.ikonli:ikonli-bootstrapicons-pack:12.4.0'
    api "org.kordamp.ikonli:ikonli-javafx:12.4.0"
    api "org.slf4j:slf4j-api:2.0.17"
    api "org.slf4j:slf4j-jdk-platform-logging:2.0.17"
    api 'io.xpipe:modulefs:0.1.8'
    api 'net.synedra:validatorfx:0.4.2'
    api files("$rootDir/gradle/gradle_scripts/atlantafx-base-2.0.2.jar")

    api("org.int4.fx:fx-values:0.4")
    api files("$rootDir/gradle/gradle_scripts/fx-builders-1.0.0-SNAPSHOT.jar")
}

apply from: "$rootDir/gradle/gradle_scripts/local_junit_suite.gradle"

def extensionJarDepList = project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)).toList()
jar {
    finalizedBy(extensionJarDepList)
}

application {
    mainModule = groupName + '.app'
    mainClass = groupName + '.app.Main'
    applicationDefaultJvmArgs = jvmRunArgs
}

run {
    systemProperty propertyName('useVirtualThreads'), 'false'
    systemProperty propertyName('mode'), 'gui'
    systemProperty propertyName('writeLogs'), "true"
    systemProperty propertyName('writeSysOut'), "true"
    systemProperty propertyName('developerMode'), "true"
    systemProperty propertyName('logLevel'), "trace"
    systemProperty propertyName('fullVersion'), fullVersion
    systemProperty propertyName('staging'), isStage

    // Apply passed xpipe properties
    for (final def e in System.getProperties().entrySet()) {
        if (e.getKey().toString().contains(snakeProductName)) {
            systemProperty e.getKey().toString(), e.getValue()
        }
    }

    workingDir = rootDir
    jvmArgs += ['-XX:+EnableDynamicAgentLoading']

    def exts = files(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0].outputs.files.singleFile).toList())
    classpath += exts

    dependsOn(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0]).toList())
}

tasks.register('runAttachedDebugger', JavaExec) {
    workingDir = rootDir
    classpath = run.classpath
    mainModule = groupName + '.app'
    mainClass = groupName + '.app.Main'
    modularity.inferModulePath = true
    jvmArgs += jvmRunArgs
    jvmArgs += List.of(
            "-javaagent:${System.getProperty("user.home")}/.attachme/attachme-agent-1.2.9.jar=port:7857,host:localhost".toString(),
            "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
    )
    jvmArgs += ['-XX:+EnableDynamicAgentLoading']
    systemProperties run.systemProperties

    def exts = files(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0].outputs.files.singleFile).toList())
    classpath += exts
    dependsOn(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0]).toList())

}

processResources {
    doLast {
        def cssFiles = fileTree(dir: "$sourceSets.main.output.resourcesDir/io/xpipe/app/resources/style")
        cssFiles.include "**/*.css"
        cssFiles.each { css ->
            providers.javaexec {
                workingDir = projectDir
                jvmArgs += ["--module-path=${configurations.javafx.asFileTree.asPath},", "--add-modules=javafx.graphics"]
                mainClass = "com.sun.javafx.css.parser.Css2Bin"
                args css
            }.result.get()

            delete css
        }
    }

    doLast {
        def resourcesDir = new File(sourceSets.main.output.resourcesDir, "io/xpipe/app/resources/third-party")
        resourcesDir.mkdirs()
        copy {
            from "$rootDir/dist/licenses"
            into resourcesDir
        }
    }
}

distTar {
    enabled = false
}

distZip {
    enabled = false
}

assembleDist {
    enabled = false
}

================================================
FILE: app/src/main/java/io/xpipe/app/Main.java
================================================
package io.xpipe.app;

import io.xpipe.app.core.AppNames;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.core.mode.AppOperationMode;

public class Main {

    static void main(String[] args) {
        if (args.length == 1 && args[0].equals("version")) {
            AppProperties.init(args);
            System.out.println(AppProperties.get().getVersion());
            return;
        }

        // Since this is not marked as a console application, it will not print anything when you run it in a console on
        // Windows
        if (args.length == 1 && args[0].equals("--help")) {
            System.out.printf("""
                              The daemon executable %s does not accept any command-line arguments.

                              For a reference on how to use xpipe from the command-line, take a look at https://docs.xpipe.io/cli.
                              %n""", AppNames.ofCurrent().getExecutableName());
            return;
        }

        AppOperationMode.init(args);
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/AbstractAction.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.comp.base.ModalButton;
import io.xpipe.app.comp.base.ModalOverlay;
import io.xpipe.app.core.AppCache;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.AppLayoutModel;
import io.xpipe.app.core.window.AppDialog;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.platform.LabelGraphic;
import io.xpipe.app.util.DataStoreFormatter;
import io.xpipe.app.util.LicensedFeature;
import io.xpipe.app.util.ThreadHelper;

import lombok.experimental.SuperBuilder;

import java.util.*;
import java.util.function.Consumer;

@SuperBuilder
public abstract class AbstractAction {

    private static final Set<AbstractAction> active = new HashSet<>();
    private static boolean closed;
    private static Consumer<AbstractAction> pick;

    public static synchronized void expectPick() {
        if (pick != null) {
            return;
        }

        var show = !AppCache.getBoolean("pickIntroductionShown", false);
        if (show) {
            var modal = ModalOverlay.of("actionPickerTitle", AppDialog.dialogTextKey("actionPickerDescription"));
            modal.addButton(ModalButton.ok());
            modal.showAndWait();
            AppCache.update("pickIntroductionShown", true);
        }

        AppLayoutModel.get().getQueueEntries().add(queueEntry);
        pick = action -> {
            if (action instanceof SerializableAction) {
                cancelPick();
                var modal = ModalOverlay.of("actionShortcuts", new ActionPickComp(action).prefWidth(600));
                modal.show();
            }
        };
    }

    private static final AppLayoutModel.QueueEntry queueEntry = new AppLayoutModel.QueueEntry(
            AppI18n.observable("cancelActionPicker"), new LabelGraphic.IconGraphic("mdal-cancel_presentation"), () -> {
                cancelPick();
                return true;
            });

    public static synchronized void cancelPick() {
        AppLayoutModel.get().getQueueEntries().remove(queueEntry);
        pick = null;
    }

    public static void reset() {
        closed = true;
        for (int i = 50; i > 0; i--) {
            synchronized (active) {
                var count = active.size();
                if (count == 0) {
                    break;
                }
            }

            // Wait 5s max
            ThreadHelper.sleep(100);
        }

        synchronized (active) {
            for (AbstractAction abstractAction : active) {
                TrackEvent.info("Action has not quit after timeout: " + abstractAction.toString());
            }
        }
    }

    public boolean executeSync() {
        if (closed) {
            return false;
        }

        synchronized (AbstractAction.class) {
            if (pick != null) {
                TrackEvent.withTrace("Picked action").tags(toDisplayMap()).handle();
                pick.accept(this);
                pick = null;
                return false;
            }
        }

        return executeSyncImpl(true);
    }

    public void executeAsync() {
        if (closed) {
            return;
        }

        synchronized (AbstractAction.class) {
            if (pick != null) {
                TrackEvent.withTrace("Picked action").tags(toDisplayMap()).handle();
                pick.accept(this);
                pick = null;
                return;
            }
        }

        ThreadHelper.runAsync(() -> {
            executeSyncImpl(true);
        });
    }

    public boolean executeSyncImpl(boolean confirm) {
        if (confirm && !ActionConfirmation.confirmAction(this)) {
            return false;
        }

        if (closed) {
            return false;
        }

        checkLicense();

        synchronized (active) {
            active.add(this);
        }

        TrackEvent.withTrace("Starting action execution").tags(toDisplayMap()).handle();

        try {
            beforeExecute();
        } catch (Throwable t) {
            ErrorEventFactory.fromThrowable(t).handle();
            return false;
        }

        try {
            executeImpl();
            return true;
        } catch (Throwable t) {
            ErrorEventFactory.fromThrowable(t).handle();
            return false;
        } finally {
            afterExecute();
            synchronized (active) {
                active.remove(this);
            }
        }
    }

    public String getId() {
        return getProvider().getId();
    }

    public String getDisplayName() {
        var id = getId();
        return id != null ? DataStoreFormatter.camelCaseToName(id) : "?";
    }

    public ActionProvider getProvider() {
        var clazz = getClass();
        var enc = clazz.getEnclosingClass();
        if (enc == null) {
            throw new IllegalStateException("No enclosing instance of " + clazz);
        }
        return ActionProvider.ALL.stream()
                .filter(actionProvider -> actionProvider.getClass().equals(enc))
                .findFirst()
                .orElseThrow(IllegalStateException::new);
    }

    public String getShortcutName() {
        return getDisplayName();
    }

    public abstract void executeImpl() throws Exception;

    protected void beforeExecute() throws Exception {}

    public boolean isMutation() {
        return false;
    }

    public boolean forceConfirmation() {
        return false;
    }

    public LicensedFeature getLicensedFeature() {
        return null;
    }

    protected void checkLicense() {
        var feature = getLicensedFeature();
        if (feature != null) {
            feature.throwIfUnsupported();
        }
    }

    protected void afterExecute() {}

    public abstract Map<String, String> toDisplayMap();
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionConfigComp.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.comp.BaseRegionBuilder;
import io.xpipe.app.comp.SimpleRegionBuilder;
import io.xpipe.app.comp.base.*;
import io.xpipe.app.ext.DataStore;
import io.xpipe.app.hub.action.BatchStoreAction;
import io.xpipe.app.hub.action.MultiStoreAction;
import io.xpipe.app.hub.action.StoreAction;
import io.xpipe.app.hub.comp.StoreChoiceComp;
import io.xpipe.app.hub.comp.StoreListChoiceComp;
import io.xpipe.app.hub.comp.StoreViewState;
import io.xpipe.app.platform.OptionsBuilder;
import io.xpipe.app.storage.DataStoreEntryRef;

import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.scene.layout.Region;

public class ActionConfigComp extends SimpleRegionBuilder {

    private final Property<AbstractAction> action;

    public ActionConfigComp(Property<AbstractAction> action) {
        this.action = action;
    }

    @Override
    protected Region createSimple() {
        var options = new OptionsBuilder();
        options.nameAndDescription("actionStore")
                .addComp(createChooser())
                .nameAndDescription("actionStores")
                .addComp(createMultiChooser());
        options.nameAndDescription("actionConfiguration").addComp(createTextArea());
        return options.build();
    }

    @SuppressWarnings("unchecked")
    private BaseRegionBuilder<?, ?> createMultiChooser() {
        var listProp = new SimpleListProperty<DataStoreEntryRef<DataStore>>(FXCollections.observableArrayList());
        if (action.getValue() instanceof BatchStoreAction<?> ba) {
            listProp.setAll(((BatchStoreAction<DataStore>) ba).getRefs());
        } else if (action.getValue() instanceof MultiStoreAction<?> ma) {
            listProp.setAll(((MultiStoreAction<DataStore>) ma).getRefs());
        } else {
            listProp.clear();
        }

        listProp.addListener((obs, o, n) -> {
            if (action.getValue() instanceof BatchStoreAction<?> ba) {
                action.setValue(((BatchStoreAction<DataStore>) ba).withRefs(n));
            } else if (action.getValue() instanceof MultiStoreAction<?> ma) {
                action.setValue(((MultiStoreAction<DataStore>) ma).withRefs(n));
            }
        });

        var choice = new StoreListChoiceComp<>(
                listProp, DataStore.class, null, StoreViewState.get().getAllConnectionsCategory());
        choice.hide(listProp.emptyProperty());
        choice.maxHeight(450);
        return choice;
    }

    @SuppressWarnings("unchecked")
    private BaseRegionBuilder<?, ?> createChooser() {
        var singleProp = new SimpleObjectProperty<DataStoreEntryRef<DataStore>>();
        var s = action.getValue() instanceof StoreAction<?> sa ? sa.getRef() : null;
        singleProp.set((DataStoreEntryRef<DataStore>) s);

        singleProp.addListener((obs, o, n) -> {
            if (action.getValue() instanceof StoreAction<?> sa && n != null) {
                action.setValue(sa.withRef(n.asNeeded()));
            }
        });

        var choice = new StoreChoiceComp<>(
                null,
                singleProp,
                DataStore.class,
                ref -> true,
                StoreViewState.get().getAllConnectionsCategory());
        choice.hide(singleProp.isNull());
        return choice;
    }

    private BaseRegionBuilder<?, ?> createTextArea() {
        var config = new SimpleStringProperty();
        var s = action.getValue() instanceof SerializableAction sa ? sa.toConfigNode() : null;
        config.set(s != null && s.size() > 0 ? s.toPrettyString() : null);

        config.addListener((obs, o, n) -> {
            if (action.getValue() instanceof SerializableAction aa && n != null) {
                var with = aa.withConfigString(n);
                if (with.isPresent()) {
                    action.setValue(with.get());
                }
            }
        });

        var area = new IntegratedTextAreaComp(config, false, "action", new SimpleStringProperty("json"));
        area.hide(config.isNull());
        return area;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionConfirmComp.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.comp.BaseRegionBuilder;
import io.xpipe.app.comp.RegionBuilder;
import io.xpipe.app.comp.SimpleRegionBuilder;
import io.xpipe.app.comp.base.ScrollComp;
import io.xpipe.app.ext.DataStore;
import io.xpipe.app.hub.action.BatchStoreAction;
import io.xpipe.app.hub.action.MultiStoreAction;
import io.xpipe.app.hub.action.StoreAction;
import io.xpipe.app.hub.comp.StoreListChoiceComp;
import io.xpipe.app.hub.comp.StoreViewState;
import io.xpipe.app.platform.OptionsBuilder;
import io.xpipe.app.storage.DataStoreEntryRef;

import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.scene.control.Label;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;

import java.util.List;
import java.util.Map;

public class ActionConfirmComp extends SimpleRegionBuilder {

    private final AbstractAction action;

    public ActionConfirmComp(AbstractAction action) {
        this.action = action;
    }

    @Override
    protected Region createSimple() {
        var options = new OptionsBuilder();
        var plural = action instanceof BatchStoreAction<?> || action instanceof MultiStoreAction<?>;
        options.nameAndDescription(plural ? "actionConnections" : "actionConnection")
                .addComp(createList());
        options.nameAndDescription("actionConfiguration").addComp(createTable());
        var scroll = new ScrollComp(options.buildComp());
        return scroll.build();
    }

    @SuppressWarnings("unchecked")
    private BaseRegionBuilder<?, ?> createList() {
        var listProp = new SimpleListProperty<DataStoreEntryRef<DataStore>>(FXCollections.observableArrayList());
        if (action instanceof BatchStoreAction<?> ba) {
            listProp.setAll(((BatchStoreAction<DataStore>) ba).getRefs());
        } else if (action instanceof MultiStoreAction<?> ma) {
            listProp.setAll(((MultiStoreAction<DataStore>) ma).getRefs());
        } else if (action instanceof StoreAction<?> sa) {
            listProp.setAll(List.of(sa.getRef().asNeeded()));
        }

        var choice = new StoreListChoiceComp<>(
                listProp, DataStore.class, null, StoreViewState.get().getAllConnectionsCategory());
        choice.maxHeight(450);
        choice.setEditable(false);
        choice.hide(listProp.emptyProperty());
        return choice;
    }

    private BaseRegionBuilder<?, ?> createTable() {
        var map = action.toDisplayMap();
        return RegionBuilder.of(() -> {
            var grid = new GridPane();
            grid.setHgap(11);
            grid.setVgap(2);
            grid.getColumnConstraints().add(new ColumnConstraints(120, 120, 150));
            var row = 0;
            for (Map.Entry<String, String> e : map.entrySet()) {
                var name = new Label(e.getKey());
                var value = new Label(e.getValue());
                value.setWrapText(true);
                grid.add(name, 0, row);
                grid.add(value, 1, row);
                row++;
            }
            return grid;
        });
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionConfirmation.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.comp.base.ModalButton;
import io.xpipe.app.comp.base.ModalOverlay;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;

import javafx.beans.property.SimpleBooleanProperty;

import java.util.List;

public class ActionConfirmation {

    public static boolean confirmAction(AbstractAction action) {
        if (!action.forceConfirmation() && (!action.isMutation() || !confirmAllModifications(action))) {
            return true;
        }

        var ok = new SimpleBooleanProperty(false);
        var modal = ModalOverlay.of("confirmAction", new ActionConfirmComp(action).prefWidth(550));
        modal.addButton(ModalButton.cancel());
        modal.addButton(ModalButton.ok(() -> ok.set(true)));
        modal.showAndWait();
        return ok.get();
    }

    private static boolean confirmAllModifications(AbstractAction action) {
        var context = getContext(action);
        return context.stream().anyMatch(dataStoreEntry -> {
            var config = DataStorage.get().getEffectiveCategoryConfig(dataStoreEntry);
            return config.getConfirmAllModifications() != null && config.getConfirmAllModifications();
        });
    }

    private static List<DataStoreEntry> getContext(AbstractAction action) {
        if (action instanceof StoreContextAction ca) {
            return ca.getStoreEntryContext();
        }

        return List.of();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.ext.DataStore;
import io.xpipe.app.hub.action.*;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.core.JacksonMapper;
import io.xpipe.core.UuidHelper;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.ArrayList;

public class ActionJacksonMapper {

    @SuppressWarnings("unchecked")
    public static <T extends AbstractAction> T parse(JsonNode tree) throws JsonProcessingException {
        if (!tree.isObject()) {
            return null;
        }

        var id = tree.get("id");
        if (id == null || !id.isTextual()) {
            return null;
        }

        var provider = ActionProvider.ALL.stream()
                .filter(actionProvider -> id.textValue().equals(actionProvider.getId()))
                .findFirst();
        if (provider.isEmpty()) {
            return null;
        }

        var clazz = provider.get().getActionClass();
        if (clazz.isEmpty()) {
            return null;
        }

        var object = (ObjectNode) tree;
        var ref = tree.get("ref");

        var mapper = JacksonMapper.newMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

        if (ref != null && !ref.isArray() && StoreAction.class.isAssignableFrom(clazz.get())) {
            validateRef(provider.get(), ref.asText());
            var action = mapper.treeToValue(tree, clazz.get());
            return (T) action;
        }

        var makeBatch = ref != null && ref.isArray() && !MultiStoreAction.class.isAssignableFrom(clazz.get());
        if (makeBatch) {
            if (ref.size() == 0) {
                return null;
            }

            var batchActions = new ArrayList<StoreAction<DataStore>>();
            object.remove("ref");
            for (JsonNode batchRef : ref) {
                validateRef(provider.get(), batchRef.asText());
                object.set("ref", batchRef);
                var action = mapper.treeToValue(object, clazz.get());
                batchActions.add((StoreAction<DataStore>) action);
            }
            return (T) BatchStoreAction.builder().actions(batchActions).build();
        }

        var makeMulti = ref != null && ref.isArray() && MultiStoreAction.class.isAssignableFrom(clazz.get());
        if (makeMulti) {
            validateRef(provider.get(), ref.asText());
            object.remove("ref");
            object.set("refs", ref);
            var action = mapper.treeToValue(object, clazz.get());
            return (T) action;
        }

        return null;
    }

    private static void validateRef(ActionProvider provider, String ref) {
        var uuid = UuidHelper.parse(ref);
        if (uuid.isEmpty()) {
            throw ErrorEventFactory.expected(new IllegalArgumentException("Invalid store id: " + ref));
        }

        var entry = DataStorage.get().getStoreEntryIfPresent(uuid.get());
        if (entry.isEmpty()) {
            throw ErrorEventFactory.expected(new IllegalArgumentException("Store not found for id: " + ref));
        }

        if (!entry.get().getValidity().isUsable()) {
            throw ErrorEventFactory.expected(new IllegalArgumentException(
                    "Store " + DataStorage.get().getStorePath(entry.get()) + " is incomplete"));
        }

        if (provider instanceof HubLeafProvider<?> l
                && (!l.getApplicableClass()
                                .isAssignableFrom(entry.get().getStore().getClass())
                        || !l.isApplicable(entry.get().ref()))) {
            throw ErrorEventFactory.expected(new IllegalArgumentException(
                    "Store " + DataStorage.get().getStorePath(entry.get()) + " is not applicable for action type"));
        }

        if (provider instanceof BatchHubProvider<?> h
                && (!h.getApplicableClass()
                                .isAssignableFrom(entry.get().getStore().getClass())
                        || !h.isActive(entry.get().ref())
                        || !h.isApplicable(entry.get().ref()))) {
            throw ErrorEventFactory.expected(new IllegalArgumentException(
                    "Store " + DataStorage.get().getStorePath(entry.get()) + " is not applicable for action type"));
        }
    }

    public static ObjectNode write(AbstractAction value) {
        if (value instanceof BatchStoreAction<?> b) {
            var arrayNode = JsonNodeFactory.instance.arrayNode();
            b.getActions().stream()
                    .map(a -> {
                        var tree = (ObjectNode) JacksonMapper.getDefault().valueToTree(a);
                        return tree.get("ref");
                    })
                    .forEach(n -> arrayNode.add(n));
            var tree = (ObjectNode)
                    JacksonMapper.getDefault().valueToTree(b.getActions().getFirst());
            tree.set("ref", arrayNode);
            tree.put("id", b.getActions().getFirst().getId());
            return tree;
        }

        var tree = (ObjectNode) JacksonMapper.getDefault().valueToTree(value);
        var treeCopy = JsonNodeFactory.instance.objectNode();
        treeCopy.put("id", value.getId());
        tree.properties().forEach(p -> {
            treeCopy.set(p.getKey(), p.getValue());
        });

        if (value instanceof MultiStoreAction<?> m) {
            var refs = treeCopy.get("refs");
            treeCopy.remove("refs");
            treeCopy.set("ref", refs);
            treeCopy.put("id", m.getId());
            return treeCopy;
        }

        return treeCopy;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionPickComp.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.comp.base.ModalOverlayContentComp;
import io.xpipe.app.comp.base.ScrollComp;
import io.xpipe.app.platform.OptionsBuilder;

import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.layout.Region;

public class ActionPickComp extends ModalOverlayContentComp {

    private final AbstractAction action;

    public ActionPickComp(AbstractAction action) {
        this.action = action;
    }

    @Override
    protected Region createSimple() {
        var prop = new SimpleObjectProperty<>(action);
        var top = new ActionConfigComp(prop);
        var bottom = new ActionShortcutComp(prop, () -> {
            getModalOverlay().close();
        });
        var options = new OptionsBuilder().addComp(top).addComp(bottom);
        var scroll = new ScrollComp(options.buildComp());
        return scroll.build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionProvider.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.core.ModuleLayerLoader;

import java.util.*;

public interface ActionProvider {

    List<ActionProvider> ALL = new ArrayList<>();

    static void initProviders() {
        TrackEvent.trace("Starting action provider initialization");
        for (ActionProvider actionProvider : ALL) {
            try {
                actionProvider.init();

                // For debugging
                //                if (actionProvider instanceof HubLeafProvider<?>) {
                //                    actionProvider.getActionClass().orElseThrow();
                //                }
                //                if (actionProvider instanceof HubBranchProvider<?> b) {
                //                    for (HubMenuItemProvider<?> child : b.getChildren(null)) {
                //                        if (ALL.stream().noneMatch(a -> a.getClass().equals(child.getClass()))) {
                //                            System.out.println(child.getClass());
                //                        }
                //                    }
                //                }

            } catch (Throwable t) {
                ErrorEventFactory.fromThrowable(t).handle();
            }
        }
        TrackEvent.trace("Finished action provider initialization");
    }

    default void init() {}

    default String getId() {
        return null;
    }

    @SuppressWarnings("unchecked")
    default Optional<Class<? extends AbstractAction>> getActionClass() {
        var child = Arrays.stream(getClass().getDeclaredClasses())
                .filter(aClass -> AbstractAction.class.isAssignableFrom(aClass))
                .findFirst()
                .map(aClass -> (Class<? extends AbstractAction>) aClass);
        return child.isPresent() ? Optional.of(child.get()) : Optional.empty();
    }

    class Loader implements ModuleLayerLoader {

        @Override
        public void init(ModuleLayer layer) {
            ALL.addAll(ServiceLoader.load(layer, ActionProvider.class).stream()
                    .sorted(Comparator.comparing(p -> p.type().getModule().getName()))
                    .map(p -> p.get())
                    .toList());
        }
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.comp.BaseRegionBuilder;
import io.xpipe.app.comp.SimpleRegionBuilder;
import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.comp.base.InputGroupComp;
import io.xpipe.app.comp.base.TextFieldComp;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.platform.BindingsHelper;
import io.xpipe.app.platform.ClipboardHelper;
import io.xpipe.app.platform.OptionsBuilder;
import io.xpipe.app.platform.PlatformThread;
import io.xpipe.app.update.AppDistributionType;
import io.xpipe.app.util.*;

import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.layout.Region;

import org.kordamp.ikonli.javafx.FontIcon;

import java.util.List;

public class ActionShortcutComp extends SimpleRegionBuilder {

    private final Property<AbstractAction> action;
    private final Runnable onCreateMacro;

    public ActionShortcutComp(Property<AbstractAction> action, Runnable onCreateMacro) {
        this.action = action;
        this.onCreateMacro = onCreateMacro;
    }

    @Override
    protected Region createSimple() {
        var options = new OptionsBuilder();
        options.nameAndDescription("actionDesktopShortcut").addComp(createDesktopComp());
        options.name(AppDistributionType.get().isSupportsUrls() ? "actionUrlShortcut" : "actionUrlShortcutDisabled");
        options.description(
                AppDistributionType.get().isSupportsUrls()
                        ? AppI18n.observable("actionUrlShortcutDescription")
                        : AppI18n.observable(
                                "actionUrlShortcutDisabledDescription",
                                AppDistributionType.get().toTranslatedString().getValue()));
        options.addComp(createUrlComp()).disable(!AppDistributionType.get().isSupportsUrls());
        options.nameAndDescription("actionApiCall").addComp(createApiComp());
        return options.build();
    }

    private BaseRegionBuilder<?, ?> createUrlComp() {
        var url = new SimpleStringProperty();
        action.subscribe((v) -> {
            var s = ActionUrls.toUrl(v);
            PlatformThread.runLaterIfNeeded(() -> {
                url.set(s);
            });
        });

        var copyButton = new ButtonComp(null, new FontIcon("mdi2c-clipboard-multiple-outline"), () -> {
                    ClipboardHelper.copyUrl(url.getValue());
                })
                .describe(d -> d.nameKey("copyUrl"));
        var field = new TextFieldComp(url);
        field.apply(struc -> struc.setEditable(false));
        var group = new InputGroupComp(List.of(field, copyButton));
        group.setMainReference(field);
        group.hide(Bindings.isNull(url));
        return group;
    }

    private BaseRegionBuilder<?, ?> createDesktopComp() {
        var url = BindingsHelper.map(action, abstractAction -> ActionUrls.toUrl(abstractAction));
        var name = new SimpleStringProperty();
        action.subscribe((v) -> {
            var s = v.getShortcutName();
            PlatformThread.runLaterIfNeeded(() -> {
                name.set(s);
            });
        });
        var copyButton = new ButtonComp(null, new FontIcon("mdi2f-file-move-outline"), () -> {
                    ThreadHelper.runFailableAsync(() -> {
                        var file = DesktopShortcuts.createOpen(
                                name.getValue(),
                                "open \"" + url.getValue() + "\" -d \"" + AppProperties.get().getDataDir() + "\"",
                                null);
                        DesktopHelper.browseFileInDirectory(file);
                    });
                })
                .describe(d -> d.nameKey("createShortcut"));
        var field = new TextFieldComp(name);
        var group = new InputGroupComp(List.of(field, copyButton));
        group.setMainReference(field);
        group.hide(BindingsHelper.map(action, v -> !(v instanceof SerializableAction)));
        return group;
    }

    private BaseRegionBuilder<?, ?> createApiComp() {
        var url = "curl -X POST \"http://localhost:" + AppBeaconServer.get().getPort() + "/action\" ...";
        var text = AppI18n.observable("actionApiUrl", url);
        var prop = new SimpleStringProperty();
        prop.bind(text);

        var copyButton = new ButtonComp(null, new FontIcon("mdi2c-clipboard-multiple-outline"), () -> {
                    if (action.getValue() instanceof SerializableAction sa) {
                        ClipboardHelper.copyUrl(sa.toNode().toPrettyString());
                    }
                })
                .describe(d -> d.nameKey("copyBody"));
        var field = new TextFieldComp(prop, true);
        field.apply(struc -> struc.setEditable(false));
        var group = new InputGroupComp(List.of(field, copyButton));
        group.setMainReference(field);
        group.hide(BindingsHelper.map(action, v -> !(v instanceof SerializableAction)));
        return group;
    }

    @SuppressWarnings("unused")
    private BaseRegionBuilder<?, ?> createMacroComp() {
        var button = new ButtonComp(
                AppI18n.observable("createMacro"), new FontIcon("mdi2c-clipboard-multiple-outline"), onCreateMacro);
        return button;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/ActionUrls.java
================================================
package io.xpipe.app.action;

import io.xpipe.core.JacksonMapper;
import io.xpipe.core.SecretValue;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.SneakyThrows;

import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;

public class ActionUrls {

    private static String encodeValue(String value) {
        return URLEncoder.encode(value, StandardCharsets.UTF_8);
    }

    private static List<String> nodeToString(JsonNode node) {
        if (node.isTextual()) {
            return List.of(encodeValue(node.asText()));
        }

        if (node.isArray()) {
            var list = new ArrayList<String>();
            for (JsonNode c : node) {
                var r = nodeToString(c);
                if (r.size() == 1) {
                    list.add(r.getFirst());
                }
            }
            return list;
        }

        var enc = SecretValue.toBase64e(node.toPrettyString().getBytes(StandardCharsets.UTF_8));
        return List.of("~" + enc);
    }

    @SneakyThrows
    public static String toUrl(AbstractAction action) {
        if (!(action instanceof SerializableAction sa)) {
            return null;
        }

        var json = sa.toNode();
        var parsed =
                JacksonMapper.getDefault().treeToValue(json, new TypeReference<LinkedHashMap<String, JsonNode>>() {});

        Map<String, List<String>> requestParams = new LinkedHashMap<>();
        for (Map.Entry<String, JsonNode> e : parsed.entrySet()) {
            var value = nodeToString(e.getValue());
            requestParams.put(e.getKey(), value);
        }

        String encodedURL = requestParams.keySet().stream()
                .map(key -> {
                    var vals = requestParams.get(key);
                    return vals.stream().map(s -> key + "=" + s).collect(Collectors.joining("&"));
                })
                .collect(Collectors.joining("&", "xpipe://action?", ""));
        return encodedURL;
    }

    public static Optional<AbstractAction> parse(String queryString) throws Exception {
        var query = splitQuery(queryString);

        var id = query.get("id");
        if (id == null || id.size() != 1) {
            return Optional.empty();
        }

        var provider = ActionProvider.ALL.stream()
                .filter(actionProvider -> id.getFirst().equals(actionProvider.getId()))
                .findFirst();
        if (provider.isEmpty()) {
            return Optional.empty();
        }

        var clazz = provider.get().getActionClass();
        if (clazz.isEmpty()) {
            return Optional.empty();
        }

        if (!SerializableAction.class.isAssignableFrom(clazz.get())) {
            return Optional.empty();
        }

        var stores = query.get("ref");
        if (stores == null || stores.isEmpty()) {
            return Optional.empty();
        }

        var fixedMap = new LinkedHashMap<String, Object>();
        for (var entry : query.entrySet()) {
            var list = new ArrayList<>();
            for (String s : entry.getValue()) {
                if (s.startsWith("~")) {
                    var json = SecretValue.fromBase64e(s.substring(1));
                    var node = JacksonMapper.getDefault().readTree(json);
                    list.add(node);
                } else {
                    list.add(s);
                }
            }

            var unwrapped = list.size() == 1 ? list.getFirst() : list;
            fixedMap.put(entry.getKey(), unwrapped);
        }

        var json = (ObjectNode) JacksonMapper.getDefault().valueToTree(fixedMap);
        var instance = ActionJacksonMapper.parse(json);
        return Optional.ofNullable(instance);
    }

    private static Map<String, List<String>> splitQuery(String query) {
        if (query == null || query.isBlank()) {
            return Collections.emptyMap();
        }

        return Arrays.stream(query.split("&"))
                .map(ActionUrls::splitQueryParameter)
                .collect(Collectors.groupingBy(
                        AbstractMap.SimpleImmutableEntry::getKey,
                        LinkedHashMap::new,
                        Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
    }

    private static AbstractMap.SimpleImmutableEntry<String, String> splitQueryParameter(String it) {
        final int idx = it.indexOf("=");
        final String key = idx > 0 ? it.substring(0, idx) : it;
        final String value = idx > 0 && it.length() > idx + 1 ? it.substring(idx + 1) : null;
        return new AbstractMap.SimpleImmutableEntry<>(
                URLDecoder.decode(key, StandardCharsets.UTF_8),
                value != null ? URLDecoder.decode(value, StandardCharsets.UTF_8) : null);
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/LauncherUrlProvider.java
================================================
package io.xpipe.app.action;

import java.net.URI;

public interface LauncherUrlProvider extends ActionProvider {

    String getScheme();

    AbstractAction createAction(URI uri) throws Exception;
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/SerializableAction.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.util.DataStoreFormatter;
import io.xpipe.core.JacksonMapper;
import io.xpipe.core.UuidHelper;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.experimental.SuperBuilder;

import java.util.*;
import java.util.stream.Collectors;

@SuperBuilder
public abstract class SerializableAction extends AbstractAction {

    public String toString() {
        return toNode().toPrettyString();
    }

    public ObjectNode toNode() {
        var json = ActionJacksonMapper.write(this);
        return json;
    }

    public ObjectNode toConfigNode() {
        var json = toNode();
        json.remove("ref");
        json.remove("refs");
        return json;
    }

    public Optional<? extends SerializableAction> withConfigString(String configString) {
        try {
            var tree = (ObjectNode) JacksonMapper.getDefault().readTree(configString);
            tree.put("id", getId());
            SerializableAction action = ActionJacksonMapper.parse(tree);
            return Optional.ofNullable(action);
        } catch (Exception ex) {
            return Optional.empty();
        }
    }

    @Override
    public Map<String, String> toDisplayMap() {
        var node = toConfigNode();

        var map = new LinkedHashMap<String, String>();
        map.put("Action", getDisplayName());
        for (Map.Entry<String, JsonNode> property : node.properties()) {
            if (property.getKey().equals("id")) {
                continue;
            }

            var name = DataStoreFormatter.camelCaseToName(property.getKey());
            name = Arrays.stream(name.split(" "))
                    .filter(s -> !s.equals("Store"))
                    .collect(Collectors.joining(" "));

            if (property.getValue().isTextual()) {
                var value = property.getValue().textValue();
                var uuid = UuidHelper.parse(value);
                if (uuid.isPresent()) {
                    var refName = DataStorage.get()
                            .getStoreEntryIfPresent(uuid.get())
                            .map(e -> e.getName())
                            .or(() -> {
                                return DataStorage.get()
                                        .getStoreCategoryIfPresent(uuid.get())
                                        .map(c -> c.getName());
                            });
                    map.put(name, refName.orElse(value));
                } else {
                    map.put(name, value);
                }
            } else if (property.getValue().isArray()) {
                var list = new ArrayList<String>();
                for (JsonNode jsonNode : property.getValue()) {
                    var s = jsonNode.asText();
                    if (!s.isEmpty()) {
                        list.add(s);
                    }
                }

                if (!list.isEmpty()) {
                    map.put(name, String.join("\n", list));
                }
            } else if (property.getValue().isBoolean()) {
                map.put(name, property.getValue().booleanValue() ? "Yes" : "No");
            } else {
                var value = property.getValue().asText();
                map.put(name, value);
            }
        }
        return map;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/StoreContextAction.java
================================================
package io.xpipe.app.action;

import io.xpipe.app.storage.DataStoreEntry;

import java.util.List;

public interface StoreContextAction {

    List<DataStoreEntry> getStoreEntryContext();
}


================================================
FILE: app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java
================================================
package io.xpipe.app.action;

import java.net.URI;

public class XPipeUrlProvider implements LauncherUrlProvider {

    @Override
    public String getScheme() {
        return "xpipe";
    }

    @Override
    public AbstractAction createAction(URI uri) throws Exception {
        var a = uri.getHost();
        if (!"action".equals(a)) {
            return null;
        }

        var query = uri.getQuery();
        var action = ActionUrls.parse(query);
        return action.orElse(null);
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java
================================================
package io.xpipe.app.beacon;

import io.xpipe.app.ext.ShellStore;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.beacon.BeaconClientException;

import lombok.Value;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Value
public class AppBeaconCache {

    Set<BeaconShellSession> shellSessions = new HashSet<>();

    public BeaconShellSession getShellSession(UUID uuid) throws BeaconClientException {
        var found = shellSessions.stream()
                .filter(beaconShellSession ->
                        beaconShellSession.getEntry().getUuid().equals(uuid))
                .findFirst();
        if (found.isEmpty()) {
            throw new BeaconClientException("No active shell session known for id " + uuid);
        }
        return found.get();
    }

    public BeaconShellSession getOrStart(DataStoreEntryRef<ShellStore> ref) throws Exception {
        var existing = AppBeaconServer.get().getCache().getShellSessions().stream()
                .filter(beaconShellSession -> beaconShellSession.getEntry().equals(ref.get()))
                .findFirst();
        var control = (existing.isPresent()
                ? existing.get().getControl()
                : ref.getStore().standaloneControl().start());
        control.setNonInteractive();
        control.start();

        if (existing.isEmpty()) {
            AppBeaconServer.get().getCache().getShellSessions().add(new BeaconShellSession(ref.get(), control));
        }

        return new BeaconShellSession(ref.get(), control);
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java
================================================
package io.xpipe.app.beacon;

import io.xpipe.app.beacon.mcp.AppMcpServer;
import io.xpipe.app.core.AppLocalTemp;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.util.DocumentationLink;
import io.xpipe.beacon.BeaconConfig;
import io.xpipe.beacon.BeaconInterface;
import io.xpipe.core.OsType;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
import lombok.Getter;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.nio.file.Files;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class AppBeaconServer {

    private static AppBeaconServer INSTANCE;

    @Getter
    private final int port;

    @Getter
    private final Set<BeaconSession> sessions = new HashSet<>();

    @Getter
    private final AppBeaconCache cache = new AppBeaconCache();

    private boolean running;
    private ExecutorService executor;
    private HttpServer server;

    @Getter
    private String localAuthSecret;

    private AppBeaconServer(int port) {
        this.port = port;
    }

    public static void setupPort() {
        int port = BeaconConfig.getUsedPort();
        INSTANCE = new AppBeaconServer(port);
    }

    public static void init() {
        try {
            INSTANCE.initAuthSecret();
            INSTANCE.start();
            TrackEvent.withInfo("Started http server")
                    .tag("port", INSTANCE.getPort())
                    .build()
                    .handle();
        } catch (Exception ex) {
            // Not terminal!
            // We can still continue without the running server
            ErrorEventFactory.fromThrowable("Unable to start local http server on port " + INSTANCE.getPort(), ex)
                    .documentationLink(DocumentationLink.BEACON_PORT_BIND)
                    .build()
                    .handle();
        }
    }

    public static void reset() {
        if (INSTANCE != null) {
            INSTANCE.stop();
            INSTANCE.deleteAuthSecret();
            for (BeaconShellSession ss : INSTANCE.getCache().getShellSessions()) {
                try {
                    ss.getControl().close();
                } catch (Exception ex) {
                    ErrorEventFactory.fromThrowable(ex).omit().expected().handle();
                }
            }
            INSTANCE = null;
        }
    }

    public static AppBeaconServer get() {
        return INSTANCE;
    }

    public void addSession(BeaconSession session) {
        this.sessions.add(session);
    }

    private void stop() {
        if (!running) {
            return;
        }

        running = false;
        server.stop(0);
        executor.shutdown();
        try {
            executor.awaitTermination(30, TimeUnit.SECONDS);
        } catch (InterruptedException ignored) {
        }
    }

    private void initAuthSecret() throws IOException {
        var file = BeaconConfig.getLocalBeaconAuthFile();
        // Create and set temp dir permissions for Linux
        AppLocalTemp.getLocalTempDataDirectory();
        var id = UUID.randomUUID().toString();
        Files.writeString(file, id);
        if (OsType.ofLocal() != OsType.WINDOWS) {
            Files.setPosixFilePermissions(file, PosixFilePermissions.fromString("rw-rw----"));
        }
        localAuthSecret = id;
    }

    private void deleteAuthSecret() {
        var file = BeaconConfig.getLocalBeaconAuthFile();
        try {
            Files.delete(file);
        } catch (IOException ignored) {
        }
    }

    private void start() throws IOException {
        executor = Executors.newFixedThreadPool(5, r -> {
            Thread t = Executors.defaultThreadFactory().newThread(r);
            t.setDaemon(true);
            t.setName("http handler");
            t.setUncaughtExceptionHandler((t1, e) -> {
                ErrorEventFactory.fromThrowable(e).handle();
            });
            return t;
        });
        server = HttpServer.create(
                new InetSocketAddress(Inet4Address.getByAddress(new byte[] {0x7f, 0x00, 0x00, 0x01}), port), 10);
        BeaconInterface.getAll().forEach(beaconInterface -> {
            var handler = new BeaconRequestHandler<>(beaconInterface);
            server.createContext(beaconInterface.getPath(), exchange -> {
                if (!handleCorsHeaders(exchange)) {
                    handler.handle(exchange);
                }
            });
        });
        server.setExecutor(executor);

        server.createContext("/", exchange -> {
            if (!handleCorsHeaders(exchange)) {
                handleCatchAll(exchange);
            }
        });

        server.createContext("/mcp", exchange -> {
            if (!handleCorsHeaders(exchange)) {
                var mcpServer = AppMcpServer.get();
                if (mcpServer != null) {
                    mcpServer.createHttpHandler().handle(exchange);
                }
            }
        });

        server.start();
        running = true;
    }

    private boolean handleCorsHeaders(HttpExchange exchange) throws IOException {
        exchange.getResponseHeaders()
                .add("Origin", "http://localhost:" + AppBeaconServer.get().getPort());
        exchange.getResponseHeaders().add("Vary", "Origin");
        exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
        exchange.getResponseHeaders().add("Access-Control-Allow-Credentials", "true");
        exchange.getResponseHeaders().add("Access-Control-Allow-Headers", "*");
        exchange.getResponseHeaders().add("Access-Control-Allow-Methods", "*");
        if (exchange.getRequestMethod().equals("OPTIONS")) {
            exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, -1);
            return true;
        } else {
            return false;
        }
    }

    private void handleCatchAll(HttpExchange exchange) throws IOException {
        exchange.getResponseHeaders().add("Location", DocumentationLink.API.getLink());
        exchange.sendResponseHeaders(HttpURLConnection.HTTP_SEE_OTHER, 0);
        exchange.close();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java
================================================
package io.xpipe.app.beacon;

import io.xpipe.app.core.mode.AppOperationMode;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.beacon.*;
import io.xpipe.core.JacksonMapper;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import lombok.SneakyThrows;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class BeaconRequestHandler<T> implements HttpHandler {

    private final BeaconInterface<T> beaconInterface;

    public BeaconRequestHandler(BeaconInterface<T> beaconInterface) {
        this.beaconInterface = beaconInterface;
    }

    @Override
    public void handle(HttpExchange exchange) {
        if (AppOperationMode.isInShutdown() && !beaconInterface.acceptInShutdown()) {
            writeError(exchange, new BeaconClientErrorResponse("Daemon is currently in shutdown"), 400);
            return;
        }

        if (beaconInterface.requiresCompletedStartup()) {
            while (AppOperationMode.isInStartup()) {
                ThreadHelper.sleep(100);
            }
        }

        if (beaconInterface.requiresEnabledApi()
                && !AppPrefs.get().enableHttpApi().get()) {
            var ex = new BeaconServerException("HTTP API is not enabled in the settings menu");
            writeError(exchange, ex, 403);
            return;
        }

        if (!AppPrefs.get().disableApiAuthentication().get() && beaconInterface.requiresAuthentication()) {
            var auth = exchange.getRequestHeaders().getFirst("Authorization");
            if (auth == null) {
                writeError(exchange, new BeaconClientErrorResponse("Missing Authorization header"), 401);
                return;
            }

            var token = auth.replace("Bearer ", "");
            var session = AppBeaconServer.get().getSessions().stream()
                    .filter(s -> s.getToken().equals(token))
                    .findFirst()
                    .orElse(null);
            if (session == null) {
                writeError(exchange, new BeaconClientErrorResponse("Unknown token"), 403);
                return;
            }
        }

        handleAuthenticatedRequest(exchange);
    }

    private void handleAuthenticatedRequest(HttpExchange exchange) {
        T object;
        Object response;
        try {
            if (beaconInterface.readRawRequestBody()) {
                object = createDefaultRequest(beaconInterface);
            } else {
                try (InputStream is = exchange.getRequestBody()) {
                    var read = is.readAllBytes();
                    var rawDataRequestClass = beaconInterface.getRequestClass().getDeclaredFields().length == 1
                            && beaconInterface
                                    .getRequestClass()
                                    .getDeclaredFields()[0]
                                    .getType()
                                    .equals(byte[].class);
                    if (!new String(read, StandardCharsets.US_ASCII).strip().startsWith("{") && rawDataRequestClass) {
                        object = createRawDataRequest(beaconInterface, read);
                    } else {
                        var tree = JacksonMapper.getDefault().readTree(read);
                        TrackEvent.trace("Parsed raw request:\n" + tree.toPrettyString());
                        var emptyRequestClass = tree.isEmpty()
                                && beaconInterface.getRequestClass().getDeclaredFields().length == 0;
                        object = emptyRequestClass
                                ? createDefaultRequest(beaconInterface)
                                : JacksonMapper.getDefault().treeToValue(tree, beaconInterface.getRequestClass());
                        TrackEvent.trace("Parsed request object:\n" + object);
                    }
                }
            }

            var sync = beaconInterface.getSynchronizationObject();
            if (sync != null) {
                synchronized (sync) {
                    response = beaconInterface.handle(exchange, object);
                }
            } else {
                response = beaconInterface.handle(exchange, object);
            }
        } catch (BeaconClientException clientException) {
            ErrorEventFactory.fromThrowable(clientException).omit().expected().handle();
            writeError(exchange, new BeaconClientErrorResponse(clientException.getMessage()), 400);
            return;
        } catch (BeaconServerException serverException) {
            var cause = serverException.getCause() != null ? serverException.getCause() : serverException;
            var event = ErrorEventFactory.fromThrowable(cause).omit().handle();
            var link = event.getLink();
            writeError(exchange, new BeaconServerErrorResponse(cause, link), 500);
            return;
        } catch (IOException ex) {
            // Handle serialization errors as normal exceptions and other IO exceptions as assuming that the connection
            // is broken
            if (!ex.getClass().getName().contains("jackson")) {
                ErrorEventFactory.fromThrowable(ex).omit().expected().handle();
            } else {
                ErrorEventFactory.fromThrowable(ex).omit().expected().handle();
                // Make deserialization error message more readable
                var message = ex.getMessage()
                        .replace("$RequestBuilder", "")
                        .replace("Exchange$Request", "Request")
                        .replace("at [Source: UNKNOWN; byte offset: #UNKNOWN]", "")
                        .replaceAll("(\\w+) is marked non-null but is null", "field $1 is missing from object")
                        .strip();
                writeError(exchange, new BeaconClientErrorResponse(message), 400);
            }
            return;
        } catch (Throwable other) {
            var event = ErrorEventFactory.fromThrowable(other).omit().expected().handle();
            var link = event.getLink();
            writeError(exchange, new BeaconServerErrorResponse(other, link), 500);
            return;
        }

        try {
            var emptyResponseClass = beaconInterface.getResponseClass().getDeclaredFields().length == 0;
            if (!emptyResponseClass && response != null) {
                TrackEvent.trace("Sending response:\n" + response);
                TrackEvent.trace("Sending raw response:\n"
                        + JacksonMapper.getCensored().valueToTree(response).toPrettyString());
                var bytes = JacksonMapper.getDefault()
                        .valueToTree(response)
                        .toPrettyString()
                        .getBytes(StandardCharsets.UTF_8);
                exchange.sendResponseHeaders(200, bytes.length);
                try (OutputStream os = exchange.getResponseBody()) {
                    os.write(bytes);
                }
            } else {
                exchange.sendResponseHeaders(200, -1);
            }
        } catch (IOException ioException) {
            // The exchange implementation might have already sent a response manually
            if (!"headers already sent".equals(ioException.getMessage())) {
                ErrorEventFactory.fromThrowable(ioException).omit().expected().handle();
            }
        } catch (Throwable other) {
            var event = ErrorEventFactory.fromThrowable(other).handle();
            var link = event.getLink();
            writeError(exchange, new BeaconServerErrorResponse(other, link), 500);
        }
    }

    private void writeError(HttpExchange exchange, Object errorMessage, int code) {
        try {
            var bytes =
                    JacksonMapper.getDefault().writeValueAsString(errorMessage).getBytes(StandardCharsets.UTF_8);
            exchange.sendResponseHeaders(code, bytes.length);
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(bytes);
            }
        } catch (IOException ex) {
            ErrorEventFactory.fromThrowable(ex).omit().expected().handle();
        }
    }

    @SneakyThrows
    @SuppressWarnings("unchecked")
    private <REQ> REQ createDefaultRequest(BeaconInterface<?> beaconInterface) {
        var c = beaconInterface.getRequestClass().getDeclaredMethod("builder");
        c.setAccessible(true);
        var b = c.invoke(null);
        var m = b.getClass().getDeclaredMethod("build");
        m.setAccessible(true);
        return (REQ) beaconInterface.getRequestClass().cast(m.invoke(b));
    }

    @SneakyThrows
    @SuppressWarnings("unchecked")
    private <REQ> REQ createRawDataRequest(BeaconInterface<?> beaconInterface, byte[] s) {
        var c = beaconInterface.getRequestClass().getDeclaredMethod("builder");
        c.setAccessible(true);

        var b = c.invoke(null);
        var setMethod = Arrays.stream(b.getClass().getDeclaredMethods())
                .filter(method -> method.getParameterCount() == 1
                        && method.getParameters()[0].getType().equals(byte[].class))
                .findFirst()
                .orElseThrow();
        setMethod.invoke(b, (Object) s);

        var m = b.getClass().getDeclaredMethod("build");
        m.setAccessible(true);
        return (REQ) beaconInterface.getRequestClass().cast(m.invoke(b));
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/BeaconSession.java
================================================
package io.xpipe.app.beacon;

import io.xpipe.beacon.BeaconClientInformation;

import lombok.Value;

@Value
public class BeaconSession {

    BeaconClientInformation clientInformation;
    String token;
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/BeaconShellSession.java
================================================
package io.xpipe.app.beacon;

import io.xpipe.app.process.ShellControl;
import io.xpipe.app.storage.DataStoreEntry;

import lombok.Value;

@Value
public class BeaconShellSession {

    DataStoreEntry entry;
    ShellControl control;
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/BlobManager.java
================================================
package io.xpipe.app.beacon;

import io.xpipe.app.core.AppLocalTemp;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.beacon.BeaconClientException;

import org.apache.commons.io.FileUtils;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

public class BlobManager {

    private static final Path TEMP = AppLocalTemp.getLocalTempDataDirectory("blob");
    private static BlobManager INSTANCE;
    private final Map<UUID, byte[]> memoryBlobs = new ConcurrentHashMap<>();
    private final Map<UUID, Path> fileBlobs = new ConcurrentHashMap<>();

    public static BlobManager get() {
        return INSTANCE;
    }

    public static void init() {
        INSTANCE = new BlobManager();
        try {
            FileUtils.forceMkdir(TEMP.toFile());
            try {
                // Remove old files in dir
                FileUtils.cleanDirectory(TEMP.toFile());
            } catch (IOException ignored) {
            }
        } catch (IOException e) {
            ErrorEventFactory.fromThrowable(e).handle();
        }
    }

    public static void reset() {
        try {
            FileUtils.cleanDirectory(TEMP.toFile());
        } catch (IOException ignored) {
        }
        INSTANCE = null;
    }

    public Path newBlobFile() throws IOException {
        var file = TEMP.resolve(UUID.randomUUID().toString());
        FileUtils.forceMkdir(file.getParent().toFile());
        return file;
    }

    public void store(UUID uuid, byte[] blob) {
        memoryBlobs.put(uuid, blob);
    }

    public void store(UUID uuid, InputStream blob) throws IOException {
        var file = TEMP.resolve(uuid.toString());
        try (var fileOut = Files.newOutputStream(file)) {
            blob.transferTo(fileOut);
        }
        fileBlobs.put(uuid, file);
    }

    public InputStream getBlob(UUID uuid) throws Exception {
        var memory = memoryBlobs.get(uuid);
        if (memory != null) {
            return new ByteArrayInputStream(memory);
        }

        var found = fileBlobs.get(uuid);
        if (found == null) {
            throw new BeaconClientException("No saved data known for id " + uuid);
        }

        return Files.newInputStream(found);
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ActionExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.action.ActionJacksonMapper;
import io.xpipe.app.core.AppCache;
import io.xpipe.app.core.window.AppDialog;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ActionExchange;

import com.sun.net.httpserver.HttpExchange;

public class ActionExchangeImpl extends ActionExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws Exception {
        var action = ActionJacksonMapper.parse(msg.getAction());
        if (action == null) {
            throw new BeaconClientException("Unable to parse action into known schema");
        }

        if (!checkPermission()) {
            return Response.builder().build();
        }

        action.executeSyncImpl(msg.isConfirm());
        return Response.builder().build();
    }

    private boolean checkPermission() {
        var cache = AppCache.getBoolean("externalActionPermitted", false);
        if (cache) {
            return true;
        }

        var r = AppDialog.confirm("externalAction");
        if (r) {
            AppCache.update("externalActionPermitted", true);
        }
        return r;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.AppLayoutModel;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.platform.LabelGraphic;
import io.xpipe.app.secret.SecretManager;
import io.xpipe.app.secret.SecretQueryState;
import io.xpipe.app.terminal.TerminalView;
import io.xpipe.app.util.*;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.AskpassExchange;
import io.xpipe.core.InPlaceSecretValue;

import javafx.beans.property.SimpleStringProperty;

import com.sun.net.httpserver.HttpExchange;

import java.time.Duration;

public class AskpassExchangeImpl extends AskpassExchange {

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        // SSH auth with a smartcard will prompt to confirm user presence
        // Maybe we can show some dialog for this in the future
        if (msg.getPrompt() != null && msg.getPrompt().toLowerCase().contains("confirm user presence")) {
            var shown = AppLayoutModel.get().getQueueEntries().stream().anyMatch(queueEntry -> msg.getPrompt()
                    .equals(queueEntry.getName().getValue()));
            if (!shown) {
                var qe = new AppLayoutModel.QueueEntry(
                        new SimpleStringProperty(msg.getPrompt()),
                        new LabelGraphic.IconGraphic("mdi2f-fingerprint"),
                        () -> true);
                AppLayoutModel.get().getQueueEntries().add(qe);
                GlobalTimer.delay(
                        () -> {
                            AppLayoutModel.get().getQueueEntries().remove(qe);
                        },
                        Duration.ofSeconds(10));
            }
            return Response.builder().value(InPlaceSecretValue.of("")).build();
        }

        var prompt = msg.getPrompt();
        // sudo-rs uses a different prefix which we don't really need
        prompt = prompt.replace("[sudo: authenticate]", "[sudo]");

        if (msg.getRequest() == null) {
            var r = AskpassAlert.queryRaw(prompt, null, true);
            return Response.builder()
                    .value(r.getState() == SecretQueryState.NORMAL ? r.getSecret() : InPlaceSecretValue.of(""))
                    .build();
        }

        var found = msg.getSecretId() != null
                ? SecretManager.getProgress(msg.getRequest(), msg.getSecretId())
                : SecretManager.getProgress(msg.getRequest());
        if (found.isEmpty()) {
            throw new BeaconClientException("Unknown askpass request");
        }

        var p = found.get();
        var secret = p.process(prompt);
        if (p.getState() != SecretQueryState.NORMAL) {
            var ex = new BeaconClientException(SecretQueryState.toErrorMessage(p.getState()));
            ErrorEventFactory.preconfigure(ErrorEventFactory.fromThrowable(ex).ignore());
            throw ex;
        }
        focusTerminalIfNeeded(msg.getPid());
        return Response.builder().value(secret.inPlace()).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }

    private void focusTerminalIfNeeded(long pid) {
        if (TerminalView.get() == null) {
            return;
        }

        var found = TerminalView.get().findSession(pid);
        if (found.isEmpty()) {
            return;
        }

        var term = TerminalView.get().getTerminalInstances().stream()
                .filter(instance -> instance.equals(found.get().getTerminal()))
                .findFirst();
        if (term.isEmpty()) {
            return;
        }
        TerminalView.focus(term.get());
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreCategory;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.CategoryAddExchange;

import com.sun.net.httpserver.HttpExchange;

public class CategoryAddExchangeImpl extends CategoryAddExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws Throwable {
        if (DataStorage.get().getStoreCategoryIfPresent(msg.getParent()).isEmpty()) {
            throw new BeaconClientException("Parent category with id " + msg.getParent() + " does not exist");
        }

        var found = DataStorage.get().getStoreCategories().stream()
                .filter(dataStoreCategory -> msg.getParent().equals(dataStoreCategory.getParentCategory())
                        && msg.getName().equals(dataStoreCategory.getName()))
                .findAny();
        if (found.isPresent()) {
            return Response.builder().category(found.get().getUuid()).build();
        }

        var cat = DataStoreCategory.createNew(msg.getParent(), msg.getName());
        DataStorage.get().addStoreCategory(cat);
        return Response.builder().category(cat.getUuid()).build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryInfoExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.CategoryInfoExchange;
import io.xpipe.core.JacksonMapper;

import com.sun.net.httpserver.HttpExchange;

import java.util.ArrayList;
import java.util.UUID;

public class CategoryInfoExchangeImpl extends CategoryInfoExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        var list = new ArrayList<InfoResponse>();
        for (UUID uuid : msg.getCategories()) {
            var cat = DataStorage.get()
                    .getStoreCategoryIfPresent(uuid)
                    .orElseThrow(() -> new BeaconClientException("Unknown category: " + uuid));

            var name = DataStorage.get().getStorePath(cat);

            var apply = InfoResponse.builder()
                    .lastModified(cat.getLastModified())
                    .lastUsed(cat.getLastUsed())
                    .category(cat.getUuid())
                    .parentCategory(cat.getParentCategory())
                    .name(name)
                    .config(JacksonMapper.getDefault().valueToTree(cat.getConfig()))
                    .build();
            list.add(apply);
        }
        return Response.builder().infos(list).build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageQuery;
import io.xpipe.beacon.api.CategoryQueryExchange;

import com.sun.net.httpserver.HttpExchange;

public class CategoryQueryExchangeImpl extends CategoryQueryExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) {
        var found = DataStorageQuery.queryCategory(msg.getFilter());
        return Response.builder()
                .found(found.stream().map(entry -> entry.getUuid()).toList())
                .build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryRemoveExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreCategory;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.CategoryRemoveExchange;

import com.sun.net.httpserver.HttpExchange;

import java.util.ArrayList;
import java.util.UUID;

public class CategoryRemoveExchangeImpl extends CategoryRemoveExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        var toRemove = new ArrayList<DataStoreCategory>();
        for (UUID uuid : msg.getCategories()) {
            var cat = DataStorage.get()
                    .getStoreCategoryIfPresent(uuid)
                    .orElseThrow(() -> new BeaconClientException("Unknown category: " + uuid));

            if (!DataStorage.get().canDeleteStoreCategory(cat)) {
                throw new BeaconClientException("Cannot delete category: " + cat.getName());
            }

            toRemove.add(cat);
        }

        for (DataStoreCategory cat : toRemove) {
            DataStorage.get().deleteStoreCategory(cat, msg.isRemoveChildrenCategories(), msg.isRemoveContents());
        }

        return Response.builder().build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.ext.DataStore;
import io.xpipe.app.ext.ValidationException;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ConnectionAddExchange;
import io.xpipe.core.JacksonMapper;

import com.sun.net.httpserver.HttpExchange;

public class ConnectionAddExchangeImpl extends ConnectionAddExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws Throwable {
        var store = JacksonMapper.getDefault().treeToValue(msg.getData(), DataStore.class);
        if (store == null) {
            throw new BeaconClientException("Unable to parse store data into valid store");
        }

        var found = DataStorage.get().getStoreEntryIfPresent(store, false);
        if (found.isEmpty()) {
            found = DataStorage.get().getStoreEntryIfPresent(msg.getName());
        }

        if (found.isPresent()) {
            DataStorage.get().updateEntryStore(found.get(), store);
            return Response.builder().connection(found.get().getUuid()).build();
        }

        if (msg.getCategory() != null
                && DataStorage.get()
                        .getStoreCategoryIfPresent(msg.getCategory())
                        .isEmpty()) {
            throw new BeaconClientException("Category with id " + msg.getCategory() + " does not exist");
        }

        var entry = DataStoreEntry.createNew(msg.getName(), store);
        if (msg.getCategory() != null) {
            entry.setCategoryUuid(msg.getCategory());
        }
        try {
            DataStorage.get().addStoreEntryInProgress(entry);
            if (msg.getValidate()) {
                entry.validateOrThrow();
            }
        } catch (Throwable ex) {
            if (ex instanceof ValidationException) {
                ErrorEventFactory.expected(ex);
            } else if (ex instanceof StackOverflowError) {
                // Cycles in connection graphs can fail hard but are expected
                ErrorEventFactory.expected(ex);
            }
            throw ex;
        } finally {
            DataStorage.get().removeStoreEntryInProgress(entry);
        }
        DataStorage.get().addStoreEntryIfNotPresent(entry);

        // Explicitly assign category
        if (msg.getCategory() != null) {
            DataStorage.get()
                    .moveEntryToCategory(
                            entry,
                            DataStorage.get()
                                    .getStoreCategoryIfPresent(msg.getCategory())
                                    .orElseThrow());
        }

        return Response.builder().connection(entry.getUuid()).build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ConnectionInfoExchange;
import io.xpipe.core.StorePath;

import com.sun.net.httpserver.HttpExchange;
import org.apache.commons.lang3.ClassUtils;

import java.util.ArrayList;
import java.util.UUID;
import java.util.stream.Collectors;

public class ConnectionInfoExchangeImpl extends ConnectionInfoExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        var list = new ArrayList<InfoResponse>();
        for (UUID uuid : msg.getConnections()) {
            var e = DataStorage.get()
                    .getStoreEntryIfPresent(uuid)
                    .orElseThrow(() -> new BeaconClientException("Unknown connection: " + uuid));

            var names = DataStorage.get()
                    .getStorePath(DataStorage.get()
                            .getStoreCategoryIfPresent(e.getCategoryUuid())
                            .orElseThrow())
                    .getNames();
            var cat = new StorePath(names.subList(1, names.size()));
            var cache = e.getStoreCache().entrySet().stream()
                    .filter(kv -> {
                        return kv.getValue() != null
                                && (ClassUtils.isPrimitiveOrWrapper(
                                                kv.getValue().getClass())
                                        || kv.getValue() instanceof String);
                    })
                    .collect(Collectors.toMap(
                            stringObjectEntry -> stringObjectEntry.getKey(),
                            stringObjectEntry -> stringObjectEntry.getValue()));

            var apply = InfoResponse.builder()
                    .lastModified(e.getLastModified())
                    .lastUsed(e.getLastUsed())
                    .connection(e.getUuid())
                    .category(cat)
                    .name(DataStorage.get().getStorePath(e))
                    .rawData(e.getStore())
                    .usageCategory(e.getProvider().getUsageCategory())
                    .type(e.getProvider().getId())
                    .state(e.getStorePersistentState() != null ? e.getStorePersistentState() : new Object())
                    .cache(cache)
                    .build();
            list.add(apply);
        }
        return Response.builder().infos(list).build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageQuery;
import io.xpipe.beacon.api.ConnectionQueryExchange;

import com.sun.net.httpserver.HttpExchange;

public class ConnectionQueryExchangeImpl extends ConnectionQueryExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) {
        var found =
                DataStorageQuery.queryEntry(msg.getCategoryFilter(), msg.getConnectionFilter(), msg.getTypeFilter());
        return Response.builder()
                .found(found.stream().map(entry -> entry.getUuid()).toList())
                .build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.ext.FixedHierarchyStore;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ConnectionRefreshExchange;

import com.sun.net.httpserver.HttpExchange;

public class ConnectionRefreshExchangeImpl extends ConnectionRefreshExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws Throwable {
        var e = DataStorage.get()
                .getStoreEntryIfPresent(msg.getConnection())
                .orElseThrow(() -> new BeaconClientException("Unknown connection: " + msg.getConnection()));
        if (e.getStore() instanceof FixedHierarchyStore) {
            DataStorage.get().refreshChildren(e, true);
        } else {
            e.validateOrThrow();
        }
        return Response.builder().build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ConnectionRemoveExchange;

import com.sun.net.httpserver.HttpExchange;

import java.util.ArrayList;
import java.util.UUID;

public class ConnectionRemoveExchangeImpl extends ConnectionRemoveExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        var entries = new ArrayList<DataStoreEntry>();
        for (UUID uuid : msg.getConnections()) {
            var e = DataStorage.get()
                    .getStoreEntryIfPresent(uuid)
                    .orElseThrow(() -> new BeaconClientException("Unknown connection: " + uuid));
            entries.add(e);
        }
        DataStorage.get().deleteWithChildren(entries.toArray(DataStoreEntry[]::new));
        return Response.builder().build();
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonFocusExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.mode.AppOperationMode;
import io.xpipe.app.core.window.AppMainWindow;
import io.xpipe.beacon.api.DaemonFocusExchange;

import com.sun.net.httpserver.HttpExchange;

public class DaemonFocusExchangeImpl extends DaemonFocusExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws Throwable {
        if (AppOperationMode.isInStartup()) {
            return Response.builder().build();
        }

        if (AppOperationMode.GUI.isSupported()) {
            AppOperationMode.switchToSyncOrThrow(AppOperationMode.GUI);
        }

        var w = AppMainWindow.get();
        if (w != null) {
            w.focus();
        }
        return Response.builder().build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonModeExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.mode.AppOperationMode;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.DaemonModeExchange;

import com.sun.net.httpserver.HttpExchange;

public class DaemonModeExchangeImpl extends DaemonModeExchange {
    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        var mode = AppOperationMode.map(msg.getMode());
        if (!mode.isSupported()) {
            throw new BeaconClientException("Unsupported mode: " + msg.getMode().getDisplayName()
                    + ". Supported: "
                    + String.join(
                            ", ",
                            AppOperationMode.getAll().stream()
                                    .filter(AppOperationMode::isSupported)
                                    .map(AppOperationMode::getId)
                                    .toList()));
        }

        AppOperationMode.switchToSyncIfPossible(mode);
        return DaemonModeExchange.Response.builder().usedMode(msg.getMode()).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.AppOpenArguments;
import io.xpipe.app.core.mode.AppOperationMode;
import io.xpipe.app.platform.PlatformInit;
import io.xpipe.beacon.BeaconServerException;
import io.xpipe.beacon.api.DaemonOpenExchange;
import io.xpipe.core.OsType;

import com.sun.net.httpserver.HttpExchange;

public class DaemonOpenExchangeImpl extends DaemonOpenExchange {

    private int openCounter = 0;

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconServerException {
        if (msg.getArguments().isEmpty()) {
            try {
                // At this point we are already loading this on another thread
                // so this call will only perform the waiting
                PlatformInit.init(true);
            } catch (Throwable t) {
                throw new BeaconServerException(t);
            }

            // The open command is used as a default opener on Linux
            // We don't want to overwrite the default startup mode
            if (OsType.ofLocal() == OsType.LINUX && openCounter++ == 0) {
                return Response.builder().build();
            }

            AppOperationMode.switchToAsync(AppOperationMode.GUI);
        } else {
            AppOpenArguments.handle(msg.getArguments());
        }
        return Response.builder().build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonStatusExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.mode.AppOperationMode;
import io.xpipe.beacon.api.DaemonStatusExchange;

import com.sun.net.httpserver.HttpExchange;

public class DaemonStatusExchangeImpl extends DaemonStatusExchange {

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }

    @Override
    public Object handle(HttpExchange exchange, Request body) {
        String mode;
        if (AppOperationMode.get() == null) {
            mode = "none";
        } else {
            mode = AppOperationMode.get().getId();
        }

        return Response.builder().mode(mode).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonStopExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.mode.AppOperationMode;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.beacon.api.DaemonStopExchange;

import com.sun.net.httpserver.HttpExchange;

public class DaemonStopExchangeImpl extends DaemonStopExchange {

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }

    @Override
    public Object handle(HttpExchange exchange, Request msg) {
        ThreadHelper.runAsync(() -> {
            ThreadHelper.sleep(1000);
            AppOperationMode.close();
        });
        return Response.builder().success(true).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonVersionExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.AppProperties;
import io.xpipe.app.core.AppVersion;
import io.xpipe.app.util.LicenseProvider;
import io.xpipe.beacon.api.DaemonVersionExchange;

import com.sun.net.httpserver.HttpExchange;

public class DaemonVersionExchangeImpl extends DaemonVersionExchange {

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }

    @Override
    public Object handle(HttpExchange exchange, Request msg) {
        var jvmVersion = System.getProperty("java.vm.vendor") + " " + System.getProperty("java.vm.name") + " ("
                + System.getProperty("java.vm.version") + ")";
        var version = AppProperties.get().getVersion();
        return Response.builder()
                .version(version)
                .canonicalVersion(AppVersion.parse(version)
                        .map(appVersion -> appVersion.toString())
                        .orElse("?"))
                .buildVersion(AppProperties.get().getBuild())
                .jvmVersion(jvmVersion)
                .plan(LicenseProvider.get().getLicenseId())
                .build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.BlobManager;
import io.xpipe.beacon.api.FsBlobExchange;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

import java.util.UUID;

public class FsBlobExchangeImpl extends FsBlobExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var id = UUID.randomUUID();

        var size = exchange.getRequestBody().available();
        if (size > 100_000_000) {
            BlobManager.get().store(id, exchange.getRequestBody());
        } else {
            BlobManager.get().store(id, exchange.getRequestBody().readAllBytes());
        }
        return Response.builder().blob(id).build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.beacon.BlobManager;
import io.xpipe.app.ext.ConnectionFileSystem;
import io.xpipe.app.util.FixedSizeInputStream;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.FsReadExchange;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

import java.io.BufferedInputStream;
import java.io.OutputStream;
import java.nio.file.Files;

public class FsReadExchangeImpl extends FsReadExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var shell = AppBeaconServer.get().getCache().getShellSession(msg.getConnection());
        var fs = new ConnectionFileSystem(shell.getControl());

        if (!fs.fileExists(msg.getPath())) {
            throw new BeaconClientException("File does not exist");
        }

        var size = fs.getFileSize(msg.getPath());
        if (size > 100_000_000) {
            var file = BlobManager.get().newBlobFile();
            try (var in = fs.openInput(msg.getPath())) {
                var fixedIn = new FixedSizeInputStream(new BufferedInputStream(in), size);
                try (var fileOut = Files.newOutputStream(file)) {
                    fixedIn.transferTo(fileOut);
                }
                in.transferTo(OutputStream.nullOutputStream());
            }

            exchange.sendResponseHeaders(200, size);
            try (var fileIn = Files.newInputStream(file);
                    var out = exchange.getResponseBody()) {
                fileIn.transferTo(out);
            }
        } else {
            byte[] bytes;
            try (var in = fs.openInput(msg.getPath())) {
                var fixedIn = new FixedSizeInputStream(new BufferedInputStream(in), size);
                bytes = fixedIn.readAllBytes();
                in.transferTo(OutputStream.nullOutputStream());
            }
            exchange.sendResponseHeaders(200, bytes.length);
            try (var out = exchange.getResponseBody()) {
                out.write(bytes);
            }
        }
        return Response.builder().build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.beacon.BlobManager;
import io.xpipe.app.process.ScriptHelper;
import io.xpipe.beacon.api.FsScriptExchange;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

import java.nio.charset.StandardCharsets;

public class FsScriptExchangeImpl extends FsScriptExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var shell = AppBeaconServer.get().getCache().getShellSession(msg.getConnection());
        String data;
        try (var in = BlobManager.get().getBlob(msg.getBlob())) {
            data = new String(in.readAllBytes(), StandardCharsets.UTF_8);
        }
        data = shell.getControl().getShellDialect().prepareScriptContent(shell.getControl(), data);
        var file = ScriptHelper.createExecScript(shell.getControl(), data);
        return Response.builder().path(file).build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.beacon.BlobManager;
import io.xpipe.app.ext.ConnectionFileSystem;
import io.xpipe.beacon.api.FsWriteExchange;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

public class FsWriteExchangeImpl extends FsWriteExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var shell = AppBeaconServer.get().getCache().getShellSession(msg.getConnection());
        var fs = new ConnectionFileSystem(shell.getControl());
        try (var in = BlobManager.get().getBlob(msg.getBlob());
                var os = fs.openOutput(msg.getPath(), in.available())) {
            in.transferTo(os);
        }
        return Response.builder().build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/HandshakeExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.beacon.BeaconSession;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.beacon.BeaconAuthMethod;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.HandshakeExchange;

import com.sun.net.httpserver.HttpExchange;

import java.util.UUID;

public class HandshakeExchangeImpl extends HandshakeExchange {

    @Override
    public boolean requiresCompletedStartup() {
        return false;
    }

    @Override
    public Object handle(HttpExchange exchange, Request request) throws BeaconClientException {
        if (!checkAuth(request.getAuth())) {
            throw new BeaconClientException("Authentication failed");
        }

        TrackEvent.withTrace("Handshake request received")
                .tag("client", request.getClient().toDisplayString())
                .handle();

        var session = new BeaconSession(request.getClient(), UUID.randomUUID().toString());
        AppBeaconServer.get().addSession(session);
        return Response.builder().sessionToken(session.getToken()).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }

    private boolean checkAuth(BeaconAuthMethod authMethod) {
        if (authMethod instanceof BeaconAuthMethod.Local local) {
            var c = local.getAuthFileContent().strip();
            return AppBeaconServer.get().getLocalAuthSecret().equals(c);
        }

        if (authMethod instanceof BeaconAuthMethod.ApiKey key) {
            var c = key.getKey().strip();
            return AppPrefs.get().apiKey().get().equals(c);
        }

        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorageSecret;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.SecretDecryptExchange;

import com.sun.net.httpserver.HttpExchange;

import java.io.IOException;

public class SecretDecryptExchangeImpl extends SecretDecryptExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws IOException, BeaconClientException {
        var secret = DataStorageSecret.deserialize(msg.getEncrypted());
        if (secret == null) {
            throw new BeaconClientException("Unable to parse secret");
        }

        return Response.builder().decrypted(new String(secret.getSecret())).build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.storage.DataStorageSecret;
import io.xpipe.beacon.api.SecretEncryptExchange;
import io.xpipe.core.InPlaceSecretValue;

import com.sun.net.httpserver.HttpExchange;

public class SecretEncryptExchangeImpl extends SecretEncryptExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) {
        var secret = DataStorageSecret.ofCurrentSecret(InPlaceSecretValue.of(msg.getValue()));
        return Response.builder().encrypted(secret.serialize(true)).build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ShellExecExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.beacon.api.ShellExecExchange;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

import java.util.concurrent.atomic.AtomicReference;

public class ShellExecExchangeImpl extends ShellExecExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var existing = AppBeaconServer.get().getCache().getShellSession(msg.getConnection());
        AtomicReference<String> out = new AtomicReference<>();
        AtomicReference<String> err = new AtomicReference<>();
        long exitCode;
        try (var command = existing.getControl().command(msg.getCommand()).start()) {
            var r = command.readStdoutAndStderr();
            out.set(r[0]);
            err.set(r[1]);
            command.close();
            exitCode = command.getExitCode();
        }
        return Response.builder()
                .stdout(out.get())
                .stderr(err.get())
                .exitCode(exitCode)
                .build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.beacon.BeaconShellSession;
import io.xpipe.app.ext.ShellStore;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ShellStartExchange;
import io.xpipe.core.JacksonMapper;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

public class ShellStartExchangeImpl extends ShellStartExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var e = DataStorage.get()
                .getStoreEntryIfPresent(msg.getConnection())
                .orElseThrow(() -> new BeaconClientException("Unknown connection"));
        if (!(e.getStore() instanceof ShellStore s)) {
            throw new BeaconClientException("Not a shell connection");
        }

        var existing = AppBeaconServer.get().getCache().getShellSessions().stream()
                .filter(beaconShellSession -> beaconShellSession.getEntry().equals(e))
                .findFirst();
        var control = (existing.isPresent()
                ? existing.get().getControl()
                : s.standaloneControl().start());
        control.setNonInteractive();
        control.start();

        var d = control.getShellDialect().getDumbMode();
        if (!d.supportsAnyPossibleInteraction()) {
            control.close();
            d.throwIfUnsupported();
        }

        if (existing.isEmpty()) {
            AppBeaconServer.get().getCache().getShellSessions().add(new BeaconShellSession(e, control));
        }
        var ttyState =
                JacksonMapper.getDefault().valueToTree(control.getTtyState()).asText();
        return Response.builder()
                .shellDialect(control.getShellDialect().getId())
                .osType(control.getOsType())
                .osName(control.getOsName())
                .temp(control.getSystemTemporaryDirectory())
                .ttyState(ttyState)
                .build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.beacon.api.ShellStopExchange;

import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;

public class ShellStopExchangeImpl extends ShellStopExchange {

    @Override
    @SneakyThrows
    public Object handle(HttpExchange exchange, Request msg) {
        var e = AppBeaconServer.get().getCache().getShellSession(msg.getConnection());
        e.getControl().close();
        AppBeaconServer.get().getCache().getShellSessions().remove(e);
        return Response.builder().build();
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.process.ShellDialects;
import io.xpipe.app.terminal.TerminalLauncherManager;
import io.xpipe.beacon.api.SshLaunchExchange;

import com.sun.net.httpserver.HttpExchange;

import java.util.List;

public class SshLaunchExchangeImpl extends SshLaunchExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws Exception {
        if ("echo $SHELL".equals(msg.getArguments())) {
            return Response.builder().command(List.of("echo", "/bin/bash")).build();
        }

        var usedDialect = ShellDialects.getStartableDialects().stream()
                .filter(dialect -> dialect.getExecutableName().equalsIgnoreCase(msg.getArguments()))
                .findFirst();
        if (msg.getArguments() != null
                && usedDialect.isEmpty()
                && !msg.getArguments().contains("SSH_ORIGINAL_COMMAND")) {
            return Response.builder().command(List.of()).build();
        }

        // There are sometimes multiple requests by a terminal client (e.g. Termius)
        // This might fail sometimes, but it is expected
        var r = TerminalLauncherManager.sshLaunchExchange();
        var c = ProcessControlProvider.get()
                .getEffectiveLocalDialect()
                .getOpenScriptCommand(r.toString())
                .buildBaseParts(null);
        return Response.builder().command(c).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalExternalLaunchExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.core.AppCache;
import io.xpipe.app.core.window.AppDialog;
import io.xpipe.app.ext.ShellStore;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageQuery;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.terminal.TerminalLauncherManager;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.BeaconServerException;
import io.xpipe.beacon.api.TerminalExternalLaunchExchange;

import com.sun.net.httpserver.HttpExchange;

import java.util.List;

public class TerminalExternalLaunchExchangeImpl extends TerminalExternalLaunchExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException {
        var found = DataStorageQuery.queryUserInput(msg.getConnection());
        if (found.isEmpty()) {
            throw new BeaconClientException("No connection found for input " + msg.getConnection());
        }

        if (found.size() > 1) {
            throw new BeaconClientException("Multiple connections found: "
                    + found.stream().map(DataStoreEntry::getName).toList());
        }

        var e = found.getFirst();
        var isShell = e.getStore() instanceof ShellStore;
        if (!isShell) {
            throw new BeaconClientException(
                    "Connection " + DataStorage.get().getStorePath(e).toString() + " is not a shell connection");
        }

        if (!checkPermission()) {
            return Response.builder().command(List.of()).build();
        }

        var r = TerminalLauncherManager.externalExchange(e.ref(), msg.getArguments());
        return Response.builder().command(r).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }

    @Override
    public Object getSynchronizationObject() {
        return DataStorage.get();
    }

    private boolean checkPermission() {
        var cache = AppCache.getBoolean("externalLaunchPermitted", false);
        if (cache) {
            return true;
        }

        var r = AppDialog.confirm("externalLaunch");
        if (r) {
            AppCache.update("externalLaunchPermitted", true);
        }
        return r;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.terminal.TerminalLauncherManager;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.BeaconServerException;
import io.xpipe.beacon.api.TerminalLaunchExchange;

import com.sun.net.httpserver.HttpExchange;

public class TerminalLaunchExchangeImpl extends TerminalLaunchExchange {
    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException {
        var r = TerminalLauncherManager.launchExchange(msg.getRequest());
        return Response.builder().targetFile(r).build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.beacon.api.TerminalPrepareExchange;

import com.sun.net.httpserver.HttpExchange;

public class TerminalPrepareExchangeImpl extends TerminalPrepareExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) {
        var term = AppPrefs.get().terminalType().getValue();
        var unicode = term.supportsUnicode();
        var escapes = term.supportsEscapes();
        return Response.builder()
                .supportsUnicode(unicode)
                .supportsEscapeSequences(escapes)
                .build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.terminal.TerminalLauncherManager;
import io.xpipe.app.terminal.TerminalView;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.TerminalRegisterExchange;

import com.sun.net.httpserver.HttpExchange;

public class TerminalRegisterExchangeImpl extends TerminalRegisterExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
        TerminalView.get().open(msg.getRequest(), msg.getPid());
        TerminalLauncherManager.registerPid(msg.getRequest(), msg.getPid());
        return Response.builder().build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java
================================================
package io.xpipe.app.beacon.impl;

import io.xpipe.app.terminal.TerminalLauncherManager;
import io.xpipe.beacon.BeaconServerException;
import io.xpipe.beacon.api.TerminalWaitExchange;

import com.sun.net.httpserver.HttpExchange;

public class TerminalWaitExchangeImpl extends TerminalWaitExchange {

    @Override
    public Object handle(HttpExchange exchange, Request msg) throws BeaconServerException {
        TerminalLauncherManager.waitExchange(msg.getRequest());
        return Response.builder().build();
    }

    @Override
    public boolean requiresEnabledApi() {
        return false;
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/mcp/AppMcpServer.java
================================================
package io.xpipe.app.beacon.mcp;

import io.xpipe.app.core.AppNames;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.util.ThreadHelper;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import io.modelcontextprotocol.common.McpTransportContext;
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
import io.modelcontextprotocol.server.McpServerFeatures;
import io.modelcontextprotocol.server.McpSyncServer;
import io.modelcontextprotocol.spec.HttpHeaders;
import io.modelcontextprotocol.spec.McpSchema;
import lombok.SneakyThrows;
import lombok.Value;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

@Value
public class AppMcpServer {

    private static AppMcpServer INSTANCE;

    McpSyncServer mcpSyncServer;
    HttpStreamableServerTransportProvider transportProvider;
    List<McpServerFeatures.SyncToolSpecification> readOnlyTools;
    List<McpServerFeatures.SyncToolSpecification> mutationTools;

    public static AppMcpServer get() {
        return INSTANCE;
    }

    @SneakyThrows
    public static void init() {
        var transportProvider = new HttpStreamableServerTransportProvider(
                new JacksonMcpJsonMapper(new ObjectMapper()),
                "/mcp",
                false,
                (serverRequest) -> McpTransportContext.EMPTY,
                null);

        McpSyncServer syncServer = io.modelcontextprotocol.server.McpServer.sync(transportProvider)
                .serverInfo(AppNames.ofCurrent().getName(), AppProperties.get().getVersion())
                .capabilities(McpSchema.ServerCapabilities.builder()
                        .resources(false, false)
                        .tools(true)
                        .prompts(false)
                        .build())
                .instructions(AppPrefs.get().mcpAdditionalContext().getValue())
                .build();

        var readOnlyTools = new ArrayList<McpServerFeatures.SyncToolSpecification>();
        readOnlyTools.add(McpTools.help());
        readOnlyTools.add(McpTools.listSystems());
        readOnlyTools.add(McpTools.readFile());
        readOnlyTools.add(McpTools.listFiles());
        readOnlyTools.add(McpTools.findFile());
        readOnlyTools.add(McpTools.getFileInfo());

        var mutationTools = new ArrayList<McpServerFeatures.SyncToolSpecification>();
        mutationTools.add(McpTools.openTerminal());
        mutationTools.add(McpTools.openTerminalInline());
        mutationTools.add(McpTools.createFile());
        mutationTools.add(McpTools.writeFile());
        mutationTools.add(McpTools.createDirectory());
        mutationTools.add(McpTools.runCommand());
        mutationTools.add(McpTools.runScript());
        mutationTools.add(McpTools.toggleState());

        for (McpServerFeatures.SyncToolSpecification readOnlyTool : readOnlyTools) {
            syncServer.addTool(readOnlyTool);
        }

        var toolsAdded = new AtomicBoolean();
        AppPrefs.get().enableMcpMutationTools().subscribe(value -> {
            for (var mutationTool : mutationTools) {
                if (value) {
                    syncServer.addTool(mutationTool);
                } else if (toolsAdded.get()) {
                    syncServer.removeTool(mutationTool.tool().name());
                }
            }
            if (value) {
                toolsAdded.set(true);
            }
            syncServer.notifyToolsListChanged();
        });

        INSTANCE = new AppMcpServer(syncServer, transportProvider, readOnlyTools, mutationTools);
    }

    public static void reset() {
        INSTANCE.mcpSyncServer.close();
        INSTANCE = null;
    }

    public HttpHandler createHttpHandler() {
        return new HttpHandler() {

            @Override
            public void handle(HttpExchange exchange) throws IOException {
                try (exchange) {
                    if (AppPrefs.get() == null) {
                        transportProvider.sendError(exchange, 503, "Not initialized");
                        return;
                    }

                    if (!AppPrefs.get().enableMcpServer().get()) {
                        transportProvider.sendError(exchange, 403, "MCP server is not enabled in the settings menu");
                        if (exchange.getRequestMethod().equals("POST")) {
                            ThreadHelper.runAsync(() -> {
                                ErrorEventFactory.fromMessage(
                                                "An external request was made to the XPipe MCP server, however the MCP server is not enabled in the"
                                                        + " settings menu")
                                        .expected()
                                        .handle();
                            });
                        }
                        return;
                    }

                    if (exchange.getRequestMethod().equals("GET")
                            && exchange.getRequestHeaders().getFirst(HttpHeaders.MCP_SESSION_ID) == null) {
                        var msg = "Session ID required in mcp-session-id header."
                                + " Check whether you are using the streamable HTTP transport and not something else like SSE.";
                        transportProvider.sendError(exchange, 400, msg);
                        ThreadHelper.runAsync(() -> {
                            ErrorEventFactory.fromMessage(msg).expected().handle();
                        });
                        return;
                    }

                    if (!AppPrefs.get().disableApiAuthentication().get()) {
                        var apiKey = exchange.getRequestHeaders().getFirst("Authorization");
                        if (apiKey == null) {
                            transportProvider.sendError(exchange, 403, "Header Authorization is not set");
                            if (exchange.getRequestMethod().equals("POST")) {
                                ThreadHelper.runAsync(() -> {
                                    ErrorEventFactory.fromMessage(
                                                    "An external request was made to the XPipe MCP server without the header Authorization set. "
                                                            + "Please configure your MCP client with the Bearer API token you can find the API "
                                                            + "settings menu")
                                            .expected()
                                            .handle();
                                });
                            }
                            return;
                        }

                        var correct = apiKey.replace("Bearer ", "")
                                .equals(AppPrefs.get().apiKey().get());
                        if (!correct) {
                            transportProvider.sendError(exchange, 403, "Invalid API key");
                            if (exchange.getRequestMethod().equals("POST")) {
                                ThreadHelper.runAsync(() -> {
                                    ErrorEventFactory.fromMessage(
                                                    "The Authorization header sent by the MCP client is not correct")
                                            .expected()
                                            .handle();
                                });
                            }
                            return;
                        }
                    }

                    if (exchange.getRequestMethod().equals("GET")) {
                        transportProvider.doGet(exchange);
                    } else if (exchange.getRequestMethod().equals("POST")) {
                        transportProvider.doPost(exchange);
                    } else if (exchange.getRequestMethod().equals("DELETE")) {
                        transportProvider.doDelete(exchange);
                    } else {
                        transportProvider.doOther(exchange);
                    }
                }
            }
        };
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/mcp/HttpStreamableServerTransportProvider.java
================================================
/*
 * Copyright 2024-2024 the original author or authors.
 */

package io.xpipe.app.beacon.mcp;

import io.xpipe.app.issue.TrackEvent;

import com.sun.net.httpserver.HttpExchange;
import io.modelcontextprotocol.common.McpTransportContext;
import io.modelcontextprotocol.json.McpJsonMapper;
import io.modelcontextprotocol.json.TypeRef;
import io.modelcontextprotocol.server.McpTransportContextExtractor;
import io.modelcontextprotocol.spec.*;
import io.modelcontextprotocol.util.Assert;
import io.modelcontextprotocol.util.KeepAliveScheduler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;

public class HttpStreamableServerTransportProvider implements McpStreamableServerTransportProvider {

    public static final String MESSAGE_EVENT_TYPE = "message";

    public static final String UTF_8 = "UTF-8";
    public static final String APPLICATION_JSON = "application/json";
    public static final String TEXT_EVENT_STREAM = "text/event-stream";
    public static final String FAILED_TO_SEND_ERROR_RESPONSE = "Failed to send error response: {}";
    private static final Logger logger = LoggerFactory.getLogger(HttpStreamableServerTransportProvider.class);

    private static final String ACCEPT = "Accept";

    private final String mcpEndpoint;

    private final boolean disallowDelete;

    private final McpJsonMapper jsonMapper;

    private final ConcurrentHashMap<String, McpStreamableServerSession> sessions = new ConcurrentHashMap<>();

    private final McpTransportContextExtractor<HttpExchange> contextExtractor;
    private McpStreamableServerSession.Factory sessionFactory;

    private volatile boolean isClosing = false;

    private KeepAliveScheduler keepAliveScheduler;

    HttpStreamableServerTransportProvider(
            McpJsonMapper jsonMapper,
            String mcpEndpoint,
            boolean disallowDelete,
            McpTransportContextExtractor<HttpExchange> contextExtractor,
            Duration keepAliveInterval) {
        Assert.notNull(jsonMapper, "ObjectMapper must not be null");
        Assert.notNull(mcpEndpoint, "MCP endpoint must not be null");
        Assert.notNull(contextExtractor, "Context extractor must not be null");

        this.jsonMapper = jsonMapper;
        this.mcpEndpoint = mcpEndpoint;
        this.disallowDelete = disallowDelete;
        this.contextExtractor = contextExtractor;

        if (keepAliveInterval != null) {

            this.keepAliveScheduler = KeepAliveScheduler.builder(
                            () -> (isClosing) ? Flux.empty() : Flux.fromIterable(sessions.values()))
                    .initialDelay(keepAliveInterval)
                    .interval(keepAliveInterval)
                    .build();

            this.keepAliveScheduler.start();
        }
    }

    public List<String> protocolVersions() {
        return List.of(
                ProtocolVersions.MCP_2024_11_05, ProtocolVersions.MCP_2025_03_26, ProtocolVersions.MCP_2025_06_18, ProtocolVersions.MCP_2025_11_25);
    }

    @Override
    public void setSessionFactory(McpStreamableServerSession.Factory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public Mono<Void> notifyClients(String method, Object params) {
        if (this.sessions.isEmpty()) {
            logger.debug("No active sessions to broadcast message to");
            return Mono.empty();
        }

        logger.debug("Attempting to broadcast message to {} active sessions", this.sessions.size());

        return Mono.fromRunnable(() -> {
            this.sessions.values().parallelStream().forEach(session -> {
                try {
                    session.sendNotification(method, params).block();
                } catch (Exception e) {
                    logger.error("Failed to send message to session {}: {}", session.getId(), e.getMessage());
                }
            });
        });
    }

    /**
     * Initiates a graceful shutdown of the transport.
     *
     * @return A Mono that completes when all cleanup operations are finished
     */
    @Override
    public Mono<Void> closeGracefully() {
        return Mono.fromRunnable(() -> {
                    this.isClosing = true;
                    logger.debug("Initiating graceful shutdown with {} active sessions", this.sessions.size());

                    this.sessions.values().parallelStream().forEach(session -> {
                        try {
                            session.closeGracefully().block();
                        } catch (Exception e) {
                            logger.error("Failed to close session {}: {}", session.getId(), e.getMessage());
                        }
                    });

                    this.sessions.clear();
                    logger.debug("Graceful shutdown completed");
                })
                .then()
                .doOnSuccess(v -> {
                    sessions.clear();
                    logger.debug("Graceful shutdown completed");
                    if (this.keepAliveScheduler != null) {
                        this.keepAliveScheduler.shutdown();
                    }
                });
    }

    public void doGet(HttpExchange exchange) throws IOException {

        String requestURI = exchange.getRequestURI().toString();
        if (!requestURI.endsWith(mcpEndpoint)) {
            sendError(exchange, 404, null);
            return;
        }

        if (this.isClosing) {
            sendError(exchange, 503, "Server is shutting down");
            return;
        }

        List<String> badRequestErrors = new ArrayList<>();

        String accept = exchange.getRequestHeaders().getFirst(ACCEPT);
        if (accept == null || !accept.contains(TEXT_EVENT_STREAM)) {
            badRequestErrors.add("text/event-stream required in Accept header");
        }

        String sessionId = exchange.getRequestHeaders().getFirst(HttpHeaders.MCP_SESSION_ID);

        if (sessionId == null || sessionId.isBlank()) {
            badRequestErrors.add("Session ID required in mcp-session-id header");
        }

        if (!badRequestErrors.isEmpty()) {
            String combinedMessage = String.join("; ", badRequestErrors);
            this.sendError(exchange, 400, combinedMessage);
            return;
        }

        McpStreamableServerSession session = this.sessions.get(sessionId);

        if (session == null) {
            sendError(exchange, 404, null);
            return;
        }

        logger.debug("Handling GET request for session: {}", sessionId);

        McpTransportContext transportContext = this.contextExtractor.extract(exchange);

        try {
            exchange.getResponseHeaders().add("Content-Type", TEXT_EVENT_STREAM);
            exchange.getResponseHeaders().add("Content-Encoding", UTF_8);
            exchange.getResponseHeaders().add("Cache-Control", "no-cache");
            exchange.getResponseHeaders().add("Connection", "keep-alive");
            exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
            exchange.sendResponseHeaders(200, 0);

            var writer = new PrintWriter(exchange.getResponseBody());
            HttpServletStreamableMcpSessionTransport sessionTransport =
                    new HttpServletStreamableMcpSessionTransport(sessionId, exchange, writer);

            // Check if this is a replay request
            if (exchange.getRequestHeaders().getFirst(HttpHeaders.LAST_EVENT_ID) != null) {
                String lastId = exchange.getRequestHeaders().getFirst(HttpHeaders.LAST_EVENT_ID);

                try {
                    session.replay(lastId)
                            .contextWrite(ctx -> ctx.put(McpTransportContext.KEY, transportContext))
                            .toIterable()
                            .forEach(message -> {
                                try {
                                    sessionTransport
                                            .sendMessage(message)
                                            .contextWrite(ctx -> ctx.put(McpTransportContext.KEY, transportContext))
                                            .block();
                                } catch (Exception e) {
                                    logger.error("Failed to replay message: {}", e.getMessage());
                                    exchange.close();
                                }
                            });
                } catch (Exception e) {
                    logger.error("Failed to replay messages: {}", e.getMessage());
                    exchange.close();
                }
            }
        } catch (Exception e) {
            logger.error("Failed to handle GET request for session {}: {}", sessionId, e.getMessage());
            sendError(exchange, 500, null);
        }
    }

    public void sendError(HttpExchange exchange, int code, String message) throws IOException {
        var b = message != null ? message.getBytes(StandardCharsets.UTF_8) : new byte[0];
        exchange.getResponseHeaders().add("Content-Encoding", UTF_8);
        exchange.sendResponseHeaders(code, b.length != 0 ? b.length : -1);
        try (OutputStream os = exchange.getResponseBody()) {
            os.write(b);
        }

        TrackEvent.error("MCP server error " + code + ": " + message);
    }

    public void doPost(HttpExchange exchange) throws IOException {

        String requestURI = exchange.getRequestURI().toString();
        if (!requestURI.endsWith(mcpEndpoint)) {
            sendError(exchange, 404, null);
            return;
        }

        if (this.isClosing) {
            sendError(exchange, 503, "Server is shutting down");
            return;
        }

        List<String> badRequestErrors = new ArrayList<>();

        String accept = exchange.getRequestHeaders().getFirst(ACCEPT);
        if (accept == null || !accept.contains(TEXT_EVENT_STREAM)) {
            badRequestErrors.add("text/event-stream required in Accept header");
        }
        if (accept == null || !accept.contains(APPLICATION_JSON)) {
            badRequestErrors.add("application/json required in Accept header");
        }

        McpTransportContext transportContext = this.contextExtractor.extract(exchange);

        try {
            var body = new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8);

            McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage(jsonMapper, body);

            // Handle initialization request
            if (message instanceof McpSchema.JSONRPCRequest jsonrpcRequest
                    && jsonrpcRequest.method().equals(McpSchema.METHOD_INITIALIZE)) {
                if (!badRequestErrors.isEmpty()) {
                    String combinedMessage = String.join("; ", badRequestErrors);
                    this.sendError(exchange, 400, combinedMessage);
                    return;
                }

                McpSchema.InitializeRequest initializeRequest =
                        jsonMapper.convertValue(jsonrpcRequest.params(), new TypeRef<>() {});
                McpStreamableServerSession.McpStreamableServerSessionInit init =
                        this.sessionFactory.startSession(initializeRequest);
                this.sessions.put(init.session().getId(), init.session());

                try {
                    McpSchema.InitializeResult initResult = init.initResult().block();

                    String jsonResponse = jsonMapper.writeValueAsString(new McpSchema.JSONRPCResponse(
                            McpSchema.JSONRPC_VERSION, jsonrpcRequest.id(), initResult, null));
                    var jsonBytes = jsonResponse.getBytes(StandardCharsets.UTF_8);

                    exchange.getResponseHeaders().add("Content-Type", APPLICATION_JSON);
                    exchange.getResponseHeaders().add("Content-Encoding", UTF_8);
                    exchange.getResponseHeaders()
                            .add(HttpHeaders.MCP_SESSION_ID, init.session().getId());
                    exchange.sendResponseHeaders(200, jsonBytes.length);
                    exchange.getResponseBody().write(jsonBytes);
                    return;
                } catch (Exception e) {
                    logger.error("Failed to initialize session: {}", e.getMessage());
                    this.sendError(exchange, 500, "Failed to initialize session: " + e.getMessage());
                    return;
                }
            }

            String sessionId = exchange.getRequestHeaders().getFirst(HttpHeaders.MCP_SESSION_ID);

            if (sessionId == null || sessionId.isBlank()) {
                badRequestErrors.add("Session ID required in mcp-session-id header");
            }

            if (!badRequestErrors.isEmpty()) {
                String combinedMessage = String.join("; ", badRequestErrors);
                this.sendError(exchange, 400, combinedMessage);
                return;
            }

            McpStreamableServerSession session = this.sessions.get(sessionId);

            if (session == null) {
                this.sendError(exchange, 404, "Session not found: " + sessionId + ". Was the session not refreshed?");
                return;
            }

            if (message instanceof McpSchema.JSONRPCResponse jsonrpcResponse) {
                session.accept(jsonrpcResponse)
                        .contextWrite(ctx -> ctx.put(McpTransportContext.KEY, transportContext))
                        .block();
                exchange.sendResponseHeaders(200, -1);
            } else if (message instanceof McpSchema.JSONRPCNotification jsonrpcNotification) {
                session.accept(jsonrpcNotification)
                        .contextWrite(ctx -> ctx.put(McpTransportContext.KEY, transportContext))
                        .block();
                exchange.sendResponseHeaders(202, -1);
            } else if (message instanceof McpSchema.JSONRPCRequest jsonrpcRequest) {
                // For streaming responses, we need to return SSE
                exchange.getResponseHeaders().add("Content-Type", TEXT_EVENT_STREAM);
                exchange.getResponseHeaders().add("Content-Encoding", UTF_8);
                exchange.getResponseHeaders().add("Cache-Control", "no-cache");
                exchange.getResponseHeaders().add("Connection", "keep-alive");
                exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
                exchange.sendResponseHeaders(200, 0);

                var writer = new PrintWriter(exchange.getResponseBody());

                HttpServletStreamableMcpSessionTransport sessionTransport =
                        new HttpServletStreamableMcpSessionTransport(sessionId, exchange, writer);

                try {
                    session.responseStream(jsonrpcRequest, sessionTransport)
                            .contextWrite(ctx -> ctx.put(McpTransportContext.KEY, transportContext))
                            .block();
                } catch (Exception e) {
                    logger.error("Failed to handle request stream: {}", e.getMessage());
                    exchange.close();
                }
            } else {
                this.sendError(exchange, 500, "Unknown message type");
            }
        } catch (IllegalArgumentException | IOException e) {
            logger.error("Failed to deserialize message: {}", e.getMessage());
            this.sendError(exchange, 400, "Invalid message format: " + e.getMessage());
        } catch (Exception e) {
            logger.error("Error handling message: {}", e.getMessage());
            try {
                this.sendError(exchange, 500, "Error processing message: " + e.getMessage());
            } catch (IOException ex) {
                logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
                sendError(exchange, 500, "Error processing message");
            }
        }
    }

    public void doOther(HttpExchange exchange) throws IOException {
        sendError(exchange, 405, "Unsupported HTTP method: " + exchange.getRequestMethod());
    }

    protected void doDelete(HttpExchange exchange) throws IOException {

        String requestURI = exchange.getRequestURI().toString();
        if (!requestURI.endsWith(mcpEndpoint)) {
            sendError(exchange, 404, null);
            return;
        }

        if (this.isClosing) {
            sendError(exchange, 503, "Server is shutting down");
            return;
        }

        if (this.disallowDelete) {
            sendError(exchange, 405, null);
            return;
        }

        McpTransportContext transportContext = this.contextExtractor.extract(exchange);

        if (exchange.getRequestHeaders().getFirst(HttpHeaders.MCP_SESSION_ID) == null) {
            sendError(exchange, 400, "Session ID required in mcp-session-id header");
            return;
        }

        String sessionId = exchange.getRequestHeaders().getFirst(HttpHeaders.MCP_SESSION_ID);
        McpStreamableServerSession session = this.sessions.get(sessionId);

        if (session == null) {
            sendError(exchange, 404, null);
            return;
        }

        try {
            session.delete()
                    .contextWrite(ctx -> ctx.put(McpTransportContext.KEY, transportContext))
                    .block();
            this.sessions.remove(sessionId);
            exchange.sendResponseHeaders(200, -1);
        } catch (Exception e) {
            logger.error("Failed to delete session {}: {}", sessionId, e.getMessage());
            try {
                sendError(exchange, 500, e.getMessage());
            } catch (IOException ex) {
                logger.error(FAILED_TO_SEND_ERROR_RESPONSE, ex.getMessage());
                sendError(exchange, 500, "Error deleting session");
            }
        }
    }

    private void sendEvent(PrintWriter writer, String eventType, String data, String id) throws IOException {
        if (id != null) {
            writer.write("id: " + id + "\n");
        }
        writer.write("event: " + eventType + "\n");
        writer.write("data: " + data + "\n\n");
        writer.flush();

        if (writer.checkError()) {
            throw new IOException("Client disconnected");
        }
    }

    private class HttpServletStreamableMcpSessionTransport implements McpStreamableServerTransport {

        private final String sessionId;

        private final HttpExchange exchange;

        private final PrintWriter writer;
        private final ReentrantLock lock = new ReentrantLock();
        private volatile boolean closed = false;

        HttpServletStreamableMcpSessionTransport(String sessionId, HttpExchange exchange, PrintWriter writer) {
            this.sessionId = sessionId;
            this.exchange = exchange;
            this.writer = writer;
            logger.debug("Streamable session transport {} initialized with SSE writer", sessionId);
        }

        @Override
        public <T> T unmarshalFrom(Object data, TypeRef<T> typeRef) {
            return jsonMapper.convertValue(data, typeRef);
        }

        @Override
        public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message, String messageId) {
            return Mono.fromRunnable(() -> {
                if (this.closed) {
                    logger.debug("Attempted to send message to closed session: {}", this.sessionId);
                    return;
                }

                lock.lock();
                try {
                    if (this.closed) {
                        logger.debug("Session {} was closed during message send attempt", this.sessionId);
                        return;
                    }

                    String jsonText = jsonMapper.writeValueAsString(message);
                    HttpStreamableServerTransportProvider.this.sendEvent(
                            writer, MESSAGE_EVENT_TYPE, jsonText, messageId != null ? messageId : this.sessionId);
                    logger.debug("Message sent to session {} with ID {}", this.sessionId, messageId);
                } catch (Exception e) {
                    var clientDisconnected = "Client disconnected".equals(e.getMessage());
                    if (!clientDisconnected) {
                        logger.error("Failed to send message to session {}: {}", this.sessionId, e.getMessage());
                        HttpStreamableServerTransportProvider.this.sessions.remove(this.sessionId);
                        exchange.close();
                    }
                } finally {
                    lock.unlock();
                }
            });
        }

        @Override
        public void close() {
            lock.lock();
            try {
                if (this.closed) {
                    logger.debug("Session transport {} already closed", this.sessionId);
                    return;
                }

                this.closed = true;

                // HttpServletStreamableServerTransportProvider.this.sessions.remove(this.sessionId);
                exchange.close();
                logger.debug("Successfully completed async context for session {}", sessionId);
            } catch (Exception e) {
                logger.warn("Failed to complete async context for session {}: {}", sessionId, e.getMessage());
            } finally {
                lock.unlock();
            }
        }

        @Override
        public Mono<Void> closeGracefully() {
            return Mono.fromRunnable(() -> {
                HttpServletStreamableMcpSessionTransport.this.close();
            });
        }

        @Override
        public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message) {
            return sendMessage(message, null);
        }
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java
================================================
package io.xpipe.app.beacon.mcp;

import io.xpipe.core.JacksonMapper;

import io.modelcontextprotocol.spec.McpSchema;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class McpSchemaFiles {

    public static String load(String name) throws IOException {
        try (var in = McpSchemaFiles.class.getResourceAsStream("/io/xpipe/app/resources/mcp/" + name)) {
            return new String(in.readAllBytes(), StandardCharsets.UTF_8);
        }
    }

    public static McpSchema.Tool loadTool(String name) throws IOException {
        var s = load(name);
        return JacksonMapper.getDefault().readValue(s, McpSchema.Tool.class);
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java
================================================
package io.xpipe.app.beacon.mcp;

import io.xpipe.app.ext.ShellStore;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageQuery;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.core.FilePath;

import io.modelcontextprotocol.server.McpSyncServerExchange;
import io.modelcontextprotocol.spec.McpSchema;
import lombok.SneakyThrows;

import java.util.Optional;
import java.util.function.BiFunction;

public interface McpToolHandler
        extends BiFunction<McpSyncServerExchange, McpSchema.CallToolRequest, McpSchema.CallToolResult> {

    static McpToolHandler of(McpToolHandler t) {
        return t;
    }

    @Override
    @SneakyThrows
    default McpSchema.CallToolResult apply(
            McpSyncServerExchange mcpSyncServerExchange, McpSchema.CallToolRequest callToolRequest) {
        var req = new ToolRequest(mcpSyncServerExchange, callToolRequest);
        try {
            return handle(req);
        } catch (BeaconClientException e) {
            ErrorEventFactory.fromThrowable(e).expected().omit().handle();
            return McpSchema.CallToolResult.builder()
                    .addTextContent(e.getMessage())
                    .isError(true)
                    .build();
        } catch (Throwable e) {
            ErrorEventFactory.fromThrowable(e).omit().handle();
            return McpSchema.CallToolResult.builder()
                    .addTextContent(e.getMessage())
                    .isError(true)
                    .build();
        }
    }

    McpSchema.CallToolResult handle(ToolRequest request) throws Exception;

    class ToolRequest {

        protected final McpSyncServerExchange exchange;
        protected final McpSchema.CallToolRequest request;

        public ToolRequest(McpSyncServerExchange exchange, McpSchema.CallToolRequest request) {
            this.exchange = exchange;
            this.request = request;
        }

        public McpSchema.CallToolRequest getRawRequest() {
            return request;
        }

        public Optional<String> getOptionalStringArgument(String key) {
            var o = request.arguments().get(key);
            if (o == null) {
                return Optional.empty();
            }

            if (!(o instanceof String s) || s.isBlank()) {
                return Optional.empty();
            }

            return Optional.of(s);
        }

        public String getStringArgument(String key) throws BeaconClientException {
            var o = request.arguments().get(key);
            if (o == null) {
                throw new BeaconClientException("Missing argument for key " + key);
            }

            if (!(o instanceof String s) || s.isBlank()) {
                throw new BeaconClientException("Invalid argument for key " + key);
            }

            return s;
        }

        public Optional<Boolean> getOptionalBooleanArgument(String key) {
            var o = request.arguments().get(key);
            if (o == null) {
                return Optional.empty();
            }

            if (!(o instanceof Boolean b)) {
                return Optional.empty();
            }

            return Optional.of(b);
        }

        public boolean getBooleanArgument(String key) throws BeaconClientException {
            var o = request.arguments().get(key);
            if (o == null) {
                throw new BeaconClientException("Missing argument for key " + key);
            }

            if (!(o instanceof Boolean b)) {
                throw new BeaconClientException("Invalid argument for key " + key);
            }

            return b;
        }

        public FilePath getFilePath(String key) throws BeaconClientException {
            var s = getStringArgument(key);
            var path = FilePath.parse(s);
            if (path == null) {
                throw new BeaconClientException("Invalid argument for key " + key);
            }
            return path;
        }

        public DataStoreEntryRef<?> getDataStoreRef(String name) throws BeaconClientException {
            var found = DataStorageQuery.queryUserInput(name);
            if (found.isEmpty()) {
                throw new BeaconClientException("No connection found for input " + name);
            }

            if (found.size() > 1) {
                throw new BeaconClientException("Multiple connections found: "
                        + found.stream().map(DataStoreEntry::getName).toList());
            }

            var e = found.getFirst();
            return e.ref();
        }

        public DataStoreEntryRef<ShellStore> getShellStoreRef(String name, boolean mutation) throws BeaconClientException {
            var ref = getDataStoreRef(name);
            var isShell = ref.getStore() instanceof ShellStore;
            if (!isShell) {
                throw new BeaconClientException("Connection "
                        + DataStorage.get().getStorePath(ref.get()).toString() + " is not a shell connection");
            }

            var disableMutation = DataStorage.get().getEffectiveCategoryConfig(ref.get()).getDontAllowScripts();
            if (mutation && disableMutation != null && disableMutation) {
                throw new BeaconClientException("Modifications to connection "
                        + DataStorage.get().getStorePath(ref.get()).toString() + " is disabled by the category setting");
            }

            return ref.asNeeded();
        }
    }
}


================================================
FILE: app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java
================================================
package io.xpipe.app.beacon.mcp;

import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.core.AppExtensionManager;
import io.xpipe.app.core.AppNames;
import io.xpipe.app.ext.*;
import io.xpipe.app.hub.comp.StoreViewState;
import io.xpipe.app.process.ScriptHelper;
import io.xpipe.app.process.ShellControl;
import io.xpipe.app.process.TerminalInitScriptConfig;
import io.xpipe.app.process.WorkingDirectoryFunction;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageQuery;
import io.xpipe.app.terminal.TerminalLaunch;
import io.xpipe.app.util.CommandDialog;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.core.FilePath;
import io.xpipe.core.JacksonMapper;

import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
import io.modelcontextprotocol.server.McpServerFeatures;
import io.modelcontextprotocol.spec.McpSchema;
import lombok.Builder;
import lombok.NonNull;
import lombok.Value;
import lombok.extern.jackson.Jacksonized;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public final class McpTools {

    public static McpServerFeatures.SyncToolSpecification help() throws IOException {
        var tool = McpSchemaFiles.loadTool("help.json");
        return McpServerFeatures.SyncToolSpecification.builder()
                .tool(tool)
                .callHandler(McpToolHandler.of((req) -> {
                    var ro = AppMcpServer.get().getReadOnlyTools().stream()
                            .filter(syncToolSpecification ->
                                    !syncToolSpecification.tool().name().equals("help"))
                            .toList();
                    var mu = AppMcpServer.get().getMutationTools();

                    var roList = ro.stream()
                            .map(syncToolSpecification ->
                                    "- " + syncToolSpecification.tool().name() + ": "
                                            + syncToolSpecification.tool().description())
                            .collect(Collectors.joining("\n"));
                    var muList = mu.stream()
                            .map(syncToolSpecification ->
               
Download .txt
gitextract_ign71aq1/

├── .gitattributes
├── .github/
│   └── dependabot.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── app/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── io/
│       │   │   │   └── xpipe/
│       │   │   │       └── app/
│       │   │   │           ├── Main.java
│       │   │   │           ├── action/
│       │   │   │           │   ├── AbstractAction.java
│       │   │   │           │   ├── ActionConfigComp.java
│       │   │   │           │   ├── ActionConfirmComp.java
│       │   │   │           │   ├── ActionConfirmation.java
│       │   │   │           │   ├── ActionJacksonMapper.java
│       │   │   │           │   ├── ActionPickComp.java
│       │   │   │           │   ├── ActionProvider.java
│       │   │   │           │   ├── ActionShortcutComp.java
│       │   │   │           │   ├── ActionUrls.java
│       │   │   │           │   ├── LauncherUrlProvider.java
│       │   │   │           │   ├── SerializableAction.java
│       │   │   │           │   ├── StoreContextAction.java
│       │   │   │           │   └── XPipeUrlProvider.java
│       │   │   │           ├── beacon/
│       │   │   │           │   ├── AppBeaconCache.java
│       │   │   │           │   ├── AppBeaconServer.java
│       │   │   │           │   ├── BeaconRequestHandler.java
│       │   │   │           │   ├── BeaconSession.java
│       │   │   │           │   ├── BeaconShellSession.java
│       │   │   │           │   ├── BlobManager.java
│       │   │   │           │   ├── impl/
│       │   │   │           │   │   ├── ActionExchangeImpl.java
│       │   │   │           │   │   ├── AskpassExchangeImpl.java
│       │   │   │           │   │   ├── CategoryAddExchangeImpl.java
│       │   │   │           │   │   ├── CategoryInfoExchangeImpl.java
│       │   │   │           │   │   ├── CategoryQueryExchangeImpl.java
│       │   │   │           │   │   ├── CategoryRemoveExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionAddExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionInfoExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionQueryExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionRefreshExchangeImpl.java
│       │   │   │           │   │   ├── ConnectionRemoveExchangeImpl.java
│       │   │   │           │   │   ├── DaemonFocusExchangeImpl.java
│       │   │   │           │   │   ├── DaemonModeExchangeImpl.java
│       │   │   │           │   │   ├── DaemonOpenExchangeImpl.java
│       │   │   │           │   │   ├── DaemonStatusExchangeImpl.java
│       │   │   │           │   │   ├── DaemonStopExchangeImpl.java
│       │   │   │           │   │   ├── DaemonVersionExchangeImpl.java
│       │   │   │           │   │   ├── FsBlobExchangeImpl.java
│       │   │   │           │   │   ├── FsReadExchangeImpl.java
│       │   │   │           │   │   ├── FsScriptExchangeImpl.java
│       │   │   │           │   │   ├── FsWriteExchangeImpl.java
│       │   │   │           │   │   ├── HandshakeExchangeImpl.java
│       │   │   │           │   │   ├── SecretDecryptExchangeImpl.java
│       │   │   │           │   │   ├── SecretEncryptExchangeImpl.java
│       │   │   │           │   │   ├── ShellExecExchangeImpl.java
│       │   │   │           │   │   ├── ShellStartExchangeImpl.java
│       │   │   │           │   │   ├── ShellStopExchangeImpl.java
│       │   │   │           │   │   ├── SshLaunchExchangeImpl.java
│       │   │   │           │   │   ├── TerminalExternalLaunchExchangeImpl.java
│       │   │   │           │   │   ├── TerminalLaunchExchangeImpl.java
│       │   │   │           │   │   ├── TerminalPrepareExchangeImpl.java
│       │   │   │           │   │   ├── TerminalRegisterExchangeImpl.java
│       │   │   │           │   │   └── TerminalWaitExchangeImpl.java
│       │   │   │           │   └── mcp/
│       │   │   │           │       ├── AppMcpServer.java
│       │   │   │           │       ├── HttpStreamableServerTransportProvider.java
│       │   │   │           │       ├── McpSchemaFiles.java
│       │   │   │           │       ├── McpToolHandler.java
│       │   │   │           │       └── McpTools.java
│       │   │   │           ├── browser/
│       │   │   │           │   ├── BrowserAbstractSessionModel.java
│       │   │   │           │   ├── BrowserFileChooserSessionComp.java
│       │   │   │           │   ├── BrowserFileChooserSessionModel.java
│       │   │   │           │   ├── BrowserFullSessionComp.java
│       │   │   │           │   ├── BrowserFullSessionModel.java
│       │   │   │           │   ├── BrowserSessionTab.java
│       │   │   │           │   ├── BrowserSessionTabsComp.java
│       │   │   │           │   ├── BrowserStoreSessionTab.java
│       │   │   │           │   ├── action/
│       │   │   │           │   │   ├── BrowserAction.java
│       │   │   │           │   │   ├── BrowserActionProvider.java
│       │   │   │           │   │   ├── BrowserActionProviders.java
│       │   │   │           │   │   └── impl/
│       │   │   │           │   │       ├── ApplyFileEditActionProvider.java
│       │   │   │           │   │       ├── BrowseInNativeManagerActionProvider.java
│       │   │   │           │   │       ├── ChgrpActionProvider.java
│       │   │   │           │   │       ├── ChmodActionProvider.java
│       │   │   │           │   │       ├── ChownActionProvider.java
│       │   │   │           │   │       ├── ComputeDirectorySizesActionProvider.java
│       │   │   │           │   │       ├── DeleteActionProvider.java
│       │   │   │           │   │       ├── MoveFileActionProvider.java
│       │   │   │           │   │       ├── NewDirectoryActionProvider.java
│       │   │   │           │   │       ├── NewFileActionProvider.java
│       │   │   │           │   │       ├── NewLinkActionProvider.java
│       │   │   │           │   │       ├── OpenDirectoryActionProvider.java
│       │   │   │           │   │       ├── OpenFileDefaultActionProvider.java
│       │   │   │           │   │       ├── OpenFileNativeDetailsActionProvider.java
│       │   │   │           │   │       ├── OpenFileNativeManagerActionProvider.java
│       │   │   │           │   │       ├── OpenFileWithActionProvider.java
│       │   │   │           │   │       ├── RunCommandInBackgroundActionProvider.java
│       │   │   │           │   │       ├── RunCommandInBrowserActionProvider.java
│       │   │   │           │   │       ├── RunCommandInTerminalActionProvider.java
│       │   │   │           │   │       └── TransferFilesActionProvider.java
│       │   │   │           │   ├── file/
│       │   │   │           │   │   ├── BrowserBreadcrumbBar.java
│       │   │   │           │   │   ├── BrowserClipboard.java
│       │   │   │           │   │   ├── BrowserConnectionListComp.java
│       │   │   │           │   │   ├── BrowserConnectionListFilterComp.java
│       │   │   │           │   │   ├── BrowserContextMenu.java
│       │   │   │           │   │   ├── BrowserDialogs.java
│       │   │   │           │   │   ├── BrowserEntry.java
│       │   │   │           │   │   ├── BrowserFileDuplicates.java
│       │   │   │           │   │   ├── BrowserFileInput.java
│       │   │   │           │   │   ├── BrowserFileListComp.java
│       │   │   │           │   │   ├── BrowserFileListCompEntry.java
│       │   │   │           │   │   ├── BrowserFileListFilterComp.java
│       │   │   │           │   │   ├── BrowserFileListModel.java
│       │   │   │           │   │   ├── BrowserFileListNameCell.java
│       │   │   │           │   │   ├── BrowserFileOpener.java
│       │   │   │           │   │   ├── BrowserFileOutput.java
│       │   │   │           │   │   ├── BrowserFileOverviewComp.java
│       │   │   │           │   │   ├── BrowserFileSelectionListComp.java
│       │   │   │           │   │   ├── BrowserFileSystemHelper.java
│       │   │   │           │   │   ├── BrowserFileSystemHistory.java
│       │   │   │           │   │   ├── BrowserFileSystemSavedState.java
│       │   │   │           │   │   ├── BrowserFileSystemTabComp.java
│       │   │   │           │   │   ├── BrowserFileSystemTabModel.java
│       │   │   │           │   │   ├── BrowserFileTransferMode.java
│       │   │   │           │   │   ├── BrowserFileTransferOperation.java
│       │   │   │           │   │   ├── BrowserGreetingComp.java
│       │   │   │           │   │   ├── BrowserHistorySavedState.java
│       │   │   │           │   │   ├── BrowserHistorySavedStateImpl.java
│       │   │   │           │   │   ├── BrowserHistoryTabComp.java
│       │   │   │           │   │   ├── BrowserHistoryTabModel.java
│       │   │   │           │   │   ├── BrowserLocalFileSystem.java
│       │   │   │           │   │   ├── BrowserNavBarComp.java
│       │   │   │           │   │   ├── BrowserOverviewComp.java
│       │   │   │           │   │   ├── BrowserQuickAccessButtonComp.java
│       │   │   │           │   │   ├── BrowserQuickAccessContextMenu.java
│       │   │   │           │   │   ├── BrowserStatusBarComp.java
│       │   │   │           │   │   ├── BrowserTerminalDockTabModel.java
│       │   │   │           │   │   ├── BrowserTransferComp.java
│       │   │   │           │   │   ├── BrowserTransferModel.java
│       │   │   │           │   │   └── BrowserTransferProgress.java
│       │   │   │           │   ├── icon/
│       │   │   │           │   │   ├── BrowserIconDirectoryType.java
│       │   │   │           │   │   ├── BrowserIconFileType.java
│       │   │   │           │   │   ├── BrowserIconManager.java
│       │   │   │           │   │   ├── BrowserIconVariant.java
│       │   │   │           │   │   └── BrowserIcons.java
│       │   │   │           │   └── menu/
│       │   │   │           │       ├── BrowserApplicationPathMenuProvider.java
│       │   │   │           │       ├── BrowserMenuBranchProvider.java
│       │   │   │           │       ├── BrowserMenuCategory.java
│       │   │   │           │       ├── BrowserMenuItemProvider.java
│       │   │   │           │       ├── BrowserMenuLeafProvider.java
│       │   │   │           │       ├── BrowserMenuProviders.java
│       │   │   │           │       ├── FileTypeMenuProvider.java
│       │   │   │           │       ├── MultiExecuteMenuProvider.java
│       │   │   │           │       └── impl/
│       │   │   │           │           ├── BackMenuProvider.java
│       │   │   │           │           ├── BrowseInNativeManagerMenuProvider.java
│       │   │   │           │           ├── ChgrpMenuProvider.java
│       │   │   │           │           ├── ChmodMenuProvider.java
│       │   │   │           │           ├── ChownMenuProvider.java
│       │   │   │           │           ├── ComputeDirectorySizesMenuProvider.java
│       │   │   │           │           ├── CopyMenuProvider.java
│       │   │   │           │           ├── CopyPathMenuProvider.java
│       │   │   │           │           ├── DeleteMenuProvider.java
│       │   │   │           │           ├── DownloadMenuProvider.java
│       │   │   │           │           ├── EditFileMenuProvider.java
│       │   │   │           │           ├── FollowLinkMenuProvider.java
│       │   │   │           │           ├── ForwardMenuProvider.java
│       │   │   │           │           ├── GradleRunMenuProvider.java
│       │   │   │           │           ├── JarMenuProvider.java
│       │   │   │           │           ├── JavapMenuProvider.java
│       │   │   │           │           ├── NewItemMenuProvider.java
│       │   │   │           │           ├── OpenDirectoryInNewTabMenuProvider.java
│       │   │   │           │           ├── OpenDirectoryMenuProvider.java
│       │   │   │           │           ├── OpenFileDefaultMenuProvider.java
│       │   │   │           │           ├── OpenFileWithMenuProvider.java
│       │   │   │           │           ├── OpenNativeFileDetailsMenuProvider.java
│       │   │   │           │           ├── OpenTerminalInDirectoryMenuProvider.java
│       │   │   │           │           ├── PasteMenuProvider.java
│       │   │   │           │           ├── RefreshDirectoryMenuProvider.java
│       │   │   │           │           ├── RenameMenuProvider.java
│       │   │   │           │           ├── RunFileMenuProvider.java
│       │   │   │           │           └── compress/
│       │   │   │           │               ├── BaseUntarMenuProvider.java
│       │   │   │           │               ├── BaseUnzipUnixMenuProvider.java
│       │   │   │           │               ├── BaseUnzipWindowsActionProvider.java
│       │   │   │           │               ├── CompressMenuProvider.java
│       │   │   │           │               ├── TarActionProvider.java
│       │   │   │           │               ├── UntarActionProvider.java
│       │   │   │           │               ├── UntarDirectoryMenuProvider.java
│       │   │   │           │               ├── UntarGzDirectoryMenuProvider.java
│       │   │   │           │               ├── UntarGzHereMenuProvider.java
│       │   │   │           │               ├── UntarHereMenuProvider.java
│       │   │   │           │               ├── UnzipActionProvider.java
│       │   │   │           │               ├── UnzipDirectoryUnixMenuProvider.java
│       │   │   │           │               ├── UnzipDirectoryWindowsActionProvider.java
│       │   │   │           │               ├── UnzipHereUnixMenuProvider.java
│       │   │   │           │               ├── UnzipHereWindowsActionProvider.java
│       │   │   │           │               └── ZipActionProvider.java
│       │   │   │           ├── comp/
│       │   │   │           │   ├── BaseRegionBuilder.java
│       │   │   │           │   ├── RegionBuilder.java
│       │   │   │           │   ├── RegionDescriptor.java
│       │   │   │           │   ├── RegionStructure.java
│       │   │   │           │   ├── RegionStructureBuilder.java
│       │   │   │           │   ├── SimpleRegionBuilder.java
│       │   │   │           │   ├── augment/
│       │   │   │           │   │   └── ContextMenuAugment.java
│       │   │   │           │   └── base/
│       │   │   │           │       ├── AnchorComp.java
│       │   │   │           │       ├── AppLayoutComp.java
│       │   │   │           │       ├── AppMainWindowContentComp.java
│       │   │   │           │       ├── ButtonComp.java
│       │   │   │           │       ├── ChoiceComp.java
│       │   │   │           │       ├── ChoicePaneComp.java
│       │   │   │           │       ├── ComboTextFieldComp.java
│       │   │   │           │       ├── ContextualFileReferenceChoiceComp.java
│       │   │   │           │       ├── ContextualFileReferenceSync.java
│       │   │   │           │       ├── CountComp.java
│       │   │   │           │       ├── DelayedInitComp.java
│       │   │   │           │       ├── FilterComp.java
│       │   │   │           │       ├── FontIconComp.java
│       │   │   │           │       ├── HorizontalComp.java
│       │   │   │           │       ├── IconButtonComp.java
│       │   │   │           │       ├── InputGroupComp.java
│       │   │   │           │       ├── IntComboFieldComp.java
│       │   │   │           │       ├── IntFieldComp.java
│       │   │   │           │       ├── IntegratedTextAreaComp.java
│       │   │   │           │       ├── IntroComp.java
│       │   │   │           │       ├── IntroListComp.java
│       │   │   │           │       ├── LabelComp.java
│       │   │   │           │       ├── LazyTextFieldComp.java
│       │   │   │           │       ├── LeftSplitPaneComp.java
│       │   │   │           │       ├── ListBoxViewComp.java
│       │   │   │           │       ├── ListSelectorComp.java
│       │   │   │           │       ├── LoadingIconComp.java
│       │   │   │           │       ├── LoadingOverlayComp.java
│       │   │   │           │       ├── MarkdownComp.java
│       │   │   │           │       ├── MarkdownEditorComp.java
│       │   │   │           │       ├── ModalButton.java
│       │   │   │           │       ├── ModalOverlay.java
│       │   │   │           │       ├── ModalOverlayComp.java
│       │   │   │           │       ├── ModalOverlayContentComp.java
│       │   │   │           │       ├── ModalOverlayStackComp.java
│       │   │   │           │       ├── MultiContentComp.java
│       │   │   │           │       ├── OptionsComp.java
│       │   │   │           │       ├── PrettyImageComp.java
│       │   │   │           │       ├── PrettyImageHelper.java
│       │   │   │           │       ├── ScrollComp.java
│       │   │   │           │       ├── SecretFieldComp.java
│       │   │   │           │       ├── SideMenuBarComp.java
│       │   │   │           │       ├── SimpleTitledPaneComp.java
│       │   │   │           │       ├── StackComp.java
│       │   │   │           │       ├── TextAreaComp.java
│       │   │   │           │       ├── TextFieldComp.java
│       │   │   │           │       ├── TileButtonComp.java
│       │   │   │           │       ├── ToggleGroupComp.java
│       │   │   │           │       ├── ToggleSwitchComp.java
│       │   │   │           │       ├── TooltipHelper.java
│       │   │   │           │       └── VerticalComp.java
│       │   │   │           ├── core/
│       │   │   │           │   ├── App.java
│       │   │   │           │   ├── AppAotTrain.java
│       │   │   │           │   ├── AppArguments.java
│       │   │   │           │   ├── AppCache.java
│       │   │   │           │   ├── AppConfigurationDialog.java
│       │   │   │           │   ├── AppDataLock.java
│       │   │   │           │   ├── AppDesktopIntegration.java
│       │   │   │           │   ├── AppDisplayScale.java
│       │   │   │           │   ├── AppExecutableCache.java
│       │   │   │           │   ├── AppExtensionManager.java
│       │   │   │           │   ├── AppFileWatcher.java
│       │   │   │           │   ├── AppFont.java
│       │   │   │           │   ├── AppFontSizes.java
│       │   │   │           │   ├── AppGreetingsDialog.java
│       │   │   │           │   ├── AppI18n.java
│       │   │   │           │   ├── AppI18nData.java
│       │   │   │           │   ├── AppImages.java
│       │   │   │           │   ├── AppInstallation.java
│       │   │   │           │   ├── AppInstance.java
│       │   │   │           │   ├── AppLayoutModel.java
│       │   │   │           │   ├── AppLocalTemp.java
│       │   │   │           │   ├── AppLogs.java
│       │   │   │           │   ├── AppNames.java
│       │   │   │           │   ├── AppOpenArguments.java
│       │   │   │           │   ├── AppPreloader.java
│       │   │   │           │   ├── AppProperties.java
│       │   │   │           │   ├── AppResources.java
│       │   │   │           │   ├── AppRestart.java
│       │   │   │           │   ├── AppSid.java
│       │   │   │           │   ├── AppStyle.java
│       │   │   │           │   ├── AppSystemInfo.java
│       │   │   │           │   ├── AppTheme.java
│       │   │   │           │   ├── AppTray.java
│       │   │   │           │   ├── AppTrayIcon.java
│       │   │   │           │   ├── AppVersion.java
│       │   │   │           │   ├── AppWindowsLock.java
│       │   │   │           │   ├── AppWindowsShutdown.java
│       │   │   │           │   ├── check/
│       │   │   │           │   │   ├── AppAndroidLinuxTerminalCheck.java
│       │   │   │           │   │   ├── AppAvCheck.java
│       │   │   │           │   │   ├── AppDebugModeCheck.java
│       │   │   │           │   │   ├── AppDirectoryPermissionsCheck.java
│       │   │   │           │   │   ├── AppGpuCheck.java
│       │   │   │           │   │   ├── AppJavaOptionsCheck.java
│       │   │   │           │   │   ├── AppPathCorruptCheck.java
│       │   │   │           │   │   ├── AppPtbDialog.java
│       │   │   │           │   │   ├── AppRosettaCheck.java
│       │   │   │           │   │   ├── AppShellCheck.java
│       │   │   │           │   │   ├── AppShellChecker.java
│       │   │   │           │   │   ├── AppSystemFontCheck.java
│       │   │   │           │   │   ├── AppTestCommandCheck.java
│       │   │   │           │   │   ├── AppWindowsArmCheck.java
│       │   │   │           │   │   └── AppWindowsTempCheck.java
│       │   │   │           │   ├── mode/
│       │   │   │           │   │   ├── AppBaseMode.java
│       │   │   │           │   │   ├── AppGuiMode.java
│       │   │   │           │   │   ├── AppOperationMode.java
│       │   │   │           │   │   └── AppTrayMode.java
│       │   │   │           │   └── window/
│       │   │   │           │       ├── AppDialog.java
│       │   │   │           │       ├── AppMainWindow.java
│       │   │   │           │       ├── AppModifiedStage.java
│       │   │   │           │       ├── AppSideWindow.java
│       │   │   │           │       ├── AppWindowBounds.java
│       │   │   │           │       ├── AppWindowStyle.java
│       │   │   │           │       └── AppWindowTitle.java
│       │   │   │           ├── ext/
│       │   │   │           │   ├── CloudSetupProvider.java
│       │   │   │           │   ├── ConnectionFileSystem.java
│       │   │   │           │   ├── ContainerImageStore.java
│       │   │   │           │   ├── ContainerStoreState.java
│       │   │   │           │   ├── CountGroupStoreProvider.java
│       │   │   │           │   ├── DataStorageExtensionProvider.java
│       │   │   │           │   ├── DataStore.java
│       │   │   │           │   ├── DataStoreCreationCategory.java
│       │   │   │           │   ├── DataStoreProvider.java
│       │   │   │           │   ├── DataStoreProviders.java
│       │   │   │           │   ├── DataStoreState.java
│       │   │   │           │   ├── DataStoreUsageCategory.java
│       │   │   │           │   ├── EnabledStoreState.java
│       │   │   │           │   ├── ExpandedLifecycleStore.java
│       │   │   │           │   ├── ExtensionException.java
│       │   │   │           │   ├── FileEntry.java
│       │   │   │           │   ├── FileInfo.java
│       │   │   │           │   ├── FileKind.java
│       │   │   │           │   ├── FileSystem.java
│       │   │   │           │   ├── FileSystemStore.java
│       │   │   │           │   ├── FixedChildStore.java
│       │   │   │           │   ├── FixedHierarchyStore.java
│       │   │   │           │   ├── GroupStore.java
│       │   │   │           │   ├── GuiDialog.java
│       │   │   │           │   ├── HostAddress.java
│       │   │   │           │   ├── InternalCacheDataStore.java
│       │   │   │           │   ├── LinkFileEntry.java
│       │   │   │           │   ├── LocalStore.java
│       │   │   │           │   ├── NameableStore.java
│       │   │   │           │   ├── NetworkTunnelSession.java
│       │   │   │           │   ├── NetworkTunnelStore.java
│       │   │   │           │   ├── PrefsChoiceValue.java
│       │   │   │           │   ├── PrefsHandler.java
│       │   │   │           │   ├── PrefsProvider.java
│       │   │   │           │   ├── PrefsValue.java
│       │   │   │           │   ├── ProcessControlProvider.java
│       │   │   │           │   ├── ScanProvider.java
│       │   │   │           │   ├── SelfReferentialStore.java
│       │   │   │           │   ├── Session.java
│       │   │   │           │   ├── SessionListener.java
│       │   │   │           │   ├── SetupToolActionProvider.java
│       │   │   │           │   ├── ShellControlFunction.java
│       │   │   │           │   ├── ShellControlParentStoreFunction.java
│       │   │   │           │   ├── ShellDialectChoiceComp.java
│       │   │   │           │   ├── ShellDialectIcons.java
│       │   │   │           │   ├── ShellSession.java
│       │   │   │           │   ├── ShellStore.java
│       │   │   │           │   ├── SingletonSessionStore.java
│       │   │   │           │   ├── SingletonSessionStoreProvider.java
│       │   │   │           │   ├── StartOnInitStore.java
│       │   │   │           │   ├── StatefulDataStore.java
│       │   │   │           │   ├── UserScopeStore.java
│       │   │   │           │   ├── ValidatableStore.java
│       │   │   │           │   ├── ValidationException.java
│       │   │   │           │   └── WrapperFileSystem.java
│       │   │   │           ├── hub/
│       │   │   │           │   ├── action/
│       │   │   │           │   │   ├── BatchHubProvider.java
│       │   │   │           │   │   ├── BatchStoreAction.java
│       │   │   │           │   │   ├── HubBranchProvider.java
│       │   │   │           │   │   ├── HubLeafProvider.java
│       │   │   │           │   │   ├── HubMenuItemProvider.java
│       │   │   │           │   │   ├── MultiStoreAction.java
│       │   │   │           │   │   ├── StoreAction.java
│       │   │   │           │   │   ├── StoreActionCategory.java
│       │   │   │           │   │   └── impl/
│       │   │   │           │   │       ├── BrowseHubLeafProvider.java
│       │   │   │           │   │       ├── CloneHubLeafProvider.java
│       │   │   │           │   │       ├── EditHubLeafProvider.java
│       │   │   │           │   │       ├── InitHubLeafProvider.java
│       │   │   │           │   │       ├── OpenHubMenuLeafProvider.java
│       │   │   │           │   │       ├── OpenSplitHubBatchProvider.java
│       │   │   │           │   │       ├── RefreshActionProvider.java
│       │   │   │           │   │       ├── RefreshChildrenHubLeafProvider.java
│       │   │   │           │   │       ├── RefreshHubLeafProvider.java
│       │   │   │           │   │       ├── SampleHubLeafProvider.java
│       │   │   │           │   │       ├── ScanHubBatchProvider.java
│       │   │   │           │   │       ├── ScanHubLeafProvider.java
│       │   │   │           │   │       ├── StartOnInitHubLeafProvider.java
│       │   │   │           │   │       └── ToggleActionProvider.java
│       │   │   │           │   └── comp/
│       │   │   │           │       ├── DataStoreCategoryChoiceComp.java
│       │   │   │           │       ├── DenseStoreEntryComp.java
│       │   │   │           │       ├── OsLogoComp.java
│       │   │   │           │       ├── StandardStoreEntryComp.java
│       │   │   │           │       ├── StoreActiveComp.java
│       │   │   │           │       ├── StoreCategoryComp.java
│       │   │   │           │       ├── StoreCategoryConfigComp.java
│       │   │   │           │       ├── StoreCategoryListComp.java
│       │   │   │           │       ├── StoreCategoryWrapper.java
│       │   │   │           │       ├── StoreChoiceComp.java
│       │   │   │           │       ├── StoreChoicePopover.java
│       │   │   │           │       ├── StoreComboChoiceComp.java
│       │   │   │           │       ├── StoreCreationComp.java
│       │   │   │           │       ├── StoreCreationConsumer.java
│       │   │   │           │       ├── StoreCreationDialog.java
│       │   │   │           │       ├── StoreCreationMenu.java
│       │   │   │           │       ├── StoreCreationModel.java
│       │   │   │           │       ├── StoreCreationQueueEntry.java
│       │   │   │           │       ├── StoreEntryBatchSelectComp.java
│       │   │   │           │       ├── StoreEntryComp.java
│       │   │   │           │       ├── StoreEntryListBatchBarComp.java
│       │   │   │           │       ├── StoreEntryListComp.java
│       │   │   │           │       ├── StoreEntryListOverviewComp.java
│       │   │   │           │       ├── StoreEntryWrapper.java
│       │   │   │           │       ├── StoreIconChoiceComp.java
│       │   │   │           │       ├── StoreIconChoiceDialog.java
│       │   │   │           │       ├── StoreIconComp.java
│       │   │   │           │       ├── StoreIdentitiesIntroComp.java
│       │   │   │           │       ├── StoreIntroComp.java
│       │   │   │           │       ├── StoreLayoutComp.java
│       │   │   │           │       ├── StoreListChoiceComp.java
│       │   │   │           │       ├── StoreNotFoundComp.java
│       │   │   │           │       ├── StoreNotesComp.java
│       │   │   │           │       ├── StoreOrderIndexDialog.java
│       │   │   │           │       ├── StoreProviderChoiceComp.java
│       │   │   │           │       ├── StoreQuickAccessButtonComp.java
│       │   │   │           │       ├── StoreScriptSourcesIntroComp.java
│       │   │   │           │       ├── StoreScriptsIntroComp.java
│       │   │   │           │       ├── StoreSection.java
│       │   │   │           │       ├── StoreSectionBaseComp.java
│       │   │   │           │       ├── StoreSectionComp.java
│       │   │   │           │       ├── StoreSectionMiniComp.java
│       │   │   │           │       ├── StoreSectionSortMode.java
│       │   │   │           │       ├── StoreSidebarComp.java
│       │   │   │           │       ├── StoreToggleComp.java
│       │   │   │           │       ├── StoreViewState.java
│       │   │   │           │       └── SystemStateComp.java
│       │   │   │           ├── icon/
│       │   │   │           │   ├── SystemIcon.java
│       │   │   │           │   ├── SystemIconCache.java
│       │   │   │           │   ├── SystemIconManager.java
│       │   │   │           │   ├── SystemIconSource.java
│       │   │   │           │   ├── SystemIconSourceData.java
│       │   │   │           │   └── SystemIconSourceFile.java
│       │   │   │           ├── issue/
│       │   │   │           │   ├── AttachmentHelper.java
│       │   │   │           │   ├── ErrorAction.java
│       │   │   │           │   ├── ErrorEvent.java
│       │   │   │           │   ├── ErrorEventFactory.java
│       │   │   │           │   ├── ErrorHandler.java
│       │   │   │           │   ├── ErrorHandlerComp.java
│       │   │   │           │   ├── ErrorHandlerDialog.java
│       │   │   │           │   ├── EventHandler.java
│       │   │   │           │   ├── EventHandlerImpl.java
│       │   │   │           │   ├── GuiErrorHandler.java
│       │   │   │           │   ├── GuiErrorHandlerBase.java
│       │   │   │           │   ├── LogErrorHandler.java
│       │   │   │           │   ├── SentryErrorHandler.java
│       │   │   │           │   ├── SyncErrorHandler.java
│       │   │   │           │   ├── TerminalErrorHandler.java
│       │   │   │           │   ├── TrackEvent.java
│       │   │   │           │   └── UserReportComp.java
│       │   │   │           ├── platform/
│       │   │   │           │   ├── BindingsHelper.java
│       │   │   │           │   ├── BooleanAnimationTimer.java
│       │   │   │           │   ├── ChainedValidator.java
│       │   │   │           │   ├── Check.java
│       │   │   │           │   ├── ClipboardHelper.java
│       │   │   │           │   ├── ColorHelper.java
│       │   │   │           │   ├── DerivedObservableList.java
│       │   │   │           │   ├── ExclusiveValidator.java
│       │   │   │           │   ├── GlobalBooleanProperty.java
│       │   │   │           │   ├── GlobalClipboard.java
│       │   │   │           │   ├── GlobalDoubleProperty.java
│       │   │   │           │   ├── GlobalObjectProperty.java
│       │   │   │           │   ├── GlobalStringProperty.java
│       │   │   │           │   ├── InputHelper.java
│       │   │   │           │   ├── JfxHelper.java
│       │   │   │           │   ├── LabelGraphic.java
│       │   │   │           │   ├── MacOsPermissions.java
│       │   │   │           │   ├── MarkdownHelper.java
│       │   │   │           │   ├── MenuHelper.java
│       │   │   │           │   ├── NativeBridge.java
│       │   │   │           │   ├── NativeMacOsWindowControl.java
│       │   │   │           │   ├── NativeWinWindowControl.java
│       │   │   │           │   ├── NodeHelper.java
│       │   │   │           │   ├── OptionsBuilder.java
│       │   │   │           │   ├── OptionsChoiceBuilder.java
│       │   │   │           │   ├── PlatformInit.java
│       │   │   │           │   ├── PlatformState.java
│       │   │   │           │   ├── PlatformThread.java
│       │   │   │           │   ├── PlatformThreadWatcher.java
│       │   │   │           │   ├── SimpleValidator.java
│       │   │   │           │   └── Validator.java
│       │   │   │           ├── prefs/
│       │   │   │           │   ├── AboutCategory.java
│       │   │   │           │   ├── ApiCategory.java
│       │   │   │           │   ├── AppPrefs.java
│       │   │   │           │   ├── AppPrefsCategory.java
│       │   │   │           │   ├── AppPrefsComp.java
│       │   │   │           │   ├── AppPrefsSidebarComp.java
│       │   │   │           │   ├── AppPrefsStorageHandler.java
│       │   │   │           │   ├── CloseBehaviour.java
│       │   │   │           │   ├── CloseBehaviourDialog.java
│       │   │   │           │   ├── ConnectionHubCategory.java
│       │   │   │           │   ├── DeveloperCategory.java
│       │   │   │           │   ├── DisplayCategory.java
│       │   │   │           │   ├── EditorCategory.java
│       │   │   │           │   ├── ExternalApplicationHelper.java
│       │   │   │           │   ├── ExternalApplicationType.java
│       │   │   │           │   ├── ExternalEditorType.java
│       │   │   │           │   ├── FileBrowserCategory.java
│       │   │   │           │   ├── HibernateBehaviour.java
│       │   │   │           │   ├── IconsCategory.java
│       │   │   │           │   ├── LinksCategory.java
│       │   │   │           │   ├── LoggingCategory.java
│       │   │   │           │   ├── McpCategory.java
│       │   │   │           │   ├── PasswordManagerCategory.java
│       │   │   │           │   ├── PasswordManagerTestComp.java
│       │   │   │           │   ├── PersonalizationCategory.java
│       │   │   │           │   ├── RdpCategory.java
│       │   │   │           │   ├── SecurityCategory.java
│       │   │   │           │   ├── SshCategory.java
│       │   │   │           │   ├── StartupBehaviour.java
│       │   │   │           │   ├── SupportedLocale.java
│       │   │   │           │   ├── SyncCategory.java
│       │   │   │           │   ├── SyncMode.java
│       │   │   │           │   ├── SystemCategory.java
│       │   │   │           │   ├── TerminalCategory.java
│       │   │   │           │   ├── ThirdPartyDependency.java
│       │   │   │           │   ├── ThirdPartyDependencyListComp.java
│       │   │   │           │   ├── TroubleshootCategory.java
│       │   │   │           │   ├── UpdateCheckComp.java
│       │   │   │           │   ├── UpdatesCategory.java
│       │   │   │           │   ├── VaultAuthentication.java
│       │   │   │           │   ├── VaultCategory.java
│       │   │   │           │   ├── WorkspaceCreationDialog.java
│       │   │   │           │   └── WorkspacesCategory.java
│       │   │   │           ├── process/
│       │   │   │           │   ├── BaseElevationHandler.java
│       │   │   │           │   ├── CommandBuilder.java
│       │   │   │           │   ├── CommandConfiguration.java
│       │   │   │           │   ├── CommandControl.java
│       │   │   │           │   ├── CommandSupport.java
│       │   │   │           │   ├── CommandView.java
│       │   │   │           │   ├── CommandViewBase.java
│       │   │   │           │   ├── CountDown.java
│       │   │   │           │   ├── ElevationFunction.java
│       │   │   │           │   ├── ElevationHandler.java
│       │   │   │           │   ├── LocalProcessInputStream.java
│       │   │   │           │   ├── LocalProcessOutputStream.java
│       │   │   │           │   ├── LocalShell.java
│       │   │   │           │   ├── NewLine.java
│       │   │   │           │   ├── OsFileSystem.java
│       │   │   │           │   ├── ParentSystemAccess.java
│       │   │   │           │   ├── ProcessControl.java
│       │   │   │           │   ├── ProcessExceptionConverter.java
│       │   │   │           │   ├── ProcessOutputException.java
│       │   │   │           │   ├── PropertiesFormatsParser.java
│       │   │   │           │   ├── ScriptHelper.java
│       │   │   │           │   ├── SecretReference.java
│       │   │   │           │   ├── ShellControl.java
│       │   │   │           │   ├── ShellDialect.java
│       │   │   │           │   ├── ShellDialectAskpass.java
│       │   │   │           │   ├── ShellDialects.java
│       │   │   │           │   ├── ShellDumbMode.java
│       │   │   │           │   ├── ShellLaunchCommand.java
│       │   │   │           │   ├── ShellOpenFunction.java
│       │   │   │           │   ├── ShellScript.java
│       │   │   │           │   ├── ShellSecurityPolicy.java
│       │   │   │           │   ├── ShellSpawnException.java
│       │   │   │           │   ├── ShellStoreState.java
│       │   │   │           │   ├── ShellTemp.java
│       │   │   │           │   ├── ShellTerminalInitCommand.java
│       │   │   │           │   ├── ShellTtyState.java
│       │   │   │           │   ├── ShellView.java
│       │   │   │           │   ├── StubShellControl.java
│       │   │   │           │   ├── SudoCache.java
│       │   │   │           │   ├── SystemState.java
│       │   │   │           │   ├── TerminalInitFunction.java
│       │   │   │           │   ├── TerminalInitScriptConfig.java
│       │   │   │           │   ├── WorkingDirectoryFunction.java
│       │   │   │           │   └── WrapperShellControl.java
│       │   │   │           ├── pwman/
│       │   │   │           │   ├── BitwardenPasswordManager.java
│       │   │   │           │   ├── DashlanePasswordManager.java
│       │   │   │           │   ├── EnpassPasswordManager.java
│       │   │   │           │   ├── KeePassXcAssociationComp.java
│       │   │   │           │   ├── KeePassXcAssociationKey.java
│       │   │   │           │   ├── KeePassXcPasswordManager.java
│       │   │   │           │   ├── KeePassXcProxyClient.java
│       │   │   │           │   ├── KeeperPasswordManager.java
│       │   │   │           │   ├── LastpassPasswordManager.java
│       │   │   │           │   ├── OnePasswordManager.java
│       │   │   │           │   ├── PassboltPasswordManager.java
│       │   │   │           │   ├── PasswordManager.java
│       │   │   │           │   ├── PasswordManagerCommand.java
│       │   │   │           │   ├── PasswordManagerCommandTemplate.java
│       │   │   │           │   ├── PsonoPasswordManager.java
│       │   │   │           │   ├── TweetNaClHelper.java
│       │   │   │           │   └── WindowsCredentialManager.java
│       │   │   │           ├── rdp/
│       │   │   │           │   ├── CustomRdpClient.java
│       │   │   │           │   ├── DevolutionsRdpClient.java
│       │   │   │           │   ├── ExternalRdpClient.java
│       │   │   │           │   ├── FreeRdpClient.java
│       │   │   │           │   ├── MstscRdpClient.java
│       │   │   │           │   ├── RdpLaunchConfig.java
│       │   │   │           │   ├── RemminaRdpClient.java
│       │   │   │           │   ├── RemoteDesktopAppRdpClient.java
│       │   │   │           │   └── WindowsAppRdpClient.java
│       │   │   │           ├── secret/
│       │   │   │           │   ├── EncryptedValue.java
│       │   │   │           │   ├── EncryptionKey.java
│       │   │   │           │   ├── EncryptionToken.java
│       │   │   │           │   ├── PasswordLockSecretValue.java
│       │   │   │           │   ├── SecretCustomCommandStrategy.java
│       │   │   │           │   ├── SecretInPlaceStrategy.java
│       │   │   │           │   ├── SecretManager.java
│       │   │   │           │   ├── SecretNoneStrategy.java
│       │   │   │           │   ├── SecretPasswordManagerStrategy.java
│       │   │   │           │   ├── SecretPromptStrategy.java
│       │   │   │           │   ├── SecretQuery.java
│       │   │   │           │   ├── SecretQueryFilter.java
│       │   │   │           │   ├── SecretQueryFormatter.java
│       │   │   │           │   ├── SecretQueryProgress.java
│       │   │   │           │   ├── SecretQueryResult.java
│       │   │   │           │   ├── SecretQueryState.java
│       │   │   │           │   ├── SecretRetrievalStrategy.java
│       │   │   │           │   ├── SecretStrategyChoiceConfig.java
│       │   │   │           │   └── VaultKeySecretValue.java
│       │   │   │           ├── spice/
│       │   │   │           │   ├── CustomSpiceClient.java
│       │   │   │           │   ├── ExternalSpiceClient.java
│       │   │   │           │   ├── RemoteViewerSpiceClient.java
│       │   │   │           │   └── SpiceLaunchConfig.java
│       │   │   │           ├── storage/
│       │   │   │           │   ├── ContextualFileReference.java
│       │   │   │           │   ├── DataStateHandler.java
│       │   │   │           │   ├── DataStorage.java
│       │   │   │           │   ├── DataStorageGroupStrategy.java
│       │   │   │           │   ├── DataStorageNode.java
│       │   │   │           │   ├── DataStorageQuery.java
│       │   │   │           │   ├── DataStorageSecret.java
│       │   │   │           │   ├── DataStorageSyncHandler.java
│       │   │   │           │   ├── DataStorageUserHandler.java
│       │   │   │           │   ├── DataStoreCategory.java
│       │   │   │           │   ├── DataStoreCategoryConfig.java
│       │   │   │           │   ├── DataStoreColor.java
│       │   │   │           │   ├── DataStoreEntry.java
│       │   │   │           │   ├── DataStoreEntryRef.java
│       │   │   │           │   ├── ImpersistentStorage.java
│       │   │   │           │   ├── StandardStorage.java
│       │   │   │           │   ├── StorageElement.java
│       │   │   │           │   └── StorageListener.java
│       │   │   │           ├── terminal/
│       │   │   │           │   ├── AlacrittyTerminalType.java
│       │   │   │           │   ├── ClinkHelper.java
│       │   │   │           │   ├── CmdTerminalType.java
│       │   │   │           │   ├── ConfigFileTerminalPrompt.java
│       │   │   │           │   ├── ControllableTerminalSession.java
│       │   │   │           │   ├── CustomTerminalType.java
│       │   │   │           │   ├── ExternalTerminalType.java
│       │   │   │           │   ├── FootTerminalType.java
│       │   │   │           │   ├── GhosttyTerminalType.java
│       │   │   │           │   ├── GnomeConsoleType.java
│       │   │   │           │   ├── GnomeTerminalType.java
│       │   │   │           │   ├── ITerm2TerminalType.java
│       │   │   │           │   ├── KittyTerminalType.java
│       │   │   │           │   ├── KonsoleTerminalType.java
│       │   │   │           │   ├── MacOsTerminalType.java
│       │   │   │           │   ├── MobaXTermTerminalType.java
│       │   │   │           │   ├── OhMyPoshTerminalPrompt.java
│       │   │   │           │   ├── OhMyZshTerminalPrompt.java
│       │   │   │           │   ├── PowerShellTerminalType.java
│       │   │   │           │   ├── PtyxisTerminalType.java
│       │   │   │           │   ├── PwshTerminalType.java
│       │   │   │           │   ├── ScreenTerminalMultiplexer.java
│       │   │   │           │   ├── SecureCrtTerminalType.java
│       │   │   │           │   ├── StarshipTerminalPrompt.java
│       │   │   │           │   ├── TabbyTerminalType.java
│       │   │   │           │   ├── TerminalDockBrowserComp.java
│       │   │   │           │   ├── TerminalDockHubComp.java
│       │   │   │           │   ├── TerminalDockHubManager.java
│       │   │   │           │   ├── TerminalDockMode.java
│       │   │   │           │   ├── TerminalDockView.java
│       │   │   │           │   ├── TerminalLaunch.java
│       │   │   │           │   ├── TerminalLaunchConfiguration.java
│       │   │   │           │   ├── TerminalLaunchRequest.java
│       │   │   │           │   ├── TerminalLaunchResult.java
│       │   │   │           │   ├── TerminalLauncher.java
│       │   │   │           │   ├── TerminalLauncherManager.java
│       │   │   │           │   ├── TerminalMultiplexer.java
│       │   │   │           │   ├── TerminalMultiplexerManager.java
│       │   │   │           │   ├── TerminalOpenFormat.java
│       │   │   │           │   ├── TerminalPaneConfiguration.java
│       │   │   │           │   ├── TerminalPrompt.java
│       │   │   │           │   ├── TerminalPromptManager.java
│       │   │   │           │   ├── TerminalProxyManager.java
│       │   │   │           │   ├── TerminalSplitStrategy.java
│       │   │   │           │   ├── TerminalView.java
│       │   │   │           │   ├── TermiusTerminalType.java
│       │   │   │           │   ├── TmuxTerminalMultiplexer.java
│       │   │   │           │   ├── TrackableTerminalType.java
│       │   │   │           │   ├── WarpTerminalType.java
│       │   │   │           │   ├── WaveTerminalType.java
│       │   │   │           │   ├── WezTerminalType.java
│       │   │   │           │   ├── WindowsTerminalSession.java
│       │   │   │           │   ├── WindowsTerminalType.java
│       │   │   │           │   ├── XShellTerminalType.java
│       │   │   │           │   ├── YakuakeTerminalType.java
│       │   │   │           │   └── ZellijTerminalMultiplexer.java
│       │   │   │           ├── test/
│       │   │   │           │   ├── ExtensionTest.java
│       │   │   │           │   ├── LocalExtensionTest.java
│       │   │   │           │   └── TestModule.java
│       │   │   │           ├── update/
│       │   │   │           │   ├── AppDistributionType.java
│       │   │   │           │   ├── AppDownloads.java
│       │   │   │           │   ├── AppInstaller.java
│       │   │   │           │   ├── AppRelease.java
│       │   │   │           │   ├── ChocoUpdater.java
│       │   │   │           │   ├── CommandUpdater.java
│       │   │   │           │   ├── GitHubUpdater.java
│       │   │   │           │   ├── PortableUpdater.java
│       │   │   │           │   ├── UpdateAvailableDialog.java
│       │   │   │           │   ├── UpdateChangelogDialog.java
│       │   │   │           │   ├── UpdateHandler.java
│       │   │   │           │   ├── UpdateNagDialog.java
│       │   │   │           │   ├── WebtopUpdater.java
│       │   │   │           │   └── WingetUpdater.java
│       │   │   │           ├── util/
│       │   │   │           │   ├── AppJacksonModule.java
│       │   │   │           │   ├── AskpassAlert.java
│       │   │   │           │   ├── AsktextAlert.java
│       │   │   │           │   ├── BooleanScope.java
│       │   │   │           │   ├── CommandDialog.java
│       │   │   │           │   ├── DataStoreFormatter.java
│       │   │   │           │   ├── Deobfuscator.java
│       │   │   │           │   ├── DesktopHelper.java
│       │   │   │           │   ├── DesktopShortcuts.java
│       │   │   │           │   ├── DocumentationLink.java
│       │   │   │           │   ├── FileBridge.java
│       │   │   │           │   ├── FileOpener.java
│       │   │   │           │   ├── FileReference.java
│       │   │   │           │   ├── FixedSizeInputStream.java
│       │   │   │           │   ├── FlatpakCache.java
│       │   │   │           │   ├── GithubReleaseDownloader.java
│       │   │   │           │   ├── GlobalTimer.java
│       │   │   │           │   ├── GroupFile.java
│       │   │   │           │   ├── HostHelper.java
│       │   │   │           │   ├── HttpHelper.java
│       │   │   │           │   ├── HumanReadableFormat.java
│       │   │   │           │   ├── Hyperlinks.java
│       │   │   │           │   ├── IniFile.java
│       │   │   │           │   ├── LicenseProvider.java
│       │   │   │           │   ├── LicenseRequiredException.java
│       │   │   │           │   ├── LicensedFeature.java
│       │   │   │           │   ├── LocalExec.java
│       │   │   │           │   ├── LocalFileTracker.java
│       │   │   │           │   ├── ModuleAccess.java
│       │   │   │           │   ├── ObservableSubscriber.java
│       │   │   │           │   ├── PasswdFile.java
│       │   │   │           │   ├── RdpConfig.java
│       │   │   │           │   ├── Rect.java
│       │   │   │           │   ├── RemminaHelper.java
│       │   │   │           │   ├── ScanDialog.java
│       │   │   │           │   ├── ScanDialogAction.java
│       │   │   │           │   ├── ScanDialogBase.java
│       │   │   │           │   ├── ScanMultiDialogComp.java
│       │   │   │           │   ├── ScanSingleDialogComp.java
│       │   │   │           │   ├── SimpleFilterInputStream.java
│       │   │   │           │   ├── SshLocalBridge.java
│       │   │   │           │   ├── StoreStateFormat.java
│       │   │   │           │   ├── ThreadHelper.java
│       │   │   │           │   ├── Translatable.java
│       │   │   │           │   ├── User32Ex.java
│       │   │   │           │   ├── Validators.java
│       │   │   │           │   └── WindowsRegistry.java
│       │   │   │           └── vnc/
│       │   │   │               ├── CustomVncClient.java
│       │   │   │               ├── ExternalVncClient.java
│       │   │   │               ├── InternalVncClient.java
│       │   │   │               ├── RealVncClient.java
│       │   │   │               ├── RemminaVncClient.java
│       │   │   │               ├── RemoteViewerVncClient.java
│       │   │   │               ├── ScreenSharingVncClient.java
│       │   │   │               ├── TigerVncClient.java
│       │   │   │               ├── TightVncClient.java
│       │   │   │               ├── VncBaseStore.java
│       │   │   │               ├── VncCategory.java
│       │   │   │               └── VncLaunchConfig.java
│       │   │   └── module-info.java
│       │   └── resources/
│       │       └── io/
│       │           └── xpipe/
│       │               └── app/
│       │                   └── resources/
│       │                       ├── file_list.txt
│       │                       ├── folder_list.txt
│       │                       ├── font-config/
│       │                       │   └── font.css
│       │                       ├── mcp/
│       │                       │   ├── create_directory.json
│       │                       │   ├── create_file.json
│       │                       │   ├── find_file.json
│       │                       │   ├── get_file_info.json
│       │                       │   ├── help.json
│       │                       │   ├── list_files.json
│       │                       │   ├── list_systems.json
│       │                       │   ├── open_terminal.json
│       │                       │   ├── open_terminal_inline.json
│       │                       │   ├── read_file.json
│       │                       │   ├── run_command.json
│       │                       │   ├── run_script.json
│       │                       │   ├── toggle_state.json
│       │                       │   └── write_file.json
│       │                       ├── misc/
│       │                       │   ├── antivirus.md
│       │                       │   ├── eula.md
│       │                       │   ├── github-markdown-dark.css
│       │                       │   ├── github-markdown-light.css
│       │                       │   ├── notes_default.md
│       │                       │   ├── report_privacy_policy.md
│       │                       │   ├── vault.md
│       │                       │   ├── vault_empty.md
│       │                       │   └── welcome.md
│       │                       ├── style/
│       │                       │   ├── about.css
│       │                       │   ├── alert.css
│       │                       │   ├── bookmark.css
│       │                       │   ├── browser.css
│       │                       │   ├── category.css
│       │                       │   ├── choice-comp.css
│       │                       │   ├── color-box.css
│       │                       │   ├── data-store-list-choice-comp.css
│       │                       │   ├── dialog-comp.css
│       │                       │   ├── dropdown-comp.css
│       │                       │   ├── error-handler-comp.css
│       │                       │   ├── file-drop-augment.css
│       │                       │   ├── frame.css
│       │                       │   ├── header-bars.css
│       │                       │   ├── intro.css
│       │                       │   ├── lazy-text-field-comp.css
│       │                       │   ├── modal-overlay-comp.css
│       │                       │   ├── options-comp.css
│       │                       │   ├── popover.css
│       │                       │   ├── popup-menu.css
│       │                       │   ├── prefs.css
│       │                       │   ├── scrollbar.css
│       │                       │   ├── side-split-pane-comp.css
│       │                       │   ├── sidebar-comp.css
│       │                       │   ├── store-entry-comp.css
│       │                       │   ├── store-mini-section.css
│       │                       │   ├── style.css
│       │                       │   ├── third-party.css
│       │                       │   ├── tile-button-comp.css
│       │                       │   ├── toggle-switch-comp.css
│       │                       │   └── tooltip.css
│       │                       └── theme/
│       │                           ├── cupertinoDark.css
│       │                           ├── cupertinoLight.css
│       │                           ├── custom.css
│       │                           ├── dark.css
│       │                           ├── dracula.css
│       │                           ├── light.css
│       │                           ├── mocha.css
│       │                           ├── nordDark.css
│       │                           └── nordLight.css
│       └── test/
│           └── java/
│               └── Test.java
├── beacon/
│   ├── README.md
│   ├── build.gradle
│   ├── publish.gradle
│   └── src/
│       └── main/
│           ├── java/
│           │   ├── io/
│           │   │   └── xpipe/
│           │   │       └── beacon/
│           │   │           ├── BeaconAuthMethod.java
│           │   │           ├── BeaconClient.java
│           │   │           ├── BeaconClientErrorResponse.java
│           │   │           ├── BeaconClientException.java
│           │   │           ├── BeaconClientInformation.java
│           │   │           ├── BeaconConfig.java
│           │   │           ├── BeaconConnectorException.java
│           │   │           ├── BeaconInterface.java
│           │   │           ├── BeaconJacksonModule.java
│           │   │           ├── BeaconServer.java
│           │   │           ├── BeaconServerErrorResponse.java
│           │   │           ├── BeaconServerException.java
│           │   │           └── api/
│           │   │               ├── ActionExchange.java
│           │   │               ├── AskpassExchange.java
│           │   │               ├── CategoryAddExchange.java
│           │   │               ├── CategoryInfoExchange.java
│           │   │               ├── CategoryQueryExchange.java
│           │   │               ├── CategoryRemoveExchange.java
│           │   │               ├── ConnectionAddExchange.java
│           │   │               ├── ConnectionInfoExchange.java
│           │   │               ├── ConnectionQueryExchange.java
│           │   │               ├── ConnectionRefreshExchange.java
│           │   │               ├── ConnectionRemoveExchange.java
│           │   │               ├── DaemonFocusExchange.java
│           │   │               ├── DaemonModeExchange.java
│           │   │               ├── DaemonOpenExchange.java
│           │   │               ├── DaemonStatusExchange.java
│           │   │               ├── DaemonStopExchange.java
│           │   │               ├── DaemonVersionExchange.java
│           │   │               ├── FsBlobExchange.java
│           │   │               ├── FsReadExchange.java
│           │   │               ├── FsScriptExchange.java
│           │   │               ├── FsWriteExchange.java
│           │   │               ├── HandshakeExchange.java
│           │   │               ├── SecretDecryptExchange.java
│           │   │               ├── SecretEncryptExchange.java
│           │   │               ├── ShellExecExchange.java
│           │   │               ├── ShellStartExchange.java
│           │   │               ├── ShellStopExchange.java
│           │   │               ├── SshLaunchExchange.java
│           │   │               ├── TerminalExternalLaunchExchange.java
│           │   │               ├── TerminalLaunchExchange.java
│           │   │               ├── TerminalPrepareExchange.java
│           │   │               ├── TerminalRegisterExchange.java
│           │   │               └── TerminalWaitExchange.java
│           │   └── module-info.java
│           └── resources/
│               └── META-INF/
│                   └── services/
│                       └── io.xpipe.core.ModuleLayerLoader
├── build.gradle
├── core/
│   ├── README.md
│   ├── build.gradle
│   ├── publish.gradle
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── io/
│       │   │   │   └── xpipe/
│       │   │   │       └── core/
│       │   │   │           ├── AesSecretValue.java
│       │   │   │           ├── CoreJacksonModule.java
│       │   │   │           ├── EncryptedSecretValue.java
│       │   │   │           ├── FailableBiFunction.java
│       │   │   │           ├── FailableConsumer.java
│       │   │   │           ├── FailableFunction.java
│       │   │   │           ├── FailableRunnable.java
│       │   │   │           ├── FailableSupplier.java
│       │   │   │           ├── FilePath.java
│       │   │   │           ├── InPlaceSecretValue.java
│       │   │   │           ├── JacksonMapper.java
│       │   │   │           ├── KeyValue.java
│       │   │   │           ├── ModuleLayerLoader.java
│       │   │   │           ├── OsType.java
│       │   │   │           ├── SecretValue.java
│       │   │   │           ├── StorePath.java
│       │   │   │           ├── StreamCharset.java
│       │   │   │           ├── UuidHelper.java
│       │   │   │           └── XPipeDaemonMode.java
│       │   │   └── module-info.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── services/
│       │               ├── com.fasterxml.jackson.databind.Module
│       │               └── io.xpipe.core.ModuleLayerLoader
│       └── test/
│           └── java/
│               ├── io/
│               │   └── xpipe/
│               │       └── core/
│               │           └── test/
│               │               └── StorePathTest.java
│               └── module-info.java
├── dist/
│   ├── base.gradle
│   ├── build.gradle
│   ├── changelog/
│   │   ├── 1.0.0.md
│   │   ├── 1.0.1.md
│   │   ├── 1.1.0.md
│   │   ├── 1.1.1.md
│   │   ├── 1.1.2.md
│   │   ├── 1.1.3.md
│   │   ├── 1.2.0.md
│   │   ├── 1.3.0.md
│   │   ├── 1.3.1.md
│   │   ├── 1.3.2.md
│   │   ├── 1.4.0.md
│   │   ├── 1.4.1.md
│   │   ├── 1.4.2.md
│   │   ├── 1.5.0.md
│   │   ├── 1.5.1.md
│   │   ├── 1.5.2.md
│   │   ├── 1.5.3.md
│   │   ├── 1.6.0.md
│   │   ├── 1.7.0.md
│   │   ├── 1.7.1.md
│   │   ├── 1.7.10.md
│   │   ├── 1.7.11.md
│   │   ├── 1.7.12.md
│   │   ├── 1.7.13.md
│   │   ├── 1.7.14.md
│   │   ├── 1.7.15.md
│   │   ├── 1.7.16.md
│   │   ├── 1.7.2.md
│   │   ├── 1.7.3.md
│   │   ├── 1.7.4.md
│   │   ├── 1.7.5.md
│   │   ├── 1.7.6.md
│   │   ├── 1.7.7.md
│   │   ├── 1.7.8.md
│   │   ├── 1.7.9.md
│   │   ├── 10.0.1_incremental.md
│   │   ├── 10.0.2_incremental.md
│   │   ├── 10.0.3_incremental.md
│   │   ├── 10.0.4_incremental.md
│   │   ├── 10.0.md
│   │   ├── 10.1.1.md
│   │   ├── 10.1.1_incremental.md
│   │   ├── 10.1.md
│   │   ├── 10.1_incremental.md
│   │   ├── 10.2.1.md
│   │   ├── 10.2.1_incremental.md
│   │   ├── 10.2.2.md
│   │   ├── 10.2.2_incremental.md
│   │   ├── 10.2.md
│   │   ├── 10.2_incremental.md
│   │   ├── 11.0.md
│   │   ├── 11.1.md
│   │   ├── 11.1_incremental.md
│   │   ├── 11.2.md
│   │   ├── 11.2_incremental.md
│   │   ├── 11.3.md
│   │   ├── 11.3_incremental.md
│   │   ├── 12.0.md
│   │   ├── 12.1.md
│   │   ├── 12.1_incremental.md
│   │   ├── 12.2.md
│   │   ├── 12.2_incremental.md
│   │   ├── 12.3.1.md
│   │   ├── 12.3.1_incremental.md
│   │   ├── 12.3.2.md
│   │   ├── 12.3.2_incremental.md
│   │   ├── 12.3.3.md
│   │   ├── 12.3.3_incremental.md
│   │   ├── 12.3.4.md
│   │   ├── 12.3.4_incremental.md
│   │   ├── 12.3.5_incremental.md
│   │   ├── 12.3.md
│   │   ├── 12.3_incremental.md
│   │   ├── 13.0.1.md
│   │   ├── 13.0.1_incremental.md
│   │   ├── 13.0.md
│   │   ├── 13.1.1.md
│   │   ├── 13.1.1_incremental.md
│   │   ├── 13.1.md
│   │   ├── 13.1_incremental.md
│   │   ├── 13.2.md
│   │   ├── 13.2_incremental.md
│   │   ├── 13.3.1.md
│   │   ├── 13.3.1_incremental.md
│   │   ├── 13.3.2.md
│   │   ├── 13.3.2_incremental.md
│   │   ├── 13.3.md
│   │   ├── 13.3_incremental.md
│   │   ├── 13.4.1.md
│   │   ├── 13.4.1_incremental.md
│   │   ├── 13.4.2.md
│   │   ├── 13.4.2_incremental.md
│   │   ├── 13.4.3.md
│   │   ├── 13.4.3_incremental.md
│   │   ├── 13.4.4.md
│   │   ├── 13.4.4_incremental.md
│   │   ├── 13.4.md
│   │   ├── 13.4_incremental.md
│   │   ├── 14.0.md
│   │   ├── 14.1.1.md
│   │   ├── 14.1.1_incremental.md
│   │   ├── 14.1.md
│   │   ├── 14.1_incremental.md
│   │   ├── 14.2.md
│   │   ├── 14.2_incremental.md
│   │   ├── 15.0.1.md
│   │   ├── 15.0.1_incremental.md
│   │   ├── 15.0.2.md
│   │   ├── 15.0.2_incremental.md
│   │   ├── 15.0.md
│   │   ├── 15.1.md
│   │   ├── 15.1_incremental.md
│   │   ├── 15.2.md
│   │   ├── 15.2_incremental.md
│   │   ├── 15.3.md
│   │   ├── 15.3_incremental.md
│   │   ├── 15.4.md
│   │   ├── 15.4_incremental.md
│   │   ├── 15.5.md
│   │   ├── 15.5_incremental.md
│   │   ├── 15.6.md
│   │   ├── 15.6_incremental.md
│   │   ├── 15.7.1.md
│   │   ├── 15.7.1_incremental.md
│   │   ├── 15.7.md
│   │   ├── 15.7_incremental.md
│   │   ├── 15.8.md
│   │   ├── 15.8_incremental.md
│   │   ├── 16.0.md
│   │   ├── 16.1.md
│   │   ├── 16.1_incremental.md
│   │   ├── 16.2.1.md
│   │   ├── 16.2.1_incremental.md
│   │   ├── 16.2.md
│   │   ├── 16.2_incremental.md
│   │   ├── 16.3.md
│   │   ├── 16.3_incremental.md
│   │   ├── 16.4.1.md
│   │   ├── 16.4.1_incremental.md
│   │   ├── 16.4.md
│   │   ├── 16.4_incremental.md
│   │   ├── 16.5.md
│   │   ├── 16.5_incremental.md
│   │   ├── 16.6.md
│   │   ├── 16.6_incremental.md
│   │   ├── 16.7.md
│   │   ├── 16.7_incremental.md
│   │   ├── 17.0.md
│   │   ├── 17.1.md
│   │   ├── 17.1_incremental.md
│   │   ├── 17.2.md
│   │   ├── 17.2_incremental.md
│   │   ├── 17.3.md
│   │   ├── 17.3_incremental.md
│   │   ├── 17.4.md
│   │   ├── 17.4_incremental.md
│   │   ├── 17.5.md
│   │   ├── 17.5_incremental.md
│   │   ├── 18.0.1.md
│   │   ├── 18.0.1_incremental.md
│   │   ├── 18.0.md
│   │   ├── 18.1.1.md
│   │   ├── 18.1.1_incremental.md
│   │   ├── 18.1.md
│   │   ├── 18.1_incremental.md
│   │   ├── 18.2.md
│   │   ├── 18.2_incremental.md
│   │   ├── 18.3.md
│   │   ├── 18.3_incremental.md
│   │   ├── 18.4.md
│   │   ├── 18.4_incremental.md
│   │   ├── 18.5.md
│   │   ├── 18.5_incremental.md
│   │   ├── 18.6.md
│   │   ├── 18.6_incremental.md
│   │   ├── 18.7.md
│   │   ├── 18.7_incremental.md
│   │   ├── 19.0.1.md
│   │   ├── 19.0.2_incremental.md
│   │   ├── 19.0.md
│   │   ├── 19.1_incremental.md
│   │   ├── 19.2_incremental.md
│   │   ├── 19.3.1_incremental.md
│   │   ├── 19.3_incremental.md
│   │   ├── 19.4_incremental.md
│   │   ├── 19.5_incremental.md
│   │   ├── 19.6_incremental.md
│   │   ├── 20.0.1.md
│   │   ├── 20.0.md
│   │   ├── 20.1.md
│   │   ├── 20.2.md
│   │   ├── 20.3.md
│   │   ├── 20.4.md
│   │   ├── 21.0.md
│   │   ├── 21.1.1.md
│   │   ├── 21.1.md
│   │   ├── 21.2.1.md
│   │   ├── 21.2.md
│   │   ├── 21.3.md
│   │   ├── 21.4.md
│   │   ├── 21.5.md
│   │   ├── 21.6.md
│   │   ├── 8.0-6.md
│   │   ├── 8.0.1.md
│   │   ├── 8.0.md
│   │   ├── 8.1.md
│   │   ├── 8.1_incremental.md
│   │   ├── 8.2.md
│   │   ├── 8.2_incremental.md
│   │   ├── 8.3.md
│   │   ├── 8.3_incremental.md
│   │   ├── 8.4.md
│   │   ├── 8.4_incremental.md
│   │   ├── 8.5.md
│   │   ├── 8.5_incremental.md
│   │   ├── 8.6.md
│   │   ├── 8.6_incremental.md
│   │   ├── 9.0.1.md
│   │   ├── 9.0.1_incremental.md
│   │   ├── 9.0.md
│   │   ├── 9.1.md
│   │   ├── 9.1_incremental.md
│   │   ├── 9.2.md
│   │   ├── 9.2_incremental.md
│   │   ├── 9.3.md
│   │   ├── 9.3_incremental.md
│   │   ├── 9.4.1.md
│   │   ├── 9.4.1_incremental.md
│   │   ├── 9.4.md
│   │   └── 9.4_incremental.md
│   ├── debug/
│   │   ├── debug_arguments.txt
│   │   ├── linux/
│   │   │   └── xpiped_debug.sh
│   │   ├── mac/
│   │   │   └── xpiped_debug.sh
│   │   └── windows/
│   │       └── xpiped_debug.bat
│   ├── fonts/
│   │   ├── allfonts.properties
│   │   └── logicalfonts.properties
│   ├── jpackage/
│   │   └── Info.plist
│   ├── jpackage.gradle
│   ├── licenses/
│   │   ├── antlr.license
│   │   ├── antlr.properties
│   │   ├── atlantafx.license
│   │   ├── atlantafx.properties
│   │   ├── bc-java.license
│   │   ├── bc-java.properties
│   │   ├── commons-io.license
│   │   ├── commons-io.properties
│   │   ├── commons-lang.license
│   │   ├── commons-lang.properties
│   │   ├── flexmark.license
│   │   ├── flexmark.properties
│   │   ├── fx-builders.license
│   │   ├── fx-builders.properties
│   │   ├── github-markdown-css.license
│   │   ├── github-markdown-css.properties
│   │   ├── graalvm.license
│   │   ├── graalvm.properties
│   │   ├── ikonli.license
│   │   ├── ikonli.properties
│   │   ├── inter.license
│   │   ├── inter.properties
│   │   ├── jackson.license
│   │   ├── jackson.properties
│   │   ├── java-annotations.license
│   │   ├── java-annotations.properties
│   │   ├── jna.license
│   │   ├── jna.properties
│   │   ├── json-schema-validator.license
│   │   ├── json-schema-validator.properties
│   │   ├── jsvg.license
│   │   ├── jsvg.properties
│   │   ├── lombok.license
│   │   ├── lombok.properties
│   │   ├── material2.license
│   │   ├── material2.properties
│   │   ├── materialdesign2.license
│   │   ├── materialdesign2.properties
│   │   ├── mcp-sdk.license
│   │   ├── mcp-sdk.properties
│   │   ├── musl.license
│   │   ├── musl.properties
│   │   ├── openjfx.license
│   │   ├── openjfx.properties
│   │   ├── picocli.license
│   │   ├── picocli.properties
│   │   ├── reactive-streams.license
│   │   ├── reactive-streams.properties
│   │   ├── reactor-core.license
│   │   ├── reactor-core.properties
│   │   ├── roboto.license
│   │   ├── roboto.properties
│   │   ├── sentry.license
│   │   ├── sentry.properties
│   │   ├── slf4j.license
│   │   ├── slf4j.properties
│   │   ├── stringtemplate.license
│   │   ├── stringtemplate.properties
│   │   ├── validatorfx.license
│   │   ├── validatorfx.properties
│   │   ├── vernacular-vnc.license
│   │   ├── vernacular-vnc.properties
│   │   ├── vscode-icons.license
│   │   ├── vscode-icons.properties
│   │   ├── zlib.license
│   │   └── zlib.properties
│   └── logo/
│       ├── Assets.car
│       ├── logo.icns
│       └── logo_composer.icon/
│           └── icon.json
├── ext/
│   ├── base/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   ├── io/
│   │           │   │   └── xpipe/
│   │           │   │       └── ext/
│   │           │   │           └── base/
│   │           │   │               ├── desktop/
│   │           │   │               │   ├── DesktopApplicationStore.java
│   │           │   │               │   ├── DesktopApplicationStoreProvider.java
│   │           │   │               │   └── DesktopBaseStore.java
│   │           │   │               ├── host/
│   │           │   │               │   ├── AbstractHostCreationActionProvider.java
│   │           │   │               │   ├── AbstractHostStore.java
│   │           │   │               │   ├── AbstractHostStoreProvider.java
│   │           │   │               │   ├── AbstractHostTransformStore.java
│   │           │   │               │   ├── HostAddressChoice.java
│   │           │   │               │   ├── HostAddressChoiceComp.java
│   │           │   │               │   ├── HostAddressGatewayStore.java
│   │           │   │               │   ├── HostAddressIdentityStore.java
│   │           │   │               │   ├── HostAddressStore.java
│   │           │   │               │   ├── HostAddressSwitchBranchProvider.java
│   │           │   │               │   ├── HostAddressSwitchStore.java
│   │           │   │               │   └── HostAddressTunnelStore.java
│   │           │   │               ├── identity/
│   │           │   │               │   ├── IdentityApplyDialog.java
│   │           │   │               │   ├── IdentityApplyHubLeafProvider.java
│   │           │   │               │   ├── IdentityChoiceBuilder.java
│   │           │   │               │   ├── IdentityMigrationDeserializer.java
│   │           │   │               │   ├── IdentitySelectComp.java
│   │           │   │               │   ├── IdentityStore.java
│   │           │   │               │   ├── IdentityStoreProvider.java
│   │           │   │               │   ├── IdentitySummary.java
│   │           │   │               │   ├── IdentitySwitchStore.java
│   │           │   │               │   ├── IdentityValue.java
│   │           │   │               │   ├── LocalIdentityConvertHubLeafProvider.java
│   │           │   │               │   ├── LocalIdentityStore.java
│   │           │   │               │   ├── LocalIdentityStoreProvider.java
│   │           │   │               │   ├── PasswordManagerIdentityStore.java
│   │           │   │               │   ├── PasswordManagerIdentityStoreProvider.java
│   │           │   │               │   ├── SyncedIdentityStore.java
│   │           │   │               │   ├── SyncedIdentityStoreProvider.java
│   │           │   │               │   ├── UsernameStrategy.java
│   │           │   │               │   └── ssh/
│   │           │   │               │       ├── CustomAgentStrategy.java
│   │           │   │               │       ├── CustomPkcs11LibraryStrategy.java
│   │           │   │               │       ├── GpgAgentStrategy.java
│   │           │   │               │       ├── InPlaceKeyStrategy.java
│   │           │   │               │       ├── KeyFileStrategy.java
│   │           │   │               │       ├── NoIdentityStrategy.java
│   │           │   │               │       ├── OpenSshAgentStrategy.java
│   │           │   │               │       ├── OtherExternalAgentStrategy.java
│   │           │   │               │       ├── PageantStrategy.java
│   │           │   │               │       ├── SshIdentityStateManager.java
│   │           │   │               │       ├── SshIdentityStrategy.java
│   │           │   │               │       ├── SshIdentityStrategyChoiceConfig.java
│   │           │   │               │       └── YubikeyPivStrategy.java
│   │           │   │               ├── script/
│   │           │   │               │   ├── PredefinedScriptStore.java
│   │           │   │               │   ├── RunBackgroundScriptActionProvider.java
│   │           │   │               │   ├── RunFileScriptMenuProvider.java
│   │           │   │               │   ├── RunHubBatchScriptActionProvider.java
│   │           │   │               │   ├── RunHubScriptActionProvider.java
│   │           │   │               │   ├── RunScriptActionProviderMenu.java
│   │           │   │               │   ├── RunTerminalScriptActionProvider.java
│   │           │   │               │   ├── ScriptCollectionSource.java
│   │           │   │               │   ├── ScriptCollectionSourceBrowseActionProvider.java
│   │           │   │               │   ├── ScriptCollectionSourceEntry.java
│   │           │   │               │   ├── ScriptCollectionSourceImportDialog.java
│   │           │   │               │   ├── ScriptCollectionSourceImportHubProvider.java
│   │           │   │               │   ├── ScriptCollectionSourceRefreshHubProvider.java
│   │           │   │               │   ├── ScriptCollectionSourceStore.java
│   │           │   │               │   ├── ScriptCollectionSourceStoreProvider.java
│   │           │   │               │   ├── ScriptDataStorageProvider.java
│   │           │   │               │   ├── ScriptDialects.java
│   │           │   │               │   ├── ScriptHierarchy.java
│   │           │   │               │   ├── ScriptQuickEditHubLeafProvider.java
│   │           │   │               │   ├── ScriptStore.java
│   │           │   │               │   ├── ScriptStoreMigrationDeserializer.java
│   │           │   │               │   ├── ScriptStoreProvider.java
│   │           │   │               │   ├── ScriptStoreSetup.java
│   │           │   │               │   ├── ScriptTextSource.java
│   │           │   │               │   └── ScriptUrlSourceRefreshHubProvider.java
│   │           │   │               ├── service/
│   │           │   │               │   ├── AbstractServiceGroupStore.java
│   │           │   │               │   ├── AbstractServiceGroupStoreProvider.java
│   │           │   │               │   ├── AbstractServiceStore.java
│   │           │   │               │   ├── AbstractServiceStoreProvider.java
│   │           │   │               │   ├── CustomServiceGroupStore.java
│   │           │   │               │   ├── CustomServiceGroupStoreProvider.java
│   │           │   │               │   ├── CustomServiceStore.java
│   │           │   │               │   ├── CustomServiceStoreProvider.java
│   │           │   │               │   ├── FixedServiceCreatorStore.java
│   │           │   │               │   ├── FixedServiceGroupStore.java
│   │           │   │               │   ├── FixedServiceGroupStoreProvider.java
│   │           │   │               │   ├── FixedServiceStore.java
│   │           │   │               │   ├── FixedServiceStoreProvider.java
│   │           │   │               │   ├── MappedServiceStore.java
│   │           │   │               │   ├── MappedServiceStoreProvider.java
│   │           │   │               │   ├── ServiceAddressRotation.java
│   │           │   │               │   ├── ServiceCopyAddressHubLeafProvider.java
│   │           │   │               │   ├── ServiceProtocolType.java
│   │           │   │               │   ├── ServiceProtocolTypeHelper.java
│   │           │   │               │   └── ServiceRefreshHubProvider.java
│   │           │   │               └── store/
│   │           │   │                   ├── PauseableStore.java
│   │           │   │                   ├── ShellStoreProvider.java
│   │           │   │                   ├── StartableStore.java
│   │           │   │                   ├── StoppableStore.java
│   │           │   │                   ├── StorePauseActionProvider.java
│   │           │   │                   ├── StoreRestartActionProvider.java
│   │           │   │                   ├── StoreStartActionProvider.java
│   │           │   │                   └── StoreStopActionProvider.java
│   │           │   └── module-info.java
│   │           └── resources/
│   │               └── io/
│   │                   └── xpipe/
│   │                       └── ext/
│   │                           └── base/
│   │                               └── resources/
│   │                                   ├── extension.properties
│   │                                   └── scripts/
│   │                                       ├── apt_upgrade.sh
│   │                                       ├── clink.bat
│   │                                       ├── crlf_to_lf.sh
│   │                                       ├── diff.sh
│   │                                       ├── git_config.sh
│   │                                       └── system_health.sh
│   ├── proc/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── module-info.java
│   ├── system/
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   ├── io/
│   │           │   │   └── xpipe/
│   │           │   │       └── ext/
│   │           │   │           └── system/
│   │           │   │               ├── incus/
│   │           │   │               │   ├── IncusCommandView.java
│   │           │   │               │   ├── IncusContainerActionProviderMenu.java
│   │           │   │               │   ├── IncusContainerConsoleActionProvider.java
│   │           │   │               │   ├── IncusContainerEditConfigActionProvider.java
│   │           │   │               │   ├── IncusContainerEditRunConfigActionProvider.java
│   │           │   │               │   ├── IncusContainerStore.java
│   │           │   │               │   ├── IncusContainerStoreProvider.java
│   │           │   │               │   ├── IncusInstallStore.java
│   │           │   │               │   ├── IncusInstallStoreProvider.java
│   │           │   │               │   └── IncusScanProvider.java
│   │           │   │               ├── lxd/
│   │           │   │               │   ├── LxdCmdStore.java
│   │           │   │               │   ├── LxdCmdStoreProvider.java
│   │           │   │               │   ├── LxdCommandView.java
│   │           │   │               │   ├── LxdContainerActionProviderMenu.java
│   │           │   │               │   ├── LxdContainerConsoleActionProvider.java
│   │           │   │               │   ├── LxdContainerEditConfigActionProvider.java
│   │           │   │               │   ├── LxdContainerEditRunConfigActionProvider.java
│   │           │   │               │   ├── LxdContainerStore.java
│   │           │   │               │   ├── LxdContainerStoreProvider.java
│   │           │   │               │   └── LxdScanProvider.java
│   │           │   │               └── podman/
│   │           │   │                   ├── PodmanCmdStore.java
│   │           │   │                   ├── PodmanCmdStoreProvider.java
│   │           │   │                   ├── PodmanCommandView.java
│   │           │   │                   ├── PodmanContainerActionProviderMenu.java
│   │           │   │                   ├── PodmanContainerAttachActionProvider.java
│   │           │   │                   ├── PodmanContainerInspectActionProvider.java
│   │           │   │                   ├── PodmanContainerLogsActionProvider.java
│   │           │   │                   ├── PodmanContainerStore.java
│   │           │   │                   ├── PodmanContainerStoreProvider.java
│   │           │   │                   └── PodmanScanProvider.java
│   │           │   └── module-info.java
│   │           └── resources/
│   │               └── io/
│   │                   └── xpipe/
│   │                       └── ext/
│   │                           └── system/
│   │                               └── resources/
│   │                                   └── extension.properties
│   └── uacc/
│       ├── build.gradle
│       └── src/
│           └── main/
│               └── java/
│                   └── module-info.java
├── get-xpipe.ps1
├── get-xpipe.sh
├── gradle/
│   ├── gradle_scripts/
│   │   ├── README.md
│   │   ├── atlantafx-base-2.0.2.jar
│   │   ├── dev_default.properties
│   │   ├── extension.gradle
│   │   ├── fx-builders-1.0.0-SNAPSHOT.jar
│   │   ├── java.gradle
│   │   ├── javafx.gradle
│   │   ├── jna.gradle
│   │   ├── junit.gradle
│   │   ├── local_junit_suite.gradle
│   │   ├── lombok.gradle
│   │   ├── modules.gradle
│   │   ├── publish-base.gradle
│   │   └── remote_junit_suite.gradle
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lang/
│   ├── README.md
│   ├── strings/
│   │   ├── fixed_en.properties
│   │   ├── translations_da.properties
│   │   ├── translations_de.properties
│   │   ├── translations_en.properties
│   │   ├── translations_es.properties
│   │   ├── translations_fr.properties
│   │   ├── translations_id.properties
│   │   ├── translations_it.properties
│   │   ├── translations_ja.properties
│   │   ├── translations_ko.properties
│   │   ├── translations_nl.properties
│   │   ├── translations_pl.properties
│   │   ├── translations_pt.properties
│   │   ├── translations_ru.properties
│   │   ├── translations_sv.properties
│   │   ├── translations_tr.properties
│   │   ├── translations_vi.properties
│   │   ├── translations_zh-Hans.properties
│   │   └── translations_zh-Hant.properties
│   └── texts/
│       ├── termiusSetup_da.md
│       ├── termiusSetup_de.md
│       ├── termiusSetup_en.md
│       ├── termiusSetup_es.md
│       ├── termiusSetup_fr.md
│       ├── termiusSetup_id.md
│       ├── termiusSetup_it.md
│       ├── termiusSetup_ja.md
│       ├── termiusSetup_ko.md
│       ├── termiusSetup_nl.md
│       ├── termiusSetup_pl.md
│       ├── termiusSetup_pt.md
│       ├── termiusSetup_ru.md
│       ├── termiusSetup_sv.md
│       ├── termiusSetup_tr.md
│       ├── termiusSetup_vi.md
│       ├── termiusSetup_zh-Hans.md
│       ├── termiusSetup_zh-Hant.md
│       ├── xshellSetup_da.md
│       ├── xshellSetup_de.md
│       ├── xshellSetup_en.md
│       ├── xshellSetup_es.md
│       ├── xshellSetup_fr.md
│       ├── xshellSetup_id.md
│       ├── xshellSetup_it.md
│       ├── xshellSetup_ja.md
│       ├── xshellSetup_ko.md
│       ├── xshellSetup_nl.md
│       ├── xshellSetup_pl.md
│       ├── xshellSetup_pt.md
│       ├── xshellSetup_ru.md
│       ├── xshellSetup_sv.md
│       ├── xshellSetup_tr.md
│       ├── xshellSetup_vi.md
│       ├── xshellSetup_zh-Hans.md
│       └── xshellSetup_zh-Hant.md
├── settings.gradle
└── version
Download .txt
Showing preview only (625K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7765 symbols across 965 files)

FILE: app/src/main/java/io/xpipe/app/Main.java
  class Main (line 7) | public class Main {
    method main (line 9) | static void main(String[] args) {

FILE: app/src/main/java/io/xpipe/app/action/AbstractAction.java
  class AbstractAction (line 21) | @SuperBuilder
    method expectPick (line 28) | public static synchronized void expectPick() {
    method cancelPick (line 57) | public static synchronized void cancelPick() {
    method reset (line 62) | public static void reset() {
    method executeSync (line 83) | public boolean executeSync() {
    method executeAsync (line 100) | public void executeAsync() {
    method executeSyncImpl (line 119) | public boolean executeSyncImpl(boolean confirm) {
    method getId (line 157) | public String getId() {
    method getDisplayName (line 161) | public String getDisplayName() {
    method getProvider (line 166) | public ActionProvider getProvider() {
    method getShortcutName (line 178) | public String getShortcutName() {
    method executeImpl (line 182) | public abstract void executeImpl() throws Exception;
    method beforeExecute (line 184) | protected void beforeExecute() throws Exception {}
    method isMutation (line 186) | public boolean isMutation() {
    method forceConfirmation (line 190) | public boolean forceConfirmation() {
    method getLicensedFeature (line 194) | public LicensedFeature getLicensedFeature() {
    method checkLicense (line 198) | protected void checkLicense() {
    method afterExecute (line 205) | protected void afterExecute() {}
    method toDisplayMap (line 207) | public abstract Map<String, String> toDisplayMap();

FILE: app/src/main/java/io/xpipe/app/action/ActionConfigComp.java
  class ActionConfigComp (line 20) | public class ActionConfigComp extends SimpleRegionBuilder {
    method ActionConfigComp (line 24) | public ActionConfigComp(Property<AbstractAction> action) {
    method createSimple (line 28) | @Override
    method createMultiChooser (line 39) | @SuppressWarnings("unchecked")
    method createChooser (line 65) | @SuppressWarnings("unchecked")
    method createTextArea (line 87) | private BaseRegionBuilder<?, ?> createTextArea() {

FILE: app/src/main/java/io/xpipe/app/action/ActionConfirmComp.java
  class ActionConfirmComp (line 26) | public class ActionConfirmComp extends SimpleRegionBuilder {
    method ActionConfirmComp (line 30) | public ActionConfirmComp(AbstractAction action) {
    method createSimple (line 34) | @Override
    method createList (line 45) | @SuppressWarnings("unchecked")
    method createTable (line 64) | private BaseRegionBuilder<?, ?> createTable() {

FILE: app/src/main/java/io/xpipe/app/action/ActionConfirmation.java
  class ActionConfirmation (line 12) | public class ActionConfirmation {
    method confirmAction (line 14) | public static boolean confirmAction(AbstractAction action) {
    method confirmAllModifications (line 27) | private static boolean confirmAllModifications(AbstractAction action) {
    method getContext (line 35) | private static List<DataStoreEntry> getContext(AbstractAction action) {

FILE: app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java
  class ActionJacksonMapper (line 18) | public class ActionJacksonMapper {
    method parse (line 20) | @SuppressWarnings("unchecked")
    method validateRef (line 83) | private static void validateRef(ActionProvider provider, String ref) {
    method write (line 117) | public static ObjectNode write(AbstractAction value) {

FILE: app/src/main/java/io/xpipe/app/action/ActionPickComp.java
  class ActionPickComp (line 10) | public class ActionPickComp extends ModalOverlayContentComp {
    method ActionPickComp (line 14) | public ActionPickComp(AbstractAction action) {
    method createSimple (line 18) | @Override

FILE: app/src/main/java/io/xpipe/app/action/ActionProvider.java
  type ActionProvider (line 9) | public interface ActionProvider {
    method initProviders (line 13) | static void initProviders() {
    method init (line 38) | default void init() {}
    method getId (line 40) | default String getId() {
    method getActionClass (line 44) | @SuppressWarnings("unchecked")
    class Loader (line 53) | class Loader implements ModuleLayerLoader {
      method init (line 55) | @Override

FILE: app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java
  class ActionShortcutComp (line 27) | public class ActionShortcutComp extends SimpleRegionBuilder {
    method ActionShortcutComp (line 32) | public ActionShortcutComp(Property<AbstractAction> action, Runnable on...
    method createSimple (line 37) | @Override
    method createUrlComp (line 53) | private BaseRegionBuilder<?, ?> createUrlComp() {
    method createDesktopComp (line 74) | private BaseRegionBuilder<?, ?> createDesktopComp() {
    method createApiComp (line 100) | private BaseRegionBuilder<?, ?> createApiComp() {
    method createMacroComp (line 120) | @SuppressWarnings("unused")

FILE: app/src/main/java/io/xpipe/app/action/ActionUrls.java
  class ActionUrls (line 17) | public class ActionUrls {
    method encodeValue (line 19) | private static String encodeValue(String value) {
    method nodeToString (line 23) | private static List<String> nodeToString(JsonNode node) {
    method toUrl (line 43) | @SneakyThrows
    method parse (line 68) | public static Optional<AbstractAction> parse(String queryString) throw...
    method splitQuery (line 119) | private static Map<String, List<String>> splitQuery(String query) {
    method splitQueryParameter (line 132) | private static AbstractMap.SimpleImmutableEntry<String, String> splitQ...

FILE: app/src/main/java/io/xpipe/app/action/LauncherUrlProvider.java
  type LauncherUrlProvider (line 5) | public interface LauncherUrlProvider extends ActionProvider {
    method getScheme (line 7) | String getScheme();
    method createAction (line 9) | AbstractAction createAction(URI uri) throws Exception;

FILE: app/src/main/java/io/xpipe/app/action/SerializableAction.java
  class SerializableAction (line 15) | @SuperBuilder
    method toString (line 18) | public String toString() {
    method toNode (line 22) | public ObjectNode toNode() {
    method toConfigNode (line 27) | public ObjectNode toConfigNode() {
    method withConfigString (line 34) | public Optional<? extends SerializableAction> withConfigString(String ...
    method toDisplayMap (line 45) | @Override

FILE: app/src/main/java/io/xpipe/app/action/StoreContextAction.java
  type StoreContextAction (line 7) | public interface StoreContextAction {
    method getStoreEntryContext (line 9) | List<DataStoreEntry> getStoreEntryContext();

FILE: app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java
  class XPipeUrlProvider (line 5) | public class XPipeUrlProvider implements LauncherUrlProvider {
    method getScheme (line 7) | @Override
    method createAction (line 12) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java
  class AppBeaconCache (line 13) | @Value
    method getShellSession (line 18) | public BeaconShellSession getShellSession(UUID uuid) throws BeaconClie...
    method getOrStart (line 29) | public BeaconShellSession getOrStart(DataStoreEntryRef<ShellStore> ref...

FILE: app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java
  class AppBeaconServer (line 27) | public class AppBeaconServer {
    method AppBeaconServer (line 47) | private AppBeaconServer(int port) {
    method setupPort (line 51) | public static void setupPort() {
    method init (line 56) | public static void init() {
    method reset (line 74) | public static void reset() {
    method get (line 89) | public static AppBeaconServer get() {
    method addSession (line 93) | public void addSession(BeaconSession session) {
    method stop (line 97) | private void stop() {
    method initAuthSecret (line 111) | private void initAuthSecret() throws IOException {
    method deleteAuthSecret (line 123) | private void deleteAuthSecret() {
    method start (line 131) | private void start() throws IOException {
    method handleCorsHeaders (line 172) | private boolean handleCorsHeaders(HttpExchange exchange) throws IOExce...
    method handleCatchAll (line 188) | private void handleCatchAll(HttpExchange exchange) throws IOException {

FILE: app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java
  class BeaconRequestHandler (line 21) | public class BeaconRequestHandler<T> implements HttpHandler {
    method BeaconRequestHandler (line 25) | public BeaconRequestHandler(BeaconInterface<T> beaconInterface) {
    method handle (line 29) | @Override
    method handleAuthenticatedRequest (line 70) | private void handleAuthenticatedRequest(HttpExchange exchange) {
    method writeError (line 171) | private void writeError(HttpExchange exchange, Object errorMessage, in...
    method createDefaultRequest (line 184) | @SneakyThrows
    method createRawDataRequest (line 195) | @SneakyThrows

FILE: app/src/main/java/io/xpipe/app/beacon/BeaconSession.java
  class BeaconSession (line 7) | @Value

FILE: app/src/main/java/io/xpipe/app/beacon/BeaconShellSession.java
  class BeaconShellSession (line 8) | @Value

FILE: app/src/main/java/io/xpipe/app/beacon/BlobManager.java
  class BlobManager (line 18) | public class BlobManager {
    method get (line 25) | public static BlobManager get() {
    method init (line 29) | public static void init() {
    method reset (line 43) | public static void reset() {
    method newBlobFile (line 51) | public Path newBlobFile() throws IOException {
    method store (line 57) | public void store(UUID uuid, byte[] blob) {
    method store (line 61) | public void store(UUID uuid, InputStream blob) throws IOException {
    method getBlob (line 69) | public InputStream getBlob(UUID uuid) throws Exception {

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ActionExchangeImpl.java
  class ActionExchangeImpl (line 11) | public class ActionExchangeImpl extends ActionExchange {
    method handle (line 13) | @Override
    method checkPermission (line 28) | private boolean checkPermission() {

FILE: app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java
  class AskpassExchangeImpl (line 20) | public class AskpassExchangeImpl extends AskpassExchange {
    method requiresCompletedStartup (line 22) | @Override
    method handle (line 27) | @Override
    method requiresEnabledApi (line 78) | @Override
    method focusTerminalIfNeeded (line 83) | private void focusTerminalIfNeeded(long pid) {

FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java
  class CategoryAddExchangeImpl (line 10) | public class CategoryAddExchangeImpl extends CategoryAddExchange {
    method handle (line 12) | @Override
    method getSynchronizationObject (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryInfoExchangeImpl.java
  class CategoryInfoExchangeImpl (line 13) | public class CategoryInfoExchangeImpl extends CategoryInfoExchange {
    method handle (line 15) | @Override
    method getSynchronizationObject (line 38) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java
  class CategoryQueryExchangeImpl (line 9) | public class CategoryQueryExchangeImpl extends CategoryQueryExchange {
    method handle (line 11) | @Override
    method getSynchronizationObject (line 19) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/CategoryRemoveExchangeImpl.java
  class CategoryRemoveExchangeImpl (line 13) | public class CategoryRemoveExchangeImpl extends CategoryRemoveExchange {
    method handle (line 15) | @Override
    method getSynchronizationObject (line 37) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java
  class ConnectionAddExchangeImpl (line 14) | public class ConnectionAddExchangeImpl extends ConnectionAddExchange {
    method handle (line 16) | @Override
    method getSynchronizationObject (line 75) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java
  class ConnectionInfoExchangeImpl (line 15) | public class ConnectionInfoExchangeImpl extends ConnectionInfoExchange {
    method handle (line 17) | @Override
    method getSynchronizationObject (line 59) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java
  class ConnectionQueryExchangeImpl (line 9) | public class ConnectionQueryExchangeImpl extends ConnectionQueryExchange {
    method handle (line 11) | @Override
    method getSynchronizationObject (line 20) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java
  class ConnectionRefreshExchangeImpl (line 10) | public class ConnectionRefreshExchangeImpl extends ConnectionRefreshExch...
    method handle (line 12) | @Override
    method getSynchronizationObject (line 25) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java
  class ConnectionRemoveExchangeImpl (line 13) | public class ConnectionRemoveExchangeImpl extends ConnectionRemoveExchan...
    method handle (line 15) | @Override
    method getSynchronizationObject (line 28) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonFocusExchangeImpl.java
  class DaemonFocusExchangeImpl (line 9) | public class DaemonFocusExchangeImpl extends DaemonFocusExchange {
    method handle (line 11) | @Override
    method requiresEnabledApi (line 28) | @Override
    method requiresCompletedStartup (line 33) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonModeExchangeImpl.java
  class DaemonModeExchangeImpl (line 9) | public class DaemonModeExchangeImpl extends DaemonModeExchange {
    method handle (line 10) | @Override
    method requiresEnabledApi (line 28) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java
  class DaemonOpenExchangeImpl (line 12) | public class DaemonOpenExchangeImpl extends DaemonOpenExchange {
    method requiresCompletedStartup (line 16) | @Override
    method handle (line 21) | @Override
    method requiresEnabledApi (line 45) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonStatusExchangeImpl.java
  class DaemonStatusExchangeImpl (line 8) | public class DaemonStatusExchangeImpl extends DaemonStatusExchange {
    method requiresCompletedStartup (line 10) | @Override
    method handle (line 15) | @Override
    method requiresEnabledApi (line 27) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonStopExchangeImpl.java
  class DaemonStopExchangeImpl (line 9) | public class DaemonStopExchangeImpl extends DaemonStopExchange {
    method requiresCompletedStartup (line 11) | @Override
    method handle (line 16) | @Override
    method requiresEnabledApi (line 25) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/DaemonVersionExchangeImpl.java
  class DaemonVersionExchangeImpl (line 10) | public class DaemonVersionExchangeImpl extends DaemonVersionExchange {
    method requiresCompletedStartup (line 12) | @Override
    method handle (line 17) | @Override
    method requiresEnabledApi (line 33) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java
  class FsBlobExchangeImpl (line 11) | public class FsBlobExchangeImpl extends FsBlobExchange {
    method handle (line 13) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java
  class FsReadExchangeImpl (line 17) | public class FsReadExchangeImpl extends FsReadExchange {
    method handle (line 19) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java
  class FsScriptExchangeImpl (line 13) | public class FsScriptExchangeImpl extends FsScriptExchange {
    method handle (line 15) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java
  class FsWriteExchangeImpl (line 11) | public class FsWriteExchangeImpl extends FsWriteExchange {
    method handle (line 13) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/HandshakeExchangeImpl.java
  class HandshakeExchangeImpl (line 15) | public class HandshakeExchangeImpl extends HandshakeExchange {
    method requiresCompletedStartup (line 17) | @Override
    method handle (line 22) | @Override
    method requiresEnabledApi (line 37) | @Override
    method checkAuth (line 42) | private boolean checkAuth(BeaconAuthMethod authMethod) {

FILE: app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java
  class SecretDecryptExchangeImpl (line 11) | public class SecretDecryptExchangeImpl extends SecretDecryptExchange {
    method handle (line 13) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java
  class SecretEncryptExchangeImpl (line 9) | public class SecretEncryptExchangeImpl extends SecretEncryptExchange {
    method handle (line 11) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ShellExecExchangeImpl.java
  class ShellExecExchangeImpl (line 11) | public class ShellExecExchangeImpl extends ShellExecExchange {
    method handle (line 13) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java
  class ShellStartExchangeImpl (line 14) | public class ShellStartExchangeImpl extends ShellStartExchange {
    method handle (line 16) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java
  class ShellStopExchangeImpl (line 9) | public class ShellStopExchangeImpl extends ShellStopExchange {
    method handle (line 11) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java
  class SshLaunchExchangeImpl (line 12) | public class SshLaunchExchangeImpl extends SshLaunchExchange {
    method handle (line 14) | @Override
    method requiresEnabledApi (line 39) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalExternalLaunchExchangeImpl.java
  class TerminalExternalLaunchExchangeImpl (line 18) | public class TerminalExternalLaunchExchangeImpl extends TerminalExternal...
    method handle (line 20) | @Override
    method requiresEnabledApi (line 47) | @Override
    method getSynchronizationObject (line 52) | @Override
    method checkPermission (line 57) | private boolean checkPermission() {

FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java
  class TerminalLaunchExchangeImpl (line 10) | public class TerminalLaunchExchangeImpl extends TerminalLaunchExchange {
    method handle (line 11) | @Override
    method requiresEnabledApi (line 17) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java
  class TerminalPrepareExchangeImpl (line 8) | public class TerminalPrepareExchangeImpl extends TerminalPrepareExchange {
    method handle (line 10) | @Override
    method requiresEnabledApi (line 21) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java
  class TerminalRegisterExchangeImpl (line 10) | public class TerminalRegisterExchangeImpl extends TerminalRegisterExchan...
    method handle (line 12) | @Override
    method requiresEnabledApi (line 19) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java
  class TerminalWaitExchangeImpl (line 9) | public class TerminalWaitExchangeImpl extends TerminalWaitExchange {
    method handle (line 11) | @Override
    method requiresEnabledApi (line 17) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/mcp/AppMcpServer.java
  class AppMcpServer (line 26) | @Value
    method get (line 36) | public static AppMcpServer get() {
    method init (line 40) | @SneakyThrows
    method reset (line 99) | public static void reset() {
    method createHttpHandler (line 104) | public HttpHandler createHttpHandler() {

FILE: app/src/main/java/io/xpipe/app/beacon/mcp/HttpStreamableServerTransportProvider.java
  class HttpStreamableServerTransportProvider (line 30) | public class HttpStreamableServerTransportProvider implements McpStreama...
    method HttpStreamableServerTransportProvider (line 57) | HttpStreamableServerTransportProvider(
    method protocolVersions (line 84) | public List<String> protocolVersions() {
    method setSessionFactory (line 89) | @Override
    method notifyClients (line 94) | @Override
    method closeGracefully (line 119) | @Override
    method doGet (line 146) | public void doGet(HttpExchange exchange) throws IOException {
    method sendError (line 231) | public void sendError(HttpExchange exchange, int code, String message)...
    method doPost (line 242) | public void doPost(HttpExchange exchange) throws IOException {
    method doOther (line 376) | public void doOther(HttpExchange exchange) throws IOException {
    method doDelete (line 380) | protected void doDelete(HttpExchange exchange) throws IOException {
    method sendEvent (line 430) | private void sendEvent(PrintWriter writer, String eventType, String da...
    class HttpServletStreamableMcpSessionTransport (line 443) | private class HttpServletStreamableMcpSessionTransport implements McpS...
      method HttpServletStreamableMcpSessionTransport (line 453) | HttpServletStreamableMcpSessionTransport(String sessionId, HttpExcha...
      method unmarshalFrom (line 460) | @Override
      method sendMessage (line 465) | @Override
      method close (line 497) | @Override
      method closeGracefully (line 518) | @Override
      method sendMessage (line 525) | @Override

FILE: app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java
  class McpSchemaFiles (line 10) | public class McpSchemaFiles {
    method load (line 12) | public static String load(String name) throws IOException {
    method loadTool (line 18) | public static McpSchema.Tool loadTool(String name) throws IOException {

FILE: app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java
  type McpToolHandler (line 19) | public interface McpToolHandler
    method of (line 22) | static McpToolHandler of(McpToolHandler t) {
    method apply (line 26) | @Override
    method handle (line 48) | McpSchema.CallToolResult handle(ToolRequest request) throws Exception;
    class ToolRequest (line 50) | class ToolRequest {
      method ToolRequest (line 55) | public ToolRequest(McpSyncServerExchange exchange, McpSchema.CallToo...
      method getRawRequest (line 60) | public McpSchema.CallToolRequest getRawRequest() {
      method getOptionalStringArgument (line 64) | public Optional<String> getOptionalStringArgument(String key) {
      method getStringArgument (line 77) | public String getStringArgument(String key) throws BeaconClientExcep...
      method getOptionalBooleanArgument (line 90) | public Optional<Boolean> getOptionalBooleanArgument(String key) {
      method getBooleanArgument (line 103) | public boolean getBooleanArgument(String key) throws BeaconClientExc...
      method getFilePath (line 116) | public FilePath getFilePath(String key) throws BeaconClientException {
      method getDataStoreRef (line 125) | public DataStoreEntryRef<?> getDataStoreRef(String name) throws Beac...
      method getShellStoreRef (line 140) | public DataStoreEntryRef<ShellStore> getShellStoreRef(String name, b...

FILE: app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java
  class McpTools (line 36) | public final class McpTools {
    method help (line 38) | public static McpServerFeatures.SyncToolSpecification help() throws IO...
    class ConnectionResource (line 77) | @Jacksonized
    method listSystems (line 92) | public static McpServerFeatures.SyncToolSpecification listSystems() th...
    method readFile (line 141) | public static McpServerFeatures.SyncToolSpecification readFile() throw...
    method listFiles (line 167) | public static McpServerFeatures.SyncToolSpecification listFiles() thro...
    method findFile (line 195) | public static McpServerFeatures.SyncToolSpecification findFile() throw...
    method getFileInfo (line 229) | public static McpServerFeatures.SyncToolSpecification getFileInfo() th...
    method createFile (line 270) | public static McpServerFeatures.SyncToolSpecification createFile() thr...
    method writeFile (line 302) | public static McpServerFeatures.SyncToolSpecification writeFile() thro...
    method createDirectory (line 326) | public static McpServerFeatures.SyncToolSpecification createDirectory(...
    method runCommand (line 350) | public static McpServerFeatures.SyncToolSpecification runCommand() thr...
    method runScript (line 370) | public static McpServerFeatures.SyncToolSpecification runScript() thro...
    method openTerminal (line 410) | public static McpServerFeatures.SyncToolSpecification openTerminal() t...
    method openTerminalInline (line 433) | public static McpServerFeatures.SyncToolSpecification openTerminalInli...
    method toggleState (line 461) | public static McpServerFeatures.SyncToolSpecification toggleState() th...

FILE: app/src/main/java/io/xpipe/app/browser/BrowserAbstractSessionModel.java
  class BrowserAbstractSessionModel (line 18) | @Getter
    method closeAsync (line 25) | public void closeAsync(BrowserSessionTab e) {
    method openSync (line 34) | public void openSync(T e, BooleanProperty externalBusy) throws Excepti...
    method closeSync (line 47) | public void closeSync(BrowserSessionTab e) {
    method getSessionEntriesSnapshot (line 54) | public List<T> getSessionEntriesSnapshot() {

FILE: app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java
  class BrowserFileChooserSessionComp (line 42) | public class BrowserFileChooserSessionComp extends ModalOverlayContentCo...
    method BrowserFileChooserSessionComp (line 47) | public BrowserFileChooserSessionComp(BrowserFileChooserSessionModel mo...
    method open (line 52) | public static void open(
    method setModalOverlay (line 90) | @Override
    method createSimple (line 98) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java
  class BrowserFileChooserSessionModel (line 27) | @Getter
    method BrowserFileChooserSessionModel (line 36) | public BrowserFileChooserSessionModel(boolean directory) {
    method finishChooser (line 51) | public void finishChooser() {
    method closeFileSystem (line 77) | public void closeFileSystem() {
    method openFileSystemAsync (line 88) | public void openFileSystemAsync(

FILE: app/src/main/java/io/xpipe/app/browser/BrowserFullSessionComp.java
  class BrowserFullSessionComp (line 40) | public class BrowserFullSessionComp extends SimpleRegionBuilder {
    method BrowserFullSessionComp (line 44) | public BrowserFullSessionComp(BrowserFullSessionModel model) {
    method createSimple (line 48) | @Override
    method createLeftSide (line 123) | private Region createLeftSide(ObservableSubscriber filterTrigger) {
    method createSplitStack (line 192) | private StackComp createSplitStack(SimpleDoubleProperty rightSplit, Br...

FILE: app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java
  class BrowserFullSessionModel (line 33) | @Getter
    method BrowserFullSessionModel (line 44) | public BrowserFullSessionModel() {
    method init (line 62) | public static void init() throws Exception {
    method createEffectiveRightTab (line 78) | private ObservableValue<BrowserSessionTab> createEffectiveRightTab() {
    method getAllTabs (line 111) | public Set<BrowserSessionTab> getAllTabs() {
    method splitTab (line 121) | public void splitTab(BrowserSessionTab tab, BrowserSessionTab split) {
    method unsplitTab (line 132) | public void unsplitTab(BrowserSessionTab tab) {
    method pinTab (line 140) | public void pinTab(BrowserSessionTab tab) {
    method unpinTab (line 156) | public void unpinTab() {
    method restoreState (line 162) | public void restoreState(BrowserHistorySavedState state) {
    method restoreStateAsync (line 173) | public void restoreStateAsync(BrowserHistorySavedState.Entry e, Boolea...
    method reset (line 180) | public void reset() {
    method openFileSystemAsync (line 206) | public void openFileSystemAsync(
    method openFileSystemSync (line 220) | public BrowserFileSystemTabModel openFileSystemSync(
    method closeSync (line 262) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/BrowserSessionTab.java
  class BrowserSessionTab (line 14) | @Getter
    method BrowserSessionTab (line 21) | public BrowserSessionTab(BrowserAbstractSessionModel<?> browserModel) {
    method comp (line 25) | public abstract BaseRegionBuilder<?, ?> comp();
    method canImmediatelyClose (line 27) | public abstract boolean canImmediatelyClose();
    method init (line 29) | public abstract void init() throws Exception;
    method close (line 31) | public abstract void close();
    method getName (line 33) | public abstract ObservableValue<String> getName();
    method getIcon (line 35) | public abstract String getIcon();
    method getColor (line 37) | public abstract DataStoreColor getColor();
    method isCloseable (line 39) | public boolean isCloseable() {

FILE: app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java
  class BrowserSessionTabsComp (line 43) | public class BrowserSessionTabsComp extends SimpleRegionBuilder {
    method BrowserSessionTabsComp (line 52) | public BrowserSessionTabsComp(
    method setupKeyEvents (line 60) | private static void setupKeyEvents(TabPane tabs) {
    method createSimple (line 108) | public Region createSimple() {
    method createTabPane (line 122) | private TabPane createTabPane() {
    method setupTabEntries (line 142) | private void setupTabEntries(TabPane tabs) {
    method setupCustomStyle (line 245) | private void setupCustomStyle(TabPane tabs) {
    method createContextMenu (line 298) | private ContextMenu createContextMenu(TabPane tabs, Tab tab, BrowserSe...
    method createTab (line 407) | private Tab createTab(TabPane tabs, BrowserSessionTab tabModel) {

FILE: app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java
  class BrowserStoreSessionTab (line 14) | @Getter
    method BrowserStoreSessionTab (line 20) | public BrowserStoreSessionTab(BrowserAbstractSessionModel<?> browserMo...
    method comp (line 26) | public abstract BaseRegionBuilder<?, ?> comp();
    method canImmediatelyClose (line 28) | public abstract boolean canImmediatelyClose();
    method init (line 30) | public abstract void init() throws Exception;
    method close (line 32) | public abstract void close();
    method getName (line 34) | @Override
    method getIcon (line 39) | @Override
    method getColor (line 44) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java
  class BrowserAction (line 19) | @SuperBuilder
    method beforeExecute (line 31) | @Override
    method afterExecute (line 65) | @Override
    method validateAutomatedAction (line 70) | private void validateAutomatedAction() throws Exception {
    method getTargetDirectory (line 87) | private FilePath getTargetDirectory(BrowserFileSystemTabModel model) t...
    method getEntries (line 101) | public List<BrowserEntry> getEntries() {
    class BrowserActionBuilder (line 128) | public abstract static class BrowserActionBuilder<C extends BrowserAct...
      method initEntries (line 131) | public void initEntries(BrowserFileSystemTabModel model, List<Browse...
      method initFiles (line 140) | public void initFiles(BrowserFileSystemTabModel model, List<FilePath...

FILE: app/src/main/java/io/xpipe/app/browser/action/BrowserActionProvider.java
  type BrowserActionProvider (line 9) | public interface BrowserActionProvider extends ActionProvider {
    method isApplicable (line 11) | default boolean isApplicable(BrowserFileSystemTabModel model, List<Bro...

FILE: app/src/main/java/io/xpipe/app/browser/action/BrowserActionProviders.java
  class BrowserActionProviders (line 5) | public class BrowserActionProviders {
    method forClass (line 7) | public static BrowserActionProvider forClass(Class<? extends BrowserAc...

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/ApplyFileEditActionProvider.java
  class ApplyFileEditActionProvider (line 16) | public class ApplyFileEditActionProvider implements ActionProvider {
    method getId (line 18) | @Override
    class Action (line 23) | @Jacksonized
      method executeImpl (line 36) | @Override
      method isMutation (line 49) | @Override
      method toDisplayMap (line 54) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/BrowseInNativeManagerActionProvider.java
  class BrowseInNativeManagerActionProvider (line 15) | public class BrowseInNativeManagerActionProvider implements BrowserActio...
    method isApplicable (line 17) | @Override
    method getId (line 30) | @Override
    class Action (line 35) | @Jacksonized
      method executeImpl (line 39) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/ChgrpActionProvider.java
  class ChgrpActionProvider (line 14) | public class ChgrpActionProvider implements BrowserActionProvider {
    method isApplicable (line 16) | @Override
    method getId (line 21) | @Override
    class Action (line 26) | @Jacksonized
      method executeImpl (line 35) | @Override
      method isMutation (line 43) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/ChmodActionProvider.java
  class ChmodActionProvider (line 14) | public class ChmodActionProvider implements BrowserActionProvider {
    method isApplicable (line 16) | @Override
    method getId (line 21) | @Override
    class Action (line 26) | @Jacksonized
      method executeImpl (line 35) | @Override
      method isMutation (line 43) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/ChownActionProvider.java
  class ChownActionProvider (line 14) | public class ChownActionProvider implements BrowserActionProvider {
    method isApplicable (line 16) | @Override
    method getId (line 21) | @Override
    class Action (line 26) | @Jacksonized
      method executeImpl (line 35) | @Override
      method isMutation (line 43) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/ComputeDirectorySizesActionProvider.java
  class ComputeDirectorySizesActionProvider (line 14) | public class ComputeDirectorySizesActionProvider implements BrowserActio...
    method getId (line 16) | @Override
    method isApplicable (line 21) | @Override
    class Action (line 26) | @Jacksonized
      method executeImpl (line 30) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/DeleteActionProvider.java
  class DeleteActionProvider (line 10) | public class DeleteActionProvider implements BrowserActionProvider {
    method getId (line 12) | @Override
    class Action (line 17) | @Jacksonized
      method executeImpl (line 21) | @Override
      method isMutation (line 29) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/MoveFileActionProvider.java
  class MoveFileActionProvider (line 11) | public class MoveFileActionProvider implements BrowserActionProvider {
    method getId (line 13) | @Override
    class Action (line 18) | @Jacksonized
      method executeImpl (line 25) | @Override
      method isMutation (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/NewDirectoryActionProvider.java
  class NewDirectoryActionProvider (line 12) | public class NewDirectoryActionProvider implements BrowserActionProvider {
    method getId (line 14) | @Override
    class Action (line 19) | @Jacksonized
      method executeImpl (line 26) | @Override
      method isMutation (line 39) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/NewFileActionProvider.java
  class NewFileActionProvider (line 12) | public class NewFileActionProvider implements BrowserActionProvider {
    method getId (line 14) | @Override
    class Action (line 19) | @Jacksonized
      method executeImpl (line 26) | @Override
      method isMutation (line 39) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/NewLinkActionProvider.java
  class NewLinkActionProvider (line 13) | public class NewLinkActionProvider implements BrowserActionProvider {
    method getId (line 15) | @Override
    class Action (line 20) | @Jacksonized
      method executeImpl (line 30) | @Override
      method isMutation (line 43) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/OpenDirectoryActionProvider.java
  class OpenDirectoryActionProvider (line 14) | public class OpenDirectoryActionProvider implements BrowserActionProvider {
    method getId (line 16) | @Override
    method isApplicable (line 21) | @Override
    class Action (line 27) | @Jacksonized
      method executeImpl (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileDefaultActionProvider.java
  class OpenFileDefaultActionProvider (line 15) | public class OpenFileDefaultActionProvider implements BrowserActionProvi...
    method getId (line 17) | @Override
    method isApplicable (line 22) | @Override
    class Action (line 28) | @Jacksonized
      method executeImpl (line 32) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeDetailsActionProvider.java
  class OpenFileNativeDetailsActionProvider (line 18) | public class OpenFileNativeDetailsActionProvider implements BrowserActio...
    method getId (line 20) | @Override
    method isApplicable (line 25) | @Override
    class Action (line 35) | @Jacksonized
      method executeImpl (line 39) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeManagerActionProvider.java
  class OpenFileNativeManagerActionProvider (line 15) | public class OpenFileNativeManagerActionProvider implements BrowserActio...
    method getId (line 17) | @Override
    method isApplicable (line 22) | @Override
    class Action (line 32) | @Jacksonized
      method executeImpl (line 36) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java
  class OpenFileWithActionProvider (line 16) | public class OpenFileWithActionProvider implements BrowserActionProvider {
    method getId (line 18) | @Override
    method isApplicable (line 23) | @Override
    class Action (line 30) | @Jacksonized
      method executeImpl (line 34) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBackgroundActionProvider.java
  class RunCommandInBackgroundActionProvider (line 19) | public class RunCommandInBackgroundActionProvider implements BrowserActi...
    method getId (line 21) | @Override
    method isApplicable (line 26) | @Override
    class Action (line 31) | @Jacksonized
      method executeImpl (line 38) | @Override
      method isMutation (line 63) | @Override
      method toDisplayMap (line 68) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBrowserActionProvider.java
  class RunCommandInBrowserActionProvider (line 17) | public class RunCommandInBrowserActionProvider implements BrowserActionP...
    method getId (line 19) | @Override
    method isApplicable (line 24) | @Override
    class Action (line 29) | @Jacksonized
      method executeImpl (line 36) | @Override
      method isMutation (line 47) | @Override
      method toDisplayMap (line 52) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInTerminalActionProvider.java
  class RunCommandInTerminalActionProvider (line 16) | public class RunCommandInTerminalActionProvider implements BrowserAction...
    method getId (line 18) | @Override
    method isApplicable (line 23) | @Override
    class Action (line 28) | @Jacksonized
      method executeImpl (line 37) | @Override
      method isMutation (line 51) | @Override
      method toDisplayMap (line 56) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/action/impl/TransferFilesActionProvider.java
  class TransferFilesActionProvider (line 21) | public class TransferFilesActionProvider implements ActionProvider {
    method getId (line 23) | @Override
    class Action (line 28) | @Jacksonized
      method executeImpl (line 40) | @Override
      method isMutation (line 45) | @Override
      method forceConfirmation (line 50) | @Override
      method toDisplayMap (line 55) | @Override
      method getStoreEntryContext (line 70) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java
  class BrowserBreadcrumbBar (line 29) | public class BrowserBreadcrumbBar extends SimpleRegionBuilder {
    method BrowserBreadcrumbBar (line 34) | public BrowserBreadcrumbBar(BrowserFileSystemTabModel model) {
    method createSimple (line 38) | @Override
    method onDragEntered (line 55) | private void onDragEntered(Button button, FilePath path) {
    method onDragOver (line 72) | private void onDragOver(DragEvent event) {
    method onDragExited (line 77) | private void onDragExited(Button button) {
    method createBreadcrumbs (line 83) | private Region createBreadcrumbs(
    method createBreadcrumbHierarchy (line 140) | private List<FilePath> createBreadcrumbHierarchy(FilePath filePath) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserClipboard.java
  class BrowserClipboard (line 27) | public class BrowserClipboard {
    method accept (line 35) | @Override
    method startDrag (line 69) | @SneakyThrows
    method startCopy (line 83) | @SneakyThrows
    method retrieveCopy (line 94) | public static Instance retrieveCopy() {
    method retrieveDrag (line 98) | public static Instance retrieveDrag(Dragboard dragboard) {
    class Instance (line 117) | @Value
      method toClipboardString (line 124) | public String toClipboardString() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListComp.java
  class BrowserConnectionListComp (line 21) | public final class BrowserConnectionListComp extends SimpleRegionBuilder {
    method BrowserConnectionListComp (line 30) | public BrowserConnectionListComp(
    method createSimple (line 43) | @Override
    method filter (line 93) | private boolean filter(StoreEntryWrapper w) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListFilterComp.java
  class BrowserConnectionListFilterComp (line 21) | @Getter
    method createSimple (line 29) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserContextMenu.java
  class BrowserContextMenu (line 17) | public final class BrowserContextMenu extends ContextMenu {
    method BrowserContextMenu (line 23) | public BrowserContextMenu(BrowserFileSystemTabModel model, BrowserEntr...
    method createMenu (line 30) | private void createMenu() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserDialogs.java
  class BrowserDialogs (line 11) | public class BrowserDialogs {
    method showFileConflictDialog (line 13) | public static FileConflictChoice showFileConflictDialog(FilePath file,...
    type FileConflictChoice (line 38) | public enum FileConflictChoice {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java
  class BrowserEntry (line 10) | @Getter
    method BrowserEntry (line 18) | public BrowserEntry(FileEntry rawFileEntry, BrowserFileListModel model) {
    method fileType (line 25) | private static BrowserIconFileType fileType(FileEntry rawFileEntry) {
    method directoryType (line 44) | private static BrowserIconDirectoryType directoryType(FileEntry rawFil...
    method getIcon (line 63) | public String getIcon() {
    method getFileName (line 75) | public String getFileName() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileDuplicates.java
  class BrowserFileDuplicates (line 8) | public class BrowserFileDuplicates {
    method renameFileDuplicate (line 10) | public static FilePath renameFileDuplicate(FileSystem fileSystem, File...
    method renameFile (line 21) | private static FilePath renameFile(FilePath target, boolean dir) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java
  type BrowserFileInput (line 14) | public interface BrowserFileInput {
    method openFileInput (line 16) | static BrowserFileInput openFileInput(BrowserFileSystemTabModel model,...
    method requiresSudo (line 39) | private static boolean requiresSudo(BrowserFileSystemTabModel model, F...
    method createFileInputImpl (line 73) | private static BrowserFileInput createFileInputImpl(
    method none (line 109) | static BrowserFileInput none() {
    method of (line 122) | static BrowserFileInput of(InputStream in) {
    method open (line 134) | InputStream open() throws Exception;
    method onFinish (line 136) | void onFinish() throws Exception;

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java
  class BrowserFileListComp (line 40) | public final class BrowserFileListComp extends SimpleRegionBuilder {
    method BrowserFileListComp (line 52) | public BrowserFileListComp(BrowserFileListModel fileList) {
    method prepareTableScrollFix (line 56) | private static void prepareTableScrollFix(TableView<BrowserEntry> tabl...
    method createSimple (line 68) | @Override
    method createTable (line 73) | @SuppressWarnings("unchecked")
    method prepareColumnVisibility (line 195) | private void prepareColumnVisibility(
    method getFilenameWidth (line 219) | private double getFilenameWidth(TableView<?> tableView) {
    method formatOwner (line 229) | @SneakyThrows
    method prepareTypedSelectionModel (line 272) | private void prepareTypedSelectionModel(TableView<BrowserEntry> table) {
    method updateTypedSelection (line 296) | private void updateTypedSelection(
    method prepareTableSelectionModel (line 343) | private void prepareTableSelectionModel(TableView<BrowserEntry> table) {
    method prepareTableShortcuts (line 398) | private void prepareTableShortcuts(TableView<BrowserEntry> table) {
    method prepareTableEntries (line 433) | private void prepareTableEntries(TableView<BrowserEntry> table) {
    method prepareTableChanges (line 544) | private void prepareTableChanges(
    method borderScroll (line 655) | private void borderScroll(TableView<?> tableView, DragEvent event) {
    class FileSizeCell (line 685) | private static class FileSizeCell extends TableCell<BrowserEntry, Stri...
      method updateItem (line 687) | @Override
    class FileModeCell (line 707) | private static class FileModeCell extends TableCell<BrowserEntry, Stri...
      method updateItem (line 709) | @Override
    class FileOwnerCell (line 720) | private static class FileOwnerCell extends TableCell<BrowserEntry, Str...
      method FileOwnerCell (line 722) | public FileOwnerCell() {
      method updateItem (line 726) | @Override
    class FileTimeCell (line 737) | private static class FileTimeCell extends TableCell<BrowserEntry, Inst...
      method updateItem (line 739) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java
  class BrowserFileListCompEntry (line 27) | @Getter
    method BrowserFileListCompEntry (line 38) | public BrowserFileListCompEntry(
    method onMouseClick (line 46) | public void onMouseClick(MouseEvent t) {
    method showContextMenu (line 101) | private boolean showContextMenu(MouseEvent event) {
    method onMouseShiftClick (line 120) | public void onMouseShiftClick(MouseEvent t) {
    method acceptsDrop (line 150) | private boolean acceptsDrop(DragEvent event) {
    method onDragDrop (line 204) | public void onDragDrop(DragEvent event) {
    method onDragExited (line 257) | public void onDragExited(DragEvent event) {
    method startDrag (line 267) | public void startDrag(MouseEvent event) {
    method onDragDone (line 293) | public void onDragDone(DragEvent event) {
    method onDragEntered (line 300) | public void onDragEntered(DragEvent event) {
    method onDragOver (line 332) | public void onDragOver(DragEvent event) {
    method onMouseDragEntered (line 342) | @SuppressWarnings("unchecked")

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileListFilterComp.java
  class BrowserFileListFilterComp (line 21) | public class BrowserFileListFilterComp extends RegionStructureBuilder<HB...
    method BrowserFileListFilterComp (line 26) | public BrowserFileListFilterComp(BrowserFileSystemTabModel model, Prop...
    method createBase (line 31) | @Override
    method get (line 125) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java
  class BrowserFileListModel (line 21) | @Getter
    method BrowserFileListModel (line 38) | public BrowserFileListModel(BrowserFileSystemTabModel fileSystemModel) {
    method setAll (line 46) | public void setAll(Stream<FileEntry> newFiles) {
    method updateEntry (line 56) | public void updateEntry(FilePath p, FileEntry n) {
    method setComparator (line 75) | public void setComparator(Comparator<BrowserEntry> comparator) {
    method refreshShown (line 80) | void refreshShown() {
    method order (line 100) | public Comparator<BrowserEntry> order() {
    method rename (line 109) | public BrowserEntry rename(BrowserEntry old, String newName) {
    method onDoubleClick (line 163) | public void onDoubleClick(BrowserEntry entry) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java
  class BrowserFileListNameCell (line 35) | class BrowserFileListNameCell extends TableCell<BrowserEntry, String> {
    method BrowserFileListNameCell (line 45) | public BrowserFileListNameCell(
    method createQuickAccessButton (line 80) | private Region createQuickAccessButton() {
    method setupShortcuts (line 103) | private void setupShortcuts(TableView<BrowserEntry> tableView, ButtonB...
    method setupRename (line 142) | private void setupRename(BrowserFileListModel fileList, TextField text...
    method updateItem (line 197) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileOpener.java
  class BrowserFileOpener (line 16) | public class BrowserFileOpener {
    method calculateKey (line 18) | @SneakyThrows
    method openWithAnyApplication (line 25) | public static void openWithAnyApplication(BrowserFileSystemTabModel mo...
    method openInDefaultApplication (line 44) | public static void openInDefaultApplication(BrowserFileSystemTabModel ...
    method openInTextEditor (line 63) | public static void openInTextEditor(BrowserFileSystemTabModel model, F...

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java
  type BrowserFileOutput (line 19) | public interface BrowserFileOutput {
    method openFileOutput (line 21) | static BrowserFileOutput openFileOutput(BrowserFileSystemTabModel mode...
    method requiresSudo (line 45) | private static boolean requiresSudo(BrowserFileSystemTabModel model, F...
    method createFileOutputImpl (line 79) | private static BrowserFileOutput createFileOutputImpl(
    method none (line 149) | static BrowserFileOutput none() {
    method target (line 175) | Optional<DataStoreEntry> target();
    method hasOutput (line 177) | boolean hasOutput();
    method open (line 179) | OutputStream open() throws Exception;
    method beforeTransfer (line 181) | void beforeTransfer() throws Exception;
    method onFinish (line 183) | void onFinish() throws Exception;

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileOverviewComp.java
  class BrowserFileOverviewComp (line 22) | @Value
    method createSimple (line 30) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileSelectionListComp.java
  class BrowserFileSelectionListComp (line 31) | @Value
    method BrowserFileSelectionListComp (line 39) | public BrowserFileSelectionListComp(ObservableList<BrowserEntry> list) {
    method snapshot (line 43) | public static Image snapshot(ObservableList<BrowserEntry> list) {
    method createSimple (line 53) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java
  class BrowserFileSystemHelper (line 13) | public class BrowserFileSystemHelper {
    method adjustPath (line 15) | public static String adjustPath(BrowserFileSystemTabModel model, Strin...
    method evaluatePath (line 45) | public static String evaluatePath(BrowserFileSystemTabModel model, Str...
    method resolveDirectoryPath (line 67) | public static FilePath resolveDirectoryPath(BrowserFileSystemTabModel ...
    method validateDirectoryPath (line 97) | public static void validateDirectoryPath(FileSystem fs, FilePath path,...
    method getRemoteWrapper (line 115) | public static FileEntry getRemoteWrapper(FileSystem fileSystem, FilePa...
    method delete (line 125) | public static void delete(List<FileEntry> files) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java
  class BrowserFileSystemHistory (line 14) | public final class BrowserFileSystemHistory {
    method getForwardHistory (line 23) | public List<FilePath> getForwardHistory(int max) {
    method getBackwardHistory (line 31) | public List<FilePath> getBackwardHistory(int max) {
    method getCurrent (line 39) | public FilePath getCurrent() {
    method updateCurrent (line 43) | public void updateCurrent(FilePath s) {
    method back (line 61) | public FilePath back(int i) {
    method forth (line 69) | public FilePath forth(int i) {
    method canGoBackProperty (line 77) | public BooleanBinding canGoBackProperty() {
    method canGoForthProperty (line 81) | public BooleanBinding canGoForthProperty() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java
  class BrowserFileSystemSavedState (line 35) | @AllArgsConstructor
    method BrowserFileSystemSavedState (line 51) | public BrowserFileSystemSavedState(FilePath lastDirectory, @NonNull Ob...
    method BrowserFileSystemSavedState (line 56) | public BrowserFileSystemSavedState() {
    method loadForStore (line 61) | static BrowserFileSystemSavedState loadForStore(BrowserFileSystemTabMo...
    method save (line 70) | public synchronized void save() {
    method cd (line 78) | public void cd(FilePath dir) {
    method updateRecent (line 103) | private synchronized void updateRecent(FilePath dir) {
    class Serializer (line 122) | public static class Serializer extends StdSerializer<BrowserFileSystem...
      method Serializer (line 124) | protected Serializer() {
      method serialize (line 128) | @Override
    class Deserializer (line 137) | public static class Deserializer extends StdDeserializer<BrowserFileSy...
      method Deserializer (line 139) | protected Deserializer() {
      method distinctBy (line 143) | private static <T> Predicate<T> distinctBy(Function<? super T, ?> f) {
      method deserialize (line 148) | @Override
    class RecentEntry (line 168) | @Value

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java
  class BrowserFileSystemTabComp (line 37) | public class BrowserFileSystemTabComp extends SimpleRegionBuilder {
    method BrowserFileSystemTabComp (line 42) | public BrowserFileSystemTabComp(BrowserFileSystemTabModel model, boole...
    method createSimple (line 47) | @Override
    method createContent (line 52) | private Region createContent() {
    method squaredSize (line 200) | private void squaredSize(Region ref, Region toResize, boolean width) {
    method createFileListContent (line 211) | private Region createFileListContent() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java
  class BrowserFileSystemTabModel (line 44) | @Getter
    method BrowserFileSystemTabModel (line 70) | public BrowserFileSystemTabModel(
    method getName (line 79) | @Override
    method updateProgress (line 88) | public void updateProgress(BrowserTransferProgress n) {
    method getProgress (line 133) | public ObservableValue<BrowserTransferProgress> getProgress() {
    method findFile (line 137) | public Optional<FileEntry> findFile(FilePath path) {
    method comp (line 145) | @Override
    method canImmediatelyClose (line 150) | @Override
    method init (line 160) | @Override
    method close (line 195) | @Override
    method startIfNeeded (line 213) | public void startIfNeeded() throws Exception {
    method killTransfer (line 217) | public void killTransfer() {
    method refreshSync (line 221) | public void refreshSync() {
    method refreshBrowserEntriesSync (line 225) | public void refreshBrowserEntriesSync(List<BrowserEntry> entries) {
    method refreshFileEntriesSync (line 230) | public void refreshFileEntriesSync(List<FileEntry> entries) {
    method getCurrentParentDirectory (line 268) | public FileEntry getCurrentParentDirectory() {
    method getCurrentDirectory (line 281) | public FileEntry getCurrentDirectory() {
    method cdAsync (line 289) | public void cdAsync(FilePath path) {
    method cdAsync (line 293) | public void cdAsync(String path) {
    method cdSync (line 301) | public void cdSync(String path) {
    method shouldLaunchSplitTerminal (line 305) | private boolean shouldLaunchSplitTerminal() {
    method cdSyncOrRetry (line 339) | public Optional<String> cdSyncOrRetry(String path, boolean customInput) {
    method handleUncPath (line 460) | private boolean handleUncPath(String path) {
    method cdSyncWithoutCheck (line 480) | private void cdSyncWithoutCheck(FilePath path) {
    method loadFilesSync (line 492) | private boolean loadFilesSync(FilePath dir) {
    method dropLocalFilesIntoAsync (line 510) | public void dropLocalFilesIntoAsync(FileEntry entry, List<Path> files) {
    method dropFilesIntoAsync (line 528) | public void dropFilesIntoAsync(FileEntry target, List<FileEntry> files...
    method duplicateFile (line 549) | public void duplicateFile(FileEntry entry) {
    method initWithGivenDirectory (line 563) | public void initWithGivenDirectory(FilePath dir) {
    method initWithDefaultDirectory (line 567) | public void initWithDefaultDirectory() {
    method openTerminalAsync (line 572) | public void openTerminalAsync(
    method openTerminalSync (line 581) | public void openTerminalSync(String name, FilePath directory, ProcessC...
    method backSync (line 609) | public void backSync(int i) {
    method forthSync (line 616) | public void forthSync(int i) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferMode.java
  type BrowserFileTransferMode (line 3) | public enum BrowserFileTransferMode {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java
  class BrowserFileTransferOperation (line 27) | public class BrowserFileTransferOperation {
    method BrowserFileTransferOperation (line 43) | public BrowserFileTransferOperation(
    method ofLocal (line 58) | public static BrowserFileTransferOperation ofLocal(
    method reinitFileSystemsIfNeeded (line 82) | private void reinitFileSystemsIfNeeded() throws Exception {
    method updateProgress (line 87) | private void updateProgress(BrowserTransferProgress progress) {
    method handleChoice (line 91) | private BrowserDialogs.FileConflictChoice handleChoice(FileSystem file...
    method cancelled (line 140) | private boolean cancelled() {
    method isMove (line 144) | public boolean isMove() {
    method execute (line 155) | public void execute() throws Exception {
    method handleSingleOnSameFileSystem (line 208) | private void handleSingleOnSameFileSystem(FileEntry source) throws Exc...
    method handleSingleAcrossFileSystems (line 251) | private void handleSingleAcrossFileSystems(FileEntry source) throws Ex...
    method transferInline (line 362) | private boolean transferInline(FilePath sourceFile, FileSystem sourceF...
    method transfer (line 398) | private void transfer(
    method deleteSingle (line 503) | private void deleteSingle(FileEntry source) throws Exception {
    method transferFile (line 507) | private void transferFile(
    method checkTransferValidity (line 586) | private boolean checkTransferValidity() {
    method killStreams (line 597) | private void killStreams(Thread thread, AtomicLong transferred, boolea...

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserGreetingComp.java
  class BrowserGreetingComp (line 16) | public class BrowserGreetingComp extends SimpleRegionBuilder {
    method createSimple (line 18) | @Override
    method getText (line 31) | private String getText() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedState.java
  type BrowserHistorySavedState (line 14) | public interface BrowserHistorySavedState {
    method add (line 16) | void add(Entry entry);
    method save (line 18) | void save();
    method getEntries (line 20) | ObservableList<Entry> getEntries();
    class Entry (line 22) | @Value

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedStateImpl.java
  class BrowserHistorySavedStateImpl (line 21) | @Value
    method BrowserHistorySavedStateImpl (line 30) | public BrowserHistorySavedStateImpl(List<Entry> lastSystems) {
    method get (line 34) | public static BrowserHistorySavedState get() {
    method load (line 41) | private static BrowserHistorySavedStateImpl load() {
    method add (line 48) | @Override
    method save (line 59) | @Override
    method getEntries (line 64) | @Override
    class Deserializer (line 69) | public static class Deserializer extends StdDeserializer<BrowserHistor...
      method Deserializer (line 71) | protected Deserializer() {
      method deserialize (line 75) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java
  class BrowserHistoryTabComp (line 31) | public class BrowserHistoryTabComp extends SimpleRegionBuilder {
    method BrowserHistoryTabComp (line 35) | public BrowserHistoryTabComp(BrowserFullSessionModel model) {
    method createSimple (line 39) | @Override
    method createListDisplay (line 70) | private BaseRegionBuilder<?, ?> createListDisplay(ObservableList<Brows...
    method createEmptyDisplay (line 119) | private BaseRegionBuilder<?, ?> createEmptyDisplay() {
    method entryButton (line 140) | private BaseRegionBuilder<?, ?> entryButton(BrowserHistorySavedState.E...
    method dirButton (line 167) | private BaseRegionBuilder<?, ?> dirButton(BrowserHistorySavedState.Ent...

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java
  class BrowserHistoryTabModel (line 12) | public final class BrowserHistoryTabModel extends BrowserSessionTab {
    method BrowserHistoryTabModel (line 14) | public BrowserHistoryTabModel(BrowserAbstractSessionModel<?> browserMo...
    method comp (line 18) | @Override
    method canImmediatelyClose (line 23) | @Override
    method init (line 28) | @Override
    method close (line 31) | @Override
    method getName (line 34) | @Override
    method getIcon (line 39) | @Override
    method getColor (line 44) | @Override
    method isCloseable (line 49) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java
  class BrowserLocalFileSystem (line 12) | public class BrowserLocalFileSystem {
    method init (line 16) | public static void init() throws Exception {
    method reset (line 25) | public static void reset() throws Exception {
    method getLocalFileEntry (line 32) | public static FileEntry getLocalFileEntry(Path file) throws Exception {
    method getLocalBrowserEntry (line 43) | public static BrowserEntry getLocalBrowserEntry(Path file) throws Exce...

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java
  class BrowserNavBarComp (line 35) | public class BrowserNavBarComp extends RegionStructureBuilder<HBox, Brow...
    method BrowserNavBarComp (line 40) | public BrowserNavBarComp(BrowserFileSystemTabModel model) {
    method createBase (line 44) | @Override
    method setMargin (line 137) | private void setMargin(StackPane stackPane, Region region) {
    method createPathBar (line 146) | private RegionBuilder<TextField> createPathBar() {
    method createContextMenu (line 194) | private ContextMenu createContextMenu() {
    method get (line 259) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java
  class BrowserOverviewComp (line 25) | public class BrowserOverviewComp extends SimpleRegionBuilder {
    method BrowserOverviewComp (line 29) | public BrowserOverviewComp(BrowserFileSystemTabModel model) {
    method createSimple (line 33) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessButtonComp.java
  class BrowserQuickAccessButtonComp (line 12) | public class BrowserQuickAccessButtonComp extends SimpleRegionBuilder {
    method BrowserQuickAccessButtonComp (line 17) | public BrowserQuickAccessButtonComp(Supplier<BrowserEntry> base, Brows...
    method createSimple (line 22) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java
  class BrowserQuickAccessContextMenu (line 35) | public class BrowserQuickAccessContextMenu extends ContextMenu {
    method BrowserQuickAccessContextMenu (line 44) | public BrowserQuickAccessContextMenu(Supplier<BrowserEntry> base, Brow...
    method showMenu (line 86) | public void showMenu(Node anchor) {
    method createItem (line 112) | private MenuItem createItem(BrowserEntry browserEntry) {
    method updateMenuItems (line 116) | private List<MenuItem> updateMenuItems(Menu m, BrowserEntry entry, boo...
    class QuickAccessMenu (line 159) | @Getter
      method QuickAccessMenu (line 166) | public QuickAccessMenu(BrowserEntry browserEntry) {
      method createMenu (line 179) | private void createMenu() {
      method createFileMenu (line 188) | private void createFileMenu() {
      method createDirectoryMenu (line 211) | private void createDirectoryMenu() {
      method addHoverHandling (line 254) | private void addHoverHandling() {
      method addInputListeners (line 272) | private void addInputListeners() {
      method expandDirectoryMenu (line 298) | private void expandDirectoryMenu(MenuItem empty) {
      method hideBrowserActionsMenu (line 318) | private boolean hideBrowserActionsMenu() {
      method showBrowserActionsMenu (line 327) | private void showBrowserActionsMenu() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java
  class BrowserStatusBarComp (line 26) | @Value
    method createSimple (line 32) | @Override
    method createKillButton (line 68) | private BaseRegionBuilder<?, ?> createKillButton() {
    method createProgressEstimateStatus (line 94) | private BaseRegionBuilder<?, ?> createProgressEstimateStatus() {
    method createProgressStatus (line 130) | private BaseRegionBuilder<?, ?> createProgressStatus() {
    method createProgressNameStatus (line 157) | private BaseRegionBuilder<?, ?> createProgressNameStatus() {
    method createClipboardStatus (line 172) | private BaseRegionBuilder<?, ?> createClipboardStatus() {
    method createSelectionStatus (line 187) | private BaseRegionBuilder<?, ?> createSelectionStatus() {
    method simulateEmptyCell (line 212) | private void simulateEmptyCell(Region r) {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java
  class BrowserTerminalDockTabModel (line 33) | public final class BrowserTerminalDockTabModel extends BrowserSessionTab {
    method BrowserTerminalDockTabModel (line 43) | public BrowserTerminalDockTabModel(
    method comp (line 52) | @Override
    method canImmediatelyClose (line 57) | @Override
    method init (line 62) | @Override
    method close (line 163) | @Override
    method getName (line 172) | @Override
    method getIcon (line 177) | @Override
    method getColor (line 182) | @Override
    method refreshShowingState (line 187) | private void refreshShowingState() {

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java
  class BrowserTransferComp (line 29) | public class BrowserTransferComp extends SimpleRegionBuilder {
    method BrowserTransferComp (line 33) | public BrowserTransferComp(BrowserTransferModel model) {
    method createSimple (line 37) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java
  class BrowserTransferModel (line 37) | @Value
    method BrowserTransferModel (line 47) | public BrowserTransferModel(BrowserFullSessionModel browserSessionMode...
    method getCurrentItems (line 67) | public List<Item> getCurrentItems() {
    method cleanItem (line 73) | private void cleanItem(Item item) {
    method clear (line 89) | public void clear(boolean delete) {
    method drop (line 107) | public void drop(BrowserFileSystemTabModel model, List<BrowserEntry> e...
    method downloadSingle (line 124) | public void downloadSingle(Item item) {
    method transferToDownloads (line 185) | public void transferToDownloads(boolean open) throws Exception {
    method getDownloadsTargetDirectory (line 226) | private Path getDownloadsTargetDirectory() {
    class Item (line 243) | @Value
      method Item (line 252) | public Item(

FILE: app/src/main/java/io/xpipe/app/browser/file/BrowserTransferProgress.java
  class BrowserTransferProgress (line 9) | @Value
    method finished (line 17) | public static BrowserTransferProgress finished(String name, long size) {
    method estimateTransferSpeed (line 21) | public static long estimateTransferSpeed(BrowserTransferProgress start...
    method estimateTransferSpeed (line 27) | public static long estimateTransferSpeed(List<BrowserTransferProgress>...
    method done (line 46) | public boolean done() {

FILE: app/src/main/java/io/xpipe/app/browser/icon/BrowserIconDirectoryType.java
  class BrowserIconDirectoryType (line 17) | public abstract class BrowserIconDirectoryType {
    method loadDefinitions (line 21) | public static synchronized void loadDefinitions() {
    method getAll (line 57) | public static synchronized List<BrowserIconDirectoryType> getAll() {
    method matches (line 61) | public abstract boolean matches(FileEntry entry);
    method getIcon (line 63) | public abstract String getIcon();
    class Simple (line 65) | public static class Simple extends BrowserIconDirectoryType {
      method Simple (line 70) | public Simple(BrowserIconVariant closed, Set<String> names) {
      method matches (line 75) | @Override
      method getIcon (line 85) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java
  class BrowserIconFileType (line 16) | public abstract class BrowserIconFileType {
    method byId (line 20) | public static synchronized BrowserIconFileType byId(String id) {
    method loadDefinitions (line 27) | public static synchronized void loadDefinitions() {
    method getAll (line 57) | public static synchronized List<BrowserIconFileType> getAll() {
    method getId (line 61) | public abstract String getId();
    method matches (line 63) | public abstract boolean matches(FileEntry entry);
    method getIcon (line 65) | public abstract String getIcon();
    class Simple (line 67) | @Getter
      method Simple (line 74) | public Simple(String id, String lightIcon, String darkIcon, Set<Stri...
      method matches (line 80) | @Override
      method getIcon (line 92) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/icon/BrowserIconManager.java
  class BrowserIconManager (line 9) | public class BrowserIconManager {
    method init (line 13) | public static synchronized void init() {
    method loadIfNecessary (line 21) | public static void loadIfNecessary(String s) {

FILE: app/src/main/java/io/xpipe/app/browser/icon/BrowserIconVariant.java
  class BrowserIconVariant (line 5) | public class BrowserIconVariant {
    method BrowserIconVariant (line 10) | public BrowserIconVariant(String lightIcon, String darkIcon) {
    method getIcon (line 15) | protected final String getIcon() {

FILE: app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java
  class BrowserIcons (line 6) | public class BrowserIcons {
    method createDefaultFileIcon (line 8) | public static BaseRegionBuilder<?, ?> createDefaultFileIcon() {
    method createDefaultDirectoryIcon (line 14) | public static BaseRegionBuilder<?, ?> createDefaultDirectoryIcon() {
    method createContextMenuIcon (line 20) | public static BaseRegionBuilder<?, ?> createContextMenuIcon(BrowserIco...
    method createIcon (line 25) | public static BaseRegionBuilder<?, ?> createIcon(String s) {

FILE: app/src/main/java/io/xpipe/app/browser/menu/BrowserApplicationPathMenuProvider.java
  type BrowserApplicationPathMenuProvider (line 10) | public interface BrowserApplicationPathMenuProvider extends BrowserMenuI...
    method getExecutable (line 12) | String getExecutable();
    method init (line 14) | @Override
    method isApplicable (line 24) | @Override
    method isActive (line 29) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuBranchProvider.java
  type BrowserMenuBranchProvider (line 11) | public interface BrowserMenuBranchProvider extends BrowserMenuItemProvid...
    method toMenuItem (line 13) | default MenuItem toMenuItem(BrowserFileSystemTabModel model, List<Brow...
    method getBranchingActions (line 39) | List<? extends BrowserMenuItemProvider> getBranchingActions(

FILE: app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuCategory.java
  type BrowserMenuCategory (line 3) | public enum BrowserMenuCategory {

FILE: app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuItemProvider.java
  type BrowserMenuItemProvider (line 14) | public interface BrowserMenuItemProvider extends ActionProvider {
    method toMenuItem (line 16) | MenuItem toMenuItem(BrowserFileSystemTabModel model, List<BrowserEntry...
    method init (line 18) | default void init(BrowserFileSystemTabModel model) throws Exception {}
    method automaticallyResolveLinks (line 20) | default boolean automaticallyResolveLinks() {
    method resolveFilesIfNeeded (line 24) | default List<BrowserEntry> resolveFilesIfNeeded(List<BrowserEntry> sel...
    method getIcon (line 33) | default LabelGraphic getIcon() {
    method getCategory (line 37) | default BrowserMenuCategory getCategory() {
    method getShortcut (line 41) | default KeyCombination getShortcut() {
    method getName (line 45) | ObservableValue<String> getName(BrowserFileSystemTabModel model, List<...
    method acceptsEmptySelection (line 47) | default boolean acceptsEmptySelection() {
    method isApplicable (line 51) | default boolean isApplicable(BrowserFileSystemTabModel model, List<Bro...
    method isActive (line 55) | default boolean isActive(BrowserFileSystemTabModel model) {

FILE: app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuLeafProvider.java
  type BrowserMenuLeafProvider (line 22) | public interface BrowserMenuLeafProvider extends BrowserMenuItemProvider {
    method execute (line 24) | default void execute(BrowserFileSystemTabModel model, List<BrowserEntr...
    method getDelegateActionProvider (line 28) | default Class<? extends BrowserActionProvider> getDelegateActionProvid...
    method createAction (line 32) | @SneakyThrows
    method toButton (line 65) | default Button toButton(Region root, BrowserFileSystemTabModel model, ...
    method toMenuItem (line 97) | default MenuItem toMenuItem(BrowserFileSystemTabModel model, List<Brow...
    method isApplicable (line 122) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuProviders.java
  class BrowserMenuProviders (line 9) | public class BrowserMenuProviders {
    method getFlattened (line 11) | public static List<BrowserMenuLeafProvider> getFlattened(
    method getFlattened (line 21) | public static List<BrowserMenuLeafProvider> getFlattened(
    method byId (line 34) | public static BrowserMenuLeafProvider byId(String id, BrowserFileSyste...

FILE: app/src/main/java/io/xpipe/app/browser/menu/FileTypeMenuProvider.java
  type FileTypeMenuProvider (line 11) | public interface FileTypeMenuProvider extends BrowserMenuItemProvider {
    method getIcon (line 13) | @Override
    method isApplicable (line 18) | @Override
    method getType (line 24) | BrowserIconFileType getType();

FILE: app/src/main/java/io/xpipe/app/browser/menu/MultiExecuteMenuProvider.java
  class MultiExecuteMenuProvider (line 18) | public abstract class MultiExecuteMenuProvider implements BrowserMenuBra...
    method createCommand (line 20) | protected abstract List<CommandBuilder> createCommand(BrowserFileSyste...
    method getBranchingActions (line 22) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/BackMenuProvider.java
  class BackMenuProvider (line 18) | public class BackMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 20) | @Override
    method isApplicable (line 29) | @Override
    method getId (line 34) | public String getId() {
    method getIcon (line 38) | @Override
    method getShortcut (line 43) | @Override
    method getName (line 48) | @Override
    method isActive (line 53) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/BrowseInNativeManagerMenuProvider.java
  class BrowseInNativeManagerMenuProvider (line 17) | public class BrowseInNativeManagerMenuProvider implements BrowserMenuLea...
    method getDelegateActionProvider (line 19) | @Override
    method getCategory (line 24) | @Override
    method getName (line 29) | @Override
    method acceptsEmptySelection (line 38) | @Override
    method getIcon (line 43) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/ChgrpMenuProvider.java
  class ChgrpMenuProvider (line 25) | public class ChgrpMenuProvider implements BrowserMenuBranchProvider {
    method getLeafActions (line 27) | @SneakyThrows
    method getIcon (line 46) | @Override
    method getCategory (line 51) | @Override
    method getName (line 56) | @Override
    method isApplicable (line 61) | @Override
    method getBranchingActions (line 66) | @Override
    class FlatProvider (line 77) | private static class FlatProvider implements BrowserMenuBranchProvider {
      method getIcon (line 79) | @Override
      method getName (line 84) | @Override
      method getBranchingActions (line 89) | @Override
    class RecursiveProvider (line 96) | private static class RecursiveProvider implements BrowserMenuBranchPro...
      method getIcon (line 98) | @Override
      method getName (line 103) | @Override
      method getBranchingActions (line 108) | @Override
    class FixedProvider (line 115) | private static class FixedProvider implements BrowserMenuLeafProvider {
      method FixedProvider (line 120) | private FixedProvider(String group, boolean recursive) {
      method getName (line 125) | @Override
      method execute (line 130) | @Override
    class CustomProvider (line 141) | private static class CustomProvider implements BrowserMenuLeafProvider {
      method CustomProvider (line 145) | private CustomProvider(boolean recursive) {
      method getName (line 149) | @Override
      method execute (line 154) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/ChmodMenuProvider.java
  class ChmodMenuProvider (line 22) | public class ChmodMenuProvider implements BrowserMenuBranchProvider {
    method getLeafActions (line 24) | private static List<BrowserMenuItemProvider> getLeafActions(BrowserFil...
    method getIcon (line 38) | @Override
    method getCategory (line 43) | @Override
    method getName (line 48) | @Override
    method isApplicable (line 53) | @Override
    method getBranchingActions (line 58) | @Override
    class FlatProvider (line 69) | private static class FlatProvider implements BrowserMenuBranchProvider {
      method getIcon (line 71) | @Override
      method getName (line 76) | @Override
      method getBranchingActions (line 81) | @Override
    class RecursiveProvider (line 88) | private static class RecursiveProvider implements BrowserMenuBranchPro...
      method getIcon (line 90) | @Override
      method getName (line 95) | @Override
      method getBranchingActions (line 100) | @Override
    class FixedProvider (line 107) | private static class FixedProvider implements BrowserMenuLeafProvider {
      method FixedProvider (line 112) | private FixedProvider(String permissions, boolean recursive) {
      method getName (line 117) | @Override
      method execute (line 122) | @Override
    class CustomProvider (line 133) | private static class CustomProvider implements BrowserMenuLeafProvider {
      method CustomProvider (line 137) | private CustomProvider(boolean recursive) {
      method getName (line 141) | @Override
      method execute (line 146) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/ChownMenuProvider.java
  class ChownMenuProvider (line 25) | public class ChownMenuProvider implements BrowserMenuBranchProvider {
    method getLeafActions (line 27) | @SneakyThrows
    method getIcon (line 45) | @Override
    method getCategory (line 50) | @Override
    method getName (line 55) | @Override
    method isApplicable (line 60) | @Override
    method getBranchingActions (line 65) | @Override
    class FlatProvider (line 76) | private static class FlatProvider implements BrowserMenuBranchProvider {
      method getIcon (line 78) | @Override
      method getName (line 83) | @Override
      method getBranchingActions (line 88) | @Override
    class RecursiveProvider (line 95) | private static class RecursiveProvider implements BrowserMenuBranchPro...
      method getIcon (line 97) | @Override
      method getName (line 102) | @Override
      method getBranchingActions (line 107) | @Override
    class FixedProvider (line 114) | private static class FixedProvider implements BrowserMenuLeafProvider {
      method FixedProvider (line 119) | private FixedProvider(String owner, boolean recursive) {
      method getName (line 124) | @Override
      method execute (line 129) | @Override
    class CustomProvider (line 140) | private static class CustomProvider implements BrowserMenuLeafProvider {
      method CustomProvider (line 144) | private CustomProvider(boolean recursive) {
      method getName (line 148) | @Override
      method execute (line 153) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/ComputeDirectorySizesMenuProvider.java
  class ComputeDirectorySizesMenuProvider (line 17) | public class ComputeDirectorySizesMenuProvider implements BrowserMenuLea...
    method getId (line 19) | public String getId() {
    method getIcon (line 23) | @Override
    method getCategory (line 28) | @Override
    method getName (line 33) | @Override
    method acceptsEmptySelection (line 40) | @Override
    method isApplicable (line 45) | @Override
    method createAction (line 52) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/CopyMenuProvider.java
  class CopyMenuProvider (line 18) | public class CopyMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 20) | @Override
    method getIcon (line 25) | @Override
    method getCategory (line 30) | @Override
    method getShortcut (line 35) | @Override
    method getName (line 40) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/CopyPathMenuProvider.java
  class CopyPathMenuProvider (line 22) | public class CopyPathMenuProvider implements BrowserMenuBranchProvider {
    method centerEllipsis (line 24) | private static String centerEllipsis(String input, int length) {
    method getIcon (line 37) | @Override
    method getCategory (line 42) | @Override
    method getName (line 47) | @Override
    method acceptsEmptySelection (line 52) | @Override
    method getBranchingActions (line 57) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/DeleteMenuProvider.java
  class DeleteMenuProvider (line 20) | public class DeleteMenuProvider implements BrowserMenuLeafProvider {
    method getDelegateActionProvider (line 22) | @Override
    method automaticallyResolveLinks (line 27) | @Override
    method getIcon (line 32) | @Override
    method getCategory (line 37) | @Override
    method getShortcut (line 42) | @Override
    method getName (line 47) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/DownloadMenuProvider.java
  class DownloadMenuProvider (line 18) | public class DownloadMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 20) | @Override
    method isApplicable (line 30) | @Override
    method getId (line 39) | public String getId() {
    method getIcon (line 43) | @Override
    method getCategory (line 48) | @Override
    method getShortcut (line 53) | @Override
    method getName (line 58) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java
  class EditFileMenuProvider (line 21) | public class EditFileMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 23) | @Override
    method isApplicable (line 32) | @Override
    method getIcon (line 37) | @Override
    method getCategory (line 42) | @Override
    method getShortcut (line 47) | @Override
    method getName (line 52) | @Override
    method isActive (line 59) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/FollowLinkMenuProvider.java
  class FollowLinkMenuProvider (line 15) | public class FollowLinkMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 17) | @Override
    method isApplicable (line 23) | @Override
    method automaticallyResolveLinks (line 31) | @Override
    method getIcon (line 36) | @Override
    method getCategory (line 41) | @Override
    method getName (line 46) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/ForwardMenuProvider.java
  class ForwardMenuProvider (line 18) | public class ForwardMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 20) | @Override
    method isApplicable (line 29) | @Override
    method getId (line 34) | public String getId() {
    method getIcon (line 38) | @Override
    method getShortcut (line 43) | @Override
    method getName (line 48) | @Override
    method isActive (line 53) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/GradleRunMenuProvider.java
  class GradleRunMenuProvider (line 20) | public class GradleRunMenuProvider implements BrowserMenuLeafProvider {
    method isApplicable (line 22) | @Override
    method getName (line 49) | @Override
    method getCategory (line 54) | @Override
    method getIcon (line 59) | @Override
    method execute (line 64) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/JarMenuProvider.java
  class JarMenuProvider (line 14) | public class JarMenuProvider extends MultiExecuteMenuProvider
    method getCategory (line 17) | @Override
    method getName (line 22) | @Override
    method isApplicable (line 28) | @Override
    method getType (line 37) | @Override
    method getExecutable (line 42) | @Override
    method createCommand (line 47) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java
  class JavapMenuProvider (line 20) | public class JavapMenuProvider
    method getCategory (line 23) | @Override
    method getName (line 28) | @Override
    method isApplicable (line 34) | @Override
    method getType (line 44) | @Override
    method execute (line 49) | @Override
    method getExecutable (line 65) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/NewItemMenuProvider.java
  class NewItemMenuProvider (line 26) | public class NewItemMenuProvider implements BrowserMenuBranchProvider {
    method getIcon (line 28) | @Override
    method getCategory (line 33) | @Override
    method getName (line 38) | @Override
    method acceptsEmptySelection (line 43) | @Override
    method getBranchingActions (line 48) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/OpenDirectoryInNewTabMenuProvider.java
  class OpenDirectoryInNewTabMenuProvider (line 19) | public class OpenDirectoryInNewTabMenuProvider implements BrowserMenuLea...
    method execute (line 21) | @Override
    method isApplicable (line 32) | @Override
    method getIcon (line 39) | @Override
    method getCategory (line 44) | @Override
    method getShortcut (line 49) | @Override
    method getName (line 54) | @Override
    method acceptsEmptySelection (line 59) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/OpenDirectoryMenuProvider.java
  class OpenDirectoryMenuProvider (line 19) | public class OpenDirectoryMenuProvider implements BrowserMenuLeafProvider {
    method getDelegateActionProvider (line 21) | @Override
    method getIcon (line 26) | @Override
    method getCategory (line 31) | @Override
    method getShortcut (line 36) | @Override
    method getName (line 41) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileDefaultMenuProvider.java
  class OpenFileDefaultMenuProvider (line 19) | public class OpenFileDefaultMenuProvider implements BrowserMenuLeafProvi...
    method getDelegateActionProvider (line 21) | @Override
    method getIcon (line 26) | @Override
    method getCategory (line 31) | @Override
    method getShortcut (line 36) | @Override
    method getName (line 41) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileWithMenuProvider.java
  class OpenFileWithMenuProvider (line 21) | public class OpenFileWithMenuProvider implements BrowserMenuLeafProvider {
    method getDelegateActionProvider (line 23) | @Override
    method isApplicable (line 28) | @Override
    method getIcon (line 35) | @Override
    method getCategory (line 40) | @Override
    method getShortcut (line 45) | @Override
    method getName (line 50) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/OpenNativeFileDetailsMenuProvider.java
  class OpenNativeFileDetailsMenuProvider (line 19) | public class OpenNativeFileDetailsMenuProvider implements BrowserMenuLea...
    method getDelegateActionProvider (line 21) | @Override
    method getCategory (line 26) | @Override
    method getShortcut (line 31) | @Override
    method getName (line 36) | @Override
    method acceptsEmptySelection (line 41) | @Override
    method getIcon (line 46) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/OpenTerminalInDirectoryMenuProvider.java
  class OpenTerminalInDirectoryMenuProvider (line 21) | public class OpenTerminalInDirectoryMenuProvider implements BrowserMenuL...
    method execute (line 23) | @Override
    method isApplicable (line 42) | @Override
    method getId (line 48) | public String getId() {
    method getIcon (line 52) | @Override
    method getCategory (line 57) | @Override
    method getShortcut (line 62) | @Override
    method getName (line 67) | @Override
    method isActive (line 72) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/PasteMenuProvider.java
  class PasteMenuProvider (line 20) | public class PasteMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 22) | @Override
    method isApplicable (line 54) | @Override
    method getIcon (line 67) | @Override
    method getCategory (line 72) | @Override
    method getShortcut (line 77) | @Override
    method getName (line 82) | @Override
    method acceptsEmptySelection (line 87) | @Override
    method isActive (line 92) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/RefreshDirectoryMenuProvider.java
  class RefreshDirectoryMenuProvider (line 18) | public class RefreshDirectoryMenuProvider implements BrowserMenuLeafProv...
    method execute (line 20) | @Override
    method isApplicable (line 29) | @Override
    method getId (line 34) | public String getId() {
    method getIcon (line 38) | @Override
    method getShortcut (line 43) | @Override
    method getName (line 48) | @Override
    method isActive (line 53) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/RenameMenuProvider.java
  class RenameMenuProvider (line 18) | public class RenameMenuProvider implements BrowserMenuLeafProvider {
    method execute (line 20) | @Override
    method isApplicable (line 25) | @Override
    method automaticallyResolveLinks (line 30) | @Override
    method getIcon (line 35) | @Override
    method getCategory (line 40) | @Override
    method getShortcut (line 45) | @Override
    method getName (line 50) | @Override
    method getId (line 55) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/RunFileMenuProvider.java
  class RunFileMenuProvider (line 20) | public class RunFileMenuProvider extends MultiExecuteMenuProvider {
    method isExecutable (line 22) | private boolean isExecutable(FileEntry e) {
    method getIcon (line 55) | @Override
    method getCategory (line 60) | @Override
    method getName (line 65) | @Override
    method isApplicable (line 70) | @Override
    method createCommand (line 75) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUntarMenuProvider.java
  class BaseUntarMenuProvider (line 20) | public class BaseUntarMenuProvider implements BrowserApplicationPathMenu...
    method BaseUntarMenuProvider (line 25) | public BaseUntarMenuProvider(boolean gz, boolean toDirectory) {
    method getIcon (line 30) | @Override
    method getCategory (line 35) | @Override
    method getName (line 40) | @Override
    method isApplicable (line 50) | @Override
    method getExecutable (line 70) | @Override
    method createAction (line 75) | @Override
    method automaticallyResolveLinks (line 84) | @Override
    method getTarget (line 89) | private FilePath getTarget(FilePath name) {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipUnixMenuProvider.java
  class BaseUnzipUnixMenuProvider (line 20) | public abstract class BaseUnzipUnixMenuProvider implements BrowserMenuLe...
    method BaseUnzipUnixMenuProvider (line 24) | public BaseUnzipUnixMenuProvider(boolean toDirectory) {
    method getIcon (line 28) | @Override
    method getCategory (line 33) | @Override
    method automaticallyResolveLinks (line 38) | @Override
    method getName (line 43) | @Override
    method getExecutable (line 56) | @Override
    method isApplicable (line 61) | @Override
    method createAction (line 74) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipWindowsActionProvider.java
  class BaseUnzipWindowsActionProvider (line 19) | public abstract class BaseUnzipWindowsActionProvider implements BrowserM...
    method BaseUnzipWindowsActionProvider (line 23) | public BaseUnzipWindowsActionProvider(boolean toDirectory) {
    method automaticallyResolveLinks (line 27) | @Override
    method getIcon (line 32) | @Override
    method getCategory (line 37) | @Override
    method getName (line 42) | @Override
    method isApplicable (line 55) | @Override
    method createAction (line 67) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/CompressMenuProvider.java
  class CompressMenuProvider (line 21) | public class CompressMenuProvider implements BrowserMenuBranchProvider {
    method init (line 23) | @Override
    method getIcon (line 35) | @Override
    method getCategory (line 40) | @Override
    method getName (line 45) | @Override
    method isApplicable (line 50) | @Override
    method getBranchingActions (line 69) | @Override
    class LeafProvider (line 95) | private abstract static class LeafProvider implements BrowserMenuLeafP...
      method LeafProvider (line 99) | private LeafProvider(boolean directory) {
      method automaticallyResolveLinks (line 103) | @Override
      method execute (line 108) | @Override
      method getName (line 134) | @Override
      method create (line 139) | protected abstract void create(String fileName, BrowserFileSystemTab...
      method getExtension (line 141) | protected abstract String getExtension();
    class BranchProvider (line 144) | private class BranchProvider implements BrowserMenuBranchProvider {
      method BranchProvider (line 148) | private BranchProvider(boolean directory) {
      method getIcon (line 152) | @Override
      method getName (line 159) | @Override
      method getBranchingActions (line 164) | @Override
    class ZipActionProvider (line 185) | private class ZipActionProvider extends LeafProvider {
      method ZipActionProvider (line 187) | private ZipActionProvider(boolean directory) {
      method create (line 191) | @Override
      method getExtension (line 200) | @Override
    class TarBasedActionProvider (line 206) | private abstract class TarBasedActionProvider extends LeafProvider {
      method TarBasedActionProvider (line 210) | private TarBasedActionProvider(boolean directory, boolean gz) {
      method create (line 215) | @Override
      method isActive (line 225) | @Override
      method isApplicable (line 231) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/TarActionProvider.java
  class TarActionProvider (line 13) | public class TarActionProvider implements BrowserActionProvider {
    method getId (line 15) | @Override
    class Action (line 20) | @Jacksonized
      method executeImpl (line 31) | @Override
      method isMutation (line 60) | @Override

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarActionProvider.java
  class UntarActionProvider (line 13) | public class UntarActionProvider implements BrowserActionProvider {
    method getId (line 15) | @Override
    class Action (line 20) | @Jacksonized
      method executeImpl (line 27) | @Override
      method isMutation (line 49) | @Override
      method getTarget (line 54) | private FilePath getTarget(FilePath name) {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarDirectoryMenuProvider.java
  class UntarDirectoryMenuProvider (line 3) | public class UntarDirectoryMenuProvider extends BaseUntarMenuProvider {
    method UntarDirectoryMenuProvider (line 5) | public UntarDirectoryMenuProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarGzDirectoryMenuProvider.java
  class UntarGzDirectoryMenuProvider (line 3) | public class UntarGzDirectoryMenuProvider extends BaseUntarMenuProvider {
    method UntarGzDirectoryMenuProvider (line 5) | public UntarGzDirectoryMenuProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarGzHereMenuProvider.java
  class UntarGzHereMenuProvider (line 3) | public class UntarGzHereMenuProvider extends BaseUntarMenuProvider {
    method UntarGzHereMenuProvider (line 5) | public UntarGzHereMenuProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarHereMenuProvider.java
  class UntarHereMenuProvider (line 3) | public class UntarHereMenuProvider extends BaseUntarMenuProvider {
    method UntarHereMenuProvider (line 5) | public UntarHereMenuProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipActionProvider.java
  class UnzipActionProvider (line 16) | public class UnzipActionProvider implements BrowserActionProvider {
    method getTarget (line 18) | public static FilePath getTarget(FilePath name) {
    method getId (line 22) | @Override
    class Action (line 27) | @Jacksonized
      method executeImpl (line 33) | @Override
      method isMutation (line 67) | @Override
      method runPowershellCommand (line 72) | private void runPowershellCommand(ShellControl sc, BrowserFileSystem...

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipDirectoryUnixMenuProvider.java
  class UnzipDirectoryUnixMenuProvider (line 3) | public class UnzipDirectoryUnixMenuProvider extends BaseUnzipUnixMenuPro...
    method UnzipDirectoryUnixMenuProvider (line 5) | public UnzipDirectoryUnixMenuProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipDirectoryWindowsActionProvider.java
  class UnzipDirectoryWindowsActionProvider (line 3) | public class UnzipDirectoryWindowsActionProvider extends BaseUnzipWindow...
    method UnzipDirectoryWindowsActionProvider (line 5) | public UnzipDirectoryWindowsActionProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipHereUnixMenuProvider.java
  class UnzipHereUnixMenuProvider (line 3) | public class UnzipHereUnixMenuProvider extends BaseUnzipUnixMenuProvider {
    method UnzipHereUnixMenuProvider (line 5) | public UnzipHereUnixMenuProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipHereWindowsActionProvider.java
  class UnzipHereWindowsActionProvider (line 3) | public class UnzipHereWindowsActionProvider extends BaseUnzipWindowsActi...
    method UnzipHereWindowsActionProvider (line 5) | public UnzipHereWindowsActionProvider() {

FILE: app/src/main/java/io/xpipe/app/browser/menu/impl/compress/ZipActionProvider.java
  class ZipActionProvider (line 16) | public class ZipActionProvider implements BrowserActionProvider {
    method getId (line 18) | @Override
    class Action (line 23) | @Jacksonized
      method executeImpl (line 32) | @Override
      method isMutation (line 95) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/BaseRegionBuilder.java
  class BaseRegionBuilder (line 17) | public abstract class BaseRegionBuilder<T extends Region, B extends Base...
    method BaseRegionBuilder (line 20) | public BaseRegionBuilder() {
    method hgrow (line 26) | public B hgrow() {
    method vgrow (line 31) | public B vgrow() {
    method describe (line 36) | public B describe(Consumer<RegionDescriptor.RegionDescriptorBuilder> c) {
    method visible (line 45) | public B visible(ObservableValue<Boolean> o) {
    method padding (line 57) | public B padding(Insets insets) {
    method disable (line 61) | public B disable(ObservableValue<Boolean> o) {
    method show (line 73) | public B show(ObservableValue<Boolean> when) {
    method hide (line 77) | public B hide(ObservableValue<Boolean> o) {

FILE: app/src/main/java/io/xpipe/app/comp/RegionBuilder.java
  class RegionBuilder (line 11) | public abstract class RegionBuilder<T extends Region> extends BaseRegion...
    method empty (line 13) | public static RegionBuilder<Region> empty() {
    method hspacer (line 21) | public static RegionBuilder<Spacer> hspacer() {
    method hspacer (line 25) | public static RegionBuilder<Spacer> hspacer(double size) {
    method vspacer (line 29) | public static RegionBuilder<Spacer> vspacer() {
    method vspacer (line 33) | public static RegionBuilder<Spacer> vspacer(double size) {
    method hseparator (line 37) | public static RegionBuilder<Separator> hseparator() {
    method vseparator (line 41) | public static RegionBuilder<Separator> vseparator() {
    method of (line 45) | public static <R extends Region> RegionBuilder<R> of(Supplier<R> r) {
    method build (line 55) | @Override
    method createSimple (line 62) | protected abstract T createSimple();

FILE: app/src/main/java/io/xpipe/app/comp/RegionDescriptor.java
  class RegionDescriptor (line 18) | @Value
    type FocusTraversal (line 30) | public enum FocusTraversal {
    method apply (line 36) | public void apply(Region r) {
    class RegionDescriptorBuilder (line 98) | public static class RegionDescriptorBuilder {
      method nameKey (line 100) | public RegionDescriptorBuilder nameKey(String key) {

FILE: app/src/main/java/io/xpipe/app/comp/RegionStructure.java
  type RegionStructure (line 5) | public interface RegionStructure<R extends Region> {
    method get (line 7) | R get();

FILE: app/src/main/java/io/xpipe/app/comp/RegionStructureBuilder.java
  class RegionStructureBuilder (line 9) | public abstract class RegionStructureBuilder<R extends Region, S extends...
    method applyStructure (line 14) | public final RegionStructureBuilder<R, S> applyStructure(Consumer<? su...
    method initializeStructure (line 19) | protected final void initializeStructure(S obj) {
    method build (line 25) | @Override
    method buildStructure (line 31) | public final S buildStructure() {
    method createBase (line 38) | protected abstract S createBase();

FILE: app/src/main/java/io/xpipe/app/comp/SimpleRegionBuilder.java
  class SimpleRegionBuilder (line 5) | public abstract class SimpleRegionBuilder extends RegionBuilder<Region> {}

FILE: app/src/main/java/io/xpipe/app/comp/augment/ContextMenuAugment.java
  class ContextMenuAugment (line 16) | public class ContextMenuAugment<S extends Region> implements Consumer<S> {
    method ContextMenuAugment (line 22) | public ContextMenuAugment(
    method accept (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/AnchorComp.java
  class AnchorComp (line 10) | public class AnchorComp extends RegionBuilder<AnchorPane> {
    method AnchorComp (line 14) | public AnchorComp(List<BaseRegionBuilder<?, ?>> comps) {
    method createSimple (line 18) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java
  class AppLayoutComp (line 34) | public class AppLayoutComp extends RegionStructureBuilder<BorderPane, Ap...
    method createBase (line 36) | @Override
    method prepareAddition (line 103) | public void prepareAddition() {
    method show (line 108) | public void show() {
    method get (line 120) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java
  class AppMainWindowContentComp (line 32) | public class AppMainWindowContentComp extends SimpleRegionBuilder {
    method AppMainWindowContentComp (line 36) | public AppMainWindowContentComp(Stage stage) {
    method createSimple (line 40) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ButtonComp.java
  class ButtonComp (line 19) | @Getter
    method ButtonComp (line 27) | public ButtonComp(ObservableValue<String> name, Runnable listener) {
    method ButtonComp (line 33) | public ButtonComp(ObservableValue<String> name, Node graphic, Runnable...
    method ButtonComp (line 39) | public ButtonComp(ObservableValue<String> name, LabelGraphic graphic, ...
    method createSimple (line 45) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ChoiceComp.java
  class ChoiceComp (line 25) | @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    method ChoiceComp (line 33) | public ChoiceComp(Property<T> value, Map<T, ObservableValue<String>> r...
    method ofTranslatable (line 39) | public static <T extends Translatable> ChoiceComp<T> ofTranslatable(
    method createSimple (line 47) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ChoicePaneComp.java
  class ChoicePaneComp (line 22) | public class ChoicePaneComp extends RegionBuilder<VBox> {
    method ChoicePaneComp (line 30) | public ChoicePaneComp(List<Entry> entries, Property<Entry> selected) {
    method createSimple (line 35) | @Override
    method hashCode (line 107) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ComboTextFieldComp.java
  class ComboTextFieldComp (line 20) | public class ComboTextFieldComp extends RegionBuilder<ComboBox<String>> {
    method ComboTextFieldComp (line 29) | public ComboTextFieldComp(
    method createSimple (line 38) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java
  class ContextualFileReferenceChoiceComp (line 41) | public class ContextualFileReferenceChoiceComp extends RegionBuilder<HBo...
    method ContextualFileReferenceChoiceComp (line 53) | public <T extends FileSystemStore> ContextualFileReferenceChoiceComp(
    method createSimple (line 71) | @Override
    method createComboBox (line 175) | private BaseRegionBuilder<?, ?> createComboBox() {
    method createTextField (line 215) | private BaseRegionBuilder<?, ?> createTextField() {
    class PreviousFileReference (line 238) | @Value
      method of (line 244) | public static PreviousFileReference of(Path file) {

FILE: app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceSync.java
  class ContextualFileReferenceSync (line 23) | @Value
    method of (line 27) | public static ContextualFileReferenceSync of(Path dir, Function<Path, ...
    method getExistingFiles (line 94) | public List<ContextualFileReferenceChoiceComp.PreviousFileReference> g...

FILE: app/src/main/java/io/xpipe/app/comp/base/CountComp.java
  class CountComp (line 16) | @AllArgsConstructor
    method createSimple (line 23) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/DelayedInitComp.java
  class DelayedInitComp (line 16) | @AllArgsConstructor
    method createSimple (line 22) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/FilterComp.java
  class FilterComp (line 23) | public class FilterComp extends RegionBuilder<CustomTextField> {
    method FilterComp (line 27) | public FilterComp(Property<String> filterText) {
    method createSimple (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/FontIconComp.java
  class FontIconComp (line 14) | @AllArgsConstructor
    method createBase (line 19) | @Override
    class Structure (line 32) | @Value
      method get (line 38) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/HorizontalComp.java
  class HorizontalComp (line 15) | public class HorizontalComp extends RegionBuilder<HBox> {
    method HorizontalComp (line 19) | public HorizontalComp(List<BaseRegionBuilder<?, ?>> comps) {
    method HorizontalComp (line 23) | public HorizontalComp(ObservableList<BaseRegionBuilder<?, ?>> entries) {
    method spacing (line 27) | public RegionBuilder<HBox> spacing(double spacing) {
    method createSimple (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/IconButtonComp.java
  class IconButtonComp (line 16) | public class IconButtonComp extends RegionBuilder<Button> {
    method IconButtonComp (line 21) | public IconButtonComp(String defaultVal) {
    method IconButtonComp (line 25) | public IconButtonComp(String defaultVal, Runnable listener) {
    method IconButtonComp (line 29) | public IconButtonComp(ObservableValue<? extends LabelGraphic> icon) {
    method IconButtonComp (line 34) | public IconButtonComp(LabelGraphic defaultVal, Runnable listener) {
    method IconButtonComp (line 38) | public IconButtonComp(ObservableValue<? extends LabelGraphic> icon, Ru...
    method createSimple (line 43) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/InputGroupComp.java
  class InputGroupComp (line 15) | public class InputGroupComp extends RegionBuilder<InputGroup> {
    method InputGroupComp (line 21) | public InputGroupComp(List<BaseRegionBuilder<?, ?>> comps) {
    method setMainReference (line 25) | public InputGroupComp setMainReference(BaseRegionBuilder<?, ?> mainRef...
    method setMainReference (line 30) | public InputGroupComp setMainReference(int index) {
    method createSimple (line 34) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/IntComboFieldComp.java
  class IntComboFieldComp (line 18) | @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    method IntComboFieldComp (line 25) | public IntComboFieldComp(Property<Integer> value, List<Integer> predef...
    method createSimple (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/IntFieldComp.java
  class IntFieldComp (line 17) | @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    method IntFieldComp (line 24) | public IntFieldComp(Property<Integer> value) {
    method IntFieldComp (line 30) | public IntFieldComp(Property<Integer> value, int minValue, int maxValu...
    method createSimple (line 36) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/IntegratedTextAreaComp.java
  class IntegratedTextAreaComp (line 25) | public class IntegratedTextAreaComp extends RegionStructureBuilder<Ancho...
    method IntegratedTextAreaComp (line 32) | public IntegratedTextAreaComp(
    method script (line 40) | public static IntegratedTextAreaComp script(
    method script (line 55) | public static IntegratedTextAreaComp script(Property<ShellScript> valu...
    method createOpenButton (line 67) | private Region createOpenButton() {
    method createBase (line 83) | @Override
    class Structure (line 118) | @Value
      method get (line 124) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/IntroComp.java
  class IntroComp (line 19) | public class IntroComp extends SimpleRegionBuilder {
    method IntroComp (line 33) | public IntroComp(String translationsKey, LabelGraphic graphic) {
    method createSimple (line 38) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/IntroListComp.java
  class IntroListComp (line 12) | public class IntroListComp extends SimpleRegionBuilder {
    method IntroListComp (line 16) | public IntroListComp(List<IntroComp> intros) {
    method createSimple (line 20) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/LabelComp.java
  class LabelComp (line 15) | @AllArgsConstructor
    method LabelComp (line 21) | public LabelComp(String text, LabelGraphic graphic) {
    method LabelComp (line 25) | public LabelComp(String text) {
    method LabelComp (line 29) | public LabelComp(ObservableValue<String> text) {
    method createSimple (line 33) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/LazyTextFieldComp.java
  class LazyTextFieldComp (line 22) | public class LazyTextFieldComp extends RegionStructureBuilder<StackPane,...
    method LazyTextFieldComp (line 27) | public LazyTextFieldComp(Property<String> appliedValue) {
    method createBase (line 32) | @Override
    class Structure (line 110) | @Value
      method get (line 116) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/LeftSplitPaneComp.java
  class LeftSplitPaneComp (line 18) | public class LeftSplitPaneComp extends RegionStructureBuilder<SplitPane,...
    method LeftSplitPaneComp (line 25) | public LeftSplitPaneComp(BaseRegionBuilder<?, ?> left, BaseRegionBuild...
    method createBase (line 30) | @Override
    method withInitialWidth (line 98) | public LeftSplitPaneComp withInitialWidth(double val) {
    method withOnDividerChange (line 103) | public LeftSplitPaneComp withOnDividerChange(Consumer<Double> onDivide...
    class Structure (line 108) | @Value
      method get (line 115) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java
  class ListBoxViewComp (line 29) | public class ListBoxViewComp<T> extends RegionBuilder<ScrollPane> {
    method ListBoxViewComp (line 45) | public ListBoxViewComp(
    method createSimple (line 56) | @Override
    method registerVisibilityListeners (line 114) | private void registerVisibilityListeners(ScrollPane scroll, VBox vbox) {
    method isVisible (line 219) | private boolean isVisible(ScrollPane pane, VBox box, Node node) {
    method updateVisibilities (line 272) | private void updateVisibilities(ScrollPane scroll, VBox vbox) {
    method refresh (line 299) | private void refresh(

FILE: app/src/main/java/io/xpipe/app/comp/base/ListSelectorComp.java
  class ListSelectorComp (line 30) | @Value
    method createSimple (line 41) | @Override
    method update (line 59) | private void update(VBox vbox, List<CheckBox> cbs) {

FILE: app/src/main/java/io/xpipe/app/comp/base/LoadingIconComp.java
  class LoadingIconComp (line 15) | public class LoadingIconComp extends SimpleRegionBuilder {
    method LoadingIconComp (line 22) | public LoadingIconComp(ObservableValue<Boolean> show, Consumer<Node> f...
    method createSimple (line 27) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/LoadingOverlayComp.java
  class LoadingOverlayComp (line 14) | public class LoadingOverlayComp extends RegionBuilder<StackPane> {
    method LoadingOverlayComp (line 20) | public LoadingOverlayComp(BaseRegionBuilder<?, ?> comp, ObservableValu...
    method createSimple (line 26) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java
  class MarkdownComp (line 32) | public class MarkdownComp extends RegionBuilder<StackPane> {
    method MarkdownComp (line 40) | public MarkdownComp(String markdown, UnaryOperator<String> htmlTransfo...
    method MarkdownComp (line 46) | public MarkdownComp(
    method getHtmlFile (line 53) | private Path getHtmlFile(String markdown) {
    method createWebView (line 87) | @SneakyThrows
    method addLinkHandler (line 126) | private void addLinkHandler(WebEngine engine) {
    method createSimple (line 139) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/MarkdownEditorComp.java
  class MarkdownEditorComp (line 19) | public class MarkdownEditorComp extends RegionStructureBuilder<AnchorPan...
    method MarkdownEditorComp (line 24) | public MarkdownEditorComp(Property<String> value, String identifier) {
    method createOpenButton (line 29) | private Button createOpenButton() {
    method createBase (line 40) | @Override
    class TextAreaStructure (line 53) | @Value
      method get (line 59) | @Override
    class Structure (line 65) | @Value
      method get (line 72) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ModalButton.java
  class ModalButton (line 13) | @Value
    method ModalButton (line 23) | public ModalButton(String key, Runnable action, boolean close, boolean...
    method ok (line 30) | public static ModalButton ok(Runnable action) {
    method ok (line 34) | public static ModalButton ok() {
    method cancel (line 38) | public static ModalButton cancel() {
    method cancel (line 42) | public static ModalButton cancel(Runnable action) {
    method confirm (line 46) | public static ModalButton confirm(Runnable action) {
    method quit (line 50) | public static ModalButton quit() {
    method toggle (line 60) | public static Runnable toggle(Property<Boolean> prop) {
    method augment (line 66) | public ModalButton augment(Consumer<Button> augment) {

FILE: app/src/main/java/io/xpipe/app/comp/base/ModalOverlay.java
  class ModalOverlay (line 17) | @Value
    method of (line 41) | public static ModalOverlay of(BaseRegionBuilder<?, ?> content) {
    method of (line 45) | public static ModalOverlay of(String titleKey, BaseRegionBuilder<?, ?>...
    method of (line 49) | public static ModalOverlay of(String titleKey, BaseRegionBuilder<?, ?>...
    method of (line 53) | public static ModalOverlay of(
    method withDefaultButtons (line 58) | public ModalOverlay withDefaultButtons(Runnable action) {
    method addButton (line 64) | public ModalButton addButton(ModalButton button) {
    method hideable (line 69) | public void hideable(AppLayoutModel.QueueEntry entry) {
    method addButtonBarComp (line 75) | public void addButtonBarComp(BaseRegionBuilder<?, ?> comp) {
    method persist (line 79) | public void persist() {
    method show (line 84) | public void show() {
    method hide (line 88) | public void hide() {
    method isShowing (line 92) | public boolean isShowing() {
    method showAndWait (line 96) | public void showAndWait() {
    method close (line 100) | public void close() {

FILE: app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java
  class ModalOverlayComp (line 40) | public class ModalOverlayComp extends RegionBuilder<Region> {
    method ModalOverlayComp (line 46) | public ModalOverlayComp(BaseRegionBuilder<?, ?> background, Property<M...
    method createSimple (line 51) | @Override
    method showModalBox (line 185) | private void showModalBox(ModalPane modal, ModalOverlay overlay) {
    method toBox (line 198) | private Region toBox(ModalPane pane, ModalOverlay newValue) {
    method modalBoxWidth (line 302) | private ObservableDoubleValue modalBoxWidth(ModalPane pane, Region r) {
    method toButton (line 315) | private Button toButton(ModalButton mb) {

FILE: app/src/main/java/io/xpipe/app/comp/base/ModalOverlayContentComp.java
  class ModalOverlayContentComp (line 9) | @Getter
    method setModalOverlay (line 14) | protected void setModalOverlay(ModalOverlay modalOverlay) {
    method busy (line 18) | protected ObservableValue<Boolean> busy() {

FILE: app/src/main/java/io/xpipe/app/comp/base/ModalOverlayStackComp.java
  class ModalOverlayStackComp (line 13) | public class ModalOverlayStackComp extends SimpleRegionBuilder {
    method ModalOverlayStackComp (line 18) | public ModalOverlayStackComp(BaseRegionBuilder<?, ?> background, Obser...
    method createSimple (line 23) | @Override
    method buildModalOverlay (line 32) | private BaseRegionBuilder<?, ?> buildModalOverlay(BaseRegionBuilder<?,...

FILE: app/src/main/java/io/xpipe/app/comp/base/MultiContentComp.java
  class MultiContentComp (line 18) | public class MultiContentComp extends SimpleRegionBuilder {
    method MultiContentComp (line 24) | public MultiContentComp(
    method createSimple (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/OptionsComp.java
  class OptionsComp (line 36) | @Getter
    method OptionsComp (line 42) | public OptionsComp(List<Entry> entries, List<Check> checks) {
    method createSimple (line 47) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/PrettyImageComp.java
  class PrettyImageComp (line 20) | public class PrettyImageComp extends SimpleRegionBuilder {
    method PrettyImageComp (line 26) | public PrettyImageComp(ObservableValue<String> value, double width, do...
    method createSimple (line 32) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/PrettyImageHelper.java
  class PrettyImageHelper (line 16) | public class PrettyImageHelper {
    method rasterizedImageIfExists (line 18) | private static Optional<String> rasterizedImageIfExists(String img, in...
    method rasterizedImageIfExistsScaled (line 36) | private static String rasterizedImageIfExistsScaled(String img, int he...
    method ofFixedSizeSquare (line 59) | public static BaseRegionBuilder<?, ?> ofFixedSizeSquare(String img, in...
    method ofFixedSize (line 63) | public static BaseRegionBuilder<?, ?> ofFixedSize(String img, int w, i...
    method ofFixedSize (line 67) | public static BaseRegionBuilder<?, ?> ofFixedSize(ObservableValue<Stri...
    method ofSpecificFixedSize (line 78) | public static BaseRegionBuilder<?, ?> ofSpecificFixedSize(String img, ...

FILE: app/src/main/java/io/xpipe/app/comp/base/ScrollComp.java
  class ScrollComp (line 12) | public class ScrollComp extends RegionBuilder<ScrollPane> {
    method ScrollComp (line 16) | public ScrollComp(BaseRegionBuilder<?, ?> content) {
    method createSimple (line 20) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/SecretFieldComp.java
  class SecretFieldComp (line 35) | public class SecretFieldComp extends RegionStructureBuilder<InputGroup, ...
    method SecretFieldComp (line 41) | public SecretFieldComp(Property<InPlaceSecretValue> value, boolean all...
    method ofString (line 46) | public static SecretFieldComp ofString(Property<String> s) {
    method addButton (line 57) | public void addButton(BaseRegionBuilder<?, ?> button) {
    method encrypt (line 61) | protected InPlaceSecretValue encrypt(char[] c) {
    method createBase (line 65) | @Override
    class Structure (line 150) | @AllArgsConstructor
      method get (line 158) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/SideMenuBarComp.java
  class SideMenuBarComp (line 31) | @AllArgsConstructor
    method createSimple (line 38) | @Override
    method createStyle (line 128) | private BaseRegionBuilder<?, ?> createStyle(AppLayoutModel.Entry e, Ic...

FILE: app/src/main/java/io/xpipe/app/comp/base/SimpleTitledPaneComp.java
  class SimpleTitledPaneComp (line 9) | public class SimpleTitledPaneComp extends RegionBuilder<TitledPane> {
    method SimpleTitledPaneComp (line 15) | public SimpleTitledPaneComp(ObservableValue<String> name, BaseRegionBu...
    method createSimple (line 21) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/StackComp.java
  class StackComp (line 12) | public class StackComp extends RegionBuilder<StackPane> {
    method StackComp (line 16) | public StackComp(List<AbstractRegionBuilder<?, ?>> comps) {
    method createSimple (line 20) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/TextAreaComp.java
  class TextAreaComp (line 18) | public class TextAreaComp extends RegionStructureBuilder<AnchorPane, Tex...
    method TextAreaComp (line 24) | public TextAreaComp(Property<String> value) {
    method TextAreaComp (line 28) | public TextAreaComp(Property<String> value, boolean lazy) {
    method createBase (line 44) | @Override
    class Structure (line 95) | @Value
      method get (line 101) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/TextFieldComp.java
  class TextFieldComp (line 13) | public class TextFieldComp extends RegionBuilder<TextField> {
    method TextFieldComp (line 19) | public TextFieldComp(Property<String> value) {
    method TextFieldComp (line 23) | public TextFieldComp(Property<String> value, boolean lazy) {
    method createSimple (line 39) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/TileButtonComp.java
  class TileButtonComp (line 27) | @Getter
    method TileButtonComp (line 41) | public TileButtonComp(String nameKey, String descriptionKey, String ic...
    method TileButtonComp (line 48) | public TileButtonComp(
    method createBase (line 59) | @Override
    class Structure (line 121) | @Value
      method get (line 131) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ToggleGroupComp.java
  class ToggleGroupComp (line 17) | public class ToggleGroupComp<T> extends RegionBuilder<HBox> {
    method ToggleGroupComp (line 22) | public ToggleGroupComp(Property<T> value, ObservableValue<Map<T, Obser...
    method createSimple (line 27) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/ToggleSwitchComp.java
  class ToggleSwitchComp (line 21) | @Value
    method createSimple (line 29) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/TooltipHelper.java
  class TooltipHelper (line 9) | public class TooltipHelper {
    method create (line 11) | public static Tooltip create(ObservableValue<String> text) {
    class FixedTooltip (line 21) | private static class FixedTooltip extends Tooltip {
      method FixedTooltip (line 23) | public FixedTooltip() {
      method show (line 27) | @Override

FILE: app/src/main/java/io/xpipe/app/comp/base/VerticalComp.java
  class VerticalComp (line 15) | public class VerticalComp extends RegionBuilder<VBox> {
    method VerticalComp (line 19) | public VerticalComp(List<? extends AbstractRegionBuilder<?, ?>> comps) {
    method VerticalComp (line 23) | public VerticalComp(ObservableList<? extends AbstractRegionBuilder<?, ...
    method spacing (line 27) | public RegionBuilder<VBox> spacing(double spacing) {
    method createSimple (line 31) | @Override

FILE: app/src/main/java/io/xpipe/app/core/App.java
  class App (line 11) | @Getter
    method getApp (line 17) | public static App getApp() {
    method start (line 21) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppAotTrain.java
  class AppAotTrain (line 9) | public class AppAotTrain {
    method runTrainingMode (line 11) | public static void runTrainingMode() throws Throwable {

FILE: app/src/main/java/io/xpipe/app/core/AppArguments.java
  class AppArguments (line 17) | @Value
    method init (line 25) | public static AppArguments init(String[] args) {
    method parseProperties (line 32) | private static String[] parseProperties(String[] args) {
    class ModeConverter (line 47) | public static class ModeConverter implements CommandLine.ITypeConverte...
      method convert (line 49) | @Override
    class LauncherCommand (line 55) | @CommandLine.Command()
      method resolveLauncher (line 61) | public static LauncherCommand resolveLauncher(String[] args) {
      method call (line 104) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppCache.java
  class AppCache (line 20) | public class AppCache {
    method getPath (line 26) | private static Path getPath(String key) {
    method clear (line 31) | public static void clear() {
    method clear (line 43) | public static void clear(String key) {
    method getNonNull (line 50) | public static <T> T getNonNull(String key, Class<?> type, Supplier<T> ...
    method getNonNull (line 54) | @SuppressWarnings("unchecked")
    method getBoolean (line 84) | public static boolean getBoolean(String key, boolean notPresent) {
    method update (line 107) | public static <T> void update(String key, T val) {
    method getModifiedTime (line 122) | public static Optional<Instant> getModifiedTime(String key) {

FILE: app/src/main/java/io/xpipe/app/core/AppConfigurationDialog.java
  class AppConfigurationDialog (line 15) | public class AppConfigurationDialog {
    method showIfNeeded (line 17) | public static void showIfNeeded() {

FILE: app/src/main/java/io/xpipe/app/core/AppDataLock.java
  class AppDataLock (line 14) | public class AppDataLock {
    method getLockFile (line 19) | private static Path getLockFile() {
    method lock (line 23) | public static boolean lock() {
    method unlock (line 45) | public static void unlock() {

FILE: app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java
  class AppDesktopIntegration (line 15) | public class AppDesktopIntegration {
    method init (line 17) | public static void init() {

FILE: app/src/main/java/io/xpipe/app/core/AppDisplayScale.java
  class AppDisplayScale (line 8) | public class AppDisplayScale {
    method init (line 13) | public static void init() {
    method hasOnlyDefaultDisplayScale (line 34) | public static boolean hasOnlyDefaultDisplayScale() {
    method getEffectiveDisplayScale (line 38) | public static double getEffectiveDisplayScale() {

FILE: app/src/main/java/io/xpipe/app/core/AppExecutableCache.java
  class AppExecutableCache (line 14) | public class AppExecutableCache {
    method getOrInstall (line 16) | public static synchronized Path getOrInstall(String name, String url, ...

FILE: app/src/main/java/io/xpipe/app/core/AppExtensionManager.java
  class AppExtensionManager (line 21) | public class AppExtensionManager {
    method init (line 32) | public static synchronized void init() throws Exception {
    method reset (line 51) | public static void reset() {
    method getInstance (line 55) | public static AppExtensionManager getInstance() {
    method getLocalInstallVersion (line 59) | private static String getLocalInstallVersion(AppInstallation localInst...
    method loadBaseExtension (line 66) | private void loadBaseExtension() {
    method determineExtensionDirectories (line 76) | private void determineExtensionDirectories() throws Exception {
    method getContentModules (line 113) | public Set<Module> getContentModules() {
    method loadAllExtensions (line 122) | private void loadAllExtensions() throws Exception {
    method findAndParseExtension (line 149) | private Optional<Module> findAndParseExtension(String name, ModuleLaye...
    method parseExtensionDirectory (line 169) | private Optional<Module> parseExtensionDirectory(Path dir, ModuleLayer...

FILE: app/src/main/java/io/xpipe/app/core/AppFileWatcher.java
  class AppFileWatcher (line 20) | public class AppFileWatcher {
    method getInstance (line 29) | public static AppFileWatcher getInstance() {
    method init (line 33) | public static void init() {
    method reset (line 38) | public static void reset() {
    method startWatchersInDirectories (line 43) | public void startWatchersInDirectories(List<Path> dirs, BiConsumer<Pat...
    method startWatcher (line 52) | private void startWatcher() {
    method stopWatcher (line 91) | private void stopWatcher() {
    class WatchedDirectory (line 113) | private class WatchedDirectory {
      method WatchedDirectory (line 119) | private WatchedDirectory(Path dir, BiConsumer<Path, WatchEvent.Kind<...
      method createRecursiveWatchers (line 126) | private void createRecursiveWatchers(Path dir) {
      method update (line 139) | public void update(WatchKey key) {
      method handleWatchEvent (line 164) | private void handleWatchEvent(Path path, WatchEvent<?> event) {

FILE: app/src/main/java/io/xpipe/app/core/AppFont.java
  class AppFont (line 16) | public class AppFont {
    method init (line 18) | public static void init() {

FILE: app/src/main/java/io/xpipe/app/core/AppFontSizes.java
  class AppFontSizes (line 15) | @Value
    method xs (line 41) | public static void xs(Node node) {
    method sm (line 45) | public static void sm(Node node) {
    method base (line 49) | public static void base(Node node) {
    method lg (line 53) | public static void lg(Node node) {
    method xl (line 57) | public static void xl(Node node) {
    method xxl (line 61) | public static void xxl(Node node) {
    method xxxl (line 65) | public static void xxxl(Node node) {
    method title (line 69) | public static void title(Node node) {
    method apply (line 73) | public static void apply(Node node, Function<AppFontSizes, String> fun...
    method setFont (line 97) | private static void setFont(Node node, String fontSize) {
    method ofBase (line 104) | public static AppFontSizes ofBase(String base) {
    method fallbackFontSize (line 117) | private static AppFontSizes fallbackFontSize(AppFontSizes s) {
    method forOs (line 129) | public static AppFontSizes forOs(AppFontSizes windows, AppFontSizes li...
    method getDefault (line 140) | public static AppFontSizes getDefault() {

FILE: app/src/main/java/io/xpipe/app/core/AppGreetingsDialog.java
  class AppGreetingsDialog (line 20) | public class AppGreetingsDialog {
    method createIntroduction (line 22) | public static TitledPane createIntroduction() {
    method createEula (line 37) | private static TitledPane createEula() {
    method showAndWaitIfNeeded (line 52) | public static void showAndWaitIfNeeded() {

FILE: app/src/main/java/io/xpipe/app/core/AppI18n.java
  class AppI18n (line 18) | public class AppI18n {
    method AppI18n (line 26) | public AppI18n() {
    method activeLanguage (line 32) | public static ObservableValue<SupportedLocale> activeLanguage() {
    method init (line 40) | public static void init() throws Exception {
    method get (line 47) | public static AppI18n get() {
    method observable (line 51) | public static ObservableValue<String> observable(String s, Object... v...
    method observable (line 55) | public static ObservableValue<String> observable(ObservableValue<Strin...
    method get (line 59) | public static String get(String s, Object... vars) {
    method observableImpl (line 63) | private ObservableValue<String> observableImpl(String s, Object... var...
    method load (line 96) | private void load() throws Exception {
    method getKey (line 127) | private String getKey(String s) {
    method getLocalised (line 135) | private String getLocalised(String s, Object... vars) {
    method getMarkdownTranslation (line 159) | public String getMarkdownTranslation(String name) {

FILE: app/src/main/java/io/xpipe/app/core/AppI18nData.java
  class AppI18nData (line 23) | @Value
    method load (line 32) | static AppI18nData load(SupportedLocale l) throws Exception {
    method matchesLocale (line 111) | private static boolean matchesLocale(Path f, SupportedLocale l) {
    method getLocalised (line 117) | Optional<String> getLocalised(String s, Object... vars) {
    method getValue (line 125) | private String getValue(String s, Object... vars) {

FILE: app/src/main/java/io/xpipe/app/core/AppImages.java
  class AppImages (line 22) | public class AppImages {
    method remove (line 27) | public static void remove(Predicate<String> filter) {
    method init (line 31) | public static void init() {
    method loadBundledProviderIcons (line 39) | private static void loadBundledProviderIcons() {
    method loadOsIcons (line 64) | private static void loadOsIcons() {
    method loadWelcomeImages (line 82) | private static void loadWelcomeImages() {
    method loadLogos (line 100) | private static void loadLogos() {
    method loadMiscImages (line 114) | private static void loadMiscImages() {
    method hasImage (line 121) | public static boolean hasImage(String file) {
    method image (line 138) | public static Image image(String file) {
    method toAwtImage (line 156) | public static BufferedImage toAwtImage(Image fxImage) {
    method loadImage (line 168) | public static void loadImage(Path p, String key) {
    method loadImage (line 176) | public static Image loadImage(Path p) {

FILE: app/src/main/java/io/xpipe/app/core/AppInstallation.java
  class AppInstallation (line 9) | public abstract class AppInstallation {
    method AppInstallation (line 28) | private AppInstallation(Path base) {
    method ofCurrent (line 32) | public static AppInstallation ofCurrent() {
    method ofDefault (line 40) | public static AppInstallation ofDefault() {
    method ofDefault (line 44) | public static AppInstallation ofDefault(boolean stage) {
    method determineDefaultInstallationBasePath (line 53) | private static Path determineDefaultInstallationBasePath(boolean stage) {
    method determineCurrentInstallationBasePath (line 74) | private static Path determineCurrentInstallationBasePath() {
    method getInstallationBasePathForDaemonExecutable (line 113) | private static Path getInstallationBasePathForDaemonExecutable(Path ex...
    method getInstallationBasePathForJavaExecutable (line 128) | private static Path getInstallationBasePathForJavaExecutable(Path exec...
    method toRealPathIfPossible (line 149) | private static Path toRealPathIfPossible(Path p) {
    method getBaseInstallationPath (line 159) | public Path getBaseInstallationPath() {
    method getDaemonDebugScriptPath (line 163) | public abstract Path getDaemonDebugScriptPath();
    method getLangPath (line 165) | public abstract Path getLangPath();
    method getCliExecutablePath (line 167) | public abstract Path getCliExecutablePath();
    method getDaemonExecutablePath (line 169) | public abstract Path getDaemonExecutablePath();
    method getExtensionsPath (line 171) | public abstract Path getExtensionsPath();
    method getLogoPath (line 173) | public abstract Path getLogoPath();
    class Windows (line 175) | public static class Windows extends AppInstallation {
      method Windows (line 177) | private Windows(Path base) {
      method getDaemonDebugScriptPath (line 181) | @Override
      method getLangPath (line 187) | @Override
      method getCliExecutablePath (line 192) | @Override
      method getDaemonExecutablePath (line 197) | @Override
      method getExtensionsPath (line 202) | @Override
      method getLogoPath (line 207) | @Override
    class WindowsDev (line 213) | public static class WindowsDev extends Windows {
      method WindowsDev (line 217) | private WindowsDev(Path base, Path devBase) {
      method getLangPath (line 222) | @Override
      method getLogoPath (line 227) | @Override
    class Linux (line 233) | public static class Linux extends AppInstallation {
      method Linux (line 235) | private Linux(Path base) {
      method getDaemonDebugScriptPath (line 239) | @Override
      method getLangPath (line 245) | @Override
      method getCliExecutablePath (line 250) | @Override
      method getDaemonExecutablePath (line 255) | @Override
      method getExtensionsPath (line 260) | @Override
      method getLogoPath (line 265) | @Override
    class LinuxDev (line 275) | public static class LinuxDev extends Linux {
      method LinuxDev (line 279) | private LinuxDev(Path base, Path devBase) {
      method getLangPath (line 284) | @Override
    class MacOs (line 290) | public static class MacOs extends AppInstallation {
      method MacOs (line 292) | private MacOs(Path base) {
      method getDaemonDebugScriptPath (line 296) | @Override
      method getLangPath (line 306) | @Override
      method getCliExecutablePath (line 315) | @Override
      method getDaemonExecutablePath (line 320) | @Override
      method getExtensionsPath (line 326) | @Override
      method getLogoPath (line 331) | @Override
    class MacOsDev (line 344) | public static class MacOsDev extends MacOs {
      method MacOsDev (line 348) | private MacOsDev(Path base, Path devBase) {
      method getLangPath (line 353) | @Override
      method getLogoPath (line 358) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppInstance.java
  class AppInstance (line 19) | public class AppInstance {
    method init (line 21) | public static void init() {
    method tryEstablishConnection (line 25) | public static Optional<BeaconClient> tryEstablishConnection(int port) {
    method checkStart (line 35) | private static void checkStart(int attemptCounter) {

FILE: app/src/main/java/io/xpipe/app/core/AppLayoutModel.java
  class AppLayoutModel (line 34) | @Getter
    method AppLayoutModel (line 49) | public AppLayoutModel(SavedState savedState) {
    method get (line 56) | public static AppLayoutModel get() {
    method init (line 60) | public static void init() {
    method reset (line 65) | public static void reset() {
    method showQueueEntry (line 74) | public synchronized void showQueueEntry(QueueEntry entry, Duration dur...
    method selectBrowser (line 91) | public void selectBrowser() {
    method selectSettings (line 97) | public void selectSettings() {
    method selectLicense (line 103) | public void selectLicense() {
    method selectConnections (line 109) | public void selectConnections() {
    method createEntryList (line 115) | private List<Entry> createEntryList() {
    class SavedState (line 172) | @Data
    class QueueEntry (line 188) | @Value
      method ofNotification (line 192) | public static QueueEntry ofNotification(String key, String value) {
      method execute (line 200) | public void execute() {
      method executeSync (line 206) | public void executeSync() {
      method hide (line 222) | public void hide() {

FILE: app/src/main/java/io/xpipe/app/core/AppLocalTemp.java
  class AppLocalTemp (line 11) | public class AppLocalTemp {
    method getLocalTempDataDirectory (line 13) | public static Path getLocalTempDataDirectory() {
    method getLocalTempDataDirectory (line 48) | public static Path getLocalTempDataDirectory(String sub) {

FILE: app/src/main/java/io/xpipe/app/core/AppLogs.java
  class AppLogs (line 31) | public class AppLogs {
    method AppLogs (line 61) | public AppLogs(
    method init (line 77) | public static void init() {
    method teardown (line 145) | public static void teardown() {
    method get (line 154) | public static AppLogs get() {
    method flush (line 158) | public void flush() {
    method close (line 164) | private void close() {
    method hookUpSystemOut (line 170) | private void hookUpSystemOut() {
    method hookUpSystemErr (line 191) | private void hookUpSystemErr() {
    method logException (line 212) | public void logException(String description, Throwable e) {
    method logEvent (line 221) | public synchronized void logEvent(TrackEvent event) {
    method logSysOut (line 235) | private synchronized void logSysOut(TrackEvent event) {
    method logToFile (line 244) | private void logToFile(TrackEvent event) {
    method setLogLevels (line 253) | private void setLogLevels() {
    method getSessionLogsDirectory (line 266) | public Path getSessionLogsDirectory() {
    class Slf4jProvider (line 270) | public static final class Slf4jProvider implements SLF4JServiceProvider {
      method getLogger (line 278) | public Logger getLogger(String name) {
      method getLoggerFactory (line 293) | @Override
      method getMarkerFactory (line 298) | @Override
      method getMDCAdapter (line 303) | @Override
      method getRequestedApiVersion (line 308) | @Override
      method initialize (line 313) | @Override
    class Slf4jLogger (line 317) | public static final class Slf4jLogger extends AbstractLogger {
      method getFullyQualifiedCallerName (line 319) | @Override
      method handleNormalizedLoggingCall (line 324) | @Override
      method isTraceEnabled (line 339) | @Override
      method isTraceEnabled (line 347) | @Override
      method isDebugEnabled (line 355) | @Override
      method isDebugEnabled (line 361) | @Override
      method isInfoEnabled (line 367) | @Override
      method isInfoEnabled (line 373) | @Override
      method isWarnEnabled (line 379) | @Override
      method isWarnEnabled (line 385) | @Override
      method isErrorEnabled (line 391) | @Override
      method isErrorEnabled (line 397) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppNames.java
  class AppNames (line 3) | public abstract class AppNames {
    method ofMain (line 5) | public static AppNames ofMain() {
    method ofCurrent (line 9) | public static AppNames ofCurrent() {
    method propertyName (line 17) | public static String propertyName(String name) {
    method packageName (line 21) | public static String packageName() {
    method packageName (line 25) | public static String packageName(String name) {
    method extModuleName (line 29) | public static String extModuleName(String name) {
    method getName (line 33) | public abstract String getName();
    method getKebapName (line 35) | public abstract String getKebapName();
    method getSnakeName (line 37) | public abstract String getSnakeName();
    method getUppercaseName (line 39) | public abstract String getUppercaseName();
    method getGroupName (line 41) | public abstract String getGroupName();
    method getExecutableName (line 43) | public abstract String getExecutableName();
    class Main (line 45) | private static class Main extends AppNames {
      method getName (line 47) | @Override
      method getKebapName (line 52) | @Override
      method getSnakeName (line 57) | @Override
      method getUppercaseName (line 62) | @Override
      method getGroupName (line 67) | @Override
      method getExecutableName (line 72) | @Override
    class Ptb (line 78) | private static class Ptb extends AppNames {
      method getName (line 80) | @Override
      method getKebapName (line 85) | @Override
      method getSnakeName (line 90) | @Override
      method getUppercaseName (line 95) | @Override
      method getGroupName (line 100) | @Override
      method getExecutableName (line 105) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppOpenArguments.java
  class AppOpenArguments (line 20) | public class AppOpenArguments {
    method init (line 24) | public static synchronized void init() {
    method handle (line 30) | public static synchronized void handle(List<String> arguments) {
    method handleImpl (line 44) | private static synchronized void handleImpl(List<String> arguments) {
    method parseActions (line 71) | public static List<? extends AbstractAction> parseActions(String input) {

FILE: app/src/main/java/io/xpipe/app/core/AppPreloader.java
  class AppPreloader (line 12) | @Getter
    method start (line 15) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppProperties.java
  class AppProperties (line 15) | @Value
    method AppProperties (line 57) | public AppProperties(String[] args) {
    method isJUnitTest (line 181) | private static boolean isJUnitTest() {
    method init (line 190) | public static void init() {
    method init (line 194) | public static void init(String[] args) {
    method get (line 202) | public static AppProperties get() {
    method resetInitialLaunch (line 206) | public void resetInitialLaunch() {
    method logArguments (line 210) | public void logArguments() {
    method isDevelopmentEnvironment (line 231) | public boolean isDevelopmentEnvironment() {
    method getCanonicalVersion (line 235) | public Optional<AppVersion> getCanonicalVersion() {

FILE: app/src/main/java/io/xpipe/app/core/AppResources.java
  class AppResources (line 18) | public class AppResources {
    method reset (line 24) | public static void reset() {
    method openFileSystemIfNeeded (line 40) | private static ModuleFileSystem openFileSystemIfNeeded(String module) ...
    method getResourceURL (line 74) | public static Optional<URL> getResourceURL(String module, String file) {
    method with (line 86) | public static void with(String module, String file, FailableConsumer<P...
    method withResource (line 97) | private static void withResource(String module, String file, FailableC...
    method withLocalDevResource (line 110) | private static boolean withLocalDevResource(String module, String file...

FILE: app/src/main/java/io/xpipe/app/core/AppRestart.java
  class AppRestart (line 14) | public class AppRestart {
    method createTerminalLaunchCommand (line 16) | private static String createTerminalLaunchCommand(List<String> argumen...
    method createBackgroundLaunchCommand (line 44) | private static String createBackgroundLaunchCommand(List<String> argum...
    method getBackgroundRestartCommand (line 71) | public static String getBackgroundRestartCommand(Path dataDir, String ...
    method getBackgroundRestartCommand (line 85) | public static String getBackgroundRestartCommand() {
    method getTerminalRestartCommand (line 89) | public static String getTerminalRestartCommand(ShellDialect dialect) {
    method getTerminalRestartCommand (line 101) | public static String getTerminalRestartCommand() {
    method restart (line 105) | public static void restart() {
    method restart (line 113) | public static void restart(Path dataDir) {

FILE: app/src/main/java/io/xpipe/app/core/AppSid.java
  class AppSid (line 12) | public class AppSid {
    method init (line 17) | public static void init() {

FILE: app/src/main/java/io/xpipe/app/core/AppStyle.java
  class AppStyle (line 20) | public class AppStyle {
    method init (line 28) | public static void init() {
    method add (line 51) | private static void add(Scene scene, String stylesheet) {
    method loadStylesheets (line 57) | private static void loadStylesheets() {
    method changeFontUsage (line 114) | private static void changeFontUsage(boolean use) {
    method changePlatformPreferences (line 126) | private static void changePlatformPreferences() {
    method changeTheme (line 149) | private static void changeTheme(AppTheme.Theme theme) {
    method reloadStylesheets (line 158) | public static void reloadStylesheets(Scene scene) {
    method addStylesheets (line 169) | public static void addStylesheets(Scene scene) {

FILE: app/src/main/java/io/xpipe/app/core/AppSystemInfo.java
  class AppSystemInfo (line 14) | public abstract class AppSystemInfo {
    method ofCurrent (line 20) | public static AppSystemInfo ofCurrent() {
    method ofWindows (line 28) | public static Windows ofWindows() {
    method ofLinux (line 36) | public static Linux ofLinux() {
    method ofMacOs (line 44) | public static MacOs ofMacOs() {
    method parsePath (line 52) | private static Path parsePath(String path) {
    method getUserHome (line 64) | public abstract Path getUserHome();
    method getDownloads (line 66) | public abstract Path getDownloads();
    method getDesktop (line 68) | public abstract Path getDesktop();
    method getTemp (line 70) | public abstract Path getTemp();
    method getUser (line 72) | public abstract String getUser();
    class Windows (line 74) | public static final class Windows extends AppSystemInfo {
      method getSystemRoot (line 84) | public Path getSystemRoot() {
      method getTemp (line 92) | public Path getTemp() {
      method getUser (line 119) | @Override
      method getProgramFiles (line 131) | public Path getProgramFiles() {
      method getLocalAppData (line 141) | public Path getLocalAppData() {
      method getRoamingAppData (line 160) | public Path getRoamingAppData() {
      method getUserHome (line 179) | public Path getUserHome() {
      method getDownloads (line 208) | @Override
      method getDocuments (line 225) | public Path getDocuments() {
      method getDesktop (line 241) | @Override
    class Linux (line 259) | public static class Linux extends AppSystemInfo {
      method isDebianBased (line 265) | public boolean isDebianBased() {
      method isVirtualMachine (line 269) | public boolean isVirtualMachine() {
      method getUser (line 279) | @Override
      method getUserHome (line 296) | @Override
      method getDownloads (line 321) | @Override
      method getDesktop (line 340) | @Override
      method getTemp (line 359) | @Override
    class MacOs (line 365) | public static class MacOs extends AppSystemInfo {
      method getUser (line 367) | @Override
      method getUserHome (line 376) | @Override
      method getDownloads (line 381) | @Override
      method getDesktop (line 386) | @Override
      method getTemp (line 391) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppTheme.java
  class AppTheme (line 42) | public class AppTheme {
    method initThemeHandlers (line 50) | public static void initThemeHandlers(Stage stage) {
    method applyClasses (line 94) | private static void applyClasses(Node r, Theme t, boolean perf) {
    method init (line 116) | public static void init() {
    method updateThemeToThemeName (line 174) | private static void updateThemeToThemeName(Object oldName, Object newN...
    method isDarkMode (line 188) | private static boolean isDarkMode() {
    method updateThemeToColorScheme (line 198) | private static void updateThemeToColorScheme(ColorScheme colorScheme) {
    method reset (line 213) | public static void reset() {
    method setDefault (line 224) | private static void setDefault() {
    method changeTheme (line 241) | private static void changeTheme(Theme newTheme) {
    class DerivedTheme (line 292) | public static class DerivedTheme extends Theme {
      method DerivedTheme (line 297) | public DerivedTheme(
      method apply (line 323) | @Override
      method toTranslatedString (line 342) | @Override
    class Theme (line 348) | @AllArgsConstructor
      method getDefaultLightTheme (line 526) | static Theme getDefaultLightTheme() {
      method getDefaultDarkTheme (line 534) | static Theme getDefaultDarkTheme() {
      method isDark (line 542) | public boolean isDark() {
      method apply (line 546) | public void apply() {
      method getPlatformPreferencesStylesheet (line 550) | protected String getPlatformPreferencesStylesheet() {
      method toTranslatedString (line 569) | @Override
      method getId (line 574) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppTray.java
  class AppTray (line 15) | public class AppTray {
    method AppTray (line 23) | @SneakyThrows
    method init (line 29) | public static void init() {
    method get (line 33) | public static AppTray get() {
    method show (line 37) | @SneakyThrows
    method hide (line 47) | public void hide() {
    class TrayErrorHandler (line 51) | private class TrayErrorHandler implements ErrorHandler {
      method handle (line 55) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppTrayIcon.java
  class AppTrayIcon (line 12) | public class AppTrayIcon {
    method AppTrayIcon (line 17) | public AppTrayIcon() {
    method loadImageFromURL (line 62) | private static Image loadImageFromURL(URL iconImagePath) {
    method ensureSystemTraySupported (line 71) | private void ensureSystemTraySupported() {
    method show (line 78) | public void show() {
    method hide (line 91) | public void hide() {
    method showErrorMessage (line 97) | public void showErrorMessage(String title, String message) {
    method showMacAlert (line 105) | private void showMacAlert(String subTitle, String message, String titl...

FILE: app/src/main/java/io/xpipe/app/core/AppVersion.java
  class AppVersion (line 8) | @Value
    method parse (line 15) | public static Optional<AppVersion> parse(String version) {
    method toString (line 30) | public String toString() {
    method greaterThan (line 34) | public boolean greaterThan(AppVersion other) {
    method compareTo (line 38) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppWindowsLock.java
  class AppWindowsLock (line 15) | public class AppWindowsLock {
    method registerHook (line 22) | public static void registerHook(WinDef.HWND hwnd) {
    method unregisterHook (line 38) | public static void unregisterHook(WinDef.HWND hwnd) {
    type WinMsgProc (line 58) | public interface WinMsgProc extends StdCallLibrary.StdCallCallback {
      method callback (line 60) | @SuppressWarnings("unused")
    class WinLockMsgProc (line 64) | @Setter
      method callback (line 70) | @Override

FILE: app/src/main/java/io/xpipe/app/core/AppWindowsShutdown.java
  class AppWindowsShutdown (line 18) | public class AppWindowsShutdown {
    method registerHook (line 28) | public static void registerHook(WinDef.HWND hwnd) {
    method unregisterHook (line 42) | public static void unregisterHook(WinDef.HWND hwnd) {
    type WinHookProc (line 61) | public interface WinHookProc extends WinUser.HOOKPROC {
      method callback (line 63) | @SuppressWarnings("unused")
    class CWPSSTRUCT (line 67) | @SuppressWarnings("unused")
      method getFieldOrder (line 74) | @Override
    class WinShutdownHookProc (line 80) | @Setter
      method callback (line 87) | @Override

FILE: app/src/main/java/io/xpipe/app/core/check/AppAndroidLinuxTerminalCheck.java
  class AppAndroidLinuxTerminalCheck (line 8) | public class AppAndroidLinuxTerminalCheck {
    method check (line 10) | public static void check() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java
  class AppAvCheck (line 22) | public class AppAvCheck {
    method detect (line 24) | private static Optional<AvType> detect() {
    method check (line 33) | public static void check() {
    type AvType (line 78) | @Getter
      method getDescription (line 81) | @Override
      method isActive (line 87) | @Override
      method getDescription (line 94) | @Override
      method isActive (line 101) | @Override
      method getDescription (line 108) | @Override
      method isActive (line 114) | @Override
      method AvType (line 123) | AvType(String name) {
      method getDescription (line 127) | public abstract String getDescription();
      method isActive (line 129) | public abstract boolean isActive();

FILE: app/src/main/java/io/xpipe/app/core/check/AppDebugModeCheck.java
  class AppDebugModeCheck (line 7) | public class AppDebugModeCheck {
    method printIfNeeded (line 9) | public static void printIfNeeded() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java
  class AppDirectoryPermissionsCheck (line 12) | public class AppDirectoryPermissionsCheck {
    method checkDirectory (line 14) | public static void checkDirectory(Path dataDirectory) {

FILE: app/src/main/java/io/xpipe/app/core/check/AppGpuCheck.java
  class AppGpuCheck (line 10) | public class AppGpuCheck {
    method check (line 12) | public static void check() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppJavaOptionsCheck.java
  class AppJavaOptionsCheck (line 7) | public class AppJavaOptionsCheck {
    method check (line 9) | public static void check() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppPathCorruptCheck.java
  class AppPathCorruptCheck (line 7) | public class AppPathCorruptCheck {
    method check (line 9) | public static void check() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppPtbDialog.java
  class AppPtbDialog (line 8) | public class AppPtbDialog {
    method showIfNeeded (line 10) | public static void showIfNeeded() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java
  class AppRosettaCheck (line 9) | public class AppRosettaCheck {
    method check (line 11) | public static void check() throws Exception {

FILE: app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java
  class AppShellCheck (line 6) | public class AppShellCheck {
    method check (line 8) | public static void check() throws Exception {

FILE: app/src/main/java/io/xpipe/app/core/check/AppShellChecker.java
  class AppShellChecker (line 18) | public abstract class AppShellChecker {
    method check (line 20) | public void check() throws Exception {
    method createFallbackAction (line 76) | private ErrorAction createFallbackAction(BooleanProperty set, ShellDia...
    method shouldAttemptFallbackForProcessStartFail (line 96) | protected boolean shouldAttemptFallbackForProcessStartFail() {
    method modifyOutput (line 100) | protected String modifyOutput(String output) {
    method formatMessage (line 104) | private String formatMessage(String output) {
    method fallBackInstantly (line 123) | protected abstract boolean fallBackInstantly();
    method toggleFallback (line 125) | private void toggleFallback() throws Exception {
    method selfTestErrorCheck (line 131) | private Optional<FailureResult> selfTestErrorCheck() {
    class FailureResult (line 152) | @Value

FILE: app/src/main/java/io/xpipe/app/core/check/AppSystemFontCheck.java
  class AppSystemFontCheck (line 8) | public class AppSystemFontCheck {
    method init (line 10) | public static void init() {
    method hasFonts (line 28) | private static boolean hasFonts() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppTestCommandCheck.java
  class AppTestCommandCheck (line 10) | public class AppTestCommandCheck {
    method check (line 12) | public static void check() throws Exception {

FILE: app/src/main/java/io/xpipe/app/core/check/AppWindowsArmCheck.java
  class AppWindowsArmCheck (line 8) | public class AppWindowsArmCheck {
    method check (line 10) | public static void check() {

FILE: app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java
  class AppWindowsTempCheck (line 12) | public class AppWindowsTempCheck {
    method checkTemp (line 14) | private static void checkTemp(String tmpdir) {
    method check (line 32) | public static void check() {

FILE: app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java
  class AppBaseMode (line 40) | public class AppBaseMode extends AppOperationMode {
    method isSupported (line 44) | @Override
    method getId (line 49) | @Override
    method onSwitchTo (line 54) | @Override
    method onSwitchFrom (line 193) | @Override
    method finalTeardown (line 196) | @Override

FILE: app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java
  class AppGuiMode (line 12) | public class AppGuiMode extends AppOperationMode {
    method isSupported (line 14) | @Override
    method getId (line 21) | @Override
    method onSwitchFrom (line 26) | @Override
    method onSwitchTo (line 40) | @Override
    method finalTeardown (line 55) | @Override

FILE: app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java
  class AppOperationMode (line 29) | public abstract class AppOperationMode {
    method map (line 48) | public static AppOperationMode map(XPipeDaemonMode mode) {
    method externalShutdown (line 56) | public static void externalShutdown() {
    method setup (line 67) | private static void setup(String[] args) {
    method getStartupMode (line 137) | public static XPipeDaemonMode getStartupMode() {
    method init (line 164) | public static void init(String[] args) {
    method switchToAsync (line 192) | public static void switchToAsync(AppOperationMode newMode) {
    method switchToSyncOrThrow (line 199) | public static void switchToSyncOrThrow(AppOperationMode newMode) throw...
    method switchToSyncIfPossible (line 211) | public static boolean switchToSyncIfPossible(AppOperationMode newMode) {
    method close (line 230) | public static void close() {
    method getAll (line 234) | public static List<AppOperationMode> getAll() {
    method executeAfterShutdown (line 238) | public static void executeAfterShutdown(FailableRunnable<Exception> r) {
    method halt (line 274) | public static void halt(int code) {
    method onWindowClose (line 282) | public static void onWindowClose() {
    method shutdown (line 294) | @SneakyThrows
    method set (line 336) | private static synchronized void set(AppOperationMode newMode) {
    method get (line 374) | public static AppOperationMode get() {
    method isSupported (line 378) | public abstract boolean isSupported();
    method getId (line 380) | public abstract String getId();
    method onSwitchTo (line 382) | public abstract void onSwitchTo() throws Throwable;
    method onSwitchFrom (line 384) | public abstract void onSwitchFrom();
    method finalTeardown (line 386) | public abstract void finalTeardown() throws Throwable;
    method getErrorHandler (line 388) | public ErrorHandler getErrorHandler() {

FILE: app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java
  class AppTrayMode (line 11) | public class AppTrayMode extends AppOperationMode {
    method isSupported (line 13) | @Override
    method onSwitchTo (line 18) | @Override
    method getId (line 34) | @Override
    method onSwitchFrom (line 39) | @Override
    method getErrorHandler (line 47) | @Override
    method finalTeardown (line 60) | @Override

FILE: app/src/main/java/io/xpipe/app/core/window/AppDialog.java
  class AppDialog (line 27) | public class AppDialog {
    method getCurrentModalOverlay (line 32) | public static Optional<ModalOverlay> getCurrentModalOverlay() {
    method closeDialog (line 40) | public static void closeDialog(ModalOverlay overlay) {
    method waitForAllDialogsClose (line 48) | public static void waitForAllDialogsClose() {
    method waitForDialogClose (line 54) | private static void waitForDialogClose(ModalOverlay overlay) {
    method show (line 60) | public static void show(ModalOverlay o) {
    method hide (line 64) | public static void hide(ModalOverlay o) {
    method showAndWait (line 70) | public static void showAndWait(ModalOverlay o) {
    method show (line 74) | public static void show(ModalOverlay o, boolean wait) {
    method dialogTextKey (line 117) | public static BaseRegionBuilder<?, ?> dialogTextKey(String s) {
    method dialogText (line 121) | public static BaseRegionBuilder<?, ?> dialogText(String s) {
    method dialogText (line 132) | public static BaseRegionBuilder<?, ?> dialogText(ObservableValue<Strin...
    method confirm (line 144) | public static boolean confirm(String translationKey) {
    method confirm (line 154) | public static boolean confirm(String titleKey, ObservableValue<String>...

FILE: app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java
  class AppMainWindow (line 40) | public class AppMainWindow {
    method AppMainWindow (line 57) | private AppMainWindow(Stage stage) {
    method init (line 61) | public static void init(boolean show) {
    method postInit (line 73) | public static void postInit() {
    method initEmpty (line 85) | private static synchronized void initEmpty(boolean show) {
    method loadingText (line 142) | public static void loadingText(String key) {
    method initContent (line 146) | public static synchronized void initContent() {
    method resetContent (line 160) | public static synchronized void resetContent() {
    method get (line 167) | public static AppMainWindow get() {
    method show (line 171) | public void show() {
    method focus (line 196) | public void focus() {
    method onChange (line 212) | private synchronized void onChange() {
    method logChange (line 229) | private void logChange() {
    method initializeWindow (line 240) | private void initializeWindow(WindowState state) {
    method setupListeners (line 253) | private void setupListeners() {
    method applyState (line 352) | private void applyState(WindowState state) {
    method setDefaultSize (line 370) | private void setDefaultSize() {
    method saveState (line 398) | private void saveState() {
    method loadState (line 417) | private WindowState loadState() {
    class WindowState (line 450) | @Builder

FILE: app/src/main/java/io/xpipe/app/core/window/AppModifiedStage.java
  class AppModifiedStage (line 25) | public class AppModifiedStage extends Stage {
    method mergeFrame (line 27) | public static boolean mergeFrame() {
    method init (line 31) | public static void init() {
    method prepareStage (line 45) | public static void prepareStage(Stage stage) {
    method hookUpStage (line 51) | private static void hookUpStage(Stage stage) {
    method applyModes (line 81) | @SneakyThrows
    method updateStage (line 149) | private static void updateStage(Stage stage) {

FILE: app/src/main/java/io/xpipe/app/core/window/AppSideWindow.java
  class AppSideWindow (line 21) | public class AppSideWindow {
    method showBlockingAlert (line 23) | public static Optional<ButtonType> showBlockingAlert(Consumer<Alert> c) {
    method createEmptyAlert (line 84) | public static Alert createEmptyAlert() {

FILE: app/src/main/java/io/xpipe/app/core/window/AppWindowBounds.java
  class AppWindowBounds (line 14) | public class AppWindowBounds {
    method fixInvalidStagePosition (line 16) | public static void fixInvalidStagePosition(Stage stage) {
    method clampWindow (line 54) | public static Optional<Rectangle2D> clampWindow(Stage stage) {
    method areNumbersValid (line 113) | private static boolean areNumbersValid(double... args) {
    method getWindowScreens (line 117) | private static List<Screen> getWindowScreens(Stage stage) {
    method computeWindowScreenBounds (line 128) | private static Rectangle2D computeWindowScreenBounds(Stage stage) {

FILE: app/src/main/java/io/xpipe/app/core/window/AppWindowStyle.java
  class AppWindowStyle (line 20) | public class AppWindowStyle {
    method addMaximizedPseudoClass (line 22) | public static void addMaximizedPseudoClass(Stage stage) {
    method addFontSize (line 30) | public static void addFontSize(Stage stage) {
    method addNavigationPseudoClasses (line 36) | public static void addNavigationPseudoClasses(Scene scene) {
    method addIcons (line 73) | public static void addIcons(Stage stage) {
    method addStylesheets (line 89) | public static void addStylesheets(Scene scene) {
    method addClickShield (line 103) | public static void addClickShield(Stage stage) {

FILE: app/src/main/java/io/xpipe/app/core/window/AppWindowTitle.java
  class AppWindowTitle (line 14) | public class AppWindowTitle {
    method init (line 19) | public static void init() {
    method createTitle (line 40) | private static String createTitle() {

FILE: app/src/main/java/io/xpipe/app/ext/CloudSetupProvider.java
  type CloudSetupProvider (line 8) | public interface CloudSetupProvider {
    method byId (line 12) | static Optional<CloudSetupProvider> byId(String id) {
    method getId (line 16) | String getId();
    method getNameKey (line 18) | String getNameKey();
    method getGraphic (line 20) | LabelGraphic getGraphic();
    method getScan (line 22) | ScanProvider getScan();
    method handleUnsupported (line 24) | default void handleUnsupported() {}
    class Loader (line 26) | class Loader implements ModuleLayerLoader {
      method init (line 28) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/ConnectionFileSystem.java
  class ConnectionFileSystem (line 25) | @Getter
    method ConnectionFileSystem (line 31) | public ConnectionFileSystem(ShellControl shellControl) {
    method writeInstantIfPossible (line 35) | @Override
    method readInstantIfPossible (line 41) | @Override
    method getSuffix (line 47) | @Override
    method isRunning (line 52) | @Override
    method supportsLinkCreation (line 57) | @Override
    method supportsOwnerColumn (line 62) | @Override
    method supportsModeColumn (line 67) | @Override
    method supportsDirectorySizes (line 72) | @Override
    method supportsChmod (line 77) | @Override
    method supportsChown (line 82) | @Override
    method supportsChgrp (line 87) | @Override
    method supportsTerminalOpen (line 92) | @Override
    method supportsTerminalWorkingDirectory (line 97) | @Override
    method getRawShellControl (line 102) | @Override
    method getTerminalShellControl (line 107) | @Override
    method chmod (line 112) | @Override
    method chown (line 123) | @Override
    method chgrp (line 134) | @Override
    method kill (line 145) | @Override
    method cd (line 150) | @Override
    method requiresReinit (line 155) | @Override
    method reinitIfNeeded (line 160) | @Override
    method getFileSeparator (line 168) | @Override
    method makeFileSystemCompatible (line 173) | @Override
    method pwd (line 178) | @Override
    method createTransferOptimizedFileSystem (line 183) | @Override
    method getFileSize (line 209) | @Override
    method getDirectorySize (line 217) | @Override
    method getShell (line 222) | @Override
    method open (line 227) | @Override
    method openInput (line 255) | @Override
    method openOutput (line 267) | @Override
    method fileExists (line 278) | @Override
    method delete (line 288) | @Override
    method copy (line 298) | @Override
    method move (line 308) | @Override
    method mkdirs (line 318) | @Override
    method touch (line 328) | @Override
    method symbolicLink (line 338) | @Override
    method directoryExists (line 348) | @Override
    method directoryAccessible (line 356) | @Override
    method getFileInfo (line 368) | @Override
    method listFiles (line 376) | @Override
    method listRoots (line 381) | @Override
    method listCommonDirectories (line 390) | @Override
    method close (line 423) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/ContainerImageStore.java
  type ContainerImageStore (line 3) | public interface ContainerImageStore {
    method getImageName (line 5) | @SuppressWarnings("unused")

FILE: app/src/main/java/io/xpipe/app/ext/ContainerStoreState.java
  class ContainerStoreState (line 12) | @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    method mergeCopy (line 23) | @Override
    method mergeBuilder (line 31) | protected void mergeBuilder(ContainerStoreState css, ContainerStoreSta...

FILE: app/src/main/java/io/xpipe/app/ext/CountGroupStoreProvider.java
  type CountGroupStoreProvider (line 9) | public interface CountGroupStoreProvider extends DataStoreProvider {
    method includeInConnectionCount (line 11) | @Override
    method informationString (line 16) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/DataStorageExtensionProvider.java
  class DataStorageExtensionProvider (line 10) | public abstract class DataStorageExtensionProvider {
    method getAll (line 14) | public static List<DataStorageExtensionProvider> getAll() {
    method storageInit (line 18) | public void storageInit() {}
    class Loader (line 20) | public static class Loader implements ModuleLayerLoader {
      method init (line 22) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/DataStore.java
  type DataStore (line 5) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
    method isComplete (line 8) | default boolean isComplete() {
    method checkComplete (line 17) | default void checkComplete() throws Throwable {}
    method asNeeded (line 22) | @SuppressWarnings("unchecked")

FILE: app/src/main/java/io/xpipe/app/ext/DataStoreCreationCategory.java
  type DataStoreCreationCategory (line 10) | @AllArgsConstructor

FILE: app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java
  type DataStoreProvider (line 28) | public interface DataStoreProvider {
    method showIncompleteInfo (line 30) | default boolean showIncompleteInfo() {
    method includeInConnectionCount (line 34) | default boolean includeInConnectionCount() {
    method canConfigure (line 38) | default boolean canConfigure() {
    method getHelpLink (line 43) | default DocumentationLink getHelpLink() {
    method canMoveCategories (line 47) | default boolean canMoveCategories() {
    method getTargetCategory (line 51) | default UUID getTargetCategory(DataStore store, UUID target) {
    method getOrderPriority (line 55) | default int getOrderPriority() {
    method showProviderChoice (line 59) | default boolean showProviderChoice() {
    method shouldShow (line 63) | default boolean shouldShow(StoreEntryWrapper w) {
    method getComparator (line 67) | default Comparator<StoreSection> getComparator() {
    method onParentRefresh (line 71) | default void onParentRefresh(DataStoreEntry entry) {}
    method onChildrenRefresh (line 73) | default void onChildrenRefresh(DataStoreEntry entry) {}
    method busy (line 75) | default ObservableBooleanValue busy(StoreEntryWrapper wrapper) {
    method validate (line 79) | default void validate() {
    method activateAction (line 85) | default FailableRunnable<Exception> activateAction(DataStoreEntry stor...
    method launch (line 89) | default FailableRunnable<Exception> launch(DataStoreEntry store) {
    method launchBrowser (line 93) | default FailableRunnable<Exception> launchBrowser(
    method displayName (line 98) | default String displayName(DataStoreEntry entry) {
    method getSearchableTerms (line 102) | default List<String> getSearchableTerms(DataStore store) {
    method customEntryComp (line 106) | default StoreEntryComp customEntryComp(StoreSection s, boolean preferL...
    method shouldShowScan (line 110) | default boolean shouldShowScan() {
    method stateDisplay (line 114) | default BaseRegionBuilder<?, ?> stateDisplay(StoreEntryWrapper w) {
    method canConnectDuringCreation (line 118) | default boolean canConnectDuringCreation() {
    method getCreationCategory (line 122) | default DataStoreCreationCategory getCreationCategory() {
    method getUsageCategory (line 126) | default DataStoreUsageCategory getUsageCategory() {
    method canClone (line 147) | default boolean canClone() {
    method getDisplayParent (line 151) | default DataStoreEntry getDisplayParent(DataStoreEntry store) {
    method getSyntheticParent (line 155) | default DataStoreEntry getSyntheticParent(DataStoreEntry store) {
    method guiDialog (line 159) | default GuiDialog guiDialog(DataStoreEntry entry, Property<DataStore> ...
    method init (line 163) | default void init() {}
    method reset (line 165) | default void reset() {}
    method isSyncableFromLocalMachine (line 167) | default boolean isSyncableFromLocalMachine() {
    method isSyncable (line 171) | default boolean isSyncable(DataStoreEntry entry) {
    method summaryString (line 175) | default String summaryString(StoreEntryWrapper wrapper) {
    method informationString (line 179) | default ObservableValue<String> informationString(StoreSection section) {
    method i18n (line 183) | default ObservableValue<String> i18n(String key) {
    method displayName (line 187) | default ObservableValue<String> displayName() {
    method displayDescription (line 191) | default ObservableValue<String> displayDescription() {
    method getModuleName (line 195) | default String getModuleName() {
    method getDisplayIconFileName (line 201) | default String getDisplayIconFileName(DataStore store) {
    method defaultStore (line 210) | default DataStore defaultStore(DataStoreCategory category) {
    method getId (line 214) | String getId();
    method getStoreClasses (line 216) | List<Class<?>> getStoreClasses();

FILE: app/src/main/java/io/xpipe/app/ext/DataStoreProviders.java
  class DataStoreProviders (line 15) | public class DataStoreProviders {
    method init (line 19) | public static void init() {
    method reset (line 29) | public static void reset() {
    method byId (line 39) | public static Optional<DataStoreProvider> byId(String id) {
    method byStoreIfPresent (line 47) | @SuppressWarnings("unchecked")
    method byStore (line 58) | public static <T extends DataStoreProvider> T byStore(DataStore store) {
    method getAll (line 63) | public static List<DataStoreProvider> getAll() {
    class Loader (line 67) | public static class Loader implements ModuleLayerLoader {
      method init (line 69) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/DataStoreState.java
  class DataStoreState (line 6) | @SuperBuilder(toBuilder = true)
    method DataStoreState (line 10) | public DataStoreState() {}
    method useNewer (line 12) | protected static <T> T useNewer(T older, T newer) {
    method asNeeded (line 16) | @SuppressWarnings("unchecked")
    method mergeCopy (line 21) | public DataStoreState mergeCopy(DataStoreState newer) {

FILE: app/src/main/java/io/xpipe/app/ext/DataStoreUsageCategory.java
  type DataStoreUsageCategory (line 5) | public enum DataStoreUsageCategory {

FILE: app/src/main/java/io/xpipe/app/ext/EnabledStoreState.java
  class EnabledStoreState (line 10) | @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    method mergeCopy (line 19) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/ExpandedLifecycleStore.java
  type ExpandedLifecycleStore (line 3) | public interface ExpandedLifecycleStore extends DataStore {
    method finalizeStore (line 5) | default void finalizeStore() throws Exception {}

FILE: app/src/main/java/io/xpipe/app/ext/ExtensionException.java
  class ExtensionException (line 6) | public class ExtensionException extends RuntimeException {
    method ExtensionException (line 8) | public ExtensionException() {}
    method ExtensionException (line 10) | private ExtensionException(String message, Throwable cause) {
    method corrupt (line 14) | public static ExtensionException corrupt(String message, Throwable cau...
    method corrupt (line 27) | public static ExtensionException corrupt(String message) {

FILE: app/src/main/java/io/xpipe/app/ext/FileEntry.java
  class FileEntry (line 13) | @Value
    method FileEntry (line 32) | public FileEntry(
    method ofDirectory (line 47) | public static FileEntry ofDirectory(FileSystem fileSystem, FilePath pa...
    method getFileSizeLong (line 51) | public OptionalLong getFileSizeLong() {
    method resolved (line 64) | public FileEntry resolved() {
    method getName (line 68) | public String getName() {

FILE: app/src/main/java/io/xpipe/app/ext/FileInfo.java
  type FileInfo (line 5) | public sealed interface FileInfo permits FileInfo.Windows, FileInfo.Unix {
    method explicitlyHidden (line 7) | boolean explicitlyHidden();
    method possiblyExecutable (line 9) | boolean possiblyExecutable();
    class Windows (line 11) | @Value
      method explicitlyHidden (line 16) | @Override
      method possiblyExecutable (line 21) | @Override
    class Unix (line 27) | @Value
      method explicitlyHidden (line 36) | @Override
      method possiblyExecutable (line 41) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/FileKind.java
  type FileKind (line 3) | public enum FileKind {

FILE: app/src/main/java/io/xpipe/app/ext/FileSystem.java
  type FileSystem (line 15) | public interface FileSystem extends Closeable, AutoCloseable {
    method writeInstantIfPossible (line 17) | boolean writeInstantIfPossible(FileSystem sourceFs, FilePath sourceFil...
    method readInstantIfPossible (line 19) | boolean readInstantIfPossible(FilePath sourceFile, FileSystem targetFs...
    method getSuffix (line 21) | String getSuffix();
    method isRunning (line 23) | boolean isRunning();
    method supportsLinkCreation (line 25) | boolean supportsLinkCreation();
    method supportsOwnerColumn (line 27) | boolean supportsOwnerColumn();
    method supportsModeColumn (line 29) | boolean supportsModeColumn();
    method supportsDirectorySizes (line 31) | boolean supportsDirectorySizes();
    method supportsChmod (line 33) | boolean supportsChmod();
    method supportsChown (line 35) | boolean supportsChown();
    method supportsChgrp (line 37) | boolean supportsChgrp();
    method supportsTerminalOpen (line 39) | boolean supportsTerminalOpen();
    method supportsTerminalWorkingDirectory (line 41) | boolean supportsTerminalWorkingDirectory();
    method getRawShellControl (line 43) | Optional<ShellControl> getRawShellControl();
    method getTerminalShellControl (line 45) | ShellControl getTerminalShellControl();
    method chmod (line 47) | void chmod(FilePath path, String mode, boolean recursive) throws Excep...
    method chown (line 49) | void chown(FilePath path, String uid, boolean recursive) throws Except...
    method chgrp (line 51) | void chgrp(FilePath path, String gid, boolean recursive) throws Except...
    method kill (line 53) | void kill();
    method cd (line 55) | void cd(FilePath dir) throws Exception;
    method requiresReinit (line 57) | boolean requiresReinit();
    method reinitIfNeeded (line 59) | void reinitIfNeeded() throws Exception;
    method getFileSeparator (line 61) | String getFileSeparator();
    method makeFileSystemCompatible (line 63) | FilePath makeFileSystemCompatible(FilePath filePath);
    method pwd (line 65) | Optional<FilePath> pwd() throws Exception;
    method createTransferOptimizedFileSystem (line 67) | FileSystem createTransferOptimizedFileSystem() throws Exception;
    method getFileSize (line 69) | long getFileSize(FilePath file) throws Exception;
    method getDirectorySize (line 71) | long getDirectorySize(FilePath file) throws Exception;
    method getShell (line 73) | Optional<ShellControl> getShell();
    method open (line 75) | FileSystem open() throws Exception;
    method openInput (line 77) | InputStream openInput(FilePath file) throws Exception;
    method openOutput (line 79) | OutputStream openOutput(FilePath file, long totalBytes) throws Exception;
    method fileExists (line 81) | boolean fileExists(FilePath file) throws Exception;
    method delete (line 83) | void delete(FilePath file) throws Exception;
    method copy (line 85) | void copy(FilePath file, FilePath newFile) throws Exception;
    method move (line 87) | void move(FilePath file, FilePath newFile) throws Exception;
    method mkdirs (line 89) | void mkdirs(FilePath file) throws Exception;
    method touch (line 91) | void touch(FilePath file) throws Exception;
    method symbolicLink (line 93) | void symbolicLink(FilePath linkFile, FilePath targetFile) throws Excep...
    method directoryExists (line 95) | boolean directoryExists(FilePath file) throws Exception;
    method directoryAccessible (line 97) | void directoryAccessible(FilePath file) throws Exception;
    method getFileInfo (line 99) | Optional<FileEntry> getFileInfo(FilePath file) throws Exception;
    method listFiles (line 101) | Stream<FileEntry> listFiles(FileSystem system, FilePath file) throws E...
    method listFilesRecursively (line 103) | default List<FileEntry> listFilesRecursively(FileSystem system, FilePa...
    method traverseFilesRecursively (line 109) | default void traverseFilesRecursively(FileSystem system, FilePath file...
    method listRoots (line 141) | List<FilePath> listRoots() throws Exception;
    method listCommonDirectories (line 143) | List<FilePath> listCommonDirectories() throws Exception;

FILE: app/src/main/java/io/xpipe/app/ext/FileSystemStore.java
  type FileSystemStore (line 3) | public interface FileSystemStore extends DataStore {
    method createFileSystem (line 5) | FileSystem createFileSystem() throws Exception;

FILE: app/src/main/java/io/xpipe/app/ext/FixedChildStore.java
  type FixedChildStore (line 5) | public interface FixedChildStore extends DataStore {
    method getFixedId (line 7) | OptionalInt getFixedId();
    method merge (line 9) | default FixedChildStore merge(FixedChildStore other) {

FILE: app/src/main/java/io/xpipe/app/ext/FixedHierarchyStore.java
  type FixedHierarchyStore (line 7) | public interface FixedHierarchyStore extends DataStore {
    method canManuallyRefresh (line 9) | default boolean canManuallyRefresh() {
    method removeLeftovers (line 13) | default boolean removeLeftovers() {
    method listChildren (line 17) | List<? extends DataStoreEntryRef<? extends FixedChildStore>> listChild...

FILE: app/src/main/java/io/xpipe/app/ext/GroupStore.java
  type GroupStore (line 5) | public interface GroupStore<T extends DataStore> extends DataStore {
    method getParent (line 7) | DataStoreEntryRef<? extends T> getParent();
    method checkComplete (line 9) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/GuiDialog.java
  class GuiDialog (line 8) | @Value
    method GuiDialog (line 15) | public GuiDialog(OptionsBuilder options) {

FILE: app/src/main/java/io/xpipe/app/ext/HostAddress.java
  class HostAddress (line 9) | @EqualsAndHashCode
    method HostAddress (line 17) | private HostAddress(String value, List<String> available) {
    method empty (line 30) | public static HostAddress empty() {
    method of (line 34) | public static HostAddress of(String host) {
    method of (line 42) | public static HostAddress of(@NonNull List<String> addresses) {
    method of (line 48) | public static HostAddress of(String host, @NonNull List<String> addres...
    method withValue (line 57) | public HostAddress withValue(String value) {
    method isSingle (line 65) | public boolean isSingle() {
    method toString (line 69) | @Override
    method get (line 74) | public String get() {
    method getSelectedIndex (line 78) | public int getSelectedIndex() {
    method mergeWithIndex (line 82) | public HostAddress mergeWithIndex(HostAddress newer) {
    method isEmpty (line 91) | public boolean isEmpty() {

FILE: app/src/main/java/io/xpipe/app/ext/InternalCacheDataStore.java
  type InternalCacheDataStore (line 5) | public interface InternalCacheDataStore extends DataStore {
    method getCache (line 7) | default <T> T getCache(String key, Class<T> c, T def) {
    method setCache (line 11) | default void setCache(String key, Object val) {
    method canCacheToStorage (line 15) | default boolean canCacheToStorage() {

FILE: app/src/main/java/io/xpipe/app/ext/LinkFileEntry.java
  class LinkFileEntry (line 11) | @Value
    method LinkFileEntry (line 18) | public LinkFileEntry(
    method resolved (line 29) | public FileEntry resolved() {

FILE: app/src/main/java/io/xpipe/app/ext/LocalStore.java
  class LocalStore (line 10) | @JsonTypeName("local")
    method getStateClass (line 14) | @Override
    method shellFunction (line 19) | @Override
    method getNetworkParent (line 33) | @Override
    method createTunnelSession (line 38) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/NameableStore.java
  type NameableStore (line 3) | public interface NameableStore extends DataStore {
    method getName (line 5) | String getName();

FILE: app/src/main/java/io/xpipe/app/ext/NetworkTunnelSession.java
  class NetworkTunnelSession (line 5) | public abstract class NetworkTunnelSession extends Session {
    method getLocalPort (line 7) | public abstract int getLocalPort();
    method getRemotePort (line 9) | public abstract int getRemotePort();
    method getShellControl (line 11) | public abstract ShellControl getShellControl();

FILE: app/src/main/java/io/xpipe/app/ext/NetworkTunnelStore.java
  type NetworkTunnelStore (line 8) | public interface NetworkTunnelStore extends DataStore, SelfReferentialSt...
    method checkTunnelable (line 10) | static void checkTunnelable(DataStoreEntryRef<?> ref) throws Validatio...
    method getNetworkParent (line 23) | DataStoreEntryRef<?> getNetworkParent();
    method requiresTunnel (line 25) | default boolean requiresTunnel() {
    method getTunnelHostName (line 29) | default HostAddress getTunnelHostName() {
    method getUnsupportedParent (line 33) | default Optional<DataStoreEntryRef<NetworkTunnelStore>> getUnsupported...
    method isLocallyTunnelable (line 49) | default boolean isLocallyTunnelable() {
    method createTunnelSession (line 53) | NetworkTunnelSession createTunnelSession(int localPort, int remotePort...

FILE: app/src/main/java/io/xpipe/app/ext/PrefsChoiceValue.java
  type PrefsChoiceValue (line 13) | public interface PrefsChoiceValue extends PrefsValue, Translatable {
    method getAll (line 15) | @SuppressWarnings("unchecked")
    method getSupported (line 35) | static <T> List<T> getSupported(Class<T> type) {
    method toTranslatedString (line 44) | @Override
    method getId (line 49) | @SuppressWarnings("unused")

FILE: app/src/main/java/io/xpipe/app/ext/PrefsHandler.java
  type PrefsHandler (line 9) | public interface PrefsHandler {
    method addSetting (line 11) | <T> void addSetting(

FILE: app/src/main/java/io/xpipe/app/ext/PrefsProvider.java
  class PrefsProvider (line 9) | public abstract class PrefsProvider {
    method getAll (line 13) | public static List<PrefsProvider> getAll() {
    method get (line 17) | @SuppressWarnings("unchecked")
    method addPrefs (line 25) | public abstract void addPrefs(PrefsHandler handler);
    method fixLocalValues (line 27) | public abstract void fixLocalValues();
    method initDefaultValues (line 29) | public abstract void initDefaultValues();
    class Loader (line 31) | public static class Loader implements ModuleLayerLoader {
      method init (line 33) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/PrefsValue.java
  type PrefsValue (line 3) | public interface PrefsValue {
    method isAvailable (line 5) | default boolean isAvailable() {
    method isSelectable (line 9) | default boolean isSelectable() {

FILE: app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java
  class ProcessControlProvider (line 22) | public abstract class ProcessControlProvider {
    method init (line 26) | public static void init(ModuleLayer layer) {
    method get (line 33) | public static ProcessControlProvider get() {
    method generatePublicSshKey (line 37) | public abstract String generatePublicSshKey(SecretValue privateKey, Se...
    method showSshKeygenDialog (line 39) | public abstract void showSshKeygenDialog(String commentDefault, Proper...
    method subShellEnvironment (line 41) | public abstract ShellStore subShellEnvironment(DataStoreEntryRef<Shell...
    method createVncSession (line 43) | public abstract BrowserStoreSessionTab<?> createVncSession(
    method elevated (line 46) | public abstract DataStoreEntryRef<ShellStore> elevated(DataStoreEntryR...
    method reset (line 48) | public abstract void reset();
    method withDefaultScripts (line 50) | public abstract ShellControl withDefaultScripts(ShellControl pc);
    method command (line 52) | public abstract CommandControl command(ShellControl parent, CommandBui...
    method createLocalProcessControl (line 54) | public abstract ShellControl createLocalProcessControl(boolean stoppab...
    method getStorageSyncHandler (line 56) | public abstract Object getStorageSyncHandler();
    method getStorageUserHandler (line 58) | public abstract Object getStorageUserHandler();
    method getEffectiveLocalDialect (line 60) | public abstract ShellDialect getEffectiveLocalDialect();
    method executeMcpCommand (line 62) | public abstract String executeMcpCommand(ShellControl sc, String comma...
    method getNextFallbackDialect (line 64) | public ShellDialect getNextFallbackDialect() {
    method toggleFallbackShell (line 71) | public abstract void toggleFallbackShell();
    method getAvailableLocalDialects (line 73) | public abstract List<ShellDialect> getAvailableLocalDialects();
    method replace (line 75) | public abstract <T extends DataStore> DataStoreEntryRef<T> replace(Dat...
    method createNetworkScanModal (line 77) | public abstract ModalOverlay createNetworkScanModal();
    method cloneRepository (line 79) | public abstract void cloneRepository(String url, Path target) throws E...
    method pullRepository (line 81) | public abstract void pullRepository(Path target) throws Exception;
    method checkSshAgent (line 83) | public abstract void checkSshAgent(ShellControl sc, FilePath agent) th...

FILE: app/src/main/java/io/xpipe/app/ext/ScanProvider.java
  class ScanProvider (line 18) | public abstract class ScanProvider {
    method getAll (line 22) | public static List<ScanProvider> getAll() {
    method create (line 26) | public ScanOpportunity create(DataStoreEntry entry, ShellControl sc) t...
    method scan (line 30) | public abstract void scan(DataStoreEntry entry, ShellControl sc) throw...
    method requiresFullShell (line 32) | public boolean requiresFullShell() {
    class Loader (line 36) | public static class Loader implements ModuleLayerLoader {
      method init (line 38) | @Override
    class ScanOpportunity (line 48) | @Value
      method ScanOpportunity (line 55) | public ScanOpportunity(String nameKey, boolean disabled) {
      method ScanOpportunity (line 61) | public ScanOpportunity(String nameKey, boolean disabled, String lice...
      method ScanOpportunity (line 67) | public ScanOpportunity(ObservableValue<String> name, boolean disable...
      method getLicensedFeatureId (line 73) | public String getLicensedFeatureId() {
      method getProvider (line 77) | public ScanProvider getProvider() {

FILE: app/src/main/java/io/xpipe/app/ext/SelfReferentialStore.java
  type SelfReferentialStore (line 10) | public interface SelfReferentialStore extends DataStore {
    method hasSelfEntry (line 14) | default boolean hasSelfEntry() {
    method getSelfEntry (line 27) | default DataStoreEntry getSelfEntry() {

FILE: app/src/main/java/io/xpipe/app/ext/Session.java
  class Session (line 9) | public abstract class Session implements AutoCloseable {
    method addListener (line 13) | public synchronized void addListener(SessionListener n) {
    method startAliveListener (line 21) | protected void startAliveListener() {
    method handleSessionDeath (line 40) | protected void handleSessionDeath() {
    method isRunning (line 48) | protected abstract boolean isRunning();
    method start (line 50) | public abstract void start() throws Exception;
    method stop (line 52) | public abstract void stop() throws Exception;
    method checkAliveQuiet (line 54) | public boolean checkAliveQuiet() {
    method checkAlive (line 63) | public abstract boolean checkAlive() throws Exception;
    method close (line 65) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/SessionListener.java
  type SessionListener (line 3) | public interface SessionListener {
    method onStateChange (line 5) | void onStateChange(boolean running);

FILE: app/src/main/java/io/xpipe/app/ext/SetupToolActionProvider.java
  class SetupToolActionProvider (line 15) | public class SetupToolActionProvider implements ActionProvider {
    method getId (line 17) | @Override
    class Action (line 22) | @Jacksonized
      method executeImpl (line 28) | @Override
      method toDisplayMap (line 53) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/ShellControlFunction.java
  type ShellControlFunction (line 5) | public interface ShellControlFunction {
    method control (line 7) | ShellControl control() throws Exception;

FILE: app/src/main/java/io/xpipe/app/ext/ShellControlParentStoreFunction.java
  type ShellControlParentStoreFunction (line 5) | public interface ShellControlParentStoreFunction extends ShellControlFun...
    method control (line 7) | default ShellControl control() throws Exception {
    method control (line 11) | ShellControl control(ShellControl parent) throws Exception;
    method getParentStore (line 13) | ShellStore getParentStore();

FILE: app/src/main/java/io/xpipe/app/ext/ShellDialectChoiceComp.java
  class ShellDialectChoiceComp (line 21) | @AllArgsConstructor
    type NullHandling (line 24) | public enum NullHandling {
    method createSimple (line 34) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/ShellDialectIcons.java
  class ShellDialectIcons (line 9) | public class ShellDialectIcons {
    method getImageName (line 27) | public static String getImageName(ShellDialect t) {

FILE: app/src/main/java/io/xpipe/app/ext/ShellSession.java
  class ShellSession (line 10) | @Getter
    method ShellSession (line 16) | public ShellSession(FailableSupplier<ShellControl> supplier) {
    method createControl (line 20) | private ShellControl createControl() throws Exception {
    method isRunning (line 44) | public boolean isRunning() {
    method start (line 52) | public void start() throws Exception {
    method stop (line 79) | public void stop() throws Exception {
    method checkAlive (line 87) | @Override

FILE: app/src/main/java/io/xpipe/app/ext/ShellStore.java
  type ShellStore (line 6) | public interface ShellStore extends DataStore, FileSystemStore, Validata...
    method getOrStartSession (line 8) | default ShellControl getOrStartSession() throws Exception {
    method newSession (line 34) | @Override
    method getSessionClass (line 42) | @Override
    method createFileSystem (line 47) | @Override
    method shellFunction (line 53) | ShellControlFunction shellFunction();
    method validate (line 55) | @Override
    method standaloneControl (line 60) | default ShellControl standaloneControl() throws Exception {
    method tempControl (line 64) | default ShellControl tempControl() throws Exception {

FILE: app/
Condensed preview — 1457 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,063K chars).
[
  {
    "path": ".gitattributes",
    "chars": 115,
    "preview": "* text=auto eol=lf\n*.sh text eol=lf\n*.bat text eol=crlf\n*.png binary\n*.xcf binary\n*.properties linguist-generated\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 202,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"gradle\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n  - package"
  },
  {
    "path": ".gitignore",
    "chars": 296,
    "preview": ".gradle/\nbuild/\n.idea/*\n!.idea/codeStyles\n!.idea/inspectionProfiles\nlib/\ndev.properties\nextensions.txt\ndev_storage\nlocal"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5241,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 7653,
    "preview": "# Development\n\nAny contribution is welcomed!\nThere are no real formal contribution guidelines right now, they will maybe"
  },
  {
    "path": "LICENSE.md",
    "chars": 10840,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 16225,
    "preview": "<p align=\"center\">\n    <a href=\"https://xpipe.io\" target=\"_blank\" rel=\"noopener\">\n        <img src=\"https://github.com/x"
  },
  {
    "path": "SECURITY.md",
    "chars": 473,
    "preview": "# Security \n\nDue to its nature, XPipe has to handle a lot of sensitive information. Therefore, the security, integrity, "
  },
  {
    "path": "app/build.gradle",
    "chars": 6904,
    "preview": "plugins {\n    id 'application'\n    id 'jvm-test-suite'\n    id 'java-library'\n}\n\nrepositories {\n    mavenCentral()\n}\n\napp"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/Main.java",
    "chars": 1023,
    "preview": "package io.xpipe.app;\n\nimport io.xpipe.app.core.AppNames;\nimport io.xpipe.app.core.AppProperties;\nimport io.xpipe.app.co"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/AbstractAction.java",
    "chars": 5772,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.comp.base.ModalButton;\nimport io.xpipe.app.comp.base.ModalOverlay;\nimp"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionConfigComp.java",
    "chars": 4077,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.comp.SimpleRegionBuilder;\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionConfirmComp.java",
    "chars": 3155,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.comp.RegionBuilder;\nimport"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionConfirmation.java",
    "chars": 1451,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.comp.base.ModalButton;\nimport io.xpipe.app.comp.base.ModalOverlay;\nimp"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java",
    "chars": 5835,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.ext.DataStore;\nimport io.xpipe.app.hub.action.*;\nimport io.xpipe.app.i"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionPickComp.java",
    "chars": 885,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.comp.base.ModalOverlayContentComp;\nimport io.xpipe.app.comp.base.Scrol"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionProvider.java",
    "chars": 2319,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.issue.ErrorEventFactory;\nimport io.xpipe.app.issue.TrackEvent;\nimport "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java",
    "chars": 5383,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.comp.BaseRegionBuilder;\nim"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/ActionUrls.java",
    "chars": 4944,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.core.JacksonMapper;\nimport io.xpipe.core.SecretValue;\n\nimport com.fasterxm"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/LauncherUrlProvider.java",
    "chars": 201,
    "preview": "package io.xpipe.app.action;\n\nimport java.net.URI;\n\npublic interface LauncherUrlProvider extends ActionProvider {\n\n    S"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/SerializableAction.java",
    "chars": 3399,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.app.util.DataStoreFormatter;\nimpo"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/StoreContextAction.java",
    "chars": 189,
    "preview": "package io.xpipe.app.action;\n\nimport io.xpipe.app.storage.DataStoreEntry;\n\nimport java.util.List;\n\npublic interface Stor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java",
    "chars": 502,
    "preview": "package io.xpipe.app.action;\n\nimport java.net.URI;\n\npublic class XPipeUrlProvider implements LauncherUrlProvider {\n\n    "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/AppBeaconCache.java",
    "chars": 1553,
    "preview": "package io.xpipe.app.beacon;\n\nimport io.xpipe.app.ext.ShellStore;\nimport io.xpipe.app.storage.DataStoreEntryRef;\nimport "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java",
    "chars": 6329,
    "preview": "package io.xpipe.app.beacon;\n\nimport io.xpipe.app.beacon.mcp.AppMcpServer;\nimport io.xpipe.app.core.AppLocalTemp;\nimport"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java",
    "chars": 9576,
    "preview": "package io.xpipe.app.beacon;\n\nimport io.xpipe.app.core.mode.AppOperationMode;\nimport io.xpipe.app.issue.ErrorEventFactor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/BeaconSession.java",
    "chars": 205,
    "preview": "package io.xpipe.app.beacon;\n\nimport io.xpipe.beacon.BeaconClientInformation;\n\nimport lombok.Value;\n\n@Value\npublic class"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/BeaconShellSession.java",
    "chars": 235,
    "preview": "package io.xpipe.app.beacon;\n\nimport io.xpipe.app.process.ShellControl;\nimport io.xpipe.app.storage.DataStoreEntry;\n\nimp"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/BlobManager.java",
    "chars": 2393,
    "preview": "package io.xpipe.app.beacon;\n\nimport io.xpipe.app.core.AppLocalTemp;\nimport io.xpipe.app.issue.ErrorEventFactory;\nimport"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ActionExchangeImpl.java",
    "chars": 1174,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.action.ActionJacksonMapper;\nimport io.xpipe.app.core.AppCache;\nim"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java",
    "chars": 3756,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.AppLayoutModel;\nimport io.xpipe.app.issue.ErrorEventFactory;"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java",
    "chars": 1342,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.app.storage.DataStoreCategor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/CategoryInfoExchangeImpl.java",
    "chars": 1440,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.beacon.BeaconClientException"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/CategoryQueryExchangeImpl.java",
    "chars": 684,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.app.storage.DataStorageQuery"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/CategoryRemoveExchangeImpl.java",
    "chars": 1338,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.app.storage.DataStoreCategor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java",
    "chars": 2912,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.ext.DataStore;\nimport io.xpipe.app.ext.ValidationException;\nimpor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java",
    "chars": 2597,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.beacon.BeaconClientException"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java",
    "chars": 759,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.app.storage.DataStorageQuery"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java",
    "chars": 973,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.ext.FixedHierarchyStore;\nimport io.xpipe.app.storage.DataStorage;"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java",
    "chars": 1068,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorage;\nimport io.xpipe.app.storage.DataStoreEntry;\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/DaemonFocusExchangeImpl.java",
    "chars": 945,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.mode.AppOperationMode;\nimport io.xpipe.app.core.window.AppMa"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/DaemonModeExchangeImpl.java",
    "chars": 1187,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.mode.AppOperationMode;\nimport io.xpipe.beacon.BeaconClientEx"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java",
    "chars": 1543,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.AppOpenArguments;\nimport io.xpipe.app.core.mode.AppOperation"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/DaemonStatusExchangeImpl.java",
    "chars": 737,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.mode.AppOperationMode;\nimport io.xpipe.beacon.api.DaemonStat"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/DaemonStopExchangeImpl.java",
    "chars": 725,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.mode.AppOperationMode;\nimport io.xpipe.app.util.ThreadHelper"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/DaemonVersionExchangeImpl.java",
    "chars": 1234,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.AppProperties;\nimport io.xpipe.app.core.AppVersion;\nimport i"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/FsBlobExchangeImpl.java",
    "chars": 736,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.BlobManager;\nimport io.xpipe.beacon.api.FsBlobExchange;\n\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java",
    "chars": 2170,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.beacon.BlobManager;\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java",
    "chars": 980,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.beacon.BlobManager;\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/FsWriteExchangeImpl.java",
    "chars": 821,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.beacon.BlobManager;\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/HandshakeExchangeImpl.java",
    "chars": 1732,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.beacon.BeaconSession;"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/SecretDecryptExchangeImpl.java",
    "chars": 721,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorageSecret;\nimport io.xpipe.beacon.BeaconClientExc"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/SecretEncryptExchangeImpl.java",
    "chars": 548,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.storage.DataStorageSecret;\nimport io.xpipe.beacon.api.SecretEncry"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ShellExecExchangeImpl.java",
    "chars": 1104,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.beacon.api.ShellExecExcha"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java",
    "chars": 2052,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.beacon.BeaconShellSes"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/ShellStopExchangeImpl.java",
    "chars": 599,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.beacon.api.ShellStopExcha"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java",
    "chars": 1571,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.ext.ProcessControlProvider;\nimport io.xpipe.app.process.ShellDial"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/TerminalExternalLaunchExchangeImpl.java",
    "chars": 2258,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.core.AppCache;\nimport io.xpipe.app.core.window.AppDialog;\nimport "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java",
    "chars": 704,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.terminal.TerminalLauncherManager;\nimport io.xpipe.beacon.BeaconCl"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java",
    "chars": 720,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.prefs.AppPrefs;\nimport io.xpipe.beacon.api.TerminalPrepareExchang"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/TerminalRegisterExchangeImpl.java",
    "chars": 739,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.terminal.TerminalLauncherManager;\nimport io.xpipe.app.terminal.Te"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java",
    "chars": 606,
    "preview": "package io.xpipe.app.beacon.impl;\n\nimport io.xpipe.app.terminal.TerminalLauncherManager;\nimport io.xpipe.beacon.BeaconSe"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/mcp/AppMcpServer.java",
    "chars": 8345,
    "preview": "package io.xpipe.app.beacon.mcp;\n\nimport io.xpipe.app.core.AppNames;\nimport io.xpipe.app.core.AppProperties;\nimport io.x"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/mcp/HttpStreamableServerTransportProvider.java",
    "chars": 22038,
    "preview": "/*\n * Copyright 2024-2024 the original author or authors.\n */\n\npackage io.xpipe.app.beacon.mcp;\n\nimport io.xpipe.app.iss"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/mcp/McpSchemaFiles.java",
    "chars": 671,
    "preview": "package io.xpipe.app.beacon.mcp;\n\nimport io.xpipe.core.JacksonMapper;\n\nimport io.modelcontextprotocol.spec.McpSchema;\n\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java",
    "chars": 5595,
    "preview": "package io.xpipe.app.beacon.mcp;\n\nimport io.xpipe.app.ext.ShellStore;\nimport io.xpipe.app.issue.ErrorEventFactory;\nimpor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/beacon/mcp/McpTools.java",
    "chars": 23608,
    "preview": "package io.xpipe.app.beacon.mcp;\n\nimport io.xpipe.app.beacon.AppBeaconServer;\nimport io.xpipe.app.core.AppExtensionManag"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserAbstractSessionModel.java",
    "chars": 1963,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.util.BooleanScope;\nimport io.xpipe.app.util.ThreadHelper;\n\nimport jav"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java",
    "chars": 7409,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.browser.file.BrowserConnectionListComp;\nimport io.xpipe.app.browser.f"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java",
    "chars": 4521,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file.BrowserFi"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserFullSessionComp.java",
    "chars": 9983,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.browser.file.BrowserConnectionListComp;\nimport io.xpipe.app.browser.f"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java",
    "chars": 9751,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.browser.file.BrowserFileSystemTabModel;\nimport io.xpipe.app.browser.f"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserSessionTab.java",
    "chars": 1176,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.storage.DataStoreColor;\n\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java",
    "chars": 21824,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.comp.RegionBuilder;\nimpor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java",
    "chars": 1348,
    "preview": "package io.xpipe.app.browser;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.ext.DataStore;\nimport io."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java",
    "chars": 5106,
    "preview": "package io.xpipe.app.browser.action;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.browser.B"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/BrowserActionProvider.java",
    "chars": 403,
    "preview": "package io.xpipe.app.browser.action;\n\nimport io.xpipe.app.action.ActionProvider;\nimport io.xpipe.app.browser.file.Browse"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/BrowserActionProviders.java",
    "chars": 437,
    "preview": "package io.xpipe.app.browser.action;\n\nimport io.xpipe.app.action.ActionProvider;\n\npublic class BrowserActionProviders {\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/ApplyFileEditActionProvider.java",
    "chars": 1709,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.action.ActionP"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/BrowseInNativeManagerActionProvider.java",
    "chars": 1571,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/ChgrpActionProvider.java",
    "chars": 1295,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/ChmodActionProvider.java",
    "chars": 1307,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/ChownActionProvider.java",
    "chars": 1295,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/ComputeDirectorySizesActionProvider.java",
    "chars": 1705,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/DeleteActionProvider.java",
    "chars": 879,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/MoveFileActionProvider.java",
    "chars": 887,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/NewDirectoryActionProvider.java",
    "chars": 1161,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/NewFileActionProvider.java",
    "chars": 1150,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/NewLinkActionProvider.java",
    "chars": 1239,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/OpenDirectoryActionProvider.java",
    "chars": 1106,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileDefaultActionProvider.java",
    "chars": 1219,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeDetailsActionProvider.java",
    "chars": 4807,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileNativeManagerActionProvider.java",
    "chars": 1512,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java",
    "chars": 1262,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBackgroundActionProvider.java",
    "chars": 2387,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBrowserActionProvider.java",
    "chars": 1688,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInTerminalActionProvider.java",
    "chars": 1816,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/action/impl/TransferFilesActionProvider.java",
    "chars": 2226,
    "preview": "package io.xpipe.app.browser.action.impl;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.action.ActionP"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java",
    "chars": 5513,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.SimpleRegionBuilder;\nimport io.xpipe.app.platform.PlatformT"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserClipboard.java",
    "chars": 4690,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.ext.FileEntry;\nimport io.xpipe.app.ext.ProcessControlProvider;\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListComp.java",
    "chars": 3727,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.*;\nimport io.xpipe.app.hub.comp.*;\nimport io.xpipe.app.plat"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListFilterComp.java",
    "chars": 2421,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.SimpleRegionBuilder;\nimport io.xpipe.app.comp.base.FilterCo"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserContextMenu.java",
    "chars": 3256,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.action.ActionProvider;\nimport io.xpipe.app.browser.menu.BrowserM"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserDialogs.java",
    "chars": 1981,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.base.ModalButton;\nimport io.xpipe.app.comp.base.ModalOverla"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java",
    "chars": 2198,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.icon.BrowserIconDirectoryType;\nimport io.xpipe.app.brows"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileDuplicates.java",
    "chars": 1479,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.ext.FileSystem;\nimport io.xpipe.core.FilePath;\n\nimport java.util"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileInput.java",
    "chars": 4292,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.core.window.AppDialog;\nimport io.xpipe.app.ext.ConnectionFileSys"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java",
    "chars": 30951,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.menu.BrowserMenuProviders;\nimport io.xpipe.app.comp.Regi"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java",
    "chars": 12158,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.core.AppSys"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileListFilterComp.java",
    "chars": 4422,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.*;\nimport io.xpipe.app.comp.base.TextFieldComp;\nimport io.x"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java",
    "chars": 6659,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.action.impl.MoveFileActionProvider;\nimport io.xpipe.app."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java",
    "chars": 10065,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.icon.BrowserIconManager;\nimport io.xpipe.app.comp.base.L"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileOpener.java",
    "chars": 3920,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.core.AppI18n;\nimport io.xpipe.app.core.window.AppDialog;\nimport "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java",
    "chars": 6108,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.core.window.AppDialog;\nimport io.xpipe.app.ext.ConnectionFileSys"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileOverviewComp.java",
    "chars": 1957,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.icon.BrowserIcons;\nimport io.xpipe.app.comp.BaseRegionBu"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileSelectionListComp.java",
    "chars": 3251,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.icon.BrowserIconManager;\nimport io.xpipe.app.comp.Region"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java",
    "chars": 4234,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.ext.FileEntry;\nimport io.xpipe.app.ext.FileKind;\nimport io.xpipe"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java",
    "chars": 2441,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.core.FilePath;\n\nimport javafx.beans.binding.Bindings;\nimport javafx."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java",
    "chars": 6296,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.core.AppCache;\nimport io.xpipe.app.util.GlobalTimer;\nimport io.x"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java",
    "chars": 11022,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.browser.men"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java",
    "chars": 22676,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.action.ActionProvider;\nimport io.xpipe.app.browser.BrowserAbstra"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferMode.java",
    "chars": 107,
    "preview": "package io.xpipe.app.browser.file;\n\npublic enum BrowserFileTransferMode {\n    NORMAL,\n    COPY,\n    MOVE\n}\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java",
    "chars": 23909,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.core.mode.AppOperationMode;\nimport io.xpipe.app.ext.FileEntry;\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserGreetingComp.java",
    "chars": 1242,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.SimpleRegionBuilder;\nimport io.xpipe.app.core.AppFontSizes;"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedState.java",
    "chars": 522,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.core.FilePath;\n\nimport javafx.collections.ObservableList;\n\nimport lo"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserHistorySavedStateImpl.java",
    "chars": 3194,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.core.AppCache;\nimport io.xpipe.core.JacksonMapper;\n\nimport javaf"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java",
    "chars": 8028,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.comp.BaseRe"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java",
    "chars": 1233,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.BrowserAbstractSessionModel;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java",
    "chars": 1380,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.ext.FileEntry;\nimport io.xpipe.app.ext.FileKind;\nimport io.xpipe"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java",
    "chars": 10217,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.icon.BrowserIconManager;\nimport io.xpipe.app.comp.Region"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java",
    "chars": 3720,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.comp.SimpleRegionBui"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessButtonComp.java",
    "chars": 1444,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.RegionDescriptor;\nimport io.xpipe.app.comp.SimpleRegionBuil"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java",
    "chars": 12698,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.icon.BrowserIcons;\nimport io.xpipe.app.comp.base.ModalOv"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java",
    "chars": 8955,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.comp.RegionBuilder;\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java",
    "chars": 6995,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.BrowserAbstractSessionModel;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java",
    "chars": 9013,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.comp.RegionBuilder;\nimport io.xpipe.app.comp.SimpleRegionBuilder"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java",
    "chars": 9073,
    "preview": "package io.xpipe.app.browser.file;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.browser.act"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/file/BrowserTransferProgress.java",
    "chars": 1406,
    "preview": "package io.xpipe.app.browser.file;\n\nimport lombok.Value;\n\nimport java.time.Duration;\nimport java.time.Instant;\nimport ja"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/icon/BrowserIconDirectoryType.java",
    "chars": 2857,
    "preview": "package io.xpipe.app.browser.icon;\n\nimport io.xpipe.app.core.AppResources;\nimport io.xpipe.app.ext.FileEntry;\nimport io."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java",
    "chars": 3257,
    "preview": "package io.xpipe.app.browser.icon;\n\nimport io.xpipe.app.core.AppResources;\nimport io.xpipe.app.ext.FileEntry;\nimport io."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/icon/BrowserIconManager.java",
    "chars": 901,
    "preview": "package io.xpipe.app.browser.icon;\n\nimport io.xpipe.app.core.AppDisplayScale;\nimport io.xpipe.app.core.AppImages;\nimport"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/icon/BrowserIconVariant.java",
    "chars": 570,
    "preview": "package io.xpipe.app.browser.icon;\n\nimport io.xpipe.app.prefs.AppPrefs;\n\npublic class BrowserIconVariant {\n\n    private "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java",
    "chars": 1026,
    "preview": "package io.xpipe.app.browser.icon;\n\nimport io.xpipe.app.comp.BaseRegionBuilder;\nimport io.xpipe.app.comp.base.PrettyImag"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/BrowserApplicationPathMenuProvider.java",
    "chars": 1080,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file.Brow"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuBranchProvider.java",
    "chars": 1275,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file.Brow"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuCategory.java",
    "chars": 135,
    "preview": "package io.xpipe.app.browser.menu;\n\npublic enum BrowserMenuCategory {\n    CUSTOM,\n    OPEN,\n    COPY_PASTE,\n    ACTION,\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuItemProvider.java",
    "chars": 1684,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.action.ActionProvider;\nimport io.xpipe.app.browser.file.BrowserE"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuLeafProvider.java",
    "chars": 4617,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.browser.action.Browse"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/BrowserMenuProviders.java",
    "chars": 1794,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.action.ActionProvider;\nimport io.xpipe.app.browser.file.BrowserE"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/FileTypeMenuProvider.java",
    "chars": 803,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file.Brow"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/MultiExecuteMenuProvider.java",
    "chars": 4943,
    "preview": "package io.xpipe.app.browser.menu;\n\nimport io.xpipe.app.browser.action.impl.RunCommandInBackgroundActionProvider;\nimport"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/BackMenuProvider.java",
    "chars": 1672,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/BrowseInNativeManagerMenuProvider.java",
    "chars": 1582,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.BrowserActionProvider;\nimport io.xpipe.app.b"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/ChgrpMenuProvider.java",
    "chars": 6655,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.impl.ChgrpActionProvider;\nimport io.xpipe.ap"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/ChmodMenuProvider.java",
    "chars": 6254,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.impl.ChmodActionProvider;\nimport io.xpipe.ap"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/ChownMenuProvider.java",
    "chars": 6540,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.impl.ChownActionProvider;\nimport io.xpipe.ap"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/ComputeDirectorySizesMenuProvider.java",
    "chars": 2002,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.browser.action.i"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/CopyMenuProvider.java",
    "chars": 1380,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserClipboard;\nimport io.xpipe.app.browser."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/CopyPathMenuProvider.java",
    "chars": 12038,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/DeleteMenuProvider.java",
    "chars": 1785,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.BrowserActionProvider;\nimport io.xpipe.app.b"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/DownloadMenuProvider.java",
    "chars": 1886,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.browse"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java",
    "chars": 2137,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/FollowLinkMenuProvider.java",
    "chars": 1641,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/ForwardMenuProvider.java",
    "chars": 1687,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/GradleRunMenuProvider.java",
    "chars": 3068,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/JarMenuProvider.java",
    "chars": 1875,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java",
    "chars": 2549,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/NewItemMenuProvider.java",
    "chars": 10097,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.impl.NewDirectoryActionProvider;\nimport io.x"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/OpenDirectoryInNewTabMenuProvider.java",
    "chars": 2087,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.BrowserFullSessionModel;\nimport io.xpipe.app.browse"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/OpenDirectoryMenuProvider.java",
    "chars": 1404,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.BrowserActionProvider;\nimport io.xpipe.app.b"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileDefaultMenuProvider.java",
    "chars": 1438,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.BrowserActionProvider;\nimport io.xpipe.app.b"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/OpenFileWithMenuProvider.java",
    "chars": 1830,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.BrowserActionProvider;\nimport io.xpipe.app.b"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/OpenNativeFileDetailsMenuProvider.java",
    "chars": 1562,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.action.BrowserActionProvider;\nimport io.xpipe.app.b"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/OpenTerminalInDirectoryMenuProvider.java",
    "chars": 2754,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/PasteMenuProvider.java",
    "chars": 3309,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserClipboard;\nimport io.xpipe.app.browser."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/RefreshDirectoryMenuProvider.java",
    "chars": 1645,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/RenameMenuProvider.java",
    "chars": 1752,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/RunFileMenuProvider.java",
    "chars": 3031,
    "preview": "package io.xpipe.app.browser.menu.impl;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.browser.file"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUntarMenuProvider.java",
    "chars": 3383,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipUnixMenuProvider.java",
    "chars": 2959,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/BaseUnzipWindowsActionProvider.java",
    "chars": 2676,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.action.AbstractAction;\nimport io.xpipe.app.browser"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/CompressMenuProvider.java",
    "chars": 8063,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.browser.file.BrowserEntry;\nimport io.xpipe.app.bro"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/TarActionProvider.java",
    "chars": 2197,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarActionProvider.java",
    "chars": 2010,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarDirectoryMenuProvider.java",
    "chars": 201,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UntarDirectoryMenuProvider extends BaseUntarMenuProvider "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarGzDirectoryMenuProvider.java",
    "chars": 204,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UntarGzDirectoryMenuProvider extends BaseUntarMenuProvide"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarGzHereMenuProvider.java",
    "chars": 195,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UntarGzHereMenuProvider extends BaseUntarMenuProvider {\n\n"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UntarHereMenuProvider.java",
    "chars": 192,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UntarHereMenuProvider extends BaseUntarMenuProvider {\n\n  "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipActionProvider.java",
    "chars": 3158,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipDirectoryUnixMenuProvider.java",
    "chars": 206,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UnzipDirectoryUnixMenuProvider extends BaseUnzipUnixMenuP"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipDirectoryWindowsActionProvider.java",
    "chars": 221,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UnzipDirectoryWindowsActionProvider extends BaseUnzipWind"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipHereUnixMenuProvider.java",
    "chars": 197,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UnzipHereUnixMenuProvider extends BaseUnzipUnixMenuProvid"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/UnzipHereWindowsActionProvider.java",
    "chars": 212,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\npublic class UnzipHereWindowsActionProvider extends BaseUnzipWindowsAc"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/browser/menu/impl/compress/ZipActionProvider.java",
    "chars": 3890,
    "preview": "package io.xpipe.app.browser.menu.impl.compress;\n\nimport io.xpipe.app.browser.action.BrowserAction;\nimport io.xpipe.app."
  },
  {
    "path": "app/src/main/java/io/xpipe/app/comp/BaseRegionBuilder.java",
    "chars": 2663,
    "preview": "package io.xpipe.app.comp;\n\nimport io.xpipe.app.platform.BindingsHelper;\nimport io.xpipe.app.platform.PlatformThread;\n\ni"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/comp/RegionBuilder.java",
    "chars": 1664,
    "preview": "package io.xpipe.app.comp;\n\nimport javafx.geometry.Orientation;\nimport javafx.scene.control.Separator;\nimport javafx.sce"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/comp/RegionDescriptor.java",
    "chars": 3557,
    "preview": "package io.xpipe.app.comp;\n\nimport io.xpipe.app.comp.base.TooltipHelper;\nimport io.xpipe.app.core.AppI18n;\nimport io.xpi"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/comp/RegionStructure.java",
    "chars": 133,
    "preview": "package io.xpipe.app.comp;\n\nimport javafx.scene.layout.Region;\n\npublic interface RegionStructure<R extends Region> {\n\n  "
  },
  {
    "path": "app/src/main/java/io/xpipe/app/comp/RegionStructureBuilder.java",
    "chars": 1018,
    "preview": "package io.xpipe.app.comp;\n\nimport javafx.scene.layout.Region;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimpor"
  },
  {
    "path": "app/src/main/java/io/xpipe/app/comp/SimpleRegionBuilder.java",
    "chars": 139,
    "preview": "package io.xpipe.app.comp;\n\nimport javafx.scene.layout.Region;\n\npublic abstract class SimpleRegionBuilder extends Region"
  }
]

// ... and 1257 more files (download for full content)

About this extraction

This page contains the full source code of the xpipe-io/xpipe GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1457 files (6.4 MB), approximately 1.8M tokens, and a symbol index with 7765 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!