swarph-cli 0.72.38__tar.gz → 0.72.39__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {swarph_cli-0.72.38/src/swarph_cli.egg-info → swarph_cli-0.72.39}/PKG-INFO +1 -1
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/pyproject.toml +1 -1
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/__init__.py +1 -1
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/duplicate_session.py +71 -9
- {swarph_cli-0.72.38 → swarph_cli-0.72.39/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/SOURCES.txt +1 -0
- swarph_cli-0.72.39/tests/test_1385_duplicate_session_argv.py +188 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_513_duplicate_session.py +1 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/LICENSE +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/README.md +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/setup.cfg +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/__main__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/claude_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/codex_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/providers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/rules.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/signal_score.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/channel.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/_content.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/board.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/board_cost.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/board_merge_check.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/board_usage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/cell_probe.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/codex_hook_output.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/codex_waker.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/commander.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/committee.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/dreaming.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/gh_route.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/guide.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/hook_interpreter.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_codex_hooks.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_opencode_plugin.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_wake_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/memory_emit_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/mesh.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/monitor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/peer_reply_drain.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/postcompact_hook_output.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/roster.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/rowclear_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/sweep.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/triage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/version.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/wake_hook_output.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commit_trailers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dm_frame.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/candidates.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/clone.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/enrich.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/index_check.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/notify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/organize.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/probes.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/report.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/run.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/slm.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/transcripts.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/dreaming/verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gateway_default.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/gh_identity.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/guide/GUIDE.md +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/identity.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-codex-outbox.plist +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-codex-outbox.timer.plist +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-monitor.plist +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-watchdog.plist +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/launchd/swarph-watchdog.timer.plist +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/launchd_render.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/main.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/operator/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/operator/__main__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/operator/api.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/operator/cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/operator/config.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/operator/fmt.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/orphan_daemons.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/pane_probe.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/opencode/plugin.js +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/_shim.cmd +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/postcompact-recall-grok.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/postcompact-recall.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit-antigravity.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit-claude.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit-grok.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-emit.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/posttooluse-recall.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/precompact-flag.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/preinvocation-recall-antigravity.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/payloads/postcompact/sessionstart-recall.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_executor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_executor_windows.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_reconciliation.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_service_host.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_service_payload.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_service_reply.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/peer_staging.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/query_filters.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/quota_sync.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/redact.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/rowclear.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scripts/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scripts/dm_notify_filter.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scripts/install_codex_waker_windows.ps1 +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scripts/install_monitor_task_windows.ps1 +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scripts/wake_watchdog.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/scrub.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/skills/i-have-adhd/LICENSE +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/skills/i-have-adhd/SKILL.md +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/source_text.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/codex-waker.default +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/peer-reply-drain.default +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-outbox@.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-outbox@.timer +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-waker@.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-codex-waker@.timer +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-monitor-reexec.path +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-monitor-reexec.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-monitor@.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-peer-reply-drain@.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-peer-reply-drain@.timer +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-stuck-sweep.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-stuck-sweep.timer +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-triage.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-triage.timer +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/the_ten.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/timeline_paths.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/tokens.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/__init__.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/backend.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/job.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/owners.json +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/router.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/rows.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/triage/sensor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1006_board_publisher.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1006_session_board.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1010_strand_only.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1013_spawn_channel.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1017_muse_tui.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1034_copy_mode.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1050_surrogate_wake.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1052_opencode_deaf.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1059_watchdog_unread_env.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1061_roster_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1064_stuck_sweep.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1065_release.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1066_quiet_wakes.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1068_structured_accept_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1071_quota_sync.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1073_triage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1073_triage_board.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1073_wheel_install.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1075_task_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1083_openai_decisions.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1144_cell_yaml_github.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1197_commander_taps.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1203_swarph_me_refusal.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1206_offer_question.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1214_egress.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1219_egress_probe.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1221_quota_windows.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1222_maybe_start_cap.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1228_quota_reach.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1243_the_ten.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1248_ship_price_table.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_124_register_merge.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1250_price_cache.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1256_commander_wake.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1261_mcp_install.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1262_wake_followups.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1265_wake_note.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1269_triage_label.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_126_pending_from_complete.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1277_close_usage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1278_dreaming_reach.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1286_dm_unread_cursor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1297_commander.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1300_authorization_check.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1301_restart_skew.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1320_commit_trailers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1321_layered_redaction.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_132_ensure_monitor_state_dir.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1340_router_rollout.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1346_shell_string_gh.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1347_shell_depth_cap.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_1353_obligation_release_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_138_memory_navigate.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_139_tool_probe.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_183_card_anchor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_184_notify_honesty.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_201_win32_bash_refusal.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_243_onboard_per_peer_token.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_307_task4_ask_reply.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_312_codegraph_fuzzy_verb.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_3130_sender.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_3150_identity_router_install.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_319_refusal_exit_codes.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_323_mistral_backend.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_332_report_organize_findings.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_356_query_filters.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_397_gh_identity_router.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_397_router_preflight.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_402_one_identity_resolver.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_432_rowclear.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_467b_onboard_operator_credential.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_472_register_caller_binding.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_484_codex_queue_sink.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_523_guide.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_524_conftest_hermeticity.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_532_accept_flag.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_535_version_capability.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_538_signal_bench.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_546_default_gateway.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_547_verbs_from_registry.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_548_gateway_remainder.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_552_codegraph_gateway.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_555_relay_row_shape.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_556_relay_freshness.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_559_edges_truncated.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_564_bootstrap_first_peer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_578_no_machine_specific_host_defaults.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_579_register_bootstrap_message.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_591_cli_step_graph.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_644_monitor_supervision.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_648_install_unit.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_654_reexec.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_656_owned_slm.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_684_dreaming_verb.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_689_pkg_version_order.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_715_grok_wake.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_716_timeline_one_path.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_723_grok_0251.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_724_ps1_ascii_or_bom.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_725_stdio_reconfigure.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_726_grok_limit_screen.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_729_arm_check_delivery_gap.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_729_dm_once.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_729_wake_watchdog.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_734_dreaming_enrich_degrade.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_735_dm_mcp_tools.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_739_wake_writer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_740_edit_project.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_762_cards_edit_priority.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_764_enrich_collapse.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_801_confirm_flow_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_802_stage_history.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_825_codegraph_hook_noise.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_825_install_posttooluse_only.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_825_remaining_cap_shred_bind.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_829_counterfactual_column.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_830_hook_binding_version.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_84_cli_labels.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_866_doctrine_guide.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_872_identity_refuses_not_warns.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_874_source_text.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_888_opencode_data_dir_can_fail.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_931_board_search.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_935_deadline_clock.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_937_dreaming_notify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_938_organize_line_limit.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_941_bench_backends.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_941_harness_342.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_945_same_line_pairing.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_955_prompt_audit.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_957_auth_http.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_959_venv_interpreter.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_960_channel.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_960_ensure_monitor_heartbeat.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_961_cursor_grok_footer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_961_loud_stop.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_963_plugin_manifest.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_964_channel_cell.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_965_mesh_wait.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_975_channel_hop.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_claude_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_codex_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_board_card_thread.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_board_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_board_merge_check.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_board_obligation_close.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_brain_ask_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_brain_ask_identity_explicitness.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_channel_poll_never_breaks_dms.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_channel_wake_policy_filter.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_codex_waker.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_committee_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_content_composition.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_copilot_membrane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_copilot_pane_reader.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_cursor_membrane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_ensure_monitor_no_peer_default.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_gateway_message_idempotency.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_gh_route_doctor_mesh_name.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_group_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_guide_commands_parse.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_guide_selfcheck.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_heartbeat_check.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_legacy_generation_removal.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_win32_bash_wrapper.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_hooks_win32_command_path.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_import_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_inbox_identity_provenance.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_init_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_init_provider_menu.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_install_codex_hooks.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_install_postcompact_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_install_wake_hook.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_launchd_units.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_main.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mcp_missing_hint.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_memory_emit_snippet.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_originate_thread_623.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_send_unknown_peer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_sidecar_muse_sink.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_monitor_channel_poll.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_muse_membrane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_muse_own_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_obligation_close_is_surfaced.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_opencode_membrane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_opencode_plugin.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_operator_me.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_orphan_daemons.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_packaged_artifacts_exist.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_packaged_skills.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_executor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_executor_windows.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_reply_drain_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_reply_drain_supervisor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_reply_outbox.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_reply_transport.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_service_e2e.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_service_host.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_service_payload.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_peer_service_reply.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_postcompact_recall.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_readme_claims_no_gateway_default.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_scrub.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_security.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_service_app.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_service_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_identity_stamp.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_subprocess_decode_encoding.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_tmux_wake_runstate_defer.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_tmux_wake_session_reanchor.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_tmux_wake_stale.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_tmux_wake_submit_verify.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_token_precedence_explicit_first.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_unified_token_resolver.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_version_command.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_vibe_membrane.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_watchdog_stale_peers.py +0 -0
- {swarph_cli-0.72.38 → swarph_cli-0.72.39}/tests/test_windows_waker_installer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.72.
|
|
3
|
+
Version: 0.72.39
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "swarph-cli"
|
|
7
|
-
version = "0.72.
|
|
7
|
+
version = "0.72.39"
|
|
8
8
|
description = "The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -60,6 +60,8 @@ CARD = 513
|
|
|
60
60
|
CHECK_EVERY = 4
|
|
61
61
|
_OTHER = "drop-on-meta-edge" # lab-ovh's own alert goes to the other orchestrator
|
|
62
62
|
_PREFIX = f"DUPLICATE-SESSION card #{CARD}"
|
|
63
|
+
_PROC_ROOT: "str | os.PathLike | None" = "/proc"
|
|
64
|
+
_USE_DEFAULT_PROC = object()
|
|
63
65
|
_instance_id: "str | None" = None
|
|
64
66
|
|
|
65
67
|
|
|
@@ -136,10 +138,32 @@ CLAIM_INTERVAL = 90
|
|
|
136
138
|
|
|
137
139
|
|
|
138
140
|
def _is_desktop_daemon(parts: list[str]) -> bool:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
"""True iff argv[0..2] is the swarph-desktop daemon entry point:
|
|
142
|
+
- argv[0] has basename swarph-desktop or swarph_desktop, OR
|
|
143
|
+
- argv[0] is a python interpreter and:
|
|
144
|
+
* argv[1:3] is `-m swarph_desktop` (or `-m swarph-desktop` / `swarph_desktop.*`), or
|
|
145
|
+
* argv[1] is a path ending in `swarph-desktop` / `swarph_desktop` or the
|
|
146
|
+
`run-desktop*.py` launcher (`ExecStart=/home/ubuntu/swarph-desktop/venv/bin/python run-desktop-8766.py`).
|
|
147
|
+
Never scans later argv tokens, so a command that merely mentions or quotes
|
|
148
|
+
swarph-desktop in flags or positional arguments is never counted."""
|
|
149
|
+
if not parts or not parts[0]:
|
|
150
|
+
return False
|
|
151
|
+
b0 = os.path.basename(str(parts[0]))
|
|
152
|
+
if b0 in {"swarph-desktop", "swarph_desktop"}:
|
|
153
|
+
return True
|
|
154
|
+
if not b0.startswith("python") or len(parts) < 2 or not parts[1]:
|
|
155
|
+
return False
|
|
156
|
+
p1 = str(parts[1])
|
|
157
|
+
b1 = os.path.basename(p1)
|
|
158
|
+
if p1 == "-m":
|
|
159
|
+
if len(parts) < 3 or not parts[2]:
|
|
160
|
+
return False
|
|
161
|
+
mod = str(parts[2]).split(".")[0]
|
|
162
|
+
return mod in {"swarph_desktop", "swarph-desktop"}
|
|
163
|
+
if b1 in {"swarph-desktop", "swarph_desktop"} or p1.endswith(("swarph-desktop", "swarph_desktop")):
|
|
164
|
+
return True
|
|
165
|
+
if b1.startswith("run-desktop") and b1.endswith(".py"):
|
|
166
|
+
return True
|
|
143
167
|
return False
|
|
144
168
|
|
|
145
169
|
|
|
@@ -211,17 +235,55 @@ def duplicate_session_pids(entries, cell: str, my_pid: int) -> list[int]:
|
|
|
211
235
|
return sorted(found)
|
|
212
236
|
|
|
213
237
|
|
|
214
|
-
def
|
|
215
|
-
"""(pid, argv)
|
|
216
|
-
|
|
217
|
-
|
|
238
|
+
def _proc_entries(proc_root: "str | os.PathLike | None") -> "list[tuple[int, list[str]]] | None":
|
|
239
|
+
"""Read (pid, argv) from `<proc_root>/<pid>/cmdline` (NUL-separated).
|
|
240
|
+
Returns None when `proc_root` is None or not a readable directory so
|
|
241
|
+
`ps_entries` falls back to `ps -eo pid,args`."""
|
|
242
|
+
if proc_root is None or not os.path.isdir(proc_root):
|
|
243
|
+
return None
|
|
244
|
+
try:
|
|
245
|
+
names = os.listdir(proc_root)
|
|
246
|
+
except OSError:
|
|
247
|
+
return None
|
|
248
|
+
entries: list[tuple[int, list[str]]] = []
|
|
249
|
+
for name in names:
|
|
250
|
+
if not name.isdigit():
|
|
251
|
+
continue
|
|
252
|
+
cmd_path = os.path.join(proc_root, name, "cmdline")
|
|
253
|
+
try:
|
|
254
|
+
with open(cmd_path, "rb") as f:
|
|
255
|
+
raw = f.read()
|
|
256
|
+
except OSError:
|
|
257
|
+
continue
|
|
258
|
+
raw = raw.rstrip(b"\x00")
|
|
259
|
+
if not raw:
|
|
260
|
+
continue
|
|
261
|
+
argv = [tok.decode("utf-8", errors="replace") for tok in raw.split(b"\x00")]
|
|
262
|
+
entries.append((int(name), argv))
|
|
263
|
+
return entries
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def ps_entries(proc_root: "str | os.PathLike | None" = _USE_DEFAULT_PROC) -> list[tuple[int, list[str]]]:
|
|
267
|
+
"""(pid, argv) for every process on the box.
|
|
268
|
+
|
|
269
|
+
On Linux, reads true NUL-separated argv from `/proc/<pid>/cmdline`
|
|
270
|
+
because `/proc` is a readable directory (`_proc_entries`), so words
|
|
271
|
+
inside one quoted argument are never split into whitespace tokens.
|
|
272
|
+
|
|
273
|
+
Falls back to `ps -eo pid,args` when `/proc` is not a readable directory
|
|
274
|
+
or when a caller/test passes `proc_root=None` (or monkeypatches
|
|
275
|
+
`_PROC_ROOT = None` / `_proc_entries`). Returns [] on any error."""
|
|
276
|
+
root = _PROC_ROOT if proc_root is _USE_DEFAULT_PROC else proc_root
|
|
277
|
+
from_proc = _proc_entries(root)
|
|
278
|
+
if from_proc is not None:
|
|
279
|
+
return from_proc
|
|
218
280
|
try:
|
|
219
281
|
proc = subprocess.run(
|
|
220
282
|
["ps", "-eo", "pid,args"], capture_output=True, text=True,
|
|
221
283
|
encoding="utf-8", errors="replace", timeout=10)
|
|
222
284
|
except (OSError, subprocess.SubprocessError):
|
|
223
285
|
return []
|
|
224
|
-
entries
|
|
286
|
+
entries = []
|
|
225
287
|
for line in proc.stdout.splitlines()[1:]:
|
|
226
288
|
line = line.strip()
|
|
227
289
|
if not line:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.72.
|
|
3
|
+
Version: 0.72.39
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, per-invocation `gh` identity routing, a silent DM-wake hook, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -270,6 +270,7 @@ tests/test_1340_router_rollout.py
|
|
|
270
270
|
tests/test_1346_shell_string_gh.py
|
|
271
271
|
tests/test_1347_shell_depth_cap.py
|
|
272
272
|
tests/test_1353_obligation_release_cli.py
|
|
273
|
+
tests/test_1385_duplicate_session_argv.py
|
|
273
274
|
tests/test_138_memory_navigate.py
|
|
274
275
|
tests/test_139_tool_probe.py
|
|
275
276
|
tests/test_183_card_anchor.py
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""Card #1385 (Obligation #3604) — duplicate_session argv-position fix.
|
|
2
|
+
|
|
3
|
+
Ensures duplicate_session.is_session_for() counts the desktop daemon ONLY by
|
|
4
|
+
argv POSITION (argv[0] basename swarph-desktop or python argv[0] + argv[1..2] entry point),
|
|
5
|
+
matching how _is_swarph_argv() treats swarph residents.
|
|
6
|
+
|
|
7
|
+
ps_entries() reads true NUL-separated argv from /proc/<pid>/cmdline so that
|
|
8
|
+
words inside one quoted argument (e.g. `--accept "PASS = ... swarph-desktop ..."`)
|
|
9
|
+
are never split into whitespace tokens.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import subprocess
|
|
15
|
+
import sys
|
|
16
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
import swarph_cli.duplicate_session as ds
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_bash_command_quoting_swarph_desktop_is_not_a_session():
|
|
22
|
+
"""Test (a): ["/bin/bash", "-c", "gh pr view 34 -R BrainSurfing-tech/swarph-desktop ...; swarph board obligations amend 3597 --as lab-ovh ..."]
|
|
23
|
+
is NOT a session for lab-ovh."""
|
|
24
|
+
argv_a = [
|
|
25
|
+
"/bin/bash",
|
|
26
|
+
"-c",
|
|
27
|
+
"gh pr view 34 -R BrainSurfing-tech/swarph-desktop ...; swarph board obligations amend 3597 --as lab-ovh ...",
|
|
28
|
+
]
|
|
29
|
+
assert not ds.is_session_for(argv_a, "lab-ovh")
|
|
30
|
+
assert ds.duplicate_session_pids([(1754451, argv_a)], "lab-ovh", my_pid=100) == []
|
|
31
|
+
|
|
32
|
+
# Even if whitespace-split, it must STILL not be counted as a session
|
|
33
|
+
argv_a_split = " ".join(argv_a).split()
|
|
34
|
+
assert not ds.is_session_for(argv_a_split, "lab-ovh")
|
|
35
|
+
assert ds.duplicate_session_pids([(1754451, argv_a_split)], "lab-ovh", my_pid=100) == []
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_board_cards_ask_mentioning_swarph_desktop_is_not_a_session():
|
|
39
|
+
"""Test (b): ["swarph", "board", "cards", "ask", "1380", "--accept", "PASS = ... swarph-desktop PR 32 ...", "--as", "lab-ovh"]
|
|
40
|
+
is NOT a session for lab-ovh."""
|
|
41
|
+
argv_b = [
|
|
42
|
+
"swarph",
|
|
43
|
+
"board",
|
|
44
|
+
"cards",
|
|
45
|
+
"ask",
|
|
46
|
+
"1380",
|
|
47
|
+
"--accept",
|
|
48
|
+
"PASS = ... swarph-desktop PR 32 ...",
|
|
49
|
+
"--as",
|
|
50
|
+
"lab-ovh",
|
|
51
|
+
]
|
|
52
|
+
assert not ds.is_session_for(argv_b, "lab-ovh")
|
|
53
|
+
assert ds.duplicate_session_pids([(1833816, argv_b)], "lab-ovh", my_pid=100) == []
|
|
54
|
+
|
|
55
|
+
# Even if whitespace-split, it must STILL not be counted as a session
|
|
56
|
+
argv_b_split = " ".join(argv_b).split()
|
|
57
|
+
assert not ds.is_session_for(argv_b_split, "lab-ovh")
|
|
58
|
+
assert ds.duplicate_session_pids([(1833816, argv_b_split)], "lab-ovh", my_pid=100) == []
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_synthetic_desktop_launcher_argv_with_as_appended_is_a_session():
|
|
62
|
+
"""Test (c): SYNTHETIC launcher argv with --as appended. The live daemon on lab-ovh runs ["/home/ubuntu/swarph-desktop/venv/bin/python", "run-desktop-8766.py"] with no --as; appending --as lab-ovh is a synthetic launcher argv that counts as a session for lab-ovh."""
|
|
63
|
+
# Live daemon argv on lab-ovh with no --as is NOT a session for lab-ovh
|
|
64
|
+
assert not ds.is_session_for(
|
|
65
|
+
["/home/ubuntu/swarph-desktop/venv/bin/python", "run-desktop-8766.py"],
|
|
66
|
+
"lab-ovh",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
argv_c = [
|
|
70
|
+
"/home/ubuntu/swarph-desktop/venv/bin/python",
|
|
71
|
+
"run-desktop-8766.py",
|
|
72
|
+
"--as",
|
|
73
|
+
"lab-ovh",
|
|
74
|
+
]
|
|
75
|
+
assert ds.is_session_for(argv_c, "lab-ovh")
|
|
76
|
+
assert not ds.is_session_for(argv_c, "other-cell")
|
|
77
|
+
assert ds.duplicate_session_pids([(1800578, argv_c)], "lab-ovh", my_pid=100) == [1800578]
|
|
78
|
+
assert ds.duplicate_session_pids([(1800578, argv_c)], "other-cell", my_pid=100) == []
|
|
79
|
+
|
|
80
|
+
# Other valid desktop daemon entrypoint forms
|
|
81
|
+
valid_forms = [
|
|
82
|
+
["swarph-desktop", "--as", "lab-ovh"],
|
|
83
|
+
["/home/ubuntu/swarph-desktop/venv/bin/swarph-desktop", "--as", "lab-ovh"],
|
|
84
|
+
["python3", "-m", "swarph_desktop", "--as", "lab-ovh"],
|
|
85
|
+
["/home/ubuntu/swarph-desktop/venv/bin/python", "-m", "swarph_desktop", "--as", "lab-ovh"],
|
|
86
|
+
["python3", "/opt/swarph/swarph-desktop", "--as", "lab-ovh"],
|
|
87
|
+
["python3", "/opt/swarph/swarph_desktop", "--as", "lab-ovh"],
|
|
88
|
+
["/usr/bin/python3", "/home/ubuntu/swarph-desktop/run-desktop-8766.py", "--as", "lab-ovh"],
|
|
89
|
+
]
|
|
90
|
+
for form in valid_forms:
|
|
91
|
+
assert ds.is_session_for(form, "lab-ovh"), f"Failed for {form}"
|
|
92
|
+
assert not ds.is_session_for(form, "other-cell"), f"Unexpected match for {form}"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_swarph_monitor_start_is_a_session():
|
|
96
|
+
"""Test (d): swarph monitor start --as lab-ovh still IS a session."""
|
|
97
|
+
argv_d = ["swarph", "monitor", "start", "--as", "lab-ovh"]
|
|
98
|
+
assert ds.is_session_for(argv_d, "lab-ovh")
|
|
99
|
+
assert not ds.is_session_for(argv_d, "other-cell")
|
|
100
|
+
assert ds.duplicate_session_pids([(200, argv_d)], "lab-ovh", my_pid=100) == [200]
|
|
101
|
+
assert ds.duplicate_session_pids([(200, argv_d)], "other-cell", my_pid=100) == []
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_ps_entries_proc_cmdline_nul_split(tmp_path, monkeypatch):
|
|
105
|
+
"""Test reading true NUL-separated argv from /proc/<pid>/cmdline via synthetic proc_root."""
|
|
106
|
+
# (a) bash command
|
|
107
|
+
p_a = tmp_path / "1754451"
|
|
108
|
+
p_a.mkdir()
|
|
109
|
+
argv_a = [
|
|
110
|
+
"/bin/bash",
|
|
111
|
+
"-c",
|
|
112
|
+
"gh pr view 34 -R BrainSurfing-tech/swarph-desktop ...; swarph board obligations amend 3597 --as lab-ovh ...",
|
|
113
|
+
]
|
|
114
|
+
(p_a / "cmdline").write_bytes(b"\x00".join(tok.encode("utf-8") for tok in argv_a) + b"\x00")
|
|
115
|
+
|
|
116
|
+
# (b) swarph board cards ask
|
|
117
|
+
p_b = tmp_path / "1833816"
|
|
118
|
+
p_b.mkdir()
|
|
119
|
+
argv_b = [
|
|
120
|
+
"swarph",
|
|
121
|
+
"board",
|
|
122
|
+
"cards",
|
|
123
|
+
"ask",
|
|
124
|
+
"1380",
|
|
125
|
+
"--accept",
|
|
126
|
+
"PASS = ... swarph-desktop PR 32 ...",
|
|
127
|
+
"--as",
|
|
128
|
+
"lab-ovh",
|
|
129
|
+
]
|
|
130
|
+
(p_b / "cmdline").write_bytes(b"\x00".join(tok.encode("utf-8") for tok in argv_b) + b"\x00")
|
|
131
|
+
|
|
132
|
+
# (c) synthetic desktop launcher argv with --as appended
|
|
133
|
+
p_c = tmp_path / "1800578"
|
|
134
|
+
p_c.mkdir()
|
|
135
|
+
argv_c = [
|
|
136
|
+
"/home/ubuntu/swarph-desktop/venv/bin/python",
|
|
137
|
+
"run-desktop-8766.py",
|
|
138
|
+
"--as",
|
|
139
|
+
"lab-ovh",
|
|
140
|
+
]
|
|
141
|
+
(p_c / "cmdline").write_bytes(b"\x00".join(tok.encode("utf-8") for tok in argv_c) + b"\x00")
|
|
142
|
+
|
|
143
|
+
# Non-digit dir and empty cmdline (kernel thread) to verify edge cases
|
|
144
|
+
(tmp_path / "self").mkdir()
|
|
145
|
+
p_kthread = tmp_path / "2"
|
|
146
|
+
p_kthread.mkdir()
|
|
147
|
+
(p_kthread / "cmdline").write_bytes(b"")
|
|
148
|
+
|
|
149
|
+
# 1. Call via explicit proc_root parameter
|
|
150
|
+
entries = ds.ps_entries(proc_root=tmp_path)
|
|
151
|
+
by_pid = dict(entries)
|
|
152
|
+
assert 1833816 in by_pid
|
|
153
|
+
assert by_pid[1833816] == argv_b
|
|
154
|
+
assert "PASS = ... swarph-desktop PR 32 ..." in by_pid[1833816]
|
|
155
|
+
assert 2 not in by_pid # empty cmdline skipped
|
|
156
|
+
assert ds.duplicate_session_pids(entries, "lab-ovh", my_pid=100) == [1800578]
|
|
157
|
+
|
|
158
|
+
# 2. Call via monkeypatched _PROC_ROOT
|
|
159
|
+
monkeypatch.setattr(ds, "_PROC_ROOT", str(tmp_path))
|
|
160
|
+
entries_mp = ds.ps_entries()
|
|
161
|
+
assert ds.duplicate_session_pids(entries_mp, "lab-ovh", my_pid=100) == [1800578]
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_live_proc_preserves_quoted_args():
|
|
165
|
+
"""Test against live /proc on Linux with a spawned subprocess."""
|
|
166
|
+
if not os.path.isdir("/proc"):
|
|
167
|
+
pytest.skip("/proc not available on this platform")
|
|
168
|
+
|
|
169
|
+
quoted_arg = "PASS = ... swarph-desktop PR 32 ..."
|
|
170
|
+
proc = subprocess.Popen([
|
|
171
|
+
sys.executable,
|
|
172
|
+
"-c",
|
|
173
|
+
"import time; time.sleep(10)",
|
|
174
|
+
"--accept",
|
|
175
|
+
quoted_arg,
|
|
176
|
+
"--as",
|
|
177
|
+
"lab-ovh",
|
|
178
|
+
])
|
|
179
|
+
try:
|
|
180
|
+
entries = ds.ps_entries()
|
|
181
|
+
match = [argv for pid, argv in entries if pid == proc.pid]
|
|
182
|
+
assert match, f"Process {proc.pid} not found in ps_entries"
|
|
183
|
+
found_argv = match[0]
|
|
184
|
+
assert quoted_arg in found_argv, f"Quoted argument was split: {found_argv}"
|
|
185
|
+
assert not ds.is_session_for(found_argv, "lab-ovh")
|
|
186
|
+
finally:
|
|
187
|
+
proc.terminate()
|
|
188
|
+
proc.wait(timeout=5)
|
|
@@ -81,6 +81,7 @@ def test_ps_output_is_parsed_into_pid_argv(monkeypatch):
|
|
|
81
81
|
class _P:
|
|
82
82
|
stdout = out
|
|
83
83
|
|
|
84
|
+
monkeypatch.setattr(ds, "_PROC_ROOT", None)
|
|
84
85
|
monkeypatch.setattr(ds.subprocess, "run", lambda *a, **k: _P())
|
|
85
86
|
entries = ds.ps_entries()
|
|
86
87
|
assert (100, ["swarph", "monitor", "start", "--as", "opencode"]) in entries
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|
|
File without changes
|
{swarph_cli-0.72.38 → swarph_cli-0.72.39}/src/swarph_cli/commands/install_opencode_plugin.py
RENAMED
|
File without changes
|
{swarph_cli-0.72.38 → swarph_cli-0.72.39}/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.38 → swarph_cli-0.72.39}/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
|