forgexa-cli 1.64.0__tar.gz → 1.64.1__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.
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/PKG-INFO +1 -1
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/__init__.py +1 -1
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/daemon.py +28 -1
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli.egg-info/PKG-INFO +1 -1
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/pyproject.toml +1 -1
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/README.md +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/_build_config.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/_local_bind.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/agent_core.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/autoupgrade.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/aws_evidence.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/main.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/py.typed +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/runtime_evidence.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli/zcode_protocol.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli.egg-info/SOURCES.txt +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli.egg-info/dependency_links.txt +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli.egg-info/entry_points.txt +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli.egg-info/requires.txt +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/forgexa_cli.egg-info/top_level.txt +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/setup.cfg +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_auth_and_runtime_commands.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_autoupgrade.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_check_command.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_expiry_warnings_and_revoke.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_local_bind_commands.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_runtime_credentials.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_session_credentials.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_silent_install.py +0 -0
- {forgexa_cli-1.64.0 → forgexa_cli-1.64.1}/tests/test_upgrade_observability.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""forgexa-cli — Forgexa command-line client."""
|
|
2
|
-
__version__ = "1.64.
|
|
2
|
+
__version__ = "1.64.1"
|
|
@@ -1231,7 +1231,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
1231
1231
|
# DAEMON_VERSION is the protocol/logic version of the daemon code.
|
|
1232
1232
|
# Kept in sync with pyproject.toml version via bump-version.sh.
|
|
1233
1233
|
# CLIENT_TYPE identifies which packaging/distribution this daemon runs in.
|
|
1234
|
-
DAEMON_VERSION = "1.64.
|
|
1234
|
+
DAEMON_VERSION = "1.64.1"
|
|
1235
1235
|
|
|
1236
1236
|
|
|
1237
1237
|
def _detect_client_type() -> str:
|
|
@@ -18681,10 +18681,37 @@ class RuntimeDaemon:
|
|
|
18681
18681
|
self._shutdown_event.set()
|
|
18682
18682
|
|
|
18683
18683
|
|
|
18684
|
+
def _start_desktop_parent_monitor(daemon, loop):
|
|
18685
|
+
"""Stop only an explicitly Desktop-owned daemon when its parent pipe closes."""
|
|
18686
|
+
if sys.platform != "win32" or os.environ.pop("FORGEXA_DESKTOP_PARENT_PIPE", None) != "1":
|
|
18687
|
+
return None
|
|
18688
|
+
stream = sys.stdin
|
|
18689
|
+
if stream is None:
|
|
18690
|
+
raise RuntimeError("Desktop parent pipe is unavailable")
|
|
18691
|
+
import threading
|
|
18692
|
+
|
|
18693
|
+
def monitor():
|
|
18694
|
+
try:
|
|
18695
|
+
while stream.read(1):
|
|
18696
|
+
pass
|
|
18697
|
+
except (OSError, ValueError):
|
|
18698
|
+
pass
|
|
18699
|
+
try:
|
|
18700
|
+
# Capture the running loop here, not in this background thread.
|
|
18701
|
+
loop.call_soon_threadsafe(daemon.handle_signal, signal.SIGTERM)
|
|
18702
|
+
except RuntimeError:
|
|
18703
|
+
pass # The daemon has already closed its loop.
|
|
18704
|
+
|
|
18705
|
+
thread = threading.Thread(target=monitor, name="desktop-parent-pipe", daemon=True)
|
|
18706
|
+
thread.start()
|
|
18707
|
+
return thread
|
|
18708
|
+
|
|
18709
|
+
|
|
18684
18710
|
async def main():
|
|
18685
18711
|
daemon = RuntimeDaemon()
|
|
18686
18712
|
|
|
18687
18713
|
loop = asyncio.get_event_loop()
|
|
18714
|
+
_start_desktop_parent_monitor(daemon, loop)
|
|
18688
18715
|
if sys.platform != "win32":
|
|
18689
18716
|
for sig in (signal.SIGINT, signal.SIGTERM):
|
|
18690
18717
|
loop.add_signal_handler(sig, daemon.handle_signal, sig)
|
|
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
|