replx 1.6.3__tar.gz → 1.6.4__tar.gz

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 (138) hide show
  1. {replx-1.6.3/replx.egg-info → replx-1.6.4}/PKG-INFO +1 -1
  2. {replx-1.6.3 → replx-1.6.4}/replx/__init__.py +1 -1
  3. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/core.py +6 -8
  4. {replx-1.6.3 → replx-1.6.4/replx.egg-info}/PKG-INFO +1 -1
  5. {replx-1.6.3 → replx-1.6.4}/LICENSE +0 -0
  6. {replx-1.6.3 → replx-1.6.4}/README.md +0 -0
  7. {replx-1.6.3 → replx-1.6.4}/pyproject.toml +0 -0
  8. {replx-1.6.3 → replx-1.6.4}/replx/cli/__init__.py +0 -0
  9. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/__init__.py +0 -0
  10. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/client/__init__.py +0 -0
  11. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/client/core.py +0 -0
  12. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/client/session.py +0 -0
  13. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/protocol.py +0 -0
  14. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/__init__.py +0 -0
  15. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/__main__.py +0 -0
  16. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/command_dispatcher.py +0 -0
  17. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/connection_manager.py +0 -0
  18. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/handlers/__init__.py +0 -0
  19. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/handlers/exec.py +0 -0
  20. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/handlers/filesystem.py +0 -0
  21. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/handlers/repl.py +0 -0
  22. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/handlers/session.py +0 -0
  23. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/handlers/transfer.py +0 -0
  24. {replx-1.6.3 → replx-1.6.4}/replx/cli/agent/server/session_manager.py +0 -0
  25. {replx-1.6.3 → replx-1.6.4}/replx/cli/app.py +0 -0
  26. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/__init__.py +0 -0
  27. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/device.py +0 -0
  28. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/exec.py +0 -0
  29. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/file.py +0 -0
  30. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/firmware.py +0 -0
  31. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/package.py +0 -0
  32. {replx-1.6.3 → replx-1.6.4}/replx/cli/commands/utility.py +0 -0
  33. {replx-1.6.3 → replx-1.6.4}/replx/cli/config.py +0 -0
  34. {replx-1.6.3 → replx-1.6.4}/replx/cli/connection.py +0 -0
  35. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/__init__.py +0 -0
  36. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/compiler.py +0 -0
  37. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/environment.py +0 -0
  38. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/output.py +0 -0
  39. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/registry.py +0 -0
  40. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/scanner.py +0 -0
  41. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/store.py +0 -0
  42. {replx-1.6.3 → replx-1.6.4}/replx/cli/helpers/updater.py +0 -0
  43. {replx-1.6.3 → replx-1.6.4}/replx/commands.py +0 -0
  44. {replx-1.6.3 → replx-1.6.4}/replx/protocol/__init__.py +0 -0
  45. {replx-1.6.3 → replx-1.6.4}/replx/protocol/repl.py +0 -0
  46. {replx-1.6.3 → replx-1.6.4}/replx/protocol/storage.py +0 -0
  47. {replx-1.6.3 → replx-1.6.4}/replx/terminal.py +0 -0
  48. {replx-1.6.3 → replx-1.6.4}/replx/transport/__init__.py +0 -0
  49. {replx-1.6.3 → replx-1.6.4}/replx/transport/base.py +0 -0
  50. {replx-1.6.3 → replx-1.6.4}/replx/transport/serial.py +0 -0
  51. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/_thread.pyi +0 -0
  52. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/aioble/__init__.pyi +0 -0
  53. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/array.pyi +0 -0
  54. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/asyncio/__init__.pyi +0 -0
  55. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/binascii.pyi +0 -0
  56. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/bluetooth.pyi +0 -0
  57. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/builtins.pyi +0 -0
  58. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/cmath.pyi +0 -0
  59. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/collections.pyi +0 -0
  60. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/cryptolib.pyi +0 -0
  61. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/deflate.pyi +0 -0
  62. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/errno.pyi +0 -0
  63. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/framebuf.pyi +0 -0
  64. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/gc.pyi +0 -0
  65. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/hashlib.pyi +0 -0
  66. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/heapq.pyi +0 -0
  67. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/io.pyi +0 -0
  68. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/json.pyi +0 -0
  69. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/lwip.pyi +0 -0
  70. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/machine.pyi +0 -0
  71. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/math.pyi +0 -0
  72. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/micropython.pyi +0 -0
  73. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/mip/__init__.pyi +0 -0
  74. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/network.pyi +0 -0
  75. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/ntptime.pyi +0 -0
  76. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/os.pyi +0 -0
  77. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/platform.pyi +0 -0
  78. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/random.pyi +0 -0
  79. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/re.pyi +0 -0
  80. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/requests/__init__.pyi +0 -0
  81. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/select.pyi +0 -0
  82. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/socket.pyi +0 -0
  83. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/ssl.pyi +0 -0
  84. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/struct.pyi +0 -0
  85. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/sys.pyi +0 -0
  86. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/time.pyi +0 -0
  87. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/tls.pyi +0 -0
  88. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/uasyncio.pyi +0 -0
  89. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/uctypes.pyi +0 -0
  90. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/urequests.pyi +0 -0
  91. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm/vfs.pyi +0 -0
  92. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/binascii.pyi +0 -0
  93. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/errno.pyi +0 -0
  94. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/hashlib.pyi +0 -0
  95. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/io.pyi +0 -0
  96. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/json.pyi +0 -0
  97. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/machine.pyi +0 -0
  98. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/math.pyi +0 -0
  99. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/micropython.pyi +0 -0
  100. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/network.pyi +0 -0
  101. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/os.pyi +0 -0
  102. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/select.pyi +0 -0
  103. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/socket.pyi +0 -0
  104. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/ssl.pyi +0 -0
  105. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/struct.pyi +0 -0
  106. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/sys.pyi +0 -0
  107. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/time.pyi +0 -0
  108. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/ubinascii.pyi +0 -0
  109. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/ucryptolib.pyi +0 -0
  110. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/uerrno.pyi +0 -0
  111. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/uhashlib.pyi +0 -0
  112. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/uio.pyi +0 -0
  113. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/ujson.pyi +0 -0
  114. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/umachine.pyi +0 -0
  115. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/uos.pyi +0 -0
  116. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/uselect.pyi +0 -0
  117. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/usocket.pyi +0 -0
  118. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/ussl.pyi +0 -0
  119. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/ustruct.pyi +0 -0
  120. {replx-1.6.3 → replx-1.6.4}/replx/typehints/comm_separate/EFR32MG/utime.pyi +0 -0
  121. {replx-1.6.3 → replx-1.6.4}/replx/typehints/core/ESP32/aioespnow.pyi +0 -0
  122. {replx-1.6.3 → replx-1.6.4}/replx/typehints/core/ESP32/esp.pyi +0 -0
  123. {replx-1.6.3 → replx-1.6.4}/replx/typehints/core/ESP32/esp32.pyi +0 -0
  124. {replx-1.6.3 → replx-1.6.4}/replx/typehints/core/ESP32/espnow.pyi +0 -0
  125. {replx-1.6.3 → replx-1.6.4}/replx/typehints/core/MIMXRT1062DVJ6A/mimxrt.pyi +0 -0
  126. {replx-1.6.3 → replx-1.6.4}/replx/typehints/core/RP2350/rp2.pyi +0 -0
  127. {replx-1.6.3 → replx-1.6.4}/replx/utils/__init__.py +0 -0
  128. {replx-1.6.3 → replx-1.6.4}/replx/utils/constants.py +0 -0
  129. {replx-1.6.3 → replx-1.6.4}/replx/utils/device_info.py +0 -0
  130. {replx-1.6.3 → replx-1.6.4}/replx/utils/exceptions.py +0 -0
  131. {replx-1.6.3 → replx-1.6.4}/replx.egg-info/SOURCES.txt +0 -0
  132. {replx-1.6.3 → replx-1.6.4}/replx.egg-info/dependency_links.txt +0 -0
  133. {replx-1.6.3 → replx-1.6.4}/replx.egg-info/entry_points.txt +0 -0
  134. {replx-1.6.3 → replx-1.6.4}/replx.egg-info/requires.txt +0 -0
  135. {replx-1.6.3 → replx-1.6.4}/replx.egg-info/top_level.txt +0 -0
  136. {replx-1.6.3 → replx-1.6.4}/setup.cfg +0 -0
  137. {replx-1.6.3 → replx-1.6.4}/test/test_line_mode_terminal.py +0 -0
  138. {replx-1.6.3 → replx-1.6.4}/test/test_termio.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: replx
3
- Version: 1.6.3
3
+ Version: 1.6.4
4
4
  Summary: replx is a fast, modern MicroPython CLI: turbo REPL, robust file sync (put/get), project install, mpy-cross integration, and smart port discovery.
5
5
  Author-email: "chanmin.park" <devcamp@gmail.com>
6
6
  License-Expression: MIT
@@ -1,5 +1,5 @@
1
1
  __all__ = ["__version__", "get_version", "__description__"]
2
- __version__ = "1.6.3"
2
+ __version__ = "1.6.4"
3
3
  __description__ = "Fast, modern MicroPython CLI with REPL, file sync, install, and smart port detection."
4
4
  __author__ = "PlanX Lab Development Team"
5
5
 
@@ -121,6 +121,7 @@ class AgentServer(
121
121
  self._loop: asyncio.AbstractEventLoop | None = None
122
122
  self._stop_event: asyncio.Event | None = None
123
123
  self._datagram_transport: asyncio.DatagramTransport | None = None
124
+ self._send_socket: Optional[socket.socket] = None
124
125
  self._cleaned_up: bool = False
125
126
 
126
127
  @property
@@ -321,6 +322,7 @@ class AgentServer(
321
322
  local_addr=(AGENT_HOST, self.agent_port),
322
323
  )
323
324
  self._datagram_transport = transport
325
+ self._send_socket = transport.get_extra_info('socket')
324
326
  self.running = True
325
327
  print(f'replx agent started — listening on {AGENT_HOST}:{self.agent_port} (UDP)')
326
328
 
@@ -432,15 +434,11 @@ class AgentServer(
432
434
  conn.stop_detached()
433
435
 
434
436
  def _safe_send(self, data: bytes, addr: tuple) -> None:
435
- """Thread-safe UDP send via the asyncio transport.
436
- Responses come from the agent's bound port (same as V1.0 behavior).
437
- """
438
- transport = self._datagram_transport
439
- loop = self._loop
440
- if not transport or transport.is_closing() or not loop:
437
+ sock = self._send_socket
438
+ if not sock:
441
439
  return
442
440
  try:
443
- loop.call_soon_threadsafe(transport.sendto, data, addr)
441
+ sock.sendto(data, addr)
444
442
  except Exception:
445
443
  pass
446
444
 
@@ -597,7 +595,6 @@ class AgentServer(
597
595
  if not conn:
598
596
  raise ValueError(f"Connection {target_port} not found")
599
597
 
600
- # Disconnect handles stopping detached script and drain thread via stop_detached()
601
598
  self.connection_manager.disconnect(target_port)
602
599
  self.session_manager.remove_connection_from_all_sessions(target_port)
603
600
 
@@ -777,6 +774,7 @@ class AgentServer(
777
774
  transport.close()
778
775
  except Exception:
779
776
  pass
777
+ self._send_socket = None
780
778
  self._fast_executor.shutdown(wait=False, cancel_futures=True)
781
779
  self._slow_executor.shutdown(wait=False, cancel_futures=True)
782
780
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: replx
3
- Version: 1.6.3
3
+ Version: 1.6.4
4
4
  Summary: replx is a fast, modern MicroPython CLI: turbo REPL, robust file sync (put/get), project install, mpy-cross integration, and smart port discovery.
5
5
  Author-email: "chanmin.park" <devcamp@gmail.com>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes