swarph-cli 0.72.39__tar.gz → 0.72.41__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 (567) hide show
  1. {swarph_cli-0.72.39/src/swarph_cli.egg-info → swarph_cli-0.72.41}/PKG-INFO +1 -1
  2. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/pyproject.toml +1 -1
  3. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/__init__.py +1 -1
  4. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board.py +272 -38
  5. swarph_cli-0.72.41/src/swarph_cli/commands/dev_extract.py +829 -0
  6. swarph_cli-0.72.41/src/swarph_cli/commands/skunkworks.py +280 -0
  7. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/guide/GUIDE.md +3 -0
  8. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/main.py +2 -0
  9. {swarph_cli-0.72.39 → swarph_cli-0.72.41/src/swarph_cli.egg-info}/PKG-INFO +1 -1
  10. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/SOURCES.txt +6 -0
  11. swarph_cli-0.72.41/tests/test_1396_dev_extract.py +2175 -0
  12. swarph_cli-0.72.41/tests/test_1405_skunkworks_basic.py +86 -0
  13. swarph_cli-0.72.41/tests/test_1405_skunkworks_cli.py +245 -0
  14. swarph_cli-0.72.41/tests/test_1427_membrane_workflow.py +240 -0
  15. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/LICENSE +0 -0
  16. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/README.md +0 -0
  17. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/setup.cfg +0 -0
  18. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/__main__.py +0 -0
  19. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/__init__.py +0 -0
  20. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/backends.py +0 -0
  21. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/claude_cli.py +0 -0
  22. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/codex_cli.py +0 -0
  23. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/pack.py +0 -0
  24. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/prices.py +0 -0
  25. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/providers.py +0 -0
  26. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/quality.py +0 -0
  27. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/refresh_prices.py +0 -0
  28. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/rules.py +0 -0
  29. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/runner.py +0 -0
  30. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/signal_score.py +0 -0
  31. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/bench/validate.py +0 -0
  32. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/caller.py +0 -0
  33. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/__init__.py +0 -0
  34. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/harden.py +0 -0
  35. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/lineage.py +0 -0
  36. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/liveness.py +0 -0
  37. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/manifest.py +0 -0
  38. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/paths.py +0 -0
  39. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/capture/verify.py +0 -0
  40. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/cell.py +0 -0
  41. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/chain_token.py +0 -0
  42. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/channel.py +0 -0
  43. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/__init__.py +0 -0
  44. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/_content.py +0 -0
  45. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/_display.py +0 -0
  46. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/_gateway_client.py +0 -0
  47. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/add.py +0 -0
  48. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/bench.py +0 -0
  49. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board_cost.py +0 -0
  50. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board_merge_check.py +0 -0
  51. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/board_usage.py +0 -0
  52. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/brain.py +0 -0
  53. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/brain_ask.py +0 -0
  54. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/cell.py +0 -0
  55. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/cell_probe.py +0 -0
  56. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
  57. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/channel.py +0 -0
  58. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/chat.py +0 -0
  59. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codegraph.py +0 -0
  60. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codegraph_hook.py +0 -0
  61. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codex_hook_output.py +0 -0
  62. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/codex_waker.py +0 -0
  63. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/commander.py +0 -0
  64. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/committee.py +0 -0
  65. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/compress.py +0 -0
  66. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/daemon.py +0 -0
  67. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/dreaming.py +0 -0
  68. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/event.py +0 -0
  69. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/gateway.py +0 -0
  70. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/gh_route.py +0 -0
  71. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/group.py +0 -0
  72. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/guide.py +0 -0
  73. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/highlight.py +0 -0
  74. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/hook_interpreter.py +0 -0
  75. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/hook_output.py +0 -0
  76. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/hooks.py +0 -0
  77. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/import_session.py +0 -0
  78. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/init.py +0 -0
  79. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
  80. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_hook.py +0 -0
  81. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_multiplexer.py +0 -0
  82. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
  83. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
  84. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/install_wake_hook.py +0 -0
  85. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/lane.py +0 -0
  86. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/mcp_server.py +0 -0
  87. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/memory.py +0 -0
  88. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
  89. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/memory_sync.py +0 -0
  90. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/mesh.py +0 -0
  91. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/monitor.py +0 -0
  92. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/okf_links.py +0 -0
  93. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/onboard.py +0 -0
  94. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
  95. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
  96. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/protocol_handler.py +0 -0
  97. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/ratify.py +0 -0
  98. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/roster.py +0 -0
  99. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/rowclear_hook.py +0 -0
  100. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/schedule.py +0 -0
  101. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/security.py +0 -0
  102. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/service.py +0 -0
  103. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/spawn.py +0 -0
  104. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/sweep.py +0 -0
  105. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/timeline.py +0 -0
  106. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/triage.py +0 -0
  107. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/version.py +0 -0
  108. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/wake_hook_output.py +0 -0
  109. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commands/watchdog.py +0 -0
  110. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/commit_trailers.py +0 -0
  111. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/__init__.py +0 -0
  112. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/levers.py +0 -0
  113. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/marker.py +0 -0
  114. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/compress/verify.py +0 -0
  115. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/console_safe.py +0 -0
  116. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/delivery_queue.py +0 -0
  117. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dm_frame.py +0 -0
  118. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/__init__.py +0 -0
  119. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/candidates.py +0 -0
  120. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/clone.py +0 -0
  121. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/enrich.py +0 -0
  122. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/index_check.py +0 -0
  123. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/notify.py +0 -0
  124. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/organize.py +0 -0
  125. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/probes.py +0 -0
  126. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/report.py +0 -0
  127. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/run.py +0 -0
  128. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/slm.py +0 -0
  129. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/transcripts.py +0 -0
  130. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/dreaming/verify.py +0 -0
  131. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/duplicate_session.py +0 -0
  132. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/__init__.py +0 -0
  133. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/feature_registry.py +0 -0
  134. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/lanes_control.py +0 -0
  135. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/schema.sql +0 -0
  136. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/server.py +0 -0
  137. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway/services_control.py +0 -0
  138. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gateway_default.py +0 -0
  139. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/gh_identity.py +0 -0
  140. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/identity.py +0 -0
  141. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-codex-outbox.plist +0 -0
  142. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist +0 -0
  143. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-monitor.plist +0 -0
  144. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-watchdog.plist +0 -0
  145. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd/swarph-watchdog.timer.plist +0 -0
  146. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/launchd_render.py +0 -0
  147. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/multiplexer.py +0 -0
  148. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/__init__.py +0 -0
  149. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/__main__.py +0 -0
  150. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/api.py +0 -0
  151. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/cli.py +0 -0
  152. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/config.py +0 -0
  153. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/operator/fmt.py +0 -0
  154. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/orphan_daemons.py +0 -0
  155. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/pane_probe.py +0 -0
  156. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/parsers/__init__.py +0 -0
  157. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/parsers/claude.py +0 -0
  158. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
  159. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
  160. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
  161. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
  162. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
  163. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
  164. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
  165. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
  166. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
  167. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
  168. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
  169. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
  170. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_executor.py +0 -0
  171. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_executor_windows.py +0 -0
  172. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_reconciliation.py +0 -0
  173. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_reply_outbox.py +0 -0
  174. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_service_host.py +0 -0
  175. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_service_payload.py +0 -0
  176. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_service_reply.py +0 -0
  177. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/peer_staging.py +0 -0
  178. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/query_filters.py +0 -0
  179. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/quota_sync.py +0 -0
  180. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/redact.py +0 -0
  181. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/rowclear.py +0 -0
  182. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/__init__.py +0 -0
  183. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
  184. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
  185. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
  186. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
  187. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scripts/wake_watchdog.py +0 -0
  188. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/scrub.py +0 -0
  189. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/service/__init__.py +0 -0
  190. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/service/app.py +0 -0
  191. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/service/providers.py +0 -0
  192. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/session_bridge.py +0 -0
  193. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
  194. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
  195. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/source_text.py +0 -0
  196. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/stall_alert.py +0 -0
  197. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/codex-waker.default +0 -0
  198. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
  199. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
  200. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
  201. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
  202. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
  203. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
  204. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
  205. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
  206. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
  207. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
  208. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-stuck-sweep.service +0 -0
  209. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-stuck-sweep.timer +0 -0
  210. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-triage.service +0 -0
  211. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-triage.timer +0 -0
  212. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
  213. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
  214. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
  215. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/the_ten.py +0 -0
  216. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/timeline_paths.py +0 -0
  217. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/tokens.py +0 -0
  218. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/__init__.py +0 -0
  219. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/backend.py +0 -0
  220. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/job.py +0 -0
  221. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/owners.json +0 -0
  222. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/router.py +0 -0
  223. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/rows.py +0 -0
  224. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli/triage/sensor.py +0 -0
  225. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
  226. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/entry_points.txt +0 -0
  227. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/requires.txt +0 -0
  228. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/src/swarph_cli.egg-info/top_level.txt +0 -0
  229. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1006_board_publisher.py +0 -0
  230. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1006_session_board.py +0 -0
  231. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1010_strand_only.py +0 -0
  232. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1013_spawn_channel.py +0 -0
  233. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1017_muse_tui.py +0 -0
  234. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1034_copy_mode.py +0 -0
  235. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1050_surrogate_wake.py +0 -0
  236. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1052_opencode_deaf.py +0 -0
  237. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1059_watchdog_unread_env.py +0 -0
  238. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1061_roster_cli.py +0 -0
  239. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1064_stuck_sweep.py +0 -0
  240. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1065_release.py +0 -0
  241. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1066_quiet_wakes.py +0 -0
  242. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1068_structured_accept_cli.py +0 -0
  243. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1071_quota_sync.py +0 -0
  244. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1073_triage.py +0 -0
  245. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1073_triage_board.py +0 -0
  246. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1073_wheel_install.py +0 -0
  247. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1075_task_cli.py +0 -0
  248. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1083_openai_decisions.py +0 -0
  249. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1144_cell_yaml_github.py +0 -0
  250. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1197_commander_taps.py +0 -0
  251. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1203_swarph_me_refusal.py +0 -0
  252. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1206_offer_question.py +0 -0
  253. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1214_egress.py +0 -0
  254. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1219_egress_probe.py +0 -0
  255. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1221_quota_windows.py +0 -0
  256. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1222_maybe_start_cap.py +0 -0
  257. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1228_quota_reach.py +0 -0
  258. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1243_the_ten.py +0 -0
  259. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1248_ship_price_table.py +0 -0
  260. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_124_register_merge.py +0 -0
  261. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1250_price_cache.py +0 -0
  262. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1256_commander_wake.py +0 -0
  263. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1261_mcp_install.py +0 -0
  264. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1262_wake_followups.py +0 -0
  265. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1265_wake_note.py +0 -0
  266. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1269_triage_label.py +0 -0
  267. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_126_pending_from_complete.py +0 -0
  268. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1277_close_usage.py +0 -0
  269. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1278_dreaming_reach.py +0 -0
  270. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1286_dm_unread_cursor.py +0 -0
  271. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1297_commander.py +0 -0
  272. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1300_authorization_check.py +0 -0
  273. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1301_restart_skew.py +0 -0
  274. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1320_commit_trailers.py +0 -0
  275. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1321_layered_redaction.py +0 -0
  276. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_132_ensure_monitor_state_dir.py +0 -0
  277. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1340_router_rollout.py +0 -0
  278. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1346_shell_string_gh.py +0 -0
  279. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1347_shell_depth_cap.py +0 -0
  280. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1353_obligation_release_cli.py +0 -0
  281. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_1385_duplicate_session_argv.py +0 -0
  282. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_138_memory_navigate.py +0 -0
  283. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_139_tool_probe.py +0 -0
  284. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_183_card_anchor.py +0 -0
  285. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_184_notify_honesty.py +0 -0
  286. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_201_win32_bash_refusal.py +0 -0
  287. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_243_onboard_per_peer_token.py +0 -0
  288. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_307_task4_ask_reply.py +0 -0
  289. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
  290. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_3130_sender.py +0 -0
  291. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_3150_identity_router_install.py +0 -0
  292. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_319_refusal_exit_codes.py +0 -0
  293. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_323_mistral_backend.py +0 -0
  294. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_332_report_organize_findings.py +0 -0
  295. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_356_query_filters.py +0 -0
  296. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_397_gh_identity_router.py +0 -0
  297. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_397_router_preflight.py +0 -0
  298. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_402_one_identity_resolver.py +0 -0
  299. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_432_rowclear.py +0 -0
  300. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_467b_onboard_operator_credential.py +0 -0
  301. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_472_register_caller_binding.py +0 -0
  302. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_484_codex_queue_sink.py +0 -0
  303. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_513_duplicate_session.py +0 -0
  304. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_523_guide.py +0 -0
  305. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_524_conftest_hermeticity.py +0 -0
  306. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_532_accept_flag.py +0 -0
  307. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_535_version_capability.py +0 -0
  308. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_538_signal_bench.py +0 -0
  309. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_546_default_gateway.py +0 -0
  310. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_547_verbs_from_registry.py +0 -0
  311. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_548_gateway_remainder.py +0 -0
  312. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_552_codegraph_gateway.py +0 -0
  313. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_555_relay_row_shape.py +0 -0
  314. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_556_relay_freshness.py +0 -0
  315. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_559_edges_truncated.py +0 -0
  316. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_564_bootstrap_first_peer.py +0 -0
  317. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
  318. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_579_register_bootstrap_message.py +0 -0
  319. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_591_cli_step_graph.py +0 -0
  320. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_644_monitor_supervision.py +0 -0
  321. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_648_install_unit.py +0 -0
  322. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_654_reexec.py +0 -0
  323. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_656_owned_slm.py +0 -0
  324. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_684_dreaming_verb.py +0 -0
  325. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_689_pkg_version_order.py +0 -0
  326. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_715_grok_wake.py +0 -0
  327. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_716_timeline_one_path.py +0 -0
  328. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_723_grok_0251.py +0 -0
  329. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_724_ps1_ascii_or_bom.py +0 -0
  330. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_725_stdio_reconfigure.py +0 -0
  331. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_726_grok_limit_screen.py +0 -0
  332. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_729_arm_check_delivery_gap.py +0 -0
  333. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_729_dm_once.py +0 -0
  334. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_729_wake_watchdog.py +0 -0
  335. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_734_dreaming_enrich_degrade.py +0 -0
  336. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_735_dm_mcp_tools.py +0 -0
  337. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_739_wake_writer.py +0 -0
  338. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_740_edit_project.py +0 -0
  339. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_762_cards_edit_priority.py +0 -0
  340. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_764_enrich_collapse.py +0 -0
  341. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_801_confirm_flow_cli.py +0 -0
  342. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_802_stage_history.py +0 -0
  343. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_825_codegraph_hook_noise.py +0 -0
  344. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_825_install_posttooluse_only.py +0 -0
  345. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_825_remaining_cap_shred_bind.py +0 -0
  346. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_829_counterfactual_column.py +0 -0
  347. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_830_hook_binding_version.py +0 -0
  348. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_84_cli_labels.py +0 -0
  349. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_866_doctrine_guide.py +0 -0
  350. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_872_identity_refuses_not_warns.py +0 -0
  351. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_874_source_text.py +0 -0
  352. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
  353. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_931_board_search.py +0 -0
  354. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_935_deadline_clock.py +0 -0
  355. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_937_dreaming_notify.py +0 -0
  356. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_938_organize_line_limit.py +0 -0
  357. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_941_bench_backends.py +0 -0
  358. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_941_harness_342.py +0 -0
  359. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_945_same_line_pairing.py +0 -0
  360. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_955_prompt_audit.py +0 -0
  361. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_957_auth_http.py +0 -0
  362. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_959_venv_interpreter.py +0 -0
  363. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_960_channel.py +0 -0
  364. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_960_ensure_monitor_heartbeat.py +0 -0
  365. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_961_cursor_grok_footer.py +0 -0
  366. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_961_loud_stop.py +0 -0
  367. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_963_plugin_manifest.py +0 -0
  368. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_964_channel_cell.py +0 -0
  369. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_965_mesh_wait.py +0 -0
  370. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_975_channel_hop.py +0 -0
  371. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_add_security_gate.py +0 -0
  372. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_add.py +0 -0
  373. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_hash.py +0 -0
  374. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_lib.py +0 -0
  375. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_mcp.py +0 -0
  376. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_skill.py +0 -0
  377. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_tool.py +0 -0
  378. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_artifact_uri.py +0 -0
  379. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_backends.py +0 -0
  380. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_claude_cli.py +0 -0
  381. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_codex_cli.py +0 -0
  382. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_command.py +0 -0
  383. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_pack.py +0 -0
  384. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_prices.py +0 -0
  385. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_quality.py +0 -0
  386. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_runner.py +0 -0
  387. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_bench_validate.py +0 -0
  388. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_card_thread.py +0 -0
  389. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_command.py +0 -0
  390. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_merge_check.py +0 -0
  391. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_board_obligation_close.py +0 -0
  392. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_ask_command.py +0 -0
  393. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_ask_env_diagnosis.py +0 -0
  394. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_ask_identity_explicitness.py +0 -0
  395. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_brain_command.py +0 -0
  396. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_caller_meta_guard.py +0 -0
  397. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_lineage.py +0 -0
  398. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_liveness.py +0 -0
  399. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_manifest.py +0 -0
  400. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_paths.py +0 -0
  401. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_capture_security.py +0 -0
  402. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_command_dispatch.py +0 -0
  403. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_harden.py +0 -0
  404. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_loader.py +0 -0
  405. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_selfcheck.py +0 -0
  406. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cell_verify.py +0 -0
  407. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_chain_token.py +0 -0
  408. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_command.py +0 -0
  409. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_poll_never_breaks_dms.py +0 -0
  410. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_post.py +0 -0
  411. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_channel_wake_policy_filter.py +0 -0
  412. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_chat_command.py +0 -0
  413. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_claude_parser.py +0 -0
  414. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_claude_tmux_template.py +0 -0
  415. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_caller_scope.py +0 -0
  416. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_command.py +0 -0
  417. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_hook.py +0 -0
  418. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codegraph_mcp.py +0 -0
  419. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_codex_waker.py +0 -0
  420. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_committee_command.py +0 -0
  421. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_caller_convention.py +0 -0
  422. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_command.py +0 -0
  423. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_levers.py +0 -0
  424. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_marker.py +0 -0
  425. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_compress_verify.py +0 -0
  426. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_console_encoding_e2e.py +0 -0
  427. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_content_composition.py +0 -0
  428. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_copilot_membrane.py +0 -0
  429. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_copilot_pane_reader.py +0 -0
  430. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_cursor_membrane.py +0 -0
  431. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_daemon_command.py +0 -0
  432. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_daemon_console_encoding.py +0 -0
  433. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_daemon_delivery.py +0 -0
  434. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_delivery_queue.py +0 -0
  435. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_display_sanitize.py +0 -0
  436. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_ensure_monitor_no_peer_default.py +0 -0
  437. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_event_emit.py +0 -0
  438. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_feature_to_uri.py +0 -0
  439. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_brain.py +0 -0
  440. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_client.py +0 -0
  441. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_command.py +0 -0
  442. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gateway_message_idempotency.py +0 -0
  443. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_gh_route_doctor_mesh_name.py +0 -0
  444. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_group_command.py +0 -0
  445. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_guide_commands_parse.py +0 -0
  446. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_guide_selfcheck.py +0 -0
  447. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_heartbeat_check.py +0 -0
  448. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_highlight_command.py +0 -0
  449. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hook_output.py +0 -0
  450. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_activity_marker.py +0 -0
  451. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_add.py +0 -0
  452. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_bundle.py +0 -0
  453. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_init.py +0 -0
  454. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_legacy_generation_removal.py +0 -0
  455. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_lifecycle.py +0 -0
  456. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_merge.py +0 -0
  457. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_verify.py +0 -0
  458. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_win32_bash_wrapper.py +0 -0
  459. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_hooks_win32_command_path.py +0 -0
  460. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_import_command.py +0 -0
  461. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_inbox_identity_provenance.py +0 -0
  462. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_init_command.py +0 -0
  463. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_init_provider_menu.py +0 -0
  464. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_codex_hooks.py +0 -0
  465. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_hook.py +0 -0
  466. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_multiplexer_command.py +0 -0
  467. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_postcompact_hook.py +0 -0
  468. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_install_wake_hook.py +0 -0
  469. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_lane_command.py +0 -0
  470. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_launchd_units.py +0 -0
  471. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_main.py +0 -0
  472. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_main_unknown_verb_guard.py +0 -0
  473. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mcp_missing_hint.py +0 -0
  474. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mcp_server.py +0 -0
  475. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_command.py +0 -0
  476. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_emit_snippet.py +0 -0
  477. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_gateway.py +0 -0
  478. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_sync.py +0 -0
  479. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_memory_sync_membrane.py +0 -0
  480. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_command.py +0 -0
  481. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_inbox_mark_read.py +0 -0
  482. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_inbox_sanitize.py +0 -0
  483. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_originate_thread_623.py +0 -0
  484. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_send_unknown_peer.py +0 -0
  485. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar.py +0 -0
  486. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
  487. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar_muse_sink.py +0 -0
  488. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
  489. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_meta_edge_identity.py +0 -0
  490. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_channel_poll.py +0 -0
  491. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_cli.py +0 -0
  492. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_daemon_collision.py +0 -0
  493. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_self_name_verification.py +0 -0
  494. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_monitor_state_split.py +0 -0
  495. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_multiplexer.py +0 -0
  496. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_muse_membrane.py +0 -0
  497. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_muse_own_cli.py +0 -0
  498. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_obligation_close_is_surfaced.py +0 -0
  499. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_okf_links.py +0 -0
  500. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_onboard_command.py +0 -0
  501. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_opencode_membrane.py +0 -0
  502. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_opencode_plugin.py +0 -0
  503. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_operator_me.py +0 -0
  504. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_orphan_daemons.py +0 -0
  505. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_packaged_artifacts_exist.py +0 -0
  506. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_packaged_skills.py +0 -0
  507. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_executor.py +0 -0
  508. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_executor_windows.py +0 -0
  509. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_drain_command.py +0 -0
  510. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_drain_supervisor.py +0 -0
  511. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_outbox.py +0 -0
  512. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_reply_transport.py +0 -0
  513. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_e2e.py +0 -0
  514. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_host.py +0 -0
  515. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_payload.py +0 -0
  516. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_peer_service_reply.py +0 -0
  517. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_postcompact_recall.py +0 -0
  518. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_process_liveness.py +0 -0
  519. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_protocol_handler.py +0 -0
  520. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_providers_isolation.py +0 -0
  521. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_ratify_command.py +0 -0
  522. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_readme_claims_no_gateway_default.py +0 -0
  523. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_repl_caller_convention.py +0 -0
  524. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_schedule_command.py +0 -0
  525. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_schedule_create_contract.py +0 -0
  526. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_scrub.py +0 -0
  527. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_security.py +0 -0
  528. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_service_app.py +0 -0
  529. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_service_command.py +0 -0
  530. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_service_providers.py +0 -0
  531. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_bridge_inject.py +0 -0
  532. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_bridge_probe.py +0 -0
  533. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_bridge_resolve.py +0 -0
  534. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_session_path_role_gate.py +0 -0
  535. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_shipped_units_match_the_cli.py +0 -0
  536. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_smoke_chat.py +0 -0
  537. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_smoke_one_shot.py +0 -0
  538. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_smoke_phase_5_5.py +0 -0
  539. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_base_hoist.py +0 -0
  540. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_command.py +0 -0
  541. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_identity_stamp.py +0 -0
  542. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_live_pin.py +0 -0
  543. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_mitosis_lineage.py +0 -0
  544. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_tmux_session.py +0 -0
  545. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_spawn_windows_relaunch.py +0 -0
  546. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_stall_alert.py +0 -0
  547. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_subprocess_decode_encoding.py +0 -0
  548. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_timeline_command.py +0 -0
  549. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_runstate_defer.py +0 -0
  550. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_session_reanchor.py +0 -0
  551. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_stale.py +0 -0
  552. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_tmux_wake_submit_verify.py +0 -0
  553. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_token_file_one_parser.py +0 -0
  554. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_token_precedence_explicit_first.py +0 -0
  555. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_unified_token_resolver.py +0 -0
  556. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_version_command.py +0 -0
  557. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_version_consistency.py +0 -0
  558. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_vibe_membrane.py +0 -0
  559. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog.py +0 -0
  560. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_dm_wake.py +0 -0
  561. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
  562. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_dm_wake_wiring.py +0 -0
  563. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_emit_health.py +0 -0
  564. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_install_flags.py +0 -0
  565. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_model_rung.py +0 -0
  566. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/tests/test_watchdog_stale_peers.py +0 -0
  567. {swarph_cli-0.72.39 → swarph_cli-0.72.41}/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.39
3
+ Version: 0.72.41
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.39"
7
+ version = "0.72.41"
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.39"
19
+ __version__ = "0.72.41"
20
20
 
21
21
  __all__ = ["__version__"]
@@ -41,6 +41,7 @@ from swarph_cli.commands.mesh import (
41
41
  _http_get_json,
42
42
  _post_json,
43
43
  _resolve_self_name,
44
+ _resolve_self_with_source,
44
45
  _resolve_token,
45
46
  )
46
47
  from swarph_cli.redact import redact_text, redact_value, encode_outbound_json
@@ -509,6 +510,105 @@ def _thread_recipient(
509
510
  )
510
511
 
511
512
 
513
+ def _peer_grants_url(gw: str, peer: str) -> str:
514
+ return (f"{gw.rstrip('/')}/peers/"
515
+ f"{urllib.parse.quote(peer, safe='')}/grants")
516
+
517
+
518
+ # Level rank shared with the gateway's RBAC union (server._GRANT_LEVEL_RANK):
519
+ # only used to pick the best matching grant for the why-line, never for
520
+ # the entitlement decision itself.
521
+ _DEV_EXTRACT_GRANT_RANK = {"member": 1, "read": 1, "propose": 2, "write": 2,
522
+ "execute": 3, "admin": 4}
523
+
524
+
525
+ def _dev_extract_entitlement(gw: str, token: str, self_name: str,
526
+ project_slug: str) -> tuple:
527
+ """Runner entitlement for dev-extract private rows (card #1410 rework).
528
+
529
+ Exactly ONE ``GET /peers/{peer}/grants`` per run. Entitled only when a
530
+ row with ``grant_type == "board"``, ``target == project_slug``,
531
+ ``level == "execute"`` AND ``direct is True`` is present — the runner's
532
+ OWN direct execute grant (exact grantee match). A ``'*'`` grantee row or
533
+ a group-inherited execute grant never counts, even though the live
534
+ gateway's ``POST /authz/check`` effective verdict reports both with
535
+ ``via_group None`` (``'*'`` row) or ``via_group ALL`` over direct
536
+ (best-level tie) — reading that verdict was the F1/F2 defect.
537
+ Returns ``(entitled, best_level, best_via, state)`` with ``state`` one of
538
+ ``"ok"`` / ``"unavailable"`` (bad status/body) / ``"unreachable"``
539
+ (transport failure); anything but ``"ok"`` fails closed, never open.
540
+ """
541
+ try:
542
+ st, data = _http_get_json(_peer_grants_url(gw, self_name), token)
543
+ except Exception:
544
+ return False, None, None, "unreachable"
545
+ if st == 0:
546
+ return False, None, None, "unreachable"
547
+ if not (st and 200 <= st < 300) or not isinstance(data, dict):
548
+ return False, None, None, "unavailable"
549
+ grants = data.get("grants")
550
+ if not isinstance(grants, list):
551
+ return False, None, None, "unavailable"
552
+ rows = [g for g in grants
553
+ if isinstance(g, dict)
554
+ and g.get("grant_type") == "board"
555
+ and g.get("target") == project_slug]
556
+ entitled = any(g.get("level") == "execute" and g.get("direct") is True
557
+ for g in rows)
558
+ best = None
559
+ for g in rows:
560
+ if (best is None or _DEV_EXTRACT_GRANT_RANK.get(g.get("level"), 0)
561
+ > _DEV_EXTRACT_GRANT_RANK.get(best.get("level"), 0)):
562
+ best = g
563
+ if best is None:
564
+ return entitled, None, None, "ok"
565
+ via = best.get("via_group")
566
+ if not (isinstance(via, str) and via):
567
+ via = "direct" if best.get("direct") is True else "wide"
568
+ return entitled, best.get("level"), via, "ok"
569
+
570
+
571
+ def _dev_extract_privacy_line(card, project_slug, entitled: bool,
572
+ level, via, state: str,
573
+ runner: str = "?", source: str = "?",
574
+ gw_unreachable: bool = False) -> str:
575
+ """The one plain private-rows line for a dev-extract run (card #1410).
576
+
577
+ Names the runner (name + where the identity came from) and the actual
578
+ reason: shown on the runner's own direct execute grant, else the
579
+ missing direct grant with the best matching board grant beside it (a
580
+ best ``level=execute`` there is group/wide, never the runner's own —
581
+ the line never claims otherwise), an unreachable or unavailable grant
582
+ check, an unresolvable project, or no card at all. Carries no repo
583
+ names, so it is safe on every path (print, post, --json stderr).
584
+ """
585
+ who = f"runner {runner} via {source}"
586
+ if card is None:
587
+ if gw_unreachable:
588
+ return ("private rows: withheld "
589
+ "(gateway unreachable, so no project grant to check)")
590
+ return "private rows: withheld (no card, so no project grant to check)"
591
+ if not project_slug:
592
+ return ("private rows: withheld (project unresolvable, "
593
+ "so no project grant to check)")
594
+ if entitled:
595
+ return (f"private rows: shown for project {project_slug} "
596
+ f"({who}: direct execute grant; repos from card-allowlist)")
597
+ if state == "unreachable":
598
+ return (f"private rows: withheld for project {project_slug} "
599
+ f"({who}: gateway unreachable, so no grant to check)")
600
+ if state != "ok":
601
+ return (f"private rows: withheld for project {project_slug} "
602
+ f"({who}: grant check unavailable)")
603
+ if level is None:
604
+ return (f"private rows: withheld for project {project_slug} "
605
+ f"({who}: no direct execute grant; no board grant at all)")
606
+ lvl = level if isinstance(level, str) and level else "none"
607
+ return (f"private rows: withheld for project {project_slug} "
608
+ f"({who}: no direct execute grant; "
609
+ f"best board grant: level={lvl}, via={via})")
610
+
611
+
512
612
  def _say_line(resp: dict, card_id, to_node: str, *, reason: Optional[str] = None) -> str:
513
613
  """The post confirmation — AND any obligation the post just DISCHARGED.
514
614
 
@@ -560,6 +660,57 @@ def _card_say_payload(from_node: str, to_node: str, kind: str, content: str,
560
660
  }
561
661
 
562
662
 
663
+ def _run_cards_say(gw: str, token: str, self_name: str, card_id: int,
664
+ content: str, kind: str, to_node: Optional[str], aj: bool, *,
665
+ opt_out: bool = False, verb: str = "say") -> int:
666
+ """Post `content` onto a card's thread (shared by `say` + `dev-extract`).
667
+
668
+ Factored out of the `say` block without behavior change: fetch the card,
669
+ refuse a threadless card by name, default the recipient
670
+ (--to > assignee > project owner_orchestrator), POST /messages, render the
671
+ confirmation (including any discharged obligation, #562). `dev-extract`
672
+ posts through this so both verbs keep ONE recipient/redaction path.
673
+ """
674
+ st, card = _http_get_json(f"{gw}/board/cards/{card_id}", token)
675
+ if st != 200:
676
+ print(f"swarph board cards {verb}: cannot read card #{card_id}: "
677
+ f"{card.get('detail', card)}", file=sys.stderr)
678
+ return 1
679
+ thread_uuid = card.get("thread_uuid")
680
+ if not thread_uuid:
681
+ # Named refusal, not a silent no-op. Same reason the gateway 409s.
682
+ print(f"swarph board cards {verb}: card #{card_id} has no bound thread "
683
+ f"(it predates #181a). Run scripts/migrate_card_threads.py on "
684
+ f"the gateway host.", file=sys.stderr)
685
+ return 1
686
+ # #864: card GET has no owner field — only fetch projects when the
687
+ # cheaper defaults (explicit --to, card assignee) are absent.
688
+ owner = None
689
+ if not to_node and not card.get("assignee"):
690
+ owner = _project_owner_orchestrator(gw, token, card.get("project_id"))
691
+ try:
692
+ to_node, reason = _thread_recipient(
693
+ card, to_node, owner_orchestrator=owner,
694
+ )
695
+ except RuntimeError as exc:
696
+ print(f"swarph board cards {verb}: {exc}", file=sys.stderr)
697
+ return 1
698
+ st, d = _post_json(
699
+ f"{gw}/messages",
700
+ _card_say_payload(self_name, to_node, kind, content, thread_uuid,
701
+ opt_out=opt_out),
702
+ token,
703
+ )
704
+ # A 403 here carries the gateway's explanation that attaching PUBLISHES
705
+ # to everyone who can read the card, now and in future, so it needs an
706
+ # explicit `propose` grant. `_out` passes `detail` through whole; it does
707
+ # not need help, and a second copy of that logic is a second thing to
708
+ # keep in sync.
709
+ return _out(
710
+ st, d, lambda x: _say_line(x, card_id, to_node, reason=reason), aj,
711
+ )
712
+
713
+
563
714
  _NO_TIMEOUT = "NO TIMEOUT — this never goes red on its own; pass --timeout-hours if it should"
564
715
 
565
716
 
@@ -1114,6 +1265,20 @@ def _build_parser() -> argparse.ArgumentParser:
1114
1265
  "owner_orchestrator; refused if neither resolves)")
1115
1266
  _add_common(cy)
1116
1267
 
1268
+ # card #1396 (#559 phase 2): the pinned dev extract. Posts through the
1269
+ # SAME thread machinery as `say` (shared `_run_cards_say` below), so the
1270
+ # recipient rules, redaction, and post-confirmation stay in one place.
1271
+ from swarph_cli.commands.dev_extract import build_parser as _de_build_parser
1272
+ _de = _de_build_parser()
1273
+ de = cards.add_parser(
1274
+ "dev-extract", help="build (+ post) a pinned codegraph+federation "
1275
+ "dev extract for a card (#1396)",
1276
+ parents=[_de], add_help=False,
1277
+ description=_de.description)
1278
+ de.add_argument("--to", dest="to_node", default=None,
1279
+ help="recipient peer (same defaulting as `say`)")
1280
+ _add_common(de)
1281
+
1117
1282
  ck = cards.add_parser(
1118
1283
  "ask", intermixed=True,
1119
1284
  help="MINT an obligation on this card: name who owes what, as a ROW")
@@ -1680,44 +1845,113 @@ def run_board(argv: list[str]) -> int:
1680
1845
  except ContentError as exc:
1681
1846
  print(f"swarph board cards say: {exc}", file=sys.stderr)
1682
1847
  return 1
1683
- st, card = _http_get_json(f"{gw}/board/cards/{args.id}", token)
1684
- if st != 200:
1685
- print(f"swarph board cards say: cannot read card #{args.id}: "
1686
- f"{card.get('detail', card)}", file=sys.stderr)
1687
- return 1
1688
- thread_uuid = card.get("thread_uuid")
1689
- if not thread_uuid:
1690
- # Named refusal, not a silent no-op. Same reason the gateway 409s.
1691
- print(f"swarph board cards say: card #{args.id} has no bound thread "
1692
- f"(it predates #181a). Run scripts/migrate_card_threads.py on "
1693
- f"the gateway host.", file=sys.stderr)
1694
- return 1
1695
- # #864: card GET has no owner field — only fetch projects when the
1696
- # cheaper defaults (explicit --to, card assignee) are absent.
1697
- owner = None
1698
- if not args.to_node and not card.get("assignee"):
1699
- owner = _project_owner_orchestrator(gw, token, card.get("project_id"))
1700
- try:
1701
- to_node, reason = _thread_recipient(
1702
- card, args.to_node, owner_orchestrator=owner,
1703
- )
1704
- except RuntimeError as exc:
1705
- print(f"swarph board cards say: {exc}", file=sys.stderr)
1706
- return 1
1707
- st, d = _post_json(
1708
- f"{gw}/messages",
1709
- _card_say_payload(self_name, to_node, args.kind, content, thread_uuid,
1710
- opt_out=getattr(args, "no_redact", False)),
1711
- token,
1712
- )
1713
- # A 403 here carries the gateway's explanation that attaching PUBLISHES
1714
- # to everyone who can read the card, now and in future, so it needs an
1715
- # explicit `propose` grant. `_out` passes `detail` through whole; it does
1716
- # not need help, and a second copy of that logic is a second thing to
1717
- # keep in sync.
1718
- return _out(
1719
- st, d, lambda x: _say_line(x, args.id, to_node, reason=reason), aj,
1720
- )
1848
+ return _run_cards_say(
1849
+ gw, token, self_name, args.id, content, args.kind,
1850
+ args.to_node, aj, opt_out=getattr(args, "no_redact", False))
1851
+ if args.command == "dev-extract":
1852
+ # card #1396 (#559 phase 2). Name-token source: --symbol, else
1853
+ # the card's own title+body; --path selects by file path.
1854
+ # Post target: --card (via the shared `say` path) unless
1855
+ # --print-only (print nothing-posted) or no --card (print only).
1856
+ from swarph_cli.commands import dev_extract as _de_mod
1857
+ card = None
1858
+ gw_unreachable = False
1859
+ if args.card is not None:
1860
+ try:
1861
+ st, card = _http_get_json(
1862
+ f"{gw}/board/cards/{args.card}", token)
1863
+ except Exception as exc:
1864
+ st, card = 0, {"detail": str(exc)}
1865
+ if st == 0:
1866
+ gw_unreachable = True
1867
+ if st != 200:
1868
+ if not args.symbol and not args.path:
1869
+ _why = ("gateway unreachable"
1870
+ if gw_unreachable else
1871
+ f"cannot read card #{args.card}: "
1872
+ f"{card.get('detail', card)}")
1873
+ print(f"swarph board cards dev-extract: {_why}",
1874
+ file=sys.stderr)
1875
+ return 1
1876
+ card = None
1877
+ explicit = list(args.symbol or [])
1878
+ mined = _de_mod.extract_card_tokens(card) if card else []
1879
+ tokens = explicit + [t for t in mined if t not in explicit]
1880
+ paths = list(args.path or [])
1881
+ no_tokens_note = None
1882
+ if not tokens and not paths:
1883
+ if card is None:
1884
+ print("swarph board cards dev-extract: no --symbol/--path "
1885
+ "and no readable --card to mine tokens from",
1886
+ file=sys.stderr)
1887
+ return 2
1888
+ # card #1410: a READABLE card with no minable tokens is a
1889
+ # normal (empty) extract, not an error — exit 0 with its own
1890
+ # plain line. A truly UNREADABLE card keeps the error path
1891
+ # above (exit 1, cannot read card).
1892
+ no_tokens_note = f"card #{args.card}: no symbols to look up"
1893
+ # card #1410: the card's board project slug resolves the same
1894
+ # way as every other card-artifact project read (card row
1895
+ # carries project_id; the slug lives on GET /board/projects,
1896
+ # matched by id). Unresolvable -> None -> public only.
1897
+ proj_slug = None
1898
+ if card:
1899
+ try:
1900
+ _pst, _pdata = _http_get_json(
1901
+ f"{gw.rstrip('/')}/board/projects", token)
1902
+ _rows = (_pdata if isinstance(_pdata, list)
1903
+ else (_pdata or {}).get("projects", []))
1904
+ if _pst and 200 <= _pst < 300:
1905
+ proj_slug = _de_mod.card_project_slug(card, _rows)
1906
+ except Exception:
1907
+ proj_slug = None
1908
+ # card #1410 rework: entitlement resolves ONCE per run — the
1909
+ # runner's OWN direct execute grant on the card's project
1910
+ # (GET /peers/{peer}/grants, direct row only), or public only.
1911
+ # Anything POSTED carries public rows only, whoever runs it.
1912
+ runner_name, runner_source = _resolve_self_with_source(
1913
+ args.self_name)
1914
+ entitled, _lvl, _via, _state = (False, None, None, "unavailable")
1915
+ if card is not None and proj_slug:
1916
+ entitled, _lvl, _via, _state = _dev_extract_entitlement(
1917
+ gw, token, runner_name, proj_slug)
1918
+ privacy_line = _dev_extract_privacy_line(
1919
+ card, proj_slug, entitled, _lvl, _via, _state,
1920
+ runner=runner_name, source=runner_source,
1921
+ gw_unreachable=gw_unreachable)
1922
+ posting = args.card is not None and not args.print_only
1923
+ post_safe = posting
1924
+ ex = _de_mod.build_extract(
1925
+ tokens=tokens, index_path=args.index,
1926
+ fed_report=args.fed_report, structurizr_ws=args.structurizr_ws,
1927
+ card=card, paths=paths, project_slug=proj_slug,
1928
+ entitled=(entitled and not post_safe))
1929
+ if getattr(args, "json", False):
1930
+ # card #1396: redact WITHHELD registry entries (no private
1931
+ # paths/index times in machine-readable output). The
1932
+ # no-tokens notice goes to stderr so stdout stays parseable —
1933
+ # and so does the privacy line. A posting-shaped run
1934
+ # (--card without --print-only) builds post-safe: the
1935
+ # withheld set is count-only even in --json.
1936
+ if no_tokens_note:
1937
+ print(no_tokens_note, file=sys.stderr)
1938
+ print(privacy_line, file=sys.stderr)
1939
+ print(json.dumps(_de_mod.redact_for_json(ex, post_safe=post_safe),
1940
+ indent=2, default=str))
1941
+ return 0
1942
+ body = _de_mod.render(ex, max_lines=args.max_lines,
1943
+ post_safe=post_safe)
1944
+ if args.print_only or args.card is None:
1945
+ if no_tokens_note:
1946
+ print(no_tokens_note)
1947
+ print(privacy_line)
1948
+ print(body, end="")
1949
+ return 0
1950
+ print(privacy_line)
1951
+ return _run_cards_say(
1952
+ gw, token, self_name, args.card, body, "fyi",
1953
+ args.to_node, aj, opt_out=getattr(args, "no_redact", False),
1954
+ verb="dev-extract")
1721
1955
  if args.command == "ready":
1722
1956
  st, d = _patch_json(f"{gw}/board/cards/{args.id}", {"actor": self_name, "move_ready": not args.clear}, token)
1723
1957
  return _out(st, d, lambda x: f"card #{x.get('id')} move_ready -> {x.get('move_ready')}", aj)