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.
Files changed (361) hide show
  1. {swarph_cli-0.53.1/src/swarph_cli.egg-info → swarph_cli-0.53.2}/PKG-INFO +1 -1
  2. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/pyproject.toml +1 -1
  3. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/__init__.py +1 -1
  4. swarph_cli-0.53.2/src/swarph_cli/systemd/swarph-monitor-reexec.service +50 -0
  5. {swarph_cli-0.53.1 → swarph_cli-0.53.2/src/swarph_cli.egg-info}/PKG-INFO +1 -1
  6. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_654_reexec.py +54 -4
  7. swarph_cli-0.53.1/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -22
  8. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/LICENSE +0 -0
  9. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/README.md +0 -0
  10. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/setup.cfg +0 -0
  11. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/__main__.py +0 -0
  12. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/__init__.py +0 -0
  13. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/backends.py +0 -0
  14. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/pack.py +0 -0
  15. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/prices.py +0 -0
  16. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/quality.py +0 -0
  17. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/refresh_prices.py +0 -0
  18. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/runner.py +0 -0
  19. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/bench/validate.py +0 -0
  20. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/caller.py +0 -0
  21. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/__init__.py +0 -0
  22. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/harden.py +0 -0
  23. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/lineage.py +0 -0
  24. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/liveness.py +0 -0
  25. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/manifest.py +0 -0
  26. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/paths.py +0 -0
  27. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/capture/verify.py +0 -0
  28. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/cell.py +0 -0
  29. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/chain_token.py +0 -0
  30. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/__init__.py +0 -0
  31. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/_content.py +0 -0
  32. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/_display.py +0 -0
  33. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/_gateway_client.py +0 -0
  34. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/add.py +0 -0
  35. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/bench.py +0 -0
  36. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/board.py +0 -0
  37. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/board_merge_check.py +0 -0
  38. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/brain.py +0 -0
  39. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/brain_ask.py +0 -0
  40. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/cell.py +0 -0
  41. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
  42. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/channel.py +0 -0
  43. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/chat.py +0 -0
  44. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codegraph.py +0 -0
  45. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codegraph_hook.py +0 -0
  46. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codex_hook_output.py +0 -0
  47. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/codex_waker.py +0 -0
  48. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/compress.py +0 -0
  49. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/daemon.py +0 -0
  50. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/event.py +0 -0
  51. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/gateway.py +0 -0
  52. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/gh_route.py +0 -0
  53. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/group.py +0 -0
  54. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/guide.py +0 -0
  55. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/highlight.py +0 -0
  56. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/hook_output.py +0 -0
  57. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/hooks.py +0 -0
  58. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/import_session.py +0 -0
  59. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/init.py +0 -0
  60. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
  61. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_hook.py +0 -0
  62. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_multiplexer.py +0 -0
  63. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
  64. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/install_wake_hook.py +0 -0
  65. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/lane.py +0 -0
  66. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/mcp_server.py +0 -0
  67. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory.py +0 -0
  68. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
  69. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/memory_sync.py +0 -0
  70. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/mesh.py +0 -0
  71. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/monitor.py +0 -0
  72. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/okf_links.py +0 -0
  73. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/onboard.py +0 -0
  74. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
  75. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
  76. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/protocol_handler.py +0 -0
  77. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/ratify.py +0 -0
  78. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/schedule.py +0 -0
  79. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/security.py +0 -0
  80. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/service.py +0 -0
  81. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/spawn.py +0 -0
  82. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/timeline.py +0 -0
  83. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/version.py +0 -0
  84. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/wake_hook_output.py +0 -0
  85. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/commands/watchdog.py +0 -0
  86. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/__init__.py +0 -0
  87. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/levers.py +0 -0
  88. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/marker.py +0 -0
  89. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/compress/verify.py +0 -0
  90. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/console_safe.py +0 -0
  91. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/delivery_queue.py +0 -0
  92. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/__init__.py +0 -0
  93. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/feature_registry.py +0 -0
  94. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/lanes_control.py +0 -0
  95. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/schema.sql +0 -0
  96. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/server.py +0 -0
  97. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway/services_control.py +0 -0
  98. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gateway_default.py +0 -0
  99. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/gh_identity.py +0 -0
  100. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/guide/GUIDE.md +0 -0
  101. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/main.py +0 -0
  102. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/multiplexer.py +0 -0
  103. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/parsers/__init__.py +0 -0
  104. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/parsers/claude.py +0 -0
  105. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
  106. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
  107. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
  108. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
  109. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
  110. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
  111. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
  112. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
  113. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
  114. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
  115. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
  116. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_executor.py +0 -0
  117. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_executor_windows.py +0 -0
  118. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_reconciliation.py +0 -0
  119. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_reply_outbox.py +0 -0
  120. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_host.py +0 -0
  121. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_payload.py +0 -0
  122. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_service_reply.py +0 -0
  123. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/peer_staging.py +0 -0
  124. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/__init__.py +0 -0
  125. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
  126. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
  127. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
  128. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
  129. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/service/__init__.py +0 -0
  130. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/service/app.py +0 -0
  131. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/service/providers.py +0 -0
  132. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/session_bridge.py +0 -0
  133. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
  134. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
  135. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/stall_alert.py +0 -0
  136. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/codex-waker.default +0 -0
  137. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
  138. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
  139. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
  140. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
  141. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
  142. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
  143. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
  144. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
  145. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
  146. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
  147. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
  148. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
  149. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli/tokens.py +0 -0
  150. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/SOURCES.txt +0 -0
  151. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
  152. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/entry_points.txt +0 -0
  153. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/requires.txt +0 -0
  154. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/src/swarph_cli.egg-info/top_level.txt +0 -0
  155. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_124_register_merge.py +0 -0
  156. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_132_ensure_monitor_state_dir.py +0 -0
  157. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_201_win32_bash_refusal.py +0 -0
  158. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_243_onboard_per_peer_token.py +0 -0
  159. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_307_task4_ask_reply.py +0 -0
  160. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
  161. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_319_refusal_exit_codes.py +0 -0
  162. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_323_mistral_backend.py +0 -0
  163. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_397_gh_identity_router.py +0 -0
  164. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_397_router_preflight.py +0 -0
  165. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_467b_onboard_operator_credential.py +0 -0
  166. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_523_guide.py +0 -0
  167. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_524_conftest_hermeticity.py +0 -0
  168. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_532_accept_flag.py +0 -0
  169. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_535_version_capability.py +0 -0
  170. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_546_default_gateway.py +0 -0
  171. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_548_gateway_remainder.py +0 -0
  172. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_552_codegraph_gateway.py +0 -0
  173. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_555_relay_row_shape.py +0 -0
  174. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_556_relay_freshness.py +0 -0
  175. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
  176. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_579_register_bootstrap_message.py +0 -0
  177. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_644_monitor_supervision.py +0 -0
  178. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_648_install_unit.py +0 -0
  179. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_84_cli_labels.py +0 -0
  180. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_add_security_gate.py +0 -0
  181. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_add.py +0 -0
  182. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_hash.py +0 -0
  183. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_lib.py +0 -0
  184. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_mcp.py +0 -0
  185. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_skill.py +0 -0
  186. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_tool.py +0 -0
  187. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_artifact_uri.py +0 -0
  188. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_backends.py +0 -0
  189. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_command.py +0 -0
  190. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_pack.py +0 -0
  191. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_prices.py +0 -0
  192. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_quality.py +0 -0
  193. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_runner.py +0 -0
  194. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_bench_validate.py +0 -0
  195. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_card_thread.py +0 -0
  196. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_command.py +0 -0
  197. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_merge_check.py +0 -0
  198. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_board_obligation_close.py +0 -0
  199. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_ask_command.py +0 -0
  200. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_ask_env_diagnosis.py +0 -0
  201. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_ask_identity_explicitness.py +0 -0
  202. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_brain_command.py +0 -0
  203. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_caller_meta_guard.py +0 -0
  204. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_lineage.py +0 -0
  205. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_liveness.py +0 -0
  206. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_manifest.py +0 -0
  207. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_paths.py +0 -0
  208. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_capture_security.py +0 -0
  209. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_command_dispatch.py +0 -0
  210. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_harden.py +0 -0
  211. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_loader.py +0 -0
  212. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_selfcheck.py +0 -0
  213. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cell_verify.py +0 -0
  214. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_chain_token.py +0 -0
  215. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_command.py +0 -0
  216. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_poll_never_breaks_dms.py +0 -0
  217. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_post.py +0 -0
  218. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_channel_wake_policy_filter.py +0 -0
  219. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_chat_command.py +0 -0
  220. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_claude_parser.py +0 -0
  221. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_claude_tmux_template.py +0 -0
  222. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_caller_scope.py +0 -0
  223. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_command.py +0 -0
  224. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_hook.py +0 -0
  225. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codegraph_mcp.py +0 -0
  226. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_codex_waker.py +0 -0
  227. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_caller_convention.py +0 -0
  228. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_command.py +0 -0
  229. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_levers.py +0 -0
  230. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_marker.py +0 -0
  231. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_compress_verify.py +0 -0
  232. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_console_encoding_e2e.py +0 -0
  233. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_content_composition.py +0 -0
  234. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_cursor_membrane.py +0 -0
  235. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_daemon_command.py +0 -0
  236. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_daemon_console_encoding.py +0 -0
  237. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_daemon_delivery.py +0 -0
  238. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_delivery_queue.py +0 -0
  239. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_display_sanitize.py +0 -0
  240. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_ensure_monitor_no_peer_default.py +0 -0
  241. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_event_emit.py +0 -0
  242. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_feature_to_uri.py +0 -0
  243. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_brain.py +0 -0
  244. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_client.py +0 -0
  245. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_command.py +0 -0
  246. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gateway_message_idempotency.py +0 -0
  247. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_gh_route_doctor_mesh_name.py +0 -0
  248. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_group_command.py +0 -0
  249. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_guide_commands_parse.py +0 -0
  250. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_guide_selfcheck.py +0 -0
  251. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_heartbeat_check.py +0 -0
  252. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_highlight_command.py +0 -0
  253. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hook_output.py +0 -0
  254. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_activity_marker.py +0 -0
  255. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_add.py +0 -0
  256. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_bundle.py +0 -0
  257. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_init.py +0 -0
  258. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_legacy_generation_removal.py +0 -0
  259. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_lifecycle.py +0 -0
  260. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_merge.py +0 -0
  261. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_verify.py +0 -0
  262. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_win32_bash_wrapper.py +0 -0
  263. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_hooks_win32_command_path.py +0 -0
  264. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_import_command.py +0 -0
  265. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_inbox_identity_provenance.py +0 -0
  266. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_init_command.py +0 -0
  267. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_init_provider_menu.py +0 -0
  268. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_codex_hooks.py +0 -0
  269. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_hook.py +0 -0
  270. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_multiplexer_command.py +0 -0
  271. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_postcompact_hook.py +0 -0
  272. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_install_wake_hook.py +0 -0
  273. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_lane_command.py +0 -0
  274. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_main.py +0 -0
  275. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_main_unknown_verb_guard.py +0 -0
  276. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mcp_server.py +0 -0
  277. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_command.py +0 -0
  278. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_gateway.py +0 -0
  279. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_sync.py +0 -0
  280. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_memory_sync_membrane.py +0 -0
  281. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_command.py +0 -0
  282. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_inbox_mark_read.py +0 -0
  283. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_inbox_sanitize.py +0 -0
  284. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_send_unknown_peer.py +0 -0
  285. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_sidecar.py +0 -0
  286. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
  287. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
  288. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_meta_edge_identity.py +0 -0
  289. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_channel_poll.py +0 -0
  290. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_cli.py +0 -0
  291. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_daemon_collision.py +0 -0
  292. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_self_name_verification.py +0 -0
  293. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_monitor_state_split.py +0 -0
  294. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_multiplexer.py +0 -0
  295. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_muse_membrane.py +0 -0
  296. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_muse_own_cli.py +0 -0
  297. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_obligation_close_is_surfaced.py +0 -0
  298. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_okf_links.py +0 -0
  299. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_onboard_command.py +0 -0
  300. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_packaged_artifacts_exist.py +0 -0
  301. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_packaged_skills.py +0 -0
  302. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_executor.py +0 -0
  303. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_executor_windows.py +0 -0
  304. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_drain_command.py +0 -0
  305. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_drain_supervisor.py +0 -0
  306. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_outbox.py +0 -0
  307. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_reply_transport.py +0 -0
  308. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_e2e.py +0 -0
  309. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_host.py +0 -0
  310. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_payload.py +0 -0
  311. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_peer_service_reply.py +0 -0
  312. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_postcompact_recall.py +0 -0
  313. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_process_liveness.py +0 -0
  314. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_protocol_handler.py +0 -0
  315. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_providers_isolation.py +0 -0
  316. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_ratify_command.py +0 -0
  317. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_readme_claims_no_gateway_default.py +0 -0
  318. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_repl_caller_convention.py +0 -0
  319. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_schedule_command.py +0 -0
  320. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_schedule_create_contract.py +0 -0
  321. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_security.py +0 -0
  322. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_service_app.py +0 -0
  323. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_service_command.py +0 -0
  324. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_service_providers.py +0 -0
  325. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_bridge_inject.py +0 -0
  326. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_bridge_probe.py +0 -0
  327. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_bridge_resolve.py +0 -0
  328. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_session_path_role_gate.py +0 -0
  329. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_shipped_units_match_the_cli.py +0 -0
  330. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_smoke_chat.py +0 -0
  331. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_smoke_one_shot.py +0 -0
  332. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_smoke_phase_5_5.py +0 -0
  333. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_base_hoist.py +0 -0
  334. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_command.py +0 -0
  335. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_identity_stamp.py +0 -0
  336. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_live_pin.py +0 -0
  337. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_mitosis_lineage.py +0 -0
  338. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_tmux_session.py +0 -0
  339. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_spawn_windows_relaunch.py +0 -0
  340. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_stall_alert.py +0 -0
  341. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_subprocess_decode_encoding.py +0 -0
  342. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_timeline_command.py +0 -0
  343. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_runstate_defer.py +0 -0
  344. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_session_reanchor.py +0 -0
  345. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_stale.py +0 -0
  346. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_tmux_wake_submit_verify.py +0 -0
  347. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_token_file_one_parser.py +0 -0
  348. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_token_precedence_explicit_first.py +0 -0
  349. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_unified_token_resolver.py +0 -0
  350. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_version_command.py +0 -0
  351. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_version_consistency.py +0 -0
  352. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_vibe_membrane.py +0 -0
  353. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog.py +0 -0
  354. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake.py +0 -0
  355. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
  356. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_dm_wake_wiring.py +0 -0
  357. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_emit_health.py +0 -0
  358. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_install_flags.py +0 -0
  359. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_model_rung.py +0 -0
  360. {swarph_cli-0.53.1 → swarph_cli-0.53.2}/tests/test_watchdog_stale_peers.py +0 -0
  361. {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.1
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.1"
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" }
@@ -16,6 +16,6 @@ The architecture splits CLI from substrate so:
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- __version__ = "0.53.1"
19
+ __version__ = "0.53.2"
20
20
 
21
21
  __all__ = ["__version__"]
@@ -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.1
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
- The live accept legs (touch the watched file on a real box; a held cell
24
- stays; the report names the tmux-scoped two) run against the installed
25
- unit — commander-gated. These tests guard everything short of systemd.
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