tmex-cli 0.13.0 → 0.14.0

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 (80) hide show
  1. package/CHANGELOG.md +16 -10
  2. package/dist/cli-node.js +492 -87
  3. package/dist/runtime/server.js +275 -32
  4. package/package.json +1 -1
  5. package/resources/fe-dist/assets/{DevicePage-Cj9jwadE.js → DevicePage-Ctq31eWb.js} +1 -1
  6. package/resources/fe-dist/assets/DevicesPage-DGo44NW0.js +1 -0
  7. package/resources/fe-dist/assets/{FilePage-CbHZVJbn.js → FilePage-BpubOqjN.js} +1 -1
  8. package/resources/fe-dist/assets/{SettingsPage-CCV0NSQF.js → SettingsPage-QT6fy6XA.js} +1 -1
  9. package/resources/fe-dist/assets/{agent-tab-DPwxh08T.js → agent-tab-A2FeMPwL.js} +1 -1
  10. package/resources/fe-dist/assets/{api-DlcFE5in.js → api-CGfOwFKm.js} +1 -1
  11. package/resources/fe-dist/assets/{arc-Bzmm6y8F.js → arc-B2dphCVi.js} +1 -1
  12. package/resources/fe-dist/assets/{architectureDiagram-3BPJPVTR-BdsN6XRe.js → architectureDiagram-3BPJPVTR-BpvEhd8M.js} +1 -1
  13. package/resources/fe-dist/assets/{blockDiagram-GPEHLZMM-CXdQhkqo.js → blockDiagram-GPEHLZMM-CI_NnIJz.js} +1 -1
  14. package/resources/fe-dist/assets/{c4Diagram-AAUBKEIU-CE_W2_pV.js → c4Diagram-AAUBKEIU-Y6RrOc7Y.js} +1 -1
  15. package/resources/fe-dist/assets/{card-B_sl9KIo.js → card-CydUB3N3.js} +1 -1
  16. package/resources/fe-dist/assets/channel-Ce3VMo9B.js +1 -0
  17. package/resources/fe-dist/assets/{chunk-2J33WTMH-BAdEIJQO.js → chunk-2J33WTMH-BQN_fYaa.js} +1 -1
  18. package/resources/fe-dist/assets/{chunk-4BX2VUAB-BZ0yj21c.js → chunk-4BX2VUAB-BExarxjk.js} +1 -1
  19. package/resources/fe-dist/assets/{chunk-55IACEB6-BknLtkSo.js → chunk-55IACEB6-DeOEgcn_.js} +1 -1
  20. package/resources/fe-dist/assets/{chunk-727SXJPM-CxVON9n5.js → chunk-727SXJPM-CwkxCtPA.js} +1 -1
  21. package/resources/fe-dist/assets/{chunk-AQP2D5EJ-CLqOK2pR.js → chunk-AQP2D5EJ-_IoTtvOb.js} +1 -1
  22. package/resources/fe-dist/assets/{chunk-FMBD7UC4-Dt5Vot-R.js → chunk-FMBD7UC4-6pvmQ3Lj.js} +1 -1
  23. package/resources/fe-dist/assets/{chunk-ND2GUHAM-t9HYlb8C.js → chunk-ND2GUHAM-CxpGf5zM.js} +1 -1
  24. package/resources/fe-dist/assets/{chunk-QZHKN3VN-DZReNtLB.js → chunk-QZHKN3VN-DOMH0v_e.js} +1 -1
  25. package/resources/fe-dist/assets/classDiagram-4FO5ZUOK-BjK-bnh-.js +1 -0
  26. package/resources/fe-dist/assets/classDiagram-v2-Q7XG4LA2-BjK-bnh-.js +1 -0
  27. package/resources/fe-dist/assets/{copy-Z9Fsj1r-.js → copy-DnlW35bA.js} +1 -1
  28. package/resources/fe-dist/assets/{cose-bilkent-S5V4N54A-BCTtGF2n.js → cose-bilkent-S5V4N54A-D03NElzH.js} +1 -1
  29. package/resources/fe-dist/assets/{dagre-BM42HDAG-BQ48EqSj.js → dagre-BM42HDAG-CVOxLhKQ.js} +1 -1
  30. package/resources/fe-dist/assets/{diagram-2AECGRRQ-BXjt2moR.js → diagram-2AECGRRQ-p564GAo-.js} +1 -1
  31. package/resources/fe-dist/assets/{diagram-5GNKFQAL-B2bvNTQO.js → diagram-5GNKFQAL-C_pgnQLt.js} +1 -1
  32. package/resources/fe-dist/assets/{diagram-KO2AKTUF-DLHWfbBH.js → diagram-KO2AKTUF-B36jioML.js} +1 -1
  33. package/resources/fe-dist/assets/{diagram-LMA3HP47-BCFT3Bur.js → diagram-LMA3HP47-B8P4WWeq.js} +1 -1
  34. package/resources/fe-dist/assets/{diagram-OG6HWLK6-bNZtxUJ2.js → diagram-OG6HWLK6-CTL4zJlz.js} +1 -1
  35. package/resources/fe-dist/assets/en_US-DRPd4vPi.js +1 -0
  36. package/resources/fe-dist/assets/{erDiagram-TEJ5UH35-KoAzrx4j.js → erDiagram-TEJ5UH35-DbKPL3Fa.js} +1 -1
  37. package/resources/fe-dist/assets/{files-tab-DdBDTjfs.js → files-tab-CeUM00x8.js} +1 -1
  38. package/resources/fe-dist/assets/{flowDiagram-I6XJVG4X-C6wGExWt.js → flowDiagram-I6XJVG4X-DvOU6wtN.js} +1 -1
  39. package/resources/fe-dist/assets/{ganttDiagram-6RSMTGT7-BIWybjes.js → ganttDiagram-6RSMTGT7-CwgNky8L.js} +1 -1
  40. package/resources/fe-dist/assets/{gitGraphDiagram-PVQCEYII-CD6tz24l.js → gitGraphDiagram-PVQCEYII-B3U-hNGe.js} +1 -1
  41. package/resources/fe-dist/assets/{index-CwH-l50P.js → index-DAElYydw.js} +59 -59
  42. package/resources/fe-dist/assets/{index-CUCrFB_J.js → index-DBHh6Xu1.js} +1 -1
  43. package/resources/fe-dist/assets/{infoDiagram-5YYISTIA-CrI-qlYw.js → infoDiagram-5YYISTIA-BmcWF7v1.js} +1 -1
  44. package/resources/fe-dist/assets/{ishikawaDiagram-YF4QCWOH-D9v5anxN.js → ishikawaDiagram-YF4QCWOH-Dr8C0MtS.js} +1 -1
  45. package/resources/fe-dist/assets/ja_JP-DHREHMZZ.js +1 -0
  46. package/resources/fe-dist/assets/{journeyDiagram-JHISSGLW-BH38CiJ0.js → journeyDiagram-JHISSGLW-DzlvXb4K.js} +1 -1
  47. package/resources/fe-dist/assets/{kanban-definition-UN3LZRKU-CKZ3_oXD.js → kanban-definition-UN3LZRKU-4aBWZlcm.js} +1 -1
  48. package/resources/fe-dist/assets/{linear-C_oE01xA.js → linear-_wXLepjd.js} +1 -1
  49. package/resources/fe-dist/assets/{markdown-preview-BtNbNwlP.js → markdown-preview-BX0o83rG.js} +3 -3
  50. package/resources/fe-dist/assets/{mermaid.core-4dbvlhht.js → mermaid.core-DoE3dx_X.js} +5 -5
  51. package/resources/fe-dist/assets/{mindmap-definition-RKZ34NQL-C5o4mnnX.js → mindmap-definition-RKZ34NQL-CKpq2s43.js} +1 -1
  52. package/resources/fe-dist/assets/{pieDiagram-4H26LBE5-2ss3HotB.js → pieDiagram-4H26LBE5-DlW1TLza.js} +1 -1
  53. package/resources/fe-dist/assets/{quadrantDiagram-W4KKPZXB-Bolcfx55.js → quadrantDiagram-W4KKPZXB-NEwxpMVe.js} +1 -1
  54. package/resources/fe-dist/assets/{requirementDiagram-4Y6WPE33-B-atSHRR.js → requirementDiagram-4Y6WPE33-CGysr6uH.js} +1 -1
  55. package/resources/fe-dist/assets/{sankeyDiagram-5OEKKPKP-ByynRcAV.js → sankeyDiagram-5OEKKPKP-j8yXOgys.js} +1 -1
  56. package/resources/fe-dist/assets/{send-D0P5wgcD.js → send-BtOPYsPT.js} +1 -1
  57. package/resources/fe-dist/assets/{sequenceDiagram-3UESZ5HK-CNC9IxV4.js → sequenceDiagram-3UESZ5HK-BRPWK9ZU.js} +1 -1
  58. package/resources/fe-dist/assets/{stateDiagram-AJRCARHV-CqzYDImp.js → stateDiagram-AJRCARHV-C8ckQlA7.js} +1 -1
  59. package/resources/fe-dist/assets/stateDiagram-v2-BHNVJYJU-Cm0vyyJy.js +1 -0
  60. package/resources/fe-dist/assets/{terminal-settings-panel-cjw9P_wY.js → terminal-settings-panel-ZnL_cBER.js} +1 -1
  61. package/resources/fe-dist/assets/{timeline-definition-PNZ67QCA-C38KIECs.js → timeline-definition-PNZ67QCA-BXMFPa99.js} +1 -1
  62. package/resources/fe-dist/assets/{transfer-toast-5tb-zYhi.js → transfer-toast-CUkPc73G.js} +1 -1
  63. package/resources/fe-dist/assets/{triangle-alert-CQzql6mY.js → triangle-alert-DyM9tU7d.js} +1 -1
  64. package/resources/fe-dist/assets/{vennDiagram-CIIHVFJN-BJudKfzJ.js → vennDiagram-CIIHVFJN-Bk8oPY9E.js} +1 -1
  65. package/resources/fe-dist/assets/{wardley-L42UT6IY-B6p_luMy.js → wardley-L42UT6IY-Bi_GTP2_.js} +1 -1
  66. package/resources/fe-dist/assets/{wardleyDiagram-YWT4CUSO-DZJeOiWQ.js → wardleyDiagram-YWT4CUSO-CaPDmxFM.js} +1 -1
  67. package/resources/fe-dist/assets/{xychartDiagram-2RQKCTM6-DOMCute2.js → xychartDiagram-2RQKCTM6-EHogasXy.js} +1 -1
  68. package/resources/fe-dist/assets/{zap-DWNtdoic.js → zap-CBgYyGBV.js} +1 -1
  69. package/resources/fe-dist/assets/zh_CN-DMEKXuFd.js +1 -0
  70. package/resources/fe-dist/index.html +1 -1
  71. package/resources/gateway-drizzle/0011_stormy_sauron.sql +1 -0
  72. package/resources/gateway-drizzle/meta/_journal.json +7 -0
  73. package/resources/fe-dist/assets/DevicesPage-BbypaGC7.js +0 -1
  74. package/resources/fe-dist/assets/channel-CuapxAWT.js +0 -1
  75. package/resources/fe-dist/assets/classDiagram-4FO5ZUOK-C0k136Ud.js +0 -1
  76. package/resources/fe-dist/assets/classDiagram-v2-Q7XG4LA2-C0k136Ud.js +0 -1
  77. package/resources/fe-dist/assets/en_US-B07wSHDj.js +0 -1
  78. package/resources/fe-dist/assets/ja_JP-DjF6Lrmx.js +0 -1
  79. package/resources/fe-dist/assets/stateDiagram-v2-BHNVJYJU-C3azxyWE.js +0 -1
  80. package/resources/fe-dist/assets/zh_CN-D10j4J8Y.js +0 -1
@@ -22654,6 +22654,8 @@ var I18N_RESOURCES = {
22654
22654
  session: "Tmux Session Name",
22655
22655
  sessionPlaceholder: "tmex",
22656
22656
  sessionHint: 'Leave empty to use default "tmex"',
22657
+ defaultWorkingDir: "Default Working Directory",
22658
+ defaultWorkingDirPlaceholder: "Leave empty for user home directory",
22657
22659
  authMode: "Authentication Mode",
22658
22660
  authPassword: "Password",
22659
22661
  authKey: "Private Key",
@@ -22708,9 +22710,12 @@ var I18N_RESOURCES = {
22708
22710
  noDeviceSelected: "No device selected",
22709
22711
  windowClosed: "Current window has been closed, please select a window from the sidebar.",
22710
22712
  paneClosed: "Current pane has been closed, please select a pane from the sidebar.",
22711
- bellNotification: "Terminal Bell Notification",
22712
- bellDescription: "Window {{window}} \xB7 Pane {{pane}}",
22713
+ bellNotification: "Terminal Bell",
22714
+ bellDescriptionWithTitle: "Window {{window}} \xB7 {{paneLabel}}",
22713
22715
  bellFallback: "Received tmux bell",
22716
+ notificationFallbackTitle: "Terminal Notification",
22717
+ notificationSourceLabel: "From {{source}}",
22718
+ notificationFallbackDetail: "Terminal notification",
22714
22719
  paneTitle: "Pane {{index}}",
22715
22720
  activePane: "Current Pane",
22716
22721
  activeWindow: "Current Window",
@@ -23645,6 +23650,8 @@ Time: {{time}}`,
23645
23650
  session: "Tmux \u4F1A\u8BDD\u540D\u79F0",
23646
23651
  sessionPlaceholder: "tmex",
23647
23652
  sessionHint: '\u7559\u7A7A\u5C06\u4F7F\u7528\u9ED8\u8BA4\u503C "tmex"',
23653
+ defaultWorkingDir: "\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55",
23654
+ defaultWorkingDirPlaceholder: "\u7559\u7A7A\u4F7F\u7528\u7528\u6237 home \u76EE\u5F55",
23648
23655
  authMode: "\u8BA4\u8BC1\u65B9\u5F0F",
23649
23656
  authPassword: "\u5BC6\u7801",
23650
23657
  authKey: "\u79C1\u94A5",
@@ -23699,9 +23706,12 @@ Time: {{time}}`,
23699
23706
  noDeviceSelected: "\u672A\u9009\u62E9\u8BBE\u5907",
23700
23707
  windowClosed: "\u5F53\u524D\u7A97\u53E3\u5DF2\u5173\u95ED\uFF0C\u8BF7\u5728\u4FA7\u8FB9\u680F\u91CD\u65B0\u9009\u62E9\u7A97\u53E3\u3002",
23701
23708
  paneClosed: "\u5F53\u524D Pane \u5DF2\u5173\u95ED\uFF0C\u8BF7\u5728\u4FA7\u8FB9\u680F\u91CD\u65B0\u9009\u62E9 Pane\u3002",
23702
- bellNotification: "\u7EC8\u7AEF Bell \u63D0\u9192",
23703
- bellDescription: "\u7A97\u53E3 {{window}} \xB7 Pane {{pane}}",
23709
+ bellNotification: "\u7EC8\u7AEF Bell",
23710
+ bellDescriptionWithTitle: "\u7A97\u53E3 {{window}} \xB7 {{paneLabel}}",
23704
23711
  bellFallback: "\u6536\u5230 tmux bell",
23712
+ notificationFallbackTitle: "\u7EC8\u7AEF\u901A\u77E5",
23713
+ notificationSourceLabel: "\u6765\u81EA {{source}}",
23714
+ notificationFallbackDetail: "\u7EC8\u7AEF\u901A\u77E5",
23705
23715
  paneTitle: "Pane {{index}}",
23706
23716
  activePane: "\u5F53\u524D pane",
23707
23717
  activeWindow: "\u5F53\u524D\u7A97\u53E3",
@@ -24636,6 +24646,8 @@ Bot\uFF1A{{botName}}
24636
24646
  session: "Tmux \u30BB\u30C3\u30B7\u30E7\u30F3\u540D",
24637
24647
  sessionPlaceholder: "tmex",
24638
24648
  sessionHint: "\u7A7A\u306E\u5834\u5408\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u300Ctmex\u300D\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059",
24649
+ defaultWorkingDir: "\u30C7\u30D5\u30A9\u30EB\u30C8\u4F5C\u696D\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA",
24650
+ defaultWorkingDirPlaceholder: "\u7A7A\u306E\u5834\u5408\u3001\u30E6\u30FC\u30B6\u30FC\u306E\u30DB\u30FC\u30E0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F7F\u7528",
24639
24651
  authMode: "\u8A8D\u8A3C\u30E2\u30FC\u30C9",
24640
24652
  authPassword: "\u30D1\u30B9\u30EF\u30FC\u30C9",
24641
24653
  authKey: "\u79D8\u5BC6\u9375",
@@ -24690,9 +24702,12 @@ Bot\uFF1A{{botName}}
24690
24702
  noDeviceSelected: "\u30C7\u30D0\u30A4\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
24691
24703
  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",
24692
24704
  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",
24693
- bellNotification: "\u30BF\u30FC\u30DF\u30CA\u30EB\u30D9\u30EB\u901A\u77E5",
24694
- bellDescription: "\u30A6\u30A3\u30F3\u30C9\u30A6 {{window}} \xB7 \u30DA\u30A4\u30F3 {{pane}}",
24705
+ bellNotification: "\u30BF\u30FC\u30DF\u30CA\u30EB\u30D9\u30EB",
24706
+ bellDescriptionWithTitle: "\u30A6\u30A3\u30F3\u30C9\u30A6 {{window}} \xB7 {{paneLabel}}",
24695
24707
  bellFallback: "tmux \u30D9\u30EB\u3092\u53D7\u4FE1",
24708
+ notificationFallbackTitle: "\u30BF\u30FC\u30DF\u30CA\u30EB\u901A\u77E5",
24709
+ notificationSourceLabel: "{{source}} \u304B\u3089",
24710
+ notificationFallbackDetail: "\u30BF\u30FC\u30DF\u30CA\u30EB\u901A\u77E5",
24696
24711
  paneTitle: "\u30DA\u30A4\u30F3 {{index}}",
24697
24712
  activePane: "\u73FE\u5728\u306E\u30DA\u30A4\u30F3",
24698
24713
  activeWindow: "\u73FE\u5728\u306E\u30A6\u30A3\u30F3\u30C9\u30A6",
@@ -25627,6 +25642,7 @@ __export(exports_ws_borsh, {
25627
25642
  KIND_DEVICE_DISCONNECT: () => KIND_DEVICE_DISCONNECT,
25628
25643
  KIND_DEVICE_CONNECTED: () => KIND_DEVICE_CONNECTED,
25629
25644
  KIND_DEVICE_CONNECT: () => KIND_DEVICE_CONNECT,
25645
+ KIND_CLIPBOARD_WRITE: () => KIND_CLIPBOARD_WRITE,
25630
25646
  KIND_CHUNK: () => KIND_CHUNK,
25631
25647
  KIND_AGENT_UNSUBSCRIBE: () => KIND_AGENT_UNSUBSCRIBE,
25632
25648
  KIND_AGENT_SUBSCRIBE: () => KIND_AGENT_SUBSCRIBE,
@@ -25698,6 +25714,7 @@ var KIND_TERM_RESIZE = 771;
25698
25714
  var KIND_TERM_SYNC_SIZE = 772;
25699
25715
  var KIND_TERM_OUTPUT = 773;
25700
25716
  var KIND_TERM_HISTORY = 774;
25717
+ var KIND_CLIPBOARD_WRITE = 775;
25701
25718
  var KIND_SWITCH_ACK = 1025;
25702
25719
  var KIND_LIVE_RESUME = 1026;
25703
25720
  var KIND_CHUNK = 1281;
@@ -25734,6 +25751,7 @@ var VALID_KINDS = new Set([
25734
25751
  KIND_TERM_SYNC_SIZE,
25735
25752
  KIND_TERM_OUTPUT,
25736
25753
  KIND_TERM_HISTORY,
25754
+ KIND_CLIPBOARD_WRITE,
25737
25755
  KIND_SWITCH_ACK,
25738
25756
  KIND_LIVE_RESUME,
25739
25757
  KIND_CHUNK,
@@ -25775,6 +25793,7 @@ function kindToString(kind) {
25775
25793
  [KIND_TERM_SYNC_SIZE]: "TERM_SYNC_SIZE",
25776
25794
  [KIND_TERM_OUTPUT]: "TERM_OUTPUT",
25777
25795
  [KIND_TERM_HISTORY]: "TERM_HISTORY",
25796
+ [KIND_CLIPBOARD_WRITE]: "CLIPBOARD_WRITE",
25778
25797
  [KIND_SWITCH_ACK]: "SWITCH_ACK",
25779
25798
  [KIND_LIVE_RESUME]: "LIVE_RESUME",
25780
25799
  [KIND_CHUNK]: "CHUNK",
@@ -25892,6 +25911,7 @@ __export(exports_schema, {
25892
25911
  DeviceDisconnectSchema: () => DeviceDisconnectSchema,
25893
25912
  DeviceConnectedSchema: () => DeviceConnectedSchema,
25894
25913
  DeviceConnectSchema: () => DeviceConnectSchema,
25914
+ ClipboardWriteSchema: () => ClipboardWriteSchema,
25895
25915
  ChunkSchema: () => ChunkSchema,
25896
25916
  BellEventSchema: () => BellEventSchema,
25897
25917
  AgentUnsubscribeSchema: () => AgentUnsubscribeSchema,
@@ -26037,6 +26057,11 @@ var TermHistorySchema = import_zorsh.b.struct({
26037
26057
  alternateScreen: import_zorsh.b.bool(),
26038
26058
  data: import_zorsh.b.bytes()
26039
26059
  });
26060
+ var ClipboardWriteSchema = import_zorsh.b.struct({
26061
+ deviceId: import_zorsh.b.string(),
26062
+ paneId: import_zorsh.b.string(),
26063
+ text: import_zorsh.b.string()
26064
+ });
26040
26065
  var SwitchAckSchema = import_zorsh.b.struct({
26041
26066
  deviceId: import_zorsh.b.string(),
26042
26067
  windowId: import_zorsh.b.string(),
@@ -26141,7 +26166,9 @@ var BellEventSchema = import_zorsh.b.struct({
26141
26166
  paneId: OptionStringSchema,
26142
26167
  windowIndex: OptionU16Schema,
26143
26168
  paneIndex: OptionU16Schema,
26144
- paneUrl: OptionStringSchema
26169
+ paneUrl: OptionStringSchema,
26170
+ paneTitle: OptionStringSchema,
26171
+ paneCurrentCommand: OptionStringSchema
26145
26172
  });
26146
26173
  var NotificationEventSchema = import_zorsh.b.struct({
26147
26174
  source: import_zorsh.b.u8(),
@@ -26151,7 +26178,9 @@ var NotificationEventSchema = import_zorsh.b.struct({
26151
26178
  paneId: OptionStringSchema,
26152
26179
  windowIndex: OptionU16Schema,
26153
26180
  paneIndex: OptionU16Schema,
26154
- paneUrl: OptionStringSchema
26181
+ paneUrl: OptionStringSchema,
26182
+ paneTitle: OptionStringSchema,
26183
+ paneCurrentCommand: OptionStringSchema
26155
26184
  });
26156
26185
  // ../shared/src/ws-borsh/codec.ts
26157
26186
  var MAGIC = new Uint8Array([84, 88]);
@@ -26468,7 +26497,9 @@ function encodeEventData(type, data) {
26468
26497
  paneId: d.paneId ?? null,
26469
26498
  windowIndex: d.windowIndex ?? null,
26470
26499
  paneIndex: d.paneIndex ?? null,
26471
- paneUrl: d.paneUrl ?? null
26500
+ paneUrl: d.paneUrl ?? null,
26501
+ paneTitle: d.paneTitle ?? null,
26502
+ paneCurrentCommand: d.paneCurrentCommand ?? null
26472
26503
  });
26473
26504
  }
26474
26505
  case "output":
@@ -26483,7 +26514,9 @@ function encodeEventData(type, data) {
26483
26514
  paneId: d.paneId ?? null,
26484
26515
  windowIndex: d.windowIndex ?? null,
26485
26516
  paneIndex: d.paneIndex ?? null,
26486
- paneUrl: d.paneUrl ?? null
26517
+ paneUrl: d.paneUrl ?? null,
26518
+ paneTitle: d.paneTitle ?? null,
26519
+ paneCurrentCommand: d.paneCurrentCommand ?? null
26487
26520
  });
26488
26521
  }
26489
26522
  default:
@@ -26594,7 +26627,9 @@ function decodeEventData(type, data) {
26594
26627
  paneId: bell.paneId ?? undefined,
26595
26628
  windowIndex: bell.windowIndex ?? undefined,
26596
26629
  paneIndex: bell.paneIndex ?? undefined,
26597
- paneUrl: bell.paneUrl ?? undefined
26630
+ paneUrl: bell.paneUrl ?? undefined,
26631
+ paneTitle: bell.paneTitle ?? undefined,
26632
+ paneCurrentCommand: bell.paneCurrentCommand ?? undefined
26598
26633
  };
26599
26634
  }
26600
26635
  case "notification": {
@@ -26607,7 +26642,9 @@ function decodeEventData(type, data) {
26607
26642
  paneId: notification.paneId ?? undefined,
26608
26643
  windowIndex: notification.windowIndex ?? undefined,
26609
26644
  paneIndex: notification.paneIndex ?? undefined,
26610
- paneUrl: notification.paneUrl ?? undefined
26645
+ paneUrl: notification.paneUrl ?? undefined,
26646
+ paneTitle: notification.paneTitle ?? undefined,
26647
+ paneCurrentCommand: notification.paneCurrentCommand ?? undefined
26611
26648
  };
26612
26649
  }
26613
26650
  default:
@@ -33148,6 +33185,7 @@ var devices = sqliteTable("devices", {
33148
33185
  passwordEnc: text("password_enc"),
33149
33186
  privateKeyEnc: text("private_key_enc"),
33150
33187
  privateKeyPassphraseEnc: text("private_key_passphrase_enc"),
33188
+ defaultWorkingDir: text("default_working_dir"),
33151
33189
  sortOrder: integer("sort_order").notNull().default(0),
33152
33190
  createdAt: text("created_at").notNull(),
33153
33191
  updatedAt: text("updated_at").notNull()
@@ -33401,6 +33439,7 @@ function toDevice(row) {
33401
33439
  passwordEnc: optional(row.passwordEnc),
33402
33440
  privateKeyEnc: optional(row.privateKeyEnc),
33403
33441
  privateKeyPassphraseEnc: optional(row.privateKeyPassphraseEnc),
33442
+ defaultWorkingDir: optional(row.defaultWorkingDir),
33404
33443
  sortOrder: row.sortOrder,
33405
33444
  createdAt: row.createdAt,
33406
33445
  updatedAt: row.updatedAt
@@ -33528,6 +33567,7 @@ function createDevice(device) {
33528
33567
  passwordEnc: device.passwordEnc ?? null,
33529
33568
  privateKeyEnc: device.privateKeyEnc ?? null,
33530
33569
  privateKeyPassphraseEnc: device.privateKeyPassphraseEnc ?? null,
33570
+ defaultWorkingDir: device.defaultWorkingDir ?? null,
33531
33571
  sortOrder: nextSortOrder,
33532
33572
  createdAt: device.createdAt,
33533
33573
  updatedAt: device.updatedAt
@@ -33597,6 +33637,9 @@ function updateDevice(id, updates) {
33597
33637
  if (updates.privateKeyPassphraseEnc !== undefined) {
33598
33638
  setValues.privateKeyPassphraseEnc = updates.privateKeyPassphraseEnc;
33599
33639
  }
33640
+ if (updates.defaultWorkingDir !== undefined) {
33641
+ setValues.defaultWorkingDir = updates.defaultWorkingDir || null;
33642
+ }
33600
33643
  orm.update(devices).set(setValues).where(eq(devices.id, id)).run();
33601
33644
  }
33602
33645
  function deleteDevice(id) {
@@ -98249,6 +98292,28 @@ function createPaneStreamParser(options) {
98249
98292
  options.onNotification({ source: "osc1337", body: "RequestAttention" });
98250
98293
  }
98251
98294
  return;
98295
+ case "52": {
98296
+ const separatorIndex = payload.indexOf(";");
98297
+ if (separatorIndex < 0) {
98298
+ return;
98299
+ }
98300
+ const base64Data = payload.slice(separatorIndex + 1);
98301
+ if (!base64Data || base64Data === "?") {
98302
+ return;
98303
+ }
98304
+ try {
98305
+ const binaryString = atob(base64Data);
98306
+ const bytes = new Uint8Array(binaryString.length);
98307
+ for (let i = 0;i < binaryString.length; i++) {
98308
+ bytes[i] = binaryString.charCodeAt(i);
98309
+ }
98310
+ const text3 = new TextDecoder("utf-8", { fatal: false }).decode(bytes);
98311
+ if (text3) {
98312
+ options.onClipboardWrite?.(text3);
98313
+ }
98314
+ } catch {}
98315
+ return;
98316
+ }
98252
98317
  case "133": {
98253
98318
  const parts = payload.split(";");
98254
98319
  const kind = parts[0];
@@ -98388,7 +98453,7 @@ function createPaneStreamParser(options) {
98388
98453
  }
98389
98454
  if (phase === "osc-params") {
98390
98455
  if (byte === 59) {
98391
- phase = oscKind === "0" || oscKind === "1" || oscKind === "2" || oscKind === "9" || oscKind === "99" || oscKind === "133" || oscKind === "777" || oscKind === "1337" ? "osc-body" : "osc-body-ignore";
98456
+ phase = oscKind === "0" || oscKind === "1" || oscKind === "2" || oscKind === "9" || oscKind === "52" || oscKind === "99" || oscKind === "133" || oscKind === "777" || oscKind === "1337" ? "osc-body" : "osc-body-ignore";
98392
98457
  return;
98393
98458
  }
98394
98459
  if (byte === 7) {
@@ -98516,7 +98581,8 @@ function createControlModeSubscription(callbacks) {
98516
98581
  onTitle: (title) => callbacks.onTitle(paneId, title),
98517
98582
  onBell: () => callbacks.onBell(paneId),
98518
98583
  onNotification: (notification) => callbacks.onNotification(paneId, notification),
98519
- onPromptMarker: (marker24) => callbacks.onPromptMarker?.(paneId, marker24)
98584
+ onPromptMarker: (marker24) => callbacks.onPromptMarker?.(paneId, marker24),
98585
+ onClipboardWrite: (text3) => callbacks.onClipboardWrite?.(paneId, text3)
98520
98586
  });
98521
98587
  paneParsers.set(paneId, parser2);
98522
98588
  return parser2;
@@ -99019,7 +99085,10 @@ class LocalExternalTmuxConnection {
99019
99085
  if (!this.connected) {
99020
99086
  return;
99021
99087
  }
99022
- const argv = name24 ? ["new-window", "-t", this.sessionName, "-n", name24] : ["new-window", "-t", this.sessionName];
99088
+ const argv = ["new-window", "-t", this.sessionName, "-c", this.resolveDefaultWorkingDir()];
99089
+ if (name24) {
99090
+ argv.push("-n", name24);
99091
+ }
99023
99092
  this.runAndRefresh(argv).catch((error51) => {
99024
99093
  this.callbacks.onError(error51);
99025
99094
  });
@@ -99048,6 +99117,20 @@ class LocalExternalTmuxConnection {
99048
99117
  this.callbacks.onError(error51);
99049
99118
  });
99050
99119
  }
99120
+ updateDefaultWorkingDir(dir2) {
99121
+ if (this.device) {
99122
+ this.device = { ...this.device, defaultWorkingDir: dir2 };
99123
+ }
99124
+ if (this.connected) {
99125
+ this.runTmuxAllowFailure([
99126
+ "set-option",
99127
+ "-t",
99128
+ this.sessionName,
99129
+ "default-path",
99130
+ this.resolveDefaultWorkingDir()
99131
+ ]);
99132
+ }
99133
+ }
99051
99134
  setWindowStyle(style) {
99052
99135
  if (!this.connected) {
99053
99136
  return;
@@ -99077,12 +99160,15 @@ class LocalExternalTmuxConnection {
99077
99160
  const { stdout } = await this.runTmux(["display-message", "-p", "-t", paneId, PANE_META_FORMAT], "silent");
99078
99161
  return parsePaneMeta(stdout);
99079
99162
  }
99163
+ resolveDefaultWorkingDir() {
99164
+ return this.device?.defaultWorkingDir?.trim() || homedir();
99165
+ }
99080
99166
  async ensureSession() {
99081
99167
  const exists3 = await this.runTmuxAllowFailure(["has-session", "-t", this.sessionName]);
99082
99168
  if (exists3.exitCode === 0) {
99083
99169
  return;
99084
99170
  }
99085
- await this.runTmux(["new-session", "-d", "-c", homedir(), "-s", this.sessionName]);
99171
+ await this.runTmux(["new-session", "-d", "-c", this.resolveDefaultWorkingDir(), "-s", this.sessionName]);
99086
99172
  }
99087
99173
  async configureSessionOptions() {
99088
99174
  await this.runTmuxAllowFailure([
@@ -99136,6 +99222,13 @@ class LocalExternalTmuxConnection {
99136
99222
  "COLORTERM",
99137
99223
  "truecolor"
99138
99224
  ]);
99225
+ await this.runTmuxAllowFailure([
99226
+ "set-option",
99227
+ "-t",
99228
+ this.sessionName,
99229
+ "default-path",
99230
+ this.resolveDefaultWorkingDir()
99231
+ ]);
99139
99232
  await this.configureWindowStyle();
99140
99233
  }
99141
99234
  async configureWindowStyle(styleValue = config.tmuxWindowStyle) {
@@ -99254,6 +99347,9 @@ class LocalExternalTmuxConnection {
99254
99347
  onPromptMarker: (paneId, marker24) => {
99255
99348
  this.callbacks.onPromptMarker?.(paneId, marker24);
99256
99349
  },
99350
+ onClipboardWrite: (paneId, text3) => {
99351
+ this.callbacks.onClipboardWrite?.(paneId, text3);
99352
+ },
99257
99353
  onStructureChanged: () => {
99258
99354
  this.requestSnapshot();
99259
99355
  },
@@ -99397,7 +99493,7 @@ class LocalExternalTmuxConnection {
99397
99493
  async closeWindowInternal(windowId) {
99398
99494
  const count2 = Number.parseInt((await this.runTmux(["display-message", "-p", "-t", this.sessionName, "#{session_windows}"])).stdout.trim() || "0", 10);
99399
99495
  if (count2 <= 1) {
99400
- await this.runTmux(["new-window", "-d", "-t", this.sessionName]);
99496
+ await this.runTmux(["new-window", "-d", "-t", this.sessionName, "-c", this.resolveDefaultWorkingDir()]);
99401
99497
  }
99402
99498
  await this.runAndRefresh(["kill-window", "-t", windowId], true);
99403
99499
  }
@@ -100221,7 +100317,10 @@ class SshExternalTmuxConnection {
100221
100317
  if (!this.connected) {
100222
100318
  return;
100223
100319
  }
100224
- const argv = name24 ? ["new-window", "-t", this.sessionName, "-n", name24] : ["new-window", "-t", this.sessionName];
100320
+ const argv = ["new-window", "-t", this.sessionName, "-c", this.resolveDefaultWorkingDir()];
100321
+ if (name24) {
100322
+ argv.push("-n", name24);
100323
+ }
100225
100324
  this.runAndRefresh(argv).catch((error51) => {
100226
100325
  this.callbacks.onError(error51);
100227
100326
  });
@@ -100250,6 +100349,20 @@ class SshExternalTmuxConnection {
100250
100349
  this.callbacks.onError(error51);
100251
100350
  });
100252
100351
  }
100352
+ updateDefaultWorkingDir(dir2) {
100353
+ if (this.device) {
100354
+ this.device = { ...this.device, defaultWorkingDir: dir2 };
100355
+ }
100356
+ if (this.connected) {
100357
+ this.runTmuxAllowFailure([
100358
+ "set-option",
100359
+ "-t",
100360
+ this.sessionName,
100361
+ "default-path",
100362
+ this.resolveDefaultWorkingDir()
100363
+ ]);
100364
+ }
100365
+ }
100253
100366
  setWindowStyle(style) {
100254
100367
  if (!this.connected) {
100255
100368
  return;
@@ -100385,12 +100498,15 @@ class SshExternalTmuxConnection {
100385
100498
  throw new Error(message);
100386
100499
  }
100387
100500
  }
100501
+ resolveDefaultWorkingDir() {
100502
+ return this.device?.defaultWorkingDir?.trim() || this.remoteHomeDir;
100503
+ }
100388
100504
  async ensureSession() {
100389
100505
  const exists3 = await this.runTmuxAllowFailure(["has-session", "-t", this.sessionName]);
100390
100506
  if (exists3.exitCode === 0) {
100391
100507
  return;
100392
100508
  }
100393
- await this.runTmux(["new-session", "-d", "-c", this.remoteHomeDir, "-s", this.sessionName]);
100509
+ await this.runTmux(["new-session", "-d", "-c", this.resolveDefaultWorkingDir(), "-s", this.sessionName]);
100394
100510
  }
100395
100511
  async configureSessionOptions() {
100396
100512
  await this.runTmuxAllowFailure([
@@ -100444,6 +100560,13 @@ class SshExternalTmuxConnection {
100444
100560
  "COLORTERM",
100445
100561
  "truecolor"
100446
100562
  ]);
100563
+ await this.runTmuxAllowFailure([
100564
+ "set-option",
100565
+ "-t",
100566
+ this.sessionName,
100567
+ "default-path",
100568
+ this.resolveDefaultWorkingDir()
100569
+ ]);
100447
100570
  await this.configureWindowStyle();
100448
100571
  }
100449
100572
  async configureWindowStyle(styleValue = config.tmuxWindowStyle) {
@@ -100558,6 +100681,9 @@ class SshExternalTmuxConnection {
100558
100681
  onPromptMarker: (paneId, marker24) => {
100559
100682
  this.callbacks.onPromptMarker?.(paneId, marker24);
100560
100683
  },
100684
+ onClipboardWrite: (paneId, text3) => {
100685
+ this.callbacks.onClipboardWrite?.(paneId, text3);
100686
+ },
100561
100687
  onStructureChanged: () => {
100562
100688
  this.requestSnapshot();
100563
100689
  },
@@ -100665,7 +100791,7 @@ class SshExternalTmuxConnection {
100665
100791
  async closeWindowInternal(windowId) {
100666
100792
  const count2 = Number.parseInt((await this.runTmux(["display-message", "-p", "-t", this.sessionName, "#{session_windows}"])).stdout.trim() || "0", 10);
100667
100793
  if (count2 <= 1) {
100668
- await this.runTmux(["new-window", "-d", "-t", this.sessionName]);
100794
+ await this.runTmux(["new-window", "-d", "-t", this.sessionName, "-c", this.resolveDefaultWorkingDir()]);
100669
100795
  }
100670
100796
  await this.runAndRefresh(["kill-window", "-t", windowId], true);
100671
100797
  }
@@ -101135,6 +101261,9 @@ class DeviceSessionRuntime {
101135
101261
  onPromptMarker: (paneId, marker24) => {
101136
101262
  this.broadcast((listener) => listener.onPromptMarker?.(paneId, marker24));
101137
101263
  },
101264
+ onClipboardWrite: (paneId, text3) => {
101265
+ this.broadcast((listener) => listener.onClipboardWrite?.(paneId, text3));
101266
+ },
101138
101267
  onSnapshot: (payload) => {
101139
101268
  this.broadcast((listener) => listener.onSnapshot?.(payload));
101140
101269
  },
@@ -101205,6 +101334,9 @@ class DeviceSessionRuntime {
101205
101334
  selectWindow(windowId) {
101206
101335
  this.connection.selectWindow(windowId);
101207
101336
  }
101337
+ updateDefaultWorkingDir(dir2) {
101338
+ this.connection.updateDefaultWorkingDir(dir2);
101339
+ }
101208
101340
  createWindow(name24) {
101209
101341
  this.connection.createWindow(name24);
101210
101342
  }
@@ -103775,6 +103907,10 @@ class PushSupervisor {
103775
103907
  }
103776
103908
  await this.upsert(deviceId);
103777
103909
  }
103910
+ updateDefaultWorkingDir(deviceId, dir2) {
103911
+ const entry = this.entries.get(deviceId);
103912
+ entry?.runtime?.updateDefaultWorkingDir(dir2);
103913
+ }
103778
103914
  remove(deviceId) {
103779
103915
  const entry = this.entries.get(deviceId);
103780
103916
  if (!entry) {
@@ -104909,6 +105045,49 @@ function typeFromPerms(perms) {
104909
105045
  return "other";
104910
105046
  }
104911
105047
  }
105048
+ function unescapeOctal(input) {
105049
+ if (!input.includes("\\"))
105050
+ return input;
105051
+ const result = [];
105052
+ let pendingBytes = [];
105053
+ const flushBytes = () => {
105054
+ if (pendingBytes.length === 0)
105055
+ return;
105056
+ result.push(new TextDecoder().decode(new Uint8Array(pendingBytes)));
105057
+ pendingBytes = [];
105058
+ };
105059
+ let i = 0;
105060
+ while (i < input.length) {
105061
+ if (input[i] !== "\\") {
105062
+ flushBytes();
105063
+ result.push(input[i]);
105064
+ i++;
105065
+ continue;
105066
+ }
105067
+ if (input[i + 1] === "\\") {
105068
+ flushBytes();
105069
+ result.push("\\");
105070
+ i += 2;
105071
+ continue;
105072
+ }
105073
+ if (i + 3 < input.length) {
105074
+ const digits = input.slice(i + 1, i + 4);
105075
+ if (/^[0-7]{3}$/.test(digits)) {
105076
+ const val = parseInt(digits, 8);
105077
+ if (val <= 255) {
105078
+ pendingBytes.push(val);
105079
+ i += 4;
105080
+ continue;
105081
+ }
105082
+ }
105083
+ }
105084
+ flushBytes();
105085
+ result.push("\\");
105086
+ i++;
105087
+ }
105088
+ flushBytes();
105089
+ return result.join("");
105090
+ }
104912
105091
  function parseListOnly(stdout) {
104913
105092
  const entries = [];
104914
105093
  for (const rawLine of stdout.split(`
@@ -104918,7 +105097,7 @@ function parseListOnly(stdout) {
104918
105097
  if (!m)
104919
105098
  continue;
104920
105099
  const type = typeFromPerms(m[1]);
104921
- let name24 = m[9];
105100
+ let name24 = unescapeOctal(m[9]);
104922
105101
  if (type === "symlink") {
104923
105102
  const arrow = name24.indexOf(" -> ");
104924
105103
  if (arrow >= 0)
@@ -105067,7 +105246,7 @@ function rsyncTargetArg(spec, remotePath) {
105067
105246
  return `${spec.targetPrefix}${quoteShellArg(remotePath)}`;
105068
105247
  }
105069
105248
  function rsyncListArgs(spec, remotePath) {
105070
- const args = ["--list-only"];
105249
+ const args = ["--list-only", "--8-bit-output"];
105071
105250
  if (spec.rsh)
105072
105251
  args.push("-e", spec.rsh);
105073
105252
  args.push(rsyncTargetArg(spec, remotePath));
@@ -106422,8 +106601,8 @@ function getBaseVersion() {
106422
106601
  if (cachedBase !== undefined)
106423
106602
  return cachedBase;
106424
106603
  let base = null;
106425
- if ("0.13.0") {
106426
- base = "0.13.0";
106604
+ if ("0.14.0") {
106605
+ base = "0.14.0";
106427
106606
  }
106428
106607
  if (!base && config.isProd) {
106429
106608
  base = readInstallMeta()?.cliVersion ?? null;
@@ -108442,6 +108621,7 @@ async function handleCreateDevice(req) {
108442
108621
  username: body.username,
108443
108622
  sshConfigRef: body.sshConfigRef,
108444
108623
  session: body.session ?? "tmex",
108624
+ defaultWorkingDir: body.defaultWorkingDir?.trim() || undefined,
108445
108625
  authMode: body.authMode,
108446
108626
  passwordEnc: body.password ? await encrypt(body.password) : undefined,
108447
108627
  privateKeyEnc: body.privateKey ? await encrypt(body.privateKey) : undefined,
@@ -108473,6 +108653,8 @@ async function handleUpdateDevice(req, id) {
108473
108653
  updates.sshConfigRef = body.sshConfigRef;
108474
108654
  if (body.session !== undefined)
108475
108655
  updates.session = body.session;
108656
+ if (body.defaultWorkingDir !== undefined)
108657
+ updates.defaultWorkingDir = body.defaultWorkingDir.trim() || undefined;
108476
108658
  if (body.authMode !== undefined)
108477
108659
  updates.authMode = body.authMode;
108478
108660
  if (body.password !== undefined)
@@ -108485,6 +108667,8 @@ async function handleUpdateDevice(req, id) {
108485
108667
  updateDevice(id, updates);
108486
108668
  if (shouldReconnectPushSupervisor(existing, updates)) {
108487
108669
  await pushSupervisor.reconnect(id);
108670
+ } else if (updates.defaultWorkingDir !== undefined && updates.defaultWorkingDir !== existing.defaultWorkingDir) {
108671
+ pushSupervisor.updateDefaultWorkingDir(id, updates.defaultWorkingDir);
108488
108672
  }
108489
108673
  const device = getDeviceById(id);
108490
108674
  return json9({ device });
@@ -109614,6 +109798,9 @@ class WebSocketServer {
109614
109798
  onTerminalHistory: (paneId, data, alternateScreen) => {
109615
109799
  this.broadcastTerminalHistory(deviceId, paneId, data, alternateScreen);
109616
109800
  },
109801
+ onClipboardWrite: (paneId, text3) => {
109802
+ this.broadcastClipboardWrite(deviceId, paneId, text3);
109803
+ },
109617
109804
  onSnapshot: (payload) => {
109618
109805
  this.broadcastStateSnapshot(deviceId, payload);
109619
109806
  },
@@ -109741,6 +109928,10 @@ class WebSocketServer {
109741
109928
  this.connections.delete(deviceId);
109742
109929
  }
109743
109930
  }
109931
+ updateDefaultWorkingDir(deviceId, dir2) {
109932
+ const entry = this.connections.get(deviceId);
109933
+ entry?.runtime.updateDefaultWorkingDir(dir2);
109934
+ }
109744
109935
  closeAll() {
109745
109936
  for (const [deviceId, entry] of this.connections) {
109746
109937
  this.releaseConnectionEntry(deviceId, entry);
@@ -110298,6 +110489,22 @@ class WebSocketServer {
110298
110489
  this.sendChunked(client, exports_ws_borsh.KIND_TERM_OUTPUT, payloadBytes);
110299
110490
  }
110300
110491
  }
110492
+ broadcastClipboardWrite(deviceId, paneId, text3) {
110493
+ const entry = this.connections.get(deviceId);
110494
+ if (!entry)
110495
+ return;
110496
+ const payloadBytes = exports_ws_borsh.encodePayload(exports_ws_borsh.schema.ClipboardWriteSchema, {
110497
+ deviceId,
110498
+ paneId,
110499
+ text: text3
110500
+ });
110501
+ for (const client of entry.clients) {
110502
+ if (client.data.borshState.selectedPanes[deviceId] !== paneId) {
110503
+ continue;
110504
+ }
110505
+ this.sendEnvelope(client, exports_ws_borsh.KIND_CLIPBOARD_WRITE, payloadBytes);
110506
+ }
110507
+ }
110301
110508
  broadcastTerminalHistory(deviceId, paneId, data, alternateScreen) {
110302
110509
  const entry = this.connections.get(deviceId);
110303
110510
  if (!entry)
@@ -110496,8 +110703,8 @@ var MESSAGES = {
110496
110703
  "cli.help": `tmex CLI
110497
110704
 
110498
110705
  Usage:
110499
- tmex init [--no-interactive --install-dir <path> --host <host> --port <port> --db-path <path> --autostart <true|false> --bun-path <path>]
110500
- tmex doctor [--install-dir <path>] [--json] [--bun-path <path>]
110706
+ tmex init [--no-interactive --install-dir <path> --host <host> --port <port> --db-path <path> --autostart <true|false> --bun-path <path> --install-deps --skip-dep-check]
110707
+ tmex doctor [--install-dir <path>] [--json] [--bun-path <path>] [--fix]
110501
110708
  tmex upgrade [--version <version>] [--install-dir <path>] [--bun-path <path>]
110502
110709
  tmex uninstall [--install-dir <path>] [--yes] [--purge]
110503
110710
 
@@ -110541,6 +110748,7 @@ Global flags:
110541
110748
  "init.prompt.serviceName": "Service name (service-name)",
110542
110749
  "init.prompt.dirExistsConfirm": "Directory {{installDir}} already exists. Continue (will not delete existing config/db)?",
110543
110750
  "init.error.installDirNotEmpty": "Install directory is not empty: {{installDir}}. Use --force to overwrite.",
110751
+ "init.error.noServiceManager": "No supported service manager found (platform: {{platform}}). tmex requires systemd (Linux) or launchd (macOS).",
110544
110752
  "init.warning.noServiceManager": "Service manager is not supported on platform {{platform}}. Files are deployed but autostart is not configured.",
110545
110753
  "init.done": "Initialization completed.",
110546
110754
  "init.summary.installDir": "Install dir",
@@ -110554,8 +110762,12 @@ Global flags:
110554
110762
  "doctor.platform.unsupported": "Platform {{platform}} is not officially supported (only macOS and common Linux distros are guaranteed).",
110555
110763
  "doctor.bun.ok": "Bun installed: {{version}}",
110556
110764
  "doctor.bun.fail": "Bun check failed: {{reason}}",
110557
- "doctor.tmux.ok": "tmux installed",
110558
- "doctor.tmux.fail": "tmux not found (tmex requires tmux).",
110765
+ "doctor.tmux.ok": "tmux installed: {{version}}",
110766
+ "doctor.tmux.fail": "tmux not found (tmex requires tmux >= 3.0).",
110767
+ "doctor.tmux.versionLow": "tmux version too low: {{version}} (requires >= 3.0)",
110768
+ "doctor.fix.header": "Attempting to fix issues...",
110769
+ "doctor.fix.skip": "Skipping unfixable item: {{id}}",
110770
+ "doctor.fix.hint": 'Run "tmex doctor --fix" to attempt automatic installation.',
110559
110771
  "doctor.ssh.ok": "ssh installed",
110560
110772
  "doctor.ssh.missing": "ssh not found; SSH devices will not work.",
110561
110773
  "doctor.installDir.exists": "Install directory exists: {{installDir}}",
@@ -110586,6 +110798,19 @@ Global flags:
110586
110798
  "uninstall.done": "Uninstall completed.",
110587
110799
  "uninstall.summary.installDir": "Install dir",
110588
110800
  "uninstall.summary.serviceName": "Service name",
110801
+ "tmux.notFound": "tmux not found. tmex requires tmux >= 3.0 to operate.",
110802
+ "tmux.versionTooLow": "tmux version too low: current {{version}}, required >= 3.0",
110803
+ "deps.install.confirm": "Install {{dep}} now?",
110804
+ "deps.install.running": "Installing {{dep}}...",
110805
+ "deps.install.success": "{{dep}} installed successfully.",
110806
+ "deps.install.failed": "Failed to install {{dep}}.",
110807
+ "deps.install.manual": "Please install manually and retry.",
110808
+ "deps.install.sudoRequired": "This operation requires sudo.",
110809
+ "deps.install.sudoUnavailable": "sudo is not available. Please run as root or install sudo.",
110810
+ "deps.install.nonInteractive": "Missing dependency: {{dep}}. Use --install-deps to install automatically.",
110811
+ "deps.install.hint": "Suggested install command: {{command}}",
110812
+ "deps.install.brewMissing": "Homebrew not found. Install Homebrew first: https://brew.sh",
110813
+ "deps.install.unknownDistro": "Unable to detect Linux distribution. Please install {{dep}} manually.",
110589
110814
  "runtime.restartRequested": "Restart requested; exiting for service manager restart.",
110590
110815
  "runtime.started": "Service started on {{url}}",
110591
110816
  "runtime.frontendMissing": "Frontend assets not found.",
@@ -110597,8 +110822,8 @@ Global flags:
110597
110822
  "cli.help": `tmex CLI
110598
110823
 
110599
110824
  \u7528\u6CD5\uFF1A
110600
- tmex init [--no-interactive --install-dir <path> --host <host> --port <port> --db-path <path> --autostart <true|false> --bun-path <path>]
110601
- tmex doctor [--install-dir <path>] [--json] [--bun-path <path>]
110825
+ tmex init [--no-interactive --install-dir <path> --host <host> --port <port> --db-path <path> --autostart <true|false> --bun-path <path> --install-deps --skip-dep-check]
110826
+ tmex doctor [--install-dir <path>] [--json] [--bun-path <path>] [--fix]
110602
110827
  tmex upgrade [--version <version>] [--install-dir <path>] [--bun-path <path>]
110603
110828
  tmex uninstall [--install-dir <path>] [--yes] [--purge]
110604
110829
 
@@ -110642,6 +110867,7 @@ Global flags:
110642
110867
  "init.prompt.serviceName": "\u670D\u52A1\u540D\u79F0\uFF08service-name\uFF09",
110643
110868
  "init.prompt.dirExistsConfirm": "\u76EE\u5F55 {{installDir}} \u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u7EE7\u7EED\uFF08\u4E0D\u4F1A\u5220\u9664\u73B0\u6709\u914D\u7F6E\u4E0E\u6570\u636E\u5E93\uFF09\uFF1F",
110644
110869
  "init.error.installDirNotEmpty": "\u5B89\u88C5\u76EE\u5F55\u5DF2\u5B58\u5728\u4E14\u975E\u7A7A\uFF1A{{installDir}}\u3002\u5982\u9700\u8986\u76D6\u8BF7\u52A0 --force",
110870
+ "init.error.noServiceManager": "\u672A\u68C0\u6D4B\u5230\u53EF\u7528\u7684\u670D\u52A1\u7BA1\u7406\u5668\uFF08\u5E73\u53F0\uFF1A{{platform}}\uFF09\u3002tmex \u9700\u8981 systemd\uFF08Linux\uFF09\u6216 launchd\uFF08macOS\uFF09\u3002",
110645
110871
  "init.warning.noServiceManager": "\u5F53\u524D\u5E73\u53F0 {{platform}} \u672A\u5B9E\u73B0\u81EA\u52A8\u670D\u52A1\u5B89\u88C5\uFF0C\u5DF2\u5B8C\u6210\u6587\u4EF6\u90E8\u7F72\u3002",
110646
110872
  "init.done": "\u521D\u59CB\u5316\u5B8C\u6210\u3002",
110647
110873
  "init.summary.installDir": "\u5B89\u88C5\u76EE\u5F55",
@@ -110655,8 +110881,12 @@ Global flags:
110655
110881
  "doctor.platform.unsupported": "\u5F53\u524D\u5E73\u53F0 {{platform}} \u975E\u5B98\u65B9\u652F\u6301\u8303\u56F4\uFF08\u4EC5\u4FDD\u8BC1 macOS \u4E0E\u5E38\u89C1 Linux \u53D1\u884C\u7248\uFF09\u3002",
110656
110882
  "doctor.bun.ok": "Bun \u5DF2\u5B89\u88C5\uFF1A{{version}}",
110657
110883
  "doctor.bun.fail": "Bun \u68C0\u67E5\u5931\u8D25\uFF1A{{reason}}",
110658
- "doctor.tmux.ok": "tmux \u5DF2\u5B89\u88C5",
110659
- "doctor.tmux.fail": "\u672A\u68C0\u6D4B\u5230 tmux\uFF08tmex \u9700\u8981 tmux \u624D\u80FD\u5DE5\u4F5C\uFF09\u3002",
110884
+ "doctor.tmux.ok": "tmux \u5DF2\u5B89\u88C5\uFF1A{{version}}",
110885
+ "doctor.tmux.fail": "\u672A\u68C0\u6D4B\u5230 tmux\uFF08tmex \u9700\u8981 tmux >= 3.0 \u624D\u80FD\u5DE5\u4F5C\uFF09\u3002",
110886
+ "doctor.tmux.versionLow": "tmux \u7248\u672C\u8FC7\u4F4E\uFF1A{{version}}\uFF08\u8981\u6C42 >= 3.0\uFF09",
110887
+ "doctor.fix.header": "\u6B63\u5728\u5C1D\u8BD5\u4FEE\u590D\u95EE\u9898...",
110888
+ "doctor.fix.skip": "\u8DF3\u8FC7\u65E0\u6CD5\u81EA\u52A8\u4FEE\u590D\u7684\u9879\u76EE\uFF1A{{id}}",
110889
+ "doctor.fix.hint": '\u8FD0\u884C "tmex doctor --fix" \u5C1D\u8BD5\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u7684\u4F9D\u8D56\u3002',
110660
110890
  "doctor.ssh.ok": "ssh \u5DF2\u5B89\u88C5",
110661
110891
  "doctor.ssh.missing": "\u672A\u68C0\u6D4B\u5230 ssh\uFF0C\u8FDC\u7A0B\u8BBE\u5907\u5C06\u4E0D\u53EF\u7528\u3002",
110662
110892
  "doctor.installDir.exists": "\u5B89\u88C5\u76EE\u5F55\u5B58\u5728\uFF1A{{installDir}}",
@@ -110687,6 +110917,19 @@ Global flags:
110687
110917
  "uninstall.done": "\u5378\u8F7D\u5B8C\u6210\u3002",
110688
110918
  "uninstall.summary.installDir": "\u5B89\u88C5\u76EE\u5F55",
110689
110919
  "uninstall.summary.serviceName": "\u670D\u52A1\u540D\u79F0",
110920
+ "tmux.notFound": "\u672A\u68C0\u6D4B\u5230 tmux\u3002tmex \u9700\u8981 tmux >= 3.0 \u624D\u80FD\u5DE5\u4F5C\u3002",
110921
+ "tmux.versionTooLow": "tmux \u7248\u672C\u8FC7\u4F4E\uFF1A\u5F53\u524D {{version}}\uFF0C\u8981\u6C42 >= 3.0",
110922
+ "deps.install.confirm": "\u662F\u5426\u73B0\u5728\u5B89\u88C5 {{dep}}\uFF1F",
110923
+ "deps.install.running": "\u6B63\u5728\u5B89\u88C5 {{dep}}...",
110924
+ "deps.install.success": "{{dep}} \u5B89\u88C5\u6210\u529F\u3002",
110925
+ "deps.install.failed": "\u5B89\u88C5 {{dep}} \u5931\u8D25\u3002",
110926
+ "deps.install.manual": "\u8BF7\u624B\u52A8\u5B89\u88C5\u540E\u91CD\u8BD5\u3002",
110927
+ "deps.install.sudoRequired": "\u6B64\u64CD\u4F5C\u9700\u8981 sudo \u6743\u9650\u3002",
110928
+ "deps.install.sudoUnavailable": "sudo \u4E0D\u53EF\u7528\uFF0C\u8BF7\u4EE5 root \u8EAB\u4EFD\u6267\u884C\u6216\u5B89\u88C5 sudo\u3002",
110929
+ "deps.install.nonInteractive": "\u7F3A\u5C11\u4F9D\u8D56\uFF1A{{dep}}\u3002\u4F7F\u7528 --install-deps \u81EA\u52A8\u5B89\u88C5\u3002",
110930
+ "deps.install.hint": "\u5EFA\u8BAE\u5B89\u88C5\u547D\u4EE4\uFF1A{{command}}",
110931
+ "deps.install.brewMissing": "\u672A\u68C0\u6D4B\u5230 Homebrew\uFF0C\u8BF7\u5148\u5B89\u88C5 Homebrew\uFF1Ahttps://brew.sh",
110932
+ "deps.install.unknownDistro": "\u65E0\u6CD5\u68C0\u6D4B Linux \u53D1\u884C\u7248\uFF0C\u8BF7\u624B\u52A8\u5B89\u88C5 {{dep}}\u3002",
110690
110933
  "runtime.restartRequested": "\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF0C\u9000\u51FA\u5E76\u7B49\u5F85\u670D\u52A1\u7BA1\u7406\u5668\u62C9\u8D77\u3002",
110691
110934
  "runtime.started": "\u670D\u52A1\u5DF2\u542F\u52A8\uFF1A{{url}}",
110692
110935
  "runtime.frontendMissing": "\u672A\u627E\u5230\u524D\u7AEF\u9759\u6001\u8D44\u6E90\u3002",