swarph-cli 0.72.30__tar.gz → 0.72.31__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {swarph_cli-0.72.30/src/swarph_cli.egg-info → swarph_cli-0.72.31}/PKG-INFO +1 -1
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/pyproject.toml +1 -1
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/__init__.py +1 -1
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scripts/wake_watchdog.py +167 -6
- {swarph_cli-0.72.30 → swarph_cli-0.72.31/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli.egg-info/SOURCES.txt +1 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1256_commander_wake.py +1 -0
- swarph_cli-0.72.31/tests/test_1262_wake_followups.py +448 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_729_wake_watchdog.py +4 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_739_wake_writer.py +5 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/LICENSE +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/README.md +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/setup.cfg +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/__main__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/claude_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/codex_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/providers.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/rules.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/signal_score.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/channel.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/_content.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/board.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/board_merge_check.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/cell_probe.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/codex_hook_output.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/codex_waker.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/dreaming.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/gh_route.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/guide.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/hook_interpreter.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/install_wake_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/mesh.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/monitor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/roster.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/rowclear_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/sweep.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/triage.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/version.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/wake_hook_output.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dm_frame.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/candidates.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/clone.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/enrich.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/index_check.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/notify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/organize.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/probes.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/report.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/run.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/slm.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/transcripts.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/dreaming/verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/duplicate_session.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gateway_default.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/gh_identity.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/guide/GUIDE.md +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/identity.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/launchd/swarph-codex-outbox.plist +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/launchd/swarph-monitor.plist +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/launchd/swarph-watchdog.plist +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/launchd/swarph-watchdog.timer.plist +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/launchd_render.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/main.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/operator/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/operator/__main__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/operator/api.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/operator/cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/operator/config.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/operator/fmt.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/orphan_daemons.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/pane_probe.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_executor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_executor_windows.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_reconciliation.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_service_host.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_service_payload.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_service_reply.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/peer_staging.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/query_filters.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/quota_sync.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/rowclear.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scripts/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/scrub.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/source_text.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/codex-waker.default +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-stuck-sweep.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-stuck-sweep.timer +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-triage.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-triage.timer +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/the_ten.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/timeline_paths.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/tokens.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/__init__.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/backend.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/job.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/owners.json +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/router.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/rows.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli/triage/sensor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1006_board_publisher.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1006_session_board.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1010_strand_only.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1013_spawn_channel.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1017_muse_tui.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1034_copy_mode.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1050_surrogate_wake.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1052_opencode_deaf.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1059_watchdog_unread_env.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1061_roster_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1064_stuck_sweep.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1065_release.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1066_quiet_wakes.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1068_structured_accept_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1071_quota_sync.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1073_triage.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1073_triage_board.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1073_wheel_install.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1075_task_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1083_openai_decisions.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1144_cell_yaml_github.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1197_commander_taps.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1203_swarph_me_refusal.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1206_offer_question.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1214_egress.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1219_egress_probe.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1221_quota_windows.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1222_maybe_start_cap.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1228_quota_reach.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1243_the_ten.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1248_ship_price_table.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_124_register_merge.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_1250_price_cache.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_126_pending_from_complete.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_132_ensure_monitor_state_dir.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_138_memory_navigate.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_139_tool_probe.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_183_card_anchor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_184_notify_honesty.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_201_win32_bash_refusal.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_243_onboard_per_peer_token.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_307_task4_ask_reply.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_319_refusal_exit_codes.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_323_mistral_backend.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_332_report_organize_findings.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_356_query_filters.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_397_gh_identity_router.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_397_router_preflight.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_402_one_identity_resolver.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_432_rowclear.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_467b_onboard_operator_credential.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_472_register_caller_binding.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_484_codex_queue_sink.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_513_duplicate_session.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_523_guide.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_524_conftest_hermeticity.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_532_accept_flag.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_535_version_capability.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_538_signal_bench.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_546_default_gateway.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_547_verbs_from_registry.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_548_gateway_remainder.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_552_codegraph_gateway.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_555_relay_row_shape.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_556_relay_freshness.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_559_edges_truncated.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_564_bootstrap_first_peer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_579_register_bootstrap_message.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_591_cli_step_graph.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_644_monitor_supervision.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_648_install_unit.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_654_reexec.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_656_owned_slm.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_684_dreaming_verb.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_689_pkg_version_order.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_715_grok_wake.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_716_timeline_one_path.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_723_grok_0251.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_724_ps1_ascii_or_bom.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_725_stdio_reconfigure.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_726_grok_limit_screen.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_729_arm_check_delivery_gap.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_729_dm_once.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_734_dreaming_enrich_degrade.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_735_dm_mcp_tools.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_740_edit_project.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_762_cards_edit_priority.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_764_enrich_collapse.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_801_confirm_flow_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_802_stage_history.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_825_codegraph_hook_noise.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_825_install_posttooluse_only.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_825_remaining_cap_shred_bind.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_829_counterfactual_column.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_830_hook_binding_version.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_84_cli_labels.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_866_doctrine_guide.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_872_identity_refuses_not_warns.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_874_source_text.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_931_board_search.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_935_deadline_clock.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_937_dreaming_notify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_938_organize_line_limit.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_941_bench_backends.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_941_harness_342.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_945_same_line_pairing.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_955_prompt_audit.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_957_auth_http.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_959_venv_interpreter.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_960_channel.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_960_ensure_monitor_heartbeat.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_961_cursor_grok_footer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_961_loud_stop.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_963_plugin_manifest.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_964_channel_cell.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_965_mesh_wait.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_975_channel_hop.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_claude_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_codex_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_board_card_thread.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_board_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_board_merge_check.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_board_obligation_close.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_brain_ask_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_brain_ask_identity_explicitness.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_channel_poll_never_breaks_dms.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_channel_wake_policy_filter.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_codex_waker.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_content_composition.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_copilot_membrane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_copilot_pane_reader.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_cursor_membrane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_ensure_monitor_no_peer_default.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_gateway_message_idempotency.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_gh_route_doctor_mesh_name.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_group_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_guide_commands_parse.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_guide_selfcheck.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_heartbeat_check.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_legacy_generation_removal.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_win32_bash_wrapper.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_hooks_win32_command_path.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_import_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_inbox_identity_provenance.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_init_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_init_provider_menu.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_install_codex_hooks.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_install_wake_hook.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_launchd_units.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_main.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mcp_missing_hint.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_memory_emit_snippet.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_originate_thread_623.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_send_unknown_peer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_sidecar_muse_sink.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_monitor_channel_poll.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_muse_membrane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_muse_own_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_obligation_close_is_surfaced.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_opencode_membrane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_opencode_plugin.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_operator_me.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_orphan_daemons.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_packaged_artifacts_exist.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_packaged_skills.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_executor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_executor_windows.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_reply_drain_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_reply_drain_supervisor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_reply_transport.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_service_e2e.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_service_host.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_service_payload.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_peer_service_reply.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_postcompact_recall.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_readme_claims_no_gateway_default.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_scrub.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_security.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_service_app.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_service_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_identity_stamp.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_subprocess_decode_encoding.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_tmux_wake_runstate_defer.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_tmux_wake_session_reanchor.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_tmux_wake_stale.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_tmux_wake_submit_verify.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_token_precedence_explicit_first.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_unified_token_resolver.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_version_command.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_vibe_membrane.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/tests/test_watchdog_stale_peers.py +0 -0
- {swarph_cli-0.72.30 → swarph_cli-0.72.31}/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.
|
|
3
|
+
Version: 0.72.31
|
|
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.
|
|
7
|
+
version = "0.72.31"
|
|
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" }
|
|
@@ -14,6 +14,8 @@ import os
|
|
|
14
14
|
import subprocess
|
|
15
15
|
import sys
|
|
16
16
|
import time
|
|
17
|
+
import urllib.error
|
|
18
|
+
import urllib.request
|
|
17
19
|
from pathlib import Path
|
|
18
20
|
from typing import Iterable
|
|
19
21
|
|
|
@@ -260,8 +262,10 @@ def _parent_is_cell_session(pid: int, cell: str, proc_root: Path) -> bool:
|
|
|
260
262
|
"""True when pid's parent is claude for this cell's session.
|
|
261
263
|
|
|
262
264
|
A pinned session_id must be the parent's `--resume` or `--session-id`.
|
|
263
|
-
With no pin, `--name`
|
|
264
|
-
|
|
265
|
+
With no pin, `--name` may be the cell yaml's name or its role.
|
|
266
|
+
science-claude's pane is `--name science-claude` while its role is
|
|
267
|
+
`science` (card #1262). Any other parent, including a live pid reused
|
|
268
|
+
by an unrelated process, is not the session.
|
|
265
269
|
"""
|
|
266
270
|
ppid = _read_ppid(pid, proc_root)
|
|
267
271
|
if not ppid:
|
|
@@ -276,9 +280,10 @@ def _parent_is_cell_session(pid: int, cell: str, proc_root: Path) -> bool:
|
|
|
276
280
|
if session_id:
|
|
277
281
|
return (_flag(argv, "--resume") == session_id
|
|
278
282
|
or _flag(argv, "--session-id") == session_id)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
283
|
+
named = _flag(argv, "--name")
|
|
284
|
+
if not named:
|
|
285
|
+
return False
|
|
286
|
+
return named == cell or bool(role) and named == role
|
|
282
287
|
|
|
283
288
|
|
|
284
289
|
def _format_ts(ts: float) -> str:
|
|
@@ -478,6 +483,150 @@ def scan(cells: dict[str, str], cmdlines: Iterable[str], state: dict,
|
|
|
478
483
|
return alert
|
|
479
484
|
|
|
480
485
|
|
|
486
|
+
def _bearer(token_file: str, sender: str) -> str:
|
|
487
|
+
path = (token_file or "").strip()
|
|
488
|
+
if not path and sender:
|
|
489
|
+
path = os.path.expanduser(f"~/.config/swarph/{sender}.peer_token")
|
|
490
|
+
if not path:
|
|
491
|
+
return ""
|
|
492
|
+
try:
|
|
493
|
+
return Path(path).read_text(encoding="utf-8").strip()
|
|
494
|
+
except OSError:
|
|
495
|
+
return ""
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def enabled_peer_names(gateway: str, token: str) -> set[str] | None:
|
|
499
|
+
"""Registered, enabled peer names. None when the list cannot be read.
|
|
500
|
+
|
|
501
|
+
A failed read leaves the watched set alone. An empty successful list
|
|
502
|
+
is treated the same way: a gateway hiccup that returns [] must not
|
|
503
|
+
drop every cell. A non-empty list is a real answer, and peers absent
|
|
504
|
+
from it, or present and disabled, are not scanned.
|
|
505
|
+
"""
|
|
506
|
+
if not gateway:
|
|
507
|
+
return None
|
|
508
|
+
req = urllib.request.Request(gateway.rstrip("/") + "/peers")
|
|
509
|
+
if token:
|
|
510
|
+
req.add_header("Authorization", f"Bearer {token}")
|
|
511
|
+
try:
|
|
512
|
+
with urllib.request.urlopen(req, timeout=5) as resp:
|
|
513
|
+
data = json.loads(resp.read().decode("utf-8"))
|
|
514
|
+
except (urllib.error.URLError, urllib.error.HTTPError, OSError,
|
|
515
|
+
json.JSONDecodeError, TimeoutError):
|
|
516
|
+
return None
|
|
517
|
+
rows = data if isinstance(data, list) else (
|
|
518
|
+
data.get("peers") if isinstance(data, dict) else None)
|
|
519
|
+
if not isinstance(rows, list) or len(rows) == 0:
|
|
520
|
+
return None
|
|
521
|
+
names: set[str] = set()
|
|
522
|
+
for peer in rows:
|
|
523
|
+
if not isinstance(peer, dict):
|
|
524
|
+
continue
|
|
525
|
+
name = peer.get("name")
|
|
526
|
+
if not isinstance(name, str) or not name:
|
|
527
|
+
continue
|
|
528
|
+
if "enabled" in peer and peer.get("enabled") in (0, False, "0", "false", "False"):
|
|
529
|
+
continue
|
|
530
|
+
names.add(name)
|
|
531
|
+
return names
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def retain_registered(cells: dict[str, str], state: dict,
|
|
535
|
+
names: set[str] | None) -> dict[str, str]:
|
|
536
|
+
"""Drop peers the gateway does not list, and disabled peers.
|
|
537
|
+
|
|
538
|
+
State entries go too, so a defunct cell does not stay in the watchdog
|
|
539
|
+
file after the pass that noticed it. None means the list was unreadable
|
|
540
|
+
and the set is unchanged.
|
|
541
|
+
"""
|
|
542
|
+
if names is None:
|
|
543
|
+
return cells
|
|
544
|
+
for name in list(state):
|
|
545
|
+
if name not in names:
|
|
546
|
+
state.pop(name, None)
|
|
547
|
+
return {name: inbox for name, inbox in cells.items() if name in names}
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
def _board_line(proc: subprocess.CompletedProcess) -> str:
|
|
551
|
+
text = proc.stdout if (proc.stdout or "").strip() else proc.stderr
|
|
552
|
+
lines = (text or "").splitlines()
|
|
553
|
+
return lines[0] if lines else ""
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def _log_board(label: str, proc: subprocess.CompletedProcess) -> None:
|
|
557
|
+
print(
|
|
558
|
+
f"wake_watchdog: {label} rc={proc.returncode} {_board_line(proc)}",
|
|
559
|
+
file=sys.stderr, flush=True)
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
def _release_recovered_commander_rows(swarph: str, sender: str, token_file: str,
|
|
563
|
+
now: float, state: dict, state_path: Path) -> None:
|
|
564
|
+
"""Withdraw this sender's untaken dead-wake rows on card 729.
|
|
565
|
+
|
|
566
|
+
The running gateway refuses a close of a commander-held row from the
|
|
567
|
+
cell token. The creator may withdraw an untaken row. A row the
|
|
568
|
+
commander has already taken is left alone and logged once. Every
|
|
569
|
+
board call's return code and first output line are logged.
|
|
570
|
+
"""
|
|
571
|
+
argv = [swarph, "board", "obligations", "list", "--card", "729",
|
|
572
|
+
"--holder", "commander", "--status", "open", "--json",
|
|
573
|
+
"--as", sender]
|
|
574
|
+
if token_file:
|
|
575
|
+
argv.extend(["--token-file", token_file])
|
|
576
|
+
listed = subprocess.run(
|
|
577
|
+
argv, capture_output=True, text=True, encoding="utf-8",
|
|
578
|
+
errors="replace", check=False)
|
|
579
|
+
_log_board("obligations list", listed)
|
|
580
|
+
if listed.returncode != 0:
|
|
581
|
+
return
|
|
582
|
+
try:
|
|
583
|
+
data = json.loads(listed.stdout or "{}")
|
|
584
|
+
except json.JSONDecodeError:
|
|
585
|
+
return
|
|
586
|
+
rows = data.get("obligations") if isinstance(data, dict) else None
|
|
587
|
+
if not isinstance(rows, list):
|
|
588
|
+
return
|
|
589
|
+
when = _format_ts(now)
|
|
590
|
+
marker = f"WAKE-DEAD {sender}"
|
|
591
|
+
rec = state.setdefault(sender, {})
|
|
592
|
+
logged = rec.setdefault("logged_taken", [])
|
|
593
|
+
if not isinstance(logged, list):
|
|
594
|
+
logged = []
|
|
595
|
+
rec["logged_taken"] = logged
|
|
596
|
+
for row in rows:
|
|
597
|
+
if not isinstance(row, dict):
|
|
598
|
+
continue
|
|
599
|
+
if str(row.get("card_id")) != "729":
|
|
600
|
+
continue
|
|
601
|
+
if row.get("holder") != "commander":
|
|
602
|
+
continue
|
|
603
|
+
if row.get("status") not in (None, "open"):
|
|
604
|
+
continue
|
|
605
|
+
if row.get("created_by") != sender:
|
|
606
|
+
continue
|
|
607
|
+
if marker not in (row.get("accept") or ""):
|
|
608
|
+
continue
|
|
609
|
+
oid = row.get("id")
|
|
610
|
+
if not oid:
|
|
611
|
+
continue
|
|
612
|
+
if row.get("taken_at"):
|
|
613
|
+
if oid not in logged and str(oid) not in logged:
|
|
614
|
+
print(
|
|
615
|
+
f"wake_watchdog: taken {oid} left for the commander",
|
|
616
|
+
file=sys.stderr, flush=True)
|
|
617
|
+
logged.append(oid)
|
|
618
|
+
save_state(state_path, state)
|
|
619
|
+
continue
|
|
620
|
+
withdraw = [swarph, "board", "obligations", "withdraw", str(oid),
|
|
621
|
+
"--reason", f"recovered {when}", "--as", sender]
|
|
622
|
+
if token_file:
|
|
623
|
+
withdraw.extend(["--token-file", token_file])
|
|
624
|
+
done = subprocess.run(
|
|
625
|
+
withdraw, capture_output=True, text=True, encoding="utf-8",
|
|
626
|
+
errors="replace", check=False)
|
|
627
|
+
_log_board(f"obligations withdraw {oid}", done)
|
|
628
|
+
|
|
629
|
+
|
|
481
630
|
def cells_under(root: Path) -> dict[str, str]:
|
|
482
631
|
found = {}
|
|
483
632
|
if not root.is_dir():
|
|
@@ -604,6 +753,12 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
604
753
|
cells = cells_under(root)
|
|
605
754
|
state = load_state(state_path)
|
|
606
755
|
now = _clock()
|
|
756
|
+
token_file = (args.token_file or "").strip()
|
|
757
|
+
sender = args.sender.strip()
|
|
758
|
+
names = enabled_peer_names(
|
|
759
|
+
os.environ.get("MESH_GATEWAY_URL", "").strip(),
|
|
760
|
+
_bearer(token_file, sender))
|
|
761
|
+
cells = retain_registered(cells, state, names)
|
|
607
762
|
alert = scan(cells, cmdlines, state, now, timers=timers, crontab=crontab)
|
|
608
763
|
sender = args.sender.strip()
|
|
609
764
|
escalate = (args.escalate or "").strip()
|
|
@@ -647,6 +802,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
647
802
|
return 2
|
|
648
803
|
swarph = _swarph_bin()
|
|
649
804
|
rc = 0
|
|
805
|
+
if (sender in cells
|
|
806
|
+
and _watching(cells[sender], cmdlines, cell=sender)):
|
|
807
|
+
_release_recovered_commander_rows(
|
|
808
|
+
swarph, sender, token_file, now, state, state_path)
|
|
650
809
|
for name in alert:
|
|
651
810
|
print(f"outage {name}", flush=True)
|
|
652
811
|
# Card #1256: the dead cell is this unit's own --as identity. A DM
|
|
@@ -656,7 +815,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
656
815
|
if name == sender:
|
|
657
816
|
content = commander_alert(name, _dead_since(cells[name], state.get(name) or {}))
|
|
658
817
|
ask_argv = [swarph, "board", "cards", "ask", "729",
|
|
659
|
-
"--holder", "commander",
|
|
818
|
+
"--holder", "commander",
|
|
819
|
+
"--accept", f"WAKE-DEAD {sender}",
|
|
820
|
+
"--as", sender, content]
|
|
660
821
|
if token_file:
|
|
661
822
|
ask_argv.extend(["--token-file", token_file])
|
|
662
823
|
asked = subprocess.run(ask_argv, check=False)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.72.
|
|
3
|
+
Version: 0.72.31
|
|
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
|
|
@@ -246,6 +246,7 @@ tests/test_1248_ship_price_table.py
|
|
|
246
246
|
tests/test_124_register_merge.py
|
|
247
247
|
tests/test_1250_price_cache.py
|
|
248
248
|
tests/test_1256_commander_wake.py
|
|
249
|
+
tests/test_1262_wake_followups.py
|
|
249
250
|
tests/test_126_pending_from_complete.py
|
|
250
251
|
tests/test_132_ensure_monitor_state_dir.py
|
|
251
252
|
tests/test_138_memory_navigate.py
|