swarph-cli 0.72.26__tar.gz → 0.72.28__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.26/src/swarph_cli.egg-info → swarph_cli-0.72.28}/PKG-INFO +1 -1
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/pyproject.toml +1 -1
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/__init__.py +1 -1
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scripts/wake_watchdog.py +49 -5
- {swarph_cli-0.72.26 → swarph_cli-0.72.28/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_729_wake_watchdog.py +95 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/LICENSE +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/README.md +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/setup.cfg +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/__main__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/claude_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/codex_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/providers.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/rules.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/signal_score.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/channel.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/_content.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/board.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/board_merge_check.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/cell_probe.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/codex_hook_output.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/codex_waker.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/dreaming.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/gh_route.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/guide.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/hook_interpreter.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_wake_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/mesh.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/monitor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/roster.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/rowclear_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/sweep.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/triage.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/version.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/wake_hook_output.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dm_frame.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/candidates.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/clone.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/enrich.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/index_check.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/notify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/organize.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/probes.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/report.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/run.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/slm.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/transcripts.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/dreaming/verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gateway_default.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/gh_identity.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/guide/GUIDE.md +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/identity.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-codex-outbox.plist +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-monitor.plist +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-watchdog.plist +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-watchdog.timer.plist +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd_render.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/main.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/operator/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/operator/__main__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/operator/api.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/operator/cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/operator/config.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/operator/fmt.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/orphan_daemons.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/pane_probe.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_executor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_executor_windows.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_reconciliation.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_service_host.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_service_payload.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_service_reply.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/peer_staging.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/query_filters.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/quota_sync.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/rowclear.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scripts/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/scrub.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/source_text.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/codex-waker.default +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-stuck-sweep.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-stuck-sweep.timer +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-triage.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-triage.timer +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/timeline_paths.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/tokens.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/__init__.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/backend.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/job.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/owners.json +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/router.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/rows.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/triage/sensor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli.egg-info/SOURCES.txt +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1006_board_publisher.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1006_session_board.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1010_strand_only.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1013_spawn_channel.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1017_muse_tui.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1050_surrogate_wake.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1052_opencode_deaf.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1059_watchdog_unread_env.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1061_roster_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1064_stuck_sweep.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1065_release.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1066_quiet_wakes.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1068_structured_accept_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1071_quota_sync.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1073_triage.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1073_triage_board.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1073_wheel_install.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1075_task_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1083_openai_decisions.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1144_cell_yaml_github.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1197_commander_taps.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1203_swarph_me_refusal.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1206_offer_question.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1214_egress.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1219_egress_probe.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_1221_quota_windows.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_124_register_merge.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_126_pending_from_complete.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_132_ensure_monitor_state_dir.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_138_memory_navigate.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_139_tool_probe.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_183_card_anchor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_184_notify_honesty.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_201_win32_bash_refusal.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_243_onboard_per_peer_token.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_307_task4_ask_reply.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_319_refusal_exit_codes.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_323_mistral_backend.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_332_report_organize_findings.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_356_query_filters.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_397_gh_identity_router.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_397_router_preflight.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_402_one_identity_resolver.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_432_rowclear.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_467b_onboard_operator_credential.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_472_register_caller_binding.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_484_codex_queue_sink.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_523_guide.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_524_conftest_hermeticity.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_532_accept_flag.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_535_version_capability.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_538_signal_bench.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_546_default_gateway.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_547_verbs_from_registry.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_548_gateway_remainder.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_552_codegraph_gateway.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_555_relay_row_shape.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_556_relay_freshness.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_559_edges_truncated.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_564_bootstrap_first_peer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_579_register_bootstrap_message.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_591_cli_step_graph.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_644_monitor_supervision.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_648_install_unit.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_654_reexec.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_656_owned_slm.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_684_dreaming_verb.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_689_pkg_version_order.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_715_grok_wake.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_716_timeline_one_path.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_723_grok_0251.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_724_ps1_ascii_or_bom.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_725_stdio_reconfigure.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_726_grok_limit_screen.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_729_arm_check_delivery_gap.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_729_dm_once.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_734_dreaming_enrich_degrade.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_735_dm_mcp_tools.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_739_wake_writer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_740_edit_project.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_762_cards_edit_priority.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_764_enrich_collapse.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_801_confirm_flow_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_802_stage_history.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_825_codegraph_hook_noise.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_825_install_posttooluse_only.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_825_remaining_cap_shred_bind.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_829_counterfactual_column.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_830_hook_binding_version.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_84_cli_labels.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_866_doctrine_guide.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_872_identity_refuses_not_warns.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_874_source_text.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_937_dreaming_notify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_938_organize_line_limit.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_941_bench_backends.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_941_harness_342.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_945_same_line_pairing.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_955_prompt_audit.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_957_auth_http.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_959_venv_interpreter.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_960_channel.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_960_ensure_monitor_heartbeat.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_961_cursor_grok_footer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_961_loud_stop.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_963_plugin_manifest.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_964_channel_cell.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_965_mesh_wait.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_975_channel_hop.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_claude_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_codex_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_board_card_thread.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_board_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_board_merge_check.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_board_obligation_close.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_brain_ask_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_brain_ask_identity_explicitness.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_channel_poll_never_breaks_dms.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_channel_wake_policy_filter.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_codex_waker.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_content_composition.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_copilot_membrane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_copilot_pane_reader.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_cursor_membrane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_ensure_monitor_no_peer_default.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_gateway_message_idempotency.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_gh_route_doctor_mesh_name.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_group_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_guide_commands_parse.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_guide_selfcheck.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_heartbeat_check.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_legacy_generation_removal.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_win32_bash_wrapper.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_hooks_win32_command_path.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_import_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_inbox_identity_provenance.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_init_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_init_provider_menu.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_install_codex_hooks.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_install_wake_hook.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_launchd_units.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_main.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mcp_missing_hint.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_memory_emit_snippet.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_originate_thread_623.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_send_unknown_peer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_sidecar_muse_sink.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_monitor_channel_poll.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_muse_membrane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_muse_own_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_obligation_close_is_surfaced.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_opencode_membrane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_opencode_plugin.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_operator_me.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_orphan_daemons.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_packaged_artifacts_exist.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_packaged_skills.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_executor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_executor_windows.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_reply_drain_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_reply_drain_supervisor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_reply_transport.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_service_e2e.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_service_host.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_service_payload.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_peer_service_reply.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_postcompact_recall.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_readme_claims_no_gateway_default.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_scrub.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_security.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_service_app.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_service_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_identity_stamp.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_subprocess_decode_encoding.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_tmux_wake_runstate_defer.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_tmux_wake_session_reanchor.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_tmux_wake_stale.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_tmux_wake_submit_verify.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_token_precedence_explicit_first.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_unified_token_resolver.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_version_command.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_vibe_membrane.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/tests/test_watchdog_stale_peers.py +0 -0
- {swarph_cli-0.72.26 → swarph_cli-0.72.28}/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.28
|
|
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.28"
|
|
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" }
|
|
@@ -148,8 +148,9 @@ def _waiter_just_delivered(inbox: str, now: float | None = None) -> bool:
|
|
|
148
148
|
|
|
149
149
|
def _watching(inbox: str, cmdlines: Iterable[str]) -> bool:
|
|
150
150
|
"""A reader is tail or dm_notify_filter with the inbox path as its own argument,
|
|
151
|
-
a channel server whose heartbeat is fresh,
|
|
152
|
-
|
|
151
|
+
a channel server whose heartbeat is fresh, a one-shot `swarph mesh wait` for
|
|
152
|
+
this cell (running, or delivered within WAIT_REARM_GRACE), or the cell's own
|
|
153
|
+
monitor running with a tmux sink.
|
|
153
154
|
|
|
154
155
|
A process that merely mentions the path (a prompt, a log line) is not a reader.
|
|
155
156
|
"""
|
|
@@ -160,6 +161,8 @@ def _watching(inbox: str, cmdlines: Iterable[str]) -> bool:
|
|
|
160
161
|
parts = cmd.split()
|
|
161
162
|
if _waits_on(parts, cell):
|
|
162
163
|
return True
|
|
164
|
+
if _monitor_sink_pushes(parts, cell):
|
|
165
|
+
return True
|
|
163
166
|
if inbox not in parts:
|
|
164
167
|
continue
|
|
165
168
|
if any(os.path.basename(p) == "tail" for p in parts):
|
|
@@ -169,6 +172,38 @@ def _watching(inbox: str, cmdlines: Iterable[str]) -> bool:
|
|
|
169
172
|
return False
|
|
170
173
|
|
|
171
174
|
|
|
175
|
+
def _monitor_sink_pushes(parts: list[str], cell: str) -> bool:
|
|
176
|
+
"""A running `swarph monitor`, started with `--as <cell>` and a tmux sink,
|
|
177
|
+
is a wake path.
|
|
178
|
+
|
|
179
|
+
The monitor's tmux sink injects the wake into the cell's pane; card #961
|
|
180
|
+
measured that a cell cannot wake its own session, so this sink is the only
|
|
181
|
+
path that actually STARTS a turn. It names the cell, not the inbox path, so
|
|
182
|
+
it is checked before the inbox-path gate. Observation only: the watchdog
|
|
183
|
+
never starts a monitor. A process that merely quotes the command (a prompt,
|
|
184
|
+
a log line) is not the monitor -- it must BE swarph running the monitor for
|
|
185
|
+
this cell with a tmux deliver sink.
|
|
186
|
+
"""
|
|
187
|
+
for i in (0, 1):
|
|
188
|
+
if len(parts) < i + 4 or os.path.basename(parts[i]) != "swarph":
|
|
189
|
+
continue
|
|
190
|
+
if i == 1 and not os.path.basename(parts[0]).startswith("python"):
|
|
191
|
+
continue
|
|
192
|
+
if parts[i + 1:i + 3] != ["monitor", "start"]:
|
|
193
|
+
continue
|
|
194
|
+
rest = parts[i + 3:]
|
|
195
|
+
named = f"--as={cell}" in rest or any(
|
|
196
|
+
a == "--as" and b == cell for a, b in zip(rest, rest[1:]))
|
|
197
|
+
# Any tmux: pane counts, in either form (`--deliver tmux:<pane>` or
|
|
198
|
+
# `--deliver=tmux:<pane>`) -- the sink is the cell's wake, whatever pane
|
|
199
|
+
# it names, so the two spellings must agree.
|
|
200
|
+
has_tmux = any(p.startswith("--deliver=tmux:") for p in rest) or any(
|
|
201
|
+
a == "--deliver" and b.startswith("tmux:")
|
|
202
|
+
for a, b in zip(rest, rest[1:]))
|
|
203
|
+
return named and has_tmux
|
|
204
|
+
return False
|
|
205
|
+
|
|
206
|
+
|
|
172
207
|
def _waits_on(parts: list[str], cell: str) -> bool:
|
|
173
208
|
"""`swarph mesh wait --once --as <cell>` names the cell, not the inbox path.
|
|
174
209
|
|
|
@@ -398,9 +433,18 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
398
433
|
rc = 0
|
|
399
434
|
for name in alert:
|
|
400
435
|
print(f"outage {name}", flush=True)
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
436
|
+
# Card #1237: the outage cell can be the --as sender itself (the unit
|
|
437
|
+
# runs --as lab-ovh while watching lab-ovh). mesh_send refuses a
|
|
438
|
+
# self-send (rc 2), so the outage was never marked and every tick
|
|
439
|
+
# re-alerted (112 card posts + 112 escalate DMs for one outage).
|
|
440
|
+
# Skip the self DM and count it as sent, the same shape as the
|
|
441
|
+
# escalate != name guard below: the card post and the escalate DM
|
|
442
|
+
# still carry the alert, so the outage is marked once.
|
|
443
|
+
if name == sender:
|
|
444
|
+
dm_ok = True
|
|
445
|
+
else:
|
|
446
|
+
dm_ok = mesh_send(
|
|
447
|
+
swarph, name, sender, "IMMUNE (cell watchdog): your DM wake is dead, re-arm", token_file) == 0
|
|
404
448
|
card_argv = [swarph, "board", "cards", "say", "729", "--as", sender,
|
|
405
449
|
"--to", name, "--content", f"IMMUNE (cell watchdog) — {name}: DM wake is dead, re-arm"]
|
|
406
450
|
if token_file:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.72.
|
|
3
|
+
Version: 0.72.28
|
|
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
|
|
@@ -153,6 +153,48 @@ def test_escalation_is_one_dm_to_the_peer_and_not_to_itself(tmp_path):
|
|
|
153
153
|
assert own.count("mesh send watcher-peer") == 1
|
|
154
154
|
|
|
155
155
|
|
|
156
|
+
@pytest.mark.skipif(
|
|
157
|
+
sys.platform == "win32",
|
|
158
|
+
reason="Windows cannot execute the POSIX swarph stub as argv0; the self-outage assertions run on Linux",
|
|
159
|
+
)
|
|
160
|
+
def test_outage_of_the_sender_itself_marks_once_and_does_not_realert(tmp_path):
|
|
161
|
+
"""Card #1237: the dead cell IS the --as sender. mesh_send refuses the
|
|
162
|
+
self-send, which used to leave the outage unmarked, so every tick posted
|
|
163
|
+
the card and DM'd the escalation peer again (112 of each for one outage).
|
|
164
|
+
The self DM is skipped and counted as sent: the card post and the
|
|
165
|
+
escalate DM carry the alert, the outage is marked once, and a second
|
|
166
|
+
pass sends nothing."""
|
|
167
|
+
root = tmp_path / "state"
|
|
168
|
+
_cell(root, "lab-ovh")
|
|
169
|
+
state_path = tmp_path / "wake.json"
|
|
170
|
+
log = tmp_path / "stub.log"
|
|
171
|
+
env = {
|
|
172
|
+
**os.environ,
|
|
173
|
+
"PYTHONPATH": os.path.abspath("src"),
|
|
174
|
+
"SWARPH_STATE_ROOT": str(root),
|
|
175
|
+
"WAKE_WATCHDOG_STATE": str(state_path),
|
|
176
|
+
"SWARPH_BIN": str(_stub(tmp_path)),
|
|
177
|
+
"STUB_LOG": str(log),
|
|
178
|
+
"STUB_RC": "0",
|
|
179
|
+
}
|
|
180
|
+
env.pop("SWARPH_SELF", None)
|
|
181
|
+
run = [sys.executable, "-m", "swarph_cli.scripts.wake_watchdog",
|
|
182
|
+
"--as", "lab-ovh", "--escalate", "drop-on-meta-edge"]
|
|
183
|
+
subprocess.run(run, env=env, check=True)
|
|
184
|
+
saved = json.loads(state_path.read_text())
|
|
185
|
+
saved["lab-ovh"]["missing_since"] = 0
|
|
186
|
+
state_path.write_text(json.dumps(saved))
|
|
187
|
+
subprocess.run(run, env=env, check=True)
|
|
188
|
+
text = log.read_text()
|
|
189
|
+
assert "mesh send lab-ovh" not in text, "no self DM was attempted"
|
|
190
|
+
assert "cards say 729" in text, "the card post still carries the alert"
|
|
191
|
+
assert text.count("mesh send drop-on-meta-edge") == 1
|
|
192
|
+
assert json.loads(state_path.read_text())["lab-ovh"]["outage"] is True
|
|
193
|
+
log.write_text("")
|
|
194
|
+
subprocess.run(run, env=env, check=True)
|
|
195
|
+
assert log.read_text().strip() == "", "a marked outage does not re-alert"
|
|
196
|
+
|
|
197
|
+
|
|
156
198
|
def test_sender_equal_to_escalation_peer_saves_nothing(tmp_path):
|
|
157
199
|
root = tmp_path / "state"
|
|
158
200
|
_cell(root, "nobody")
|
|
@@ -291,3 +333,56 @@ def test_the_re_arm_gap_after_a_one_shot_delivery_is_not_an_outage(tmp_path):
|
|
|
291
333
|
st = {}
|
|
292
334
|
assert scan(cells, [], st, now=0) == []
|
|
293
335
|
assert scan(cells, [], st, now=120) == ["copilot"]
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def test_a_monitor_with_a_tmux_sink_is_a_watcher():
|
|
339
|
+
"""Card #961: the tmux sink is the only path that starts a turn, so a cell
|
|
340
|
+
whose own monitor runs with `--deliver tmux:<pane>` is watched even with no
|
|
341
|
+
tail -- the commander's one-wake-source rule (drop the tail, keep the sink)."""
|
|
342
|
+
cells = {"opencode": "/tmp/opencode/mesh-sidecar/inbox.log"}
|
|
343
|
+
state = {}
|
|
344
|
+
monitor = ["/usr/bin/python3 /home/ubuntu/.local/bin/swarph monitor start "
|
|
345
|
+
"--as opencode --deliver tmux:opencode --deliver pull --foreground"]
|
|
346
|
+
assert scan(cells, monitor, state, now=0) == []
|
|
347
|
+
assert scan(cells, monitor, state, now=120) == []
|
|
348
|
+
assert state["opencode"].get("outage") is not True
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def test_a_prompt_quoting_the_monitor_command_is_not_a_watcher():
|
|
352
|
+
cells = {"opencode": "/tmp/opencode/mesh-sidecar/inbox.log"}
|
|
353
|
+
state = {}
|
|
354
|
+
noise = ['claude --append-system-prompt "run swarph monitor start --as opencode '
|
|
355
|
+
'--deliver tmux:opencode"']
|
|
356
|
+
assert scan(cells, noise, state, now=0) == []
|
|
357
|
+
assert scan(cells, noise, state, now=120) == ["opencode"]
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def test_a_monitor_for_another_cell_is_not_this_cells_watcher():
|
|
361
|
+
cells = {"opencode": "/tmp/opencode/mesh-sidecar/inbox.log"}
|
|
362
|
+
state = {}
|
|
363
|
+
other = ["/usr/bin/python3 /home/ubuntu/.local/bin/swarph monitor start "
|
|
364
|
+
"--as cursor-lin --deliver tmux:cursor-lin --foreground"]
|
|
365
|
+
assert scan(cells, other, state, now=0) == []
|
|
366
|
+
assert scan(cells, other, state, now=120) == ["opencode"]
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def test_a_pull_only_monitor_is_not_a_watcher():
|
|
370
|
+
"""A pull-only monitor writes inbox.log but starts no turn, so the cell is
|
|
371
|
+
still unwatched (card #1234)."""
|
|
372
|
+
cells = {"opencode": "/tmp/opencode/mesh-sidecar/inbox.log"}
|
|
373
|
+
state = {}
|
|
374
|
+
pull_only = ["/usr/bin/python3 /home/ubuntu/.local/bin/swarph monitor start "
|
|
375
|
+
"--as opencode --deliver pull --foreground"]
|
|
376
|
+
assert scan(cells, pull_only, state, now=0) == []
|
|
377
|
+
assert scan(cells, pull_only, state, now=120) == ["opencode"]
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def test_the_equals_form_of_the_tmux_sink_counts():
|
|
381
|
+
"""Both spellings agree: any tmux:<pane> counts, not only the cell's own name."""
|
|
382
|
+
cells = {"opencode": "/tmp/opencode/mesh-sidecar/inbox.log"}
|
|
383
|
+
state = {}
|
|
384
|
+
monitor = ["/usr/bin/python3 /home/ubuntu/.local/bin/swarph monitor start "
|
|
385
|
+
"--as opencode --deliver=tmux:some-other-pane --foreground"]
|
|
386
|
+
assert scan(cells, monitor, state, now=0) == []
|
|
387
|
+
assert scan(cells, monitor, state, now=120) == []
|
|
388
|
+
assert state["opencode"].get("outage") is not True
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_opencode_plugin.py
RENAMED
|
File without changes
|
{swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/install_postcompact_hook.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/commands/postcompact_hook_output.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/launchd/swarph-watchdog.timer.plist
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{swarph_cli-0.72.26 → swarph_cli-0.72.28}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|