railmux 0.3.2.dev2__py3-none-any.whl → 0.3.2.dev4__py3-none-any.whl

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.
railmux/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.3.2.dev2"
1
+ __version__ = "0.3.2.dev4"
railmux/diagnostics.py CHANGED
@@ -151,6 +151,8 @@ def _tool_diagnostic(
151
151
  env=environ,
152
152
  capture_output=True,
153
153
  text=True,
154
+ encoding="utf-8",
155
+ errors="replace",
154
156
  timeout=3,
155
157
  check=False,
156
158
  )
@@ -300,6 +302,8 @@ def collect_doctor_snapshot(
300
302
  env=effective_env,
301
303
  capture_output=True,
302
304
  text=True,
305
+ encoding="utf-8",
306
+ errors="replace",
303
307
  timeout=2,
304
308
  check=False,
305
309
  )
railmux/discovery.py CHANGED
@@ -43,9 +43,9 @@ def _path_cache_file() -> Path:
43
43
 
44
44
  def _load_path_cache() -> dict[str, str]:
45
45
  try:
46
- data = json.loads(_path_cache_file().read_text())
46
+ data = json.loads(_path_cache_file().read_text(encoding="utf-8"))
47
47
  return data if isinstance(data, dict) else {}
48
- except (OSError, json.JSONDecodeError):
48
+ except (OSError, UnicodeError, json.JSONDecodeError):
49
49
  return {}
50
50
 
51
51
 
@@ -45,6 +45,7 @@ from railmux.fast_display_input import (
45
45
  SelectionSegment,
46
46
  SgrMouseEvent,
47
47
  TermuxTouchKeyboard,
48
+ TouchKeyboardAction,
48
49
  TerminalInputDecoder,
49
50
  is_termux_environment,
50
51
  page_key_direction,
@@ -223,6 +224,33 @@ def compact_status_row(screen: AppliedScreen) -> int | None:
223
224
  return None
224
225
 
225
226
 
227
+ def termux_prompt_touch_action(
228
+ touch_keyboard: TermuxTouchKeyboard,
229
+ event: SgrMouseEvent,
230
+ history: LocalHistoryView,
231
+ screen: AppliedScreen | None,
232
+ *,
233
+ now: float | None = None,
234
+ ) -> TouchKeyboardAction:
235
+ """Classify one translated Termux tap against live screen route authority."""
236
+ if screen is None:
237
+ return TouchKeyboardAction()
238
+ clicked_pane_id = history.pane_id_at_position(event.x - 1, event.y - 1)
239
+ cursor_pane_id = history.pane_id_at_position(
240
+ screen.cursor_x,
241
+ screen.cursor_y,
242
+ )
243
+ return touch_keyboard.pointer_event(
244
+ event,
245
+ clicked_pane_id=clicked_pane_id,
246
+ cursor_pane_id=cursor_pane_id,
247
+ cursor_y=screen.cursor_y,
248
+ pane_frozen=history.pane_is_frozen(clicked_pane_id),
249
+ navigation_row=compact_status_row(screen),
250
+ now=now,
251
+ )
252
+
253
+
226
254
  class ProbeError(RuntimeError):
227
255
  """A bounded, user-facing SSH display failure."""
228
256
 
@@ -2723,34 +2751,16 @@ def run(args: argparse.Namespace) -> int:
2723
2751
  latest_screen.cursor_x, latest_screen.cursor_y
2724
2752
  )
2725
2753
  )
2726
- clicked_pane_id = (
2727
- None
2728
- if latest_screen is None
2729
- else history.pane_id_at_position(part.x - 1, part.y - 1)
2730
- )
2731
- cursor_pane_id = (
2732
- None
2733
- if latest_screen is None
2734
- else history.pane_id_at_position(
2735
- latest_screen.cursor_x,
2736
- latest_screen.cursor_y,
2737
- )
2738
- )
2739
2754
  status_row = (
2740
2755
  compact_status_row(latest_screen)
2741
2756
  if latest_screen is not None
2742
2757
  else None
2743
2758
  )
2744
- touch_action = touch_keyboard.pointer_event(
2759
+ touch_action = termux_prompt_touch_action(
2760
+ touch_keyboard,
2745
2761
  part,
2746
- clicked_pane_id=clicked_pane_id,
2747
- cursor_pane_id=cursor_pane_id,
2748
- cursor_y=0 if latest_screen is None else latest_screen.cursor_y,
2749
- cursor_visible=(
2750
- False if latest_screen is None else latest_screen.cursor_visible
2751
- ),
2752
- pane_frozen=history.pane_is_frozen(clicked_pane_id),
2753
- navigation_row=status_row,
2762
+ history,
2763
+ latest_screen,
2754
2764
  now=time.monotonic(),
2755
2765
  )
2756
2766
  if touch_action.suspend_mouse:
@@ -129,7 +129,6 @@ class TermuxTouchKeyboard:
129
129
  clicked_pane_id: str | None,
130
130
  cursor_pane_id: str | None,
131
131
  cursor_y: int,
132
- cursor_visible: bool,
133
132
  pane_frozen: bool,
134
133
  navigation_row: int | None = None,
135
134
  now: float | None = None,
@@ -150,7 +149,6 @@ class TermuxTouchKeyboard:
150
149
  or self._active
151
150
  or self._close_reassert_pending
152
151
  or pane_frozen
153
- or not cursor_visible
154
152
  or clicked_pane_id is None
155
153
  or clicked_pane_id != cursor_pane_id
156
154
  or (navigation_row is not None and event.y == navigation_row)
@@ -158,6 +156,11 @@ class TermuxTouchKeyboard:
158
156
  or not self._is_plain_left_press(event)
159
157
  ):
160
158
  return TouchKeyboardAction()
159
+ # DEC cursor visibility is presentation state, not prompt authority.
160
+ # Providers may hide the hardware cursor while retaining its exact
161
+ # input coordinates. The verified live-agent route, matching cursor
162
+ # route, unfrozen viewport, and bounded row distance remain the
163
+ # fail-closed authority for yielding one Termux tap.
161
164
  requested_at = time.monotonic() if now is None else now
162
165
  # A rapid reopen supersedes the delayed ownership reassertion queued by
163
166
  # the previous close; Termux must receive this new native prompt tap.
railmux/favorites.py CHANGED
@@ -29,10 +29,10 @@ class Favorites:
29
29
  if not self._path.is_file():
30
30
  return
31
31
  try:
32
- data = json.loads(self._path.read_text())
32
+ data = json.loads(self._path.read_text(encoding="utf-8"))
33
33
  if isinstance(data, list):
34
34
  self._ids = set(data)
35
- except (json.JSONDecodeError, OSError):
35
+ except (json.JSONDecodeError, OSError, UnicodeError):
36
36
  self._ids = set()
37
37
 
38
38
  def _save(self) -> None:
@@ -59,6 +59,8 @@ def discover(
59
59
  tmux_server.target_argv(target, "list-sessions", "-F", fmt),
60
60
  stderr=subprocess.DEVNULL,
61
61
  text=True,
62
+ encoding="utf-8",
63
+ errors="replace",
62
64
  timeout=timeout,
63
65
  env=None if env is None else dict(env),
64
66
  )
@@ -79,6 +79,8 @@ class TmuxBackend:
79
79
  stdout=subprocess.PIPE,
80
80
  stderr=subprocess.DEVNULL,
81
81
  text=True,
82
+ encoding="utf-8",
83
+ errors="replace",
82
84
  )
83
85
  except OSError:
84
86
  return None
railmux/renames.py CHANGED
@@ -32,8 +32,8 @@ class Renames:
32
32
  if not self._path.is_file():
33
33
  return
34
34
  try:
35
- data = json.loads(self._path.read_text())
36
- except (json.JSONDecodeError, OSError):
35
+ data = json.loads(self._path.read_text(encoding="utf-8"))
36
+ except (json.JSONDecodeError, OSError, UnicodeError):
37
37
  return
38
38
  if isinstance(data, dict):
39
39
  self._titles = {
railmux/runtime_config.py CHANGED
@@ -125,6 +125,8 @@ def check_executable(
125
125
  env=None if environ is None else dict(environ),
126
126
  capture_output=True,
127
127
  text=True,
128
+ encoding="utf-8",
129
+ errors="replace",
128
130
  timeout=timeout,
129
131
  check=False,
130
132
  )
@@ -168,6 +170,8 @@ def check_utf8_locale(
168
170
  env=env,
169
171
  capture_output=True,
170
172
  text=True,
173
+ encoding="utf-8",
174
+ errors="replace",
171
175
  timeout=timeout,
172
176
  check=False,
173
177
  )
railmux/self_update.py CHANGED
@@ -88,6 +88,8 @@ def fresh_process_version(*, timeout: float = 10.0) -> str | None:
88
88
  ],
89
89
  capture_output=True,
90
90
  text=True,
91
+ encoding="utf-8",
92
+ errors="replace",
91
93
  timeout=timeout,
92
94
  check=False,
93
95
  )
railmux/session_index.py CHANGED
@@ -92,7 +92,7 @@ def _scan_session(project: Project, jsonl_path: Path) -> SessionMeta | None:
92
92
  last_stop_reason: str = "" # only set for assistant records
93
93
 
94
94
  try:
95
- with jsonl_path.open("r") as f:
95
+ with jsonl_path.open("r", encoding="utf-8", errors="replace") as f:
96
96
  for line in f:
97
97
  line = line.strip()
98
98
  if not line:
railmux/settings.py CHANGED
@@ -110,7 +110,7 @@ class Settings:
110
110
 
111
111
  def _read_document(self):
112
112
  try:
113
- text = self._path.read_text()
113
+ text = self._path.read_text(encoding="utf-8")
114
114
  except FileNotFoundError:
115
115
  return tomlkit.document()
116
116
  except (OSError, UnicodeError):
railmux/tmux_ctl.py CHANGED
@@ -102,6 +102,8 @@ def _tmux_version_for_authority(
102
102
  argv,
103
103
  stderr=subprocess.DEVNULL,
104
104
  text=True,
105
+ encoding="utf-8",
106
+ errors="replace",
105
107
  timeout=2.0,
106
108
  )
107
109
  except (
@@ -1016,6 +1018,8 @@ def create_dual_pane_layout(
1016
1018
  stdout=subprocess.PIPE,
1017
1019
  stderr=subprocess.DEVNULL,
1018
1020
  text=True,
1021
+ encoding="utf-8",
1022
+ errors="replace",
1019
1023
  check=False,
1020
1024
  )
1021
1025
  except OSError:
@@ -1284,6 +1288,8 @@ def pane_process_alive(pane_id: str) -> bool:
1284
1288
  ["tmux", "display-message", "-p", "-t", pane_id, "#{pane_dead}"],
1285
1289
  capture_output=True,
1286
1290
  text=True,
1291
+ encoding="utf-8",
1292
+ errors="replace",
1287
1293
  timeout=1,
1288
1294
  )
1289
1295
  return result.returncode == 0 and result.stdout.strip() == "0"
@@ -2772,7 +2778,8 @@ def new_detached_session(name: str, cmd: str,
2772
2778
  try:
2773
2779
  dead = subprocess.run(
2774
2780
  ["tmux", "list-panes", "-t", name, "-F", "#{pane_dead}"],
2775
- capture_output=True, text=True, timeout=2,
2781
+ capture_output=True, text=True, encoding="utf-8",
2782
+ errors="replace", timeout=2,
2776
2783
  )
2777
2784
  if dead.returncode != 0:
2778
2785
  # With tmux's default ``remain-on-exit off``, an immediately
@@ -2789,7 +2796,8 @@ def new_detached_session(name: str, cmd: str,
2789
2796
  if dead.stdout.strip() == "1":
2790
2797
  capture = subprocess.run(
2791
2798
  ["tmux", "capture-pane", "-t", name, "-p", "-S", "-20"],
2792
- capture_output=True, text=True, timeout=2,
2799
+ capture_output=True, text=True, encoding="utf-8",
2800
+ errors="replace", timeout=2,
2793
2801
  )
2794
2802
  pane_content = capture.stdout.strip() if capture.returncode == 0 else ""
2795
2803
  # Clean up the dead session — it can never recover.
@@ -2913,13 +2921,15 @@ def start_detached_holder(
2913
2921
  dead = subprocess.run(
2914
2922
  ["tmux", "display-message", "-p", "-t", identity.pane_id,
2915
2923
  "#{pane_dead}"],
2916
- capture_output=True, text=True, timeout=2,
2924
+ capture_output=True, text=True, encoding="utf-8",
2925
+ errors="replace", timeout=2,
2917
2926
  )
2918
2927
  if dead.returncode == 0 and dead.stdout.strip() == "1":
2919
2928
  capture = subprocess.run(
2920
2929
  ["tmux", "capture-pane", "-t", identity.pane_id,
2921
2930
  "-p", "-S", "-20"],
2922
- capture_output=True, text=True, timeout=2,
2931
+ capture_output=True, text=True, encoding="utf-8",
2932
+ errors="replace", timeout=2,
2923
2933
  )
2924
2934
  lines = [line.strip() for line in capture.stdout.splitlines()
2925
2935
  if line.strip()] if capture.returncode == 0 else []
railmux/tool_panes.py CHANGED
@@ -211,6 +211,8 @@ class ToolPaneManager:
211
211
  self._argv(*args),
212
212
  stderr=subprocess.DEVNULL,
213
213
  text=True,
214
+ encoding="utf-8",
215
+ errors="replace",
214
216
  timeout=timeout,
215
217
  ).rstrip("\n")
216
218
  return value or None
railmux/ui/app.py CHANGED
@@ -1981,7 +1981,8 @@ class App:
1981
1981
  import subprocess as _sp
1982
1982
  try:
1983
1983
  out = _sp.check_output(
1984
- ["less", "--version"], stderr=_sp.STDOUT, text=True, timeout=3)
1984
+ ["less", "--version"], stderr=_sp.STDOUT, text=True,
1985
+ encoding="utf-8", errors="replace", timeout=3)
1985
1986
  # "less 668 (GNU regular expressions)" → major version
1986
1987
  ver = int(out.strip().split()[1].split(".")[0])
1987
1988
  if ver >= 590:
@@ -6722,6 +6723,7 @@ class App:
6722
6723
  f"\t#{{{orphan_marker.OPTION_NAME}}}"
6723
6724
  f"\t#{{{_SESSION_BINDING_OPTION}}}"],
6724
6725
  stderr=_sp.DEVNULL, text=True,
6726
+ encoding="utf-8", errors="replace",
6725
6727
  )
6726
6728
  except (OSError, _sp.CalledProcessError):
6727
6729
  return False
@@ -9000,8 +9002,8 @@ class App:
9000
9002
  return True
9001
9003
  try:
9002
9004
  source_stat = history_path.stat()
9003
- lines = history_path.read_text().splitlines()
9004
- except OSError:
9005
+ lines = history_path.read_text(encoding="utf-8").splitlines()
9006
+ except (OSError, UnicodeError):
9005
9007
  return False
9006
9008
  kept = []
9007
9009
  changed = False
@@ -9081,7 +9083,7 @@ class App:
9081
9083
  import json
9082
9084
  record = json.dumps({"type": "ai-title", "aiTitle": new_title})
9083
9085
  try:
9084
- with session.jsonl_path.open("a") as f:
9086
+ with session.jsonl_path.open("a", encoding="utf-8") as f:
9085
9087
  f.write(record + "\n")
9086
9088
  except OSError:
9087
9089
  synced = False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: railmux
3
- Version: 0.3.2.dev2
3
+ Version: 0.3.2.dev4
4
4
  Summary: Terminal UI to navigate, resume, and start Claude Code and Codex sessions
5
5
  Author-email: Rightglow <zhang.taian@foxmail.com>
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
- railmux/__init__.py,sha256=e0fFcvVNNmyGtKQ9C9lM1LmwFCOXGLw3jasMVu-Ayf8,27
1
+ railmux/__init__.py,sha256=GIZowKPo2qNGBQEy4LsFRJBGsrIZGhYatppNXNC-X_c,27
2
2
  railmux/__main__.py,sha256=F060V6TUYogqDcKCWX-0BeHpk1TVSPgUfWAOmQ8-_Mo,86
3
3
  railmux/atomic_file.py,sha256=oY2iI4Qj4meTwPLDO6xVHVSEhB9QV_q9Rs4jcpQ7X20,1730
4
4
  railmux/background_index.py,sha256=njCt15lvT4GmJ9FH3m_0RqknN-0F58Gur_RmQP1Sc40,14143
@@ -6,19 +6,19 @@ railmux/cli.py,sha256=Bxu8bHlxDXZBKS2s-Iuj8xIGQi455zWhsxjMRn0MQ44,18552
6
6
  railmux/codex_index.py,sha256=CCZK4QeYF6ewLoyxx3enFJ1hYoIwvHwe7KTAD2uJ6Hs,51787
7
7
  railmux/config.py,sha256=M81oTSRsCKwn_WFfdOA8X2QGx_KdYeqV-rBBsrRB5SI,6252
8
8
  railmux/config_cli.py,sha256=l7ic5TLj6Ka6BBD2OAZjsMMflaO3WAjarGXJysZHdDk,24456
9
- railmux/diagnostics.py,sha256=j0E3MHhrju92SB95tSdYu3EOmLI5SJzQ4Kr-1QDwl58,20928
10
- railmux/discovery.py,sha256=iO6B4ZzFPAk8LO6WUZ6SMnIUReS_TtGU8LpCrPxzAyQ,11996
9
+ railmux/diagnostics.py,sha256=xVjxvXZ3FN3E-bF-SXosW2vrVeqL6kIYzLvIgb5eiJo,21056
10
+ railmux/discovery.py,sha256=IPfVCrq_zAIlEgR-DF7LV11EqrEeFSYMx80iDyNbilM,12026
11
11
  railmux/display_transport.py,sha256=JkQXCSMjj_ZSJxFiJs-bx6CX2W-d6liRHilLnic6ZJo,46381
12
- railmux/fast_display_client.py,sha256=TI9mrRxv4iYO1gqRNkYJmmDytxho_F_3cAP5RhofBx4,135526
12
+ railmux/fast_display_client.py,sha256=OEgK2KmhYnEM4lzVUbdok0qX4iaPQ5x9ycrppKQRuiY,135625
13
13
  railmux/fast_display_history.py,sha256=unl2jyoEHMhgzEuAT_VcudHh1FnzNVNQY7_iBbpcbww,38545
14
- railmux/fast_display_input.py,sha256=0_9jWwhpafP5sDSIkNFOuS5vfeOJLPcGU9fqUiFlZXM,43629
14
+ railmux/fast_display_input.py,sha256=9uu8mTeh8Puzn_6JKq4hvJyyfTr7TVXayLaF1Q-xBCo,43926
15
15
  railmux/fast_display_protocol.py,sha256=tV78OzcK78H1n-AKZBubcY3xCTXk5U6tKHFfJ3NWq3k,42781
16
16
  railmux/fast_display_server.py,sha256=vYLmxOzEo24VPOqpbusTC-x5OKCxx0vfV27nWnjnQuc,87789
17
- railmux/favorites.py,sha256=HhLuhdb9JaGiV1UiHNlagoxj7G1dmmv0-TvyGGoLSjg,2090
17
+ railmux/favorites.py,sha256=oQIi3dGIeI9mj1UIqkQY_2IxMAEDyCewm3KS-pxNTVs,2120
18
18
  railmux/fuzzy.py,sha256=3OOAqC1Kb1MlzO1AQjkvokh8-7yIHSeGp0pSUb-LARA,946
19
19
  railmux/help_workspace.py,sha256=oa4T_HiDSdTxIB_Ndq2amKQPqh7wHIztCy8pQNr2Dfw,3568
20
20
  railmux/launcher.py,sha256=hn4_hYHNF73fBzRI6183S8-_Sp9uMiGlffwlZZwUhVM,2034
21
- railmux/legacy_sessions.py,sha256=xJNrIXc9J--42wo452Dh_CvGsQxSAyBKWsujUPtpqMc,3043
21
+ railmux/legacy_sessions.py,sha256=7onPumCBAq2nQ0rxcOecEx70Yo3abkrClTMuWO0Rnv4,3103
22
22
  railmux/local_clipboard.py,sha256=YOzXfweBHbMOZVLgnCoKKUiTVnFnnGFaUMK6tRzmUaY,3321
23
23
  railmux/local_open.py,sha256=jFsfWtCMRWY-QEkVHUP6aUzAVhPCL5OZVOQpKoALBoc,9348
24
24
  railmux/models.py,sha256=nMF5AJTg60DiRdROOr3JgVhO-feMjdXMPLN0UXwkbX8,3162
@@ -28,17 +28,17 @@ railmux/orphan_marker.py,sha256=wGHVoAAFJfg9T3_mTp97CPK89L5OsVso244-s29xEHg,9006
28
28
  railmux/pane_surface.py,sha256=Mgu1BOXFZ68nAOntNbJ_FoVZ7NrN_3nssCuutbT3VRs,3490
29
29
  railmux/path_codec.py,sha256=fpSxQqvFo2T8xYucCC1BjayMGS9-6LWyTqn2TzQO6Hg,10831
30
30
  railmux/remote_config.py,sha256=YZW7ANPS8Dse5YU2_aSA9V3ODGI9QFsKrkQuXYf9L08,9993
31
- railmux/renames.py,sha256=0jzbhC_CYqzp4UvyABBMmIuta5pEQE87VvjttpAjArA,2824
31
+ railmux/renames.py,sha256=LhbaZ_b0ox9Z9XzaQG2Eu5hBkiHphKnorwd8Ti7993A,2854
32
32
  railmux/restart_state.py,sha256=IFGY81m4LX-9P1yo8U9cCkPaVne8ZDocZpJdvKShAo4,22596
33
- railmux/runtime_config.py,sha256=V3TFnYhAF9hZxWOy-AxTcqvGpnHKt_1KX1S-9Vbwm8M,6108
33
+ railmux/runtime_config.py,sha256=awboGj9k1OsVjTWLajPmVQbgTD4mWp_6Zz2UkJMW_50,6228
34
34
  railmux/scroll_agent.py,sha256=TU8vIBt-37o0Znzl9DFKd2TUUhj41jxzBM2NNrNF6DA,6377
35
35
  railmux/scroll_manager.py,sha256=c8Zdwv8Cfe2x0EXo-RI8nSWiCHKdOwnB5Af8vUX3n5s,9958
36
36
  railmux/selection_isolation.py,sha256=Fgc3BQVra0LkWFanu17Y7crskC4AKdy1Fcp_RXMxjtU,6502
37
- railmux/self_update.py,sha256=gLb70YA9MqBlYnZbFmswbYPNm9fL3nivodKHDLE088A,6866
37
+ railmux/self_update.py,sha256=1s6cJdX3UCbJzmETwXOwcZZbyX4UNiBO9DrJrWpmfPE,6926
38
38
  railmux/session_cache.py,sha256=Sw5_d_z5B9tDOxFZKrCD8Qv2F0Wab7p0fxUCbv974uY,4826
39
- railmux/session_index.py,sha256=fzAEenTmek7xWvRUu3FMguxMS28wcNO3eEyxGK8f_go,9775
39
+ railmux/session_index.py,sha256=NN3ojfyj0eN9mPOhCflQXABkGKHOBHd3ZzeSM2Gvc1I,9811
40
40
  railmux/setting_contracts.py,sha256=Xrb4t7Q0FJT-jlmkmFJ1MCpqEQBEdlz1oHnxftT4Ag4,2479
41
- railmux/settings.py,sha256=r5W4mNB6tcF9c6l_5-BC3HeP0GWoTYL6JfCHh-OZ_eY,11273
41
+ railmux/settings.py,sha256=UjFlgpCL4QMxtYV7tQxOxlORgJHE-5IJ1ceSl2n6WcA,11289
42
42
  railmux/ssh_args.py,sha256=vW97O18d_8sTrMqDwC10bB61Xtzyx3TzfKjRk6HNzx8,2312
43
43
  railmux/ssh_compat.py,sha256=wr2R0jBXbfKiqE46UQD9gWh8C4jWxx_-TdeND79hgss,5856
44
44
  railmux/ssh_display_diagnostics.py,sha256=iqGnQkET1HUKU4xWgq0yG-DhpTfOoL3t4YY1LWd5M5A,9052
@@ -47,14 +47,14 @@ railmux/system_deps.py,sha256=WAW58lDYxf5VSqIPnVeUxjhqUTnB2V_8eV4n-7CmS7s,6516
47
47
  railmux/terminal_emulator.py,sha256=F3SX2ufLW4j3x61jN1TQYJDcAZnr8g0LWoGBNVdPVHA,6553
48
48
  railmux/terminal_status.py,sha256=JiugQ37ipGHO2PmYUQgLAUuagO8guV7vWP4mvt-SGrw,2104
49
49
  railmux/tmux_binding_manager.py,sha256=qrCsq7TCYLUXPJGzqO1eODDoh5RFHQLt8l9yPtbZb88,32492
50
- railmux/tmux_ctl.py,sha256=4XOSyOvPym-KB7jNo74cEOUXRabEp_1zOi-GtTYT7cQ,109918
50
+ railmux/tmux_ctl.py,sha256=GotCjRR889siQ5J6DH9WYlBR8V7YBDiC39lsOZ9635M,110298
51
51
  railmux/tmux_health.py,sha256=0v6n9hLE0FJRdULisOFyCzs8p-6ZuoMugSSoXEnITLs,8535
52
52
  railmux/tmux_server.py,sha256=JLnAsoGIYUstX-zqA64qS__1gbyEomv2jIikVDyBxs8,18940
53
- railmux/tool_panes.py,sha256=2QeEzCzM-eMz-bMVqkedfuRuKkd4D4byEfZpI1XugLY,39728
53
+ railmux/tool_panes.py,sha256=Pz5XQECzi4uvE_X3wtO4PTqj508sOKyNnww4UAXNhQs,39796
54
54
  railmux/transcript.py,sha256=kY7WlcfqqWDxnzkLiH86pxL6RGQsKE0mdcNY6wBleTw,24528
55
55
  railmux/mux/__init__.py,sha256=TC3R-RxsCqzwm8Uq4rSJYQjo-jjlwsw9FY-0lMXEStA,257
56
56
  railmux/mux/backend.py,sha256=_QO9uFvuTEMYwtlfjTjFCZl1-uHwCJQ0QOOx1tfHMDs,2081
57
- railmux/mux/tmux_backend.py,sha256=rtzUG8ZdnxaKP2Z2itoEGb9ztPv2haxT1g_Lc6Oe7tg,5313
57
+ railmux/mux/tmux_backend.py,sha256=F-XqRoG-fHxeqPnd-Va8YyeN4ub6n-tqc3eogT_g2uA,5381
58
58
  railmux/platform/__init__.py,sha256=e9oF_PbVGfa9OqlsvBx0IhhOkZZDARIssRbLQRkzPKc,1340
59
59
  railmux/platform/config_paths.py,sha256=EOqXGvopdrJRaxWaRmq-EkM2clxG5WevwoAZpxZcMd0,917
60
60
  railmux/platform/console.py,sha256=P8VTwRRykJvXVDC4Mi3boPda7cJXtN_T2GzmSpb6CUM,6822
@@ -65,7 +65,7 @@ railmux/platform/process.py,sha256=ath6FNL_IQPG9X0KtjU6GAoMT_fBhMMVTyWGHJHSnIY,6
65
65
  railmux/platform/runtime_paths.py,sha256=XUr7yYvApV0N_nE6yXPK1kuj3Y-8nZUi2mRcKuMGB6s,2836
66
66
  railmux/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
67
  railmux/ui/_widgets.py,sha256=0JOHrqJ2-zvmMNmRaOxO5d7fuqeC8kRPXDf2otZcKA8,8933
68
- railmux/ui/app.py,sha256=t9qrLlpMIDb567d3YjHZNfHCI8NuLRFUJCyWDCXD7X4,460216
68
+ railmux/ui/app.py,sha256=9ZU5sK5go7W8Jk6b_36emTFX8kpDHUfsfh4et1QUShs,460374
69
69
  railmux/ui/keymap.py,sha256=L-iSX5liFFMEj6k66oolEw5NAJzFKMax8Wq0jFrsvAs,6882
70
70
  railmux/ui/modals.py,sha256=KaxWN8AGAgmXSv_c5uGajL1YeWDo21zWJx_UiXn51sM,49684
71
71
  railmux/ui/projects_pane.py,sha256=TnQAWBJYFPv4-e8_jVrHRVlh2bFEm9SaKYxDebnWqLM,9209
@@ -84,9 +84,9 @@ railmux/winlocal/history_viewer.py,sha256=ERlIPnHGmkajzskxQZzO-ZUexXcCLq-oVUtMIq
84
84
  railmux/winlocal/ipc.py,sha256=3xQYs_F2f3nA4aP6Vlo-GCwowOVC5mdQ_yuSaxQOr94,2382
85
85
  railmux/winlocal/session_store.py,sha256=5Dxiz6AjpmC-gKLenzX-oCb1EkahVYC8aYtxeIu65BE,3284
86
86
  railmux/winlocal/virtual_screen.py,sha256=03_ScgDJscO8SHMqscNfIn4_q6tx1cIlqCFgqrlnKEU,3495
87
- railmux-0.3.2.dev2.dist-info/licenses/LICENSE,sha256=xnLXR7xpCcm1-hEv126WiSuPgjJvalI_LpKbY3E8qiY,1069
88
- railmux-0.3.2.dev2.dist-info/METADATA,sha256=Q5NJOct4p1OnOF2S_NXrnnlNTmLDK4e0YCtocRqvWyg,41667
89
- railmux-0.3.2.dev2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
90
- railmux-0.3.2.dev2.dist-info/entry_points.txt,sha256=VD-VJ3G0m7_5ND2bZr_tAm3gPx5RF-mzbl5wP2WHqKg,45
91
- railmux-0.3.2.dev2.dist-info/top_level.txt,sha256=b39h282u-2T3hVrzH4702rHKHPMF0pySYn4LpBVrtlk,8
92
- railmux-0.3.2.dev2.dist-info/RECORD,,
87
+ railmux-0.3.2.dev4.dist-info/licenses/LICENSE,sha256=xnLXR7xpCcm1-hEv126WiSuPgjJvalI_LpKbY3E8qiY,1069
88
+ railmux-0.3.2.dev4.dist-info/METADATA,sha256=ZD2npzgN_UQ-kL80jtvyP6DNdeFwWRBqFtveUXx5Q6U,41667
89
+ railmux-0.3.2.dev4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
90
+ railmux-0.3.2.dev4.dist-info/entry_points.txt,sha256=VD-VJ3G0m7_5ND2bZr_tAm3gPx5RF-mzbl5wP2WHqKg,45
91
+ railmux-0.3.2.dev4.dist-info/top_level.txt,sha256=b39h282u-2T3hVrzH4702rHKHPMF0pySYn4LpBVrtlk,8
92
+ railmux-0.3.2.dev4.dist-info/RECORD,,