@termix-ssh/plugin-sdk 1.0.4 → 1.0.6

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 (35) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/PLUGIN-GUIDE.md +780 -0
  3. package/README.md +2 -1
  4. package/cli/commands/build.mjs +7 -7
  5. package/cli/commands/migrations.mjs +2 -2
  6. package/cli/commands/validate.mjs +5 -0
  7. package/cli/index.mjs +0 -0
  8. package/dist/changelog.d.ts +3 -1
  9. package/dist/changelog.js +12 -2
  10. package/dist/db.d.ts +1 -1
  11. package/dist/db.js +1 -1
  12. package/dist/ddl.js +4 -1
  13. package/dist/host/{chunk-RU4E5XLY.js → chunk-26DAYAKC.js} +323 -216
  14. package/dist/host/{chunk-O2OHNVFX.js → chunk-DIOJ3KW2.js} +1 -1
  15. package/dist/host/{chunk-F5RZH6HE.js → chunk-NZG6HNQH.js} +14 -13
  16. package/dist/host/core-classes.json +1 -1
  17. package/dist/host/{linked-server-4VWYYABP.js → linked-server-QAKKDBFM.js} +1 -1
  18. package/dist/host/{rbac-api-WIJVZH3M.js → rbac-api-5267EMX7.js} +1 -1
  19. package/dist/host/testing-host.js +3 -3
  20. package/dist/host/types/src/types/credential-sidebar-preferences.d.ts +1 -1
  21. package/dist/host/types/src/types/onboarding.d.ts +1 -0
  22. package/dist/host/types/src/ui/api/plugins-api.d.ts +51 -0
  23. package/dist/host/types/src/ui/components/panel-layout.d.ts +0 -4
  24. package/dist/host/types/src/ui/hooks/use-mobile.d.ts +1 -0
  25. package/dist/host/types/src/ui/i18n/i18n.d.ts +1 -36
  26. package/dist/host/types/src/ui/i18n/languages.d.ts +13 -0
  27. package/dist/host/types/src/ui/lib/error-message.d.ts +1 -1
  28. package/dist/host/types/src/ui/lib/host-key-fingerprint.d.ts +5 -0
  29. package/dist/host/types/src/ui/lib/server-time.d.ts +5 -0
  30. package/dist/host/types/src/ui/main-axios.d.ts +5 -2
  31. package/dist/host/types/src/ui/ssh/dialogs/HostKeyVerificationDialog.d.ts +1 -1
  32. package/dist/host/ui.js +439 -69
  33. package/dist/host/{use-permissions-KIQCJ35M.js → use-permissions-2P2TP6GY.js} +1 -1
  34. package/dist/host-commands.js +1 -1
  35. package/package.json +14 -1
@@ -2,7 +2,7 @@ const __termixNoGlob = () => ({});
2
2
  import {
3
3
  hasPermission,
4
4
  usePermissions
5
- } from "./chunk-O2OHNVFX.js";
5
+ } from "./chunk-DIOJ3KW2.js";
6
6
  import {
7
7
  PRESETS,
8
8
  SYNC_CHANGED_EVENT,
@@ -39,7 +39,7 @@ import {
39
39
  usePluginStore,
40
40
  useTabTypes,
41
41
  websocketAuthProtocols
42
- } from "./chunk-F5RZH6HE.js";
42
+ } from "./chunk-NZG6HNQH.js";
43
43
  import {
44
44
  __export,
45
45
  define_import_meta_env_default
@@ -49009,7 +49009,10 @@ var docs_pages_default = {
49009
49009
  plugins: "guide/plugins",
49010
49010
  pluginCatalog: "plugins",
49011
49011
  cli: "cli",
49012
- develop: "develop"
49012
+ develop: "develop",
49013
+ communityRegistry: "develop/community-registry",
49014
+ pluginRegistries: "guide/plugins#registries",
49015
+ hostRegistry: "develop/registries"
49013
49016
  };
49014
49017
 
49015
49018
  // src/ui/lib/docs.ts
@@ -49232,7 +49235,7 @@ function withAnchor(url, anchor) {
49232
49235
  }
49233
49236
 
49234
49237
  // src/ui/components/panel-layout.tsx
49235
- import { Children as Children5, Fragment as Fragment11, useRef as useRef28 } from "react";
49238
+ import { Children as Children5, Fragment as Fragment11, isValidElement as isValidElement2, useRef as useRef28 } from "react";
49236
49239
  import { useTranslation as useTranslation3 } from "react-i18next";
49237
49240
  import { Fragment as Fragment12, jsx as jsx31, jsxs as jsxs8 } from "react/jsx-runtime";
49238
49241
  var PANEL = {
@@ -49515,11 +49518,16 @@ function ToggleButton({
49515
49518
  }
49516
49519
  );
49517
49520
  }
49521
+ function flattenFacts(children) {
49522
+ return Children5.toArray(children).flatMap(
49523
+ (child) => isValidElement2(child) && child.type === Fragment11 ? flattenFacts(child.props.children) : [child]
49524
+ );
49525
+ }
49518
49526
  function Facts({
49519
49527
  className,
49520
49528
  children
49521
49529
  }) {
49522
- const items = Children5.toArray(children).filter(Boolean);
49530
+ const items = flattenFacts(children);
49523
49531
  if (items.length === 0) return null;
49524
49532
  return /* @__PURE__ */ jsx31("span", { className: cn("flex min-w-0 items-center gap-2", className), children: items.map((child, i) => /* @__PURE__ */ jsxs8(Fragment11, { children: [
49525
49533
  i > 0 && /* @__PURE__ */ jsx31("span", { "aria-hidden": true, className: "h-3 w-px shrink-0 bg-border" }),
@@ -50473,12 +50481,8 @@ var en_default = {
50473
50481
  offline: "Offline",
50474
50482
  unknown: "Unknown",
50475
50483
  continue: "Continue",
50476
- maintenance: "Maintenance",
50477
- degraded: "Degraded",
50478
50484
  error: "Error",
50479
- warning: "Warning",
50480
50485
  unsavedChanges: "Unsaved changes",
50481
- dismiss: "Dismiss",
50482
50486
  more: "More",
50483
50487
  loading: "Loading...",
50484
50488
  host: "Host",
@@ -50488,15 +50492,7 @@ var en_default = {
50488
50492
  connect: "Connect",
50489
50493
  copied: "Copied",
50490
50494
  connecting: "Connecting...",
50491
- updateAvailable: "Update Available",
50492
- appName: "Termix",
50493
50495
  openInNewTab: "Open in New Tab",
50494
- noReleases: "No Releases",
50495
- updatesAndReleases: "Updates & Releases",
50496
- newVersionAvailable: "A new version ({{version}}) is available.",
50497
- failedToFetchUpdateInfo: "Failed to fetch update information",
50498
- preRelease: "Pre-release",
50499
- noReleasesFound: "No releases found.",
50500
50496
  cancel: "Cancel",
50501
50497
  username: "Username",
50502
50498
  login: "Login",
@@ -50511,15 +50507,10 @@ var en_default = {
50511
50507
  rename: "Rename",
50512
50508
  edit: "Edit",
50513
50509
  confirm: "Confirm",
50514
- no: "No",
50515
- or: "OR",
50516
50510
  next: "Next",
50517
50511
  previous: "Previous",
50518
50512
  refresh: "Refresh",
50519
50513
  language: "Language",
50520
- checking: "Checking...",
50521
- checkingDatabase: "Checking database connection...",
50522
- checkingAuthentication: "Checking authentication...",
50523
50514
  backendReconnected: "Server connection restored",
50524
50515
  connectionDegraded: "Server connection lost, recovering\u2026",
50525
50516
  reload: "Reload",
@@ -50528,12 +50519,6 @@ var en_default = {
50528
50519
  copyFailed: "Failed to copy to clipboard",
50529
50520
  maximize: "Maximize",
50530
50521
  restore: "Restore",
50531
- of: "of",
50532
- saved: "Saved",
50533
- deleted: "Deleted",
50534
- deleteFailed: "Failed to delete",
50535
- saveFailed: "Failed to save",
50536
- required: "Required",
50537
50522
  remove: "Remove",
50538
50523
  add: "Add",
50539
50524
  update: "Update",
@@ -50555,8 +50540,8 @@ var en_default = {
50555
50540
  skip: "Skip setup",
50556
50541
  next: "Next",
50557
50542
  finish: "Done",
50558
- pluginsTitle: "Choose your features",
50559
- pluginsIntro: "Pick the features to keep. The recommended ones cover what most people need.",
50543
+ pluginsTitle: "Choose your plugins",
50544
+ pluginsIntro: "Pick the plugins to keep. The recommended ones cover what most people need.",
50560
50545
  pluginsUpgradeNote: "Everything you use now is kept as it is. Turn off or remove what you do not need.",
50561
50546
  pluginsRemoveNote: "Plugins set to Remove are deleted from this server, with their data, when you continue. You can install any of them again at any time from the Plugins tab (this needs an internet connection). Pick Off to keep a plugin installed but turned off.",
50562
50547
  pluginsUseRecommended: "Recommended",
@@ -50590,22 +50575,45 @@ var en_default = {
50590
50575
  desktopLinked: "Linked to {{server}}",
50591
50576
  pluginsDocsLink: "Read about each one"
50592
50577
  },
50578
+ desktopUpdates: {
50579
+ title: "Desktop app",
50580
+ mode: "Updates",
50581
+ modeHint: "How this app gets new versions.",
50582
+ manualModeHint: "This copy can not update itself, so Termix only tells you when a new version is out.",
50583
+ modeAutomatic: "Automatic",
50584
+ modePrompt: "Ask first",
50585
+ modeNever: "Never",
50586
+ automaticBody: "Download new versions in the background and install them when you restart.",
50587
+ promptBody: "Tell me when a new version is out and let me choose when to download it.",
50588
+ neverBody: "Do not check for updates. You can still check by hand in Settings.",
50589
+ onboardingTitle: "App updates",
50590
+ onboardingBody: "The desktop app can now update itself. Pick how you want new versions to arrive. You can change this later in Settings, Updates.",
50591
+ onboardingManual: "This copy of the app was installed in a way that can not update itself, so Termix will tell you when a new version is out with a link to download it.",
50592
+ status: "Version {{version}}",
50593
+ statusIdle: "Not checked yet",
50594
+ statusChecking: "Checking for updates",
50595
+ statusAvailable: "Version {{version}} is available",
50596
+ statusDownloading: "Downloading {{version}} ({{progress}}%)",
50597
+ statusReady: "Version {{version}} is ready. Restart to install it.",
50598
+ statusUpToDate: "You have the newest version",
50599
+ statusError: "Could not check for updates. Try again later.",
50600
+ checkNow: "Check now",
50601
+ download: "Download",
50602
+ restart: "Restart now",
50603
+ later: "Later",
50604
+ available: "Termix {{version}} is available",
50605
+ manualHint: "Download it from the release page and install it over this one.",
50606
+ ready: "Termix {{version}} is ready to install",
50607
+ readyHint: "It installs the next time Termix restarts."
50608
+ },
50593
50609
  nav: {
50594
50610
  home: "Home",
50595
50611
  terminal: "Terminal",
50596
- fileManager: "File Manager",
50597
- serverStats: "Host Metrics",
50598
- admin: "Admin",
50599
- userProfile: "User Profile",
50600
- confirmClose: "Close this active session?",
50601
50612
  close: "Close",
50602
- cancel: "Cancel",
50603
- sshManager: "SSH Manager",
50604
50613
  hostTabTitle: "{{username}}@{{ip}}:{{port}}",
50605
50614
  copyPassword: "Copy Password",
50606
50615
  copySudoPassword: "Copy Sudo Password",
50607
50616
  passwordCopied: "Password copied to clipboard",
50608
- noPasswordAvailable: "No password available",
50609
50617
  failedToCopyPassword: "Failed to copy password",
50610
50618
  refreshTab: "Refresh connection",
50611
50619
  renameTab: "Rename tab",
@@ -50616,13 +50624,7 @@ var en_default = {
50616
50624
  openInRightDock: "Open in right dock",
50617
50625
  closeRightDock: "Close right dock",
50618
50626
  toggleRightDock: "Toggle right dock",
50619
- multiPanelHintTitle: "Work with more than one panel",
50620
- multiPanelHintBody: "Keep this panel open while the sidebar is used for something else. Two ways to move it:",
50621
- multiPanelHintTabHow: "Ctrl+click its rail icon, or use the button in this header.",
50622
- multiPanelHintDockHow: "Right-click its rail icon, or use the panel icon in the tab bar.",
50623
- sidebarSettings: "Sidebar Settings...",
50624
50627
  hosts: "Hosts",
50625
- hostManager: "Host Manager",
50626
50628
  credentials: "Credentials",
50627
50629
  connections: "Connections",
50628
50630
  keepSideMenuOpen: "Keep Menu Open",
@@ -50651,7 +50653,8 @@ var en_default = {
50651
50653
  },
50652
50654
  searchEverything: "Search hosts, tabs and actions",
50653
50655
  search: "Search",
50654
- hiddenCount: "{{count}} hidden",
50656
+ hiddenCount_one: "{{count}} hidden",
50657
+ hiddenCount_other: "{{count}} hidden",
50655
50658
  showInRail: "Show in sidebar",
50656
50659
  moveUp: "Move up",
50657
50660
  moveDown: "Move down",
@@ -50715,7 +50718,8 @@ var en_default = {
50715
50718
  unsavedChangesDescription: "Your host changes have not been saved. Discard them?",
50716
50719
  keepEditing: "Keep editing",
50717
50720
  discardChanges: "Discard changes",
50718
- movedToFolder: 'Moved {{count}} host(s) to "{{folder}}"',
50721
+ movedToFolder_one: 'Moved {{count}} host to "{{folder}}"',
50722
+ movedToFolder_other: 'Moved {{count}} hosts to "{{folder}}"',
50719
50723
  editHostTooltip: "Edit host",
50720
50724
  behavior: "Behavior",
50721
50725
  scrollbackBuffer: "Scrollback Buffer",
@@ -50916,7 +50920,8 @@ var en_default = {
50916
50920
  collapseSubHosts: "Collapse sub-hosts",
50917
50921
  expandSubHosts: "Expand sub-hosts",
50918
50922
  cannotNestUnderDescendant: "Can't nest a host under its own sub-host",
50919
- movedToParent: 'Moved {{count}} host(s) under "{{parent}}"',
50923
+ movedToParent_one: 'Moved {{count}} host under "{{parent}}"',
50924
+ movedToParent_other: 'Moved {{count}} hosts under "{{parent}}"',
50920
50925
  newFolder: "New folder",
50921
50926
  createFolderTitle: "Create folder",
50922
50927
  editFolderTitle: "Edit folder",
@@ -50944,7 +50949,8 @@ var en_default = {
50944
50949
  folderSaved: "Folder saved",
50945
50950
  failedToSaveFolder: "Failed to save folder",
50946
50951
  folderDeleted: 'Deleted folder "{{name}}"',
50947
- deleteFolderConfirm: 'Delete "{{name}}" and its {{count}} host(s)? This cannot be undone.',
50952
+ deleteFolderConfirm_one: 'Delete "{{name}}" and its {{count}} host? This cannot be undone.',
50953
+ deleteFolderConfirm_other: 'Delete "{{name}}" and its {{count}} hosts? This cannot be undone.',
50948
50954
  failedToMoveHosts: "Failed to move hosts",
50949
50955
  failedToReorder: "Failed to reorder",
50950
50956
  expandAll: "Expand all folders",
@@ -50994,8 +51000,8 @@ var en_default = {
50994
51000
  showPinIconDesc: "Show a pin next to pinned hosts.",
50995
51001
  showSharedBadge: "Shared badge",
50996
51002
  showSharedBadgeDesc: "Show a badge on hosts shared with you.",
50997
- showBadges: "Feature badges",
50998
- showBadgesDesc: "Show badges that features add next to the host name.",
51003
+ showBadges: "Plugin badges",
51004
+ showBadgesDesc: "Show badges that plugins add next to the host name.",
50999
51005
  hostClickBehavior: "Clicking a host",
51000
51006
  hostClickBehaviorDesc: 'What happens when you click a host that already has an open tab. Ctrl/Cmd click, middle click, or "Open in new tab" always start a new one.',
51001
51007
  hostClickNewTab: "Always open a new tab",
@@ -51012,7 +51018,8 @@ var en_default = {
51012
51018
  copyLink: "Copy Link",
51013
51019
  deleteCredentialConfirm: 'Delete credential "{{name}}"?',
51014
51020
  deletedCredential: "Deleted {{name}}",
51015
- deleteHostsConfirm: "Delete {{count}} host{{plural}}? This cannot be undone.",
51021
+ deleteHostsConfirm_one: "Delete {{count}} host? This cannot be undone.",
51022
+ deleteHostsConfirm_other: "Delete {{count}} hosts? This cannot be undone.",
51016
51023
  movedToRoot: "Moved to root",
51017
51024
  addTagsPlaceholder: "Add tags...",
51018
51025
  authDetails: "Authentication Details",
@@ -51068,10 +51075,11 @@ var en_default = {
51068
51075
  groupTags: "Tags & pin",
51069
51076
  groupProxy: "Proxy",
51070
51077
  groupJumpHosts: "Jump hosts",
51071
- groupFeatureFlags: "Feature flags",
51078
+ groupFeatureFlags: "Plugin settings",
51072
51079
  groupAdvanced: "Advanced config",
51073
51080
  preview: "Preview",
51074
- moreHosts: "... {{count}} more hosts",
51081
+ moreHosts_one: "... {{count}} more host",
51082
+ moreHosts_other: "... {{count}} more hosts",
51075
51083
  summary: "{{selected}} of {{total}} hosts",
51076
51084
  credentialsIncluded: "credentials included",
51077
51085
  credentialsExcluded: "credentials excluded",
@@ -51084,16 +51092,20 @@ var en_default = {
51084
51092
  sampleDownloaded: "Sample file downloaded",
51085
51093
  failedToDeleteCredential2: "Failed to delete credential",
51086
51094
  noFolderOption: "(No folder)",
51087
- nSelected: "{{count}} selected",
51088
- featuresMenu: "Features",
51095
+ nSelected_one: "{{count}} selected",
51096
+ nSelected_other: "{{count}} selected",
51097
+ featuresMenu: "Plugins",
51089
51098
  moveMenu: "Move",
51090
51099
  connectSelected: "Connect",
51091
51100
  cancelSelection: "Cancel",
51092
- deletedCount: "Deleted {{count}} hosts",
51093
- failedToDeleteCount: "Failed to delete {{count}} hosts",
51101
+ deletedCount_one: "Deleted {{count}} host",
51102
+ deletedCount_other: "Deleted {{count}} hosts",
51103
+ failedToDeleteCount_one: "Failed to delete {{count}} host",
51104
+ failedToDeleteCount_other: "Failed to delete {{count}} hosts",
51094
51105
  duplicatedHost: 'Duplicated "{{name}}"',
51095
51106
  failedToDuplicateHost: "Failed to duplicate host",
51096
- updatedCount: "Updated {{count}} hosts",
51107
+ updatedCount_one: "Updated {{count}} host",
51108
+ updatedCount_other: "Updated {{count}} hosts",
51097
51109
  friendlyNameLabel: "Friendly Name",
51098
51110
  descriptionLabel: "Description",
51099
51111
  loadingHosts: "Loading hosts...",
@@ -51101,6 +51113,7 @@ var en_default = {
51101
51113
  noHostsYet: "No hosts yet",
51102
51114
  noHostsYetHint: "Add a server to open terminals, browse files and see metrics.",
51103
51115
  noHostsMatchSearch: "No hosts match your search",
51116
+ noHostSelected: "Pick a host to open this.",
51104
51117
  searchHosts: "Search hosts...",
51105
51118
  sortHosts: "Sort Hosts",
51106
51119
  sortDefault: "Default Order",
@@ -51132,7 +51145,8 @@ var en_default = {
51132
51145
  shareHostTitle: "Share: {{name}}",
51133
51146
  shareFolder: "Share Folder",
51134
51147
  shareFolderTitle: "Share folder: {{name}}",
51135
- folderSharedSuccessfully: "Shared {{count}} host(s) in folder",
51148
+ folderSharedSuccessfully_one: "Shared {{count}} host in folder",
51149
+ folderSharedSuccessfully_other: "Shared {{count}} hosts in folder",
51136
51150
  failedToShareFolder: "Failed to share folder",
51137
51151
  sharing: {
51138
51152
  loadError: "Failed to load sharing data. Please try again.",
@@ -51226,12 +51240,12 @@ var en_default = {
51226
51240
  authFieldsAfterSave: "Save the host first, then fill in these fields.",
51227
51241
  enablePluginFeature: "Enable {{name}}",
51228
51242
  disablePluginFeature: "Disable {{name}}",
51229
- filterFeaturesGroup: "Features",
51243
+ filterFeaturesGroup: "Plugins",
51230
51244
  localOnly: "Keep on this device only",
51231
51245
  localOnlyDesc: "This host is not sent to the server and does not appear on your other devices.",
51232
51246
  folderLocalOnly: "Keep on this device only",
51233
51247
  folderLocalOnlyDesc: "This folder and every host in it stay on this device and are not sent to the server.",
51234
- sudoPasswordDesc: "Used when the terminal fills a sudo prompt, and by features that run commands with sudo.",
51248
+ sudoPasswordDesc: "Used when the terminal fills a sudo prompt, and by plugins that run commands with sudo.",
51235
51249
  editorCancel: "Cancel",
51236
51250
  editorSaving: "Saving...",
51237
51251
  editorUpdate: "Update Host",
@@ -51248,23 +51262,15 @@ var en_default = {
51248
51262
  quickActions: "Quick Actions",
51249
51263
  navigation: "Navigation",
51250
51264
  orShortcut: "or",
51251
- hostManager: "Host Manager",
51252
- hostManagerDesc: "Manage, add, or edit hosts",
51253
51265
  addNewHost: "Add New Host",
51254
- addNewHostDesc: "Register a new host",
51255
51266
  adminSettings: "Admin Settings",
51256
- adminSettingsDesc: "Configure system preferences and users",
51257
- userProfile: "User Profile",
51258
- userProfileDesc: "Manage your account and preferences",
51259
51267
  addCredential: "Add Credential",
51260
- addCredentialDesc: "Store SSH keys or passwords",
51261
51268
  recentActivity: "Recent Activity",
51262
51269
  serversAndHosts: "Servers & Hosts",
51263
51270
  noHostsFound: 'No hosts found matching "{{search}}"',
51264
51271
  links: "Links",
51265
51272
  navigate: "Navigate",
51266
51273
  select: "Select",
51267
- toggleWith: "Toggle with",
51268
51274
  pluginActions: "More actions",
51269
51275
  noTargetTab: "No terminal tab is open",
51270
51276
  documentation: "Documentation"
@@ -51299,8 +51305,8 @@ var en_default = {
51299
51305
  unsplit: "Unsplit",
51300
51306
  layouts: "Layouts",
51301
51307
  applyLayout: "Change layout",
51302
- newSplit: "New split",
51303
- maxPanes: "A split can hold up to {{count}} panes",
51308
+ maxPanes_one: "A split can hold up to {{count}} pane",
51309
+ maxPanes_other: "A split can hold up to {{count}} panes",
51304
51310
  dropSplit: "Drop to split",
51305
51311
  dropHere: "Drop to show here",
51306
51312
  paneActions: "Pane actions",
@@ -51326,16 +51332,10 @@ var en_default = {
51326
51332
  connectedFor: "Connected for {{duration}}",
51327
51333
  connected: "Connected",
51328
51334
  disconnected: "Disconnected",
51329
- closeTab: "Close tab",
51330
- closeConnection: "Close connection",
51331
- forgetTab: "Forget",
51332
- removeBackground: "Remove",
51333
51335
  reconnect: "Reconnect",
51334
- reopenTab: "Reopen",
51335
51336
  sectionOpen: "Open",
51336
51337
  sectionBackground: "Background",
51337
51338
  backgroundDesc: "Sessions persist for {{minutes}} minutes after disconnect and can be reconnected.",
51338
- persisted: "Persisted in background",
51339
51339
  expiresIn: "Expires in {{duration}}",
51340
51340
  search: "Search connections...",
51341
51341
  noSearchResults: "No connections match your search",
@@ -51375,7 +51375,7 @@ var en_default = {
51375
51375
  empty: "No cards. Use Add below to place cards."
51376
51376
  },
51377
51377
  auth: {
51378
- tagline: "Self-hosted, plugin-based server management",
51378
+ tagline: "Self-hosted, plugin-based server management.",
51379
51379
  loginTitle: "Welcome back",
51380
51380
  registerTitle: "Create Account",
51381
51381
  forgotPassword: "Forgot Password?",
@@ -51397,36 +51397,22 @@ var en_default = {
51397
51397
  sshKeyPasswordDescription: "If your SSH key is encrypted, enter the passphrase here.",
51398
51398
  passphraseRequired: "Passphrase Required",
51399
51399
  passphraseRequiredDescription: "The SSH key is encrypted. Please enter the passphrase to unlock it.",
51400
- back: "Back",
51401
- firstUser: "First User",
51402
- firstUserMessage: "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.",
51403
51400
  external: "External",
51404
51401
  loginWithExternal: "Login with External Provider",
51405
51402
  loginWithExternalDesc: "Login using your configured external identity provider",
51406
- externalNotSupportedInElectron: "External sign-in is not supported in the desktop app yet. Please use the web version.",
51407
51403
  loginWithProvider: "Login with {{name}}",
51408
- orContinueWith: "or continue with",
51409
51404
  resetPasswordButton: "Reset Password",
51410
51405
  sendResetCode: "Send Reset Code",
51411
51406
  resetCodeDesc: "Enter your username to receive a password reset code. The code will be logged in the docker container logs.",
51412
51407
  resetCode: "Reset Code",
51413
51408
  verifyCodeButton: "Verify Code",
51414
- enterResetCode: "Enter the 6-digit code from the docker container logs for user:",
51415
51409
  newPassword: "New Password",
51416
51410
  confirmNewPassword: "Confirm Password",
51417
- enterNewPassword: "Enter your new password for user:",
51418
51411
  signUp: "Sign Up",
51419
- desktopApp: "Desktop App",
51420
- loggingInToDesktopApp: "Logging in to the desktop app",
51421
51412
  loadingServer: "Loading server...",
51422
- dataLossWarning: "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.",
51423
- authenticationDisabled: "Authentication Disabled",
51424
- authenticationDisabledDesc: "All authentication methods are currently disabled. Please contact your administrator.",
51425
- passwordLoginDisabledDesc: "Password login is disabled. Use a passkey or an external authentication provider.",
51426
- attemptsRemaining: "{{count}} attempts remaining",
51427
- confirmResetDataWipe: "This account has not logged in since the encryption upgrade, so its stored data cannot be recovered without the old password. Resetting will permanently delete its hosts, credentials and snippets. Continue?",
51428
51413
  password: "Password",
51429
51414
  secondFactorUnavailable: "Your account uses a second factor that is not available right now. Contact an admin to reset it.",
51415
+ externalLoginRequired: "This account signs in through single sign-on. Use that button to sign in.",
51430
51416
  secondFactorNoUI: "This second factor cannot be shown on this screen. Contact an admin.",
51431
51417
  serverAuthentication: "Server sign-in",
51432
51418
  minChars: "min. {{min}} characters",
@@ -51456,6 +51442,8 @@ var en_default = {
51456
51442
  databaseConnection: "Could not connect to the database",
51457
51443
  embeddedServerFailed: "Termix's local server could not start",
51458
51444
  unknownError: "Unknown error",
51445
+ syncedHostMissing: "The synced host does not exist on the linked server",
51446
+ linkedServerUnreachable: "The linked server is not reachable",
51459
51447
  loginFailed: "Login failed",
51460
51448
  failedPasswordReset: "Failed to initiate password reset",
51461
51449
  failedVerifyCode: "Failed to verify reset code",
@@ -51469,19 +51457,14 @@ var en_default = {
51469
51457
  requiredField: "This field is required",
51470
51458
  minLength: "Minimum length is {{min}}",
51471
51459
  passwordMismatch: "Passwords do not match",
51472
- passwordLoginDisabled: "Username/password login is currently disabled",
51473
51460
  sessionExpired: "Session expired - please log in again",
51474
- totpRateLimited: "Rate limited: Too many TOTP verification attempts. Please try again later.",
51475
- totpRateLimitedWithTime: "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.",
51476
- resetCodeRateLimited: "Rate limited: Too many verification attempts. Please try again later.",
51477
- resetCodeRateLimitedWithTime: "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.",
51478
51461
  authTokenSaveFailed: "Failed to save authentication token",
51479
51462
  authTokenMissing: "The server did not return a new authentication token. Please sign in again.",
51480
51463
  failedToLoadServer: "Failed to load server",
51481
51464
  sessionExpiredLogin: "Session expired. Please log in again."
51482
51465
  },
51483
51466
  messages: {
51484
- registrationDisabled: "New account registration is currently disabled by an admin. Please log in or contact an administrator.",
51467
+ registrationDisabled: "You have no Termix account yet. Ask an admin to turn on Auto-create external accounts.",
51485
51468
  userNotAllowed: "Your account is not authorized to register. Please contact an administrator.",
51486
51469
  databaseConnectionFailed: "Failed to connect to the database server",
51487
51470
  embeddedServerPortInUse: "Port {{port}} is already in use by another program. This is usually a Termix Docker container or a leftover Termix process from a previous session. Close it, then restart Termix.",
@@ -51494,7 +51477,6 @@ var en_default = {
51494
51477
  registrationSuccess: "Registration successful"
51495
51478
  },
51496
51479
  placeholders: {
51497
- language: "Language",
51498
51480
  keyPassword: "key password",
51499
51481
  pastePrivateKey: "Paste your private key here...",
51500
51482
  enterPassword: "Enter your password",
@@ -51507,7 +51489,6 @@ var en_default = {
51507
51489
  },
51508
51490
  dashboard: {
51509
51491
  title: "Dashboard",
51510
- loading: "Loading dashboard...",
51511
51492
  github: "GitHub",
51512
51493
  reportBug: "Report a bug",
51513
51494
  discord: "Discord",
@@ -51515,7 +51496,6 @@ var en_default = {
51515
51496
  donate: "Donate",
51516
51497
  serverOverview: "Server Overview",
51517
51498
  version: "Version",
51518
- upToDate: "Up to Date",
51519
51499
  updateAvailable: "Update Available",
51520
51500
  beta: "Beta",
51521
51501
  uptime: "Uptime",
@@ -51526,7 +51506,6 @@ var en_default = {
51526
51506
  totalCredentials: "Total Credentials",
51527
51507
  recentActivity: "Recent Activity",
51528
51508
  reset: "Reset",
51529
- loadingRecentActivity: "Loading recent activity...",
51530
51509
  noRecentActivity: "No recent activity",
51531
51510
  quickActions: "Quick Actions",
51532
51511
  addHost: "Add Host",
@@ -51534,48 +51513,21 @@ var en_default = {
51534
51513
  adminSettings: "Admin Settings",
51535
51514
  userProfile: "User Profile",
51536
51515
  serverStats: "Server Stats",
51537
- loadingServerStats: "Loading server stats...",
51538
- noServerData: "No server data available",
51539
51516
  customizeLayout: "Customize Dashboard",
51540
- dashboardSettings: "Dashboard Settings",
51541
- enableDisableCards: "Enable/Disable Cards",
51542
- resetLayout: "Reset to Default",
51543
- serverOverviewCard: "Server Overview",
51544
- recentActivityCard: "Recent Activity",
51545
- quickActionsCard: "Quick Actions",
51546
- serverStatsCard: "Server Stats",
51547
- panelMain: "Main",
51548
- panelSide: "Side",
51549
- justNow: "just now",
51550
- activityFileManager: "File manager"
51551
- },
51552
- donation: {
51553
- title: "Enjoying Termix?",
51554
- body: "Termix is free and open source, built and maintained by a two-person team in our spare time. If it's replaced a commercial tool you'd otherwise be paying for, a donation helps cover hosting costs and keeps development going. As of now, donations are crypto only.",
51555
- milestones: "Donations also help fund the time to research and learn what's needed to build features like SAML and Kubernetes support. See the progress on the donate page.",
51556
- cta: "Donate",
51557
- dismiss: "Maybe later"
51517
+ justNow: "just now"
51558
51518
  },
51559
51519
  dashboardTab: {
51560
51520
  stable: "STABLE",
51561
- hostsOnline: "Hosts Online",
51562
51521
  registerNewServer: "Register a new server",
51563
51522
  storeSshKeysOrPasswords: "Store SSH keys or passwords",
51564
51523
  manageUsersAndRoles: "Manage users and roles",
51565
51524
  manageYourAccount: "Manage your account",
51566
51525
  hostStatus: "Host Status",
51567
51526
  noHostsConfigured: "No hosts configured",
51568
- online: "ONLINE",
51569
- offline: "OFFLINE",
51570
51527
  checking: "CHECKING",
51571
- onlineLower: "Online",
51572
- add: "Add:",
51573
51528
  commandPalette: "Command Palette",
51574
51529
  done: "Done",
51575
- editModeInstructions: "Drag cards to reorder. Drag the column divider to resize columns. Drag the bottom edge of a card to change its height. Use the trash button to remove a card.",
51576
- empty: "Empty",
51577
51530
  clear: "Clear",
51578
- viewServerDetails: "View server details",
51579
51531
  dragToResizeColumns: "Drag to resize columns",
51580
51532
  hostsAvailable: "Hosts Available",
51581
51533
  removeSection: "Remove section",
@@ -51651,7 +51603,7 @@ var en_default = {
51651
51603
  allowPasswordLogin: "Allow Password Login",
51652
51604
  allowPasswordLoginDesc: "Username/password login",
51653
51605
  externalAutoProvision: "Auto-create external accounts",
51654
- externalAutoProvisionDesc: "Create an account the first time someone signs in through an external login such as SSO or LDAP, even when registration is off",
51606
+ externalAutoProvisionDesc: "Create an account the first time someone signs in through an external login such as SSO or LDAP. When off, only people who already have an account can sign in that way",
51655
51607
  secondFactorAfterExternalLogin: "Ask for a second factor after external logins (SSO, GitHub, Google, LDAP)",
51656
51608
  secondFactorAfterExternalLoginDesc: "Off, an enrolled second factor is only asked for after password and other local logins, same as before. On, it is asked for after every login method, including SSO and LDAP.",
51657
51609
  allowPasswordReset: "Allow Password Reset",
@@ -51670,7 +51622,8 @@ var en_default = {
51670
51622
  statusCheck: "Status Check",
51671
51623
  sec: "sec",
51672
51624
  logLevel: "Log Level",
51673
- usersCount: "{{count}} users",
51625
+ usersCount_one: "{{count}} user",
51626
+ usersCount_other: "{{count}} users",
51674
51627
  searchUsers: "Search users...",
51675
51628
  noUsers: "No users",
51676
51629
  noUsersMatch: "No users match your search",
@@ -51680,7 +51633,8 @@ var en_default = {
51680
51633
  roleName: "Name",
51681
51634
  roleDisplayName: "Display Name",
51682
51635
  roleDescription: "Description",
51683
- rolesCount: "{{count}} roles",
51636
+ rolesCount_one: "{{count}} role",
51637
+ rolesCount_other: "{{count}} roles",
51684
51638
  createRole: "Create",
51685
51639
  creating: "Creating...",
51686
51640
  exportDatabase: "Export Database",
@@ -51694,7 +51648,8 @@ var en_default = {
51694
51648
  changeFile: "Change",
51695
51649
  import: "Import",
51696
51650
  importing: "Importing...",
51697
- apiKeysCount: "{{count}} keys",
51651
+ apiKeysCount_one: "{{count}} key",
51652
+ apiKeysCount_other: "{{count}} keys",
51698
51653
  apiKeysDocsLink: "View docs",
51699
51654
  apiKeysCliHint: "Use an API key with the Termix CLI to manage servers from your terminal.",
51700
51655
  apiKeysCliLink: "View CLI docs",
@@ -51716,7 +51671,8 @@ var en_default = {
51716
51671
  systemBadge: "SYS",
51717
51672
  customBadge: "CUSTOM",
51718
51673
  youBadge: "YOU",
51719
- sessionsActive: "{{count}} active",
51674
+ sessionsActive_one: "{{count}} active",
51675
+ sessionsActive_other: "{{count}} active",
51720
51676
  sessionActive: "Active: {{time}}",
51721
51677
  sessionExpires: "Exp: {{time}}",
51722
51678
  revokeAll: "All",
@@ -51727,7 +51683,6 @@ var en_default = {
51727
51683
  noCustomRoles: "No custom roles defined",
51728
51684
  removeRoleFailed: "Failed to remove role",
51729
51685
  assignRoleFailed: "Failed to assign role",
51730
- deleteRoleFailed: "Failed to delete role",
51731
51686
  userAdminAccess: "Administrator",
51732
51687
  userAdminAccessDesc: "Full access to all admin settings",
51733
51688
  userRoles: "Roles",
@@ -51750,7 +51705,6 @@ var en_default = {
51750
51705
  createUserPassword: "Password",
51751
51706
  createUserPasswordHint: "Minimum 6 characters.",
51752
51707
  createUserEnterUsername: "Enter username",
51753
- createUserEnterPassword: "Enter password",
51754
51708
  createUserSubmit: "Create User",
51755
51709
  editUserTitle: "Manage User: {{username}}",
51756
51710
  editUserDesc: "Edit roles, admin status, sessions, and account settings.",
@@ -51781,7 +51735,6 @@ var en_default = {
51781
51735
  unlinkAccountInProgress: "Unlinking...",
51782
51736
  unlinkAccountSuccess: "External sign-in unlinked",
51783
51737
  unlinkAccountFailed: "Failed to unlink external sign-in",
51784
- saving: "Saving...",
51785
51738
  updateRegistrationFailed: "Failed to update registration setting",
51786
51739
  updatePasswordLoginFailed: "Failed to update password login setting",
51787
51740
  updateSecondFactorAfterExternalLoginFailed: "Failed to update second factor setting",
@@ -51828,14 +51781,16 @@ var en_default = {
51828
51781
  exportUserDataDesc: "Download this user's hosts, credentials and file manager data as JSON. Secrets are decrypted.",
51829
51782
  exportUserDataSuccess: "User data exported",
51830
51783
  exportUserDataFailed: "Failed to export user data",
51831
- hostsCount: "{{count}} hosts",
51784
+ hostsCount_one: "{{count}} host",
51785
+ hostsCount_other: "{{count}} hosts",
51832
51786
  addHostForUser: "Add Host",
51833
51787
  noHostsForUser: "This user has no hosts",
51834
51788
  connectToHost: "Connect",
51835
51789
  deleteHostConfirm: 'Delete host "{{name}}" belonging to {{username}}?',
51836
51790
  hostDeletedSuccess: "Host deleted",
51837
51791
  hostDeleteFailed: "Failed to delete host",
51838
- credentialsCount: "{{count}} credentials",
51792
+ credentialsCount_one: "{{count}} credential",
51793
+ credentialsCount_other: "{{count}} credentials",
51839
51794
  addCredentialForUser: "Add Credential",
51840
51795
  noCredentialsForUser: "This user has no credentials",
51841
51796
  deleteCredentialConfirm: 'Delete credential "{{name}}" belonging to {{username}}?',
@@ -51863,16 +51818,16 @@ var en_default = {
51863
51818
  importFailed: "Import failed: {{error}}",
51864
51819
  importError: "Database import failed",
51865
51820
  sectionHostDefaults: "Host Defaults",
51866
- minutes: "minutes",
51867
51821
  rolePermissions: {
51868
- count: "{{count}} permissions",
51822
+ count_one: "{{count}} permission",
51823
+ count_other: "{{count}} permissions",
51869
51824
  editAction: "Edit permissions",
51870
51825
  loadError: "Failed to load the permissions catalog",
51871
51826
  saved: "Role permissions saved",
51872
51827
  saveError: "Failed to save role permissions",
51873
51828
  save: "Save",
51874
51829
  saving: "Saving...",
51875
- pluginDisabled: "Feature disabled",
51830
+ pluginDisabled: "Plugin disabled",
51876
51831
  groups: {
51877
51832
  hosts: "Hosts",
51878
51833
  credentials: "Credentials",
@@ -51915,7 +51870,6 @@ var en_default = {
51915
51870
  hostLabel: "Host",
51916
51871
  hostPlaceholder: "192.168.1.1 or example.com",
51917
51872
  portLabel: "Port",
51918
- portPlaceholder: "22",
51919
51873
  usernameLabel: "Username",
51920
51874
  usernamePlaceholder: "username",
51921
51875
  authLabel: "Auth",
@@ -51933,7 +51887,6 @@ var en_default = {
51933
51887
  noTarget: "Nothing installed can connect to this host type"
51934
51888
  },
51935
51889
  keybindings: {
51936
- title: "Keyboard Shortcuts",
51937
51890
  description: "Bind keys to actions in the terminal and the app, or change the built-in shortcuts.",
51938
51891
  defaultsHeading: "Built-in Shortcuts",
51939
51892
  fixedHeading: "App Shortcuts",
@@ -51959,7 +51912,6 @@ var en_default = {
51959
51912
  customize: "Customize",
51960
51913
  resetToDefault: "Reset to default",
51961
51914
  resetAllToDefaults: "Reset all to defaults",
51962
- close: "Close",
51963
51915
  cancel: "Cancel",
51964
51916
  saveBinding: "Save Shortcut",
51965
51917
  saveError: "Failed to save keyboard shortcuts",
@@ -52030,7 +51982,6 @@ var en_default = {
52030
51982
  cliLearnMore: "Learn More",
52031
51983
  deleteAccount: "Delete Account",
52032
51984
  deleteAccountDescription: "Permanently delete your account",
52033
- changeServerDescription: "Switch to a different Termix backend server",
52034
51985
  deleteButton: "Delete",
52035
51986
  deleteAccountPermanent: "This action is permanent and cannot be undone.",
52036
51987
  deleteAccountWarning: "All sessions, hosts, credentials, and settings will be permanently deleted.",
@@ -52044,8 +51995,6 @@ var en_default = {
52044
51995
  keyboardShortcuts: "Keyboard Shortcuts",
52045
51996
  keyboardShortcutsDescription: "Customize terminal copy, paste, and command shortcuts",
52046
51997
  manageShortcuts: "Manage",
52047
- historyTracking: "History Tracking",
52048
- historyTrackingDesc: "Track terminal commands",
52049
51998
  commandPalette: "Command Palette",
52050
51999
  commandPaletteDesc: "Enable keyboard shortcut",
52051
52000
  reopenTabsOnLogin: "Reopen Tabs on Login",
@@ -52058,28 +52007,16 @@ var en_default = {
52058
52007
  sidebarSettingsMoved: "Host sidebar display settings have moved to the Customize sidebar panel, opened from the Hosts toolbar.",
52059
52008
  showHostTags: "Show Host Tags",
52060
52009
  showHostTagsDesc: "Display tags in host list",
52061
- hostTrayOnClick: "Click to Expand Host Actions",
52062
- hostTrayOnClickDesc: "Always show connection buttons; click to expand management options instead of hover",
52063
- compactHostView: "Compact Host View",
52064
- compactHostViewDesc: "Collapse each host to a single line showing only its name and address",
52065
52010
  statusColors: "Real Status Colors",
52066
52011
  statusColorsDesc: "Use green/red for online/offline status instead of the accent color",
52067
52012
  pinAppRail: "Pin App Rail",
52068
52013
  pinAppRailDesc: "Keep the left sidebar app rail always expanded instead of expanding on hover",
52069
- openFullscreenSettings: "Open settings full screen",
52070
- exitFullscreenSettings: "Exit full-screen settings",
52071
52014
  expandAppRailOnHover: "Expand App Rail on Hover",
52072
52015
  expandAppRailOnHoverDesc: "Allow the left sidebar app rail to expand when the pointer moves over it",
52073
52016
  showPinAppRailButton: "Show Pin App Rail Button",
52074
52017
  showPinAppRailButtonDesc: "Show a button in the app rail to pin it open. Off by default.",
52075
52018
  settingsNavigation: "Navigation",
52076
52019
  navigationTabsDesc: "Choose which tabs appear in the app rail",
52077
- showSnippetCommands: "Show Commands",
52078
- showSnippetCommandsDesc: "Show each snippet's command under its name. Turn off for a compact list.",
52079
- foldersCollapsed: "Folders Collapsed",
52080
- foldersCollapsedDesc: "Collapse folders by default",
52081
- confirmExecution: "Confirm Execution",
52082
- confirmExecutionDesc: "Confirm before running snippets",
52083
52020
  settingsUpdates: "Updates",
52084
52021
  disableUpdateChecks: "Disable Update Checks",
52085
52022
  disableUpdateChecksDesc: "Stop checking for updates",
@@ -52102,7 +52039,8 @@ var en_default = {
52102
52039
  apiKeyCreatedWarning: "Key created - copy it now, it won't be shown again.",
52103
52040
  copyApiKey: "Copy API key",
52104
52041
  copiedToClipboard: "Copied to clipboard",
52105
- apiKeyCount: "{{count}} keys",
52042
+ apiKeyCount_one: "{{count}} key",
52043
+ apiKeyCount_other: "{{count}} keys",
52106
52044
  newKey: "New Key",
52107
52045
  noApiKeys: "No API keys yet.",
52108
52046
  apiKeyActive: "Active",
@@ -52169,7 +52107,6 @@ var en_default = {
52169
52107
  }
52170
52108
  }
52171
52109
  },
52172
- terminalToolbar: {},
52173
52110
  plugins: {
52174
52111
  capabilities: {
52175
52112
  "credentials:read": {
@@ -52281,8 +52218,8 @@ var en_default = {
52281
52218
  consequence: "Server settings, not your hosts or credentials."
52282
52219
  },
52283
52220
  "plugins:read": {
52284
- title: "See installed features",
52285
- consequence: "It can see which features are installed and running."
52221
+ title: "See installed plugins",
52222
+ consequence: "It can see which plugins are installed and running."
52286
52223
  },
52287
52224
  "ui:surface": {
52288
52225
  title: "Add its own screens",
@@ -52291,9 +52228,9 @@ var en_default = {
52291
52228
  },
52292
52229
  runtime: {
52293
52230
  needsPlugin: "{{name}} is not available",
52294
- needsUnknownPlugin: "This feature is not available",
52231
+ needsUnknownPlugin: "This plugin is not available",
52295
52232
  disabledHint: "It is turned off on this server.",
52296
- missingHint: "The feature it came from has been removed.",
52233
+ missingHint: "The plugin it came from has been removed.",
52297
52234
  failed: "{{name}} could not start",
52298
52235
  failedHint: "An admin can check the server logs for details.",
52299
52236
  loading: "Loading {{name}}",
@@ -52304,25 +52241,42 @@ var en_default = {
52304
52241
  tabs: {
52305
52242
  installed: "Installed",
52306
52243
  browse: "Browse",
52307
- updates: "Updates"
52244
+ updates: "Updates",
52245
+ registries: "Registries"
52308
52246
  },
52309
52247
  status: {
52310
52248
  summary: "{{installed}} installed, {{running}} running",
52311
52249
  running: "Running",
52312
52250
  disabled: "Disabled",
52313
52251
  failed: "Stopped unexpectedly",
52314
- blocked: "Waiting on another plugin"
52252
+ blocked: "Waiting on another plugin",
52253
+ server: "Runs on your server"
52315
52254
  },
52316
52255
  groups: {
52317
52256
  running: "Running",
52318
- notRunning: "Not running"
52257
+ notRunning: "Not running",
52258
+ onServer: "On your server"
52319
52259
  },
52260
+ runsOnServerHint: "This plugin only runs on your server, so it stays off in the desktop app. It still works there.",
52320
52261
  sort: {
52321
52262
  popular: "Most popular",
52322
52263
  name: "Name",
52323
52264
  updated: "Recently updated",
52324
52265
  category: "Category"
52325
52266
  },
52267
+ columns: {
52268
+ title: "Columns",
52269
+ auto: "Auto",
52270
+ count: "{{count}} wide"
52271
+ },
52272
+ table: {
52273
+ name: "Name",
52274
+ description: "Description",
52275
+ version: "Version",
52276
+ status: "Status",
52277
+ category: "Category",
52278
+ installs: "Installs"
52279
+ },
52326
52280
  risk: {
52327
52281
  critical: "Critical",
52328
52282
  high: "High risk",
@@ -52473,6 +52427,44 @@ var en_default = {
52473
52427
  noneInstalled: "No plugins installed yet. Browse to add some.",
52474
52428
  nothingHere: "Nothing here.",
52475
52429
  nothingHereHint: "Try another category or search.",
52430
+ communitySubmit: "How to submit",
52431
+ registries: {
52432
+ intro: "Registries are lists of plugins you can install. The official one is always on. You can turn on the community registry or add your own.",
52433
+ hostYourOwn: "Host your own registry",
52434
+ add: "Add registry",
52435
+ addTitle: "Add a registry",
52436
+ addHint: "Paste the link to the registry's index.json. Termix reads it and shows the key it signs plugins with. Only add registries from people you trust.",
52437
+ urlLabel: "Index URL",
52438
+ check: "Check",
52439
+ addConfirm: "Trust and add",
52440
+ added: "Added {{name}}",
52441
+ customWarning: "Plugins from this registry are not reviewed by the Termix team. Only the owner of the registry decides what is in it. Every download must be signed by the key above.",
52442
+ keyFingerprint: "Key {{keyId}}",
52443
+ pluginCount_one: "{{count}} plugin",
52444
+ pluginCount_other: "{{count}} plugins",
52445
+ officialName: "Official",
52446
+ communityName: "Community",
52447
+ alwaysOn: "Always on",
52448
+ communityHint: "Plugins made by other people. Each version is checked by a person and by automated checks before it is listed.",
52449
+ communityConfirmTitle: "Turn on community plugins?",
52450
+ communityConfirmBody: "Community plugins are made by other people, not the Termix team. Every version is checked by a person and by automated checks before it is listed, but mistakes can still get through. Only install plugins you trust and check what each one asks for.",
52451
+ communityConfirm: "Turn on",
52452
+ communityBadge: "Community",
52453
+ communityBadgeHint: "From the community registry. Made by other people and reviewed before it was listed.",
52454
+ customBadge: "Custom",
52455
+ customBadgeHint: "From {{name}}, a registry an admin added. Not reviewed by the Termix team.",
52456
+ remove: "Remove",
52457
+ removeTitle: "Remove {{name}}?",
52458
+ removeBody: "Its plugins will no longer show in Browse. You can add it again later.",
52459
+ removed: "Removed {{name}}",
52460
+ inUse: "Uninstall the plugins from {{name}} first: {{list}}",
52461
+ changeFailed: "Could not change the registry: {{error}}",
52462
+ loadFailed: "Could not load registries: {{error}}",
52463
+ unreachable: "Could not read it: {{error}}",
52464
+ filter: "Registry",
52465
+ allRegistries: "All registries",
52466
+ browseHint: "Turn on community plugins or add your own registry in the Registries tab."
52467
+ },
52476
52468
  upToDate: "Everything is up to date.",
52477
52469
  lastChecked: "Last checked {{time}}",
52478
52470
  updatesReady_one: "{{count}} update ready.",
@@ -52665,7 +52657,7 @@ var en_default = {
52665
52657
  sshCredentials: "Credentials",
52666
52658
  sshFolders: "Folders",
52667
52659
  userPreferences: "Preferences",
52668
- pluginUserSettings: "Feature settings",
52660
+ pluginUserSettings: "Plugin settings",
52669
52661
  sharedHosts: "Hosts shared with you",
52670
52662
  sharedCredentials: "Credentials shared with you",
52671
52663
  vaultProfiles: "Vault profiles",
@@ -52674,7 +52666,12 @@ var en_default = {
52674
52666
  dashboardServiceLinks: "Service links",
52675
52667
  homepageItems: "Homepage items",
52676
52668
  networkTopology: "Network map",
52677
- workspaces: "Workspaces"
52669
+ workspaces: "Workspaces",
52670
+ hostDefaults: "Host defaults",
52671
+ hostDefaultsAdmin: "Server host defaults",
52672
+ aiProviders: "AI providers",
52673
+ homepageLayouts: "Homepage layouts",
52674
+ accountProfile: "Account profile"
52678
52675
  },
52679
52676
  proxy: {
52680
52677
  title: "Reverse proxy",
@@ -52721,9 +52718,11 @@ var en_default = {
52721
52718
  continue: "Continue",
52722
52719
  back: "Back",
52723
52720
  mergeTitle: "Add it to my account",
52724
- mergeBody: "The {{count}} items on this device are added to your account. Items your account already has stay as they are on the server.",
52721
+ mergeBody_one: "The item on this device is added to your account. Items your account already has stay as they are on the server.",
52722
+ mergeBody_other: "The {{count}} items on this device are added to your account. Items your account already has stay as they are on the server.",
52725
52723
  replaceTitle: "Replace it with my account",
52726
- replaceBody: "The {{count}} items on this device are removed, and this device takes everything from your account. Hosts kept on this device only stay.",
52724
+ replaceBody_one: "The item on this device is removed, and this device takes everything from your account. Hosts kept on this device only stay.",
52725
+ replaceBody_other: "The {{count}} items on this device are removed, and this device takes everything from your account. Hosts kept on this device only stay.",
52727
52726
  link: "Link",
52728
52727
  linking: "Linking and running the first sync...",
52729
52728
  linked: "Linked. Your data is syncing now.",
@@ -52764,7 +52763,7 @@ var en_default = {
52764
52763
  confirmNoChanges: "No existing host changes. New hosts will start with these defaults.",
52765
52764
  menuMyDefaults: "My host defaults",
52766
52765
  folderDefaultsAction: "Folder defaults",
52767
- adminSectionDescription: "Set the defaults every host on this server follows, for every setting a host has, including each feature's. Users and folders can set their own on top, and any host can still use its own value.",
52766
+ adminSectionDescription: "Set the defaults every host on this server follows, for every setting a host has, including each plugin's. Users and folders can set their own on top, and any host can still use its own value.",
52768
52767
  editServerDefaults: "Edit server defaults",
52769
52768
  resetMenu: "Reset",
52770
52769
  resetAll: "Everything to defaults",
@@ -52794,7 +52793,7 @@ var en_default = {
52794
52793
  needsAttention_one: "One thing needs attention.",
52795
52794
  needsAttention_other: "{{count}} things need attention.",
52796
52795
  bandHost: "Host",
52797
- bandFeatures: "Protocols and features",
52796
+ bandFeatures: "Protocols and plugins",
52798
52797
  bandCredential: "Credential",
52799
52798
  sshConnection: "SSH connection",
52800
52799
  errorAddressRequired: "An address is required.",
@@ -52823,46 +52822,131 @@ var en_default = {
52823
52822
  pickCredential: "Pick a credential to edit",
52824
52823
  pickDefaults: "Pick a level of defaults to edit",
52825
52824
  pickHint: "Everything about a connection lives here, grouped so you can find it."
52825
+ },
52826
+ rbac: {
52827
+ roles: {
52828
+ admin: "Admin",
52829
+ user: "User"
52830
+ }
52826
52831
  }
52827
52832
  };
52828
52833
 
52834
+ // src/ui/locales/languages.json
52835
+ var languages_default = [
52836
+ { code: "af", file: "af_ZA", name: "Afrikaans", label: "Afrikaans" },
52837
+ { code: "ar", file: "ar_SA", name: "Arabic", label: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629" },
52838
+ { code: "bn", file: "bn_BD", name: "Bengali", label: "\u09AC\u09BE\u0982\u09B2\u09BE" },
52839
+ { code: "bg", file: "bg_BG", name: "Bulgarian", label: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438" },
52840
+ { code: "ca", file: "ca_ES", name: "Catalan", label: "Catal\xE0" },
52841
+ {
52842
+ code: "zh-CN",
52843
+ file: "zh_CN",
52844
+ name: "Simplified Chinese",
52845
+ label: "\u4E2D\u6587 (\u7B80\u4F53)"
52846
+ },
52847
+ {
52848
+ code: "zh-TW",
52849
+ file: "zh_TW",
52850
+ name: "Traditional Chinese (Taiwan)",
52851
+ label: "\u4E2D\u6587 (\u7E41\u9AD4)"
52852
+ },
52853
+ { code: "hr", file: "hr_HR", name: "Croatian", label: "Hrvatski" },
52854
+ { code: "cs", file: "cs_CZ", name: "Czech", label: "\u010Ce\u0161tina" },
52855
+ { code: "da", file: "da_DK", name: "Danish", label: "Dansk" },
52856
+ { code: "nl", file: "nl_NL", name: "Dutch", label: "Nederlands" },
52857
+ { code: "et", file: "et_EE", name: "Estonian", label: "Eesti" },
52858
+ { code: "fi", file: "fi_FI", name: "Finnish", label: "Suomi" },
52859
+ { code: "fr", file: "fr_FR", name: "French", label: "Fran\xE7ais" },
52860
+ { code: "de", file: "de_DE", name: "German", label: "Deutsch" },
52861
+ { code: "el", file: "el_GR", name: "Greek", label: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC" },
52862
+ { code: "he", file: "he_IL", name: "Hebrew", label: "\u05E2\u05D1\u05E8\u05D9\u05EA" },
52863
+ { code: "hi", file: "hi_IN", name: "Hindi", label: "\u0939\u093F\u0928\u094D\u0926\u0940" },
52864
+ { code: "hu", file: "hu_HU", name: "Hungarian", label: "Magyar" },
52865
+ {
52866
+ code: "id",
52867
+ file: "id_ID",
52868
+ name: "Indonesian",
52869
+ label: "Indonesia"
52870
+ },
52871
+ { code: "it", file: "it_IT", name: "Italian", label: "Italiano" },
52872
+ { code: "ja", file: "ja_JP", name: "Japanese", label: "\u65E5\u672C\u8A9E" },
52873
+ { code: "ko", file: "ko_KR", name: "Korean", label: "\uD55C\uAD6D\uC5B4" },
52874
+ { code: "lv", file: "lv_LV", name: "Latvian", label: "Latvie\u0161u" },
52875
+ {
52876
+ code: "lt",
52877
+ file: "lt_LT",
52878
+ name: "Lithuanian",
52879
+ label: "Lietuvi\u0173"
52880
+ },
52881
+ { code: "ms", file: "ms_MY", name: "Malay", label: "Bahasa Melayu" },
52882
+ {
52883
+ code: "no",
52884
+ file: "no_NO",
52885
+ name: "Norwegian Bokm\xE5l",
52886
+ label: "Norsk"
52887
+ },
52888
+ { code: "pl", file: "pl_PL", name: "Polish", label: "Polski" },
52889
+ {
52890
+ code: "pt-PT",
52891
+ file: "pt_PT",
52892
+ name: "European Portuguese",
52893
+ label: "Portugu\xEAs (PT)"
52894
+ },
52895
+ {
52896
+ code: "pt-BR",
52897
+ file: "pt_BR",
52898
+ name: "Brazilian Portuguese",
52899
+ label: "Portugu\xEAs (BR)"
52900
+ },
52901
+ { code: "ro", file: "ro_RO", name: "Romanian", label: "Rom\xE2n\u0103" },
52902
+ { code: "ru", file: "ru_RU", name: "Russian", label: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439" },
52903
+ {
52904
+ code: "sr",
52905
+ file: "sr_SP",
52906
+ name: "Serbian (Cyrillic script)",
52907
+ label: "\u0421\u0440\u043F\u0441\u043A\u0438"
52908
+ },
52909
+ { code: "sk", file: "sk_SK", name: "Slovak", label: "Sloven\u010Dina" },
52910
+ {
52911
+ code: "sl",
52912
+ file: "sl_SI",
52913
+ name: "Slovenian",
52914
+ label: "Sloven\u0161\u010Dina"
52915
+ },
52916
+ {
52917
+ code: "es-ES",
52918
+ file: "es_ES",
52919
+ name: "Spanish (Spain)",
52920
+ label: "Espa\xF1ol"
52921
+ },
52922
+ { code: "sv-SE", file: "sv_SE", name: "Swedish", label: "Svenska" },
52923
+ { code: "th", file: "th_TH", name: "Thai", label: "\u0E44\u0E17\u0E22" },
52924
+ { code: "tr", file: "tr_TR", name: "Turkish", label: "T\xFCrk\xE7e" },
52925
+ {
52926
+ code: "uk",
52927
+ file: "uk_UA",
52928
+ name: "Ukrainian",
52929
+ label: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430"
52930
+ },
52931
+ {
52932
+ code: "vi",
52933
+ file: "vi_VN",
52934
+ name: "Vietnamese",
52935
+ label: "Ti\u1EBFng Vi\u1EC7t"
52936
+ }
52937
+ ];
52938
+
52939
+ // src/ui/i18n/languages.ts
52940
+ var TRANSLATED_LANGUAGES = languages_default;
52941
+ var LANGUAGES = [
52942
+ { code: "en", label: "English" },
52943
+ ...TRANSLATED_LANGUAGES.map(({ code, label }) => ({ code, label }))
52944
+ ];
52945
+
52829
52946
  // src/ui/i18n/i18n.ts
52830
- var LOCALE_FILES = {
52831
- af: "af_ZA",
52832
- ar: "ar_SA",
52833
- bn: "bn_BD",
52834
- bg: "bg_BG",
52835
- ca: "ca_ES",
52836
- cs: "cs_CZ",
52837
- da: "da_DK",
52838
- de: "de_DE",
52839
- el: "el_GR",
52840
- "es-ES": "es_ES",
52841
- fi: "fi_FI",
52842
- fr: "fr_FR",
52843
- he: "he_IL",
52844
- hi: "hi_IN",
52845
- hu: "hu_HU",
52846
- id: "id_ID",
52847
- it: "it_IT",
52848
- ja: "ja_JP",
52849
- ko: "ko_KR",
52850
- nl: "nl_NL",
52851
- no: "no_NO",
52852
- pl: "pl_PL",
52853
- "pt-PT": "pt_PT",
52854
- "pt-BR": "pt_BR",
52855
- ro: "ro_RO",
52856
- ru: "ru_RU",
52857
- sr: "sr_SP",
52858
- "sv-SE": "sv_SE",
52859
- th: "th_TH",
52860
- tr: "tr_TR",
52861
- uk: "uk_UA",
52862
- vi: "vi_VN",
52863
- "zh-CN": "zh_CN",
52864
- "zh-TW": "zh_TW"
52865
- };
52947
+ var LOCALE_FILES = Object.fromEntries(
52948
+ TRANSLATED_LANGUAGES.map(({ code, file }) => [code, file])
52949
+ );
52866
52950
  var translatedFiles = __termixNoGlob(
52867
52951
  "../locales/translated/*.json"
52868
52952
  );
@@ -52890,8 +52974,16 @@ function normalizeLanguageCode(language) {
52890
52974
  (supported) => supported.toLowerCase() === normalized.toLowerCase()
52891
52975
  );
52892
52976
  if (exactMatch) return exactMatch;
52893
- const baseLanguage = normalized.split("-")[0];
52894
- return supportedLngs.includes(baseLanguage) ? baseLanguage : "en";
52977
+ const baseLanguage = normalized.split("-")[0].toLowerCase();
52978
+ if (supportedLngs.includes(baseLanguage)) return baseLanguage;
52979
+ if (baseLanguage === "zh") {
52980
+ return /-(tw|hk|mo|hant)\b/i.test(normalized) ? "zh-TW" : "zh-CN";
52981
+ }
52982
+ if (baseLanguage === "nb" || baseLanguage === "nn") return "no";
52983
+ if (baseLanguage === "pt") return "pt-BR";
52984
+ return supportedLngs.find(
52985
+ (supported) => supported.toLowerCase().startsWith(`${baseLanguage}-`)
52986
+ ) ?? "en";
52895
52987
  }
52896
52988
  var localeBackend = {
52897
52989
  type: "backend",
@@ -53461,6 +53553,20 @@ function pluginApiFor(pluginId, origin, local) {
53461
53553
  }
53462
53554
  return client;
53463
53555
  }
53556
+ async function fetchSocketTicket() {
53557
+ const base = (authApi.defaults.baseURL ?? "").replace(/\/+$/, "");
53558
+ try {
53559
+ const response = await fetch(`${base}/users/ws-ticket`, {
53560
+ method: "POST",
53561
+ credentials: "include"
53562
+ });
53563
+ if (!response.ok) return null;
53564
+ const data = await response.json();
53565
+ return typeof data.ticket === "string" ? data.ticket : null;
53566
+ } catch {
53567
+ return null;
53568
+ }
53569
+ }
53464
53570
  async function pluginWsUrl(pluginId, path2, options2 = {}) {
53465
53571
  const suffix = path2.startsWith("/") ? path2 : `/${path2}`;
53466
53572
  const route = `/plugin-ws/${pluginId}${suffix}`;
@@ -53472,7 +53578,7 @@ async function pluginWsUrl(pluginId, path2, options2 = {}) {
53472
53578
  remotePath: route
53473
53579
  });
53474
53580
  }
53475
- const token = localStorage.getItem("jwt");
53581
+ const token = await fetchSocketTicket() ?? localStorage.getItem("jwt");
53476
53582
  const protocols2 = websocketAuthProtocols(token);
53477
53583
  const devProxy = !define_import_meta_env_default.VITE_API_HOST && (window.location.port === "3000" || window.location.port === "5173");
53478
53584
  const wsProtocol = window.location.protocol === "https:" ? "wss" : "ws";
@@ -55019,6 +55125,7 @@ export {
55019
55125
  getSecondFactorUI,
55020
55126
  useSecondFactors,
55021
55127
  listSecondFactorUIs,
55128
+ LANGUAGES,
55022
55129
  setPluginLocaleResolver,
55023
55130
  normalizeLanguageCode,
55024
55131
  changeAppLanguage,