@termix-ssh/plugin-sdk 1.0.12 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/PLUGIN-GUIDE.md +106 -59
  3. package/dist/backend.d.ts +534 -1
  4. package/dist/backend.js +7 -0
  5. package/dist/capabilities.js +7 -0
  6. package/dist/db.js +1 -0
  7. package/dist/desktop.d.ts +0 -243
  8. package/dist/frontend.d.ts +23 -2
  9. package/dist/host/{PluginsTab-EV4MSGY6.js → PluginsTab-S33WIIGC.js} +511 -178
  10. package/dist/host/{chunk-AWR6FYDO.js → chunk-2IV3VX7F.js} +5552 -5550
  11. package/dist/host/{chunk-RUPLD6RF.js → chunk-3L45NNT5.js} +29 -84
  12. package/dist/host/{chunk-VEWOYAMZ.js → chunk-57DJU2ZA.js} +1 -1
  13. package/dist/host/{chunk-XKA3DBB2.js → chunk-V44FCJBQ.js} +135 -54
  14. package/dist/host/{chunk-X4QZKO5G.js → chunk-VFTB2RDP.js} +54 -5
  15. package/dist/host/core-classes.json +1 -1
  16. package/dist/host/{linked-server-B4NEG4MA.js → linked-server-SCJH7DSL.js} +1 -1
  17. package/dist/host/{rbac-api-OUO3LUOC.js → rbac-api-KA5IPQQL.js} +1 -1
  18. package/dist/host/testing-host.js +4 -4
  19. package/dist/host/types/src/types/index.d.ts +10 -0
  20. package/dist/host/types/src/types/onboarding.d.ts +0 -2
  21. package/dist/host/types/src/types/ui-types.d.ts +3 -1
  22. package/dist/host/types/src/ui/api/audit-log-api.d.ts +0 -10
  23. package/dist/host/types/src/ui/api/auth-methods-api.d.ts +2 -0
  24. package/dist/host/types/src/ui/api/credentials-api.d.ts +0 -22
  25. package/dist/host/types/src/ui/api/plugins-api.d.ts +4 -0
  26. package/dist/host/types/src/ui/api/settings-api.d.ts +6 -6
  27. package/dist/host/types/src/ui/api/ssh-host-management-api.d.ts +6 -28
  28. package/dist/host/types/src/ui/main-axios.d.ts +3 -3
  29. package/dist/host/types/src/ui/onboarding/onboarding-registry.d.ts +3 -1
  30. package/dist/host/types/src/ui/plugin-host/sdk-ui.d.ts +6 -7
  31. package/dist/host/types/src/ui/plugins/plugin-model.d.ts +20 -0
  32. package/dist/host/types/src/ui/plugins/use-plugins-manager.d.ts +3 -0
  33. package/dist/host/types/src/ui/sidebar/AuthEnrollmentSections.d.ts +4 -1
  34. package/dist/host/types/src/ui/sidebar/host-contributions.d.ts +10 -0
  35. package/dist/host/ui.js +36 -210
  36. package/dist/host/{use-permissions-6VSHHUMB.js → use-permissions-LLN6TLAL.js} +1 -1
  37. package/dist/manifest.d.ts +10 -1
  38. package/dist/manifest.js +16 -1
  39. package/dist/ssh-keys.d.ts +29 -0
  40. package/dist/ssh-keys.js +85 -0
  41. package/dist/testing.d.ts +52 -15
  42. package/dist/testing.js +279 -2
  43. package/dist/vitest-preset.js +23 -0
  44. package/package.json +5 -1
  45. package/schema/manifest.schema.json +12 -0
  46. package/dist/host/types/src/ui/sidebar/host-export-payload.d.ts +0 -30
@@ -103,15 +103,14 @@ export { ConnectionGate, useConnectionGate, type ConnectionGateController, type
103
103
  export { type ConnectionUnavailable } from "../components/connection/ConnectionScreen";
104
104
  export { APP_VERSION } from "../lib/app-version";
105
105
  export { Command as CommandPrimitive } from "cmdk";
106
- export { buildExportPayload, hostKey, maskSecrets, pluginSecretKeys, type ExportPayload, type FieldGroup, } from "../sidebar/host-export-payload";
107
106
  export { type AuthOverrideProtocol, SSH_AUTH_PROTOCOL, } from "../../types/auth-protocols";
108
107
  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";
109
108
  export { CORE_HOST_DEFAULTS, CORE_NAMESPACE, type DefaultOverrides, defaultValuesEqual, findCoreHostDefault, type HostDefaultsLevel, type ResolvedHostDefault, splitDefaultKey, } from "../../types/host-defaults";
110
109
  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";
111
- export type { HostData, HostProtocolAuthInput, ProxyNode, SSHHost, SSHHostData, } from "../../types";
112
- export { UI_AREA_KEYS, type UiAreaKey, type UiPreset, } from "../../types/ui-preferences";
110
+ export type { HostData, HostLock, HostProtocolAuthInput, ProxyNode, SSHHost, SSHHostData, } from "../../types";
111
+ export { PRESETS, UI_AREA_KEYS, type UiAreaKey, type UiPreset, } from "../../types/ui-preferences";
113
112
  export type { AdminSection, Credential, DashboardCardId, FontSizeId, Host, HostFolder, SharePermissionLevel, Tab, TabType, ThemeId, ToolsTab, UiFontId, } from "../../types/ui-types";
114
- export { type AuditLog, type AuditLogFilters, getAuditForwarding, getAuditLogActions, getAuditLogs, updateAuditForwarding, } from "../api/audit-log-api";
113
+ export { type AuditLog, type AuditLogFilters, getAuditLogActions, getAuditLogs, } from "../api/audit-log-api";
115
114
  export { getUserSecondFactors, resetUserSecondFactors, type UserSecondFactorSummary, } from "../api/auth-methods-api";
116
115
  export { getCredentials } from "../api/credentials-api";
117
116
  export { getFolderDefaultsId, getHostDefaultsLevel, type HostDefaultsChange, type HostDefaultsTarget, previewHostDefaultsLevel, resetHostToDefaults, resolveHostDefaults, saveHostDefaultsLevel, waitForDefaultsJob, } from "../api/host-defaults-api";
@@ -120,7 +119,7 @@ export { getSessionTimeoutMinutes, getUserPreferences, parseCustomKeybindings, s
120
119
  export { getDeveloperMode, getPluginAdminSettings, getPluginHostSettings, getPlugins, getPluginUserSettings, type PluginSettingsErrors, type PluginSettingsField, PluginSettingsValidationError, type PluginSummary, setAllPluginChannels, setDeveloperMode, setPluginOptions, updatePluginAdminSettings, updatePluginHostSettings, updatePluginUserSettings, } from "../api/plugins-api";
121
120
  export { getNotificationPrivateEndpoints, setNotificationPrivateEndpoints, } from "../api/private-endpoints-api";
122
121
  export { type CredentialPermissionLevel, type FolderAccessRule, getCredentialAccess, getFolderAccess, getRoles, revokeCredentialAccess, revokeFolderAccess, shareCredential, type ShareTarget, } from "../api/rbac-api";
123
- export { type BrandingSettings, getBranding, updateBranding, } from "../api/settings-api";
122
+ export { type BrandingSettings, getBranding } from "../api/settings-api";
124
123
  export { getSyncConflicts, getSyncErrors, retrySyncErrors, settleSyncConflict, type SyncBasicAuth, type SyncConflictItem, type SyncEntityInfo, type SyncErrorItem, syncNow, type SyncProxyHeader, type SyncStatus, unlinkServer, updateSyncSettings, } from "../api/sync-api";
125
124
  export { getChannelReleases, getUpdateChannel, type ReleaseInfo, setUpdateChannel, type UpdateChannelState, } from "../api/system-status-api";
126
125
  export { getTlsStatus, type TlsStatus, uploadTlsCertificate, } from "../api/tls-api";
@@ -166,7 +165,7 @@ export { tabJumpHotkeyKeys } from "../lib/tab-jump-hotkey";
166
165
  export { ACCENT_PRESET_COLORS, applyAccentColor, applyFontSize, applyUiFont, DASHBOARD_CARDS, FONT_SIZES, UI_FONTS, } from "../lib/theme";
167
166
  export { registerLayout } from "../look/layout-registry";
168
167
  export { useChooseTheme } from "../look/use-look-theme";
169
- export { type AccessRecord, type ActiveSessionInfo, adminCreateUser, adminCreateUserCredential, adminCreateUserHost, adminDeleteUserCredential, adminDeleteUserHost, adminExportUserData, adminGetHostPassword, adminGetUserCredentials, adminGetUserHosts, adminResetUserPassword, adminUpdateUserCredential, adminUpdateUserHost, type ApiKey, assignRoleToUser, bulkImportSSHHosts, bulkUpdateSSHHosts, changePassword, createApiKey, createCredential, type CreatedApiKey, createRole, createSSHHost, deleteAccount, deleteAllHostsInFolder, deleteApiKey, deleteCredential, deleteOpenTab, deleteRole, deleteSSHHost, deleteUser, deployCredentialToHost, duplicateCredential, exportAllSSHHosts, generateKeyPair, generatePublicKeyFromPrivate, getActiveSessions, getApiKeys, getCredentialDetails, getCredentialSidebarPreferences, getExternalAutoProvision, getHostAccess, getHostAuthOverride, getHostPassword, getHostSidebarPreferences, getLogLevel, getPasswordLoginAllowed, getPasswordResetAllowed, getPermissionsCatalog, getRegistrationAllowed, getSecondFactorAfterExternalLogin, getSessions, getSessionTimeout, getSSHFolders, getSSHHosts, getStatusCheckSettings, getUserInfo, getUserList, getUserRoles, importSSHConfigHosts, 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, shareFolder, shareHost, type SSHHostWithStatus, unlinkExternalFromPasswordAccount, updateCredential, updateExternalAutoProvision, updateFolderMetadata, updateHostAccess, updateLogLevel, updatePasswordLoginAllowed, updatePasswordResetAllowed, updateRegistrationAllowed, updateRole, updateSecondFactorAfterExternalLogin, updateSessionTimeout, updateSSHHost, updateStatusCheckSettings, type UserPreferences, type UserRole, } from "../main-axios";
168
+ 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, 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, 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";
170
169
  export { MANAGE_REQUEST_EVENT, type ManageMode, type ManageRequest, requestFromLegacyEvent, requestManage, takePendingManageRequest, } from "../manage/manage-requests";
171
170
  export { useSshAuthEditors } from "./auth-registry";
172
171
  export { usePluginStore } from "./plugin-store";
@@ -196,7 +195,7 @@ export { markTabSurfaceUsed, preloadTabSurface, tabIcon, } from "../shell/tabUti
196
195
  export { AuthEnrollmentSections } from "../sidebar/AuthEnrollmentSections";
197
196
  export { mapCredentials, sshHostToHost } from "../sidebar/HostManagerData";
198
197
  export { getHostEditorSection, makeHostSshSubTabs, makeHostTabs, useHostEditorSections, } from "../sidebar/HostManagerTabs";
199
- export { actionOrder, defaultConnectAction, type HostActionDef, hostActionsFor, hostBadgesFor, hostMenuItemsFor, listHostActions, runHostAction, useHostActions, useHostBadges, useHostContextMenuItems, } from "../sidebar/host-contributions";
198
+ export { actionOrder, defaultConnectAction, type HostActionDef, hostActionsFor, hostBadgesFor, hostEditorToolbarItemsFor, hostMenuItemsFor, hostStatusIndicatorsFor, listHostActions, runHostAction, useHostActions, useHostBadges, useHostContextMenuItems, useHostEditorToolbarItems, useHostStatusIndicators, } from "../sidebar/host-contributions";
200
199
  export { useEditorDefaultKeys } from "../sidebar/host-defaults/catalog";
201
200
  export { enabledHostProtocols, type HostProtocolDef, hostProtocolFlags, type HostProtocols, listHostProtocols, protocolEnabled, protocolPort, useHostProtocols, withProtocolSettings, } from "../sidebar/host-protocols";
202
201
  export { quickConnectTargets } from "../sidebar/quick-connect-host";
@@ -49,6 +49,12 @@ export interface PluginEntry {
49
49
  managedByServer: boolean;
50
50
  /** The app is drawn with it by default, so it can be swapped but not uninstalled. */
51
51
  defaultLook: boolean;
52
+ /** Contribution keys from the manifest or the registry, like layouts. */
53
+ kinds: string[];
54
+ /** Listed, but no release runs on this build. */
55
+ unsupported: boolean;
56
+ /** The Termix range the newest release needs, when this build is too old. */
57
+ needsTermix: string | null;
52
58
  }
53
59
  export type PluginSource = "bundled" | "official" | "community" | "custom" | "unverified";
54
60
  export declare function isPrerelease(version: string | null | undefined): boolean;
@@ -64,6 +70,20 @@ export type SortKey = "popular" | "name" | "updated" | "category";
64
70
  export declare function sortPlugins(rows: PluginEntry[], key: SortKey): PluginEntry[];
65
71
  export declare function matchesQuery(row: PluginEntry, query: string): boolean;
66
72
  export declare function categoriesOf(rows: PluginEntry[]): string[];
73
+ /** Contribution keys worth filtering by, in the order the filter lists them. */
74
+ export declare const PLUGIN_KINDS: readonly ["layouts", "themes", "tabs", "panels", "dashboardCards", "protocols", "auth", "actions", "hostCapability"];
75
+ export type PluginKind = (typeof PLUGIN_KINDS)[number];
76
+ /** The filterable kinds present in a set of rows, with how many have each. */
77
+ export declare function kindsOf(rows: PluginEntry[]): Array<{
78
+ kind: PluginKind;
79
+ count: number;
80
+ }>;
81
+ /** One page of rows, with the page clamped to what exists. */
82
+ export declare function pageOf<T>(rows: T[], page: number, size: number): {
83
+ items: T[];
84
+ page: number;
85
+ pages: number;
86
+ };
67
87
  export declare function capabilityRisk(capability: string): CapabilityRisk;
68
88
  /** Worst first, the order the consent copy is read in. */
69
89
  export declare function orderByRisk(capabilities: string[]): string[];
@@ -40,6 +40,9 @@ export declare function usePluginsManager(): {
40
40
  registryName: string | null;
41
41
  managedByServer: boolean;
42
42
  defaultLook: boolean;
43
+ kinds: string[];
44
+ unsupported: boolean;
45
+ needsTermix: string | null;
43
46
  }[];
44
47
  loading: boolean;
45
48
  refreshing: boolean;
@@ -2,4 +2,7 @@
2
2
  * Enrolment sections login methods and second factors register, such as
3
3
  * adding a passkey or setting up an authenticator app.
4
4
  */
5
- export declare function AuthEnrollmentSections(): import("react").JSX.Element;
5
+ export declare function AuthEnrollmentSections({ factorsOnly, }?: {
6
+ /** Only second factors, for a login policy that requires one. */
7
+ factorsOnly?: boolean;
8
+ }): import("react").JSX.Element;
@@ -45,6 +45,10 @@ export interface HostBadgeDef {
45
45
  }>;
46
46
  order?: number;
47
47
  }
48
+ /** The dot or stripe on a host row that shows its status. */
49
+ export type HostStatusIndicatorDef = HostBadgeDef;
50
+ /** A button in the host editor's toolbar. */
51
+ export type HostEditorToolbarItemDef = HostBadgeDef;
48
52
  export interface HostContextMenuItemDef {
49
53
  id: string;
50
54
  pluginId?: string;
@@ -61,12 +65,18 @@ export declare function actionOrder(action: HostActionDef): number;
61
65
  export declare const listHostActions: () => HostActionDef[];
62
66
  export declare const registerHostBadge: (item: HostBadgeDef) => () => void;
63
67
  export declare const useHostBadges: () => HostBadgeDef[];
68
+ export declare const registerHostStatusIndicator: (item: HostBadgeDef) => () => void;
69
+ export declare const useHostStatusIndicators: () => HostBadgeDef[];
70
+ export declare const registerHostEditorToolbarItem: (item: HostBadgeDef) => () => void;
71
+ export declare const useHostEditorToolbarItems: () => HostBadgeDef[];
64
72
  export declare const registerHostContextMenuItem: (item: HostContextMenuItemDef) => () => void;
65
73
  export declare const useHostContextMenuItems: () => HostContextMenuItemDef[];
66
74
  export declare function hostActionsFor(all: HostActionDef[], host: Host, kind?: HostActionDef["kind"]): HostActionDef[];
67
75
  /** The connect action a click on the host should run, by priority. */
68
76
  export declare function defaultConnectAction(all: HostActionDef[], host: Host): HostActionDef | undefined;
69
77
  export declare function hostBadgesFor(all: HostBadgeDef[], host: Host): HostBadgeDef[];
78
+ export declare function hostStatusIndicatorsFor(all: HostStatusIndicatorDef[], host: Host): HostStatusIndicatorDef[];
79
+ export declare function hostEditorToolbarItemsFor(all: HostEditorToolbarItemDef[], host: Host): HostEditorToolbarItemDef[];
70
80
  export declare function hostMenuItemsFor(all: HostContextMenuItemDef[], host: Host): HostContextMenuItemDef[];
71
81
  /** Runs an action, falling back to opening its tab type. */
72
82
  export declare function runHostAction(action: HostActionDef, host: Host, shell: TabShellCallbacks): void;
package/dist/host/ui.js CHANGED
@@ -52,6 +52,7 @@ import {
52
52
  getPollingEnvironmentMultiplier,
53
53
  getPreferredHostAction,
54
54
  getRegisteredDashboardCard,
55
+ getRememberDeviceAllowed,
55
56
  getStatusClasses,
56
57
  getSyncConflicts,
57
58
  getSyncErrors,
@@ -61,8 +62,10 @@ import {
61
62
  hostActionsFor,
62
63
  hostBadgesFor,
63
64
  hostEditorSectionList,
65
+ hostEditorToolbarItemsFor,
64
66
  hostMenuItemsFor,
65
67
  hostProtocolFlags,
68
+ hostStatusIndicatorsFor,
66
69
  i18n_default,
67
70
  installPluginHostBridge,
68
71
  isCoreRailView,
@@ -139,8 +142,10 @@ import {
139
142
  useHostBadges,
140
143
  useHostContextMenuItems,
141
144
  useHostEditorSections,
145
+ useHostEditorToolbarItems,
142
146
  useHostProtocols,
143
147
  useHostStatus,
148
+ useHostStatusIndicators,
144
149
  useInstalledPlugins,
145
150
  useIsMobile,
146
151
  useKeybindingActions,
@@ -169,10 +174,10 @@ import {
169
174
  useThemes,
170
175
  verifySecondFactor,
171
176
  withProtocolSettings
172
- } from "./chunk-XKA3DBB2.js";
177
+ } from "./chunk-V44FCJBQ.js";
173
178
  import {
174
179
  usePermissions
175
- } from "./chunk-VEWOYAMZ.js";
180
+ } from "./chunk-57DJU2ZA.js";
176
181
  import {
177
182
  AddButton,
178
183
  Card,
@@ -193,7 +198,7 @@ import {
193
198
  isPrerelease,
194
199
  reportBetaFeedbackUrl,
195
200
  reportCoreIssueUrl
196
- } from "./chunk-X4QZKO5G.js";
201
+ } from "./chunk-VFTB2RDP.js";
197
202
  import {
198
203
  Action,
199
204
  Activity,
@@ -383,7 +388,7 @@ import {
383
388
  useSurfaceKind,
384
389
  useUiPreference,
385
390
  useUiPreferencesContext
386
- } from "./chunk-AWR6FYDO.js";
391
+ } from "./chunk-2IV3VX7F.js";
387
392
  import {
388
393
  CREDENTIAL_ROW_FIELD_KEYS,
389
394
  PRESETS,
@@ -404,7 +409,6 @@ import {
404
409
  assignRoleToUser,
405
410
  authApi,
406
411
  buildOriginWsUrl,
407
- bulkImportSSHHosts,
408
412
  bulkUpdateSSHHosts,
409
413
  changePassword,
410
414
  completePasswordReset,
@@ -426,11 +430,7 @@ import {
426
430
  deleteRole,
427
431
  deleteSSHHost,
428
432
  deleteUser,
429
- deployCredentialToHost,
430
433
  duplicateCredential,
431
- exportAllSSHHosts,
432
- generateKeyPair,
433
- generatePublicKeyFromPrivate,
434
434
  getActiveSessions,
435
435
  getApiKeys,
436
436
  getBackendUrl,
@@ -451,7 +451,9 @@ import {
451
451
  getHostAccess,
452
452
  getHostAuthOverride,
453
453
  getHostPassword,
454
+ getHostPolicy,
454
455
  getHostSidebarPreferences,
456
+ getHttpsSettings,
455
457
  getLogLevel,
456
458
  getPasswordLoginAllowed,
457
459
  getPasswordResetAllowed,
@@ -480,7 +482,6 @@ import {
480
482
  handleApiError,
481
483
  hostApi,
482
484
  hydrateLocalSharedHostAuth,
483
- importSSHConfigHosts,
484
485
  initiatePasswordReset,
485
486
  invalidateHostsAndStatusCaches,
486
487
  invalidateServerStatusCache,
@@ -529,11 +530,11 @@ import {
529
530
  sshHostApi,
530
531
  tabTypeForActivity,
531
532
  unlinkExternalFromPasswordAccount,
532
- updateBranding,
533
533
  updateCredential,
534
534
  updateExternalAutoProvision,
535
535
  updateFolderMetadata,
536
536
  updateHostAccess,
537
+ updateHttpsSettings,
537
538
  updateLogLevel,
538
539
  updatePasswordLoginAllowed,
539
540
  updatePasswordResetAllowed,
@@ -547,7 +548,7 @@ import {
547
548
  useTabs,
548
549
  useTabsSafe,
549
550
  verifyPasswordResetCode
550
- } from "./chunk-RUPLD6RF.js";
551
+ } from "./chunk-3L45NNT5.js";
551
552
  import {
552
553
  define_import_meta_env_default,
553
554
  init_define_import_meta_env
@@ -4346,6 +4347,7 @@ function Auth({ onLogin }) {
4346
4347
  const [username, setUsername] = useState7("");
4347
4348
  const [password, setPassword] = useState7("");
4348
4349
  const [confirmPassword, setConfirmPassword] = useState7("");
4350
+ const [rememberAllowed, setRememberAllowed] = useState7(true);
4349
4351
  const [rememberMe, setRememberMe] = useState7(() => {
4350
4352
  try {
4351
4353
  return localStorage.getItem("rememberMe") === "true";
@@ -4466,6 +4468,11 @@ function Auth({ onLogin }) {
4466
4468
  getPasswordResetAllowed().then((allowed) => setPasswordResetAllowed(allowed)).catch(() => setPasswordResetAllowed(false));
4467
4469
  void startPreLoginPlugins().catch(() => {
4468
4470
  }).finally(() => setAuthPluginsLoading(false));
4471
+ getRememberDeviceAllowed().then((allowed) => {
4472
+ setRememberAllowed(allowed);
4473
+ if (!allowed) setRememberMe(false);
4474
+ }).catch(() => {
4475
+ });
4469
4476
  getLoginMethods().then((methods) => setAuthMethods(methods)).catch(() => setAuthMethods([])).finally(() => setAuthMethodsLoaded(true));
4470
4477
  }, [localDesktopAuth]);
4471
4478
  useEffect6(() => {
@@ -5361,7 +5368,7 @@ function Auth({ onLogin }) {
5361
5368
  /* @__PURE__ */ jsx28("p", { className: "text-xs text-muted-foreground", children: view === "login" ? t3("auth.loginSubtitle", "") : view === "register" ? t3("auth.registerSubtitle", "") : t3("auth.loginWithExternalDesc") })
5362
5369
  ] }),
5363
5370
  view === "external" && /* @__PURE__ */ jsxs20("div", { className: "flex flex-col gap-4", children: [
5364
- /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
5371
+ rememberAllowed && /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
5365
5372
  /* @__PURE__ */ jsx28(
5366
5373
  Checkbox,
5367
5374
  {
@@ -5412,7 +5419,7 @@ function Auth({ onLogin }) {
5412
5419
  }
5413
5420
  ) }),
5414
5421
  /* @__PURE__ */ jsxs20("div", { className: "flex items-center justify-between", children: [
5415
- /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
5422
+ rememberAllowed ? /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
5416
5423
  /* @__PURE__ */ jsx28(
5417
5424
  Checkbox,
5418
5425
  {
@@ -5430,7 +5437,7 @@ function Auth({ onLogin }) {
5430
5437
  children: t3("auth.rememberMe")
5431
5438
  }
5432
5439
  )
5433
- ] }),
5440
+ ] }) : /* @__PURE__ */ jsx28("span", {}),
5434
5441
  passwordResetAllowed && /* @__PURE__ */ jsx28(
5435
5442
  "button",
5436
5443
  {
@@ -32199,167 +32206,6 @@ function B2({ asChild: r, children: o }, n) {
32199
32206
  }
32200
32207
  var Te = { position: "absolute", width: "1px", height: "1px", padding: "0", margin: "-1px", overflow: "hidden", clip: "rect(0, 0, 0, 0)", whiteSpace: "nowrap", borderWidth: "0" };
32201
32208
 
32202
- // src/ui/sidebar/host-export-payload.ts
32203
- init_define_import_meta_env();
32204
- var FIELD_GROUP_KEYS = {
32205
- connection: [
32206
- "connectionType",
32207
- "name",
32208
- "ip",
32209
- "port",
32210
- "username",
32211
- "folder",
32212
- "domain",
32213
- "security",
32214
- "ignoreCert"
32215
- ],
32216
- notes: ["notes"],
32217
- tags: ["tags", "pin"],
32218
- proxy: [
32219
- "useSocks5",
32220
- "socks5Host",
32221
- "socks5Port",
32222
- "socks5Username",
32223
- "socks5ProxyChain"
32224
- ],
32225
- jumpHosts: ["jumpHosts"],
32226
- // Every plugin's host settings, enable switches included.
32227
- featureFlags: ["pluginSettings", "forceKeyboardInteractive"],
32228
- advanced: [
32229
- "statusCheckEnabled",
32230
- "statusCheckInterval",
32231
- "terminalConfig",
32232
- "sshOptions"
32233
- ]
32234
- };
32235
- var SECRET_KEYS = [
32236
- "password",
32237
- "key",
32238
- "keyPassword",
32239
- "sudoPassword",
32240
- "socks5Password"
32241
- ];
32242
- var CREDENTIAL_KEYS = [
32243
- ...SECRET_KEYS,
32244
- "authType",
32245
- "keyType",
32246
- "credentialAlias",
32247
- "credentialId",
32248
- "overrideCredentialUsername"
32249
- ];
32250
- var TUPLE_KEYS = ["name", "ip", "port", "username", "connectionType"];
32251
- function pluginSecretKeys(summaries) {
32252
- const result = {};
32253
- for (const summary of summaries) {
32254
- for (const field of summary.contributes?.settings?.host?.fields ?? []) {
32255
- if (!field.secretKeys?.length) continue;
32256
- (result[summary.id] ??= {})[field.key] = field.secretKeys;
32257
- }
32258
- }
32259
- return result;
32260
- }
32261
- var NESTED_SECRET_ARRAYS = [
32262
- { container: "socks5ProxyChain", field: "password" }
32263
- ];
32264
- function mapPluginSecrets(pluginSettings, secrets, replace2) {
32265
- if (!pluginSettings || typeof pluginSettings !== "object") {
32266
- return pluginSettings;
32267
- }
32268
- const perPlugin = {};
32269
- for (const [pluginId, values] of Object.entries(
32270
- pluginSettings
32271
- )) {
32272
- const copy = { ...values };
32273
- for (const [field, keys2] of Object.entries(secrets[pluginId] ?? {})) {
32274
- const blob = copy[field];
32275
- if (!blob || typeof blob !== "object") continue;
32276
- const record = { ...blob };
32277
- for (const key of keys2) {
32278
- if (key in record) record[key] = replace2(record[key]);
32279
- }
32280
- copy[field] = record;
32281
- }
32282
- perPlugin[pluginId] = copy;
32283
- }
32284
- return perPlugin;
32285
- }
32286
- function hostKey(host) {
32287
- return JSON.stringify(TUPLE_KEYS.map((k3) => String(host[k3] ?? "")));
32288
- }
32289
- function buildExportPayload(raw, selected, groups, withCredentials, pluginSecrets = {}) {
32290
- const allowed = /* @__PURE__ */ new Set([
32291
- "exportId",
32292
- ...CREDENTIAL_KEYS,
32293
- ...FIELD_GROUP_KEYS.connection
32294
- ]);
32295
- for (const group of groups) {
32296
- for (const key of FIELD_GROUP_KEYS[group]) allowed.add(key);
32297
- }
32298
- const hosts = (raw.hosts ?? []).filter((host) => selected === null || selected.has(hostKey(host))).map((host) => {
32299
- const shaped = {};
32300
- for (const [key, value] of Object.entries(host)) {
32301
- if (allowed.has(key)) shaped[key] = value;
32302
- }
32303
- if (!withCredentials) {
32304
- shaped.pluginSettings = mapPluginSecrets(
32305
- shaped.pluginSettings,
32306
- pluginSecrets,
32307
- () => null
32308
- );
32309
- for (const { container, field } of NESTED_SECRET_ARRAYS) {
32310
- const arr = shaped[container];
32311
- if (Array.isArray(arr)) {
32312
- shaped[container] = arr.map(
32313
- (entry) => entry && typeof entry === "object" ? { ...entry, [field]: null } : entry
32314
- );
32315
- }
32316
- }
32317
- }
32318
- return shaped;
32319
- });
32320
- const result = { ...raw, hosts };
32321
- if (raw.credentials) {
32322
- const used = new Set(
32323
- hosts.map((host) => host.credentialAlias).filter(Boolean)
32324
- );
32325
- result.credentials = raw.credentials.filter(
32326
- (entry) => used.has(entry.alias)
32327
- );
32328
- }
32329
- return result;
32330
- }
32331
- function maskSecrets(payload, pluginSecrets = {}) {
32332
- return {
32333
- ...payload,
32334
- hosts: payload.hosts.map((host) => {
32335
- const masked = { ...host };
32336
- for (const key of SECRET_KEYS) {
32337
- if (masked[key] !== void 0 && masked[key] !== null && masked[key] !== "") {
32338
- masked[key] = "<included>";
32339
- }
32340
- }
32341
- masked.pluginSettings = mapPluginSecrets(
32342
- masked.pluginSettings,
32343
- pluginSecrets,
32344
- (value) => value ? "<included>" : value
32345
- );
32346
- for (const { container, field } of NESTED_SECRET_ARRAYS) {
32347
- const arr = masked[container];
32348
- if (Array.isArray(arr)) {
32349
- masked[container] = arr.map((entry) => {
32350
- if (entry && typeof entry === "object") {
32351
- const record = entry;
32352
- if (record[field]) return { ...record, [field]: "<included>" };
32353
- }
32354
- return entry;
32355
- });
32356
- }
32357
- }
32358
- return masked;
32359
- })
32360
- };
32361
- }
32362
-
32363
32209
  // src/types/auth-protocols.ts
32364
32210
  init_define_import_meta_env();
32365
32211
  var SSH_AUTH_PROTOCOL = "ssh";
@@ -32428,25 +32274,6 @@ async function getAuditLogActions() {
32428
32274
  handleApiError(error, "fetch audit log actions");
32429
32275
  }
32430
32276
  }
32431
- async function getAuditForwarding() {
32432
- try {
32433
- const response = await authApi.get("/users/audit-forwarding");
32434
- return response.data;
32435
- } catch (error) {
32436
- throw handleApiError(error, "get audit forwarding settings");
32437
- }
32438
- }
32439
- async function updateAuditForwarding(url, token) {
32440
- try {
32441
- const response = await authApi.patch("/users/audit-forwarding", {
32442
- url,
32443
- token
32444
- });
32445
- return response.data;
32446
- } catch (error) {
32447
- throw handleApiError(error, "update audit forwarding settings");
32448
- }
32449
- }
32450
32277
 
32451
32278
  // src/ui/api/host-defaults-api.ts
32452
32279
  init_define_import_meta_env();
@@ -34081,9 +33908,13 @@ function SplitLayoutMenu({
34081
33908
  init_define_import_meta_env();
34082
33909
  import { useTranslation as useTranslation28 } from "react-i18next";
34083
33910
  import { jsx as jsx57, jsxs as jsxs44 } from "react/jsx-runtime";
34084
- function AuthEnrollmentSections() {
33911
+ function AuthEnrollmentSections({
33912
+ factorsOnly = false
33913
+ } = {}) {
34085
33914
  const { t: t3 } = useTranslation28();
34086
- const sections = [...useLoginMethods(), ...useSecondFactors()].filter(
33915
+ const methods = useLoginMethods();
33916
+ const factors = useSecondFactors();
33917
+ const sections = [...factorsOnly ? [] : methods, ...factors].filter(
34087
33918
  (entry) => entry.enrollment
34088
33919
  );
34089
33920
  if (sections.length === 0) return null;
@@ -34226,6 +34057,7 @@ export {
34226
34057
  NumberField,
34227
34058
  OPEN_PLUGINS_EVENT,
34228
34059
  PANEL,
34060
+ PRESETS,
34229
34061
  PROMPT_BUTTON,
34230
34062
  PROMPT_DESTRUCTIVE_BUTTON,
34231
34063
  PROMPT_PRIMARY_BUTTON,
@@ -34323,9 +34155,7 @@ export {
34323
34155
  applyUiFont,
34324
34156
  assignRoleToUser,
34325
34157
  beginSplitDrag,
34326
- buildExportPayload,
34327
34158
  buildOriginWsUrl,
34328
- bulkImportSSHHosts,
34329
34159
  bulkUpdateSSHHosts,
34330
34160
  canConfigureUpdates,
34331
34161
  canJoinSplit,
@@ -34354,22 +34184,17 @@ export {
34354
34184
  deleteRole,
34355
34185
  deleteSSHHost,
34356
34186
  deleteUser,
34357
- deployCredentialToHost,
34358
34187
  desktopUpdates,
34359
34188
  docsUrl,
34360
34189
  duplicateCredential,
34361
34190
  enabledHostProtocols,
34362
34191
  endSplitDrag,
34363
- exportAllSSHHosts,
34364
34192
  filterPaletteItems,
34365
34193
  findCoreHostDefault,
34366
34194
  findMatchingKeybinding,
34367
- generateKeyPair,
34368
- generatePublicKeyFromPrivate,
34369
34195
  getActiveSessions,
34370
34196
  getAdaptiveResourceBudget,
34371
34197
  getApiKeys,
34372
- getAuditForwarding,
34373
34198
  getAuditLogActions,
34374
34199
  getAuditLogs,
34375
34200
  getBasePath,
@@ -34394,8 +34219,10 @@ export {
34394
34219
  getHostDefaultsLevel,
34395
34220
  getHostEditorSection,
34396
34221
  getHostPassword,
34222
+ getHostPolicy,
34397
34223
  getHostSidebarPreferences,
34398
34224
  getHostTags,
34225
+ getHttpsSettings,
34399
34226
  getLiveHostStatus,
34400
34227
  getLogLevel,
34401
34228
  getNotificationPrivateEndpoints,
@@ -34438,11 +34265,11 @@ export {
34438
34265
  hasVisibleFields,
34439
34266
  hostActionsFor,
34440
34267
  hostBadgesFor,
34441
- hostKey,
34268
+ hostEditorToolbarItemsFor,
34442
34269
  hostMenuItemsFor,
34443
34270
  hostProtocolFlags,
34271
+ hostStatusIndicatorsFor,
34444
34272
  hydrateLocalSharedHostAuth,
34445
- importSSHConfigHosts,
34446
34273
  invalidateHostsAndStatusCaches,
34447
34274
  invalidateServerStatusCache,
34448
34275
  isCoreRailView,
@@ -34467,7 +34294,6 @@ export {
34467
34294
  mapCredentials,
34468
34295
  markAdaptiveResourceUsed,
34469
34296
  markTabSurfaceUsed,
34470
- maskSecrets,
34471
34297
  moveRailItem,
34472
34298
  moveSplitDrag,
34473
34299
  normalizeLanguageCode,
@@ -34478,7 +34304,6 @@ export {
34478
34304
  parseServerTime,
34479
34305
  pluginKey,
34480
34306
  pluginName,
34481
- pluginSecretKeys,
34482
34307
  pluginWsUrl,
34483
34308
  preloadTabSurface,
34484
34309
  previewHostDefaultsLevel,
@@ -34551,12 +34376,11 @@ export {
34551
34376
  takePendingManageRequest,
34552
34377
  unlinkExternalFromPasswordAccount,
34553
34378
  unlinkServer,
34554
- updateAuditForwarding,
34555
- updateBranding,
34556
34379
  updateCredential,
34557
34380
  updateExternalAutoProvision,
34558
34381
  updateFolderMetadata,
34559
34382
  updateHostAccess,
34383
+ updateHttpsSettings,
34560
34384
  updateLogLevel,
34561
34385
  updatePasswordLoginAllowed,
34562
34386
  updatePasswordResetAllowed,
@@ -34588,8 +34412,10 @@ export {
34588
34412
  useHostBadges,
34589
34413
  useHostContextMenuItems,
34590
34414
  useHostEditorSections,
34415
+ useHostEditorToolbarItems,
34591
34416
  useHostProtocols,
34592
34417
  useHostStatus,
34418
+ useHostStatusIndicators,
34593
34419
  useInstalledPlugins,
34594
34420
  useIsDefaultsEditor,
34595
34421
  useIsMobile,
@@ -7,7 +7,7 @@ import {
7
7
  resetPermissionsCache,
8
8
  setPermissionsForTesting,
9
9
  usePermissions
10
- } from "./chunk-VEWOYAMZ.js";
10
+ } from "./chunk-57DJU2ZA.js";
11
11
  import "./chunk-YGYBM7SQ.js";
12
12
  export {
13
13
  hasPermission,
@@ -20,7 +20,7 @@ export { ENV_NAME_PATTERN, MAX_ENV_DESCRIPTION_LENGTH, pluginDocsPage, pluginDoc
20
20
  * "^1.2" needs 1.2 or later). engine.termix is checked against the core
21
21
  * version by the server.
22
22
  */
23
- export declare const PLUGIN_API_VERSION = "1.4.0";
23
+ export declare const PLUGIN_API_VERSION = "1.7.0";
24
24
  /** The API major, the default engine.api for a new plugin. */
25
25
  export declare const SUPPORTED_PLUGIN_API_VERSION: string;
26
26
  /** Whether this build's plugin API satisfies a manifest's engine.api. */
@@ -500,7 +500,16 @@ export interface PluginManifest {
500
500
  nativeDependencies?: string[];
501
501
  /** How a linked desktop treats this plugin. Defaults to "mirror". */
502
502
  desktop?: PluginDesktopMode;
503
+ /**
504
+ * "desktop": the plugin only loads on a desktop app's own embedded backend,
505
+ * never on a server. It implies desktop "local" and may declare desktop:local.
506
+ */
507
+ runtime?: PluginRuntime;
503
508
  }
509
+ export type PluginRuntime = "desktop";
510
+ export declare const PLUGIN_RUNTIMES: readonly PluginRuntime[];
511
+ /** The desktop mode a manifest resolves to. */
512
+ export declare function resolvePluginDesktopMode(m: Pick<PluginManifest, "desktop" | "runtime">): PluginDesktopMode;
504
513
  export declare const DEFAULT_BACKEND_ENTRY = "dist/backend.js";
505
514
  export declare const DEFAULT_FRONTEND_ENTRY = "dist/frontend.js";
506
515
  export declare const DEFAULT_LOCALES_DIR = "locales";