swarph-cli 0.69.1__tar.gz → 0.69.3__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 (445) hide show
  1. {swarph_cli-0.69.1/src/swarph_cli.egg-info → swarph_cli-0.69.3}/PKG-INFO +2 -1
  2. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/pyproject.toml +4 -1
  3. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/__init__.py +1 -1
  4. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/providers.py +4 -1
  5. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/mesh.py +33 -16
  6. {swarph_cli-0.69.1 → swarph_cli-0.69.3/src/swarph_cli.egg-info}/PKG-INFO +2 -1
  7. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli.egg-info/requires.txt +3 -0
  8. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_brain_ask_command.py +4 -1
  9. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_packaged_artifacts_exist.py +4 -1
  10. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_tmux_wake_submit_verify.py +80 -0
  11. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog.py +4 -1
  12. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/LICENSE +0 -0
  13. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/README.md +0 -0
  14. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/setup.cfg +0 -0
  15. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/__main__.py +0 -0
  16. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/__init__.py +0 -0
  17. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/backends.py +0 -0
  18. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/pack.py +0 -0
  19. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/prices.py +0 -0
  20. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/quality.py +0 -0
  21. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/refresh_prices.py +0 -0
  22. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/rules.py +0 -0
  23. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/runner.py +0 -0
  24. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/bench/validate.py +0 -0
  25. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/caller.py +0 -0
  26. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/__init__.py +0 -0
  27. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/harden.py +0 -0
  28. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/lineage.py +0 -0
  29. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/liveness.py +0 -0
  30. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/manifest.py +0 -0
  31. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/paths.py +0 -0
  32. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/capture/verify.py +0 -0
  33. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/cell.py +0 -0
  34. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/chain_token.py +0 -0
  35. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/channel.py +0 -0
  36. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/__init__.py +0 -0
  37. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/_content.py +0 -0
  38. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/_display.py +0 -0
  39. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/_gateway_client.py +0 -0
  40. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/add.py +0 -0
  41. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/bench.py +0 -0
  42. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/board.py +0 -0
  43. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/board_merge_check.py +0 -0
  44. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/brain.py +0 -0
  45. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/brain_ask.py +0 -0
  46. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/cell.py +0 -0
  47. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/cell_probe.py +0 -0
  48. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
  49. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/channel.py +0 -0
  50. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/chat.py +0 -0
  51. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/codegraph.py +0 -0
  52. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/codegraph_hook.py +0 -0
  53. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/codex_hook_output.py +0 -0
  54. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/codex_waker.py +0 -0
  55. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/compress.py +0 -0
  56. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/daemon.py +0 -0
  57. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/dreaming.py +0 -0
  58. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/event.py +0 -0
  59. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/gateway.py +0 -0
  60. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/gh_route.py +0 -0
  61. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/group.py +0 -0
  62. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/guide.py +0 -0
  63. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/highlight.py +0 -0
  64. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/hook_interpreter.py +0 -0
  65. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/hook_output.py +0 -0
  66. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/hooks.py +0 -0
  67. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/import_session.py +0 -0
  68. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/init.py +0 -0
  69. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
  70. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/install_hook.py +0 -0
  71. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/install_multiplexer.py +0 -0
  72. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
  73. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
  74. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/install_wake_hook.py +0 -0
  75. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/lane.py +0 -0
  76. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/mcp_server.py +0 -0
  77. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/memory.py +0 -0
  78. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
  79. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/memory_sync.py +0 -0
  80. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/monitor.py +0 -0
  81. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/okf_links.py +0 -0
  82. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/onboard.py +0 -0
  83. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
  84. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
  85. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/protocol_handler.py +0 -0
  86. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/ratify.py +0 -0
  87. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/schedule.py +0 -0
  88. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/security.py +0 -0
  89. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/service.py +0 -0
  90. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/spawn.py +0 -0
  91. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/timeline.py +0 -0
  92. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/version.py +0 -0
  93. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/wake_hook_output.py +0 -0
  94. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/commands/watchdog.py +0 -0
  95. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/compress/__init__.py +0 -0
  96. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/compress/levers.py +0 -0
  97. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/compress/marker.py +0 -0
  98. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/compress/verify.py +0 -0
  99. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/console_safe.py +0 -0
  100. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/delivery_queue.py +0 -0
  101. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dm_frame.py +0 -0
  102. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/__init__.py +0 -0
  103. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/candidates.py +0 -0
  104. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/clone.py +0 -0
  105. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/enrich.py +0 -0
  106. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/index_check.py +0 -0
  107. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/notify.py +0 -0
  108. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/organize.py +0 -0
  109. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/probes.py +0 -0
  110. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/report.py +0 -0
  111. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/run.py +0 -0
  112. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/slm.py +0 -0
  113. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/transcripts.py +0 -0
  114. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/dreaming/verify.py +0 -0
  115. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway/__init__.py +0 -0
  116. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway/feature_registry.py +0 -0
  117. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway/lanes_control.py +0 -0
  118. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway/schema.sql +0 -0
  119. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway/server.py +0 -0
  120. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway/services_control.py +0 -0
  121. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gateway_default.py +0 -0
  122. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/gh_identity.py +0 -0
  123. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/guide/GUIDE.md +0 -0
  124. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/identity.py +0 -0
  125. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/main.py +0 -0
  126. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/multiplexer.py +0 -0
  127. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/orphan_daemons.py +0 -0
  128. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/pane_probe.py +0 -0
  129. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/parsers/__init__.py +0 -0
  130. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/parsers/claude.py +0 -0
  131. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
  132. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
  133. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
  134. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
  135. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
  136. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
  137. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
  138. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
  139. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
  140. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
  141. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
  142. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
  143. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_executor.py +0 -0
  144. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_executor_windows.py +0 -0
  145. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_reconciliation.py +0 -0
  146. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_reply_outbox.py +0 -0
  147. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_service_host.py +0 -0
  148. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_service_payload.py +0 -0
  149. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_service_reply.py +0 -0
  150. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/peer_staging.py +0 -0
  151. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/query_filters.py +0 -0
  152. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/scripts/__init__.py +0 -0
  153. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
  154. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
  155. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
  156. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
  157. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/scripts/wake_watchdog.py +0 -0
  158. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/service/__init__.py +0 -0
  159. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/service/app.py +0 -0
  160. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/service/providers.py +0 -0
  161. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/session_bridge.py +0 -0
  162. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
  163. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
  164. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/source_text.py +0 -0
  165. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/stall_alert.py +0 -0
  166. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/codex-waker.default +0 -0
  167. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
  168. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
  169. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
  170. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
  171. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
  172. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
  173. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
  174. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
  175. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
  176. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
  177. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
  178. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
  179. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
  180. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/timeline_paths.py +0 -0
  181. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli/tokens.py +0 -0
  182. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli.egg-info/SOURCES.txt +0 -0
  183. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
  184. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli.egg-info/entry_points.txt +0 -0
  185. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/src/swarph_cli.egg-info/top_level.txt +0 -0
  186. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_124_register_merge.py +0 -0
  187. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_126_pending_from_complete.py +0 -0
  188. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_132_ensure_monitor_state_dir.py +0 -0
  189. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_138_memory_navigate.py +0 -0
  190. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_139_tool_probe.py +0 -0
  191. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_183_card_anchor.py +0 -0
  192. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_184_notify_honesty.py +0 -0
  193. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_201_win32_bash_refusal.py +0 -0
  194. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_243_onboard_per_peer_token.py +0 -0
  195. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_307_task4_ask_reply.py +0 -0
  196. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
  197. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_319_refusal_exit_codes.py +0 -0
  198. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_323_mistral_backend.py +0 -0
  199. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_332_report_organize_findings.py +0 -0
  200. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_356_query_filters.py +0 -0
  201. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_397_gh_identity_router.py +0 -0
  202. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_397_router_preflight.py +0 -0
  203. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_402_one_identity_resolver.py +0 -0
  204. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_467b_onboard_operator_credential.py +0 -0
  205. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_472_register_caller_binding.py +0 -0
  206. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_523_guide.py +0 -0
  207. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_524_conftest_hermeticity.py +0 -0
  208. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_532_accept_flag.py +0 -0
  209. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_535_version_capability.py +0 -0
  210. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_546_default_gateway.py +0 -0
  211. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_547_verbs_from_registry.py +0 -0
  212. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_548_gateway_remainder.py +0 -0
  213. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_552_codegraph_gateway.py +0 -0
  214. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_555_relay_row_shape.py +0 -0
  215. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_556_relay_freshness.py +0 -0
  216. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_559_edges_truncated.py +0 -0
  217. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_564_bootstrap_first_peer.py +0 -0
  218. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
  219. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_579_register_bootstrap_message.py +0 -0
  220. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_591_cli_step_graph.py +0 -0
  221. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_644_monitor_supervision.py +0 -0
  222. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_648_install_unit.py +0 -0
  223. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_654_reexec.py +0 -0
  224. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_656_owned_slm.py +0 -0
  225. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_684_dreaming_verb.py +0 -0
  226. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_689_pkg_version_order.py +0 -0
  227. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_716_timeline_one_path.py +0 -0
  228. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_724_ps1_ascii_or_bom.py +0 -0
  229. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_725_stdio_reconfigure.py +0 -0
  230. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_729_dm_once.py +0 -0
  231. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_729_wake_watchdog.py +0 -0
  232. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_734_dreaming_enrich_degrade.py +0 -0
  233. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_735_dm_mcp_tools.py +0 -0
  234. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_740_edit_project.py +0 -0
  235. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_762_cards_edit_priority.py +0 -0
  236. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_764_enrich_collapse.py +0 -0
  237. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_801_confirm_flow_cli.py +0 -0
  238. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_802_stage_history.py +0 -0
  239. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_825_codegraph_hook_noise.py +0 -0
  240. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_825_install_posttooluse_only.py +0 -0
  241. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_825_remaining_cap_shred_bind.py +0 -0
  242. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_829_counterfactual_column.py +0 -0
  243. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_830_hook_binding_version.py +0 -0
  244. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_84_cli_labels.py +0 -0
  245. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_866_doctrine_guide.py +0 -0
  246. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_872_identity_refuses_not_warns.py +0 -0
  247. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_874_source_text.py +0 -0
  248. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
  249. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_937_dreaming_notify.py +0 -0
  250. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_938_organize_line_limit.py +0 -0
  251. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_941_bench_backends.py +0 -0
  252. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_941_harness_342.py +0 -0
  253. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_945_same_line_pairing.py +0 -0
  254. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_955_prompt_audit.py +0 -0
  255. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_957_auth_http.py +0 -0
  256. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_959_venv_interpreter.py +0 -0
  257. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_960_channel.py +0 -0
  258. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_963_plugin_manifest.py +0 -0
  259. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_964_channel_cell.py +0 -0
  260. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_965_mesh_wait.py +0 -0
  261. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_975_channel_hop.py +0 -0
  262. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_add_security_gate.py +0 -0
  263. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_add.py +0 -0
  264. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_hash.py +0 -0
  265. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_lib.py +0 -0
  266. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_mcp.py +0 -0
  267. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_skill.py +0 -0
  268. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_tool.py +0 -0
  269. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_artifact_uri.py +0 -0
  270. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_backends.py +0 -0
  271. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_command.py +0 -0
  272. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_pack.py +0 -0
  273. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_prices.py +0 -0
  274. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_quality.py +0 -0
  275. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_runner.py +0 -0
  276. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_bench_validate.py +0 -0
  277. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_board_card_thread.py +0 -0
  278. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_board_command.py +0 -0
  279. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_board_merge_check.py +0 -0
  280. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_board_obligation_close.py +0 -0
  281. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_brain_ask_env_diagnosis.py +0 -0
  282. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_brain_ask_identity_explicitness.py +0 -0
  283. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_brain_command.py +0 -0
  284. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_caller_meta_guard.py +0 -0
  285. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_capture_lineage.py +0 -0
  286. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_capture_liveness.py +0 -0
  287. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_capture_manifest.py +0 -0
  288. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_capture_paths.py +0 -0
  289. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_capture_security.py +0 -0
  290. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_cell_command_dispatch.py +0 -0
  291. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_cell_harden.py +0 -0
  292. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_cell_loader.py +0 -0
  293. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_cell_selfcheck.py +0 -0
  294. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_cell_verify.py +0 -0
  295. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_chain_token.py +0 -0
  296. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_channel_command.py +0 -0
  297. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_channel_poll_never_breaks_dms.py +0 -0
  298. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_channel_post.py +0 -0
  299. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_channel_wake_policy_filter.py +0 -0
  300. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_chat_command.py +0 -0
  301. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_claude_parser.py +0 -0
  302. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_claude_tmux_template.py +0 -0
  303. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_codegraph_caller_scope.py +0 -0
  304. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_codegraph_command.py +0 -0
  305. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_codegraph_hook.py +0 -0
  306. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_codegraph_mcp.py +0 -0
  307. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_codex_waker.py +0 -0
  308. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_compress_caller_convention.py +0 -0
  309. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_compress_command.py +0 -0
  310. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_compress_levers.py +0 -0
  311. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_compress_marker.py +0 -0
  312. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_compress_verify.py +0 -0
  313. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_console_encoding_e2e.py +0 -0
  314. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_content_composition.py +0 -0
  315. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_cursor_membrane.py +0 -0
  316. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_daemon_command.py +0 -0
  317. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_daemon_console_encoding.py +0 -0
  318. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_daemon_delivery.py +0 -0
  319. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_delivery_queue.py +0 -0
  320. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_display_sanitize.py +0 -0
  321. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_ensure_monitor_no_peer_default.py +0 -0
  322. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_event_emit.py +0 -0
  323. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_feature_to_uri.py +0 -0
  324. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_gateway_brain.py +0 -0
  325. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_gateway_client.py +0 -0
  326. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_gateway_command.py +0 -0
  327. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_gateway_message_idempotency.py +0 -0
  328. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_gh_route_doctor_mesh_name.py +0 -0
  329. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_group_command.py +0 -0
  330. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_guide_commands_parse.py +0 -0
  331. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_guide_selfcheck.py +0 -0
  332. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_heartbeat_check.py +0 -0
  333. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_highlight_command.py +0 -0
  334. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hook_output.py +0 -0
  335. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_activity_marker.py +0 -0
  336. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_add.py +0 -0
  337. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_bundle.py +0 -0
  338. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_init.py +0 -0
  339. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_legacy_generation_removal.py +0 -0
  340. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_lifecycle.py +0 -0
  341. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_merge.py +0 -0
  342. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_verify.py +0 -0
  343. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_win32_bash_wrapper.py +0 -0
  344. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_hooks_win32_command_path.py +0 -0
  345. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_import_command.py +0 -0
  346. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_inbox_identity_provenance.py +0 -0
  347. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_init_command.py +0 -0
  348. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_init_provider_menu.py +0 -0
  349. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_install_codex_hooks.py +0 -0
  350. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_install_hook.py +0 -0
  351. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_install_multiplexer_command.py +0 -0
  352. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_install_postcompact_hook.py +0 -0
  353. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_install_wake_hook.py +0 -0
  354. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_lane_command.py +0 -0
  355. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_main.py +0 -0
  356. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_main_unknown_verb_guard.py +0 -0
  357. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mcp_missing_hint.py +0 -0
  358. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mcp_server.py +0 -0
  359. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_memory_command.py +0 -0
  360. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_memory_emit_snippet.py +0 -0
  361. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_memory_gateway.py +0 -0
  362. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_memory_sync.py +0 -0
  363. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_memory_sync_membrane.py +0 -0
  364. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_command.py +0 -0
  365. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_inbox_mark_read.py +0 -0
  366. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_inbox_sanitize.py +0 -0
  367. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_originate_thread_623.py +0 -0
  368. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_send_unknown_peer.py +0 -0
  369. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_sidecar.py +0 -0
  370. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
  371. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
  372. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_meta_edge_identity.py +0 -0
  373. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_monitor_channel_poll.py +0 -0
  374. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_monitor_cli.py +0 -0
  375. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_monitor_daemon_collision.py +0 -0
  376. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_monitor_self_name_verification.py +0 -0
  377. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_monitor_state_split.py +0 -0
  378. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_multiplexer.py +0 -0
  379. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_muse_membrane.py +0 -0
  380. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_muse_own_cli.py +0 -0
  381. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_obligation_close_is_surfaced.py +0 -0
  382. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_okf_links.py +0 -0
  383. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_onboard_command.py +0 -0
  384. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_opencode_membrane.py +0 -0
  385. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_opencode_plugin.py +0 -0
  386. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_orphan_daemons.py +0 -0
  387. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_packaged_skills.py +0 -0
  388. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_executor.py +0 -0
  389. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_executor_windows.py +0 -0
  390. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_reply_drain_command.py +0 -0
  391. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_reply_drain_supervisor.py +0 -0
  392. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_reply_outbox.py +0 -0
  393. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_reply_transport.py +0 -0
  394. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_service_e2e.py +0 -0
  395. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_service_host.py +0 -0
  396. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_service_payload.py +0 -0
  397. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_peer_service_reply.py +0 -0
  398. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_postcompact_recall.py +0 -0
  399. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_process_liveness.py +0 -0
  400. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_protocol_handler.py +0 -0
  401. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_providers_isolation.py +0 -0
  402. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_ratify_command.py +0 -0
  403. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_readme_claims_no_gateway_default.py +0 -0
  404. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_repl_caller_convention.py +0 -0
  405. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_schedule_command.py +0 -0
  406. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_schedule_create_contract.py +0 -0
  407. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_security.py +0 -0
  408. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_service_app.py +0 -0
  409. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_service_command.py +0 -0
  410. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_service_providers.py +0 -0
  411. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_session_bridge_inject.py +0 -0
  412. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_session_bridge_probe.py +0 -0
  413. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_session_bridge_resolve.py +0 -0
  414. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_session_path_role_gate.py +0 -0
  415. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_shipped_units_match_the_cli.py +0 -0
  416. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_smoke_chat.py +0 -0
  417. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_smoke_one_shot.py +0 -0
  418. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_smoke_phase_5_5.py +0 -0
  419. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_base_hoist.py +0 -0
  420. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_command.py +0 -0
  421. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_identity_stamp.py +0 -0
  422. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_live_pin.py +0 -0
  423. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_mitosis_lineage.py +0 -0
  424. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_tmux_session.py +0 -0
  425. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_spawn_windows_relaunch.py +0 -0
  426. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_stall_alert.py +0 -0
  427. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_subprocess_decode_encoding.py +0 -0
  428. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_timeline_command.py +0 -0
  429. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_tmux_wake_runstate_defer.py +0 -0
  430. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_tmux_wake_session_reanchor.py +0 -0
  431. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_tmux_wake_stale.py +0 -0
  432. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_token_file_one_parser.py +0 -0
  433. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_token_precedence_explicit_first.py +0 -0
  434. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_unified_token_resolver.py +0 -0
  435. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_version_command.py +0 -0
  436. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_version_consistency.py +0 -0
  437. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_vibe_membrane.py +0 -0
  438. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_dm_wake.py +0 -0
  439. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
  440. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_dm_wake_wiring.py +0 -0
  441. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_emit_health.py +0 -0
  442. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_install_flags.py +0 -0
  443. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_model_rung.py +0 -0
  444. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/tests/test_watchdog_stale_peers.py +0 -0
  445. {swarph_cli-0.69.1 → swarph_cli-0.69.3}/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.69.1
3
+ Version: 0.69.3
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
@@ -26,6 +26,7 @@ License-File: LICENSE
26
26
  Requires-Dist: swarph-mesh<0.10,>=0.5.0
27
27
  Requires-Dist: swarph-shared<0.9,>=0.7.0
28
28
  Requires-Dist: PyYAML>=6.0
29
+ Requires-Dist: tomli>=1.1; python_version < "3.11"
29
30
  Provides-Extra: dev
30
31
  Requires-Dist: pytest>=7.0; extra == "dev"
31
32
  Provides-Extra: mcp
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "swarph-cli"
7
- version = "0.69.1"
7
+ version = "0.69.3"
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" }
@@ -73,6 +73,9 @@ dependencies = [
73
73
  # Stays a swarph-cli dep since file I/O is operator-tooling-layer
74
74
  # concern; swarph-shared cell module is pure-stdlib.
75
75
  "PyYAML>=6.0",
76
+ # tomllib is stdlib from 3.11. bench/providers.py (and the tests that read
77
+ # pyproject.toml) fall back to tomli on the declared 3.10 floor. card #1000.
78
+ "tomli>=1.1; python_version < \"3.11\"",
76
79
  ]
77
80
 
78
81
  [project.urls]
@@ -16,6 +16,6 @@ The architecture splits CLI from substrate so:
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- __version__ = "0.69.1"
19
+ __version__ = "0.69.3"
20
20
 
21
21
  __all__ = ["__version__"]
@@ -2,7 +2,10 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  import os
5
- import tomllib
5
+ try:
6
+ import tomllib
7
+ except ModuleNotFoundError: # py3.10
8
+ import tomli as tomllib
6
9
  from pathlib import Path
7
10
  from urllib.parse import urlparse
8
11
 
@@ -2000,10 +2000,14 @@ _WAKE_PROMPT = "check mesh"
2000
2000
  # not shown. Longer than _WAKE_PROMPT, so wake-text detection strips this
2001
2001
  # one first.
2002
2002
  _OPENCODE_WAKE_PROMPT = "check mesh: swarph_dm_unread"
2003
- # A finished turn keeps its ▣ header and adds a trailing duration
2004
- # (`· 3.3s`). An in-progress header has no such suffix. Measured by
2005
- # drop-on-meta-edge on 1.18.33 (card #961, post 54557).
2006
- _OPENCODE_DONE = re.compile(r"·\s*\d+(?:\.\d+)?s\s*$")
2003
+ # A finished turn keeps its ▣ header and adds a duration.
2004
+ # Short turns read `· 3.3s` (drop-on-meta-edge, 1.18.33, card #961 post
2005
+ # 54557). A longer idle turn reads `· 3m 4s` (opencode pane, 2026-09-29
2006
+ # 07:10Z). On a wide pane the same row continues into the sidebar, so the
2007
+ # duration is not the end of the line. An in-progress header has no duration.
2008
+ _OPENCODE_DONE = re.compile(
2009
+ r"·\s*(?:\d+h\s*)?(?:\d+m\s*)?\d+(?:\.\d+)?s\b"
2010
+ )
2007
2011
  # Submit-verify bounds (#533): the settle pause lets the -l literal LAND in
2008
2012
  # the composer before Enter can submit it (the blind gesture raced this), and
2009
2013
  # the attempt bound keeps a never-submitting pane from being Enter-spammed
@@ -2189,13 +2193,29 @@ def _opencode_turn_finished_target(target: str) -> bool:
2189
2193
  return _opencode_turn_finished(lines)
2190
2194
 
2191
2195
 
2196
+ def _opencode_row_text(line: str) -> str:
2197
+ """Text on one ``┃`` row, with a right-aligned footer cut off.
2198
+
2199
+ A long cwd:branch is drawn inside the box, right-aligned, and wraps
2200
+ across as many rows as the path needs. The gap before that footer is
2201
+ a run of 4 or more spaces. Composer text is the left side of the row.
2202
+ Leading spaces stay in place for the split, then the left side is
2203
+ stripped. Skipping a fixed number of rows cannot work: the row count
2204
+ is the path length over the box width.
2205
+ """
2206
+ idx = line.find("┃")
2207
+ if idx < 0:
2208
+ return ""
2209
+ return re.split(r" {4,}", line[idx + 1:], maxsplit=1)[0].strip()
2210
+
2211
+
2192
2212
  def _opencode_input(lines: list[str]) -> Optional[str]:
2193
- """The composer input row's text, '' when that row is empty, None if no box.
2213
+ """Composer text inside the box, '' when that box is empty, None if no box.
2194
2214
 
2195
- Walk up from the mode row. Blank ``┃`` lines are the box padding. A
2196
- ``▣`` spinner sits between the transcript and the box, and the walk
2197
- stops there so a submitted prompt in the transcript is not read as
2198
- text still sitting in the composer.
2215
+ Walk up from the mode row. Each ``┃`` row contributes only the text
2216
+ before its footer gap. The walk stops at the first line that is not a
2217
+ ``┃`` row — the top of the box — so a transcript ``┃`` row above the
2218
+ box is never composer text.
2199
2219
  """
2200
2220
  mode_at = None
2201
2221
  for i, ln in enumerate(lines):
@@ -2204,14 +2224,11 @@ def _opencode_input(lines: list[str]) -> Optional[str]:
2204
2224
  if mode_at is None:
2205
2225
  return None
2206
2226
  for ln in reversed(lines[:mode_at]):
2207
- s = ln.strip()
2208
- if s.startswith("▣"):
2227
+ if not ln.strip().startswith("┃"):
2209
2228
  return ""
2210
- if not s.startswith("┃"):
2211
- continue
2212
- body = s[1:].strip()
2213
- if body:
2214
- return body
2229
+ text = _opencode_row_text(ln)
2230
+ if text:
2231
+ return text
2215
2232
  return ""
2216
2233
 
2217
2234
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: swarph-cli
3
- Version: 0.69.1
3
+ Version: 0.69.3
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
@@ -26,6 +26,7 @@ License-File: LICENSE
26
26
  Requires-Dist: swarph-mesh<0.10,>=0.5.0
27
27
  Requires-Dist: swarph-shared<0.9,>=0.7.0
28
28
  Requires-Dist: PyYAML>=6.0
29
+ Requires-Dist: tomli>=1.1; python_version < "3.11"
29
30
  Provides-Extra: dev
30
31
  Requires-Dist: pytest>=7.0; extra == "dev"
31
32
  Provides-Extra: mcp
@@ -2,6 +2,9 @@ swarph-mesh<0.10,>=0.5.0
2
2
  swarph-shared<0.9,>=0.7.0
3
3
  PyYAML>=6.0
4
4
 
5
+ [:python_version < "3.11"]
6
+ tomli>=1.1
7
+
5
8
  [bench]
6
9
  google-genai>=0.3
7
10
 
@@ -32,7 +32,10 @@ def test_version_matches_the_packaged_version():
32
32
  agree, which is what its name promised all along.
33
33
  """
34
34
  import pathlib
35
- import tomllib
35
+ try:
36
+ import tomllib
37
+ except ModuleNotFoundError: # py3.10
38
+ import tomli as tomllib
36
39
 
37
40
  import swarph_cli
38
41
 
@@ -45,7 +45,10 @@ def test_file_exists_in_the_package_tree(rel, why):
45
45
  @pytest.mark.parametrize("rel,why", REQUIRED, ids=[r for r, _ in REQUIRED])
46
46
  def test_file_is_declared_as_package_data(rel, why):
47
47
  """Existing in src/ is NOT enough — it must be declared or the wheel omits it."""
48
- import tomllib
48
+ try:
49
+ import tomllib
50
+ except ModuleNotFoundError: # py3.10
51
+ import tomli as tomllib
49
52
  cfg = tomllib.loads((PKG.parent.parent / "pyproject.toml").read_text())
50
53
  patterns = cfg["tool"]["setuptools"]["package-data"]["swarph_cli"]
51
54
  suffix = pathlib.Path(rel).suffix
@@ -602,6 +602,86 @@ _OPENCODE_FINISHED = """\
602
602
  """
603
603
 
604
604
 
605
+ def test_live_idle_footer_is_clear_and_not_running(tmux):
606
+ """The 07:10Z pane: composer empty, transcript full of ┃ rows, footer
607
+ cwd on the ┃ row above the mode row, finished header `· 3m 4s`.
608
+ 0.69.1 returns that path as composer text and treats the header as
609
+ still running."""
610
+ from pathlib import Path
611
+ fixture = (Path(__file__).resolve().parent / "fixtures"
612
+ / "opencode-pane-idle-footer-0710.txt")
613
+ text = fixture.read_text(encoding="utf-8")
614
+ lines = text.splitlines()
615
+ assert any("Found the real blocker" in ln and ln.strip().startswith("┃")
616
+ for ln in lines)
617
+ _calls, state = tmux
618
+ state["captures"] = [text]
619
+ assert mesh._opencode_input(lines) == ""
620
+ assert mesh._composer_state("sac") == "clear"
621
+ assert mesh._agent_running("sac") is False
622
+
623
+
624
+ def test_drop_six_captures_split_the_footer():
625
+ """A wrapped cwd is a run of spaces, not a fixed number of rows.
626
+ Measured by drop-on-meta-edge on sacW 220x55 (card #961, #612)."""
627
+ from pathlib import Path
628
+ fix = Path(__file__).resolve().parent / "fixtures"
629
+ wide = (fix / "opencode-961" / "W2_turn2.txt").read_text(encoding="utf-8")
630
+ narrow = (fix / "opencode-961" / "G3_turn2.txt").read_text(encoding="utf-8")
631
+ live = (fix / "opencode-pane-idle-footer-0710.txt").read_text(encoding="utf-8")
632
+ assert mesh._opencode_input(wide.splitlines()) == ""
633
+ assert mesh._opencode_input(live.splitlines()) == ""
634
+ assert mesh._opencode_input(narrow.splitlines()) == ""
635
+ typed_narrow = "\n".join([
636
+ " ┃",
637
+ " ┃ hello from a human",
638
+ " ┃",
639
+ " ┃ Build · DeepSeek V4 Pro (New) OpenCode Go",
640
+ ])
641
+ assert mesh._opencode_input(typed_narrow.splitlines()) == "hello from a human"
642
+ overlay = (
643
+ " ┃ hello from a human" + (" " * 150)
644
+ + "meta-edge/d7cba227-9da7-4d92-92da-"
645
+ )
646
+ typed_wide = "\n".join([
647
+ " ┃",
648
+ overlay,
649
+ " ┃ Build · DeepSeek V4 Pro (New) OpenCode Go" + (" " * 40)
650
+ + "feat/sacrificial-612",
651
+ ])
652
+ assert mesh._opencode_input(typed_wide.splitlines()) == "hello from a human"
653
+ holding = "\n".join([
654
+ "┃",
655
+ "┃ check mesh: swarph_dm_unread",
656
+ "┃",
657
+ "┃ Build · DeepSeek V4 Pro (New) OpenCode Go",
658
+ ])
659
+ assert mesh._opencode_input(holding.splitlines()) == "check mesh: swarph_dm_unread"
660
+ # A wide pane keeps the sidebar on the ▣ row, past the duration.
661
+ sidebar = "▣ Build · DeepSeek V4.1 Flash · 5.1s" + (" " * 40) + "LSPs are disabled"
662
+ assert mesh._OPENCODE_DONE.search(sidebar)
663
+ assert mesh._opencode_running([sidebar]) is False
664
+ assert mesh._opencode_running(["▣ Build · DeepSeek V4 Pro (New)"]) is True
665
+
666
+
667
+ def test_wide_empty_box_records_the_wake_outstanding(tmux):
668
+ """W-D1: the footer showed up after Enter and the old read called the
669
+ box busy, so the injected wake was reported as a human's line and
670
+ wake_outstanding stayed unset."""
671
+ from pathlib import Path
672
+ wide = (Path(__file__).resolve().parent / "fixtures" / "opencode-961"
673
+ / "W2_turn2.txt").read_text(encoding="utf-8")
674
+ calls, state = tmux
675
+ state["captures"] = [wide]
676
+ st = _State()
677
+ assert mesh.TmuxSink("sacW").deliver(st, [], 1) is True
678
+ assert st.ledger("x")["wake_outstanding"] is True
679
+ literals = [c for c in calls if "-l" in c]
680
+ assert literals == [[
681
+ "tmux", "send-keys", "-t", "sacW", "-l", mesh._OPENCODE_WAKE_PROMPT]]
682
+ assert enters(calls) == 1
683
+
684
+
605
685
  def test_opencode_idle_box_is_a_clear_composer(tmux):
606
686
  calls, state = tmux
607
687
  state["captures"] = [_OPENCODE_IDLE]
@@ -1183,7 +1183,10 @@ def test_version_matches_the_packaged_version():
1183
1183
  agree, which is what its name promised all along.
1184
1184
  """
1185
1185
  import pathlib
1186
- import tomllib
1186
+ try:
1187
+ import tomllib
1188
+ except ModuleNotFoundError: # py3.10
1189
+ import tomli as tomllib
1187
1190
 
1188
1191
  import swarph_cli
1189
1192
 
File without changes
File without changes
File without changes