swarph-cli 0.72.37__tar.gz → 0.72.39__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 (561) hide show
  1. {swarph_cli-0.72.37/src/swarph_cli.egg-info → swarph_cli-0.72.39}/PKG-INFO +1 -1
  2. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/pyproject.toml +1 -1
  3. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/__init__.py +1 -1
  4. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/board.py +24 -0
  5. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/duplicate_session.py +71 -9
  6. {swarph_cli-0.72.37 → swarph_cli-0.72.39/src/swarph_cli.egg-info}/PKG-INFO +1 -1
  7. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/SOURCES.txt +2 -0
  8. swarph_cli-0.72.39/tests/test_1353_obligation_release_cli.py +14 -0
  9. swarph_cli-0.72.39/tests/test_1385_duplicate_session_argv.py +188 -0
  10. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_513_duplicate_session.py +1 -0
  11. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/LICENSE +0 -0
  12. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/README.md +0 -0
  13. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/setup.cfg +0 -0
  14. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/__main__.py +0 -0
  15. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/__init__.py +0 -0
  16. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/backends.py +0 -0
  17. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/claude_cli.py +0 -0
  18. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/codex_cli.py +0 -0
  19. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/pack.py +0 -0
  20. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/prices.py +0 -0
  21. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/providers.py +0 -0
  22. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/quality.py +0 -0
  23. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/refresh_prices.py +0 -0
  24. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/rules.py +0 -0
  25. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/runner.py +0 -0
  26. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/signal_score.py +0 -0
  27. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/bench/validate.py +0 -0
  28. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/caller.py +0 -0
  29. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/__init__.py +0 -0
  30. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/harden.py +0 -0
  31. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/lineage.py +0 -0
  32. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/liveness.py +0 -0
  33. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/manifest.py +0 -0
  34. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/paths.py +0 -0
  35. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/capture/verify.py +0 -0
  36. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/cell.py +0 -0
  37. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/chain_token.py +0 -0
  38. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/channel.py +0 -0
  39. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/__init__.py +0 -0
  40. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/_content.py +0 -0
  41. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/_display.py +0 -0
  42. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/_gateway_client.py +0 -0
  43. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/add.py +0 -0
  44. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/bench.py +0 -0
  45. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/board_cost.py +0 -0
  46. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/board_merge_check.py +0 -0
  47. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/board_usage.py +0 -0
  48. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/brain.py +0 -0
  49. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/brain_ask.py +0 -0
  50. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/cell.py +0 -0
  51. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/cell_probe.py +0 -0
  52. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
  53. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/channel.py +0 -0
  54. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/chat.py +0 -0
  55. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/codegraph.py +0 -0
  56. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/codegraph_hook.py +0 -0
  57. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/codex_hook_output.py +0 -0
  58. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/codex_waker.py +0 -0
  59. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/commander.py +0 -0
  60. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/committee.py +0 -0
  61. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/compress.py +0 -0
  62. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/daemon.py +0 -0
  63. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/dreaming.py +0 -0
  64. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/event.py +0 -0
  65. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/gateway.py +0 -0
  66. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/gh_route.py +0 -0
  67. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/group.py +0 -0
  68. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/guide.py +0 -0
  69. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/highlight.py +0 -0
  70. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/hook_interpreter.py +0 -0
  71. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/hook_output.py +0 -0
  72. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/hooks.py +0 -0
  73. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/import_session.py +0 -0
  74. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/init.py +0 -0
  75. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
  76. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_hook.py +0 -0
  77. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_multiplexer.py +0 -0
  78. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
  79. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
  80. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_wake_hook.py +0 -0
  81. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/lane.py +0 -0
  82. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/mcp_server.py +0 -0
  83. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/memory.py +0 -0
  84. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
  85. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/memory_sync.py +0 -0
  86. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/mesh.py +0 -0
  87. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/monitor.py +0 -0
  88. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/okf_links.py +0 -0
  89. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/onboard.py +0 -0
  90. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
  91. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
  92. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/protocol_handler.py +0 -0
  93. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/ratify.py +0 -0
  94. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/roster.py +0 -0
  95. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/rowclear_hook.py +0 -0
  96. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/schedule.py +0 -0
  97. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/security.py +0 -0
  98. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/service.py +0 -0
  99. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/spawn.py +0 -0
  100. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/sweep.py +0 -0
  101. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/timeline.py +0 -0
  102. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/triage.py +0 -0
  103. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/version.py +0 -0
  104. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/wake_hook_output.py +0 -0
  105. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commands/watchdog.py +0 -0
  106. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/commit_trailers.py +0 -0
  107. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/compress/__init__.py +0 -0
  108. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/compress/levers.py +0 -0
  109. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/compress/marker.py +0 -0
  110. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/compress/verify.py +0 -0
  111. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/console_safe.py +0 -0
  112. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/delivery_queue.py +0 -0
  113. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dm_frame.py +0 -0
  114. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/__init__.py +0 -0
  115. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/candidates.py +0 -0
  116. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/clone.py +0 -0
  117. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/enrich.py +0 -0
  118. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/index_check.py +0 -0
  119. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/notify.py +0 -0
  120. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/organize.py +0 -0
  121. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/probes.py +0 -0
  122. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/report.py +0 -0
  123. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/run.py +0 -0
  124. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/slm.py +0 -0
  125. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/transcripts.py +0 -0
  126. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/verify.py +0 -0
  127. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway/__init__.py +0 -0
  128. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway/feature_registry.py +0 -0
  129. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway/lanes_control.py +0 -0
  130. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway/schema.sql +0 -0
  131. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway/server.py +0 -0
  132. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway/services_control.py +0 -0
  133. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gateway_default.py +0 -0
  134. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/gh_identity.py +0 -0
  135. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/guide/GUIDE.md +0 -0
  136. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/identity.py +0 -0
  137. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-codex-outbox.plist +0 -0
  138. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist +0 -0
  139. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-monitor.plist +0 -0
  140. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-watchdog.plist +0 -0
  141. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-watchdog.timer.plist +0 -0
  142. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/launchd_render.py +0 -0
  143. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/main.py +0 -0
  144. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/multiplexer.py +0 -0
  145. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/operator/__init__.py +0 -0
  146. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/operator/__main__.py +0 -0
  147. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/operator/api.py +0 -0
  148. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/operator/cli.py +0 -0
  149. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/operator/config.py +0 -0
  150. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/operator/fmt.py +0 -0
  151. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/orphan_daemons.py +0 -0
  152. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/pane_probe.py +0 -0
  153. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/parsers/__init__.py +0 -0
  154. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/parsers/claude.py +0 -0
  155. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
  156. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
  157. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
  158. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
  159. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
  160. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
  161. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
  162. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
  163. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
  164. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
  165. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
  166. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
  167. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_executor.py +0 -0
  168. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_executor_windows.py +0 -0
  169. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_reconciliation.py +0 -0
  170. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_reply_outbox.py +0 -0
  171. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_service_host.py +0 -0
  172. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_service_payload.py +0 -0
  173. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_service_reply.py +0 -0
  174. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/peer_staging.py +0 -0
  175. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/query_filters.py +0 -0
  176. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/quota_sync.py +0 -0
  177. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/redact.py +0 -0
  178. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/rowclear.py +0 -0
  179. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scripts/__init__.py +0 -0
  180. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
  181. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
  182. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
  183. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
  184. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scripts/wake_watchdog.py +0 -0
  185. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/scrub.py +0 -0
  186. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/service/__init__.py +0 -0
  187. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/service/app.py +0 -0
  188. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/service/providers.py +0 -0
  189. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/session_bridge.py +0 -0
  190. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
  191. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
  192. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/source_text.py +0 -0
  193. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/stall_alert.py +0 -0
  194. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/codex-waker.default +0 -0
  195. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
  196. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
  197. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
  198. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
  199. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
  200. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
  201. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
  202. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
  203. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
  204. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
  205. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-stuck-sweep.service +0 -0
  206. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-stuck-sweep.timer +0 -0
  207. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-triage.service +0 -0
  208. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-triage.timer +0 -0
  209. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
  210. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
  211. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
  212. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/the_ten.py +0 -0
  213. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/timeline_paths.py +0 -0
  214. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/tokens.py +0 -0
  215. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/__init__.py +0 -0
  216. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/backend.py +0 -0
  217. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/job.py +0 -0
  218. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/owners.json +0 -0
  219. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/router.py +0 -0
  220. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/rows.py +0 -0
  221. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli/triage/sensor.py +0 -0
  222. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
  223. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/entry_points.txt +0 -0
  224. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/requires.txt +0 -0
  225. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/top_level.txt +0 -0
  226. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1006_board_publisher.py +0 -0
  227. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1006_session_board.py +0 -0
  228. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1010_strand_only.py +0 -0
  229. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1013_spawn_channel.py +0 -0
  230. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1017_muse_tui.py +0 -0
  231. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1034_copy_mode.py +0 -0
  232. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1050_surrogate_wake.py +0 -0
  233. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1052_opencode_deaf.py +0 -0
  234. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1059_watchdog_unread_env.py +0 -0
  235. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1061_roster_cli.py +0 -0
  236. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1064_stuck_sweep.py +0 -0
  237. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1065_release.py +0 -0
  238. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1066_quiet_wakes.py +0 -0
  239. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1068_structured_accept_cli.py +0 -0
  240. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1071_quota_sync.py +0 -0
  241. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1073_triage.py +0 -0
  242. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1073_triage_board.py +0 -0
  243. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1073_wheel_install.py +0 -0
  244. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1075_task_cli.py +0 -0
  245. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1083_openai_decisions.py +0 -0
  246. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1144_cell_yaml_github.py +0 -0
  247. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1197_commander_taps.py +0 -0
  248. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1203_swarph_me_refusal.py +0 -0
  249. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1206_offer_question.py +0 -0
  250. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1214_egress.py +0 -0
  251. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1219_egress_probe.py +0 -0
  252. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1221_quota_windows.py +0 -0
  253. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1222_maybe_start_cap.py +0 -0
  254. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1228_quota_reach.py +0 -0
  255. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1243_the_ten.py +0 -0
  256. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1248_ship_price_table.py +0 -0
  257. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_124_register_merge.py +0 -0
  258. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1250_price_cache.py +0 -0
  259. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1256_commander_wake.py +0 -0
  260. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1261_mcp_install.py +0 -0
  261. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1262_wake_followups.py +0 -0
  262. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1265_wake_note.py +0 -0
  263. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1269_triage_label.py +0 -0
  264. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_126_pending_from_complete.py +0 -0
  265. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1277_close_usage.py +0 -0
  266. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1278_dreaming_reach.py +0 -0
  267. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1286_dm_unread_cursor.py +0 -0
  268. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1297_commander.py +0 -0
  269. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1300_authorization_check.py +0 -0
  270. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1301_restart_skew.py +0 -0
  271. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1320_commit_trailers.py +0 -0
  272. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1321_layered_redaction.py +0 -0
  273. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_132_ensure_monitor_state_dir.py +0 -0
  274. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1340_router_rollout.py +0 -0
  275. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1346_shell_string_gh.py +0 -0
  276. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_1347_shell_depth_cap.py +0 -0
  277. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_138_memory_navigate.py +0 -0
  278. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_139_tool_probe.py +0 -0
  279. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_183_card_anchor.py +0 -0
  280. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_184_notify_honesty.py +0 -0
  281. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_201_win32_bash_refusal.py +0 -0
  282. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_243_onboard_per_peer_token.py +0 -0
  283. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_307_task4_ask_reply.py +0 -0
  284. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
  285. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_3130_sender.py +0 -0
  286. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_3150_identity_router_install.py +0 -0
  287. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_319_refusal_exit_codes.py +0 -0
  288. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_323_mistral_backend.py +0 -0
  289. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_332_report_organize_findings.py +0 -0
  290. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_356_query_filters.py +0 -0
  291. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_397_gh_identity_router.py +0 -0
  292. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_397_router_preflight.py +0 -0
  293. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_402_one_identity_resolver.py +0 -0
  294. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_432_rowclear.py +0 -0
  295. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_467b_onboard_operator_credential.py +0 -0
  296. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_472_register_caller_binding.py +0 -0
  297. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_484_codex_queue_sink.py +0 -0
  298. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_523_guide.py +0 -0
  299. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_524_conftest_hermeticity.py +0 -0
  300. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_532_accept_flag.py +0 -0
  301. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_535_version_capability.py +0 -0
  302. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_538_signal_bench.py +0 -0
  303. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_546_default_gateway.py +0 -0
  304. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_547_verbs_from_registry.py +0 -0
  305. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_548_gateway_remainder.py +0 -0
  306. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_552_codegraph_gateway.py +0 -0
  307. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_555_relay_row_shape.py +0 -0
  308. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_556_relay_freshness.py +0 -0
  309. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_559_edges_truncated.py +0 -0
  310. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_564_bootstrap_first_peer.py +0 -0
  311. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
  312. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_579_register_bootstrap_message.py +0 -0
  313. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_591_cli_step_graph.py +0 -0
  314. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_644_monitor_supervision.py +0 -0
  315. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_648_install_unit.py +0 -0
  316. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_654_reexec.py +0 -0
  317. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_656_owned_slm.py +0 -0
  318. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_684_dreaming_verb.py +0 -0
  319. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_689_pkg_version_order.py +0 -0
  320. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_715_grok_wake.py +0 -0
  321. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_716_timeline_one_path.py +0 -0
  322. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_723_grok_0251.py +0 -0
  323. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_724_ps1_ascii_or_bom.py +0 -0
  324. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_725_stdio_reconfigure.py +0 -0
  325. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_726_grok_limit_screen.py +0 -0
  326. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_729_arm_check_delivery_gap.py +0 -0
  327. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_729_dm_once.py +0 -0
  328. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_729_wake_watchdog.py +0 -0
  329. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_734_dreaming_enrich_degrade.py +0 -0
  330. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_735_dm_mcp_tools.py +0 -0
  331. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_739_wake_writer.py +0 -0
  332. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_740_edit_project.py +0 -0
  333. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_762_cards_edit_priority.py +0 -0
  334. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_764_enrich_collapse.py +0 -0
  335. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_801_confirm_flow_cli.py +0 -0
  336. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_802_stage_history.py +0 -0
  337. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_825_codegraph_hook_noise.py +0 -0
  338. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_825_install_posttooluse_only.py +0 -0
  339. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_825_remaining_cap_shred_bind.py +0 -0
  340. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_829_counterfactual_column.py +0 -0
  341. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_830_hook_binding_version.py +0 -0
  342. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_84_cli_labels.py +0 -0
  343. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_866_doctrine_guide.py +0 -0
  344. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_872_identity_refuses_not_warns.py +0 -0
  345. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_874_source_text.py +0 -0
  346. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
  347. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_931_board_search.py +0 -0
  348. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_935_deadline_clock.py +0 -0
  349. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_937_dreaming_notify.py +0 -0
  350. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_938_organize_line_limit.py +0 -0
  351. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_941_bench_backends.py +0 -0
  352. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_941_harness_342.py +0 -0
  353. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_945_same_line_pairing.py +0 -0
  354. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_955_prompt_audit.py +0 -0
  355. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_957_auth_http.py +0 -0
  356. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_959_venv_interpreter.py +0 -0
  357. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_960_channel.py +0 -0
  358. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_960_ensure_monitor_heartbeat.py +0 -0
  359. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_961_cursor_grok_footer.py +0 -0
  360. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_961_loud_stop.py +0 -0
  361. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_963_plugin_manifest.py +0 -0
  362. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_964_channel_cell.py +0 -0
  363. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_965_mesh_wait.py +0 -0
  364. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_975_channel_hop.py +0 -0
  365. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_add_security_gate.py +0 -0
  366. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_add.py +0 -0
  367. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_hash.py +0 -0
  368. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_lib.py +0 -0
  369. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_mcp.py +0 -0
  370. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_skill.py +0 -0
  371. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_tool.py +0 -0
  372. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_artifact_uri.py +0 -0
  373. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_backends.py +0 -0
  374. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_claude_cli.py +0 -0
  375. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_codex_cli.py +0 -0
  376. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_command.py +0 -0
  377. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_pack.py +0 -0
  378. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_prices.py +0 -0
  379. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_quality.py +0 -0
  380. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_runner.py +0 -0
  381. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_bench_validate.py +0 -0
  382. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_board_card_thread.py +0 -0
  383. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_board_command.py +0 -0
  384. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_board_merge_check.py +0 -0
  385. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_board_obligation_close.py +0 -0
  386. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_brain_ask_command.py +0 -0
  387. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_brain_ask_env_diagnosis.py +0 -0
  388. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_brain_ask_identity_explicitness.py +0 -0
  389. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_brain_command.py +0 -0
  390. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_caller_meta_guard.py +0 -0
  391. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_capture_lineage.py +0 -0
  392. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_capture_liveness.py +0 -0
  393. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_capture_manifest.py +0 -0
  394. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_capture_paths.py +0 -0
  395. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_capture_security.py +0 -0
  396. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_cell_command_dispatch.py +0 -0
  397. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_cell_harden.py +0 -0
  398. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_cell_loader.py +0 -0
  399. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_cell_selfcheck.py +0 -0
  400. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_cell_verify.py +0 -0
  401. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_chain_token.py +0 -0
  402. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_channel_command.py +0 -0
  403. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_channel_poll_never_breaks_dms.py +0 -0
  404. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_channel_post.py +0 -0
  405. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_channel_wake_policy_filter.py +0 -0
  406. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_chat_command.py +0 -0
  407. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_claude_parser.py +0 -0
  408. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_claude_tmux_template.py +0 -0
  409. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_codegraph_caller_scope.py +0 -0
  410. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_codegraph_command.py +0 -0
  411. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_codegraph_hook.py +0 -0
  412. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_codegraph_mcp.py +0 -0
  413. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_codex_waker.py +0 -0
  414. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_committee_command.py +0 -0
  415. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_compress_caller_convention.py +0 -0
  416. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_compress_command.py +0 -0
  417. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_compress_levers.py +0 -0
  418. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_compress_marker.py +0 -0
  419. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_compress_verify.py +0 -0
  420. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_console_encoding_e2e.py +0 -0
  421. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_content_composition.py +0 -0
  422. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_copilot_membrane.py +0 -0
  423. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_copilot_pane_reader.py +0 -0
  424. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_cursor_membrane.py +0 -0
  425. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_daemon_command.py +0 -0
  426. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_daemon_console_encoding.py +0 -0
  427. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_daemon_delivery.py +0 -0
  428. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_delivery_queue.py +0 -0
  429. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_display_sanitize.py +0 -0
  430. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_ensure_monitor_no_peer_default.py +0 -0
  431. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_event_emit.py +0 -0
  432. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_feature_to_uri.py +0 -0
  433. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_gateway_brain.py +0 -0
  434. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_gateway_client.py +0 -0
  435. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_gateway_command.py +0 -0
  436. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_gateway_message_idempotency.py +0 -0
  437. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_gh_route_doctor_mesh_name.py +0 -0
  438. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_group_command.py +0 -0
  439. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_guide_commands_parse.py +0 -0
  440. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_guide_selfcheck.py +0 -0
  441. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_heartbeat_check.py +0 -0
  442. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_highlight_command.py +0 -0
  443. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hook_output.py +0 -0
  444. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_activity_marker.py +0 -0
  445. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_add.py +0 -0
  446. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_bundle.py +0 -0
  447. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_init.py +0 -0
  448. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_legacy_generation_removal.py +0 -0
  449. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_lifecycle.py +0 -0
  450. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_merge.py +0 -0
  451. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_verify.py +0 -0
  452. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_win32_bash_wrapper.py +0 -0
  453. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_hooks_win32_command_path.py +0 -0
  454. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_import_command.py +0 -0
  455. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_inbox_identity_provenance.py +0 -0
  456. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_init_command.py +0 -0
  457. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_init_provider_menu.py +0 -0
  458. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_install_codex_hooks.py +0 -0
  459. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_install_hook.py +0 -0
  460. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_install_multiplexer_command.py +0 -0
  461. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_install_postcompact_hook.py +0 -0
  462. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_install_wake_hook.py +0 -0
  463. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_lane_command.py +0 -0
  464. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_launchd_units.py +0 -0
  465. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_main.py +0 -0
  466. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_main_unknown_verb_guard.py +0 -0
  467. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mcp_missing_hint.py +0 -0
  468. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mcp_server.py +0 -0
  469. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_memory_command.py +0 -0
  470. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_memory_emit_snippet.py +0 -0
  471. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_memory_gateway.py +0 -0
  472. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_memory_sync.py +0 -0
  473. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_memory_sync_membrane.py +0 -0
  474. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_command.py +0 -0
  475. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_inbox_mark_read.py +0 -0
  476. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_inbox_sanitize.py +0 -0
  477. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_originate_thread_623.py +0 -0
  478. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_send_unknown_peer.py +0 -0
  479. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_sidecar.py +0 -0
  480. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
  481. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_sidecar_muse_sink.py +0 -0
  482. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
  483. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_meta_edge_identity.py +0 -0
  484. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_monitor_channel_poll.py +0 -0
  485. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_monitor_cli.py +0 -0
  486. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_monitor_daemon_collision.py +0 -0
  487. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_monitor_self_name_verification.py +0 -0
  488. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_monitor_state_split.py +0 -0
  489. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_multiplexer.py +0 -0
  490. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_muse_membrane.py +0 -0
  491. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_muse_own_cli.py +0 -0
  492. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_obligation_close_is_surfaced.py +0 -0
  493. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_okf_links.py +0 -0
  494. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_onboard_command.py +0 -0
  495. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_opencode_membrane.py +0 -0
  496. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_opencode_plugin.py +0 -0
  497. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_operator_me.py +0 -0
  498. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_orphan_daemons.py +0 -0
  499. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_packaged_artifacts_exist.py +0 -0
  500. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_packaged_skills.py +0 -0
  501. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_executor.py +0 -0
  502. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_executor_windows.py +0 -0
  503. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_reply_drain_command.py +0 -0
  504. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_reply_drain_supervisor.py +0 -0
  505. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_reply_outbox.py +0 -0
  506. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_reply_transport.py +0 -0
  507. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_service_e2e.py +0 -0
  508. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_service_host.py +0 -0
  509. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_service_payload.py +0 -0
  510. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_peer_service_reply.py +0 -0
  511. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_postcompact_recall.py +0 -0
  512. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_process_liveness.py +0 -0
  513. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_protocol_handler.py +0 -0
  514. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_providers_isolation.py +0 -0
  515. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_ratify_command.py +0 -0
  516. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_readme_claims_no_gateway_default.py +0 -0
  517. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_repl_caller_convention.py +0 -0
  518. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_schedule_command.py +0 -0
  519. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_schedule_create_contract.py +0 -0
  520. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_scrub.py +0 -0
  521. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_security.py +0 -0
  522. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_service_app.py +0 -0
  523. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_service_command.py +0 -0
  524. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_service_providers.py +0 -0
  525. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_session_bridge_inject.py +0 -0
  526. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_session_bridge_probe.py +0 -0
  527. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_session_bridge_resolve.py +0 -0
  528. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_session_path_role_gate.py +0 -0
  529. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_shipped_units_match_the_cli.py +0 -0
  530. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_smoke_chat.py +0 -0
  531. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_smoke_one_shot.py +0 -0
  532. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_smoke_phase_5_5.py +0 -0
  533. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_base_hoist.py +0 -0
  534. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_command.py +0 -0
  535. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_identity_stamp.py +0 -0
  536. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_live_pin.py +0 -0
  537. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_mitosis_lineage.py +0 -0
  538. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_tmux_session.py +0 -0
  539. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_spawn_windows_relaunch.py +0 -0
  540. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_stall_alert.py +0 -0
  541. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_subprocess_decode_encoding.py +0 -0
  542. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_timeline_command.py +0 -0
  543. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_tmux_wake_runstate_defer.py +0 -0
  544. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_tmux_wake_session_reanchor.py +0 -0
  545. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_tmux_wake_stale.py +0 -0
  546. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_tmux_wake_submit_verify.py +0 -0
  547. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_token_file_one_parser.py +0 -0
  548. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_token_precedence_explicit_first.py +0 -0
  549. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_unified_token_resolver.py +0 -0
  550. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_version_command.py +0 -0
  551. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_version_consistency.py +0 -0
  552. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_vibe_membrane.py +0 -0
  553. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog.py +0 -0
  554. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_dm_wake.py +0 -0
  555. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
  556. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_dm_wake_wiring.py +0 -0
  557. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_emit_health.py +0 -0
  558. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_install_flags.py +0 -0
  559. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_model_rung.py +0 -0
  560. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/tests/test_watchdog_stale_peers.py +0 -0
  561. {swarph_cli-0.72.37 → swarph_cli-0.72.39}/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.72.37
3
+ Version: 0.72.39
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.72.37"
7
+ version = "0.72.39"
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.72.37"
19
+ __version__ = "0.72.39"
20
20
 
21
21
  __all__ = ["__version__"]
@@ -1299,6 +1299,15 @@ def _build_parser() -> argparse.ArgumentParser:
1299
1299
  ow.add_argument("--reason", required=True,
1300
1300
  help="why the row is withdrawn; whitespace is refused")
1301
1301
  ow.add_argument("--json", action="store_true"); _add_common(ow)
1302
+ orel = obl.add_parser(
1303
+ "release",
1304
+ help="RELEASE a taken row back to offered (creator, orchestrator, "
1305
+ "project owner, or the commander's SSO session). Clears the "
1306
+ "holder and the clock. Writes no outcome. A closed row is refused")
1307
+ orel.add_argument("id", type=int, help="the obligation id")
1308
+ orel.add_argument("--reason", required=True,
1309
+ help="why the row is released; whitespace is refused")
1310
+ orel.add_argument("--json", action="store_true"); _add_common(orel)
1302
1311
  cost = top.add_parser(
1303
1312
  "cost",
1304
1313
  help="tokens by job, the perfect-run rate, and cost per accepted outcome")
@@ -1457,6 +1466,21 @@ def run_board(argv: list[str]) -> int:
1457
1466
  f"{_s(x.get('closed_by', self_name))}"
1458
1467
  + (f" task {_s(x.get('task'))}" if x.get("task") else "")
1459
1468
  ), aj)
1469
+ if args.command == "release":
1470
+ reason = args.reason
1471
+ if not reason.strip():
1472
+ print("swarph board obligations release: --reason is "
1473
+ "whitespace-only", file=sys.stderr)
1474
+ return 2
1475
+ reason = redact_text(reason, opt_out=getattr(args, "no_redact", False), caller="board.obligations")
1476
+ st, d = _post_json(
1477
+ f"{gw}/board/obligations/{args.id}/release",
1478
+ {"reason": reason}, token)
1479
+ return _out(st, d, lambda x: (
1480
+ f"obligation #{_s(x.get('id', args.id))} RELEASED "
1481
+ f"state={_s(x.get('state', 'offered'))} "
1482
+ f"holder={_s(x.get('holder'))}"
1483
+ ), aj)
1460
1484
 
1461
1485
  if args.group == "cards":
1462
1486
  if args.command == "list":
@@ -60,6 +60,8 @@ CARD = 513
60
60
  CHECK_EVERY = 4
61
61
  _OTHER = "drop-on-meta-edge" # lab-ovh's own alert goes to the other orchestrator
62
62
  _PREFIX = f"DUPLICATE-SESSION card #{CARD}"
63
+ _PROC_ROOT: "str | os.PathLike | None" = "/proc"
64
+ _USE_DEFAULT_PROC = object()
63
65
  _instance_id: "str | None" = None
64
66
 
65
67
 
@@ -136,10 +138,32 @@ CLAIM_INTERVAL = 90
136
138
 
137
139
 
138
140
  def _is_desktop_daemon(parts: list[str]) -> bool:
139
- for part in parts:
140
- base = os.path.basename(str(part))
141
- if base in {"swarph-desktop", "swarph_desktop"} or str(part).endswith("swarph_desktop"):
142
- return True
141
+ """True iff argv[0..2] is the swarph-desktop daemon entry point:
142
+ - argv[0] has basename swarph-desktop or swarph_desktop, OR
143
+ - argv[0] is a python interpreter and:
144
+ * argv[1:3] is `-m swarph_desktop` (or `-m swarph-desktop` / `swarph_desktop.*`), or
145
+ * argv[1] is a path ending in `swarph-desktop` / `swarph_desktop` or the
146
+ `run-desktop*.py` launcher (`ExecStart=/home/ubuntu/swarph-desktop/venv/bin/python run-desktop-8766.py`).
147
+ Never scans later argv tokens, so a command that merely mentions or quotes
148
+ swarph-desktop in flags or positional arguments is never counted."""
149
+ if not parts or not parts[0]:
150
+ return False
151
+ b0 = os.path.basename(str(parts[0]))
152
+ if b0 in {"swarph-desktop", "swarph_desktop"}:
153
+ return True
154
+ if not b0.startswith("python") or len(parts) < 2 or not parts[1]:
155
+ return False
156
+ p1 = str(parts[1])
157
+ b1 = os.path.basename(p1)
158
+ if p1 == "-m":
159
+ if len(parts) < 3 or not parts[2]:
160
+ return False
161
+ mod = str(parts[2]).split(".")[0]
162
+ return mod in {"swarph_desktop", "swarph-desktop"}
163
+ if b1 in {"swarph-desktop", "swarph_desktop"} or p1.endswith(("swarph-desktop", "swarph_desktop")):
164
+ return True
165
+ if b1.startswith("run-desktop") and b1.endswith(".py"):
166
+ return True
143
167
  return False
144
168
 
145
169
 
@@ -211,17 +235,55 @@ def duplicate_session_pids(entries, cell: str, my_pid: int) -> list[int]:
211
235
  return sorted(found)
212
236
 
213
237
 
214
- def ps_entries() -> list[tuple[int, list[str]]]:
215
- """(pid, argv) for every process on the box, via `ps -eo pid,args`. [] on any
216
- error — an enumeration that cannot run is not a duplicate, and must never
217
- raise into the monitor loop."""
238
+ def _proc_entries(proc_root: "str | os.PathLike | None") -> "list[tuple[int, list[str]]] | None":
239
+ """Read (pid, argv) from `<proc_root>/<pid>/cmdline` (NUL-separated).
240
+ Returns None when `proc_root` is None or not a readable directory so
241
+ `ps_entries` falls back to `ps -eo pid,args`."""
242
+ if proc_root is None or not os.path.isdir(proc_root):
243
+ return None
244
+ try:
245
+ names = os.listdir(proc_root)
246
+ except OSError:
247
+ return None
248
+ entries: list[tuple[int, list[str]]] = []
249
+ for name in names:
250
+ if not name.isdigit():
251
+ continue
252
+ cmd_path = os.path.join(proc_root, name, "cmdline")
253
+ try:
254
+ with open(cmd_path, "rb") as f:
255
+ raw = f.read()
256
+ except OSError:
257
+ continue
258
+ raw = raw.rstrip(b"\x00")
259
+ if not raw:
260
+ continue
261
+ argv = [tok.decode("utf-8", errors="replace") for tok in raw.split(b"\x00")]
262
+ entries.append((int(name), argv))
263
+ return entries
264
+
265
+
266
+ def ps_entries(proc_root: "str | os.PathLike | None" = _USE_DEFAULT_PROC) -> list[tuple[int, list[str]]]:
267
+ """(pid, argv) for every process on the box.
268
+
269
+ On Linux, reads true NUL-separated argv from `/proc/<pid>/cmdline`
270
+ because `/proc` is a readable directory (`_proc_entries`), so words
271
+ inside one quoted argument are never split into whitespace tokens.
272
+
273
+ Falls back to `ps -eo pid,args` when `/proc` is not a readable directory
274
+ or when a caller/test passes `proc_root=None` (or monkeypatches
275
+ `_PROC_ROOT = None` / `_proc_entries`). Returns [] on any error."""
276
+ root = _PROC_ROOT if proc_root is _USE_DEFAULT_PROC else proc_root
277
+ from_proc = _proc_entries(root)
278
+ if from_proc is not None:
279
+ return from_proc
218
280
  try:
219
281
  proc = subprocess.run(
220
282
  ["ps", "-eo", "pid,args"], capture_output=True, text=True,
221
283
  encoding="utf-8", errors="replace", timeout=10)
222
284
  except (OSError, subprocess.SubprocessError):
223
285
  return []
224
- entries: list[tuple[int, list[str]]] = []
286
+ entries = []
225
287
  for line in proc.stdout.splitlines()[1:]:
226
288
  line = line.strip()
227
289
  if not line:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: swarph-cli
3
- Version: 0.72.37
3
+ Version: 0.72.39
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
@@ -269,6 +269,8 @@ tests/test_132_ensure_monitor_state_dir.py
269
269
  tests/test_1340_router_rollout.py
270
270
  tests/test_1346_shell_string_gh.py
271
271
  tests/test_1347_shell_depth_cap.py
272
+ tests/test_1353_obligation_release_cli.py
273
+ tests/test_1385_duplicate_session_argv.py
272
274
  tests/test_138_memory_navigate.py
273
275
  tests/test_139_tool_probe.py
274
276
  tests/test_183_card_anchor.py
@@ -0,0 +1,14 @@
1
+ """card #1353 — swarph board obligations release."""
2
+ from swarph_cli.commands import board
3
+
4
+
5
+ def test_release_is_a_command():
6
+ try:
7
+ args = board._build_parser().parse_args(
8
+ ["obligations", "release", "3293", "--reason", "the laptop was shut down"])
9
+ except SystemExit:
10
+ args = None
11
+ assert getattr(args, "group", None) == "obligations"
12
+ assert getattr(args, "command", None) == "release"
13
+ assert getattr(args, "id", None) == 3293
14
+ assert getattr(args, "reason", None) == "the laptop was shut down"
@@ -0,0 +1,188 @@
1
+ """Card #1385 (Obligation #3604) — duplicate_session argv-position fix.
2
+
3
+ Ensures duplicate_session.is_session_for() counts the desktop daemon ONLY by
4
+ argv POSITION (argv[0] basename swarph-desktop or python argv[0] + argv[1..2] entry point),
5
+ matching how _is_swarph_argv() treats swarph residents.
6
+
7
+ ps_entries() reads true NUL-separated argv from /proc/<pid>/cmdline so that
8
+ words inside one quoted argument (e.g. `--accept "PASS = ... swarph-desktop ..."`)
9
+ are never split into whitespace tokens.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import os
14
+ import subprocess
15
+ import sys
16
+
17
+ import pytest
18
+ import swarph_cli.duplicate_session as ds
19
+
20
+
21
+ def test_bash_command_quoting_swarph_desktop_is_not_a_session():
22
+ """Test (a): ["/bin/bash", "-c", "gh pr view 34 -R BrainSurfing-tech/swarph-desktop ...; swarph board obligations amend 3597 --as lab-ovh ..."]
23
+ is NOT a session for lab-ovh."""
24
+ argv_a = [
25
+ "/bin/bash",
26
+ "-c",
27
+ "gh pr view 34 -R BrainSurfing-tech/swarph-desktop ...; swarph board obligations amend 3597 --as lab-ovh ...",
28
+ ]
29
+ assert not ds.is_session_for(argv_a, "lab-ovh")
30
+ assert ds.duplicate_session_pids([(1754451, argv_a)], "lab-ovh", my_pid=100) == []
31
+
32
+ # Even if whitespace-split, it must STILL not be counted as a session
33
+ argv_a_split = " ".join(argv_a).split()
34
+ assert not ds.is_session_for(argv_a_split, "lab-ovh")
35
+ assert ds.duplicate_session_pids([(1754451, argv_a_split)], "lab-ovh", my_pid=100) == []
36
+
37
+
38
+ def test_board_cards_ask_mentioning_swarph_desktop_is_not_a_session():
39
+ """Test (b): ["swarph", "board", "cards", "ask", "1380", "--accept", "PASS = ... swarph-desktop PR 32 ...", "--as", "lab-ovh"]
40
+ is NOT a session for lab-ovh."""
41
+ argv_b = [
42
+ "swarph",
43
+ "board",
44
+ "cards",
45
+ "ask",
46
+ "1380",
47
+ "--accept",
48
+ "PASS = ... swarph-desktop PR 32 ...",
49
+ "--as",
50
+ "lab-ovh",
51
+ ]
52
+ assert not ds.is_session_for(argv_b, "lab-ovh")
53
+ assert ds.duplicate_session_pids([(1833816, argv_b)], "lab-ovh", my_pid=100) == []
54
+
55
+ # Even if whitespace-split, it must STILL not be counted as a session
56
+ argv_b_split = " ".join(argv_b).split()
57
+ assert not ds.is_session_for(argv_b_split, "lab-ovh")
58
+ assert ds.duplicate_session_pids([(1833816, argv_b_split)], "lab-ovh", my_pid=100) == []
59
+
60
+
61
+ def test_synthetic_desktop_launcher_argv_with_as_appended_is_a_session():
62
+ """Test (c): SYNTHETIC launcher argv with --as appended. The live daemon on lab-ovh runs ["/home/ubuntu/swarph-desktop/venv/bin/python", "run-desktop-8766.py"] with no --as; appending --as lab-ovh is a synthetic launcher argv that counts as a session for lab-ovh."""
63
+ # Live daemon argv on lab-ovh with no --as is NOT a session for lab-ovh
64
+ assert not ds.is_session_for(
65
+ ["/home/ubuntu/swarph-desktop/venv/bin/python", "run-desktop-8766.py"],
66
+ "lab-ovh",
67
+ )
68
+
69
+ argv_c = [
70
+ "/home/ubuntu/swarph-desktop/venv/bin/python",
71
+ "run-desktop-8766.py",
72
+ "--as",
73
+ "lab-ovh",
74
+ ]
75
+ assert ds.is_session_for(argv_c, "lab-ovh")
76
+ assert not ds.is_session_for(argv_c, "other-cell")
77
+ assert ds.duplicate_session_pids([(1800578, argv_c)], "lab-ovh", my_pid=100) == [1800578]
78
+ assert ds.duplicate_session_pids([(1800578, argv_c)], "other-cell", my_pid=100) == []
79
+
80
+ # Other valid desktop daemon entrypoint forms
81
+ valid_forms = [
82
+ ["swarph-desktop", "--as", "lab-ovh"],
83
+ ["/home/ubuntu/swarph-desktop/venv/bin/swarph-desktop", "--as", "lab-ovh"],
84
+ ["python3", "-m", "swarph_desktop", "--as", "lab-ovh"],
85
+ ["/home/ubuntu/swarph-desktop/venv/bin/python", "-m", "swarph_desktop", "--as", "lab-ovh"],
86
+ ["python3", "/opt/swarph/swarph-desktop", "--as", "lab-ovh"],
87
+ ["python3", "/opt/swarph/swarph_desktop", "--as", "lab-ovh"],
88
+ ["/usr/bin/python3", "/home/ubuntu/swarph-desktop/run-desktop-8766.py", "--as", "lab-ovh"],
89
+ ]
90
+ for form in valid_forms:
91
+ assert ds.is_session_for(form, "lab-ovh"), f"Failed for {form}"
92
+ assert not ds.is_session_for(form, "other-cell"), f"Unexpected match for {form}"
93
+
94
+
95
+ def test_swarph_monitor_start_is_a_session():
96
+ """Test (d): swarph monitor start --as lab-ovh still IS a session."""
97
+ argv_d = ["swarph", "monitor", "start", "--as", "lab-ovh"]
98
+ assert ds.is_session_for(argv_d, "lab-ovh")
99
+ assert not ds.is_session_for(argv_d, "other-cell")
100
+ assert ds.duplicate_session_pids([(200, argv_d)], "lab-ovh", my_pid=100) == [200]
101
+ assert ds.duplicate_session_pids([(200, argv_d)], "other-cell", my_pid=100) == []
102
+
103
+
104
+ def test_ps_entries_proc_cmdline_nul_split(tmp_path, monkeypatch):
105
+ """Test reading true NUL-separated argv from /proc/<pid>/cmdline via synthetic proc_root."""
106
+ # (a) bash command
107
+ p_a = tmp_path / "1754451"
108
+ p_a.mkdir()
109
+ argv_a = [
110
+ "/bin/bash",
111
+ "-c",
112
+ "gh pr view 34 -R BrainSurfing-tech/swarph-desktop ...; swarph board obligations amend 3597 --as lab-ovh ...",
113
+ ]
114
+ (p_a / "cmdline").write_bytes(b"\x00".join(tok.encode("utf-8") for tok in argv_a) + b"\x00")
115
+
116
+ # (b) swarph board cards ask
117
+ p_b = tmp_path / "1833816"
118
+ p_b.mkdir()
119
+ argv_b = [
120
+ "swarph",
121
+ "board",
122
+ "cards",
123
+ "ask",
124
+ "1380",
125
+ "--accept",
126
+ "PASS = ... swarph-desktop PR 32 ...",
127
+ "--as",
128
+ "lab-ovh",
129
+ ]
130
+ (p_b / "cmdline").write_bytes(b"\x00".join(tok.encode("utf-8") for tok in argv_b) + b"\x00")
131
+
132
+ # (c) synthetic desktop launcher argv with --as appended
133
+ p_c = tmp_path / "1800578"
134
+ p_c.mkdir()
135
+ argv_c = [
136
+ "/home/ubuntu/swarph-desktop/venv/bin/python",
137
+ "run-desktop-8766.py",
138
+ "--as",
139
+ "lab-ovh",
140
+ ]
141
+ (p_c / "cmdline").write_bytes(b"\x00".join(tok.encode("utf-8") for tok in argv_c) + b"\x00")
142
+
143
+ # Non-digit dir and empty cmdline (kernel thread) to verify edge cases
144
+ (tmp_path / "self").mkdir()
145
+ p_kthread = tmp_path / "2"
146
+ p_kthread.mkdir()
147
+ (p_kthread / "cmdline").write_bytes(b"")
148
+
149
+ # 1. Call via explicit proc_root parameter
150
+ entries = ds.ps_entries(proc_root=tmp_path)
151
+ by_pid = dict(entries)
152
+ assert 1833816 in by_pid
153
+ assert by_pid[1833816] == argv_b
154
+ assert "PASS = ... swarph-desktop PR 32 ..." in by_pid[1833816]
155
+ assert 2 not in by_pid # empty cmdline skipped
156
+ assert ds.duplicate_session_pids(entries, "lab-ovh", my_pid=100) == [1800578]
157
+
158
+ # 2. Call via monkeypatched _PROC_ROOT
159
+ monkeypatch.setattr(ds, "_PROC_ROOT", str(tmp_path))
160
+ entries_mp = ds.ps_entries()
161
+ assert ds.duplicate_session_pids(entries_mp, "lab-ovh", my_pid=100) == [1800578]
162
+
163
+
164
+ def test_live_proc_preserves_quoted_args():
165
+ """Test against live /proc on Linux with a spawned subprocess."""
166
+ if not os.path.isdir("/proc"):
167
+ pytest.skip("/proc not available on this platform")
168
+
169
+ quoted_arg = "PASS = ... swarph-desktop PR 32 ..."
170
+ proc = subprocess.Popen([
171
+ sys.executable,
172
+ "-c",
173
+ "import time; time.sleep(10)",
174
+ "--accept",
175
+ quoted_arg,
176
+ "--as",
177
+ "lab-ovh",
178
+ ])
179
+ try:
180
+ entries = ds.ps_entries()
181
+ match = [argv for pid, argv in entries if pid == proc.pid]
182
+ assert match, f"Process {proc.pid} not found in ps_entries"
183
+ found_argv = match[0]
184
+ assert quoted_arg in found_argv, f"Quoted argument was split: {found_argv}"
185
+ assert not ds.is_session_for(found_argv, "lab-ovh")
186
+ finally:
187
+ proc.terminate()
188
+ proc.wait(timeout=5)
@@ -81,6 +81,7 @@ def test_ps_output_is_parsed_into_pid_argv(monkeypatch):
81
81
  class _P:
82
82
  stdout = out
83
83
 
84
+ monkeypatch.setattr(ds, "_PROC_ROOT", None)
84
85
  monkeypatch.setattr(ds.subprocess, "run", lambda *a, **k: _P())
85
86
  entries = ds.ps_entries()
86
87
  assert (100, ["swarph", "monitor", "start", "--as", "opencode"]) in entries
File without changes
File without changes
File without changes