tmex-cli 0.1.4 → 0.1.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 (27) hide show
  1. package/dist/runtime/server.js +421 -14
  2. package/package.json +3 -2
  3. package/resources/fe-dist/assets/DevicePage-Beg8tuEN.css +32 -0
  4. package/resources/fe-dist/assets/DevicePage-DXr7cn5f.js +31 -0
  5. package/resources/fe-dist/assets/DevicePage-DXr7cn5f.js.map +1 -0
  6. package/resources/fe-dist/assets/DevicesPage-DClS6lhB.js +17 -0
  7. package/resources/fe-dist/assets/DevicesPage-DClS6lhB.js.map +1 -0
  8. package/resources/fe-dist/assets/SettingsPage-DZPiSKLS.js +17 -0
  9. package/resources/fe-dist/assets/SettingsPage-DZPiSKLS.js.map +1 -0
  10. package/resources/fe-dist/assets/index-DLLCJhRn.css +1 -0
  11. package/resources/fe-dist/assets/index-uap7lu9-.js +200 -0
  12. package/resources/fe-dist/assets/index-uap7lu9-.js.map +1 -0
  13. package/resources/fe-dist/assets/select-DOLHUgAj.js +12 -0
  14. package/resources/fe-dist/assets/select-DOLHUgAj.js.map +1 -0
  15. package/resources/fe-dist/assets/switch-DbiHVHFg.js +12 -0
  16. package/resources/fe-dist/assets/switch-DbiHVHFg.js.map +1 -0
  17. package/resources/fe-dist/assets/tmex-DcyZpuP8.png +0 -0
  18. package/resources/fe-dist/assets/useValueChanged-DoNZeDee.js +2 -0
  19. package/resources/fe-dist/assets/useValueChanged-DoNZeDee.js.map +1 -0
  20. package/resources/fe-dist/index.html +10 -3
  21. package/resources/fe-dist/logo.png +0 -0
  22. package/resources/gateway-drizzle/0000_busy_starjammers.sql +1 -2
  23. package/resources/gateway-drizzle/meta/0000_snapshot.json +0 -4
  24. package/resources/gateway-drizzle/meta/0001_snapshot.json +0 -4
  25. package/resources/fe-dist/assets/index-D7lUHQCR.css +0 -32
  26. package/resources/fe-dist/assets/index-DNlxXBdI.js +0 -333
  27. package/resources/fe-dist/assets/index-DNlxXBdI.js.map +0 -1
@@ -19577,10 +19577,13 @@ var I18N_RESOURCES = {
19577
19577
  none: "None",
19578
19578
  default: "Default",
19579
19579
  optional: "Optional",
19580
- required: "Required"
19580
+ required: "Required",
19581
+ pwaInstallTitle: "Install as app",
19582
+ pwaInstallHintIOSSafari: 'iOS Safari does not show an automatic install prompt. Tap Share, then "Add to Home Screen".',
19583
+ pwaInstallHintIOSChrome: 'iOS Chrome does not show an automatic install prompt. Tap Share, then "Add to Home Screen".'
19581
19584
  },
19582
19585
  nav: {
19583
- deviceManagement: "Device Management",
19586
+ manageDevices: "Manage Devices",
19584
19587
  settings: "Settings",
19585
19588
  sidebarExpand: "Expand Sidebar",
19586
19589
  sidebarCollapse: "Collapse Sidebar",
@@ -19588,10 +19591,13 @@ var I18N_RESOURCES = {
19588
19591
  closeSidebar: "Close Sidebar",
19589
19592
  jumpToLatest: "Jump to Latest",
19590
19593
  switchToEditor: "Switch to Editor Input",
19591
- switchToDirect: "Switch to Direct Input"
19594
+ switchToDirect: "Switch to Direct Input",
19595
+ refreshPage: "Refresh Page",
19596
+ refreshPageConfirm: "Are you sure you want to refresh the page? Unsaved content will be lost."
19592
19597
  },
19593
19598
  device: {
19594
19599
  title: "Device Management",
19600
+ devices: "Devices",
19595
19601
  addDevice: "Add Device",
19596
19602
  addFirstDevice: "Add First Device",
19597
19603
  editDevice: "Edit Device",
@@ -19602,6 +19608,7 @@ var I18N_RESOURCES = {
19602
19608
  type: "Type",
19603
19609
  typeLocal: "Local Device",
19604
19610
  typeSSH: "SSH Remote Device",
19611
+ typeSSHBadge: "SSH",
19605
19612
  host: "Host",
19606
19613
  hostPlaceholder: "example.com",
19607
19614
  port: "Port",
@@ -19682,6 +19689,12 @@ var I18N_RESOURCES = {
19682
19689
  languagePlaceholder: "Select language",
19683
19690
  language_en_US: "English",
19684
19691
  language_zh_CN: "\u7B80\u4F53\u4E2D\u6587",
19692
+ language_ja_JP: "\u65E5\u672C\u8A9E",
19693
+ theme: "Theme",
19694
+ themeLight: "Light",
19695
+ themeDark: "Dark",
19696
+ siteTab: "Site",
19697
+ notificationsTab: "Notifications",
19685
19698
  refreshToApply: "Refresh to apply language change",
19686
19699
  saveSettings: "Save Settings",
19687
19700
  settingsSaved: "Settings saved",
@@ -19689,6 +19702,7 @@ var I18N_RESOURCES = {
19689
19702
  loadFailed: "Failed to load settings",
19690
19703
  restartGateway: "Restart Gateway",
19691
19704
  restartScheduled: "Gateway restart scheduled",
19705
+ restartConfirm: "Are you sure you want to restart Gateway? This will interrupt all active connections.",
19692
19706
  restartFailed: "Failed to restart gateway",
19693
19707
  sshReconnectMaxRetries: "SSH Reconnect Retries"
19694
19708
  },
@@ -19748,6 +19762,19 @@ Time: {{time}}`,
19748
19762
  botNotFound: "Bot not found or unavailable",
19749
19763
  botNotRunning: "Bot is not running or unavailable"
19750
19764
  },
19765
+ webhook: {
19766
+ title: "Webhooks",
19767
+ url: "Webhook URL",
19768
+ secret: "Secret",
19769
+ secretPlaceholder: "Used to sign payloads (HMAC-SHA256)",
19770
+ enabled: "Enabled",
19771
+ eventMask: "Events",
19772
+ add: "Add Webhook",
19773
+ empty: "No webhooks yet.",
19774
+ createFailed: "Failed to create webhook",
19775
+ deleteFailed: "Failed to delete webhook",
19776
+ loadFailed: "Failed to load webhooks"
19777
+ },
19751
19778
  sshError: {
19752
19779
  sshConfigRefNotSupported: "SSH Config reference is not supported in this version. Please use host + username with Agent/Key/Password authentication.",
19753
19780
  configRefNotSupported: "SSH Config reference is not supported in this version. Please use host + username with Agent/Key/Password authentication.",
@@ -19783,7 +19810,7 @@ Time: {{time}}`,
19783
19810
  bellThrottleInvalid: "Bell throttle seconds must be between 0-300",
19784
19811
  sshRetriesInvalid: "SSH reconnect retries must be between 0-20",
19785
19812
  sshDelayInvalid: "SSH reconnect delay must be between 1-300 seconds",
19786
- languageInvalid: "Language must be en_US or zh_CN",
19813
+ languageInvalid: "Language must be one of the supported locales",
19787
19814
  botNameRequired: "Bot name cannot be empty",
19788
19815
  botTokenRequired: "Bot token cannot be empty",
19789
19816
  missingFields: "Missing required fields",
@@ -19872,10 +19899,13 @@ Time: {{time}}`,
19872
19899
  none: "\u65E0",
19873
19900
  default: "\u9ED8\u8BA4",
19874
19901
  optional: "\u53EF\u9009",
19875
- required: "\u5FC5\u586B"
19902
+ required: "\u5FC5\u586B",
19903
+ pwaInstallTitle: "\u5B89\u88C5\u4E3A\u5E94\u7528",
19904
+ pwaInstallHintIOSSafari: "iOS Safari \u4E0D\u4F1A\u81EA\u52A8\u5F39\u51FA\u5B89\u88C5\u63D0\u793A\u3002\u8BF7\u70B9\u51FB\u300C\u5206\u4EAB\u300D\uFF0C\u518D\u9009\u62E9\u300C\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55\u300D\u3002",
19905
+ pwaInstallHintIOSChrome: "iOS Chrome \u4E0D\u4F1A\u81EA\u52A8\u5F39\u51FA\u5B89\u88C5\u63D0\u793A\u3002\u8BF7\u70B9\u51FB\u300C\u5206\u4EAB\u300D\uFF0C\u518D\u9009\u62E9\u300C\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55\u300D"
19876
19906
  },
19877
19907
  nav: {
19878
- deviceManagement: "\u8BBE\u5907\u7BA1\u7406",
19908
+ manageDevices: "\u7BA1\u7406\u8BBE\u5907",
19879
19909
  settings: "\u8BBE\u7F6E",
19880
19910
  sidebarExpand: "\u5C55\u5F00\u4FA7\u8FB9\u680F",
19881
19911
  sidebarCollapse: "\u6536\u8D77\u4FA7\u8FB9\u680F",
@@ -19883,10 +19913,13 @@ Time: {{time}}`,
19883
19913
  closeSidebar: "\u5173\u95ED\u4FA7\u8FB9\u680F",
19884
19914
  jumpToLatest: "\u8DF3\u8F6C\u5230\u6700\u65B0",
19885
19915
  switchToEditor: "\u5207\u6362\u5230\u7F16\u8F91\u5668\u8F93\u5165",
19886
- switchToDirect: "\u5207\u6362\u5230\u76F4\u63A5\u8F93\u5165"
19916
+ switchToDirect: "\u5207\u6362\u5230\u76F4\u63A5\u8F93\u5165",
19917
+ refreshPage: "\u5237\u65B0\u9875\u9762",
19918
+ refreshPageConfirm: "\u786E\u5B9A\u8981\u5237\u65B0\u9875\u9762\u5417\uFF1F\u672A\u4FDD\u5B58\u7684\u5185\u5BB9\u5C06\u4F1A\u4E22\u5931\u3002"
19887
19919
  },
19888
19920
  device: {
19889
19921
  title: "\u8BBE\u5907\u7BA1\u7406",
19922
+ devices: "\u8BBE\u5907",
19890
19923
  addDevice: "\u6DFB\u52A0\u8BBE\u5907",
19891
19924
  addFirstDevice: "\u6DFB\u52A0\u7B2C\u4E00\u4E2A\u8BBE\u5907",
19892
19925
  editDevice: "\u4FEE\u6539\u8BBE\u5907",
@@ -19897,6 +19930,7 @@ Time: {{time}}`,
19897
19930
  type: "\u7C7B\u578B",
19898
19931
  typeLocal: "\u672C\u5730\u8BBE\u5907",
19899
19932
  typeSSH: "SSH \u8FDC\u7A0B\u8BBE\u5907",
19933
+ typeSSHBadge: "SSH",
19900
19934
  host: "\u4E3B\u673A",
19901
19935
  hostPlaceholder: "example.com",
19902
19936
  port: "\u7AEF\u53E3",
@@ -19977,6 +20011,12 @@ Time: {{time}}`,
19977
20011
  languagePlaceholder: "\u9009\u62E9\u8BED\u8A00",
19978
20012
  language_en_US: "English",
19979
20013
  language_zh_CN: "\u7B80\u4F53\u4E2D\u6587",
20014
+ language_ja_JP: "\u65E5\u672C\u8A9E",
20015
+ theme: "\u4E3B\u9898",
20016
+ themeLight: "\u6D45\u8272",
20017
+ themeDark: "\u6DF1\u8272",
20018
+ siteTab: "\u7AD9\u70B9",
20019
+ notificationsTab: "\u901A\u77E5",
19980
20020
  refreshToApply: "\u5237\u65B0\u540E\u751F\u6548",
19981
20021
  saveSettings: "\u4FDD\u5B58\u8BBE\u7F6E",
19982
20022
  settingsSaved: "\u7AD9\u70B9\u8BBE\u7F6E\u5DF2\u4FDD\u5B58",
@@ -19984,6 +20024,7 @@ Time: {{time}}`,
19984
20024
  loadFailed: "\u52A0\u8F7D\u8BBE\u7F6E\u5931\u8D25",
19985
20025
  restartGateway: "\u91CD\u542F Gateway",
19986
20026
  restartScheduled: "Gateway \u91CD\u542F\u8BF7\u6C42\u5DF2\u53D1\u9001",
20027
+ restartConfirm: "\u786E\u5B9A\u8981\u91CD\u542F Gateway \u5417\uFF1F\u8FD9\u5C06\u4E2D\u65AD\u6240\u6709\u6D3B\u52A8\u8FDE\u63A5\u3002",
19987
20028
  restartFailed: "\u91CD\u542F\u8BF7\u6C42\u5931\u8D25",
19988
20029
  sshReconnectMaxRetries: "SSH \u91CD\u8FDE\u6B21\u6570"
19989
20030
  },
@@ -20043,6 +20084,19 @@ Bot\uFF1A{{botName}}
20043
20084
  botNotFound: "Bot \u672A\u542F\u52A8\u6216\u4E0D\u53EF\u7528",
20044
20085
  botNotRunning: "Bot \u672A\u542F\u52A8\u6216\u4E0D\u53EF\u7528"
20045
20086
  },
20087
+ webhook: {
20088
+ title: "Webhooks",
20089
+ url: "Webhook \u5730\u5740",
20090
+ secret: "\u5BC6\u94A5",
20091
+ secretPlaceholder: "\u7528\u4E8E\u7B7E\u540D\uFF08HMAC-SHA256\uFF09",
20092
+ enabled: "\u542F\u7528",
20093
+ eventMask: "\u4E8B\u4EF6",
20094
+ add: "\u6DFB\u52A0 Webhook",
20095
+ empty: "\u6682\u65E0 Webhook\u3002",
20096
+ createFailed: "\u521B\u5EFA Webhook \u5931\u8D25",
20097
+ deleteFailed: "\u5220\u9664 Webhook \u5931\u8D25",
20098
+ loadFailed: "\u52A0\u8F7D Webhook \u5931\u8D25"
20099
+ },
20046
20100
  sshError: {
20047
20101
  sshConfigRefNotSupported: "\u5F53\u524D\u7248\u672C\u6682\u4E0D\u652F\u6301 SSH Config \u5F15\u7528\uFF0C\u8BF7\u6539\u4E3A\u586B\u5199 host + username\uFF0C\u5E76\u9009\u62E9 Agent/\u79C1\u94A5/\u5BC6\u7801\u8BA4\u8BC1",
20048
20102
  configRefNotSupported: "\u5F53\u524D\u7248\u672C\u6682\u4E0D\u652F\u6301 SSH Config \u5F15\u7528\uFF0C\u8BF7\u6539\u4E3A\u586B\u5199 host + username\uFF0C\u5E76\u9009\u62E9 Agent/\u79C1\u94A5/\u5BC6\u7801\u8BA4\u8BC1",
@@ -20078,7 +20132,7 @@ Bot\uFF1A{{botName}}
20078
20132
  bellThrottleInvalid: "Bell \u9891\u63A7\u79D2\u6570\u9700\u5728 0-300 \u4E4B\u95F4",
20079
20133
  sshRetriesInvalid: "SSH \u91CD\u8FDE\u6B21\u6570\u9700\u5728 0-20 \u4E4B\u95F4",
20080
20134
  sshDelayInvalid: "SSH \u91CD\u8FDE\u7B49\u5F85\u65F6\u95F4\u9700\u5728 1-300 \u79D2\u4E4B\u95F4",
20081
- languageInvalid: "\u8BED\u8A00\u5FC5\u987B\u662F en_US \u6216 zh_CN",
20135
+ languageInvalid: "\u8BED\u8A00\u5FC5\u987B\u662F\u53D7\u652F\u6301\u7684\u533A\u57DF\u8BBE\u7F6E\u4E4B\u4E00",
20082
20136
  botNameRequired: "Bot \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",
20083
20137
  botTokenRequired: "Bot token \u4E0D\u80FD\u4E3A\u7A7A",
20084
20138
  missingFields: "\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5",
@@ -20134,15 +20188,335 @@ Bot\uFF1A{{botName}}
20134
20188
  hostRequired: "SSH \u8BBE\u5907\u9700\u8981\u586B\u5199\u4E3B\u673A\u5730\u5740"
20135
20189
  }
20136
20190
  }
20191
+ },
20192
+ ja_JP: {
20193
+ translation: {
20194
+ common: {
20195
+ loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D...",
20196
+ save: "\u4FDD\u5B58",
20197
+ saving: "\u4FDD\u5B58\u4E2D...",
20198
+ cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
20199
+ add: "\u8FFD\u52A0",
20200
+ delete: "\u524A\u9664",
20201
+ edit: "\u7DE8\u96C6",
20202
+ confirm: "\u78BA\u8A8D",
20203
+ close: "\u9589\u3058\u308B",
20204
+ expand: "\u5C55\u958B",
20205
+ collapse: "\u6298\u308A\u305F\u305F\u3080",
20206
+ refresh: "\u66F4\u65B0",
20207
+ test: "\u30C6\u30B9\u30C8",
20208
+ send: "\u9001\u4FE1",
20209
+ success: "\u6210\u529F",
20210
+ error: "\u30A8\u30E9\u30FC",
20211
+ warning: "\u8B66\u544A",
20212
+ info: "\u60C5\u5831",
20213
+ yes: "\u306F\u3044",
20214
+ no: "\u3044\u3044\u3048",
20215
+ enabled: "\u6709\u52B9",
20216
+ disabled: "\u7121\u52B9",
20217
+ pending: "\u4FDD\u7559\u4E2D",
20218
+ authorized: "\u627F\u8A8D\u6E08\u307F",
20219
+ unknown: "\u4E0D\u660E",
20220
+ empty: "\u7A7A",
20221
+ none: "\u306A\u3057",
20222
+ default: "\u30C7\u30D5\u30A9\u30EB\u30C8",
20223
+ optional: "\u4EFB\u610F",
20224
+ required: "\u5FC5\u9808",
20225
+ pwaInstallTitle: "\u30A2\u30D7\u30EA\u3068\u3057\u3066\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",
20226
+ pwaInstallHintIOSSafari: "iOS Safari \u3067\u306F\u81EA\u52D5\u7684\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002\u5171\u6709\u30DC\u30BF\u30F3\u3092\u30BF\u30C3\u30D7\u3057\u3001\u300C\u30DB\u30FC\u30E0\u753B\u9762\u306B\u8FFD\u52A0\u300D\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20227
+ pwaInstallHintIOSChrome: "iOS Chrome \u3067\u306F\u81EA\u52D5\u7684\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002\u5171\u6709\u30DC\u30BF\u30F3\u3092\u30BF\u30C3\u30D7\u3057\u3001\u300C\u30DB\u30FC\u30E0\u753B\u9762\u306B\u8FFD\u52A0\u300D\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002"
20228
+ },
20229
+ nav: {
20230
+ manageDevices: "\u30C7\u30D0\u30A4\u30B9\u7BA1\u7406",
20231
+ settings: "\u8A2D\u5B9A",
20232
+ sidebarExpand: "\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u5C55\u958B",
20233
+ sidebarCollapse: "\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u6298\u308A\u305F\u305F\u3080",
20234
+ openSidebar: "\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u958B\u304F",
20235
+ closeSidebar: "\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u9589\u3058\u308B",
20236
+ jumpToLatest: "\u6700\u65B0\u306B\u30B8\u30E3\u30F3\u30D7",
20237
+ switchToEditor: "\u30A8\u30C7\u30A3\u30BF\u5165\u529B\u306B\u5207\u308A\u66FF\u3048",
20238
+ switchToDirect: "\u76F4\u63A5\u5165\u529B\u306B\u5207\u308A\u66FF\u3048",
20239
+ refreshPage: "\u30DA\u30FC\u30B8\u3092\u66F4\u65B0",
20240
+ refreshPageConfirm: "\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F\u4FDD\u5B58\u3055\u308C\u3066\u3044\u306A\u3044\u5185\u5BB9\u306F\u5931\u308F\u308C\u307E\u3059\u3002"
20241
+ },
20242
+ device: {
20243
+ title: "\u30C7\u30D0\u30A4\u30B9\u7BA1\u7406",
20244
+ devices: "\u30C7\u30D0\u30A4\u30B9",
20245
+ addDevice: "\u30C7\u30D0\u30A4\u30B9\u3092\u8FFD\u52A0",
20246
+ addFirstDevice: "\u6700\u521D\u306E\u30C7\u30D0\u30A4\u30B9\u3092\u8FFD\u52A0",
20247
+ editDevice: "\u30C7\u30D0\u30A4\u30B9\u3092\u7DE8\u96C6",
20248
+ noDevices: "\u30C7\u30D0\u30A4\u30B9\u304C\u3042\u308A\u307E\u305B\u3093",
20249
+ noDevicesDescription: "\u30ED\u30FC\u30AB\u30EB\u307E\u305F\u306F SSH \u30C7\u30D0\u30A4\u30B9\u3092\u8FFD\u52A0\u3057\u3066\u958B\u59CB",
20250
+ name: "\u30C7\u30D0\u30A4\u30B9\u540D",
20251
+ namePlaceholder: "\u4F8B\uFF1AMy Server",
20252
+ type: "\u30BF\u30A4\u30D7",
20253
+ typeLocal: "\u30ED\u30FC\u30AB\u30EB\u30C7\u30D0\u30A4\u30B9",
20254
+ typeSSH: "SSH \u30EA\u30E2\u30FC\u30C8\u30C7\u30D0\u30A4\u30B9",
20255
+ typeSSHBadge: "SSH",
20256
+ host: "\u30DB\u30B9\u30C8",
20257
+ hostPlaceholder: "example.com",
20258
+ port: "\u30DD\u30FC\u30C8",
20259
+ username: "\u30E6\u30FC\u30B6\u30FC\u540D",
20260
+ usernamePlaceholder: "root",
20261
+ session: "Tmux \u30BB\u30C3\u30B7\u30E7\u30F3\u540D",
20262
+ sessionPlaceholder: "tmex",
20263
+ sessionHint: "\u7A7A\u306E\u5834\u5408\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u300Ctmex\u300D\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059",
20264
+ authMode: "\u8A8D\u8A3C\u30E2\u30FC\u30C9",
20265
+ authPassword: "\u30D1\u30B9\u30EF\u30FC\u30C9",
20266
+ authKey: "\u79D8\u5BC6\u9375",
20267
+ authAgent: "SSH Agent",
20268
+ authConfigRef: "SSH Config",
20269
+ password: "\u30D1\u30B9\u30EF\u30FC\u30C9",
20270
+ privateKey: "\u79D8\u5BC6\u9375",
20271
+ privateKeyPlaceholder: "-----BEGIN OPENSSH PRIVATE KEY-----",
20272
+ privateKeyPassphrase: "\u79D8\u5BC6\u9375\u306E\u30D1\u30B9\u30D5\u30EC\u30FC\u30BA\uFF08\u4EFB\u610F\uFF09",
20273
+ passphrase: "\u30D1\u30B9\u30D5\u30EC\u30FC\u30BA",
20274
+ connect: "\u63A5\u7D9A",
20275
+ connected: "\u63A5\u7D9A\u6E08\u307F",
20276
+ disconnected: "\u5207\u65AD\u6E08\u307F",
20277
+ connecting: "\u63A5\u7D9A\u4E2D...",
20278
+ deleteConfirm: "\u3053\u306E\u30C7\u30D0\u30A4\u30B9\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F",
20279
+ deleteSuccess: "\u30C7\u30D0\u30A4\u30B9\u3092\u524A\u9664\u3057\u307E\u3057\u305F",
20280
+ createSuccess: "\u30C7\u30D0\u30A4\u30B9\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F",
20281
+ updateSuccess: "\u30C7\u30D0\u30A4\u30B9\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F",
20282
+ deleteFailed: "\u30C7\u30D0\u30A4\u30B9\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20283
+ createFailed: "\u30C7\u30D0\u30A4\u30B9\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20284
+ updateFailed: "\u30C7\u30D0\u30A4\u30B9\u306E\u66F4\u65B0\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20285
+ loadFailed: "\u30C7\u30D0\u30A4\u30B9\u4E00\u89A7\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20286
+ localDevice: "\u30ED\u30FC\u30AB\u30EB\u30C7\u30D0\u30A4\u30B9",
20287
+ subtitle: "{{username}}@{{host}}:{{port}}",
20288
+ modify: "\u30C7\u30D0\u30A4\u30B9\u3092\u5909\u66F4",
20289
+ delete: "\u524A\u9664"
20290
+ },
20291
+ terminal: {
20292
+ initializing: "\u30BF\u30FC\u30DF\u30CA\u30EB\u3092\u521D\u671F\u5316\u4E2D...",
20293
+ connecting: "\u30C7\u30D0\u30A4\u30B9\u306B\u63A5\u7D9A\u4E2D...",
20294
+ initFailed: "\u30BF\u30FC\u30DF\u30CA\u30EB\u306E\u521D\u671F\u5316\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20295
+ inputPlaceholder: "\u3053\u3053\u306B\u30B3\u30DE\u30F3\u30C9\u3092\u5165\u529B...",
20296
+ clear: "\u30AF\u30EA\u30A2",
20297
+ deviceError: "\u30C7\u30D0\u30A4\u30B9\u30A8\u30E9\u30FC",
20298
+ deviceErrorWithType: "[{{type}}] \u30C7\u30D0\u30A4\u30B9\u30A8\u30E9\u30FC",
20299
+ noDeviceSelected: "\u30C7\u30D0\u30A4\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
20300
+ windowClosed: "\u73FE\u5728\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u306F\u9589\u3058\u3089\u308C\u307E\u3057\u305F\u3002\u30B5\u30A4\u30C9\u30D0\u30FC\u304B\u3089\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20301
+ paneClosed: "\u73FE\u5728\u306E\u30DA\u30A4\u30F3\u306F\u9589\u3058\u3089\u308C\u307E\u3057\u305F\u3002\u30B5\u30A4\u30C9\u30D0\u30FC\u304B\u3089\u30DA\u30A4\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20302
+ bellNotification: "\u30BF\u30FC\u30DF\u30CA\u30EB\u30D9\u30EB\u901A\u77E5",
20303
+ bellDescription: "\u30A6\u30A3\u30F3\u30C9\u30A6 {{window}} \xB7 \u30DA\u30A4\u30F3 {{pane}}",
20304
+ bellFallback: "tmux \u30D9\u30EB\u3092\u53D7\u4FE1",
20305
+ paneTitle: "\u30DA\u30A4\u30F3 {{index}}",
20306
+ activePane: "\u73FE\u5728\u306E\u30DA\u30A4\u30F3",
20307
+ activeWindow: "\u73FE\u5728\u306E\u30A6\u30A3\u30F3\u30C9\u30A6",
20308
+ editorPlaceholder: "\u3053\u3053\u306B\u30B3\u30DE\u30F3\u30C9\u3092\u5165\u529B...",
20309
+ editorClear: "\u30AF\u30EA\u30A2",
20310
+ editorSendWithEnter: "Enter \u3067\u9001\u4FE1",
20311
+ editorSendLineByLine: "1\u884C\u305A\u3064\u9001\u4FE1",
20312
+ editorSend: "\u9001\u4FE1",
20313
+ sendShortcut: "{{key}} \u3092\u9001\u4FE1",
20314
+ inputModeDirect: "\u76F4\u63A5\u5165\u529B",
20315
+ inputModeEditor: "\u30A8\u30C7\u30A3\u30BF",
20316
+ newWindow: "\u65B0\u898F\u30A6\u30A3\u30F3\u30C9\u30A6",
20317
+ closeWindow: "\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u9589\u3058\u308B",
20318
+ closePane: "\u30DA\u30A4\u30F3\u3092\u9589\u3058\u308B"
20319
+ },
20320
+ settings: {
20321
+ title: "\u30B7\u30B9\u30C6\u30E0\u8A2D\u5B9A",
20322
+ siteSettings: "\u30B5\u30A4\u30C8\u8A2D\u5B9A",
20323
+ siteName: "\u30B5\u30A4\u30C8\u540D",
20324
+ siteNamePlaceholder: "tmex",
20325
+ siteUrl: "\u30B5\u30A4\u30C8 URL",
20326
+ siteUrlPlaceholder: "http://localhost:3000",
20327
+ bellThrottle: "\u30D9\u30EB\u5236\u9650\uFF08\u79D2\uFF09",
20328
+ enableBrowserBellToast: "\u30D6\u30E9\u30A6\u30B6\u30D9\u30EB Toast \u3092\u6709\u52B9\u306B\u3059\u308B",
20329
+ enableTelegramBellPush: "Telegram \u30D9\u30EB\u30D7\u30C3\u30B7\u30E5\u3092\u6709\u52B9\u306B\u3059\u308B",
20330
+ sshReconnectRetries: "SSH \u518D\u63A5\u7D9A\u8A66\u884C\u56DE\u6570",
20331
+ sshReconnectDelay: "SSH \u518D\u63A5\u7D9A\u5F85\u6A5F\uFF08\u79D2\uFF09",
20332
+ language: "\u8A00\u8A9E",
20333
+ languagePlaceholder: "\u8A00\u8A9E\u3092\u9078\u629E",
20334
+ language_en_US: "English",
20335
+ language_zh_CN: "\u7B80\u4F53\u4E2D\u6587",
20336
+ language_ja_JP: "\u65E5\u672C\u8A9E",
20337
+ theme: "\u30C6\u30FC\u30DE",
20338
+ themeLight: "\u30E9\u30A4\u30C8",
20339
+ themeDark: "\u30C0\u30FC\u30AF",
20340
+ siteTab: "\u30B5\u30A4\u30C8",
20341
+ notificationsTab: "\u901A\u77E5",
20342
+ refreshToApply: "\u8A00\u8A9E\u5909\u66F4\u3092\u9069\u7528\u3059\u308B\u306B\u306F\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044",
20343
+ saveSettings: "\u8A2D\u5B9A\u3092\u4FDD\u5B58",
20344
+ settingsSaved: "\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F",
20345
+ saveFailed: "\u8A2D\u5B9A\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20346
+ loadFailed: "\u8A2D\u5B9A\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20347
+ restartGateway: "Gateway \u3092\u518D\u8D77\u52D5",
20348
+ restartScheduled: "Gateway \u306E\u518D\u8D77\u52D5\u304C\u4E88\u5B9A\u3055\u308C\u307E\u3057\u305F",
20349
+ restartConfirm: "Gateway \u3092\u518D\u8D77\u52D5\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F\u3059\u3079\u3066\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u63A5\u7D9A\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3059\u3002",
20350
+ restartFailed: "Gateway \u306E\u518D\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20351
+ sshReconnectMaxRetries: "SSH \u518D\u63A5\u7D9A\u8A66\u884C\u56DE\u6570"
20352
+ },
20353
+ telegram: {
20354
+ title: "Telegram Bot \u7BA1\u7406",
20355
+ botName: "Bot \u540D",
20356
+ botNamePlaceholder: "\u4F8B\uFF1Aops-bot",
20357
+ botToken: "Bot Token",
20358
+ botTokenPlaceholder: "123456:AA...",
20359
+ addBot: "Bot \u3092\u8FFD\u52A0",
20360
+ enableBot: "Bot \u3092\u6709\u52B9\u306B\u3059\u308B",
20361
+ allowAuthRequests: "\u8A8D\u8A3C\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u8A31\u53EF",
20362
+ pendingChats: "\u627F\u8A8D\u5F85\u3061",
20363
+ chats: "\u627F\u8A8D\u6E08\u307F",
20364
+ authorizedChats: "\u627F\u8A8D\u6E08\u307F",
20365
+ noPendingChats: "\u627F\u8A8D\u5F85\u3061\u306E\u30C1\u30E3\u30C3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093",
20366
+ noAuthorizedChats: "\u627F\u8A8D\u6E08\u307F\u306E\u30C1\u30E3\u30C3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093",
20367
+ approve: "\u627F\u8A8D",
20368
+ authorize: "\u8A8D\u8A3C",
20369
+ reject: "\u62D2\u5426",
20370
+ revokeAuth: "\u8A8D\u8A3C\u3092\u53D6\u308A\u6D88\u3059",
20371
+ testMessage: "\u30C6\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8",
20372
+ sendTestMessage: "\u30C6\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u4FE1",
20373
+ deleteBot: "Bot \u3092\u524A\u9664",
20374
+ tokenOptional: "Token\uFF08\u5909\u66F4\u3057\u306A\u3044\u5834\u5408\u306F\u7A7A\uFF09",
20375
+ tokenPlaceholder: "\u65B0\u3057\u3044 token \u3092\u5165\u529B",
20376
+ botCreated: "Bot \u3092\u4F5C\u6210\u3057\u307E\u3057\u305F",
20377
+ botUpdated: "Bot \u3092\u66F4\u65B0\u3057\u307E\u3057\u305F",
20378
+ botDeleted: "Bot \u3092\u524A\u9664\u3057\u307E\u3057\u305F",
20379
+ authApproved: "\u8A8D\u8A3C\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F",
20380
+ chatRemoved: "\u30C1\u30E3\u30C3\u30C8\u3092\u524A\u9664\u3057\u307E\u3057\u305F",
20381
+ testMessageSent: "\u30C6\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F",
20382
+ createFailed: "Bot \u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20383
+ updateFailed: "Bot \u306E\u66F4\u65B0\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20384
+ deleteFailed: "Bot \u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20385
+ approveFailed: "\u8A8D\u8A3C\u306E\u627F\u8A8D\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20386
+ removeFailed: "\u30C1\u30E3\u30C3\u30C8\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20387
+ testMessageFailed: "\u30C6\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u9001\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20388
+ loadBotsFailed: "Bot \u4E00\u89A7\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20389
+ loadChatsFailed: "\u30C1\u30E3\u30C3\u30C8\u4E00\u89A7\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20390
+ noBots: "Bot \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u307E\u305A\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20391
+ expand: "\u5C55\u958B",
20392
+ collapse: "\u6298\u308A\u305F\u305F\u3080",
20393
+ authCount: "\u627F\u8A8D\u6E08\u307F {{authorized}} / \u627F\u8A8D\u5F85\u3061 {{pending}}\uFF08\u6700\u5927 8\uFF09",
20394
+ chatId: "Chat ID",
20395
+ applyTime: "\u7533\u8ACB\u6642\u9593",
20396
+ gatewayOnline: "\uD83D\uDFE2 Gateway online @ {{siteName}}",
20397
+ authSuccess: "\u2705 \u627F\u8A8D\u3055\u308C\u307E\u3057\u305F\u3002\u901A\u77E5\u3092\u53D7\u4FE1\u3067\u304D\u307E\u3059\u3002",
20398
+ authPending: "\u23F3 \u8A8D\u8A3C\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F\u3002tmex \u8A2D\u5B9A\u30DA\u30FC\u30B8\u3067\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20399
+ authFailed: "\u274C \u8A8D\u8A3C\u30EA\u30AF\u30A8\u30B9\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20400
+ testMessageTemplate: `\uD83E\uDDEA \u30C6\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8
20401
+ \u30B5\u30A4\u30C8\uFF1A{{siteName}}
20402
+ \u6642\u9593\uFF1A{{time}}`,
20403
+ approveMessageTemplate: `\u2705 tmex \u3067\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F\u3002
20404
+ Bot\uFF1A{{botName}}
20405
+ \u6642\u9593\uFF1A{{time}}`,
20406
+ botNotFound: "Bot \u304C\u898B\u3064\u304B\u3089\u306A\u3044\u304B\u5229\u7528\u3067\u304D\u307E\u305B\u3093",
20407
+ botNotRunning: "Bot \u304C\u8D77\u52D5\u3057\u3066\u3044\u306A\u3044\u304B\u5229\u7528\u3067\u304D\u307E\u305B\u3093"
20408
+ },
20409
+ webhook: {
20410
+ title: "Webhooks",
20411
+ url: "Webhook URL",
20412
+ secret: "\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8",
20413
+ secretPlaceholder: "\u7F72\u540D\u306B\u4F7F\u7528\uFF08HMAC-SHA256\uFF09",
20414
+ enabled: "\u6709\u52B9",
20415
+ eventMask: "\u30A4\u30D9\u30F3\u30C8",
20416
+ add: "Webhook \u3092\u8FFD\u52A0",
20417
+ empty: "Webhook \u304C\u3042\u308A\u307E\u305B\u3093\u3002",
20418
+ createFailed: "Webhook \u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20419
+ deleteFailed: "Webhook \u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20420
+ loadFailed: "Webhook \u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F"
20421
+ },
20422
+ sshError: {
20423
+ sshConfigRefNotSupported: "\u3053\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3067\u306F SSH Config \u53C2\u7167\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002host + username \u3092\u4F7F\u7528\u3057\u3001Agent/\u79D8\u5BC6\u9375/\u30D1\u30B9\u30EF\u30FC\u30C9\u8A8D\u8A3C\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20424
+ configRefNotSupported: "\u3053\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3067\u306F SSH Config \u53C2\u7167\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002host + username \u3092\u4F7F\u7528\u3057\u3001Agent/\u79D8\u5BC6\u9375/\u30D1\u30B9\u30EF\u30FC\u30C9\u8A8D\u8A3C\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20425
+ agentUnavailable: "SSH Agent \u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\uFF1ASSH_AUTH_SOCK \u304C\u691C\u51FA\u3055\u308C\u307E\u305B\u3093\u3002agent \u74B0\u5883\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20426
+ agentNoIdentity: "SSH Agent \u306B\u5229\u7528\u53EF\u80FD\u306A\u9375\u304C\u3042\u308A\u307E\u305B\u3093\u3002ssh-add \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20427
+ agentNoIdentities: "SSH Agent \u306B\u5229\u7528\u53EF\u80FD\u306A\u9375\u304C\u3042\u308A\u307E\u305B\u3093\u3002ssh-add \u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20428
+ authFailed: "\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A\u30E6\u30FC\u30B6\u30FC\u540D\u3001\u30D1\u30B9\u30EF\u30FC\u30C9\u3001\u307E\u305F\u306F\u9375\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002\u30C7\u30D0\u30A4\u30B9\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20429
+ authFailedGeneric: "\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A\u30E6\u30FC\u30B6\u30FC\u540D\u3001\u30D1\u30B9\u30EF\u30FC\u30C9\u3001\u307E\u305F\u306F\u9375\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002\u30C7\u30D0\u30A4\u30B9\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20430
+ networkUnreachable: "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u306B\u5230\u9054\u3067\u304D\u307E\u305B\u3093\uFF1A\u30EB\u30FC\u30C6\u30A3\u30F3\u30B0\u3001\u30D5\u30A1\u30A4\u30A2\u30A6\u30A9\u30FC\u30EB\u3001\u307E\u305F\u306F VPN \u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20431
+ connectionRefused: "\u63A5\u7D9A\u304C\u62D2\u5426\u3055\u308C\u307E\u3057\u305F\uFF1A\u30BF\u30FC\u30B2\u30C3\u30C8\u30DB\u30B9\u30C8\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u30DB\u30B9\u30C8\u30A2\u30C9\u30EC\u30B9\u3068\u30DD\u30FC\u30C8\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20432
+ timeout: "\u63A5\u7D9A\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF1A\u30C7\u30D0\u30A4\u30B9\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u307E\u305F\u306F\u30D5\u30A1\u30A4\u30A2\u30A6\u30A9\u30FC\u30EB\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20433
+ connectionTimeout: "\u63A5\u7D9A\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF1A\u30C7\u30D0\u30A4\u30B9\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u307E\u305F\u306F\u30D5\u30A1\u30A4\u30A2\u30A6\u30A9\u30FC\u30EB\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20434
+ hostNotFound: "\u30DB\u30B9\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF1A\u30DB\u30B9\u30C8\u540D\u3092\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\u3002DNS \u307E\u305F\u306F\u30DB\u30B9\u30C8\u540D\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20435
+ handshakeFailed: "\u30CF\u30F3\u30C9\u30B7\u30A7\u30A4\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A\u5B89\u5168\u306A\u63A5\u7D9A\u3092\u78BA\u7ACB\u3067\u304D\u307E\u305B\u3093\u3002\u30AD\u30FC\u4EA4\u63DB\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u304C\u4E92\u63DB\u6027\u304C\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002",
20436
+ tmuxUnavailable: "\u30EA\u30E2\u30FC\u30C8 tmux \u304C\u5229\u7528\u3067\u304D\u306A\u3044\u304B\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002tmux \u304C\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C -CC \u30E2\u30FC\u30C9\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
20437
+ unknown: "\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{{message}}",
20438
+ reconnecting: "\u63A5\u7D9A\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F\u3002{{delay}} \u79D2\u5F8C\u306B\u518D\u63A5\u7D9A\u3057\u307E\u3059\uFF08{{attempt}}/{{maxRetries}}\uFF09",
20439
+ reconnectFailed: "\u81EA\u52D5\u518D\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u624B\u52D5\u3067\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044",
20440
+ reconnected: "\u30C7\u30D0\u30A4\u30B9\u304C\u81EA\u52D5\u7684\u306B\u518D\u63A5\u7D9A\u3055\u308C\u307E\u3057\u305F"
20441
+ },
20442
+ websocket: {
20443
+ error: "WebSocket \u63A5\u7D9A\u30A8\u30E9\u30FC",
20444
+ checkGateway: "Gateway \u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044",
20445
+ upgradeFailed: "\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
20446
+ invalidMessage: "\u7121\u52B9\u306A\u30E1\u30C3\u30BB\u30FC\u30B8\u5F62\u5F0F"
20447
+ },
20448
+ wsError: {
20449
+ checkGateway: "Gateway \u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044"
20450
+ },
20451
+ apiError: {
20452
+ siteNameRequired: "\u30B5\u30A4\u30C8\u540D\u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093",
20453
+ siteUrlInvalid: "\u30B5\u30A4\u30C8 URL \u306F http:// \u307E\u305F\u306F https:// \u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
20454
+ bellThrottleInvalid: "\u30D9\u30EB\u5236\u9650\u79D2\u6570\u306F 0-300 \u306E\u9593\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
20455
+ sshRetriesInvalid: "SSH \u518D\u63A5\u7D9A\u8A66\u884C\u56DE\u6570\u306F 0-20 \u306E\u9593\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
20456
+ sshDelayInvalid: "SSH \u518D\u63A5\u7D9A\u5F85\u6A5F\u6642\u9593\u306F 1-300 \u79D2\u306E\u9593\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
20457
+ languageInvalid: "\u8A00\u8A9E\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u30ED\u30B1\u30FC\u30EB\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
20458
+ botNameRequired: "Bot \u540D\u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093",
20459
+ botTokenRequired: "Bot token \u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093",
20460
+ missingFields: "\u5FC5\u9808\u30D5\u30A3\u30FC\u30EB\u30C9\u304C\u3042\u308A\u307E\u305B\u3093",
20461
+ sshRequiresHost: "SSH \u30C7\u30D0\u30A4\u30B9\u306B\u306F host \u307E\u305F\u306F sshConfigRef \u304C\u5FC5\u8981\u3067\u3059",
20462
+ invalidRequest: "\u7121\u52B9\u306A\u30EA\u30AF\u30A8\u30B9\u30C8",
20463
+ deviceNotFound: "\u30C7\u30D0\u30A4\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",
20464
+ botNotFound: "Bot \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",
20465
+ chatNotFound: "\u30C1\u30E3\u30C3\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",
20466
+ urlAndSecretRequired: "URL \u3068\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u304C\u5FC5\u8981\u3067\u3059",
20467
+ notFound: "\u898B\u3064\u304B\u308A\u307E\u305B\u3093"
20468
+ },
20469
+ notification: {
20470
+ clickToJump: "\u5BFE\u5FDC\u3059\u308B\u30DA\u30A4\u30F3\u306B\u30B8\u30E3\u30F3\u30D7",
20471
+ eventType: {
20472
+ terminal_bell: "\uD83D\uDD14 \u30BF\u30FC\u30DF\u30CA\u30EB\u30D9\u30EB",
20473
+ tmux_window_close: "\uD83E\uDE9F \u30A6\u30A3\u30F3\u30C9\u30A6\u9589\u3058\u308B",
20474
+ tmux_pane_close: "\uD83D\uDCF1 \u30DA\u30A4\u30F3\u9589\u3058\u308B",
20475
+ device_tmux_missing: "\u26A0\uFE0F Tmux \u304C\u3042\u308A\u307E\u305B\u3093",
20476
+ device_disconnect: "\uD83D\uDD0C \u30C7\u30D0\u30A4\u30B9\u5207\u65AD",
20477
+ session_created: "\uD83C\uDD95 \u30BB\u30C3\u30B7\u30E7\u30F3\u4F5C\u6210",
20478
+ session_closed: "\uD83D\uDEAA \u30BB\u30C3\u30B7\u30E7\u30F3\u9589\u3058\u308B"
20479
+ },
20480
+ site: "\u30B5\u30A4\u30C8",
20481
+ device: "\u30C7\u30D0\u30A4\u30B9",
20482
+ window: "\u30A6\u30A3\u30F3\u30C9\u30A6",
20483
+ pane: "\u30DA\u30A4\u30F3",
20484
+ time: "\u6642\u9593",
20485
+ directLink: "\u76F4\u63A5\u30EA\u30F3\u30AF",
20486
+ message: "\u30E1\u30C3\u30BB\u30FC\u30B8",
20487
+ telegramBell: {
20488
+ title: "\uD83D\uDD14 {{siteName}} \u304B\u3089\u306E\u30D9\u30EB\uFF1A{{terminalTopbarLabel}}",
20489
+ viewLink: "\u8868\u793A",
20490
+ terminalTopbarLabel: "\u30A6\u30A3\u30F3\u30C9\u30A6 {{window}} \xB7 \u30DA\u30A4\u30F3 {{pane}} @ {{device}}"
20491
+ }
20492
+ },
20493
+ sidebar: {
20494
+ noWindows: "\u30A6\u30A3\u30F3\u30C9\u30A6\u304C\u3042\u308A\u307E\u305B\u3093",
20495
+ noDevices: "\u30C7\u30D0\u30A4\u30B9\u304C\u3042\u308A\u307E\u305B\u3093",
20496
+ addDeviceLink: "\u30C7\u30D0\u30A4\u30B9\u3092\u8FFD\u52A0",
20497
+ openSettingsLink: "\u8A2D\u5B9A\u3092\u958B\u304F",
20498
+ openSettings: "\u8A2D\u5B9A\u3092\u958B\u304F",
20499
+ manageDevices: "\u30C7\u30D0\u30A4\u30B9\u7BA1\u7406",
20500
+ settings: "\u8A2D\u5B9A",
20501
+ currentWindow: "\u73FE\u5728\u306E\u30A6\u30A3\u30F3\u30C9\u30A6",
20502
+ currentPane: "\u73FE\u5728\u306E\u30DA\u30A4\u30F3",
20503
+ newWindow: "\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u4F5C\u6210",
20504
+ closeWindow: "\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u9589\u3058\u308B",
20505
+ closePane: "\u30DA\u30A4\u30F3\u3092\u9589\u3058\u308B",
20506
+ addDevice: "\u30C7\u30D0\u30A4\u30B9\u3092\u8FFD\u52A0"
20507
+ },
20508
+ validation: {
20509
+ deviceNameRequired: "\u30C7\u30D0\u30A4\u30B9\u540D\u306F\u5FC5\u9808\u3067\u3059",
20510
+ hostRequired: "SSH \u30C7\u30D0\u30A4\u30B9\u306B\u306F\u30DB\u30B9\u30C8\u30A2\u30C9\u30EC\u30B9\u304C\u5FC5\u8981\u3067\u3059"
20511
+ }
20512
+ }
20137
20513
  }
20138
20514
  };
20139
-
20140
- // ../shared/src/index.ts
20141
20515
  var DEFAULT_LOCALE = "en_US";
20142
20516
  function toBCP47(locale) {
20143
20517
  return locale.replace("_", "-");
20144
20518
  }
20145
-
20519
+ var AVAILABLE_LOCALES = ["en_US", "zh_CN", "ja_JP"];
20146
20520
  // ../../node_modules/.bun/uuid@11.1.0/node_modules/uuid/dist/esm/stringify.js
20147
20521
  var byteToHex = [];
20148
20522
  for (let i = 0;i < 256; ++i) {
@@ -26673,8 +27047,7 @@ var siteSettings = sqliteTable("site_settings", {
26673
27047
  language: text("language").notNull().default("en_US"),
26674
27048
  updatedAt: text("updated_at").notNull()
26675
27049
  }, (table) => [
26676
- check("site_settings_singleton_check", sql`${table.id} = 1`),
26677
- check("site_settings_language_check", sql`${table.language} in ('en_US', 'zh_CN')`)
27050
+ check("site_settings_singleton_check", sql`${table.id} = 1`)
26678
27051
  ]);
26679
27052
  var devices = sqliteTable("devices", {
26680
27053
  id: text("id").primaryKey(),
@@ -51440,7 +51813,7 @@ function normalizeSiteSettingsInput(body) {
51440
51813
  }
51441
51814
  if (body.language !== undefined) {
51442
51815
  const value = body.language.trim();
51443
- if (value !== "en_US" && value !== "zh_CN") {
51816
+ if (!AVAILABLE_LOCALES.includes(value)) {
51444
51817
  throw new Error(t2("apiError.languageInvalid"));
51445
51818
  }
51446
51819
  updates.language = value;
@@ -51510,6 +51883,9 @@ function handleApiRequest(req, _server) {
51510
51883
  if (path.match(/^\/api\/webhooks\/[^/]+$/) && req.method === "DELETE") {
51511
51884
  return handleDeleteWebhook(path.split("/")[3]);
51512
51885
  }
51886
+ if (path === "/api/manifest.webmanifest" && (req.method === "GET" || req.method === "HEAD")) {
51887
+ return handleGetManifest(req.method);
51888
+ }
51513
51889
  if (path === "/healthz" && req.method === "GET") {
51514
51890
  return json({ status: "ok", restarting: runtimeController.isRestarting() });
51515
51891
  }
@@ -51768,6 +52144,37 @@ async function handleDeleteWebhook(id) {
51768
52144
  deleteWebhookEndpoint(id);
51769
52145
  return json({ success: true });
51770
52146
  }
52147
+ async function handleGetManifest(method) {
52148
+ const settings = getSiteSettings();
52149
+ const manifest = {
52150
+ id: "/",
52151
+ name: settings.siteName,
52152
+ short_name: settings.siteName,
52153
+ start_url: "/",
52154
+ scope: "/",
52155
+ display: "standalone",
52156
+ background_color: "#0b1020",
52157
+ theme_color: "#0b1020",
52158
+ icons: [
52159
+ {
52160
+ src: "/tmex.png",
52161
+ sizes: "768x768",
52162
+ type: "image/png",
52163
+ purpose: "any maskable"
52164
+ }
52165
+ ]
52166
+ };
52167
+ return manifestJson(manifest, method);
52168
+ }
52169
+ function manifestJson(data, method) {
52170
+ return new Response(method === "HEAD" ? null : JSON.stringify(data), {
52171
+ status: 200,
52172
+ headers: {
52173
+ "Content-Type": "application/manifest+json; charset=utf-8",
52174
+ "Cache-Control": "no-store"
52175
+ }
52176
+ });
52177
+ }
51771
52178
  function json(data, status = 200, headers = {}) {
51772
52179
  return new Response(JSON.stringify(data), {
51773
52180
  status,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tmex-cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "tmex": "./bin/tmex.js",
@@ -21,7 +21,8 @@
21
21
  "build:runtime": "bun build src/runtime/server.ts --outdir ./dist/runtime --target bun --format esm",
22
22
  "build:cli": "bun build src/cli-node.ts --outfile ./dist/cli-node.js --target node --format esm",
23
23
  "build": "bun run clean && bun run bundle:resources && bun run build:runtime && bun run build:cli",
24
- "test": "bun test src"
24
+ "test": "bun test src",
25
+ "publish": "bun publish"
25
26
  },
26
27
  "devDependencies": {
27
28
  "@types/bun": "latest",
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility,.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}