Files
Termix/src/ui/plugin-host/sdk-ui.ts
T
f90621a54e v26.10.6 (#1739)
* feat: let the login page send the token back to the mobile app

* feat: add host-scripts entry to the plugin sdk

* feat: let plugins say how they show in the mobile app

* feat: frame host for running one plugin view outside the shell

* fix: build the SDK host modules in production mode

* chore: note the SDK host build fix in the changelog

* feat: list plugin engine ranges for the mobile app

* feat: host color and icon columns that sync

* chore: update translations and plugin pins

* fix: test

* fix: show source address when rejecting proxy auth

* fix: deleting your own account removes all of its data

* fix(deps): update body-parser to 2.4.0 (#1736)

* fix: body-parser 보안 패치 반영

* chore: 자동 검사를 막던 기존 JSON 서식 정리

---------

Co-authored-by: renovys <180682734+renovys@users.noreply.github.com>

* fix(sdk): decode command output as GBK when it is not valid UTF-8 (#1735)

* fix: honor shared credentials on shared hosts (#1730)

* fix: honor shared credentials on shared hosts and in personal SSH auth

* fix: snapshot shared SSH auth from a credential shared with the host owner

* fix: size DataView list columns by the table's own width (#1713)

* fix: size DataView list columns by the table's own width

The list grid was built from every column, so columns hidden below md/lg
left empty tracks and the visible cells landed under the wrong headers.
Each width now gets a template of only its visible columns (CSS variables
+ container queries on the table, so a narrow panel counts, not the window),
the header uses the same gap as the rows, and rows use a minimum height so
wrapped cells no longer overlap.

* test: wait for the title bar offset effect before asserting

The bar shows once getTitleBarVisible resolves, but --termix-titlebar-height
is set in a later passive effect, so reading it right after findByText raced
(3-5 of 40 runs under load, on main too).

* chore: rerun CI against dev-26.10.6

* fix: unlock passphrase keys once per connect burst (#1737)

* feat: give ssh transports the host origin and sync id (#1717)

* fix: wake other clients after a sync push (Plugin-Sync#1)

* feat: look up local row ids by sync id for the sync plugin (Plugin-Sync#4)

* feat: rail items can show a status dot (Plugin-Sync#5)

* fix: add the desktop shared copy banner text (#1709)

* feat: sidebar preference for alternating rows (#1712)

* fix: striped rows text

* feat: shell can open a saved host's editor for plugins (Plugin-SSH-Terminal#36)

* fix: show the logo in the macos menu bar (#1728)

* fix: number shortcuts skip the home tab (#1724)

* fix: show plugins that could not be downloaded as failed (#1714)

* fix: pass the host id as text when opening its editor

* fix: retry a plugin bundle that was not ready yet (#1708)

* fix: let commonjs plugins fall back to core packages on the desktop

* fix: let non docker installs switch nginx to https (#1711)

* feat: remove a folder share from its hosts too (#1719)

* chore: changelog for merged pull requests

* fix: accept the release .sig when installing a plugin from a file

* feat: folder logins for shared hosts, read only plugin sync, full desktop builds

* fix: test

* fix: stop dev runner restart loops and narrow plugin watchers

* chore: update translations and plugin pins

* chore: lint, format, and bump version to 26.10.6

---------

Co-authored-by: renovys <renovy@gmail.com>
Co-authored-by: renovys <180682734+renovys@users.noreply.github.com>
Co-authored-by: Sebastian Cao <cycsmail@gmail.com>
Co-authored-by: Jonathan Rehuel Lewerissa <jonathan.rehuel16@gmail.com>
Co-authored-by: Rhiz3K <33246262+Rhiz3K@users.noreply.github.com>
2026-10-29 17:59:55 -05:00

826 lines
23 KiB
TypeScript

/**
* @termix-ssh/plugin-sdk/ui: the shell's components, for plugins.
*
* Everything exported here is public API. A plugin builds its UI from these
* so it looks like the rest of the app and picks up theme changes, and it
* receives the shell's own instances through the import map, never a copy.
*
* The list is deliberate. It covers what the bundled plugins use today: the
* shadcn primitives, the composites for metrics, connection screens and
* settings rows, and the contexts a connection surface needs. Adding to it is
* a contract change. Removing from it breaks plugins.
*/
// Primitives
export { Alert, AlertDescription, AlertTitle } from "@/components/alert";
export {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogOverlay,
AlertDialogPortal,
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/alert-dialog";
export { Badge } from "@/components/badge";
export { Button, type ButtonProps } from "@/components/button";
export {
Card,
CardAction,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/card";
export { Checkbox } from "@/components/checkbox";
export {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogOverlay,
DialogPortal,
DialogTitle,
DialogTrigger,
} from "@/components/dialog";
export {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuPortal,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@/components/dropdown-menu";
export { Input } from "@/components/input";
export { Label } from "@/components/label";
export { PasswordInput } from "@/components/password-input";
export {
Popover,
PopoverAnchor,
PopoverContent,
PopoverTrigger,
} from "@/components/popover";
export { ScrollArea, ScrollBar } from "@/components/scroll-area";
export {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectScrollDownButton,
SelectScrollUpButton,
SelectSeparator,
SelectTrigger,
SelectValue,
} from "@/components/select";
export { Select2 } from "@/components/select2";
export { Separator } from "@/components/separator";
export { Skeleton } from "@/components/skeleton";
export { Slider } from "@/components/slider";
export { Switch } from "@/components/switch";
export { Textarea, type TextareaProps } from "@/components/textarea";
export {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/tooltip";
// Composites
export { FakeSwitch, SectionCard, SettingRow } from "@/components/section-card";
export { MetricCard } from "@/components/metric-card";
export {
BarSeries,
MiniStat,
RadialGauge,
Sparkline,
StatRow,
type BarSeriesItem,
type BarSeriesProps,
type RadialGaugeProps,
type SparklineProps,
} from "@/components/charts";
export { LineChart, type LineChartSeries } from "@/components/charts/LineChart";
export {
CardGridCanvas,
ColumnCountStepper,
} from "@/components/card-grid/CardGridCanvas";
export {
type GridCardCatalogEntry,
type GridColSpan,
type GridLayout,
type GridSlot,
} from "@/components/card-grid/types";
export { ConnectionScreen } from "@/components/connection/ConnectionScreen";
export { type ConnectionStatus } from "@/components/connection/connection-status";
export {
FullScreenAppWrapper,
type FullScreenAppPhase,
} from "@/components/FullScreenAppWrapper";
// Connection surfaces
export {
ConnectionLogProvider,
useConnectionLog,
useOptionalConnectionLog,
} from "@/ssh/connection-log/ConnectionLogContext";
export { TOTPDialog, type MFAPromptMode } from "@/ssh/dialogs/TOTPDialog";
export { SSHAuthDialog } from "@/ssh/dialogs/SSHAuthDialog";
export { BrowserSignInDialog } from "@/ssh/dialogs/BrowserSignInDialog";
// Design tokens: the colour swatches folders, workspaces and tags pick from.
export { FOLDER_COLORS } from "@/lib/theme";
// Shell context
export { useTabs, useTabsSafe } from "@/shell/TabContext";
// Slots: a plugin can offer places for other plugins to fill.
export { ActionSlot, ComponentSlot } from "@/shell/ActionSlot";
// For layouts: where tabs show, and the confirm a tab close asks with.
export { TabStage } from "@/shell/stage/TabStage";
export { ShellConfirmCapture } from "@/shell/controller/ShellControllerProvider";
// A plugin's manifest host settings, drawn inside its own host editor section.
export {
HostFeatureFields,
type HostFeatureFieldsProps,
} from "@/settings/HostPluginSections";
// Host defaults in a host editor section: where a field's value comes from,
// and whether the section is editing a level of defaults rather than a host.
export {
HostDefaultBadge,
DefaultsOnly as HostDefaultField,
useIsDefaultsEditor,
} from "@/lib/host-defaults-context";
// Components other plugins offer by id (app.registerComponent), rendered with
// a fallback while their plugin is off.
export { PluginComponent } from "@/plugin-host/component-registry";
export { PluginViewPlaceholder } from "@/plugin-host/PluginViewPlaceholder";
// More primitives and hooks.
export { cn } from "@/lib/utils";
export {
runAdaptivePolling,
getPollingEnvironmentMultiplier,
} from "@/lib/adaptive-polling";
export {
Sheet,
SheetClose,
SheetContent,
SheetDescription,
SheetFooter,
SheetHeader,
SheetTitle,
SheetTrigger,
} from "@/components/sheet";
// The frame and filter box every host manager card uses.
export {
ManagerCardShell,
ManagerSearch,
type ManagerCardError,
} from "@/components/manager-card";
export { useAdaptivePolling } from "@/hooks/use-adaptive-polling";
// Homepage widget pieces, for plugins that register a widget.
export { WidgetTitle } from "@/lib/widget-title";
export { runVisibleInterval } from "@/lib/visible-interval";
export { useIsMobile } from "@/hooks/use-mobile";
export { EmptyState } from "@/components/empty-state";
export { PassphraseDialog } from "@/ssh/dialogs/PassphraseDialog";
export { HostKeyVerificationDialog } from "@/ssh/dialogs/HostKeyVerificationDialog";
// Clipboard helpers and the app theme, shared by every terminal-like surface.
// The terminal look itself (themes, fonts, the preview) is the ssh-terminal
// plugin's, offered through its "terminal.*" actions and components.
export { copyToClipboard, readFromClipboard } from "@/lib/clipboard";
export { RobustClipboardProvider } from "@/lib/clipboard-provider";
export { useTheme as useAppTheme } from "@/components/theme-provider";
// Keyboard handling the shell shares with a terminal, so app shortcuts keep
// working while a terminal has focus.
export { findMatchingKeybinding } from "@/lib/keybinding-match";
export { globalShortcutHandler } from "@/lib/global-shortcut-handler";
export { isMacPlatform, isTabJumpHotkey } from "@/lib/tab-jump-hotkey";
export {
type CustomKeybinding,
type KeyCombo,
type KeybindingAction,
type KeybindingActionType,
} from "@/types/keybindings";
// Connection helpers: which backend a host's session dials, and the pieces
// the desktop app needs to reach it.
export { isElectron } from "@/lib/electron";
export {
resolveConnectionOrigin,
type ConnectionOrigin,
} from "@/lib/connection-origin";
export { pluginWsUrl } from "@/lib/plugin-transport";
export {
buildOriginWsUrl,
type WebSocketConnectionTarget,
} from "@/lib/connection-origin";
export { getBasePath } from "@/lib/base-path";
export type { ConnectionStage } from "@/types/connection-log";
export {
hydrateLocalSharedHostAuth,
resolveRemoteHostId,
} from "@/lib/remote-server-api";
export { remoteServerUrl as linkedServerUrl } from "@/plugin-host/desktop";
// Dashboard reads. The calls a plugin makes on the user's behalf (recent
// activity, sudo autofill, open tabs, keybindings) are typed in
// @termix-ssh/plugin-sdk/frontend instead.
export {
getRecentActivity,
getUptime,
type RecentActivityItem,
type UptimeInfo,
} from "@/api/dashboard-api";
export {
getVersionInfo,
getDatabaseHealth,
type VersionInfo,
} from "@/api/system-status-api";
// Keyboard hints, the connection log panel and a named console logger.
export { Kbd, KbdKey, KbdSeparator } from "@/components/kbd";
export { ConnectionLogPanel } from "@/components/connection/ConnectionLogPanel";
export type { LogEntry } from "@/types/connection-log";
export { createFrontendLogger, type LogContext } from "@/lib/frontend-logger";
// One budget for background work across the whole app (preloads, prefetches).
export {
getAdaptiveResourceBudget,
markAdaptiveResourceUsed,
runAdaptiveBackgroundTask,
} from "@/lib/adaptive-resource-budget";
// The id this browser sends as X-Termix-Device-ID.
export { getDeviceId } from "@/lib/device-id";
// A host that is never saved, for connecting to an address straight away.
export { createQuickConnectHost } from "@/sidebar/quick-connect-host";
// The panel kit every tab and sidebar panel is built from.
export {
BackButton,
Facts,
GroupHeading,
PANEL,
PanelSearch,
PanelShell,
Segmented,
ViewToggle,
type GridSize,
type PanelDensity,
type PanelViewMode,
} from "@/components/panel-layout";
// A link to docs. Inside a plugin, page="setup" opens that page of its docs.
export { DocsLink, type DocsLinkProps } from "@/components/docs-link";
export {
AddButton,
FormFooter,
ListBadge,
ListRow,
ListRowAction,
ListRowFolder,
PanelList,
type ListRowTone,
} from "@/components/list-kit";
export {
DataView,
type DataColumn,
type GridColumns,
} from "@/components/data-view";
export { TabStrip, type TabStripItem } from "@/components/tab-strip";
export { CardMasonry } from "@/components/card-masonry";
export { Meter, UsagePair } from "@/components/meter";
export { usageBarColor, usageColor } from "@/lib/usage-color";
export {
Field,
FieldPair,
NumberField,
Repeater,
SecretField,
SelectField,
SwitchRow,
TagInput,
TextAreaField,
TextField,
} from "@/components/form-fields";
// Views and questions drawn over the panel, tab or pane that asked, instead
// of modals over the whole app.
export {
InlineView,
PanePrompt,
SurfaceScope,
useConfirm,
useSurfaceKind,
type ConfirmOptions,
type EditingWidth,
type SurfaceKind,
} from "@/components/surface/surface-scope";
export {
PROMPT_BUTTON,
PROMPT_DESTRUCTIVE_BUTTON,
PROMPT_PRIMARY_BUTTON,
} from "@/components/surface/prompt-styles";
// One connection lifecycle: connecting, failed with retry and a log, dropped,
// or unavailable.
export {
ConnectionGate,
useConnectionGate,
type ConnectionGateController,
type ConnectionGateProps,
} from "@/components/connection/ConnectionGate";
export { type ConnectionUnavailable } from "@/components/connection/ConnectionScreen";
// For shell-level plugins such as a layout: the API client, shared types and
// the shell's own state. These reach into core, so they may change with a core
// release. An ordinary plugin should not need them.
export { APP_VERSION } from "@/lib/app-version";
// The palette's own input has to share the Command it sits in, so cmdk is
// the shell's copy.
export { Command as CommandPrimitive } from "cmdk";
export {
type AuthOverrideProtocol,
SSH_AUTH_PROTOCOL,
} from "@/types/auth-protocols";
export {
CREDENTIAL_ROW_FIELD_KEYS,
type CredentialDensity,
type CredentialRowFields,
type CredentialSidebarFilterState,
type CredentialSidebarPreferences,
type CredentialSortKey,
type CredentialTrayTrigger,
defaultCredentialRowFields,
defaultCredentialSidebarPreferences,
sanitizeCredentialSidebarPreferences,
} from "@/types/credential-sidebar-preferences";
export {
CORE_HOST_DEFAULTS,
CORE_NAMESPACE,
type DefaultOverrides,
defaultValuesEqual,
findCoreHostDefault,
type HostDefaultsLevel,
type ResolvedHostDefault,
splitDefaultKey,
} from "@/types/host-defaults";
export {
defaultHostRowFields,
defaultHostSidebarPreferences,
type HostClickBehavior,
type HostDensity,
type HostGroupKey,
type HostRowFields,
type HostSidebarFilterState,
type HostSidebarPreferences,
type HostTrayTrigger,
sanitizeHostSidebarPreferences,
type SortKey,
} from "@/types/host-sidebar-preferences";
export type {
HostData,
HostLock,
HostProtocolAuthInput,
ProxyNode,
SSHHost,
SSHHostData,
} from "@/types";
export {
PRESETS,
UI_AREA_KEYS,
type UiAreaKey,
type UiPreset,
} from "@/types/ui-preferences";
export type {
AdminSection,
Credential,
DashboardCardId,
FontSizeId,
Host,
HostFolder,
SharePermissionLevel,
Tab,
TabType,
ThemeId,
ToolsTab,
UiFontId,
} from "@/types/ui-types";
export {
type AuditLog,
type AuditLogFilters,
getAuditLogActions,
getAuditLogs,
} from "@/api/audit-log-api";
export {
getUserSecondFactors,
resetUserSecondFactors,
type UserSecondFactorSummary,
} from "@/api/auth-methods-api";
export { getCredentials } from "@/api/credentials-api";
export {
getFolderDefaultsId,
getHostDefaultsLevel,
type HostDefaultsChange,
type HostDefaultsTarget,
previewHostDefaultsLevel,
resetHostToDefaults,
resolveHostDefaults,
saveHostDefaultsLevel,
waitForDefaultsJob,
} from "@/api/host-defaults-api";
export { getHostTags, saveHostTags } from "@/api/host-tags-api";
export {
getSessionTimeoutMinutes,
getUserPreferences,
parseCustomKeybindings,
saveUserPreferences,
} from "@/api/open-tabs-api";
export {
getDeveloperMode,
getPluginAdminSettings,
getPluginHostSettings,
getPlugins,
getPluginUserSettings,
type PluginSettingsErrors,
type PluginSettingsField,
PluginSettingsValidationError,
type PluginSummary,
setAllPluginChannels,
setDeveloperMode,
setPluginOptions,
updatePluginAdminSettings,
updatePluginHostSettings,
updatePluginUserSettings,
} from "@/api/plugins-api";
export {
getNotificationPrivateEndpoints,
setNotificationPrivateEndpoints,
} from "@/api/private-endpoints-api";
export {
type CredentialPermissionLevel,
type FolderAccessRule,
getCredentialAccess,
getFolderAccess,
getRoles,
revokeCredentialAccess,
revokeFolderAccess,
shareCredential,
type ShareTarget,
} from "@/api/rbac-api";
export { type BrandingSettings, getBranding } from "@/api/settings-api";
export {
getChannelReleases,
getUpdateChannel,
type ReleaseInfo,
setUpdateChannel,
type UpdateChannelState,
} from "@/api/system-status-api";
export {
getTlsStatus,
type TlsStatus,
uploadTlsCertificate,
} from "@/api/tls-api";
export {
Command,
CommandEmpty,
CommandGroup,
CommandItem,
CommandList,
} from "@/components/command";
export { usePluginDocsUrl } from "@/components/docs-link";
export {
DEFAULT_FOLDER_COLOR,
DEFAULT_FOLDER_ICON,
FolderIconEl,
HexColorPicker,
IconPicker,
} from "@/components/folder-style";
export { useTheme } from "@/components/theme-provider";
export { VersionBadge } from "@/components/version-badge";
export { useBranding } from "@/contexts/BrandingContext";
export {
useAreaPreferences,
useUiPreference,
useUiPreferencesContext,
} from "@/contexts/UiPreferencesContext";
export {
getRegisteredDashboardCard,
useRegisteredDashboardCards,
} from "@/dashboard/dashboard-cards-registry";
export { useActionSlot } from "@/hooks/use-action-slot";
export { useInstalledPlugins } from "@/hooks/use-installed-plugins";
export { usePageVisibleInterval } from "@/hooks/use-page-visible-interval";
export { usePermissions } from "@/hooks/use-permissions";
export {
getStatusClasses,
useStatusColorScheme,
} from "@/hooks/use-status-color-scheme";
export { useSshAuthProviders } from "@/hooks/useSshAuthProviders";
export { changeAppLanguage, normalizeLanguageCode } from "@/i18n/i18n";
export { LANGUAGES } from "@/i18n/languages";
export {
getLiveHostStatus,
useHostStatus,
useServerStatus,
useServerStatusMeta,
} from "@/lib/ServerStatusContext";
export { activityTarget } from "@/lib/activity-types";
export { applyPresetSideEffects } from "@/lib/apply-ui-preset";
export { getDatabaseTransferUrl } from "@/lib/database-transfer-url";
export {
canConfigureUpdates,
type DesktopUpdateMode,
desktopUpdates,
type DesktopUpdateState,
useDesktopUpdate,
} from "@/lib/desktop-updates";
export { type DocsPage, docsUrl } from "@/lib/docs";
export { getErrorMessage } from "@/lib/error-message";
export {
getDefaultConnectionTab,
resolveHostTabType,
} from "@/lib/host-connection-tabs";
export {
DefaultsOnly,
HostDefaultsContext,
type HostDefaultsContextValue,
HostOnly,
} from "@/lib/host-defaults-context";
export {
invalidateHostsAndStatusCaches,
invalidateServerStatusCache,
} from "@/lib/hosts-request-cache";
export { reportBetaFeedbackUrl, reportCoreIssueUrl } from "@/lib/issue-url";
export { notifySyncChanged, useDesktopLinked } from "@/lib/linked-server";
export {
clearLocalAdaptivePreferences,
getPreferredHostAction,
recordHostActionPreference,
} from "@/lib/local-adaptive-preferences";
export { pluginKey, pluginName } from "@/lib/plugin-i18n";
export { PluginIcon } from "@/lib/plugin-icon";
export { rem } from "@/lib/rem";
export { getConnectedRemoteApi } from "@/lib/remote-server-api";
export { roleLabel } from "@/lib/role-label";
export type { StatusValue } from "@/lib/server-status-store";
export { parseServerTime } from "@/lib/server-time";
export { tabJumpHotkeyKeys } from "@/lib/tab-jump-hotkey";
export {
ACCENT_PRESET_COLORS,
applyAccentColor,
applyFontSize,
applyUiFont,
DASHBOARD_CARDS,
FONT_SIZES,
UI_FONTS,
} from "@/lib/theme";
export { registerLayout } from "@/look/layout-registry";
export { useChooseTheme } from "@/look/use-look-theme";
export {
type AccessRecord,
type ActiveSessionInfo,
adminCreateUser,
adminCreateUserCredential,
adminCreateUserHost,
adminDeleteUserCredential,
adminDeleteUserHost,
adminExportUserData,
adminGetHostPassword,
adminGetUserCredentials,
adminGetUserHosts,
adminResetUserPassword,
adminUpdateUserCredential,
adminUpdateUserHost,
type ApiKey,
assignRoleToUser,
bulkUpdateSSHHosts,
changePassword,
createApiKey,
createCredential,
type CreatedApiKey,
createRole,
createSSHHost,
deleteAccount,
deleteAllHostsInFolder,
deleteApiKey,
deleteCredential,
deleteOpenTab,
deleteRole,
deleteSSHHost,
deleteUser,
duplicateCredential,
getActiveSessions,
getApiKeys,
getCredentialDetails,
getCredentialSidebarPreferences,
getExternalAutoProvision,
getHostAccess,
getHostAuthOverride,
getFolderAuthOverride,
getHostPassword,
getHostPolicy,
type HostPolicy,
getHostSidebarPreferences,
getHttpsSettings,
type HttpsSettings,
getLogLevel,
getPasswordLoginAllowed,
getPasswordResetAllowed,
getPermissionsCatalog,
getRegistrationAllowed,
getSecondFactorAfterExternalLogin,
getSessions,
getSessionTimeout,
getSSHFolders,
getSSHHosts,
getStatusCheckSettings,
getUserInfo,
getUserList,
getUserRoles,
type LinkedAccountInfo,
linkExternalToPasswordAccount,
logoutUser,
makeUserAdmin,
type OpenTabRecord,
type PermissionCatalogEntry,
releaseUrlFrom,
removeAdminStatus,
removeRoleFromUser,
renameCredentialFolder,
renameFolder,
reorderCredentials,
reorderFolders,
reorderSSHHosts,
resetRecentActivity,
revokeAllUserSessions,
revokeHostAccess,
revokeSession,
type Role,
saveCredentialSidebarPreferences,
saveHostSidebarPreferences,
setHostAuthOverride,
setFolderAuthOverride,
shareFolder,
shareHost,
type SSHHostWithStatus,
unlinkExternalFromPasswordAccount,
updateCredential,
updateExternalAutoProvision,
updateFolderMetadata,
updateHostAccess,
updateHttpsSettings,
updateLogLevel,
updatePasswordLoginAllowed,
updatePasswordResetAllowed,
updateRegistrationAllowed,
updateRole,
updateSecondFactorAfterExternalLogin,
updateSessionTimeout,
updateSSHHost,
updateStatusCheckSettings,
type UserPreferences,
type UserRole,
} from "@/main-axios";
export {
MANAGE_REQUEST_EVENT,
type ManageMode,
type ManageRequest,
requestFromLegacyEvent,
requestManage,
takePendingManageRequest,
} from "@/manage/manage-requests";
export { useSshAuthEditors } from "@/plugin-host/auth-registry";
export { usePluginStore } from "@/plugin-host/plugin-store";
export { shell } from "@/plugin-host/shell-bridge";
export { OPEN_PLUGINS_EVENT } from "@/plugins/open-plugins";
export { isPrerelease } from "@/plugins/plugin-model";
export { usePluginHostSections } from "@/settings/HostPluginSections";
export { SettingsFieldRow } from "@/settings/SettingsFields";
export { LookSettings } from "@/look/LookSettings";
export { useThemeOptions } from "@/settings/appearance/appearance-controls";
export {
hasVisibleFields,
isFieldShown,
} from "@/settings/settings-fields-util";
export { NativeView, type NativeViewProps } from "./NativeView";
export { useShellController } from "@/shell/controller/ShellControllerProvider";
export {
type KeybindingActionDef,
useKeybindingActions,
useKeybindingDefaults,
} from "@/shell/keybinding-registry";
export {
filterPaletteItems,
loadPaletteGroup,
paletteEntriesFor,
type PaletteItemDef,
usePaletteEntries,
usePaletteGroups,
} from "@/shell/palette-registry";
export { getPanel, usePanels } from "@/shell/panel-registry";
export { SplitLayoutMenu } from "@/shell/split/SplitLayoutMenu";
export {
beginSplitDrag,
endSplitDrag,
isSplitDragging,
moveSplitDrag,
} from "@/shell/split/split-drag";
export {
canJoinSplit,
isSplitTab,
type SplitSummary,
type TabSplitAction,
} from "@/shell/split/split-tabs";
export {
openInSplit,
type SplitOpenTarget,
useSplitTargets,
} from "@/shell/split/split-targets";
export { MAX_PANES } from "@/shell/split/split-tree";
export { registerTabCloseGuard } from "@/shell/tab-close-guards";
export { useTabHandlesVersion } from "@/shell/tab-handles";
export {
getTabType,
isPersistentTabType,
isSessionTabType,
type TabShellCallbacks,
} from "@/shell/tab-registry";
export {
markTabSurfaceUsed,
preloadTabSurface,
tabIcon,
} from "@/shell/tabUtils";
export { AuthEnrollmentSections } from "@/sidebar/AuthEnrollmentSections";
export { mapCredentials, sshHostToHost } from "@/sidebar/HostManagerData";
export {
getHostEditorSection,
makeHostSshSubTabs,
makeHostTabs,
useHostEditorSections,
} from "@/sidebar/HostManagerTabs";
export {
actionOrder,
defaultConnectAction,
type HostActionDef,
hostActionsFor,
hostBadgesFor,
hostEditorToolbarItemsFor,
hostMenuItemsFor,
hostStatusIndicatorsFor,
listHostActions,
runHostAction,
useHostActions,
useHostBadges,
useHostContextMenuItems,
useHostEditorToolbarItems,
useHostStatusIndicators,
} from "@/sidebar/host-contributions";
export { useEditorDefaultKeys } from "@/sidebar/host-defaults/catalog";
export {
enabledHostProtocols,
type HostProtocolDef,
hostProtocolFlags,
type HostProtocols,
listHostProtocols,
protocolEnabled,
protocolPort,
useHostProtocols,
withProtocolSettings,
} from "@/sidebar/host-protocols";
export { quickConnectTargets } from "@/sidebar/quick-connect-host";
export {
groupRailItems,
isCoreRailView,
moveRailItem,
promotableIds,
type RailGroup,
type RailItemDef,
railItemLabel,
rightDockableIds,
useRailItems,
} from "@/sidebar/rail-items";