@termix-ssh/plugin-sdk 1.0.21 → 1.0.22

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 (39) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/PLUGIN-GUIDE.md +62 -3
  3. package/cli/commands/build.mjs +55 -36
  4. package/cli/commands/validate.mjs +4 -0
  5. package/dist/backend.d.ts +32 -7
  6. package/dist/frontend.d.ts +7 -0
  7. package/dist/host/{PluginsTab-HQGSDSHS.js → PluginsTab-CM2B33BD.js} +22 -14
  8. package/dist/host/chunk-7J4QNGFM.js +345 -0
  9. package/dist/host/{chunk-A5CULDWV.js → chunk-HQ6NNFSX.js} +109 -1574
  10. package/dist/host/chunk-I5F2PSMR.js +1526 -0
  11. package/dist/host/{chunk-FGX27MAA.js → chunk-JRV2HIDK.js} +1 -1
  12. package/dist/host/{chunk-JFQGI4OD.js → chunk-P26QKKU5.js} +38 -9
  13. package/dist/host/{chunk-WWFRBU2E.js → chunk-ROB2SH5Q.js} +76 -49
  14. package/dist/host/chunk-TK3Y437H.js +53 -0
  15. package/dist/host/{chunk-GTHINW3L.js → chunk-VKNGNEF3.js} +34650 -34968
  16. package/dist/host/core-classes.json +1 -1
  17. package/dist/host/frame-host.css +2 -0
  18. package/dist/host/frame-host.js +242 -0
  19. package/dist/host/{linked-server-UDSFY3N7.js → linked-server-J5G457OA.js} +1 -1
  20. package/dist/host/{rbac-api-AAAPMF52.js → rbac-api-PY22W5UY.js} +5 -1
  21. package/dist/host/testing-host.js +9 -6
  22. package/dist/host/types/src/types/host-sidebar-preferences.d.ts +2 -0
  23. package/dist/host/types/src/types/index.d.ts +8 -0
  24. package/dist/host/types/src/ui/api/plugins-api.d.ts +2 -1
  25. package/dist/host/types/src/ui/api/rbac-api.d.ts +19 -1
  26. package/dist/host/types/src/ui/components/data-view.d.ts +1 -1
  27. package/dist/host/types/src/ui/main-axios.d.ts +1 -1
  28. package/dist/host/types/src/ui/plugin-host/loader.d.ts +6 -0
  29. package/dist/host/types/src/ui/plugin-host/sdk-ui.d.ts +1 -1
  30. package/dist/host/types/src/ui/plugins/use-plugins-manager.d.ts +1 -1
  31. package/dist/host/types/src/ui/shell/tab-registry.d.ts +2 -0
  32. package/dist/host/ui.js +356 -369
  33. package/dist/host/{use-permissions-VAND5GEG.js → use-permissions-EWRI3WLT.js} +1 -1
  34. package/dist/host-commands.d.ts +7 -0
  35. package/dist/host-commands.js +35 -5
  36. package/dist/manifest.d.ts +28 -1
  37. package/dist/manifest.js +108 -1
  38. package/package.json +5 -1
  39. package/schema/manifest.schema.json +42 -0
package/dist/host/ui.js CHANGED
@@ -1,26 +1,43 @@
1
1
  const __termixNoGlob = () => ({});
2
2
  import {
3
- ACCENT_PRESET_COLORS,
4
3
  ActionSlot,
5
- BUILTIN_THEMES,
6
4
  Checkbox,
7
5
  ComponentSlot,
6
+ HostFeatureFields,
7
+ HostPluginSections,
8
+ PasswordInput,
9
+ PluginViewPlaceholder,
10
+ SettingsFieldRow,
11
+ Textarea,
12
+ clearLocalAdaptivePreferences,
13
+ getAdaptiveResourceBudget,
14
+ getPreferredHostAction,
15
+ markAdaptiveResourceUsed,
16
+ markTabSurfaceUsed,
17
+ preloadTabSurface,
18
+ recordHostActionPreference,
19
+ runAdaptiveBackgroundTask,
20
+ tabIcon,
21
+ useInstalledPlugins,
22
+ usePluginHostSections,
23
+ useTabHandlesVersion
24
+ } from "./chunk-I5F2PSMR.js";
25
+ import {
26
+ Toaster
27
+ } from "./chunk-TK3Y437H.js";
28
+ import {
29
+ ACCENT_PRESET_COLORS,
30
+ BUILTIN_THEMES,
8
31
  DASHBOARD_CARDS,
9
32
  FOLDER_COLORS,
10
33
  FONT_SIZES,
11
- HostFeatureFields,
12
- HostPluginSections,
13
34
  LANGUAGES,
14
35
  MANAGE_REQUEST_EVENT,
15
36
  MAX_PANES,
16
- PasswordInput,
17
37
  PluginComponent,
18
- PluginViewPlaceholder,
19
38
  SPLIT_PRESETS,
20
39
  SYSTEM_THEME,
21
- SettingsFieldRow,
22
40
  ShellConfirmCapture,
23
- Textarea,
24
41
  UI_FONTS,
25
42
  actionOrder,
26
43
  applyAccentColor,
@@ -31,7 +48,6 @@ import {
31
48
  canJoinSplit,
32
49
  challengeSecondFactor,
33
50
  changeAppLanguage,
34
- clearLocalAdaptivePreferences,
35
51
  createPluginApp,
36
52
  createQuickConnectHost,
37
53
  defaultConnectAction,
@@ -41,14 +57,12 @@ import {
41
57
  endSplitDrag,
42
58
  filterPaletteItems,
43
59
  findMatchingKeybinding,
44
- getAdaptiveResourceBudget,
45
60
  getDefaultConnectionTab,
46
61
  getHostEditorSection,
47
62
  getLiveHostStatus,
48
63
  getLoginMethods,
49
64
  getPanel,
50
65
  getPollingEnvironmentMultiplier,
51
- getPreferredHostAction,
52
66
  getRegisteredDashboardCard,
53
67
  getRememberDeviceAllowed,
54
68
  getStatusClasses,
@@ -78,8 +92,6 @@ import {
78
92
  makeHostSshSubTabs,
79
93
  makeHostTabs,
80
94
  mapCredentials,
81
- markAdaptiveResourceUsed,
82
- markTabSurfaceUsed,
83
95
  moveDivider,
84
96
  moveRailItem,
85
97
  moveSplitDrag,
@@ -88,13 +100,11 @@ import {
88
100
  paletteEntriesFor,
89
101
  paneNavHotkeyLabel,
90
102
  pluginWsUrl,
91
- preloadTabSurface,
92
103
  promotableIds,
93
104
  protocolEnabled,
94
105
  protocolPort,
95
106
  quickConnectTargets,
96
107
  railItemLabel,
97
- recordHostActionPreference,
98
108
  registerHostEditorSection,
99
109
  registerLayout,
100
110
  registerTabCloseGuard,
@@ -107,7 +117,6 @@ import {
107
117
  resetUserSecondFactors,
108
118
  resolveHostTabType,
109
119
  rightDockableIds,
110
- runAdaptiveBackgroundTask,
111
120
  runAdaptivePolling,
112
121
  runHostAction,
113
122
  setPluginLayouts,
@@ -118,7 +127,6 @@ import {
118
127
  sshHostToHost,
119
128
  startLoginRedirect,
120
129
  submitLoginMethod,
121
- tabIcon,
122
130
  tabJumpHotkeyKeys,
123
131
  takePendingManageRequest,
124
132
  themeLabel,
@@ -133,7 +141,6 @@ import {
133
141
  useHostProtocols,
134
142
  useHostStatus,
135
143
  useHostStatusIndicators,
136
- useInstalledPlugins,
137
144
  useIsMobile,
138
145
  useKeybindingActions,
139
146
  useKeybindingDefaults,
@@ -142,7 +149,6 @@ import {
142
149
  usePaletteEntries,
143
150
  usePaletteGroups,
144
151
  usePanels,
145
- usePluginHostSections,
146
152
  useRailItems,
147
153
  useRegisteredDashboardCards,
148
154
  useSecondFactors,
@@ -154,16 +160,15 @@ import {
154
160
  useSshAuthEditors,
155
161
  useSshAuthProviders,
156
162
  useStatusColorScheme,
157
- useTabHandlesVersion,
158
163
  useTabStageStore,
159
164
  useTheme,
160
165
  useThemes,
161
166
  verifySecondFactor,
162
167
  withProtocolSettings
163
- } from "./chunk-A5CULDWV.js";
168
+ } from "./chunk-HQ6NNFSX.js";
164
169
  import {
165
170
  usePermissions
166
- } from "./chunk-FGX27MAA.js";
171
+ } from "./chunk-JRV2HIDK.js";
167
172
  import {
168
173
  AddButton,
169
174
  Card,
@@ -184,7 +189,24 @@ import {
184
189
  isPrerelease,
185
190
  reportBetaFeedbackUrl,
186
191
  reportCoreIssueUrl
187
- } from "./chunk-WWFRBU2E.js";
192
+ } from "./chunk-ROB2SH5Q.js";
193
+ import {
194
+ Button,
195
+ DefaultsOnly,
196
+ FakeSwitch,
197
+ HostDefaultBadge,
198
+ HostDefaultsContext,
199
+ HostOnly,
200
+ Input,
201
+ PluginIcon,
202
+ SectionCard,
203
+ SettingRow,
204
+ buttonVariants,
205
+ cva,
206
+ hasVisibleFields,
207
+ isFieldShown,
208
+ useIsDefaultsEditor
209
+ } from "./chunk-7J4QNGFM.js";
188
210
  import {
189
211
  Action,
190
212
  Activity,
@@ -198,7 +220,6 @@ import {
198
220
  Bug,
199
221
  Building,
200
222
  BuildingComplex,
201
- Button,
202
223
  Cancel,
203
224
  Check,
204
225
  ChevronDown,
@@ -219,7 +240,6 @@ import {
219
240
  Corner,
220
241
  Cpu,
221
242
  Database,
222
- DefaultsOnly,
223
243
  Description2,
224
244
  Dialog,
225
245
  DialogContent,
@@ -232,7 +252,6 @@ import {
232
252
  Eye,
233
253
  EyeOff,
234
254
  Facts,
235
- FakeSwitch,
236
255
  Flag,
237
256
  Flame,
238
257
  FlaskConical,
@@ -246,12 +265,8 @@ import {
246
265
  GroupHeading,
247
266
  Hammer,
248
267
  HardDrive,
249
- HostDefaultBadge,
250
- HostDefaultsContext,
251
- HostOnly,
252
268
  House,
253
269
  InlineView,
254
- Input,
255
270
  Key,
256
271
  KeyRound,
257
272
  Layers,
@@ -275,7 +290,6 @@ import {
275
290
  PanePrompt,
276
291
  PanelSearch,
277
292
  PanelShell,
278
- PluginIcon,
279
293
  PluginSettingsValidationError,
280
294
  Plus,
281
295
  Portal,
@@ -293,7 +307,6 @@ import {
293
307
  ScrollAreaScrollbar,
294
308
  ScrollAreaThumb,
295
309
  Search,
296
- SectionCard,
297
310
  Segmented,
298
311
  Select,
299
312
  SelectContent,
@@ -308,7 +321,6 @@ import {
308
321
  Separator,
309
322
  Server,
310
323
  ServerCog,
311
- SettingRow,
312
324
  Settings,
313
325
  Shield,
314
326
  ShieldCheck,
@@ -341,21 +353,17 @@ import {
341
353
  Wrench,
342
354
  X,
343
355
  Zap,
344
- buttonVariants,
345
356
  cn,
346
357
  composeRefs,
347
- cva,
348
- dist_exports,
349
- dist_exports2,
350
- dist_exports3,
358
+ dist_exports2 as dist_exports,
359
+ dist_exports3 as dist_exports2,
360
+ dist_exports4 as dist_exports3,
351
361
  docsUrl,
352
362
  getDeveloperMode,
353
363
  getPluginAdminSettings,
354
364
  getPluginHostSettings,
355
365
  getPluginUserSettings,
356
366
  getPlugins,
357
- hasVisibleFields,
358
- isFieldShown,
359
367
  pluginKey,
360
368
  pluginName,
361
369
  setAllPluginChannels,
@@ -368,13 +376,12 @@ import {
368
376
  useAreaPreferences,
369
377
  useConfirm,
370
378
  useId,
371
- useIsDefaultsEditor,
372
379
  usePluginDocsUrl,
373
380
  useSurfaceClose,
374
381
  useSurfaceKind,
375
382
  useUiPreference,
376
383
  useUiPreferencesContext
377
- } from "./chunk-GTHINW3L.js";
384
+ } from "./chunk-VKNGNEF3.js";
378
385
  import {
379
386
  CREDENTIAL_ROW_FIELD_KEYS,
380
387
  PRESETS,
@@ -434,6 +441,7 @@ import {
434
441
  getErrorMessage,
435
442
  getExternalAutoProvision,
436
443
  getFolderAccess,
444
+ getFolderAuthOverride,
437
445
  getHostAccess,
438
446
  getHostAuthOverride,
439
447
  getHostPassword,
@@ -506,6 +514,7 @@ import {
506
514
  saveCredentialSidebarPreferences,
507
515
  saveHostSidebarPreferences,
508
516
  saveUserPreferences,
517
+ setFolderAuthOverride,
509
518
  setFrontendState,
510
519
  setHostAuthOverride,
511
520
  setPluginSummaries,
@@ -535,7 +544,7 @@ import {
535
544
  useTabs,
536
545
  useTabsSafe,
537
546
  verifyPasswordResetCode
538
- } from "./chunk-JFQGI4OD.js";
547
+ } from "./chunk-P26QKKU5.js";
539
548
  import {
540
549
  define_import_meta_env_default,
541
550
  init_define_import_meta_env
@@ -3879,12 +3888,30 @@ function assetUrl(summary, file) {
3879
3888
  function absolute(url) {
3880
3889
  return new URL(url, window.location.href).href;
3881
3890
  }
3891
+ var IMPORT_RETRY_DELAYS_MS = [500, 1500, 3e3];
3892
+ async function importWithRetry(url, load, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
3893
+ for (let attempt = 0; ; attempt++) {
3894
+ const next = attempt === 0 ? url : `${url}${url.includes("?") ? "&" : "?"}retry=${attempt}`;
3895
+ try {
3896
+ return await load(next);
3897
+ } catch (error) {
3898
+ const fetchFailed = error instanceof TypeError && /dynamically imported module|importing a module script/i.test(
3899
+ error.message
3900
+ );
3901
+ if (!fetchFailed || attempt >= IMPORT_RETRY_DELAYS_MS.length) throw error;
3902
+ await sleep(IMPORT_RETRY_DELAYS_MS[attempt]);
3903
+ }
3904
+ }
3905
+ }
3882
3906
  var defaultDeps = {
3883
3907
  fetchPlugins: getPlugins,
3884
3908
  async importFrontend(summary) {
3885
- return await import(
3886
- /* @vite-ignore */
3887
- absolute(assetUrl(summary, "frontend.js"))
3909
+ return importWithRetry(
3910
+ absolute(assetUrl(summary, "frontend.js")),
3911
+ (url) => import(
3912
+ /* @vite-ignore */
3913
+ url
3914
+ )
3888
3915
  );
3889
3916
  },
3890
3917
  async loadLocale(summary, file) {
@@ -5593,51 +5620,9 @@ function Auth({ onLogin }) {
5593
5620
  ] }) });
5594
5621
  }
5595
5622
 
5596
- // src/ui/components/sonner.tsx
5597
- init_define_import_meta_env();
5598
- import { Toaster as Sonner } from "sonner";
5599
- import { jsx as jsx29 } from "react/jsx-runtime";
5600
- var Toaster = ({ ...props }) => {
5601
- const { theme: theme2 = "system" } = useTheme();
5602
- return /* @__PURE__ */ jsx29(
5603
- Sonner,
5604
- {
5605
- theme: theme2,
5606
- className: "toaster group",
5607
- toastOptions: {
5608
- classNames: {
5609
- toast: "group toast group-[.toaster]:bg-card group-[.toaster]:text-card-foreground group-[.toaster]:border-border group-[.toaster]:rounded-none! group-[.toaster]:shadow-lg group-[.toaster]:font-mono",
5610
- description: "group-[.toast]:text-muted-foreground",
5611
- actionButton: "group-[.toast]:bg-accent-brand group-[.toast]:text-white group-[.toast]:font-semibold",
5612
- cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
5613
- success: "group-[.toast]:!text-accent-brand group-[.toast]:!border-accent-brand/30",
5614
- info: "group-[.toast]:!text-accent-brand group-[.toast]:!border-accent-brand/30",
5615
- error: "group-[.toast]:!text-destructive group-[.toast]:!border-destructive/30"
5616
- }
5617
- },
5618
- style: {
5619
- "--radius": "0px",
5620
- "--normal-bg": "var(--card)",
5621
- "--normal-border": "var(--border)",
5622
- "--normal-text": "var(--card-foreground)",
5623
- "--success-bg": "var(--card)",
5624
- "--success-border": "var(--border)",
5625
- "--success-text": "var(--color-accent-brand)",
5626
- "--info-bg": "var(--card)",
5627
- "--info-border": "var(--border)",
5628
- "--info-text": "var(--color-accent-brand)",
5629
- "--error-bg": "var(--card)",
5630
- "--error-border": "var(--border)",
5631
- "--error-text": "var(--destructive)"
5632
- },
5633
- ...props
5634
- }
5635
- );
5636
- };
5637
-
5638
5623
  // src/ui/components/FullScreenAppWrapper.tsx
5639
5624
  import { useTranslation as useTranslation9 } from "react-i18next";
5640
- import { Fragment as Fragment4, jsx as jsx30, jsxs as jsxs21 } from "react/jsx-runtime";
5625
+ import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
5641
5626
  var FullScreenAppWrapper = ({
5642
5627
  hostId,
5643
5628
  children
@@ -5741,17 +5726,17 @@ var FullScreenAppWrapper = ({
5741
5726
  window.location.reload();
5742
5727
  };
5743
5728
  if (authLoading) {
5744
- return /* @__PURE__ */ jsx30("div", { className: "relative w-full h-screen overflow-hidden", children: /* @__PURE__ */ jsx30(ConnectionScreen, { status: "connecting", message: t3("common.loading") }) });
5729
+ return /* @__PURE__ */ jsx29("div", { className: "relative w-full h-screen overflow-hidden", children: /* @__PURE__ */ jsx29(ConnectionScreen, { status: "connecting", message: t3("common.loading") }) });
5745
5730
  }
5746
5731
  if (!isAuthenticated) {
5747
- return /* @__PURE__ */ jsx30(SidebarProvider, { children: /* @__PURE__ */ jsx30(TabProvider, { children: /* @__PURE__ */ jsx30(Fragment4, { children: /* @__PURE__ */ jsxs21(
5732
+ return /* @__PURE__ */ jsx29(SidebarProvider, { children: /* @__PURE__ */ jsx29(TabProvider, { children: /* @__PURE__ */ jsx29(Fragment4, { children: /* @__PURE__ */ jsxs21(
5748
5733
  "div",
5749
5734
  {
5750
5735
  className: "w-full h-screen overflow-hidden flex items-center justify-center",
5751
5736
  style: { backgroundColor: "var(--bg-base)" },
5752
5737
  children: [
5753
- /* @__PURE__ */ jsx30(Auth, { onLogin: handleAuthSuccess }),
5754
- /* @__PURE__ */ jsx30(
5738
+ /* @__PURE__ */ jsx29(Auth, { onLogin: handleAuthSuccess }),
5739
+ /* @__PURE__ */ jsx29(
5755
5740
  Toaster,
5756
5741
  {
5757
5742
  position: "bottom-right",
@@ -5766,7 +5751,7 @@ var FullScreenAppWrapper = ({
5766
5751
  ) }) }) });
5767
5752
  }
5768
5753
  const phase = loading ? "loading" : !hostConfig && hostId ? "not-found" : "ready";
5769
- return /* @__PURE__ */ jsx30(SidebarProvider, { children: /* @__PURE__ */ jsx30(TabProvider, { children: /* @__PURE__ */ jsx30(Fragment4, { children: /* @__PURE__ */ jsx30(
5754
+ return /* @__PURE__ */ jsx29(SidebarProvider, { children: /* @__PURE__ */ jsx29(TabProvider, { children: /* @__PURE__ */ jsx29(Fragment4, { children: /* @__PURE__ */ jsx29(
5770
5755
  "div",
5771
5756
  {
5772
5757
  className: "w-full h-screen overflow-hidden",
@@ -5780,7 +5765,7 @@ var FullScreenAppWrapper = ({
5780
5765
  init_define_import_meta_env();
5781
5766
  import { useEffect as useEffect8, useState as useState9 } from "react";
5782
5767
  import { useTranslation as useTranslation10 } from "react-i18next";
5783
- import { jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
5768
+ import { jsx as jsx30, jsxs as jsxs22 } from "react/jsx-runtime";
5784
5769
  var CODE_INPUT = "rounded-none bg-muted/50 border-border text-center text-sm tracking-widest";
5785
5770
  function TOTPDialog({
5786
5771
  isOpen,
@@ -5820,24 +5805,24 @@ function TOTPDialog({
5820
5805
  };
5821
5806
  const title = isPush ? t3("sshAuth.mfaPushRequired") : isPassword ? t3("common.password") : isMenu ? t3("sshAuth.mfaPromptRequired") : t3("sshAuth.totpRequired");
5822
5807
  const label = prompt || (isTotp ? t3("sshAuth.totpCodeLabel") : void 0);
5823
- const cancel = /* @__PURE__ */ jsx31("button", { type: "button", onClick: onCancel, className: PROMPT_BUTTON, children: t3("common.cancel") });
5824
- return /* @__PURE__ */ jsx31(
5808
+ const cancel = /* @__PURE__ */ jsx30("button", { type: "button", onClick: onCancel, className: PROMPT_BUTTON, children: t3("common.cancel") });
5809
+ return /* @__PURE__ */ jsx30(
5825
5810
  PanePrompt,
5826
5811
  {
5827
5812
  open: true,
5828
5813
  layer: "connection",
5829
5814
  backgroundColor,
5830
- icon: /* @__PURE__ */ jsx31(Shield, { className: "size-4" }),
5815
+ icon: /* @__PURE__ */ jsx30(Shield, { className: "size-4" }),
5831
5816
  title,
5832
5817
  description: label,
5833
5818
  children: showWaiting ? /* @__PURE__ */ jsxs22("div", { className: "flex flex-col gap-3", children: [
5834
5819
  /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3 py-1", children: [
5835
- /* @__PURE__ */ jsx31(LoaderCircle, { className: "size-4 animate-spin text-accent-brand shrink-0" }),
5836
- /* @__PURE__ */ jsx31("p", { className: "text-xs text-muted-foreground", children: t3("sshAuth.mfaWaitingApproval") })
5820
+ /* @__PURE__ */ jsx30(LoaderCircle, { className: "size-4 animate-spin text-accent-brand shrink-0" }),
5821
+ /* @__PURE__ */ jsx30("p", { className: "text-xs text-muted-foreground", children: t3("sshAuth.mfaWaitingApproval") })
5837
5822
  ] }),
5838
- /* @__PURE__ */ jsx31("div", { className: "flex justify-end gap-2", children: cancel })
5823
+ /* @__PURE__ */ jsx30("div", { className: "flex justify-end gap-2", children: cancel })
5839
5824
  ] }) : /* @__PURE__ */ jsxs22("form", { onSubmit: handleSubmit, className: "flex flex-col gap-3", children: [
5840
- isPush ? null : isPassword ? /* @__PURE__ */ jsx31(
5825
+ isPush ? null : isPassword ? /* @__PURE__ */ jsx30(
5841
5826
  Input,
5842
5827
  {
5843
5828
  id: "totpCode",
@@ -5848,7 +5833,7 @@ function TOTPDialog({
5848
5833
  placeholder: t3("placeholders.enterPassword"),
5849
5834
  className: "rounded-none bg-muted/50 border-border text-sm"
5850
5835
  }
5851
- ) : isMenu ? /* @__PURE__ */ jsx31(
5836
+ ) : isMenu ? /* @__PURE__ */ jsx30(
5852
5837
  Input,
5853
5838
  {
5854
5839
  id: "totpCode",
@@ -5858,7 +5843,7 @@ function TOTPDialog({
5858
5843
  placeholder: t3("sshAuth.mfaMenuPlaceholder"),
5859
5844
  className: CODE_INPUT
5860
5845
  }
5861
- ) : allowsPushKeyword ? /* @__PURE__ */ jsx31(
5846
+ ) : allowsPushKeyword ? /* @__PURE__ */ jsx30(
5862
5847
  Input,
5863
5848
  {
5864
5849
  id: "totpCode",
@@ -5868,7 +5853,7 @@ function TOTPDialog({
5868
5853
  placeholder: t3("sshAuth.mfaCodeOrPushPlaceholder"),
5869
5854
  className: CODE_INPUT
5870
5855
  }
5871
- ) : /* @__PURE__ */ jsx31(
5856
+ ) : /* @__PURE__ */ jsx30(
5872
5857
  Input,
5873
5858
  {
5874
5859
  id: "totpCode",
@@ -5884,7 +5869,7 @@ function TOTPDialog({
5884
5869
  ),
5885
5870
  /* @__PURE__ */ jsxs22("div", { className: "flex justify-end gap-2", children: [
5886
5871
  cancel,
5887
- /* @__PURE__ */ jsx31("button", { type: "submit", className: PROMPT_PRIMARY_BUTTON, children: isPush ? t3("sshAuth.mfaSendRequest") : isPassword ? t3("common.connect") : t3("sshAuth.totpVerify") })
5872
+ /* @__PURE__ */ jsx30("button", { type: "submit", className: PROMPT_PRIMARY_BUTTON, children: isPush ? t3("sshAuth.mfaSendRequest") : isPassword ? t3("common.connect") : t3("sshAuth.totpVerify") })
5888
5873
  ] })
5889
5874
  ] })
5890
5875
  }
@@ -5897,12 +5882,12 @@ import { useState as useState11 } from "react";
5897
5882
 
5898
5883
  // src/ui/components/tabs.tsx
5899
5884
  init_define_import_meta_env();
5900
- import { jsx as jsx32 } from "react/jsx-runtime";
5885
+ import { jsx as jsx31 } from "react/jsx-runtime";
5901
5886
  function Tabs({
5902
5887
  className,
5903
5888
  ...props
5904
5889
  }) {
5905
- return /* @__PURE__ */ jsx32(
5890
+ return /* @__PURE__ */ jsx31(
5906
5891
  Root23,
5907
5892
  {
5908
5893
  "data-slot": "tabs",
@@ -5915,7 +5900,7 @@ function TabsList({
5915
5900
  className,
5916
5901
  ...props
5917
5902
  }) {
5918
- return /* @__PURE__ */ jsx32(
5903
+ return /* @__PURE__ */ jsx31(
5919
5904
  List,
5920
5905
  {
5921
5906
  "data-slot": "tabs-list",
@@ -5931,7 +5916,7 @@ function TabsTrigger({
5931
5916
  className,
5932
5917
  ...props
5933
5918
  }) {
5934
- return /* @__PURE__ */ jsx32(
5919
+ return /* @__PURE__ */ jsx31(
5935
5920
  Trigger3,
5936
5921
  {
5937
5922
  "data-slot": "tabs-trigger",
@@ -5947,7 +5932,7 @@ function TabsContent({
5947
5932
  className,
5948
5933
  ...props
5949
5934
  }) {
5950
- return /* @__PURE__ */ jsx32(
5935
+ return /* @__PURE__ */ jsx31(
5951
5936
  Content,
5952
5937
  {
5953
5938
  "data-slot": "tabs-content",
@@ -29272,7 +29257,7 @@ ReactCodeMirror.displayName = "CodeMirror";
29272
29257
  var esm_default = ReactCodeMirror;
29273
29258
 
29274
29259
  // src/ui/ssh/dialogs/SSHAuthDialog.tsx
29275
- import { jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
29260
+ import { jsx as jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
29276
29261
  function SSHAuthDialog({
29277
29262
  isOpen,
29278
29263
  reason,
@@ -29343,15 +29328,15 @@ function SSHAuthDialog({
29343
29328
  }
29344
29329
  }
29345
29330
  };
29346
- return /* @__PURE__ */ jsx33(
29331
+ return /* @__PURE__ */ jsx32(
29347
29332
  PanePrompt,
29348
29333
  {
29349
29334
  open: true,
29350
29335
  layer: "connection",
29351
29336
  backgroundColor,
29352
- icon: /* @__PURE__ */ jsx33(Shield, { className: "size-4" }),
29337
+ icon: /* @__PURE__ */ jsx32(Shield, { className: "size-4" }),
29353
29338
  title: t3("auth.sshAuthenticationRequired"),
29354
- description: /* @__PURE__ */ jsx33("span", { className: "font-mono", children: hostDisplay }),
29339
+ description: /* @__PURE__ */ jsx32("span", { className: "font-mono", children: hostDisplay }),
29355
29340
  className: "max-w-xl",
29356
29341
  children: /* @__PURE__ */ jsxs23("form", { onSubmit: handleSubmit, children: [
29357
29342
  /* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3", children: [
@@ -29360,21 +29345,21 @@ function SSHAuthDialog({
29360
29345
  {
29361
29346
  className: `flex items-start gap-3 p-3 border ${reason === "auth_failed" ? "border-destructive/20 bg-destructive/10" : "border-border bg-muted/10"}`,
29362
29347
  children: [
29363
- /* @__PURE__ */ jsx33(
29348
+ /* @__PURE__ */ jsx32(
29364
29349
  CircleAlert,
29365
29350
  {
29366
29351
  className: `size-4 shrink-0 mt-0.5 ${reason === "auth_failed" ? "text-destructive" : "text-accent-brand"}`
29367
29352
  }
29368
29353
  ),
29369
29354
  /* @__PURE__ */ jsxs23("div", { children: [
29370
- /* @__PURE__ */ jsx33(
29355
+ /* @__PURE__ */ jsx32(
29371
29356
  "p",
29372
29357
  {
29373
29358
  className: `text-[10px] font-bold uppercase tracking-widest ${reason === "auth_failed" ? "text-destructive" : ""}`,
29374
29359
  children: getReasonMessage()
29375
29360
  }
29376
29361
  ),
29377
- /* @__PURE__ */ jsx33(
29362
+ /* @__PURE__ */ jsx32(
29378
29363
  "p",
29379
29364
  {
29380
29365
  className: `text-xs mt-1 ${reason === "auth_failed" ? "text-destructive/80" : "text-muted-foreground"}`,
@@ -29392,7 +29377,7 @@ function SSHAuthDialog({
29392
29377
  onValueChange: (v) => setAuthTab(v),
29393
29378
  children: [
29394
29379
  /* @__PURE__ */ jsxs23(TabsList, { className: "w-full rounded-none", children: [
29395
- /* @__PURE__ */ jsx33(
29380
+ /* @__PURE__ */ jsx32(
29396
29381
  TabsTrigger,
29397
29382
  {
29398
29383
  value: "password",
@@ -29400,7 +29385,7 @@ function SSHAuthDialog({
29400
29385
  children: t3("credentials.password")
29401
29386
  }
29402
29387
  ),
29403
- /* @__PURE__ */ jsx33(
29388
+ /* @__PURE__ */ jsx32(
29404
29389
  TabsTrigger,
29405
29390
  {
29406
29391
  value: "key",
@@ -29410,8 +29395,8 @@ function SSHAuthDialog({
29410
29395
  )
29411
29396
  ] }),
29412
29397
  /* @__PURE__ */ jsxs23(TabsContent, { value: "password", className: "mt-3 flex flex-col gap-2", children: [
29413
- /* @__PURE__ */ jsx33(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("credentials.password") }),
29414
- /* @__PURE__ */ jsx33(
29398
+ /* @__PURE__ */ jsx32(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("credentials.password") }),
29399
+ /* @__PURE__ */ jsx32(
29415
29400
  PasswordInput,
29416
29401
  {
29417
29402
  placeholder: t3("placeholders.enterPassword"),
@@ -29421,13 +29406,13 @@ function SSHAuthDialog({
29421
29406
  className: "rounded-none bg-muted/50 border-border text-xs"
29422
29407
  }
29423
29408
  ),
29424
- /* @__PURE__ */ jsx33("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.sshPasswordDescription") })
29409
+ /* @__PURE__ */ jsx32("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.sshPasswordDescription") })
29425
29410
  ] }),
29426
29411
  /* @__PURE__ */ jsxs23(TabsContent, { value: "key", className: "mt-3 flex flex-col gap-3", children: [
29427
29412
  /* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-2", children: [
29428
- /* @__PURE__ */ jsx33(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("credentials.sshPrivateKey") }),
29413
+ /* @__PURE__ */ jsx32(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("credentials.sshPrivateKey") }),
29429
29414
  /* @__PURE__ */ jsxs23("div", { className: "relative", children: [
29430
- /* @__PURE__ */ jsx33(
29415
+ /* @__PURE__ */ jsx32(
29431
29416
  "input",
29432
29417
  {
29433
29418
  id: "key-upload",
@@ -29444,13 +29429,13 @@ function SSHAuthDialog({
29444
29429
  variant: "outline",
29445
29430
  className: "w-full justify-start rounded-none text-[10px] font-bold uppercase tracking-widest border-border",
29446
29431
  children: [
29447
- /* @__PURE__ */ jsx33(Upload, { className: "size-3.5 mr-2" }),
29448
- /* @__PURE__ */ jsx33("span", { className: "truncate", children: t3("credentials.uploadPrivateKeyFile") })
29432
+ /* @__PURE__ */ jsx32(Upload, { className: "size-3.5 mr-2" }),
29433
+ /* @__PURE__ */ jsx32("span", { className: "truncate", children: t3("credentials.uploadPrivateKeyFile") })
29449
29434
  ]
29450
29435
  }
29451
29436
  )
29452
29437
  ] }),
29453
- /* @__PURE__ */ jsx33(
29438
+ /* @__PURE__ */ jsx32(
29454
29439
  esm_default,
29455
29440
  {
29456
29441
  value: sshKey,
@@ -29487,7 +29472,7 @@ function SSHAuthDialog({
29487
29472
  t3("common.optional"),
29488
29473
  ")"
29489
29474
  ] }),
29490
- /* @__PURE__ */ jsx33(
29475
+ /* @__PURE__ */ jsx32(
29491
29476
  PasswordInput,
29492
29477
  {
29493
29478
  placeholder: t3("placeholders.keyPassword"),
@@ -29496,7 +29481,7 @@ function SSHAuthDialog({
29496
29481
  className: "rounded-none bg-muted/50 border-border text-xs"
29497
29482
  }
29498
29483
  ),
29499
- /* @__PURE__ */ jsx33("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.sshKeyPasswordDescription") })
29484
+ /* @__PURE__ */ jsx32("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.sshKeyPasswordDescription") })
29500
29485
  ] }),
29501
29486
  /* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-2", children: [
29502
29487
  /* @__PURE__ */ jsxs23(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: [
@@ -29505,7 +29490,7 @@ function SSHAuthDialog({
29505
29490
  t3("common.optional"),
29506
29491
  ")"
29507
29492
  ] }),
29508
- /* @__PURE__ */ jsx33(
29493
+ /* @__PURE__ */ jsx32(
29509
29494
  PasswordInput,
29510
29495
  {
29511
29496
  placeholder: t3("placeholders.enterPassword"),
@@ -29521,7 +29506,7 @@ function SSHAuthDialog({
29521
29506
  )
29522
29507
  ] }),
29523
29508
  /* @__PURE__ */ jsxs23("div", { className: "flex justify-end gap-2 pt-3", children: [
29524
- /* @__PURE__ */ jsx33(
29509
+ /* @__PURE__ */ jsx32(
29525
29510
  "button",
29526
29511
  {
29527
29512
  type: "button",
@@ -29531,7 +29516,7 @@ function SSHAuthDialog({
29531
29516
  children: t3("common.cancel")
29532
29517
  }
29533
29518
  ),
29534
- /* @__PURE__ */ jsx33(
29519
+ /* @__PURE__ */ jsx32(
29535
29520
  "button",
29536
29521
  {
29537
29522
  type: "submit",
@@ -29551,7 +29536,7 @@ init_define_import_meta_env();
29551
29536
  import { useState as useState12 } from "react";
29552
29537
  import { useTranslation as useTranslation12 } from "react-i18next";
29553
29538
  import { toast as toast3 } from "sonner";
29554
- import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
29539
+ import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
29555
29540
  function BrowserSignInDialog({
29556
29541
  isOpen,
29557
29542
  label,
@@ -29575,24 +29560,24 @@ function BrowserSignInDialog({
29575
29560
  toast3.error(t3("common.copyFailed"));
29576
29561
  }
29577
29562
  };
29578
- return /* @__PURE__ */ jsx34(
29563
+ return /* @__PURE__ */ jsx33(
29579
29564
  PanePrompt,
29580
29565
  {
29581
29566
  open: true,
29582
29567
  layer: "connection",
29583
29568
  backgroundColor,
29584
- icon: /* @__PURE__ */ jsx34(Shield, { className: "size-4" }),
29569
+ icon: /* @__PURE__ */ jsx33(Shield, { className: "size-4" }),
29585
29570
  title: t3("sshAuth.browserSignInRequired", { provider: label }),
29586
29571
  className: "max-w-md",
29587
29572
  children: /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-3", children: [
29588
29573
  code2 && code2 !== "N/A" && /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-1.5", children: [
29589
- /* @__PURE__ */ jsx34("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("sshAuth.browserSignInCode") }),
29590
- /* @__PURE__ */ jsx34("div", { className: "border border-border bg-muted/10 p-4 text-center", children: /* @__PURE__ */ jsx34("div", { className: "text-2xl font-mono font-bold tracking-wider text-accent-brand", children: code2 }) })
29574
+ /* @__PURE__ */ jsx33("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("sshAuth.browserSignInCode") }),
29575
+ /* @__PURE__ */ jsx33("div", { className: "border border-border bg-muted/10 p-4 text-center", children: /* @__PURE__ */ jsx33("div", { className: "text-2xl font-mono font-bold tracking-wider text-accent-brand", children: code2 }) })
29591
29576
  ] }),
29592
29577
  /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-1.5", children: [
29593
- /* @__PURE__ */ jsx34("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("sshAuth.browserSignInUrl") }),
29578
+ /* @__PURE__ */ jsx33("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("sshAuth.browserSignInUrl") }),
29594
29579
  /* @__PURE__ */ jsxs24("div", { className: "flex gap-2", children: [
29595
- /* @__PURE__ */ jsx34(
29580
+ /* @__PURE__ */ jsx33(
29596
29581
  Input,
29597
29582
  {
29598
29583
  type: "text",
@@ -29601,7 +29586,7 @@ function BrowserSignInDialog({
29601
29586
  className: "rounded-none bg-muted/50 border-border text-xs font-mono flex-1"
29602
29587
  }
29603
29588
  ),
29604
- /* @__PURE__ */ jsx34(
29589
+ /* @__PURE__ */ jsx33(
29605
29590
  "button",
29606
29591
  {
29607
29592
  type: "button",
@@ -29609,13 +29594,13 @@ function BrowserSignInDialog({
29609
29594
  className: `${PROMPT_BUTTON} h-9 w-9 shrink-0 px-0`,
29610
29595
  title: t3("common.copy"),
29611
29596
  "aria-label": t3("common.copy"),
29612
- children: copied ? /* @__PURE__ */ jsx34(Check, { className: "size-4 text-accent-brand" }) : /* @__PURE__ */ jsx34(Copy, { className: "size-4" })
29597
+ children: copied ? /* @__PURE__ */ jsx33(Check, { className: "size-4 text-accent-brand" }) : /* @__PURE__ */ jsx33(Copy, { className: "size-4" })
29613
29598
  }
29614
29599
  )
29615
29600
  ] })
29616
29601
  ] }),
29617
29602
  /* @__PURE__ */ jsxs24("div", { className: "flex flex-wrap justify-end gap-2", children: [
29618
- /* @__PURE__ */ jsx34(
29603
+ /* @__PURE__ */ jsx33(
29619
29604
  "button",
29620
29605
  {
29621
29606
  type: "button",
@@ -29624,7 +29609,7 @@ function BrowserSignInDialog({
29624
29609
  children: t3("common.cancel")
29625
29610
  }
29626
29611
  ),
29627
- /* @__PURE__ */ jsx34("button", { type: "button", onClick: onContinue, className: PROMPT_BUTTON, children: t3("sshAuth.browserSignInContinue") }),
29612
+ /* @__PURE__ */ jsx33("button", { type: "button", onClick: onContinue, className: PROMPT_BUTTON, children: t3("sshAuth.browserSignInContinue") }),
29628
29613
  /* @__PURE__ */ jsxs24(
29629
29614
  "button",
29630
29615
  {
@@ -29632,7 +29617,7 @@ function BrowserSignInDialog({
29632
29617
  onClick: onOpenUrl,
29633
29618
  className: PROMPT_PRIMARY_BUTTON,
29634
29619
  children: [
29635
- /* @__PURE__ */ jsx34(ExternalLink, { className: "size-3.5" }),
29620
+ /* @__PURE__ */ jsx33(ExternalLink, { className: "size-3.5" }),
29636
29621
  t3("sshAuth.browserSignInOpen")
29637
29622
  ]
29638
29623
  }
@@ -29651,7 +29636,7 @@ import { useRef as useRef7 } from "react";
29651
29636
  init_define_import_meta_env();
29652
29637
  import React9, { memo, useCallback as useCallback7, useEffect as useEffect10, useRef as useRef6, useState as useState13 } from "react";
29653
29638
  import { useTranslation as useTranslation13 } from "react-i18next";
29654
- import { Fragment as Fragment5, jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
29639
+ import { Fragment as Fragment5, jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
29655
29640
  var DRAG_THRESHOLD = 5;
29656
29641
  function tabLabel(tab) {
29657
29642
  return tab.customLabel || tab.label;
@@ -29725,7 +29710,7 @@ function PaneHeader({
29725
29710
  onLostPointerCapture: () => finishDrag(false),
29726
29711
  className: `flex h-7 shrink-0 items-center gap-1 border-b pl-1 pr-0.5 text-xs select-none ${focused ? "border-accent-brand/40 bg-accent-brand/10" : "border-border bg-sidebar"} ${tab && !ctx.isMobile ? "cursor-grab active:cursor-grabbing" : ""}`,
29727
29712
  children: [
29728
- /* @__PURE__ */ jsx35(
29713
+ /* @__PURE__ */ jsx34(
29729
29714
  "span",
29730
29715
  {
29731
29716
  className: `flex h-4 min-w-4 shrink-0 items-center justify-center px-1 font-mono text-[10px] ${focused ? "bg-accent-brand text-background" : "bg-muted text-muted-foreground"}`,
@@ -29733,42 +29718,42 @@ function PaneHeader({
29733
29718
  }
29734
29719
  ),
29735
29720
  /* @__PURE__ */ jsxs25(DropdownMenu, { children: [
29736
- /* @__PURE__ */ jsx35(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs25(
29721
+ /* @__PURE__ */ jsx34(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs25(
29737
29722
  "button",
29738
29723
  {
29739
29724
  type: "button",
29740
29725
  className: `flex min-w-0 items-center gap-1.5 px-1 py-0.5 hover:bg-muted ${focused ? "text-accent-brand" : "text-foreground"}`,
29741
29726
  title: t3("splitScreen.showHere"),
29742
29727
  children: [
29743
- tab && /* @__PURE__ */ jsx35("span", { className: focused ? "" : "text-muted-foreground", children: tabIcon(tab.type) }),
29744
- /* @__PURE__ */ jsx35(
29728
+ tab && /* @__PURE__ */ jsx34("span", { className: focused ? "" : "text-muted-foreground", children: tabIcon(tab.type) }),
29729
+ /* @__PURE__ */ jsx34(
29745
29730
  "span",
29746
29731
  {
29747
29732
  className: `truncate ${tab ? "font-medium" : "text-muted-foreground"}`,
29748
29733
  children: label
29749
29734
  }
29750
29735
  ),
29751
- /* @__PURE__ */ jsx35(ChevronDown, { className: "size-3 shrink-0 opacity-60" })
29736
+ /* @__PURE__ */ jsx34(ChevronDown, { className: "size-3 shrink-0 opacity-60" })
29752
29737
  ]
29753
29738
  }
29754
29739
  ) }),
29755
29740
  /* @__PURE__ */ jsxs25(DropdownMenuContent, { align: "start", className: "w-60", children: [
29756
- /* @__PURE__ */ jsx35(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.showHere") }),
29757
- ctx.freeTabs.length === 0 && /* @__PURE__ */ jsx35(DropdownMenuItem, { disabled: true, children: t3("splitScreen.noOpenTabs") }),
29741
+ /* @__PURE__ */ jsx34(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.showHere") }),
29742
+ ctx.freeTabs.length === 0 && /* @__PURE__ */ jsx34(DropdownMenuItem, { disabled: true, children: t3("splitScreen.noOpenTabs") }),
29758
29743
  ctx.freeTabs.map((free) => /* @__PURE__ */ jsxs25(
29759
29744
  DropdownMenuItem,
29760
29745
  {
29761
29746
  onSelect: () => actions.showInPane(pane.id, free.id),
29762
29747
  children: [
29763
29748
  tabIcon(free.type),
29764
- /* @__PURE__ */ jsx35("span", { className: "truncate", children: tabLabel(free) })
29749
+ /* @__PURE__ */ jsx34("span", { className: "truncate", children: tabLabel(free) })
29765
29750
  ]
29766
29751
  },
29767
29752
  free.id
29768
29753
  )),
29769
29754
  tab && /* @__PURE__ */ jsxs25(Fragment5, { children: [
29770
- /* @__PURE__ */ jsx35(DropdownMenuSeparator, {}),
29771
- /* @__PURE__ */ jsx35(
29755
+ /* @__PURE__ */ jsx34(DropdownMenuSeparator, {}),
29756
+ /* @__PURE__ */ jsx34(
29772
29757
  DropdownMenuItem,
29773
29758
  {
29774
29759
  onSelect: () => actions.showInPane(pane.id, null),
@@ -29780,7 +29765,7 @@ function PaneHeader({
29780
29765
  ] }),
29781
29766
  /* @__PURE__ */ jsxs25("div", { className: "ml-auto flex shrink-0 items-center", children: [
29782
29767
  !ctx.isMobile && /* @__PURE__ */ jsxs25(Fragment5, { children: [
29783
- /* @__PURE__ */ jsx35(
29768
+ /* @__PURE__ */ jsx34(
29784
29769
  "button",
29785
29770
  {
29786
29771
  type: "button",
@@ -29789,10 +29774,10 @@ function PaneHeader({
29789
29774
  title: fullTitle ?? t3("splitScreen.splitRight"),
29790
29775
  "aria-label": t3("splitScreen.splitRight"),
29791
29776
  onClick: () => actions.splitPane(pane.id, "right"),
29792
- children: /* @__PURE__ */ jsx35(Columns2, { className: "size-3.5" })
29777
+ children: /* @__PURE__ */ jsx34(Columns2, { className: "size-3.5" })
29793
29778
  }
29794
29779
  ),
29795
- /* @__PURE__ */ jsx35(
29780
+ /* @__PURE__ */ jsx34(
29796
29781
  "button",
29797
29782
  {
29798
29783
  type: "button",
@@ -29801,10 +29786,10 @@ function PaneHeader({
29801
29786
  title: fullTitle ?? t3("splitScreen.splitDown"),
29802
29787
  "aria-label": t3("splitScreen.splitDown"),
29803
29788
  onClick: () => actions.splitPane(pane.id, "bottom"),
29804
- children: /* @__PURE__ */ jsx35(Rows2, { className: "size-3.5" })
29789
+ children: /* @__PURE__ */ jsx34(Rows2, { className: "size-3.5" })
29805
29790
  }
29806
29791
  ),
29807
- panes.length > 1 && /* @__PURE__ */ jsx35(
29792
+ panes.length > 1 && /* @__PURE__ */ jsx34(
29808
29793
  "button",
29809
29794
  {
29810
29795
  type: "button",
@@ -29813,36 +29798,36 @@ function PaneHeader({
29813
29798
  "aria-label": zoomed ? t3("splitScreen.unzoom") : t3("splitScreen.zoom"),
29814
29799
  "aria-pressed": zoomed,
29815
29800
  onClick: () => actions.toggleZoom(pane.id),
29816
- children: zoomed ? /* @__PURE__ */ jsx35(Minimize2, { className: "size-3.5" }) : /* @__PURE__ */ jsx35(Maximize2, { className: "size-3.5" })
29801
+ children: zoomed ? /* @__PURE__ */ jsx34(Minimize2, { className: "size-3.5" }) : /* @__PURE__ */ jsx34(Maximize2, { className: "size-3.5" })
29817
29802
  }
29818
29803
  )
29819
29804
  ] }),
29820
29805
  /* @__PURE__ */ jsxs25(DropdownMenu, { children: [
29821
- /* @__PURE__ */ jsx35(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx35(
29806
+ /* @__PURE__ */ jsx34(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx34(
29822
29807
  "button",
29823
29808
  {
29824
29809
  type: "button",
29825
29810
  className: buttonClass,
29826
29811
  title: t3("splitScreen.paneActions"),
29827
29812
  "aria-label": t3("splitScreen.paneActions"),
29828
- children: /* @__PURE__ */ jsx35(Ellipsis, { className: "size-3.5" })
29813
+ children: /* @__PURE__ */ jsx34(Ellipsis, { className: "size-3.5" })
29829
29814
  }
29830
29815
  ) }),
29831
29816
  /* @__PURE__ */ jsxs25(DropdownMenuContent, { align: "end", className: "w-52", children: [
29832
29817
  tab && /* @__PURE__ */ jsxs25(Fragment5, { children: [
29833
- /* @__PURE__ */ jsx35(DropdownMenuItem, { onSelect: () => actions.moveToTab(pane.id), children: t3("splitScreen.moveToTab") }),
29834
- /* @__PURE__ */ jsx35(DropdownMenuItem, { onSelect: () => actions.closeSession(tab.id), children: t3("splitScreen.closeSession") })
29818
+ /* @__PURE__ */ jsx34(DropdownMenuItem, { onSelect: () => actions.moveToTab(pane.id), children: t3("splitScreen.moveToTab") }),
29819
+ /* @__PURE__ */ jsx34(DropdownMenuItem, { onSelect: () => actions.closeSession(tab.id), children: t3("splitScreen.closeSession") })
29835
29820
  ] }),
29836
29821
  otherPanes.length > 0 && /* @__PURE__ */ jsxs25(DropdownMenuSub, { children: [
29837
- /* @__PURE__ */ jsx35(DropdownMenuSubTrigger, { children: t3("splitScreen.swapWith") }),
29838
- /* @__PURE__ */ jsx35(DropdownMenuSubContent, { className: "w-56", children: otherPanes.map((other) => {
29822
+ /* @__PURE__ */ jsx34(DropdownMenuSubTrigger, { children: t3("splitScreen.swapWith") }),
29823
+ /* @__PURE__ */ jsx34(DropdownMenuSubContent, { className: "w-56", children: otherPanes.map((other) => {
29839
29824
  const otherTab = other.tabId ? tabsById.get(other.tabId) : void 0;
29840
29825
  const otherIndex = paneIndexById.get(other.id) ?? 0;
29841
- return /* @__PURE__ */ jsx35(
29826
+ return /* @__PURE__ */ jsx34(
29842
29827
  DropdownMenuItem,
29843
29828
  {
29844
29829
  onSelect: () => actions.swapPanes(pane.id, other.id),
29845
- children: /* @__PURE__ */ jsx35("span", { className: "truncate", children: otherTab ? t3("splitScreen.paneItem", {
29830
+ children: /* @__PURE__ */ jsx34("span", { className: "truncate", children: otherTab ? t3("splitScreen.paneItem", {
29846
29831
  index: otherIndex,
29847
29832
  label: tabLabel(otherTab)
29848
29833
  }) : t3("splitScreen.paneEmptyItem", {
@@ -29853,8 +29838,8 @@ function PaneHeader({
29853
29838
  );
29854
29839
  }) })
29855
29840
  ] }),
29856
- (tab || otherPanes.length > 0) && /* @__PURE__ */ jsx35(DropdownMenuSeparator, {}),
29857
- /* @__PURE__ */ jsx35(
29841
+ (tab || otherPanes.length > 0) && /* @__PURE__ */ jsx34(DropdownMenuSeparator, {}),
29842
+ /* @__PURE__ */ jsx34(
29858
29843
  DropdownMenuItem,
29859
29844
  {
29860
29845
  variant: "destructive",
@@ -29902,12 +29887,12 @@ var PaneView = memo(function PaneView2({
29902
29887
  "data-split-pane-id": pane.id,
29903
29888
  className: "relative flex size-full min-h-0 min-w-0 flex-col overflow-hidden bg-background",
29904
29889
  children: [
29905
- /* @__PURE__ */ jsx35(PaneHeader, { pane, tab, focused, ctx }),
29890
+ /* @__PURE__ */ jsx34(PaneHeader, { pane, tab, focused, ctx }),
29906
29891
  /* @__PURE__ */ jsxs25("div", { className: "relative min-h-0 flex-1 overflow-hidden", children: [
29907
- tab ? /* @__PURE__ */ jsx35("div", { ref: contentRef, className: "absolute inset-0" }) : ctx.renderEmptyPane(pane.id, ctx.paneIndexById.get(pane.id) ?? 0),
29908
- ctx.resizing && /* @__PURE__ */ jsx35("div", { className: "absolute inset-0 z-10" })
29892
+ tab ? /* @__PURE__ */ jsx34("div", { ref: contentRef, className: "absolute inset-0" }) : ctx.renderEmptyPane(pane.id, ctx.paneIndexById.get(pane.id) ?? 0),
29893
+ ctx.resizing && /* @__PURE__ */ jsx34("div", { className: "absolute inset-0 z-10" })
29909
29894
  ] }),
29910
- focused && ctx.paneCount > 1 && /* @__PURE__ */ jsx35("div", { className: "pointer-events-none absolute inset-0 z-30 border border-accent-brand/70" })
29895
+ focused && ctx.paneCount > 1 && /* @__PURE__ */ jsx34("div", { className: "pointer-events-none absolute inset-0 z-30 border border-accent-brand/70" })
29911
29896
  ]
29912
29897
  }
29913
29898
  );
@@ -29947,11 +29932,11 @@ function Divider({
29947
29932
  ctx.setResizing(false);
29948
29933
  ctx.actions.resizeEnd();
29949
29934
  }
29950
- return /* @__PURE__ */ jsx35(
29935
+ return /* @__PURE__ */ jsx34(
29951
29936
  "div",
29952
29937
  {
29953
29938
  className: `relative z-20 shrink-0 bg-border ${row ? "w-px" : "h-px"}`,
29954
- children: /* @__PURE__ */ jsx35(
29939
+ children: /* @__PURE__ */ jsx34(
29955
29940
  "div",
29956
29941
  {
29957
29942
  role: "separator",
@@ -29966,7 +29951,7 @@ function Divider({
29966
29951
  ctx.actions.resizeEnd();
29967
29952
  },
29968
29953
  className: `group absolute flex touch-none items-center justify-center ${row ? "inset-y-0 -left-1.5 -right-1.5 cursor-col-resize" : "inset-x-0 -top-1.5 -bottom-1.5 cursor-row-resize"}`,
29969
- children: /* @__PURE__ */ jsx35(
29954
+ children: /* @__PURE__ */ jsx34(
29970
29955
  "div",
29971
29956
  {
29972
29957
  className: `pointer-events-none bg-transparent transition-colors group-hover:bg-accent-brand/60 ${row ? "h-full w-0.5" : "h-0.5 w-full"}`
@@ -29978,22 +29963,22 @@ function Divider({
29978
29963
  );
29979
29964
  }
29980
29965
  function NodeView({ node, ctx }) {
29981
- if (node.kind === "pane") return /* @__PURE__ */ jsx35(PaneView, { pane: node, ctx });
29966
+ if (node.kind === "pane") return /* @__PURE__ */ jsx34(PaneView, { pane: node, ctx });
29982
29967
  const row = node.direction === "row";
29983
- return /* @__PURE__ */ jsx35(
29968
+ return /* @__PURE__ */ jsx34(
29984
29969
  "div",
29985
29970
  {
29986
29971
  className: `flex size-full min-h-0 min-w-0 ${row ? "flex-row" : "flex-col"}`,
29987
29972
  children: node.children.map((child, index) => /* @__PURE__ */ jsxs25(React9.Fragment, { children: [
29988
- /* @__PURE__ */ jsx35(
29973
+ /* @__PURE__ */ jsx34(
29989
29974
  "div",
29990
29975
  {
29991
29976
  className: "relative min-h-0 min-w-0 overflow-hidden",
29992
29977
  style: { flex: `${node.sizes[index]} 1 0px` },
29993
- children: /* @__PURE__ */ jsx35(NodeView, { node: child, ctx })
29978
+ children: /* @__PURE__ */ jsx34(NodeView, { node: child, ctx })
29994
29979
  }
29995
29980
  ),
29996
- index < node.children.length - 1 && /* @__PURE__ */ jsx35(Divider, { node, index, ctx })
29981
+ index < node.children.length - 1 && /* @__PURE__ */ jsx34(Divider, { node, index, ctx })
29997
29982
  ] }, child.id))
29998
29983
  }
29999
29984
  );
@@ -30001,7 +29986,7 @@ function NodeView({ node, ctx }) {
30001
29986
  function MobilePaneStrip({ ctx }) {
30002
29987
  const { t: t3 } = useTranslation13();
30003
29988
  const panes = listPanes(ctx.splitTab.split.root);
30004
- return /* @__PURE__ */ jsx35("div", { className: "flex h-9 shrink-0 items-stretch overflow-x-auto border-b border-border bg-sidebar", children: panes.map((pane) => {
29989
+ return /* @__PURE__ */ jsx34("div", { className: "flex h-9 shrink-0 items-stretch overflow-x-auto border-b border-border bg-sidebar", children: panes.map((pane) => {
30005
29990
  const tab = pane.tabId ? ctx.tabsById.get(pane.tabId) : void 0;
30006
29991
  const active2 = ctx.splitTab.split.focusedPaneId === pane.id;
30007
29992
  const index = ctx.paneIndexById.get(pane.id) ?? 0;
@@ -30012,8 +29997,8 @@ function MobilePaneStrip({ ctx }) {
30012
29997
  onClick: () => ctx.actions.focusPane(pane.id),
30013
29998
  className: `flex min-w-0 max-w-40 shrink-0 items-center gap-1.5 border-r border-border px-3 text-xs ${active2 ? "bg-accent-brand/10 text-accent-brand" : "text-muted-foreground"}`,
30014
29999
  children: [
30015
- /* @__PURE__ */ jsx35("span", { className: "font-mono text-[10px]", children: index }),
30016
- /* @__PURE__ */ jsx35("span", { className: "truncate", children: tab ? tabLabel(tab) : t3("splitScreen.emptyTitle") })
30000
+ /* @__PURE__ */ jsx34("span", { className: "font-mono text-[10px]", children: index }),
30001
+ /* @__PURE__ */ jsx34("span", { className: "truncate", children: tab ? tabLabel(tab) : t3("splitScreen.emptyTitle") })
30017
30002
  ]
30018
30003
  },
30019
30004
  pane.id
@@ -30069,8 +30054,8 @@ function SplitView({
30069
30054
  className: `flex size-full min-h-0 flex-col overflow-hidden ${resizing ? "select-none" : ""}`,
30070
30055
  "data-split-view": splitTab.id,
30071
30056
  children: [
30072
- isMobile && panes.length > 1 && /* @__PURE__ */ jsx35(MobilePaneStrip, { ctx }),
30073
- /* @__PURE__ */ jsx35("div", { className: "relative min-h-0 flex-1", children: single ? /* @__PURE__ */ jsx35(PaneView, { pane: single, ctx }, single.id) : /* @__PURE__ */ jsx35(NodeView, { node: splitTab.split.root, ctx }) })
30057
+ isMobile && panes.length > 1 && /* @__PURE__ */ jsx34(MobilePaneStrip, { ctx }),
30058
+ /* @__PURE__ */ jsx34("div", { className: "relative min-h-0 flex-1", children: single ? /* @__PURE__ */ jsx34(PaneView, { pane: single, ctx }, single.id) : /* @__PURE__ */ jsx34(NodeView, { node: splitTab.split.root, ctx }) })
30074
30059
  ]
30075
30060
  }
30076
30061
  );
@@ -30081,7 +30066,7 @@ init_define_import_meta_env();
30081
30066
  import { useEffect as useEffect11 } from "react";
30082
30067
  import { createPortal } from "react-dom";
30083
30068
  import { useTranslation as useTranslation14 } from "react-i18next";
30084
- import { jsx as jsx36, jsxs as jsxs26 } from "react/jsx-runtime";
30069
+ import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
30085
30070
  function SplitDropOverlay({
30086
30071
  containerRef
30087
30072
  }) {
@@ -30122,7 +30107,7 @@ function SplitDropOverlay({
30122
30107
  const { hover } = drag;
30123
30108
  return createPortal(
30124
30109
  /* @__PURE__ */ jsxs26("div", { className: "pointer-events-none fixed inset-0 z-[9998]", children: [
30125
- hover && /* @__PURE__ */ jsx36(
30110
+ hover && /* @__PURE__ */ jsx35(
30126
30111
  "div",
30127
30112
  {
30128
30113
  className: "absolute flex items-center justify-center border-2 border-dashed border-accent-brand bg-accent-brand/15 transition-[left,top,width,height] duration-100",
@@ -30132,10 +30117,10 @@ function SplitDropOverlay({
30132
30117
  width: hover.rect.width,
30133
30118
  height: hover.rect.height
30134
30119
  },
30135
- children: /* @__PURE__ */ jsx36("span", { className: "bg-background/90 px-2 py-1 text-xs font-medium text-accent-brand", children: hover.target === "center" ? t3("splitScreen.dropHere") : t3("splitScreen.dropSplit") })
30120
+ children: /* @__PURE__ */ jsx35("span", { className: "bg-background/90 px-2 py-1 text-xs font-medium text-accent-brand", children: hover.target === "center" ? t3("splitScreen.dropHere") : t3("splitScreen.dropSplit") })
30136
30121
  }
30137
30122
  ),
30138
- /* @__PURE__ */ jsx36(
30123
+ /* @__PURE__ */ jsx35(
30139
30124
  "div",
30140
30125
  {
30141
30126
  className: "absolute max-w-48 truncate border border-border bg-popover px-2 py-1 text-xs text-foreground shadow-lg",
@@ -30152,7 +30137,7 @@ function SplitDropOverlay({
30152
30137
  init_define_import_meta_env();
30153
30138
  import { useMemo as useMemo5, useState as useState14 } from "react";
30154
30139
  import { useTranslation as useTranslation15 } from "react-i18next";
30155
- import { jsx as jsx37, jsxs as jsxs27 } from "react/jsx-runtime";
30140
+ import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
30156
30141
  var HOST_LIMIT = 60;
30157
30142
  function HostActionButton({
30158
30143
  host,
@@ -30163,7 +30148,7 @@ function HostActionButton({
30163
30148
  const Icon = action.icon;
30164
30149
  const title = action.label?.(host) ?? t3(action.titleKey);
30165
30150
  const items = action.items?.(host) ?? [];
30166
- const button = /* @__PURE__ */ jsx37(
30151
+ const button = /* @__PURE__ */ jsx36(
30167
30152
  "button",
30168
30153
  {
30169
30154
  type: "button",
@@ -30171,13 +30156,13 @@ function HostActionButton({
30171
30156
  "aria-label": `${host.name}: ${title}`,
30172
30157
  className: "flex size-6 shrink-0 items-center justify-center text-muted-foreground hover:bg-accent-brand/10 hover:text-accent-brand",
30173
30158
  onClick: items.length > 1 ? void 0 : () => onPick({ action }),
30174
- children: /* @__PURE__ */ jsx37(Icon, { className: "size-3.5" })
30159
+ children: /* @__PURE__ */ jsx36(Icon, { className: "size-3.5" })
30175
30160
  }
30176
30161
  );
30177
30162
  if (items.length <= 1) return button;
30178
30163
  return /* @__PURE__ */ jsxs27(DropdownMenu, { children: [
30179
- /* @__PURE__ */ jsx37(DropdownMenuTrigger, { asChild: true, children: button }),
30180
- /* @__PURE__ */ jsx37(DropdownMenuContent, { align: "end", className: "w-48", children: items.map((item) => /* @__PURE__ */ jsx37(
30164
+ /* @__PURE__ */ jsx36(DropdownMenuTrigger, { asChild: true, children: button }),
30165
+ /* @__PURE__ */ jsx36(DropdownMenuContent, { align: "end", className: "w-48", children: items.map((item) => /* @__PURE__ */ jsx36(
30181
30166
  DropdownMenuItem,
30182
30167
  {
30183
30168
  onSelect: () => onPick({ action, item }),
@@ -30207,7 +30192,7 @@ function EmptyPanePicker({
30207
30192
  ) : hosts;
30208
30193
  return [...matches].sort((a, b) => a.name.localeCompare(b.name)).slice(0, HOST_LIMIT);
30209
30194
  }, [hosts, query]);
30210
- return /* @__PURE__ */ jsx37(
30195
+ return /* @__PURE__ */ jsx36(
30211
30196
  "div",
30212
30197
  {
30213
30198
  className: "flex size-full justify-center overflow-y-auto bg-background p-4",
@@ -30216,29 +30201,29 @@ function EmptyPanePicker({
30216
30201
  /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-1", children: [
30217
30202
  /* @__PURE__ */ jsxs27("span", { className: "text-sm font-semibold text-foreground", children: [
30218
30203
  t3("splitScreen.emptyTitle"),
30219
- /* @__PURE__ */ jsx37("span", { className: "ml-2 text-xs font-normal text-muted-foreground", children: t3("splitScreen.paneNumber", { index: paneIndex }) })
30204
+ /* @__PURE__ */ jsx36("span", { className: "ml-2 text-xs font-normal text-muted-foreground", children: t3("splitScreen.paneNumber", { index: paneIndex }) })
30220
30205
  ] }),
30221
- /* @__PURE__ */ jsx37("span", { className: "text-xs text-muted-foreground", children: t3("splitScreen.emptyHint") })
30206
+ /* @__PURE__ */ jsx36("span", { className: "text-xs text-muted-foreground", children: t3("splitScreen.emptyHint") })
30222
30207
  ] }),
30223
30208
  /* @__PURE__ */ jsxs27("section", { className: "flex flex-col gap-1.5", children: [
30224
- /* @__PURE__ */ jsx37("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.openTabs") }),
30225
- freeTabs.length === 0 ? /* @__PURE__ */ jsx37("span", { className: "text-xs text-muted-foreground/70", children: t3("splitScreen.noOpenTabs") }) : /* @__PURE__ */ jsx37("div", { className: "flex flex-col border border-border", children: freeTabs.map((tab) => /* @__PURE__ */ jsxs27(
30209
+ /* @__PURE__ */ jsx36("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.openTabs") }),
30210
+ freeTabs.length === 0 ? /* @__PURE__ */ jsx36("span", { className: "text-xs text-muted-foreground/70", children: t3("splitScreen.noOpenTabs") }) : /* @__PURE__ */ jsx36("div", { className: "flex flex-col border border-border", children: freeTabs.map((tab) => /* @__PURE__ */ jsxs27(
30226
30211
  "button",
30227
30212
  {
30228
30213
  type: "button",
30229
30214
  className: "flex items-center gap-2 border-b border-border px-2.5 py-1.5 text-left text-xs last:border-b-0 hover:bg-accent-brand/10 hover:text-accent-brand",
30230
30215
  onClick: () => onPickTab(tab.id),
30231
30216
  children: [
30232
- /* @__PURE__ */ jsx37("span", { className: "shrink-0 text-muted-foreground", children: tabIcon(tab.type) }),
30233
- /* @__PURE__ */ jsx37("span", { className: "truncate", children: tab.label })
30217
+ /* @__PURE__ */ jsx36("span", { className: "shrink-0 text-muted-foreground", children: tabIcon(tab.type) }),
30218
+ /* @__PURE__ */ jsx36("span", { className: "truncate", children: tab.label })
30234
30219
  ]
30235
30220
  },
30236
30221
  tab.id
30237
30222
  )) })
30238
30223
  ] }),
30239
30224
  newTabOptions.length > 0 && /* @__PURE__ */ jsxs27("section", { className: "flex flex-col gap-1.5", children: [
30240
- /* @__PURE__ */ jsx37("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.newSession") }),
30241
- /* @__PURE__ */ jsx37("div", { className: "flex flex-wrap gap-1.5", children: newTabOptions.map((option) => {
30225
+ /* @__PURE__ */ jsx36("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.newSession") }),
30226
+ /* @__PURE__ */ jsx36("div", { className: "flex flex-wrap gap-1.5", children: newTabOptions.map((option) => {
30242
30227
  const Icon = option.icon;
30243
30228
  return /* @__PURE__ */ jsxs27(
30244
30229
  "button",
@@ -30247,7 +30232,7 @@ function EmptyPanePicker({
30247
30232
  className: "flex items-center gap-1.5 border border-border px-2.5 py-1.5 text-xs hover:border-accent-brand/40 hover:bg-accent-brand/10 hover:text-accent-brand",
30248
30233
  onClick: () => onOpenType(option.type),
30249
30234
  children: [
30250
- Icon && /* @__PURE__ */ jsx37(Icon, { className: "size-3.5" }),
30235
+ Icon && /* @__PURE__ */ jsx36(Icon, { className: "size-3.5" }),
30251
30236
  option.label
30252
30237
  ]
30253
30238
  },
@@ -30256,10 +30241,10 @@ function EmptyPanePicker({
30256
30241
  }) })
30257
30242
  ] }),
30258
30243
  /* @__PURE__ */ jsxs27("section", { className: "flex flex-col gap-1.5", children: [
30259
- /* @__PURE__ */ jsx37("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.hosts") }),
30244
+ /* @__PURE__ */ jsx36("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.hosts") }),
30260
30245
  /* @__PURE__ */ jsxs27("div", { className: "relative", children: [
30261
- /* @__PURE__ */ jsx37(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
30262
- /* @__PURE__ */ jsx37(
30246
+ /* @__PURE__ */ jsx36(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
30247
+ /* @__PURE__ */ jsx36(
30263
30248
  Input,
30264
30249
  {
30265
30250
  value: query,
@@ -30270,7 +30255,7 @@ function EmptyPanePicker({
30270
30255
  }
30271
30256
  )
30272
30257
  ] }),
30273
- shownHosts.length === 0 ? /* @__PURE__ */ jsx37("span", { className: "text-xs text-muted-foreground/70", children: t3("splitScreen.noHosts") }) : /* @__PURE__ */ jsx37("div", { className: "flex flex-col border border-border", children: shownHosts.map((host) => {
30258
+ shownHosts.length === 0 ? /* @__PURE__ */ jsx36("span", { className: "text-xs text-muted-foreground/70", children: t3("splitScreen.noHosts") }) : /* @__PURE__ */ jsx36("div", { className: "flex flex-col border border-border", children: shownHosts.map((host) => {
30274
30259
  const actions = hostActionsFor(allActions, host);
30275
30260
  const connect = actions.filter((action) => action.kind === "connect").sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
30276
30261
  const open = actions.filter((action) => action.kind === "open");
@@ -30288,7 +30273,7 @@ function EmptyPanePicker({
30288
30273
  className: "flex min-w-0 flex-1 flex-col items-start text-left text-xs enabled:hover:text-accent-brand disabled:opacity-60",
30289
30274
  onClick: () => primary && onPickHost(host, { action: primary }),
30290
30275
  children: [
30291
- /* @__PURE__ */ jsx37("span", { className: "w-full truncate font-medium", children: host.name }),
30276
+ /* @__PURE__ */ jsx36("span", { className: "w-full truncate font-medium", children: host.name }),
30292
30277
  /* @__PURE__ */ jsxs27("span", { className: "w-full truncate text-[10px] text-muted-foreground", children: [
30293
30278
  host.username ? `${host.username}@` : "",
30294
30279
  host.ip
@@ -30296,7 +30281,7 @@ function EmptyPanePicker({
30296
30281
  ]
30297
30282
  }
30298
30283
  ),
30299
- /* @__PURE__ */ jsx37("div", { className: "flex shrink-0 items-center", children: [...connect, ...open].map((action) => /* @__PURE__ */ jsx37(
30284
+ /* @__PURE__ */ jsx36("div", { className: "flex shrink-0 items-center", children: [...connect, ...open].map((action) => /* @__PURE__ */ jsx36(
30300
30285
  HostActionButton,
30301
30286
  {
30302
30287
  host,
@@ -30319,7 +30304,7 @@ function EmptyPanePicker({
30319
30304
  className: "self-start rounded-none text-xs text-muted-foreground",
30320
30305
  onClick: onClosePane,
30321
30306
  children: [
30322
- /* @__PURE__ */ jsx37(X, { className: "size-3" }),
30307
+ /* @__PURE__ */ jsx36(X, { className: "size-3" }),
30323
30308
  t3("splitScreen.closePane")
30324
30309
  ]
30325
30310
  }
@@ -30330,7 +30315,7 @@ function EmptyPanePicker({
30330
30315
  }
30331
30316
 
30332
30317
  // src/ui/shell/stage/TabStage.tsx
30333
- import { jsx as jsx38, jsxs as jsxs28 } from "react/jsx-runtime";
30318
+ import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
30334
30319
  function TabStage({ className }) {
30335
30320
  const shell2 = useShellController();
30336
30321
  const store = useTabStageStore();
@@ -30346,7 +30331,7 @@ function TabStage({ className }) {
30346
30331
  className
30347
30332
  ),
30348
30333
  children: [
30349
- activeSplit && /* @__PURE__ */ jsx38("div", { className: "motion-workspace-layout absolute inset-0 flex flex-col", children: /* @__PURE__ */ jsx38(
30334
+ activeSplit && /* @__PURE__ */ jsx37("div", { className: "motion-workspace-layout absolute inset-0 flex flex-col", children: /* @__PURE__ */ jsx37(
30350
30335
  SplitView,
30351
30336
  {
30352
30337
  splitTab: activeSplit,
@@ -30354,7 +30339,7 @@ function TabStage({ className }) {
30354
30339
  isMobile: shell2.isMobile,
30355
30340
  actions: shell2.split.viewActions(activeSplit.id),
30356
30341
  onPaneContentRef: store.setPaneEl,
30357
- renderEmptyPane: (paneId, paneIndex) => /* @__PURE__ */ jsx38(
30342
+ renderEmptyPane: (paneId, paneIndex) => /* @__PURE__ */ jsx37(
30358
30343
  EmptyPanePicker,
30359
30344
  {
30360
30345
  paneIndex,
@@ -30369,8 +30354,8 @@ function TabStage({ className }) {
30369
30354
  )
30370
30355
  }
30371
30356
  ) }),
30372
- /* @__PURE__ */ jsx38(SplitDropOverlay, { containerRef: mainAreaRef }),
30373
- /* @__PURE__ */ jsx38(
30357
+ /* @__PURE__ */ jsx37(SplitDropOverlay, { containerRef: mainAreaRef }),
30358
+ /* @__PURE__ */ jsx37(
30374
30359
  "div",
30375
30360
  {
30376
30361
  ref: store.setNormalView,
@@ -30386,7 +30371,7 @@ function TabStage({ className }) {
30386
30371
  // src/ui/components/manager-card.tsx
30387
30372
  init_define_import_meta_env();
30388
30373
  import { useTranslation as useTranslation16 } from "react-i18next";
30389
- import { jsx as jsx39, jsxs as jsxs29 } from "react/jsx-runtime";
30374
+ import { jsx as jsx38, jsxs as jsxs29 } from "react/jsx-runtime";
30390
30375
  function ManagerCardShell({
30391
30376
  title,
30392
30377
  icon,
@@ -30399,7 +30384,7 @@ function ManagerCardShell({
30399
30384
  headerExtra
30400
30385
  }) {
30401
30386
  const { t: t3 } = useTranslation16();
30402
- return /* @__PURE__ */ jsx39(
30387
+ return /* @__PURE__ */ jsx38(
30403
30388
  MetricCard,
30404
30389
  {
30405
30390
  title,
@@ -30407,21 +30392,21 @@ function ManagerCardShell({
30407
30392
  scroll: true,
30408
30393
  action: /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-1", children: [
30409
30394
  headerExtra,
30410
- /* @__PURE__ */ jsx39(
30395
+ /* @__PURE__ */ jsx38(
30411
30396
  "button",
30412
30397
  {
30413
30398
  onClick: onRefresh,
30414
30399
  className: "flex size-6 items-center justify-center text-muted-foreground transition-colors hover:text-foreground",
30415
30400
  title: t3("managerCard.refresh"),
30416
- children: /* @__PURE__ */ jsx39(RefreshCw, { className: `size-3 ${loading ? "animate-spin" : ""}` })
30401
+ children: /* @__PURE__ */ jsx38(RefreshCw, { className: `size-3 ${loading ? "animate-spin" : ""}` })
30417
30402
  }
30418
30403
  )
30419
30404
  ] }),
30420
30405
  children: error ? /* @__PURE__ */ jsxs29("div", { className: "flex flex-col items-center gap-2 py-6 text-center", children: [
30421
- /* @__PURE__ */ jsx39(TriangleAlert, { className: "size-6 text-warning" }),
30422
- /* @__PURE__ */ jsx39("span", { className: "text-xs text-muted-foreground", children: error.message }),
30423
- error.code === "SUDO_REQUIRED" && /* @__PURE__ */ jsx39("span", { className: "text-[10px] text-muted-foreground", children: t3("managerCard.sudoHint") }),
30424
- /* @__PURE__ */ jsx39(
30406
+ /* @__PURE__ */ jsx38(TriangleAlert, { className: "size-6 text-warning" }),
30407
+ /* @__PURE__ */ jsx38("span", { className: "text-xs text-muted-foreground", children: error.message }),
30408
+ error.code === "SUDO_REQUIRED" && /* @__PURE__ */ jsx38("span", { className: "text-[10px] text-muted-foreground", children: t3("managerCard.sudoHint") }),
30409
+ /* @__PURE__ */ jsx38(
30425
30410
  Button,
30426
30411
  {
30427
30412
  variant: "outline",
@@ -30431,7 +30416,7 @@ function ManagerCardShell({
30431
30416
  children: t3("managerCard.retry")
30432
30417
  }
30433
30418
  )
30434
- ] }) : empty2 ? /* @__PURE__ */ jsx39("div", { className: "flex items-center justify-center py-8 text-xs text-muted-foreground/50", children: emptyMessage ?? t3("managerCard.noData") }) : children
30419
+ ] }) : empty2 ? /* @__PURE__ */ jsx38("div", { className: "flex items-center justify-center py-8 text-xs text-muted-foreground/50", children: emptyMessage ?? t3("managerCard.noData") }) : children
30435
30420
  }
30436
30421
  );
30437
30422
  }
@@ -30445,8 +30430,8 @@ function ManagerSearch({
30445
30430
  const { t: t3 } = useTranslation16();
30446
30431
  return /* @__PURE__ */ jsxs29("div", { className: "mb-2 flex items-center gap-1.5", children: [
30447
30432
  /* @__PURE__ */ jsxs29("div", { className: "relative flex-1", children: [
30448
- /* @__PURE__ */ jsx39(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3 -translate-y-1/2 text-muted-foreground/60" }),
30449
- /* @__PURE__ */ jsx39(
30433
+ /* @__PURE__ */ jsx38(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3 -translate-y-1/2 text-muted-foreground/60" }),
30434
+ /* @__PURE__ */ jsx38(
30450
30435
  "input",
30451
30436
  {
30452
30437
  value,
@@ -30456,7 +30441,7 @@ function ManagerSearch({
30456
30441
  }
30457
30442
  )
30458
30443
  ] }),
30459
- count != null && /* @__PURE__ */ jsx39("span", { className: "shrink-0 text-[10px] tabular-nums text-muted-foreground", children: count }),
30444
+ count != null && /* @__PURE__ */ jsx38("span", { className: "shrink-0 text-[10px] tabular-nums text-muted-foreground", children: count }),
30460
30445
  extra
30461
30446
  ] });
30462
30447
  }
@@ -30508,13 +30493,13 @@ function useAdaptivePolling(poll, policy, enabled = true, options = {}) {
30508
30493
 
30509
30494
  // src/ui/lib/widget-title.tsx
30510
30495
  init_define_import_meta_env();
30511
- import { jsx as jsx40, jsxs as jsxs30 } from "react/jsx-runtime";
30496
+ import { jsx as jsx39, jsxs as jsxs30 } from "react/jsx-runtime";
30512
30497
  function WidgetTitle({ title, icon, fallback }) {
30513
30498
  const label = title || fallback;
30514
30499
  if (!label) return null;
30515
30500
  return /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-1.5 px-2 py-1.5 border-b border-border/50 shrink-0", children: [
30516
- icon && /* @__PURE__ */ jsx40("span", { className: "text-accent-brand shrink-0", children: icon }),
30517
- /* @__PURE__ */ jsx40("span", { className: "text-[10px] font-semibold text-muted-foreground uppercase tracking-wider truncate", children: label })
30501
+ icon && /* @__PURE__ */ jsx39("span", { className: "text-accent-brand shrink-0", children: icon }),
30502
+ /* @__PURE__ */ jsx39("span", { className: "text-[10px] font-semibold text-muted-foreground uppercase tracking-wider truncate", children: label })
30518
30503
  ] });
30519
30504
  }
30520
30505
 
@@ -30559,7 +30544,7 @@ function runVisibleInterval(tick, intervalMs) {
30559
30544
  // src/ui/ssh/dialogs/PassphraseDialog.tsx
30560
30545
  init_define_import_meta_env();
30561
30546
  import { useTranslation as useTranslation17 } from "react-i18next";
30562
- import { jsx as jsx41, jsxs as jsxs31 } from "react/jsx-runtime";
30547
+ import { jsx as jsx40, jsxs as jsxs31 } from "react/jsx-runtime";
30563
30548
  function PassphraseDialog({
30564
30549
  isOpen,
30565
30550
  onSubmit,
@@ -30579,18 +30564,18 @@ function PassphraseDialog({
30579
30564
  onSubmit(input.value);
30580
30565
  }
30581
30566
  };
30582
- return /* @__PURE__ */ jsx41(
30567
+ return /* @__PURE__ */ jsx40(
30583
30568
  PanePrompt,
30584
30569
  {
30585
30570
  open: true,
30586
30571
  layer: "connection",
30587
30572
  backgroundColor,
30588
- icon: /* @__PURE__ */ jsx41(KeyRound, { className: "size-4" }),
30573
+ icon: /* @__PURE__ */ jsx40(KeyRound, { className: "size-4" }),
30589
30574
  title: t3("auth.passphraseRequired"),
30590
- description: /* @__PURE__ */ jsx41("span", { className: "font-mono", children: hostDisplay }),
30575
+ description: /* @__PURE__ */ jsx40("span", { className: "font-mono", children: hostDisplay }),
30591
30576
  children: /* @__PURE__ */ jsxs31("form", { onSubmit: handleSubmit, className: "flex flex-col gap-3", children: [
30592
30577
  /* @__PURE__ */ jsxs31("div", { className: "flex flex-col gap-1.5", children: [
30593
- /* @__PURE__ */ jsx41(
30578
+ /* @__PURE__ */ jsx40(
30594
30579
  PasswordInput,
30595
30580
  {
30596
30581
  id: "passphrase",
@@ -30600,11 +30585,11 @@ function PassphraseDialog({
30600
30585
  className: "rounded-none bg-muted/50 border-border text-xs"
30601
30586
  }
30602
30587
  ),
30603
- /* @__PURE__ */ jsx41("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.passphraseRequiredDescription") })
30588
+ /* @__PURE__ */ jsx40("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.passphraseRequiredDescription") })
30604
30589
  ] }),
30605
30590
  /* @__PURE__ */ jsxs31("div", { className: "flex justify-end gap-2", children: [
30606
- /* @__PURE__ */ jsx41("button", { type: "button", onClick: onCancel, className: PROMPT_BUTTON, children: t3("common.cancel") }),
30607
- /* @__PURE__ */ jsx41("button", { type: "submit", className: PROMPT_PRIMARY_BUTTON, children: t3("common.connect") })
30591
+ /* @__PURE__ */ jsx40("button", { type: "button", onClick: onCancel, className: PROMPT_BUTTON, children: t3("common.cancel") }),
30592
+ /* @__PURE__ */ jsx40("button", { type: "submit", className: PROMPT_PRIMARY_BUTTON, children: t3("common.connect") })
30608
30593
  ] })
30609
30594
  ] })
30610
30595
  }
@@ -31015,7 +31000,7 @@ function hostKeyFingerprint(hex) {
31015
31000
  }
31016
31001
 
31017
31002
  // src/ui/ssh/dialogs/HostKeyVerificationDialog.tsx
31018
- import { Fragment as Fragment6, jsx as jsx42, jsxs as jsxs32 } from "react/jsx-runtime";
31003
+ import { Fragment as Fragment6, jsx as jsx41, jsxs as jsxs32 } from "react/jsx-runtime";
31019
31004
  function FingerprintRow({
31020
31005
  label,
31021
31006
  value,
@@ -31024,10 +31009,10 @@ function FingerprintRow({
31024
31009
  }) {
31025
31010
  const { t: t3 } = useTranslation18();
31026
31011
  return /* @__PURE__ */ jsxs32("div", { className: "flex flex-col gap-1.5", children: [
31027
- /* @__PURE__ */ jsx42("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: label }),
31012
+ /* @__PURE__ */ jsx41("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: label }),
31028
31013
  /* @__PURE__ */ jsxs32("div", { className: "flex items-stretch gap-2", children: [
31029
- /* @__PURE__ */ jsx42("div", { className: "flex-1 bg-muted/50 border border-border p-3 font-mono text-xs break-all", children: value }),
31030
- /* @__PURE__ */ jsx42(
31014
+ /* @__PURE__ */ jsx41("div", { className: "flex-1 bg-muted/50 border border-border p-3 font-mono text-xs break-all", children: value }),
31015
+ /* @__PURE__ */ jsx41(
31031
31016
  "button",
31032
31017
  {
31033
31018
  type: "button",
@@ -31035,7 +31020,7 @@ function FingerprintRow({
31035
31020
  title: t3("common.copy"),
31036
31021
  "aria-label": t3("common.copy"),
31037
31022
  className: "flex w-11 shrink-0 items-center justify-center border border-border text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-1 focus-visible:ring-ring",
31038
- children: copied ? /* @__PURE__ */ jsx42(Check, { className: "size-4 text-accent-brand" }) : /* @__PURE__ */ jsx42(Copy, { className: "size-4" })
31023
+ children: copied ? /* @__PURE__ */ jsx41(Check, { className: "size-4 text-accent-brand" }) : /* @__PURE__ */ jsx41(Copy, { className: "size-4" })
31039
31024
  }
31040
31025
  )
31041
31026
  ] })
@@ -31070,14 +31055,14 @@ function HostKeyVerificationDialog({
31070
31055
  const changed = scenario === "changed";
31071
31056
  const newPrint = hostKeyFingerprint(fingerprint);
31072
31057
  const oldPrint = hostKeyFingerprint(oldFingerprint || "");
31073
- return /* @__PURE__ */ jsx42(
31058
+ return /* @__PURE__ */ jsx41(
31074
31059
  PanePrompt,
31075
31060
  {
31076
31061
  open: true,
31077
31062
  layer: "connection",
31078
31063
  backgroundColor,
31079
31064
  tone: changed ? "destructive" : "default",
31080
- icon: changed ? /* @__PURE__ */ jsx42(TriangleAlert, { className: "size-4" }) : /* @__PURE__ */ jsx42(Shield, { className: "size-4" }),
31065
+ icon: changed ? /* @__PURE__ */ jsx41(TriangleAlert, { className: "size-4" }) : /* @__PURE__ */ jsx41(Shield, { className: "size-4" }),
31081
31066
  title: changed ? t3("hostKey.keyChangedWarning") : t3("hostKey.verifyNewHost"),
31082
31067
  description: /* @__PURE__ */ jsxs32("span", { className: "font-mono", children: [
31083
31068
  hostname || ip,
@@ -31086,8 +31071,8 @@ function HostKeyVerificationDialog({
31086
31071
  ] }),
31087
31072
  className: "max-w-lg",
31088
31073
  actions: /* @__PURE__ */ jsxs32(Fragment6, { children: [
31089
- /* @__PURE__ */ jsx42("button", { type: "button", onClick: onReject, className: PROMPT_BUTTON, children: t3("common.cancel") }),
31090
- /* @__PURE__ */ jsx42(
31074
+ /* @__PURE__ */ jsx41("button", { type: "button", onClick: onReject, className: PROMPT_BUTTON, children: t3("common.cancel") }),
31075
+ /* @__PURE__ */ jsx41(
31091
31076
  "button",
31092
31077
  {
31093
31078
  type: "button",
@@ -31097,15 +31082,15 @@ function HostKeyVerificationDialog({
31097
31082
  }
31098
31083
  )
31099
31084
  ] }),
31100
- children: /* @__PURE__ */ jsx42("div", { className: "flex flex-col gap-3", children: changed ? /* @__PURE__ */ jsxs32(Fragment6, { children: [
31085
+ children: /* @__PURE__ */ jsx41("div", { className: "flex flex-col gap-3", children: changed ? /* @__PURE__ */ jsxs32(Fragment6, { children: [
31101
31086
  /* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-3 p-3 border border-destructive/20 bg-destructive/10", children: [
31102
- /* @__PURE__ */ jsx42(TriangleAlert, { className: "size-4 text-destructive shrink-0 mt-0.5" }),
31087
+ /* @__PURE__ */ jsx41(TriangleAlert, { className: "size-4 text-destructive shrink-0 mt-0.5" }),
31103
31088
  /* @__PURE__ */ jsxs32("div", { children: [
31104
- /* @__PURE__ */ jsx42("p", { className: "text-[10px] font-bold uppercase tracking-widest text-destructive", children: t3("hostKey.securityWarning") }),
31105
- /* @__PURE__ */ jsx42("p", { className: "text-xs text-destructive/80 mt-1", children: t3("hostKey.keyChangedDescription") })
31089
+ /* @__PURE__ */ jsx41("p", { className: "text-[10px] font-bold uppercase tracking-widest text-destructive", children: t3("hostKey.securityWarning") }),
31090
+ /* @__PURE__ */ jsx41("p", { className: "text-xs text-destructive/80 mt-1", children: t3("hostKey.keyChangedDescription") })
31106
31091
  ] })
31107
31092
  ] }),
31108
- /* @__PURE__ */ jsx42(
31093
+ /* @__PURE__ */ jsx41(
31109
31094
  FingerprintRow,
31110
31095
  {
31111
31096
  label: t3("hostKey.previousKey"),
@@ -31114,7 +31099,7 @@ function HostKeyVerificationDialog({
31114
31099
  onCopy: () => copyFingerprint(oldPrint, true)
31115
31100
  }
31116
31101
  ),
31117
- /* @__PURE__ */ jsx42(
31102
+ /* @__PURE__ */ jsx41(
31118
31103
  FingerprintRow,
31119
31104
  {
31120
31105
  label: t3("hostKey.newFingerprint"),
@@ -31125,13 +31110,13 @@ function HostKeyVerificationDialog({
31125
31110
  )
31126
31111
  ] }) : /* @__PURE__ */ jsxs32(Fragment6, { children: [
31127
31112
  /* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-3 p-3 border border-border bg-muted/10", children: [
31128
- /* @__PURE__ */ jsx42(Shield, { className: "size-4 text-accent-brand shrink-0 mt-0.5" }),
31113
+ /* @__PURE__ */ jsx41(Shield, { className: "size-4 text-accent-brand shrink-0 mt-0.5" }),
31129
31114
  /* @__PURE__ */ jsxs32("div", { children: [
31130
- /* @__PURE__ */ jsx42("p", { className: "text-[10px] font-bold uppercase tracking-widest", children: t3("hostKey.firstConnectionTitle") }),
31131
- /* @__PURE__ */ jsx42("p", { className: "text-xs text-muted-foreground mt-1", children: t3("hostKey.firstConnectionDescription") })
31115
+ /* @__PURE__ */ jsx41("p", { className: "text-[10px] font-bold uppercase tracking-widest", children: t3("hostKey.firstConnectionTitle") }),
31116
+ /* @__PURE__ */ jsx41("p", { className: "text-xs text-muted-foreground mt-1", children: t3("hostKey.firstConnectionDescription") })
31132
31117
  ] })
31133
31118
  ] }),
31134
- /* @__PURE__ */ jsx42(
31119
+ /* @__PURE__ */ jsx41(
31135
31120
  FingerprintRow,
31136
31121
  {
31137
31122
  label: t3("hostKey.fingerprint"),
@@ -31140,7 +31125,7 @@ function HostKeyVerificationDialog({
31140
31125
  onCopy: () => copyFingerprint(newPrint)
31141
31126
  }
31142
31127
  ),
31143
- /* @__PURE__ */ jsx42("p", { className: "text-[10px] text-muted-foreground", children: t3("hostKey.verifyInstructions") })
31128
+ /* @__PURE__ */ jsx41("p", { className: "text-[10px] text-muted-foreground", children: t3("hostKey.verifyInstructions") })
31144
31129
  ] }) })
31145
31130
  }
31146
31131
  );
@@ -31203,10 +31188,10 @@ var RobustClipboardProvider = class {
31203
31188
  // src/ui/components/kbd.tsx
31204
31189
  init_define_import_meta_env();
31205
31190
  import * as React10 from "react";
31206
- import { jsx as jsx43 } from "react/jsx-runtime";
31191
+ import { jsx as jsx42 } from "react/jsx-runtime";
31207
31192
  var Kbd = React10.forwardRef(
31208
31193
  ({ className, ...props }, ref) => {
31209
- return /* @__PURE__ */ jsx43(
31194
+ return /* @__PURE__ */ jsx42(
31210
31195
  "kbd",
31211
31196
  {
31212
31197
  ref,
@@ -31223,12 +31208,12 @@ Kbd.displayName = "Kbd";
31223
31208
  var KbdKey = ({
31224
31209
  className,
31225
31210
  ...props
31226
- }) => /* @__PURE__ */ jsx43("span", { className: cn("", className), ...props });
31211
+ }) => /* @__PURE__ */ jsx42("span", { className: cn("", className), ...props });
31227
31212
  KbdKey.displayName = "KbdKey";
31228
31213
  var KbdSeparator = ({
31229
31214
  className,
31230
31215
  ...props
31231
- }) => /* @__PURE__ */ jsx43("span", { className: cn("text-muted-foreground/50", className), ...props, children: "+" });
31216
+ }) => /* @__PURE__ */ jsx42("span", { className: cn("text-muted-foreground/50", className), ...props, children: "+" });
31232
31217
  KbdSeparator.displayName = "KbdSeparator";
31233
31218
 
31234
31219
  // src/ui/components/card-masonry.tsx
@@ -31242,7 +31227,7 @@ import {
31242
31227
  useRef as useRef9,
31243
31228
  useState as useState16
31244
31229
  } from "react";
31245
- import { jsx as jsx44 } from "react/jsx-runtime";
31230
+ import { jsx as jsx43 } from "react/jsx-runtime";
31246
31231
  var COLUMN_STEPS = {
31247
31232
  1: [1, 1, 1, 1],
31248
31233
  2: [1, 2, 2, 2],
@@ -31288,7 +31273,7 @@ function CardMasonry({
31288
31273
  items.forEach((child, i2) => next[i2 % count].push(child));
31289
31274
  return next;
31290
31275
  }, [items, count]);
31291
- return /* @__PURE__ */ jsx44(
31276
+ return /* @__PURE__ */ jsx43(
31292
31277
  "div",
31293
31278
  {
31294
31279
  ref,
@@ -31296,7 +31281,7 @@ function CardMasonry({
31296
31281
  count === 1 ? `flex flex-col ${PANEL.gap}` : `flex items-start ${PANEL.gap}`,
31297
31282
  className
31298
31283
  ),
31299
- children: count === 1 ? items : buckets2.map((bucket, i2) => /* @__PURE__ */ jsx44(
31284
+ children: count === 1 ? items : buckets2.map((bucket, i2) => /* @__PURE__ */ jsx43(
31300
31285
  "div",
31301
31286
  {
31302
31287
  className: `flex min-w-0 flex-1 flex-col ${PANEL.gap}`,
@@ -31327,13 +31312,13 @@ function usageBarColor(percent) {
31327
31312
  }
31328
31313
 
31329
31314
  // src/ui/components/meter.tsx
31330
- import { jsx as jsx45, jsxs as jsxs33 } from "react/jsx-runtime";
31315
+ import { jsx as jsx44, jsxs as jsxs33 } from "react/jsx-runtime";
31331
31316
  function Meter({
31332
31317
  percent,
31333
31318
  className
31334
31319
  }) {
31335
31320
  const clamped = percent === null ? 0 : Math.min(100, Math.max(0, percent));
31336
- return /* @__PURE__ */ jsx45("div", { className: cn("h-1.5 w-full overflow-hidden bg-muted", className), children: /* @__PURE__ */ jsx45(
31321
+ return /* @__PURE__ */ jsx44("div", { className: cn("h-1.5 w-full overflow-hidden bg-muted", className), children: /* @__PURE__ */ jsx44(
31337
31322
  "div",
31338
31323
  {
31339
31324
  className: cn("motion-meter h-full", usageBarColor(percent)),
@@ -31348,9 +31333,9 @@ function UsagePair({
31348
31333
  }) {
31349
31334
  const clamped = Math.min(100, Math.max(0, percent));
31350
31335
  return /* @__PURE__ */ jsxs33("div", { className: "flex min-w-0 items-center gap-2", children: [
31351
- label && /* @__PURE__ */ jsx45("span", { className: "w-10 shrink-0 text-[10px] uppercase text-muted-foreground", children: label }),
31352
- /* @__PURE__ */ jsx45(Meter, { percent: clamped, className: "flex-1" }),
31353
- /* @__PURE__ */ jsx45(
31336
+ label && /* @__PURE__ */ jsx44("span", { className: "w-10 shrink-0 text-[10px] uppercase text-muted-foreground", children: label }),
31337
+ /* @__PURE__ */ jsx44(Meter, { percent: clamped, className: "flex-1" }),
31338
+ /* @__PURE__ */ jsx44(
31354
31339
  "span",
31355
31340
  {
31356
31341
  className: cn(
@@ -31367,7 +31352,7 @@ function UsagePair({
31367
31352
  init_define_import_meta_env();
31368
31353
  import { useState as useState17 } from "react";
31369
31354
  import { useTranslation as useTranslation19 } from "react-i18next";
31370
- import { jsx as jsx46, jsxs as jsxs34 } from "react/jsx-runtime";
31355
+ import { jsx as jsx45, jsxs as jsxs34 } from "react/jsx-runtime";
31371
31356
  function Field2({
31372
31357
  label,
31373
31358
  hint,
@@ -31379,7 +31364,7 @@ function Field2({
31379
31364
  }) {
31380
31365
  return /* @__PURE__ */ jsxs34("div", { "data-setting-row": "", className: cn("flex flex-col gap-1.5", className), children: [
31381
31366
  (label || aside) && /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-2", children: [
31382
- /* @__PURE__ */ jsx46(
31367
+ /* @__PURE__ */ jsx45(
31383
31368
  "label",
31384
31369
  {
31385
31370
  htmlFor,
@@ -31387,10 +31372,10 @@ function Field2({
31387
31372
  children: label
31388
31373
  }
31389
31374
  ),
31390
- aside && /* @__PURE__ */ jsx46("span", { className: "ml-auto", children: aside })
31375
+ aside && /* @__PURE__ */ jsx45("span", { className: "ml-auto", children: aside })
31391
31376
  ] }),
31392
31377
  children,
31393
- error ? /* @__PURE__ */ jsx46("span", { className: "text-[10px] text-destructive", children: error }) : hint ? /* @__PURE__ */ jsx46("span", { className: "text-[10px] text-muted-foreground", children: hint }) : null
31378
+ error ? /* @__PURE__ */ jsx45("span", { className: "text-[10px] text-destructive", children: error }) : hint ? /* @__PURE__ */ jsx45("span", { className: "text-[10px] text-muted-foreground", children: hint }) : null
31394
31379
  ] });
31395
31380
  }
31396
31381
  function TextField({
@@ -31405,7 +31390,7 @@ function TextField({
31405
31390
  mono,
31406
31391
  className
31407
31392
  }) {
31408
- return /* @__PURE__ */ jsx46(
31393
+ return /* @__PURE__ */ jsx45(
31409
31394
  Field2,
31410
31395
  {
31411
31396
  label,
@@ -31413,7 +31398,7 @@ function TextField({
31413
31398
  error,
31414
31399
  aside,
31415
31400
  className,
31416
- children: /* @__PURE__ */ jsx46(
31401
+ children: /* @__PURE__ */ jsx45(
31417
31402
  Input,
31418
31403
  {
31419
31404
  value,
@@ -31439,7 +31424,7 @@ function NumberField({
31439
31424
  disabled,
31440
31425
  className
31441
31426
  }) {
31442
- return /* @__PURE__ */ jsx46(Field2, { label, hint, error, className, children: /* @__PURE__ */ jsx46(
31427
+ return /* @__PURE__ */ jsx45(Field2, { label, hint, error, className, children: /* @__PURE__ */ jsx45(
31443
31428
  Input,
31444
31429
  {
31445
31430
  type: "number",
@@ -31477,14 +31462,14 @@ function SecretField({
31477
31462
  }) {
31478
31463
  const { t: t3 } = useTranslation19();
31479
31464
  const saved = isSecretSentinel(value);
31480
- return /* @__PURE__ */ jsx46(
31465
+ return /* @__PURE__ */ jsx45(
31481
31466
  Field2,
31482
31467
  {
31483
31468
  label,
31484
31469
  hint: saved ? t3("fields.secretSaved") : hint,
31485
31470
  error,
31486
31471
  className,
31487
- children: /* @__PURE__ */ jsx46(
31472
+ children: /* @__PURE__ */ jsx45(
31488
31473
  PasswordInput,
31489
31474
  {
31490
31475
  value: saved ? "" : value,
@@ -31509,15 +31494,15 @@ function SelectField({
31509
31494
  placeholder: placeholder2
31510
31495
  }) {
31511
31496
  const EMPTY = "__empty__";
31512
- return /* @__PURE__ */ jsx46(Field2, { label, hint, error, className, children: /* @__PURE__ */ jsxs34(
31497
+ return /* @__PURE__ */ jsx45(Field2, { label, hint, error, className, children: /* @__PURE__ */ jsxs34(
31513
31498
  Select,
31514
31499
  {
31515
31500
  value: value === "" ? EMPTY : value,
31516
31501
  disabled,
31517
31502
  onValueChange: (next) => onChange(next === EMPTY ? "" : next),
31518
31503
  children: [
31519
- /* @__PURE__ */ jsx46(SelectTrigger, { "aria-invalid": !!error, className: "h-8 w-full text-xs", children: /* @__PURE__ */ jsx46(SelectValue, { placeholder: placeholder2 }) }),
31520
- /* @__PURE__ */ jsx46(SelectContent, { children: options.map((option) => /* @__PURE__ */ jsx46(
31504
+ /* @__PURE__ */ jsx45(SelectTrigger, { "aria-invalid": !!error, className: "h-8 w-full text-xs", children: /* @__PURE__ */ jsx45(SelectValue, { placeholder: placeholder2 }) }),
31505
+ /* @__PURE__ */ jsx45(SelectContent, { children: options.map((option) => /* @__PURE__ */ jsx45(
31521
31506
  SelectItem,
31522
31507
  {
31523
31508
  value: option.value === "" ? EMPTY : option.value,
@@ -31543,7 +31528,7 @@ function TextAreaField({
31543
31528
  disabled,
31544
31529
  className
31545
31530
  }) {
31546
- return /* @__PURE__ */ jsx46(
31531
+ return /* @__PURE__ */ jsx45(
31547
31532
  Field2,
31548
31533
  {
31549
31534
  label,
@@ -31551,7 +31536,7 @@ function TextAreaField({
31551
31536
  error,
31552
31537
  aside,
31553
31538
  className,
31554
- children: /* @__PURE__ */ jsx46(
31539
+ children: /* @__PURE__ */ jsx45(
31555
31540
  "textarea",
31556
31541
  {
31557
31542
  rows,
@@ -31578,7 +31563,7 @@ function SwitchRow({
31578
31563
  defaultKey,
31579
31564
  rowId
31580
31565
  }) {
31581
- return /* @__PURE__ */ jsx46(
31566
+ return /* @__PURE__ */ jsx45(
31582
31567
  SettingRow,
31583
31568
  {
31584
31569
  label,
@@ -31586,7 +31571,7 @@ function SwitchRow({
31586
31571
  badge,
31587
31572
  defaultKey,
31588
31573
  rowId,
31589
- children: /* @__PURE__ */ jsx46(FakeSwitch, { checked, onChange, disabled })
31574
+ children: /* @__PURE__ */ jsx45(FakeSwitch, { checked, onChange, disabled })
31590
31575
  }
31591
31576
  );
31592
31577
  }
@@ -31603,7 +31588,7 @@ function Repeater({
31603
31588
  const { t: t3 } = useTranslation19();
31604
31589
  return /* @__PURE__ */ jsxs34("div", { className: "flex flex-col gap-2 py-3", children: [
31605
31590
  /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-2", children: [
31606
- /* @__PURE__ */ jsx46("span", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: label }),
31591
+ /* @__PURE__ */ jsx45("span", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: label }),
31607
31592
  /* @__PURE__ */ jsxs34(
31608
31593
  Button,
31609
31594
  {
@@ -31613,24 +31598,24 @@ function Repeater({
31613
31598
  className: "ml-auto",
31614
31599
  onClick: () => onChange([...items, makeItem()]),
31615
31600
  children: [
31616
- /* @__PURE__ */ jsx46(Plus, { className: "mr-1 size-3" }),
31601
+ /* @__PURE__ */ jsx45(Plus, { className: "mr-1 size-3" }),
31617
31602
  addLabel
31618
31603
  ]
31619
31604
  }
31620
31605
  )
31621
31606
  ] }),
31622
- hint && /* @__PURE__ */ jsx46("span", { className: "text-[10px] text-muted-foreground", children: hint }),
31623
- items.length === 0 ? /* @__PURE__ */ jsx46("span", { className: "border border-dashed border-border px-3 py-2 text-[10px] text-muted-foreground", children: empty2 }) : /* @__PURE__ */ jsx46("div", { className: "flex flex-col gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs34(
31607
+ hint && /* @__PURE__ */ jsx45("span", { className: "text-[10px] text-muted-foreground", children: hint }),
31608
+ items.length === 0 ? /* @__PURE__ */ jsx45("span", { className: "border border-dashed border-border px-3 py-2 text-[10px] text-muted-foreground", children: empty2 }) : /* @__PURE__ */ jsx45("div", { className: "flex flex-col gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs34(
31624
31609
  "div",
31625
31610
  {
31626
31611
  className: "flex items-start gap-2 border border-border bg-muted/10 p-2",
31627
31612
  children: [
31628
- /* @__PURE__ */ jsx46("div", { className: "min-w-0 flex-1", children: renderItem(
31613
+ /* @__PURE__ */ jsx45("div", { className: "min-w-0 flex-1", children: renderItem(
31629
31614
  item,
31630
31615
  (next) => onChange(items.map((x, i2) => i2 === index ? next : x)),
31631
31616
  index
31632
31617
  ) }),
31633
- /* @__PURE__ */ jsx46(
31618
+ /* @__PURE__ */ jsx45(
31634
31619
  "button",
31635
31620
  {
31636
31621
  type: "button",
@@ -31638,7 +31623,7 @@ function Repeater({
31638
31623
  "aria-label": t3("common.remove"),
31639
31624
  onClick: () => onChange(items.filter((_, i2) => i2 !== index)),
31640
31625
  className: "mt-0.5 shrink-0 text-muted-foreground transition-colors hover:text-destructive focus-visible:ring-1 focus-visible:ring-ring",
31641
- children: /* @__PURE__ */ jsx46(Trash, { className: "size-3.5" })
31626
+ children: /* @__PURE__ */ jsx45(Trash, { className: "size-3.5" })
31642
31627
  }
31643
31628
  )
31644
31629
  ]
@@ -31662,21 +31647,21 @@ function TagInput({
31662
31647
  className: "flex items-center gap-0.5 border border-border/60 bg-muted px-1.5 py-0.5 text-[10px] text-foreground",
31663
31648
  children: [
31664
31649
  tag,
31665
- /* @__PURE__ */ jsx46(
31650
+ /* @__PURE__ */ jsx45(
31666
31651
  "button",
31667
31652
  {
31668
31653
  type: "button",
31669
31654
  "aria-label": t3("common.remove"),
31670
31655
  onClick: () => onTagsChange(tags2.filter((tg) => tg !== tag)),
31671
31656
  className: "ml-0.5 text-muted-foreground hover:text-destructive",
31672
- children: /* @__PURE__ */ jsx46(X, { className: "size-2.5" })
31657
+ children: /* @__PURE__ */ jsx45(X, { className: "size-2.5" })
31673
31658
  }
31674
31659
  )
31675
31660
  ]
31676
31661
  },
31677
31662
  tag
31678
31663
  )),
31679
- /* @__PURE__ */ jsx46(
31664
+ /* @__PURE__ */ jsx45(
31680
31665
  "input",
31681
31666
  {
31682
31667
  className: "min-w-16 flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground/50",
@@ -31698,7 +31683,7 @@ function TagInput({
31698
31683
  ] });
31699
31684
  }
31700
31685
  function FieldPair({ children }) {
31701
- return /* @__PURE__ */ jsx46("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children });
31686
+ return /* @__PURE__ */ jsx45("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children });
31702
31687
  }
31703
31688
 
31704
31689
  // src/ui/components/connection/ConnectionGate.tsx
@@ -31712,7 +31697,7 @@ import {
31712
31697
  useState as useState18
31713
31698
  } from "react";
31714
31699
  import { useConnectionRetry } from "@termix-ssh/plugin-sdk/frontend";
31715
- import { jsx as jsx47, jsxs as jsxs35 } from "react/jsx-runtime";
31700
+ import { jsx as jsx46, jsxs as jsxs35 } from "react/jsx-runtime";
31716
31701
  function messageOf(err) {
31717
31702
  return typeof err === "string" ? err : getErrorMessage(err);
31718
31703
  }
@@ -31725,7 +31710,7 @@ function useConnectionGate() {
31725
31710
  return gate;
31726
31711
  }
31727
31712
  function ConnectionGate(props) {
31728
- return /* @__PURE__ */ jsx47(ConnectionLogProvider, { children: /* @__PURE__ */ jsx47(Gate, { ...props }) });
31713
+ return /* @__PURE__ */ jsx46(ConnectionLogProvider, { children: /* @__PURE__ */ jsx46(Gate, { ...props }) });
31729
31714
  }
31730
31715
  function Gate({
31731
31716
  connect,
@@ -31862,9 +31847,9 @@ function Gate({
31862
31847
  gateRef.current = controller;
31863
31848
  const up = status === "connected" && !unavailable;
31864
31849
  const content2 = typeof children === "function" ? children(controller) : children;
31865
- return /* @__PURE__ */ jsx47(GateContext.Provider, { value: controller, children: /* @__PURE__ */ jsxs35("div", { className: `relative h-full w-full ${className ?? ""}`, children: [
31850
+ return /* @__PURE__ */ jsx46(GateContext.Provider, { value: controller, children: /* @__PURE__ */ jsxs35("div", { className: `relative h-full w-full ${className ?? ""}`, children: [
31866
31851
  (up || keepMounted) && content2,
31867
- /* @__PURE__ */ jsx47(
31852
+ /* @__PURE__ */ jsx46(
31868
31853
  ConnectionScreen,
31869
31854
  {
31870
31855
  status,
@@ -32455,8 +32440,8 @@ async function uploadTlsCertificate(payload) {
32455
32440
  // src/ui/components/command.tsx
32456
32441
  init_define_import_meta_env();
32457
32442
  import * as React11 from "react";
32458
- import { jsx as jsx48, jsxs as jsxs36 } from "react/jsx-runtime";
32459
- var Command = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
32443
+ import { jsx as jsx47, jsxs as jsxs36 } from "react/jsx-runtime";
32444
+ var Command = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
32460
32445
  _e,
32461
32446
  {
32462
32447
  ref,
@@ -32469,8 +32454,8 @@ var Command = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__
32469
32454
  ));
32470
32455
  Command.displayName = "Command";
32471
32456
  var CommandInput = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs36("div", { className: "flex items-center border-b border-border px-3", children: [
32472
- /* @__PURE__ */ jsx48(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
32473
- /* @__PURE__ */ jsx48(
32457
+ /* @__PURE__ */ jsx47(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
32458
+ /* @__PURE__ */ jsx47(
32474
32459
  _e.Input,
32475
32460
  {
32476
32461
  ref,
@@ -32483,7 +32468,7 @@ var CommandInput = React11.forwardRef(({ className, ...props }, ref) => /* @__PU
32483
32468
  )
32484
32469
  ] }));
32485
32470
  CommandInput.displayName = "CommandInput";
32486
- var CommandList = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
32471
+ var CommandList = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
32487
32472
  _e.List,
32488
32473
  {
32489
32474
  ref,
@@ -32495,7 +32480,7 @@ var CommandList = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
32495
32480
  }
32496
32481
  ));
32497
32482
  CommandList.displayName = "CommandList";
32498
- var CommandGroup = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
32483
+ var CommandGroup = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
32499
32484
  _e.Group,
32500
32485
  {
32501
32486
  ref,
@@ -32507,7 +32492,7 @@ var CommandGroup = React11.forwardRef(({ className, ...props }, ref) => /* @__PU
32507
32492
  }
32508
32493
  ));
32509
32494
  CommandGroup.displayName = "CommandGroup";
32510
- var CommandSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
32495
+ var CommandSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
32511
32496
  _e.Separator,
32512
32497
  {
32513
32498
  ref,
@@ -32516,7 +32501,7 @@ var CommandSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @
32516
32501
  }
32517
32502
  ));
32518
32503
  CommandSeparator.displayName = "CommandSeparator";
32519
- var CommandItem = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
32504
+ var CommandItem = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
32520
32505
  _e.Item,
32521
32506
  {
32522
32507
  ref,
@@ -32528,7 +32513,7 @@ var CommandItem = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
32528
32513
  }
32529
32514
  ));
32530
32515
  CommandItem.displayName = "CommandItem";
32531
- var CommandEmpty = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
32516
+ var CommandEmpty = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
32532
32517
  _e.Empty,
32533
32518
  {
32534
32519
  ref,
@@ -32540,7 +32525,7 @@ CommandEmpty.displayName = "CommandEmpty";
32540
32525
  var CommandShortcut = ({
32541
32526
  className,
32542
32527
  ...props
32543
- }) => /* @__PURE__ */ jsx48(
32528
+ }) => /* @__PURE__ */ jsx47(
32544
32529
  "span",
32545
32530
  {
32546
32531
  className: cn(
@@ -32556,7 +32541,7 @@ CommandShortcut.displayName = "CommandShortcut";
32556
32541
  init_define_import_meta_env();
32557
32542
  import { useState as useState20 } from "react";
32558
32543
  import { useTranslation as useTranslation20 } from "react-i18next";
32559
- import { jsx as jsx49, jsxs as jsxs37 } from "react/jsx-runtime";
32544
+ import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
32560
32545
  var FOLDER_ICON_MAP = {
32561
32546
  folder: Folder,
32562
32547
  "folder-open": FolderOpen,
@@ -32632,7 +32617,7 @@ function FolderIconEl({
32632
32617
  style
32633
32618
  }) {
32634
32619
  const Icon = FOLDER_ICON_MAP[icon ?? ""] ?? Folder;
32635
- return /* @__PURE__ */ jsx49(Icon, { className, style });
32620
+ return /* @__PURE__ */ jsx48(Icon, { className, style });
32636
32621
  }
32637
32622
  var HEX_RE = /^#([0-9a-fA-F]{6})$/;
32638
32623
  function isValidHex(value) {
@@ -32645,7 +32630,7 @@ function HexColorPicker({
32645
32630
  const safe = isValidHex(value) ? value : DEFAULT_FOLDER_COLOR;
32646
32631
  return /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-2", children: [
32647
32632
  /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2", children: [
32648
- /* @__PURE__ */ jsx49(
32633
+ /* @__PURE__ */ jsx48(
32649
32634
  "input",
32650
32635
  {
32651
32636
  type: "color",
@@ -32654,7 +32639,7 @@ function HexColorPicker({
32654
32639
  className: "h-8 w-10 shrink-0 cursor-pointer rounded-none border border-input bg-transparent p-0.5"
32655
32640
  }
32656
32641
  ),
32657
- /* @__PURE__ */ jsx49(
32642
+ /* @__PURE__ */ jsx48(
32658
32643
  Input,
32659
32644
  {
32660
32645
  value,
@@ -32665,7 +32650,7 @@ function HexColorPicker({
32665
32650
  }
32666
32651
  )
32667
32652
  ] }),
32668
- /* @__PURE__ */ jsx49("div", { className: "flex flex-wrap gap-1.5", children: SUGGESTED_FOLDER_COLORS.map((c) => /* @__PURE__ */ jsx49(
32653
+ /* @__PURE__ */ jsx48("div", { className: "flex flex-wrap gap-1.5", children: SUGGESTED_FOLDER_COLORS.map((c) => /* @__PURE__ */ jsx48(
32669
32654
  "button",
32670
32655
  {
32671
32656
  type: "button",
@@ -32689,8 +32674,8 @@ function IconPicker({
32689
32674
  ) : FOLDER_ICON_IDS;
32690
32675
  return /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-2", children: [
32691
32676
  /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2 px-2.5 h-8 bg-muted/60 border border-border/60 rounded-none", children: [
32692
- /* @__PURE__ */ jsx49(Search, { className: "size-3 text-muted-foreground/60 shrink-0" }),
32693
- /* @__PURE__ */ jsx49(
32677
+ /* @__PURE__ */ jsx48(Search, { className: "size-3 text-muted-foreground/60 shrink-0" }),
32678
+ /* @__PURE__ */ jsx48(
32694
32679
  "input",
32695
32680
  {
32696
32681
  value: query,
@@ -32700,14 +32685,14 @@ function IconPicker({
32700
32685
  }
32701
32686
  )
32702
32687
  ] }),
32703
- /* @__PURE__ */ jsx49("div", { className: "grid grid-cols-8 gap-1.5 max-h-40 overflow-y-auto pr-1", children: filtered.map((id) => /* @__PURE__ */ jsx49(
32688
+ /* @__PURE__ */ jsx48("div", { className: "grid grid-cols-8 gap-1.5 max-h-40 overflow-y-auto pr-1", children: filtered.map((id) => /* @__PURE__ */ jsx48(
32704
32689
  "button",
32705
32690
  {
32706
32691
  type: "button",
32707
32692
  onClick: () => onChange(id),
32708
32693
  title: id,
32709
32694
  className: `flex items-center justify-center h-9 border transition-colors ${value === id ? "border-accent-brand/50 bg-accent-brand/10" : "border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground"}`,
32710
- children: /* @__PURE__ */ jsx49(
32695
+ children: /* @__PURE__ */ jsx48(
32711
32696
  FolderIconEl,
32712
32697
  {
32713
32698
  icon: id,
@@ -32724,7 +32709,7 @@ function IconPicker({
32724
32709
  // src/ui/components/version-badge.tsx
32725
32710
  init_define_import_meta_env();
32726
32711
  import { useTranslation as useTranslation21 } from "react-i18next";
32727
- import { jsx as jsx50 } from "react/jsx-runtime";
32712
+ import { jsx as jsx49 } from "react/jsx-runtime";
32728
32713
  function VersionBadge({
32729
32714
  status,
32730
32715
  releaseUrl,
@@ -32740,7 +32725,7 @@ function VersionBadge({
32740
32725
  const label = status === "beta" ? t3("dashboard.beta").toUpperCase() : status === "requires_update" ? t3("dashboard.updateAvailable").toUpperCase() : t3("dashboardTab.stable");
32741
32726
  if (status === "requires_update" && releaseUrl) {
32742
32727
  const linkLabel = t3("versionCheck.updateLinkLabel");
32743
- return /* @__PURE__ */ jsx50(
32728
+ return /* @__PURE__ */ jsx49(
32744
32729
  "a",
32745
32730
  {
32746
32731
  href: releaseUrl,
@@ -32753,7 +32738,7 @@ function VersionBadge({
32753
32738
  }
32754
32739
  );
32755
32740
  }
32756
- return /* @__PURE__ */ jsx50("span", { className: badgeClassName, children: label });
32741
+ return /* @__PURE__ */ jsx49("span", { className: badgeClassName, children: label });
32757
32742
  }
32758
32743
 
32759
32744
  // src/ui/hooks/use-page-visible-interval.ts
@@ -32915,7 +32900,7 @@ function getDatabaseTransferUrl(operation, { electron, configuredServerUrl, loca
32915
32900
  const serverUrl = configuredServerUrl || `http://localhost:${localBackendPort()}`;
32916
32901
  return `${serverUrl.replace(/\/$/, "")}/database/${operation}`;
32917
32902
  }
32918
- const development = true;
32903
+ const development = location.port === "5173";
32919
32904
  if (development) {
32920
32905
  return `http://localhost:30001/database/${operation}`;
32921
32906
  }
@@ -32983,7 +32968,7 @@ async function syncThemeChoice(themeId) {
32983
32968
  init_define_import_meta_env();
32984
32969
  import { useTranslation as useTranslation22 } from "react-i18next";
32985
32970
  import { toast as toast4 } from "sonner";
32986
- import { jsx as jsx51, jsxs as jsxs38 } from "react/jsx-runtime";
32971
+ import { jsx as jsx50, jsxs as jsxs38 } from "react/jsx-runtime";
32987
32972
  var selectClass = "w-full px-2.5 py-1.5 text-xs bg-background border border-border text-foreground outline-none focus:ring-1 focus:ring-ring appearance-none pr-7";
32988
32973
  function LookSettings({ isAdmin }) {
32989
32974
  const { t: t3 } = useTranslation22();
@@ -33001,15 +32986,15 @@ function LookSettings({ isAdmin }) {
33001
32986
  onChange: (e) => void chooseLayout(e.target.value || null).catch(failed),
33002
32987
  className: selectClass,
33003
32988
  children: [
33004
- /* @__PURE__ */ jsx51("option", { value: "", children: t3("looks.followDefault") }),
33005
- layouts.map((layout) => /* @__PURE__ */ jsx51("option", { value: layout.id, children: layoutLabel(layout, t3) }, layout.id))
32989
+ /* @__PURE__ */ jsx50("option", { value: "", children: t3("looks.followDefault") }),
32990
+ layouts.map((layout) => /* @__PURE__ */ jsx50("option", { value: layout.id, children: layoutLabel(layout, t3) }, layout.id))
33006
32991
  ]
33007
32992
  }
33008
32993
  ),
33009
- /* @__PURE__ */ jsx51("p", { className: "text-[11px] text-muted-foreground", children: t3("looks.layoutHint") }),
32994
+ /* @__PURE__ */ jsx50("p", { className: "text-[11px] text-muted-foreground", children: t3("looks.layoutHint") }),
33010
32995
  isAdmin && response && /* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-1.5 border border-border p-2", children: [
33011
- /* @__PURE__ */ jsx51("span", { className: "text-[11px] font-medium text-foreground", children: t3("looks.defaultsLabel") }),
33012
- /* @__PURE__ */ jsx51("p", { className: "text-[11px] text-muted-foreground", children: t3("looks.defaultsHint") }),
32996
+ /* @__PURE__ */ jsx50("span", { className: "text-[11px] font-medium text-foreground", children: t3("looks.defaultsLabel") }),
32997
+ /* @__PURE__ */ jsx50("p", { className: "text-[11px] text-muted-foreground", children: t3("looks.defaultsHint") }),
33013
32998
  /* @__PURE__ */ jsxs38(
33014
32999
  Select2,
33015
33000
  {
@@ -33017,8 +33002,8 @@ function LookSettings({ isAdmin }) {
33017
33002
  onChange: (e) => void chooseDefaultLook({ layout: e.target.value || null }).then(() => toast4.success(t3("looks.defaultSaved"))).catch(failed),
33018
33003
  className: selectClass,
33019
33004
  children: [
33020
- /* @__PURE__ */ jsx51("option", { value: "", children: t3("looks.followDefault") }),
33021
- layouts.map((layout) => /* @__PURE__ */ jsx51("option", { value: layout.id, children: layoutLabel(layout, t3) }, layout.id))
33005
+ /* @__PURE__ */ jsx50("option", { value: "", children: t3("looks.followDefault") }),
33006
+ layouts.map((layout) => /* @__PURE__ */ jsx50("option", { value: layout.id, children: layoutLabel(layout, t3) }, layout.id))
33022
33007
  ]
33023
33008
  }
33024
33009
  ),
@@ -33029,8 +33014,8 @@ function LookSettings({ isAdmin }) {
33029
33014
  onChange: (e) => void chooseDefaultLook({ theme: e.target.value || null }).then(() => toast4.success(t3("looks.defaultSaved"))).catch(failed),
33030
33015
  className: selectClass,
33031
33016
  children: [
33032
- /* @__PURE__ */ jsx51("option", { value: "", children: t3("looks.followDefault") }),
33033
- themes.map((theme2) => /* @__PURE__ */ jsx51("option", { value: theme2.id, children: themeLabel(theme2, t3) }, theme2.id))
33017
+ /* @__PURE__ */ jsx50("option", { value: "", children: t3("looks.followDefault") }),
33018
+ themes.map((theme2) => /* @__PURE__ */ jsx50("option", { value: theme2.id, children: themeLabel(theme2, t3) }, theme2.id))
33034
33019
  ]
33035
33020
  }
33036
33021
  )
@@ -33042,7 +33027,7 @@ function LookSettings({ isAdmin }) {
33042
33027
  init_define_import_meta_env();
33043
33028
  import { useRef as useRef13, useState as useState22 } from "react";
33044
33029
  import { useTranslation as useTranslation23 } from "react-i18next";
33045
- import { jsx as jsx52, jsxs as jsxs39 } from "react/jsx-runtime";
33030
+ import { jsx as jsx51, jsxs as jsxs39 } from "react/jsx-runtime";
33046
33031
  var THEMES = [
33047
33032
  { id: SYSTEM_THEME, preview: "auto" },
33048
33033
  ...BUILTIN_THEMES.map((theme2) => ({
@@ -33074,7 +33059,7 @@ var DARK_SWATCH = BUILTIN_THEMES.find((theme2) => theme2.id === "dark").swatch;
33074
33059
  // src/ui/plugin-host/NativeView.tsx
33075
33060
  init_define_import_meta_env();
33076
33061
  import { useEffect as useEffect16, useRef as useRef14 } from "react";
33077
- import { Fragment as Fragment8, jsx as jsx53 } from "react/jsx-runtime";
33062
+ import { Fragment as Fragment8, jsx as jsx52 } from "react/jsx-runtime";
33078
33063
  function embeddedViewApi() {
33079
33064
  if (typeof window === "undefined") return null;
33080
33065
  const api = window.electronAPI?.embeddedView;
@@ -33174,29 +33159,29 @@ function NativeView({
33174
33159
  useEffect16(() => {
33175
33160
  sync.current();
33176
33161
  }, [hidden]);
33177
- if (!api) return /* @__PURE__ */ jsx53(Fragment8, { children: fallback ?? null });
33178
- return /* @__PURE__ */ jsx53("div", { ref: host, className, style });
33162
+ if (!api) return /* @__PURE__ */ jsx52(Fragment8, { children: fallback ?? null });
33163
+ return /* @__PURE__ */ jsx52("div", { ref: host, className, style });
33179
33164
  }
33180
33165
 
33181
33166
  // src/ui/shell/split/SplitLayoutMenu.tsx
33182
33167
  init_define_import_meta_env();
33183
33168
  import { useMemo as useMemo9 } from "react";
33184
33169
  import { useTranslation as useTranslation24 } from "react-i18next";
33185
- import { jsx as jsx54, jsxs as jsxs40 } from "react/jsx-runtime";
33170
+ import { jsx as jsx53, jsxs as jsxs40 } from "react/jsx-runtime";
33186
33171
  function NodeThumb({ node }) {
33187
33172
  if (node.kind === "pane") {
33188
- return /* @__PURE__ */ jsx54("div", { className: "size-full border border-current" });
33173
+ return /* @__PURE__ */ jsx53("div", { className: "size-full border border-current" });
33189
33174
  }
33190
- return /* @__PURE__ */ jsx54(
33175
+ return /* @__PURE__ */ jsx53(
33191
33176
  "div",
33192
33177
  {
33193
33178
  className: `flex size-full gap-0.5 ${node.direction === "row" ? "flex-row" : "flex-col"}`,
33194
- children: node.children.map((child, index) => /* @__PURE__ */ jsx54(
33179
+ children: node.children.map((child, index) => /* @__PURE__ */ jsx53(
33195
33180
  "div",
33196
33181
  {
33197
33182
  className: "min-w-0 min-h-0",
33198
33183
  style: { flex: `${node.sizes[index]} 1 0px` },
33199
- children: /* @__PURE__ */ jsx54(NodeThumb, { node: child })
33184
+ children: /* @__PURE__ */ jsx53(NodeThumb, { node: child })
33200
33185
  },
33201
33186
  child.id
33202
33187
  ))
@@ -33205,7 +33190,7 @@ function NodeThumb({ node }) {
33205
33190
  }
33206
33191
  function PresetThumb({ id }) {
33207
33192
  const node = useMemo9(() => buildPreset(id), [id]);
33208
- return /* @__PURE__ */ jsx54(NodeThumb, { node });
33193
+ return /* @__PURE__ */ jsx53(NodeThumb, { node });
33209
33194
  }
33210
33195
  function SplitLayoutMenu({
33211
33196
  activeIsSplit,
@@ -33216,7 +33201,7 @@ function SplitLayoutMenu({
33216
33201
  const { t: t3 } = useTranslation24();
33217
33202
  const fullTitle = canAddPane ? void 0 : t3("splitScreen.maxPanes", { count: MAX_PANES });
33218
33203
  return /* @__PURE__ */ jsxs40(DropdownMenu, { children: [
33219
- /* @__PURE__ */ jsx54(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx54(
33204
+ /* @__PURE__ */ jsx53(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx53(
33220
33205
  Button,
33221
33206
  {
33222
33207
  variant: "ghost",
@@ -33224,7 +33209,7 @@ function SplitLayoutMenu({
33224
33209
  className: `h-full w-12.5 rounded-none ${activeIsSplit ? "text-accent-brand" : "text-muted-foreground hover:text-foreground"}`,
33225
33210
  title: t3("splitScreen.title"),
33226
33211
  "aria-label": t3("splitScreen.title"),
33227
- children: /* @__PURE__ */ jsx54(LayoutPanelLeft, { className: "size-4" })
33212
+ children: /* @__PURE__ */ jsx53(LayoutPanelLeft, { className: "size-4" })
33228
33213
  }
33229
33214
  ) }),
33230
33215
  /* @__PURE__ */ jsxs40(
@@ -33241,9 +33226,9 @@ function SplitLayoutMenu({
33241
33226
  title: fullTitle,
33242
33227
  onSelect: () => onSplit("right"),
33243
33228
  children: [
33244
- /* @__PURE__ */ jsx54(Columns2, { className: "size-3.5" }),
33229
+ /* @__PURE__ */ jsx53(Columns2, { className: "size-3.5" }),
33245
33230
  t3("splitScreen.splitRight"),
33246
- /* @__PURE__ */ jsx54(DropdownMenuShortcut, { children: "Ctrl+Shift+\\" })
33231
+ /* @__PURE__ */ jsx53(DropdownMenuShortcut, { children: "Ctrl+Shift+\\" })
33247
33232
  ]
33248
33233
  }
33249
33234
  ),
@@ -33254,35 +33239,35 @@ function SplitLayoutMenu({
33254
33239
  title: fullTitle,
33255
33240
  onSelect: () => onSplit("bottom"),
33256
33241
  children: [
33257
- /* @__PURE__ */ jsx54(Rows2, { className: "size-3.5" }),
33242
+ /* @__PURE__ */ jsx53(Rows2, { className: "size-3.5" }),
33258
33243
  t3("splitScreen.splitDown"),
33259
- /* @__PURE__ */ jsx54(DropdownMenuShortcut, { children: "Ctrl+Shift+-" })
33244
+ /* @__PURE__ */ jsx53(DropdownMenuShortcut, { children: "Ctrl+Shift+-" })
33260
33245
  ]
33261
33246
  }
33262
33247
  ),
33263
- /* @__PURE__ */ jsx54(DropdownMenuSeparator, {}),
33264
- /* @__PURE__ */ jsx54(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: activeIsSplit ? t3("splitScreen.applyLayout") : t3("splitScreen.layouts") }),
33265
- /* @__PURE__ */ jsx54("div", { className: "grid grid-cols-4 gap-1 p-1", children: SPLIT_PRESETS.map((preset) => /* @__PURE__ */ jsx54(
33248
+ /* @__PURE__ */ jsx53(DropdownMenuSeparator, {}),
33249
+ /* @__PURE__ */ jsx53(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: activeIsSplit ? t3("splitScreen.applyLayout") : t3("splitScreen.layouts") }),
33250
+ /* @__PURE__ */ jsx53("div", { className: "grid grid-cols-4 gap-1 p-1", children: SPLIT_PRESETS.map((preset) => /* @__PURE__ */ jsx53(
33266
33251
  DropdownMenuItem,
33267
33252
  {
33268
33253
  className: "flex h-12 items-center justify-center p-1.5 text-muted-foreground focus:text-accent-brand",
33269
33254
  title: t3(preset.titleKey),
33270
33255
  "aria-label": t3(preset.titleKey),
33271
33256
  onSelect: () => onPreset(preset.id),
33272
- children: /* @__PURE__ */ jsx54("div", { className: "h-8 w-11", children: /* @__PURE__ */ jsx54(PresetThumb, { id: preset.id }) })
33257
+ children: /* @__PURE__ */ jsx53("div", { className: "h-8 w-11", children: /* @__PURE__ */ jsx53(PresetThumb, { id: preset.id }) })
33273
33258
  },
33274
33259
  preset.id
33275
33260
  )) }),
33276
- /* @__PURE__ */ jsx54(DropdownMenuSeparator, {}),
33277
- /* @__PURE__ */ jsx54(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.shortcuts") }),
33261
+ /* @__PURE__ */ jsx53(DropdownMenuSeparator, {}),
33262
+ /* @__PURE__ */ jsx53(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.shortcuts") }),
33278
33263
  /* @__PURE__ */ jsxs40("div", { className: "flex flex-col gap-1 px-2 pb-1.5 text-xs text-muted-foreground", children: [
33279
33264
  /* @__PURE__ */ jsxs40("div", { className: "flex items-center justify-between gap-2", children: [
33280
- /* @__PURE__ */ jsx54("span", { children: t3("splitScreen.shortcutNavigate") }),
33281
- /* @__PURE__ */ jsx54("kbd", { className: "font-mono text-[10px]", children: paneNavHotkeyLabel() })
33265
+ /* @__PURE__ */ jsx53("span", { children: t3("splitScreen.shortcutNavigate") }),
33266
+ /* @__PURE__ */ jsx53("kbd", { className: "font-mono text-[10px]", children: paneNavHotkeyLabel() })
33282
33267
  ] }),
33283
33268
  /* @__PURE__ */ jsxs40("div", { className: "flex items-center justify-between gap-2", children: [
33284
- /* @__PURE__ */ jsx54("span", { children: t3("splitScreen.zoom") }),
33285
- /* @__PURE__ */ jsx54("kbd", { className: "font-mono text-[10px]", children: "Ctrl+Shift+Enter" })
33269
+ /* @__PURE__ */ jsx53("span", { children: t3("splitScreen.zoom") }),
33270
+ /* @__PURE__ */ jsx53("kbd", { className: "font-mono text-[10px]", children: "Ctrl+Shift+Enter" })
33286
33271
  ] })
33287
33272
  ] })
33288
33273
  ]
@@ -33294,7 +33279,7 @@ function SplitLayoutMenu({
33294
33279
  // src/ui/sidebar/AuthEnrollmentSections.tsx
33295
33280
  init_define_import_meta_env();
33296
33281
  import { useTranslation as useTranslation25 } from "react-i18next";
33297
- import { jsx as jsx55, jsxs as jsxs41 } from "react/jsx-runtime";
33282
+ import { jsx as jsx54, jsxs as jsxs41 } from "react/jsx-runtime";
33298
33283
  function AuthEnrollmentSections({
33299
33284
  factorsOnly = false
33300
33285
  } = {}) {
@@ -33305,15 +33290,15 @@ function AuthEnrollmentSections({
33305
33290
  (entry) => entry.enrollment
33306
33291
  );
33307
33292
  if (sections.length === 0) return null;
33308
- return /* @__PURE__ */ jsx55("div", { className: "flex flex-col gap-4", children: sections.map((entry) => {
33293
+ return /* @__PURE__ */ jsx54("div", { className: "flex flex-col gap-4", children: sections.map((entry) => {
33309
33294
  const Enrollment = entry.enrollment;
33310
33295
  return /* @__PURE__ */ jsxs41(
33311
33296
  "div",
33312
33297
  {
33313
33298
  className: "flex flex-col gap-2",
33314
33299
  children: [
33315
- /* @__PURE__ */ jsx55("span", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3(entry.titleKey) }),
33316
- /* @__PURE__ */ jsx55(Enrollment, {})
33300
+ /* @__PURE__ */ jsx54("span", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3(entry.titleKey) }),
33301
+ /* @__PURE__ */ jsx54(Enrollment, {})
33317
33302
  ]
33318
33303
  },
33319
33304
  `${entry.pluginId}:${entry.id}`
@@ -33599,6 +33584,7 @@ export {
33599
33584
  getErrorMessage,
33600
33585
  getExternalAutoProvision,
33601
33586
  getFolderAccess,
33587
+ getFolderAuthOverride,
33602
33588
  getFolderDefaultsId,
33603
33589
  getHostAccess,
33604
33590
  getHostAuthOverride,
@@ -33740,6 +33726,7 @@ export {
33740
33726
  saveUserPreferences,
33741
33727
  setAllPluginChannels,
33742
33728
  setDeveloperMode,
33729
+ setFolderAuthOverride,
33743
33730
  setHostAuthOverride,
33744
33731
  setNotificationPrivateEndpoints,
33745
33732
  setPluginOptions,