swarph-cli 0.53.1__tar.gz → 0.53.2__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.
- {swarph_cli-0.53.1/src/swarph_cli.egg-info → swarph_cli-0.53.2}/PKG-INFO +1 -1
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/pyproject.toml +1 -1
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/__init__.py +1 -1
- swarph_cli-0.53.2/src/swarph_cli/systemd/swarph-monitor-reexec.service +50 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_654_reexec.py +54 -4
- swarph_cli-0.53.1/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -22
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/LICENSE +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/README.md +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/setup.cfg +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/__main__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/_content.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/board.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/board_merge_check.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codex_hook_output.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codex_waker.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/gh_route.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/guide.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_wake_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/mesh.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/monitor.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/version.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/wake_hook_output.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway_default.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gh_identity.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/guide/GUIDE.md +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/main.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_executor.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_executor_windows.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_reconciliation.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_reply_outbox.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_host.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_payload.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_reply.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_staging.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/codex-waker.default +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/tokens.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/SOURCES.txt +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_124_register_merge.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_132_ensure_monitor_state_dir.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_201_win32_bash_refusal.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_243_onboard_per_peer_token.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_307_task4_ask_reply.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_319_refusal_exit_codes.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_323_mistral_backend.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_397_gh_identity_router.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_397_router_preflight.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_467b_onboard_operator_credential.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_523_guide.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_524_conftest_hermeticity.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_532_accept_flag.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_535_version_capability.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_546_default_gateway.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_548_gateway_remainder.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_552_codegraph_gateway.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_555_relay_row_shape.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_556_relay_freshness.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_579_register_bootstrap_message.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_644_monitor_supervision.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_648_install_unit.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_84_cli_labels.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_card_thread.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_merge_check.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_obligation_close.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_ask_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_ask_identity_explicitness.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_poll_never_breaks_dms.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_wake_policy_filter.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codex_waker.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_content_composition.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cursor_membrane.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_ensure_monitor_no_peer_default.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_message_idempotency.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gh_route_doctor_mesh_name.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_group_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_guide_commands_parse.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_guide_selfcheck.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_heartbeat_check.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_legacy_generation_removal.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_verify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_win32_bash_wrapper.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_win32_command_path.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_import_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_inbox_identity_provenance.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_init_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_init_provider_menu.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_codex_hooks.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_postcompact_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_wake_hook.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_main.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_send_unknown_peer.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_channel_poll.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_muse_membrane.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_muse_own_cli.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_obligation_close_is_surfaced.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_packaged_artifacts_exist.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_packaged_skills.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_executor.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_executor_windows.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_drain_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_drain_supervisor.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_outbox.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_transport.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_e2e.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_host.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_payload.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_reply.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_postcompact_recall.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_readme_claims_no_gateway_default.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_security.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_service_app.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_service_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_identity_stamp.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_subprocess_decode_encoding.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_runstate_defer.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_session_reanchor.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_stale.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_submit_verify.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_token_precedence_explicit_first.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_unified_token_resolver.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_version_command.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_vibe_membrane.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_stale_peers.py +0 -0
- {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_windows_waker_installer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.53.
|
|
3
|
+
Version: 0.53.2
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "swarph-cli"
|
|
7
|
-
version = "0.53.
|
|
7
|
+
version = "0.53.2"
|
|
8
8
|
description = "The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
# #654: the oneshot the .path unit fires. Runs `swarph monitor reexec-on-change`,
|
|
3
|
+
# which restarts each UNIT-OWNED swarph-monitor@<peer> instance — serially with a
|
|
4
|
+
# stagger (R3: eight simultaneous restarts put the whole box's DM path down at
|
|
5
|
+
# once), skipping instances with a recorded reexec hold (R4: a deliberate hold is
|
|
6
|
+
# a correct engineering decision, not drift), reporting every action to the
|
|
7
|
+
# journal (R5), and naming the cells it cannot reach — tmux-scoped monitors are
|
|
8
|
+
# OUT OF SCOPE and must be reported, not omitted (R6).
|
|
9
|
+
#
|
|
10
|
+
# R7: THE RE-EXEC MUST SURVIVE THE INSTALL THAT TRIGGERS IT.
|
|
11
|
+
# `pipx install --force` closes site-packages/__init__.py (PathChanged fires)
|
|
12
|
+
# BEFORE it restores ~/.local/bin/swarph. Measured 2026-08-30 on lab-ovh:
|
|
13
|
+
# __init__.py mtime 11:31:27Z -> PathChanged
|
|
14
|
+
# ~/.local/bin/swarph 11:33:27Z -> shim back
|
|
15
|
+
# shim absent ~120s (one box, one install — treat as a FLOOR, not a constant)
|
|
16
|
+
# A 203/EXEC fails instantly, so each Restart= cycle costs only RestartSec.
|
|
17
|
+
# Coverage of the gap is therefore (StartLimitBurst - 1) * RestartSec:
|
|
18
|
+
# RestartSec=15, StartLimitBurst=17 -> last retry at 240s (>= 2x measured floor)
|
|
19
|
+
# StartLimitIntervalSec must EXCEED that span so the burst is not reset mid-gap
|
|
20
|
+
# (interval > coverage); after coverage the cap terminates a permanent miss.
|
|
21
|
+
# Restart=on-failure (not always — refused for Type=oneshot on systemd 259).
|
|
22
|
+
# A touch on the watched file never reproduces this race: shim stays put.
|
|
23
|
+
#
|
|
24
|
+
# LOUD FAILURE (R5 extended): a permanently failed oneshot must reach an
|
|
25
|
+
# operator. Do NOT bake a box-local alerter into this template — mercury-alert@
|
|
26
|
+
# exists on lab-ovh and not everywhere. Add a drop-in, e.g.
|
|
27
|
+
# OnFailure=mercury-alert@%n.service
|
|
28
|
+
# or the box's equivalent, when installing. The Restart= below closes the race;
|
|
29
|
+
# the drop-in closes the silence if retries exhaust.
|
|
30
|
+
#
|
|
31
|
+
# Runs as root: restarting system units owned by the cells' user requires it.
|
|
32
|
+
# The oneshot itself executes the NEWLY-INSTALLED code — it starts after the
|
|
33
|
+
# install completed, which is exactly the code the fleet is being moved to.
|
|
34
|
+
Description=Re-exec supervised swarph monitors after a swarph-cli reinstall (#654)
|
|
35
|
+
Documentation=https://github.com/BrainSurfing-tech/swarph-cli
|
|
36
|
+
# Cap retries after full gap coverage — see R7 derivation above.
|
|
37
|
+
# Interval (300) > coverage span (240) so the burst is not refreshed mid-gap.
|
|
38
|
+
StartLimitIntervalSec=300
|
|
39
|
+
StartLimitBurst=17
|
|
40
|
+
|
|
41
|
+
[Service]
|
|
42
|
+
Type=oneshot
|
|
43
|
+
# Default oneshot timeout is 90s. Nine stale monitors at the verb's 15s
|
|
44
|
+
# stagger is 135s — PID1 kills the job mid-fleet if we inherit it.
|
|
45
|
+
TimeoutStartSec=5min
|
|
46
|
+
# systemd 230+: Restart=always|on-success are refused for Type=oneshot;
|
|
47
|
+
# Restart=on-failure is accepted (verified systemd-analyze verify on 259).
|
|
48
|
+
Restart=on-failure
|
|
49
|
+
RestartSec=15
|
|
50
|
+
ExecStart=<SWARPH_BIN> monitor reexec-on-change --apply --state-root <STATE_ROOT>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.53.
|
|
3
|
+
Version: 0.53.2
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -19,10 +19,15 @@ The requirements as tests:
|
|
|
19
19
|
the new build.
|
|
20
20
|
R6 monitors systemd does not own (tmux-scoped, hand-started) are NAMED
|
|
21
21
|
out of scope, never omitted.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
R7 the oneshot must survive the install that triggers it: pipx deletes
|
|
23
|
+
~/.local/bin/swarph between closing __init__.py (PathChanged) and
|
|
24
|
+
restoring the shim. Restart=on-failure + RestartSec retries a 203/EXEC
|
|
25
|
+
into the healed state. A touch-based green does NOT prove R7.
|
|
26
|
+
|
|
27
|
+
The live accept legs (real `pipx install --force` on a real box; a held cell
|
|
28
|
+
stays; the report names the tmux-scoped two; a forced 203 is loud) run
|
|
29
|
+
against the installed unit — commander-gated. These tests guard everything
|
|
30
|
+
short of systemd.
|
|
26
31
|
"""
|
|
27
32
|
|
|
28
33
|
from __future__ import annotations
|
|
@@ -112,6 +117,51 @@ def test_oneshot_timeout_outlasts_a_full_fleet_stagger():
|
|
|
112
117
|
assert seconds >= 180, f"{raw!r} is still shorter than a full-fleet stagger"
|
|
113
118
|
|
|
114
119
|
|
|
120
|
+
def test_oneshot_retries_through_the_pipx_shim_race():
|
|
121
|
+
"""R7: PathChanged fires when pipx closes __init__.py, BEFORE the
|
|
122
|
+
~/.local/bin/swarph shim is restored. Without Restart=on-failure the
|
|
123
|
+
oneshot dies 203/EXEC once and the .path unit stays green while the
|
|
124
|
+
fleet stays stale (lab-ovh 2026-08-30). Restart=always is refused for
|
|
125
|
+
Type=oneshot — on-failure is the legal retry.
|
|
126
|
+
|
|
127
|
+
A 203/EXEC fails instantly, so coverage is (Burst-1)*RestartSec. The
|
|
128
|
+
measured shim gap on lab-ovh was ~120s; drop's review pins coverage
|
|
129
|
+
>= 240s (2x floor) and Interval > that span so the limit is not reset
|
|
130
|
+
mid-gap. Presence of the keys alone is not enough — arithmetic must hold.
|
|
131
|
+
"""
|
|
132
|
+
text = monitor._read_packaged(("systemd", "swarph-monitor-reexec.service"))
|
|
133
|
+
assert "Type=oneshot" in text
|
|
134
|
+
restarts = [ln for ln in text.splitlines() if ln.startswith("Restart=")]
|
|
135
|
+
assert restarts == ["Restart=on-failure"], restarts
|
|
136
|
+
|
|
137
|
+
def _sec(key: str) -> float:
|
|
138
|
+
lines = [ln for ln in text.splitlines() if ln.startswith(f"{key}=")]
|
|
139
|
+
assert lines, f"{key}= missing"
|
|
140
|
+
raw = lines[0].split("=", 1)[1].strip().lower()
|
|
141
|
+
if raw.endswith("min"):
|
|
142
|
+
return float(raw[:-3]) * 60
|
|
143
|
+
return float(raw.rstrip("s"))
|
|
144
|
+
|
|
145
|
+
restart_sec = _sec("RestartSec")
|
|
146
|
+
burst_lines = [ln for ln in text.splitlines() if ln.startswith("StartLimitBurst=")]
|
|
147
|
+
assert burst_lines, "StartLimitBurst= missing"
|
|
148
|
+
burst = int(burst_lines[0].split("=", 1)[1].strip())
|
|
149
|
+
interval = _sec("StartLimitIntervalSec")
|
|
150
|
+
coverage = (burst - 1) * restart_sec
|
|
151
|
+
assert coverage >= 240, (
|
|
152
|
+
f"retry coverage {coverage}s = ({burst}-1)*{restart_sec}s is shorter "
|
|
153
|
+
f"than the 240s floor (2x the measured 120s shim gap)")
|
|
154
|
+
assert interval > coverage, (
|
|
155
|
+
f"StartLimitIntervalSec={interval} must exceed coverage span {coverage} "
|
|
156
|
+
f"or the burst resets mid-gap and never terminates")
|
|
157
|
+
# Box-local alerters (mercury-alert@) must NOT be baked into the template
|
|
158
|
+
# as a live directive (a comment naming the drop-in pattern is fine).
|
|
159
|
+
live = [ln for ln in text.splitlines()
|
|
160
|
+
if ln.startswith("OnFailure=")]
|
|
161
|
+
assert not live, (
|
|
162
|
+
f"OnFailure= couples every install to one box's alerter — use a drop-in: {live}")
|
|
163
|
+
|
|
164
|
+
|
|
115
165
|
def test_path_unit_uses_pathchanged_never_pathmodified():
|
|
116
166
|
text = monitor._read_packaged(("systemd", "swarph-monitor-reexec.path"))
|
|
117
167
|
directives = [line for line in text.splitlines()
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
[Unit]
|
|
2
|
-
# #654: the oneshot the .path unit fires. Runs `swarph monitor reexec-on-change`,
|
|
3
|
-
# which restarts each UNIT-OWNED swarph-monitor@<peer> instance — serially with a
|
|
4
|
-
# stagger (R3: eight simultaneous restarts put the whole box's DM path down at
|
|
5
|
-
# once), skipping instances with a recorded reexec hold (R4: a deliberate hold is
|
|
6
|
-
# a correct engineering decision, not drift), reporting every action to the
|
|
7
|
-
# journal (R5), and naming the cells it cannot reach — tmux-scoped monitors are
|
|
8
|
-
# OUT OF SCOPE and must be reported, not omitted (R6).
|
|
9
|
-
#
|
|
10
|
-
# Runs as root: restarting system units owned by the cells' user requires it.
|
|
11
|
-
# The oneshot itself executes the NEWLY-INSTALLED code — it starts after the
|
|
12
|
-
# install completed, which is exactly the code the fleet is being moved to.
|
|
13
|
-
Description=Re-exec supervised swarph monitors after a swarph-cli reinstall (#654)
|
|
14
|
-
Documentation=https://github.com/BrainSurfing-tech/swarph-cli
|
|
15
|
-
# After the path unit fires; nothing else to order against.
|
|
16
|
-
|
|
17
|
-
[Service]
|
|
18
|
-
Type=oneshot
|
|
19
|
-
# Default oneshot timeout is 90s. Nine stale monitors at the verb's 15s
|
|
20
|
-
# stagger is 135s — PID1 kills the job mid-fleet if we inherit it.
|
|
21
|
-
TimeoutStartSec=5min
|
|
22
|
-
ExecStart=<SWARPH_BIN> monitor reexec-on-change --apply --state-root <STATE_ROOT>
|
|
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
|
|
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
|
|
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
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh
RENAMED
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh
RENAMED
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh
RENAMED
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/precompact-flag.sh
RENAMED
|
File without changes
|
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh
RENAMED
|
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
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_codex_waker_windows.ps1
RENAMED
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_monitor_task_windows.ps1
RENAMED
|
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
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service
RENAMED
|
File without changes
|
{swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer
RENAMED
|
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
|