@termix-ssh/plugin-sdk 1.0.10 → 1.0.12

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 (123) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/PLUGIN-GUIDE.md +151 -36
  3. package/cli/commands/build.mjs +36 -22
  4. package/cli/commands/pack.mjs +12 -2
  5. package/cli/commands/validate.mjs +63 -3
  6. package/cli/lib/plugin-dir.mjs +11 -0
  7. package/cli/lib/tmxplug.mjs +9 -0
  8. package/dist/backend.d.ts +37 -3
  9. package/dist/capabilities.js +2 -0
  10. package/dist/frontend.d.ts +152 -0
  11. package/dist/frontend.js +7 -0
  12. package/dist/host/PluginsTab-EV4MSGY6.js +2933 -0
  13. package/dist/host/{chunk-G346FUE4.js → chunk-AWR6FYDO.js} +8877 -11159
  14. package/dist/host/{chunk-NZG6HNQH.js → chunk-RUPLD6RF.js} +1504 -15
  15. package/dist/host/{chunk-DIOJ3KW2.js → chunk-VEWOYAMZ.js} +6 -1
  16. package/dist/host/chunk-X4QZKO5G.js +3120 -0
  17. package/dist/host/chunk-XKA3DBB2.js +10375 -0
  18. package/dist/host/chunk-YGYBM7SQ.js +58 -0
  19. package/dist/host/core-classes.json +1 -1
  20. package/dist/host/{linked-server-QAKKDBFM.js → linked-server-B4NEG4MA.js} +2 -2
  21. package/dist/host/{rbac-api-5267EMX7.js → rbac-api-OUO3LUOC.js} +2 -2
  22. package/dist/host/testing-host.js +123 -57
  23. package/dist/host/types/src/types/ui-types.d.ts +2 -1
  24. package/dist/host/types/src/ui/api/audit-log-api.d.ts +46 -0
  25. package/dist/host/types/src/ui/api/host-defaults-api.d.ts +42 -0
  26. package/dist/host/types/src/ui/api/host-tags-api.d.ts +2 -0
  27. package/dist/host/types/src/ui/api/look-api.d.ts +40 -0
  28. package/dist/host/types/src/ui/api/open-tabs-api.d.ts +4 -0
  29. package/dist/host/types/src/ui/api/plugins-api.d.ts +26 -0
  30. package/dist/host/types/src/ui/api/private-endpoints-api.d.ts +6 -0
  31. package/dist/host/types/src/ui/api/tls-api.d.ts +25 -0
  32. package/dist/host/types/src/ui/auth/ElectronLoginForm.d.ts +9 -0
  33. package/dist/host/types/src/ui/components/command.d.ts +78 -0
  34. package/dist/host/types/src/ui/components/folder-style.d.ts +16 -0
  35. package/dist/host/types/src/ui/components/theme-provider.d.ts +2 -1
  36. package/dist/host/types/src/ui/components/version-badge.d.ts +7 -0
  37. package/dist/host/types/src/ui/hooks/use-page-visible-interval.d.ts +10 -0
  38. package/dist/host/types/src/ui/lib/activity-types.d.ts +15 -0
  39. package/dist/host/types/src/ui/lib/app-version.d.ts +2 -0
  40. package/dist/host/types/src/ui/lib/apply-ui-preset.d.ts +19 -0
  41. package/dist/host/types/src/ui/lib/connection-origin.d.ts +4 -5
  42. package/dist/host/types/src/ui/lib/create-id.d.ts +2 -0
  43. package/dist/host/types/src/ui/lib/database-transfer-url.d.ts +8 -0
  44. package/dist/host/types/src/ui/lib/desktop-updates.d.ts +29 -0
  45. package/dist/host/types/src/ui/lib/electron.d.ts +5 -0
  46. package/dist/host/types/src/ui/lib/host-connection-tabs.d.ts +14 -0
  47. package/dist/host/types/src/ui/lib/host-to-ssh-host.d.ts +4 -0
  48. package/dist/host/types/src/ui/lib/issue-url.d.ts +21 -0
  49. package/dist/host/types/src/ui/lib/local-adaptive-preferences.d.ts +9 -0
  50. package/dist/host/types/src/ui/lib/pane-nav-hotkey.d.ts +7 -0
  51. package/dist/host/types/src/ui/lib/plugin-i18n.d.ts +16 -0
  52. package/dist/host/types/src/ui/lib/role-label.d.ts +3 -0
  53. package/dist/host/types/src/ui/look/LookSettings.d.ts +8 -0
  54. package/dist/host/types/src/ui/look/layout-registry.d.ts +34 -0
  55. package/dist/host/types/src/ui/look/look-store.d.ts +29 -0
  56. package/dist/host/types/src/ui/look/resolve-look.d.ts +18 -0
  57. package/dist/host/types/src/ui/look/theme-css.d.ts +7 -0
  58. package/dist/host/types/src/ui/look/theme-registry.d.ts +41 -0
  59. package/dist/host/types/src/ui/look/use-look-theme.d.ts +12 -0
  60. package/dist/host/types/src/ui/manage/manage-requests.d.ts +34 -0
  61. package/dist/host/types/src/ui/plugin-host/loader.d.ts +2 -0
  62. package/dist/host/types/src/ui/plugin-host/scope.d.ts +6 -0
  63. package/dist/host/types/src/ui/plugin-host/sdk-ui.d.ts +102 -0
  64. package/dist/host/types/src/ui/plugin-host/view-ownership.d.ts +1 -1
  65. package/dist/host/types/src/ui/plugins/PluginConsentPrompt.d.ts +20 -0
  66. package/dist/host/types/src/ui/plugins/PluginDetail.d.ts +7 -0
  67. package/dist/host/types/src/ui/plugins/PluginReleaseNotes.d.ts +14 -0
  68. package/dist/host/types/src/ui/plugins/PluginsTab.d.ts +1 -0
  69. package/dist/host/types/src/ui/plugins/RegistriesSection.d.ts +4 -0
  70. package/dist/host/types/src/ui/plugins/plugin-bits.d.ts +23 -0
  71. package/dist/host/types/src/ui/plugins/plugin-model.d.ts +116 -0
  72. package/dist/host/types/src/ui/plugins/use-plugins-manager.d.ts +75 -0
  73. package/dist/host/types/src/ui/settings/appearance/appearance-controls.d.ts +53 -0
  74. package/dist/host/types/src/ui/settings/sync/LinkServerDialog.d.ts +12 -0
  75. package/dist/host/types/src/ui/settings/sync/ProxySettingsFields.d.ts +15 -0
  76. package/dist/host/types/src/ui/settings/sync/saved-servers.d.ts +3 -0
  77. package/dist/host/types/src/ui/shell/controller/ShellControllerProvider.d.ts +20 -0
  78. package/dist/host/types/src/ui/shell/controller/plugin-shell.d.ts +7 -0
  79. package/dist/host/types/src/ui/shell/controller/shell-store.d.ts +4 -0
  80. package/dist/host/types/src/ui/shell/controller/types.d.ts +156 -0
  81. package/dist/host/types/src/ui/shell/controller/use-hosts.d.ts +10 -0
  82. package/dist/host/types/src/ui/shell/controller/use-regions.d.ts +5 -0
  83. package/dist/host/types/src/ui/shell/controller/use-shell-keybindings.d.ts +12 -0
  84. package/dist/host/types/src/ui/shell/controller/use-shell-lifecycle.d.ts +17 -0
  85. package/dist/host/types/src/ui/shell/controller/use-split.d.ts +21 -0
  86. package/dist/host/types/src/ui/shell/controller/use-tabs.d.ts +70 -0
  87. package/dist/host/types/src/ui/shell/controller/use-workspace-layout.d.ts +4 -0
  88. package/dist/host/types/src/ui/shell/reconnect-tabs.d.ts +6 -0
  89. package/dist/host/types/src/ui/shell/shell-layout.d.ts +46 -0
  90. package/dist/host/types/src/ui/shell/split/EmptyPanePicker.d.ts +32 -0
  91. package/dist/host/types/src/ui/shell/split/SplitDropOverlay.d.ts +9 -0
  92. package/dist/host/types/src/ui/shell/split/SplitLayoutMenu.d.ts +16 -0
  93. package/dist/host/types/src/ui/shell/split/SplitView.d.ts +31 -0
  94. package/dist/host/types/src/ui/shell/split/split-drag.d.ts +58 -0
  95. package/dist/host/types/src/ui/shell/split/split-presets.d.ts +28 -0
  96. package/dist/host/types/src/ui/shell/split/split-tabs.d.ts +95 -0
  97. package/dist/host/types/src/ui/shell/split/split-targets.d.ts +30 -0
  98. package/dist/host/types/src/ui/shell/split/split-tree.d.ts +89 -0
  99. package/dist/host/types/src/ui/shell/stage/TabStage.d.ts +9 -0
  100. package/dist/host/types/src/ui/shell/stage/tab-stage-store.d.ts +24 -0
  101. package/dist/host/types/src/ui/shell/tab-close-guards.d.ts +9 -0
  102. package/dist/host/types/src/ui/shell/tab-handles.d.ts +8 -0
  103. package/dist/host/types/src/ui/shell/tabUtils.d.ts +15 -0
  104. package/dist/host/types/src/ui/sidebar/AuthEnrollmentSections.d.ts +5 -0
  105. package/dist/host/types/src/ui/sidebar/HostManagerData.d.ts +4 -0
  106. package/dist/host/types/src/ui/sidebar/HostManagerTabs.d.ts +10 -4
  107. package/dist/host/types/src/ui/sidebar/build-host-tree.d.ts +25 -0
  108. package/dist/host/types/src/ui/sidebar/host-export-payload.d.ts +30 -0
  109. package/dist/host/ui.js +6238 -4054
  110. package/dist/host/{use-permissions-2P2TP6GY.js → use-permissions-6VSHHUMB.js} +2 -2
  111. package/dist/manifest.d.ts +41 -1
  112. package/dist/manifest.js +89 -1
  113. package/dist/testing/setup.js +1 -0
  114. package/dist/testing.d.ts +12 -1
  115. package/dist/testing.js +25 -1
  116. package/dist/theme-css.d.ts +11 -0
  117. package/dist/theme-css.js +142 -0
  118. package/dist/vitest-preset.d.ts +18 -0
  119. package/dist/vitest-preset.js +14 -3
  120. package/package.json +1 -1
  121. package/schema/manifest.schema.json +111 -8
  122. package/tsconfig.plugin.json +1 -0
  123. package/dist/host/chunk-YC2MAKSP.js +0 -14
@@ -0,0 +1,89 @@
1
+ import type { LayoutNode, PaneNode, SplitDirection, SplitNode, SplitState } from "../../../types/ui-types";
2
+ /**
3
+ * The layout of one split tab: a tree where every leaf is a pane holding at
4
+ * most one tab, and every inner node lays its children out in a row (side by
5
+ * side) or a column (stacked). All functions here are pure and return a new
6
+ * state, so the shell can keep the whole thing on the split tab itself.
7
+ */
8
+ export declare const MAX_PANES = 8;
9
+ /** Smallest share of its parent a pane or group can be dragged down to. */
10
+ export declare const MIN_PANE_SIZE = 10;
11
+ export type { SplitDirection, PaneNode, SplitNode, LayoutNode, SplitState, } from "../../../types/ui-types";
12
+ export type PaneEdge = "left" | "right" | "top" | "bottom";
13
+ export type DropTarget = PaneEdge | "center";
14
+ export type NavDirection = "left" | "right" | "up" | "down";
15
+ export interface PaneRect {
16
+ left: number;
17
+ top: number;
18
+ right: number;
19
+ bottom: number;
20
+ }
21
+ export declare function createPane(tabId?: string | null): PaneNode;
22
+ export declare function evenSizes(count: number): number[];
23
+ export declare function createSplitNode(direction: SplitDirection, children: LayoutNode[], sizes?: number[]): SplitNode;
24
+ export declare function createSplitState(root: LayoutNode, focusedPaneId?: string): SplitState;
25
+ export declare function listPanes(node: LayoutNode): PaneNode[];
26
+ export declare function paneCount(state: SplitState): number;
27
+ export declare function findPane(state: SplitState, paneId: string): PaneNode | undefined;
28
+ export declare function findPaneByTab(state: SplitState, tabId: string): PaneNode | undefined;
29
+ export declare function emptyPanes(state: SplitState): PaneNode[];
30
+ export declare function tabIdsInSplit(state: SplitState): string[];
31
+ /**
32
+ * The panes on screen: just the zoomed one, just the focused one when only
33
+ * one fits (mobile), else all of them.
34
+ */
35
+ export declare function shownPanes(state: SplitState, onePaneOnly?: boolean): PaneNode[];
36
+ export declare function canAddPane(state: SplitState): boolean;
37
+ /**
38
+ * Collapses groups with one child, inlines a child group running the same
39
+ * way as its parent, and rescales sizes. Keeps the tree in the one shape the
40
+ * rest of the code expects after any edit.
41
+ */
42
+ export declare function normalizeNode(node: LayoutNode): LayoutNode;
43
+ /**
44
+ * Adds a pane next to `paneId`, holding `tabId` or empty. Null when the pane
45
+ * does not exist or the split is full.
46
+ */
47
+ export declare function splitPane(state: SplitState, paneId: string, edge: PaneEdge, tabId?: string | null): {
48
+ state: SplitState;
49
+ paneId: string;
50
+ } | null;
51
+ /** Adds a pane along one outer edge of the whole split. */
52
+ export declare function addPaneAtEdge(state: SplitState, edge: PaneEdge, tabId?: string | null): {
53
+ state: SplitState;
54
+ paneId: string;
55
+ } | null;
56
+ /** Removes a pane. Null when it was the last one, so the split should close. */
57
+ export declare function removePane(state: SplitState, paneId: string): SplitState | null;
58
+ /** Puts a tab in a pane (or empties it with null), moving it out of any other pane. */
59
+ export declare function assignTab(state: SplitState, paneId: string, tabId: string | null): SplitState;
60
+ /** Empties whichever pane holds the tab, leaving the pane in place. */
61
+ export declare function clearTab(state: SplitState, tabId: string): SplitState;
62
+ export declare function swapPanes(state: SplitState, firstId: string, secondId: string): SplitState;
63
+ /**
64
+ * Drops one pane onto another: the center swaps their contents, an edge
65
+ * moves the dragged pane to that side of the target.
66
+ */
67
+ export declare function movePane(state: SplitState, fromId: string, toId: string, target: DropTarget): SplitState;
68
+ export declare function focusPane(state: SplitState, paneId: string): SplitState;
69
+ export declare function toggleZoom(state: SplitState, paneId: string): SplitState;
70
+ export declare function resizeSplit(state: SplitState, splitId: string, sizes: number[]): SplitState;
71
+ export declare function equalizeSplit(state: SplitState, splitId: string): SplitState;
72
+ /**
73
+ * Moves the divider between children `index` and `index + 1` by `delta`
74
+ * percent, keeping both above MIN_PANE_SIZE.
75
+ */
76
+ export declare function moveDivider(sizes: number[], index: number, delta: number): number[];
77
+ /**
78
+ * Repairs a state read from storage or left over after tabs closed: drops
79
+ * tab ids that no longer exist, keeps each tab in one pane, fixes focus.
80
+ */
81
+ export declare function normalizeState(state: SplitState, isLiveTab?: (tabId: string) => boolean): SplitState;
82
+ /** Rewrites every pane's tab id, e.g. live ids to saved instance ids and back. */
83
+ export declare function mapTabIds(node: LayoutNode, fn: (tabId: string) => string | null): LayoutNode;
84
+ /**
85
+ * The pane next to `paneId` in a direction, by on-screen position. Picks the
86
+ * closest pane that overlaps along the other axis, then the one with the
87
+ * most overlap, so it works for any tree shape.
88
+ */
89
+ export declare function neighborPane(paneId: string, direction: NavDirection, rects: Record<string, PaneRect>): string | null;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The area tabs show in: the active tab, or the active split's panes, plus
3
+ * the drop zones for dragging a tab or pane into a split. A layout places it
4
+ * wherever its main area is. Tabs are never mounted here, only moved in, so
5
+ * moving or remounting the stage keeps every session alive.
6
+ */
7
+ export declare function TabStage({ className }: {
8
+ className?: string;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import type { Tab } from "../../../types/ui-types";
2
+ /**
3
+ * Where tab content lives in the DOM.
4
+ *
5
+ * Every tab gets one stable node, created once and kept while the tab lives.
6
+ * React portals the tab into that node and never changes the portal target,
7
+ * since changing it remounts the tab (and drops a live terminal). The node is
8
+ * moved with plain DOM between the stage's normal view and pane elements, or
9
+ * left detached while no stage is mounted, e.g. while a layout is swapped.
10
+ */
11
+ export interface TabStageStore {
12
+ getNode: (tabId: string, ownBackground: boolean) => HTMLDivElement;
13
+ /** Tab ids in the order their portals render: append only, never reordered. */
14
+ portalOrder: (tabs: Tab[]) => Tab[];
15
+ paneEls: Map<string, HTMLDivElement>;
16
+ setPaneEl: (paneId: string, el: HTMLDivElement | null) => void;
17
+ normalView: () => HTMLDivElement | null;
18
+ setNormalView: (el: HTMLDivElement | null) => void;
19
+ /** Moves every node where it belongs and sets its visibility. */
20
+ place: (tabs: Tab[], activeTabId: string, paneIdByTabId: Map<string, string>, ownBackground: (tab: Tab) => boolean) => void;
21
+ subscribe: (listener: () => void) => () => void;
22
+ version: () => number;
23
+ }
24
+ export declare function createTabStageStore(): TabStageStore;
@@ -0,0 +1,9 @@
1
+ type Guard = () => boolean | Promise<boolean>;
2
+ /**
3
+ * Lets a tab with no session handle, like Manage, ask before it closes.
4
+ * Returns the unregister function.
5
+ */
6
+ export declare function registerTabCloseGuard(tabId: string, guard: Guard): () => void;
7
+ /** Whether the tab may close: true when it has no guard or the guard agrees. */
8
+ export declare function canCloseTab(tabId: string): Promise<boolean>;
9
+ export {};
@@ -0,0 +1,8 @@
1
+ import { type Ref, type RefObject } from "react";
2
+ /**
3
+ * A callback ref that fills `ref` and tells the tab bar. The same function
4
+ * comes back for the same ref, so React never detaches and reattaches it.
5
+ */
6
+ export declare function trackTabHandle(ref: RefObject<unknown> | undefined): Ref<unknown> | undefined;
7
+ /** Changes whenever any tab's handle attaches or goes away. */
8
+ export declare function useTabHandlesVersion(): number;
@@ -0,0 +1,15 @@
1
+ import type { Tab, TabType } from "../../types/ui-types";
2
+ import { type TabShellCallbacks } from "./tab-registry";
3
+ /** Download a likely next tab without starting a connection or mounting UI. */
4
+ export declare function preloadTabSurface(type: TabType): void;
5
+ export declare function markTabSurfaceUsed(type: TabType): void;
6
+ export declare function tabIcon(type: TabType): import("react").JSX.Element;
7
+ export interface TabRenderContext {
8
+ shell: TabShellCallbacks;
9
+ /** The terminal a panel shown as a tab sends commands to. */
10
+ panelTargetTab?: Tab;
11
+ isVisible?: boolean;
12
+ isFocusedPane?: boolean;
13
+ inSplit?: boolean;
14
+ }
15
+ export declare function renderTabContent(tab: Tab, context: TabRenderContext): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Enrolment sections login methods and second factors register, such as
3
+ * adding a passkey or setting up an authenticator app.
4
+ */
5
+ export declare function AuthEnrollmentSections(): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SSHHostWithStatus } from "../main-axios";
2
+ import type { Host, Credential } from "../../types/ui-types";
3
+ export declare function sshHostToHost(h: SSHHostWithStatus): Host;
4
+ export declare function mapCredentials(res: unknown): Credential[];
@@ -34,7 +34,7 @@ export interface HostEditorSectionDef {
34
34
  pluginId?: string;
35
35
  group: "top" | "ssh";
36
36
  labelKey: string;
37
- /** Already-translated label, used instead of labelKey when set. */
37
+ /** Shown when labelKey has no translation. */
38
38
  label?: string;
39
39
  icon?: ComponentType<{
40
40
  className?: string;
@@ -59,7 +59,13 @@ export declare function isSshGroupTab(id: string): boolean;
59
59
  * The main strip. With `protocols`, registered tabs are filtered by their
60
60
  * `visible`; without, every registered top tab is listed.
61
61
  */
62
- export declare function makeHostTabs(t: (key: string) => string, protocols?: Record<string, boolean>, defaultsMode?: boolean): HostTab[];
63
- export declare function makeHostSshSubTabs(t: (key: string) => string, protocols?: Record<string, boolean>, defaultsMode?: boolean): HostTab[];
64
- export declare function makeCredentialTabs(t: (key: string) => string): CredentialTab[];
62
+ export declare function makeHostTabs(t: (key: string, options?: {
63
+ defaultValue?: string;
64
+ }) => string, protocols?: Record<string, boolean>, defaultsMode?: boolean): HostTab[];
65
+ export declare function makeHostSshSubTabs(t: (key: string, options?: {
66
+ defaultValue?: string;
67
+ }) => string, protocols?: Record<string, boolean>, defaultsMode?: boolean): HostTab[];
68
+ export declare function makeCredentialTabs(t: (key: string, options?: {
69
+ defaultValue?: string;
70
+ }) => string): CredentialTab[];
65
71
  export { TabStrip } from "../components/tab-strip";
@@ -0,0 +1,25 @@
1
+ import type { SSHHostWithStatus } from "../main-axios";
2
+ import type { HostFolder } from "../../types/ui-types";
3
+ /**
4
+ * Builds the sidebar's host tree from the flat host list returned by the
5
+ * API, nesting via two independent mechanisms:
6
+ *
7
+ * - folder: a " / "-separated string path, split into synthetic HostFolder
8
+ * nodes (folders are virtual -- they only exist as this derived tree).
9
+ * - parentHostId: sub-host nesting, where a real host acts as an
10
+ * organizational parent for other real hosts. A host with children stays
11
+ * a normal, connectable Host -- it is never wrapped in a synthetic node,
12
+ * just given a childHosts array the tree/virtualizer walk into.
13
+ *
14
+ * The backend already enforces that folder and parentHostId are mutually
15
+ * exclusive on write and rejects cycles, but this still defends against
16
+ * stale/imported/synced data: a missing, inaccessible, or cyclic parent
17
+ * falls back to folder/root placement rather than being dropped or looping.
18
+ */
19
+ export declare function buildHostTree(hosts: SSHHostWithStatus[], folderMeta?: Map<string, {
20
+ color?: string;
21
+ icon?: string;
22
+ credentialId?: number | null;
23
+ sortOrder?: number | null;
24
+ localOnly?: boolean;
25
+ }>): HostFolder;
@@ -0,0 +1,30 @@
1
+ export type FieldGroup = "connection" | "notes" | "tags" | "proxy" | "jumpHosts" | "featureFlags" | "advanced";
2
+ export interface ExportPayload {
3
+ version?: string;
4
+ exportedAt?: string;
5
+ credentials?: Record<string, unknown>[];
6
+ hosts: Record<string, unknown>[];
7
+ }
8
+ export declare const SECRET_KEYS: string[];
9
+ /**
10
+ * Keys inside a plugin's JSON host settings that hold secrets, per plugin and
11
+ * field, from each manifest's `secretKeys`.
12
+ */
13
+ export type PluginSecretKeys = Record<string, Record<string, string[]>>;
14
+ /** Reads the secret keys the plugins declare in their host settings. */
15
+ export declare function pluginSecretKeys(summaries: Array<{
16
+ id: string;
17
+ contributes?: {
18
+ settings?: {
19
+ host?: {
20
+ fields?: Array<{
21
+ key: string;
22
+ secretKeys?: string[];
23
+ }>;
24
+ };
25
+ };
26
+ } | null;
27
+ }>): PluginSecretKeys;
28
+ export declare function hostKey(host: Record<string, unknown>): string;
29
+ export declare function buildExportPayload(raw: ExportPayload, selected: Set<string> | null, groups: Set<FieldGroup>, withCredentials: boolean, pluginSecrets?: PluginSecretKeys): ExportPayload;
30
+ export declare function maskSecrets(payload: ExportPayload, pluginSecrets?: PluginSecretKeys): ExportPayload;