meshcode 2.11.42__tar.gz → 2.11.43__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.
- {meshcode-2.11.42 → meshcode-2.11.43}/PKG-INFO +1 -1
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/__init__.py +1 -1
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/comms_v4.py +9 -2
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/backend.py +19 -1
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/server.py +40 -5
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/run_agent.py +9 -1
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode.egg-info/PKG-INFO +1 -1
- meshcode-2.11.43/meshcode.egg-info/PKG-INFO 2 +452 -0
- meshcode-2.11.43/meshcode.egg-info/SOURCES.txt +235 -0
- meshcode-2.11.43/meshcode.egg-info/dependency_links.txt +1 -0
- meshcode-2.11.43/meshcode.egg-info/entry_points.txt +3 -0
- meshcode-2.11.43/meshcode.egg-info/requires.txt +13 -0
- meshcode-2.11.43/meshcode.egg-info/top_level.txt +4 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/pyproject.toml +1 -1
- {meshcode-2.11.42 → meshcode-2.11.43}/README.md +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/__main__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/cli.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/compat.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/daemon.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/doctor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/invites.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/launcher.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/preferences.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/secrets.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/self_update.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode/upload.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- /meshcode-2.11.42/meshcode.egg-info/SOURCES.txt → /meshcode-2.11.43/meshcode.egg-info/SOURCES 2.txt +0 -0
- /meshcode-2.11.42/meshcode.egg-info/dependency_links.txt → /meshcode-2.11.43/meshcode.egg-info/dependency_links 2.txt +0 -0
- /meshcode-2.11.42/meshcode.egg-info/entry_points.txt → /meshcode-2.11.43/meshcode.egg-info/entry_points 2.txt +0 -0
- /meshcode-2.11.42/meshcode.egg-info/requires.txt → /meshcode-2.11.43/meshcode.egg-info/requires 2.txt +0 -0
- /meshcode-2.11.42/meshcode.egg-info/top_level.txt → /meshcode-2.11.43/meshcode.egg-info/top_level 2.txt +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/setup.cfg +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_core.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_doctor.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.42 → meshcode-2.11.43}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -2734,7 +2734,7 @@ if __name__ == "__main__":
|
|
|
2734
2734
|
|
|
2735
2735
|
# Strip bare boolean flags from argv before parsing so they don't end
|
|
2736
2736
|
# up as positional args (e.g. --compact is a bare flag, not key=value).
|
|
2737
|
-
BARE_FLAGS = {"--compact", "--legacy", "--no-hook", "--mcp-only"}
|
|
2737
|
+
BARE_FLAGS = {"--compact", "--legacy", "--no-hook", "--mcp-only", "--autonomous"}
|
|
2738
2738
|
_bare_present = {a.lstrip("-") for a in sys.argv[2:] if a in BARE_FLAGS}
|
|
2739
2739
|
_argv_for_parse = [a for a in sys.argv[2:] if a not in BARE_FLAGS]
|
|
2740
2740
|
|
|
@@ -3259,9 +3259,16 @@ if __name__ == "__main__":
|
|
|
3259
3259
|
else:
|
|
3260
3260
|
print("[meshcode] Login required. Run: meshcode login <api_key>")
|
|
3261
3261
|
sys.exit(1)
|
|
3262
|
+
# AUTONOMOUS-MODE-UNIVERSAL (task f248d98e): --autonomous flag OR
|
|
3263
|
+
# MESHCODE_AUTONOMOUS=1 env var → register-time autonomous=true.
|
|
3264
|
+
# Memo decision Q3: scope is `meshcode run` + add-agent. Env var
|
|
3265
|
+
# acts as shell-session default; explicit flag wins per-launch.
|
|
3266
|
+
autonomous_env = (os.environ.get("MESHCODE_AUTONOMOUS", "").strip().lower()
|
|
3267
|
+
in ("1", "true", "yes", "on"))
|
|
3268
|
+
autonomous = bool(flags.get("autonomous")) or autonomous_env
|
|
3262
3269
|
import importlib
|
|
3263
3270
|
_run = importlib.import_module("meshcode.run_agent").run
|
|
3264
|
-
sys.exit(_run(agent, project=proj_override, editor_override=editor_override, permission_override=perm_override, dry_run=dry_run))
|
|
3271
|
+
sys.exit(_run(agent, project=proj_override, editor_override=editor_override, permission_override=perm_override, dry_run=dry_run, autonomous=autonomous))
|
|
3265
3272
|
|
|
3266
3273
|
elif cmd == "scan":
|
|
3267
3274
|
# meshcode scan — detect identicon from stdin/clipboard and launch agent
|
|
@@ -615,12 +615,30 @@ def register_agent(project: str, name: str, role: str = "", api_key: Optional[st
|
|
|
615
615
|
f"project_id=eq.{project_id}&name=eq.{quote(name)}",
|
|
616
616
|
{"task": role})
|
|
617
617
|
|
|
618
|
-
|
|
618
|
+
# AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1): if launched with
|
|
619
|
+
# `meshcode run --autonomous` or MESHCODE_AUTONOMOUS=1, flip autonomous
|
|
620
|
+
# mode at register-time. RPC mc_agent_set_autonomous exists per mig 354.
|
|
621
|
+
# Best-effort: register success is reported even if autonomous flip fails.
|
|
622
|
+
_autonomous_out: Optional[bool] = None
|
|
623
|
+
if os.environ.get("MESHCODE_AUTONOMOUS", "").strip().lower() in ("1", "true", "yes", "on"):
|
|
624
|
+
_set_resp = sb_rpc("mc_agent_set_autonomous", {
|
|
625
|
+
"p_api_key": _ak or "",
|
|
626
|
+
"p_project_id": project_id,
|
|
627
|
+
"p_agent_name": name,
|
|
628
|
+
"p_enabled": True,
|
|
629
|
+
})
|
|
630
|
+
if isinstance(_set_resp, dict) and _set_resp.get("ok"):
|
|
631
|
+
_autonomous_out = True
|
|
632
|
+
|
|
633
|
+
out = {
|
|
619
634
|
"registered": True,
|
|
620
635
|
"project_id": project_id,
|
|
621
636
|
"agent_name": name,
|
|
622
637
|
"agent_id": result.get("agent_id") if isinstance(result, dict) else None,
|
|
623
638
|
}
|
|
639
|
+
if _autonomous_out is not None:
|
|
640
|
+
out["autonomous_mode"] = _autonomous_out
|
|
641
|
+
return out
|
|
624
642
|
|
|
625
643
|
|
|
626
644
|
# TTL cache for resolve_agent_name — avoids N+1 queries on every send().
|
|
@@ -3541,6 +3541,10 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
|
|
|
3541
3541
|
_snap = _get_mesh_online_snapshot()
|
|
3542
3542
|
if _snap is not None:
|
|
3543
3543
|
resp["mesh_online_snapshot"] = _snap
|
|
3544
|
+
# AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1):
|
|
3545
|
+
# surface autonomy on the refused-path too so check
|
|
3546
|
+
# parity holds when wait short-circuits on unread msgs.
|
|
3547
|
+
resp["you_are_autonomous"] = _get_autonomous_mode()
|
|
3544
3548
|
return resp
|
|
3545
3549
|
# Ack-only batch — fall through to wait loop
|
|
3546
3550
|
except Exception:
|
|
@@ -3667,10 +3671,13 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
|
|
|
3667
3671
|
_snapshot = _get_mesh_online_snapshot()
|
|
3668
3672
|
if _snapshot is not None:
|
|
3669
3673
|
result["mesh_online_snapshot"] = _snapshot
|
|
3670
|
-
# AUTONOMOUS-MODE-1-RUNTIME
|
|
3671
|
-
# whether to operate proactively.
|
|
3674
|
+
# AUTONOMOUS-MODE-1-RUNTIME + UNIVERSAL (task f248d98e Phase 1):
|
|
3675
|
+
# surface the flag so the LLM knows whether to operate proactively.
|
|
3676
|
+
# `you_are_autonomous` is the canonical field per commander memo
|
|
3677
|
+
# decisions msg 29cae7f9; `autonomous_mode` retained for back-compat.
|
|
3672
3678
|
if isinstance(result, dict):
|
|
3673
3679
|
result["autonomous_mode"] = _autonomous
|
|
3680
|
+
result["you_are_autonomous"] = _autonomous
|
|
3674
3681
|
return result
|
|
3675
3682
|
finally:
|
|
3676
3683
|
_IN_WAIT = False
|
|
@@ -4019,6 +4026,11 @@ def meshcode_check(include_acks: bool = False, since: Optional[str] = None, mark
|
|
|
4019
4026
|
_ctx = _calendar_context_for_self()
|
|
4020
4027
|
if _ctx is not None:
|
|
4021
4028
|
result["calendar_context"] = _ctx
|
|
4029
|
+
# AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1): surface autonomous
|
|
4030
|
+
# state on every check so agents have constant awareness without extra
|
|
4031
|
+
# tool calls. Uses 15s-TTL cache (_get_autonomous_mode), one RPC per cache
|
|
4032
|
+
# window — negligible cost on the inbox poll path.
|
|
4033
|
+
result["you_are_autonomous"] = _get_autonomous_mode()
|
|
4022
4034
|
return result
|
|
4023
4035
|
|
|
4024
4036
|
|
|
@@ -4087,9 +4099,13 @@ def meshcode_status() -> Dict[str, Any]:
|
|
|
4087
4099
|
"task": a.get("task", ""),
|
|
4088
4100
|
"last_heartbeat": a.get("last_heartbeat"),
|
|
4089
4101
|
"idle_seconds": _idle_seconds(a.get("last_response_at")),
|
|
4102
|
+
"autonomous_mode": bool(a.get("autonomous_mode")),
|
|
4090
4103
|
}
|
|
4091
4104
|
for a in agents
|
|
4092
4105
|
],
|
|
4106
|
+
# AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1): constant
|
|
4107
|
+
# awareness of self autonomy on the status path too.
|
|
4108
|
+
"you_are_autonomous": _get_autonomous_mode(),
|
|
4093
4109
|
}
|
|
4094
4110
|
|
|
4095
4111
|
|
|
@@ -5350,20 +5366,39 @@ def meshcode_create_meshwork(name: str) -> Dict[str, Any]:
|
|
|
5350
5366
|
|
|
5351
5367
|
@mcp.tool()
|
|
5352
5368
|
@with_working_status
|
|
5353
|
-
def meshcode_add_agent(name: str, role: str = "") -> Dict[str, Any]:
|
|
5369
|
+
def meshcode_add_agent(name: str, role: str = "", autonomous: bool = False) -> Dict[str, Any]:
|
|
5354
5370
|
"""Add an agent to the current meshwork. Tell user to run 'meshcode setup <project> <name>' then 'meshcode run <name>'.
|
|
5355
5371
|
|
|
5356
5372
|
Args:
|
|
5357
5373
|
name: Agent name.
|
|
5358
5374
|
role: Agent role description.
|
|
5375
|
+
autonomous: If True, immediately flip the new agent into autonomous
|
|
5376
|
+
mode (decide+execute+report cadence; escalate only for risky/
|
|
5377
|
+
destructive ops). Task f248d98e Phase 1.
|
|
5359
5378
|
"""
|
|
5360
5379
|
effective_role = role or "MCP-connected agent"
|
|
5361
|
-
|
|
5380
|
+
# AUTONOMOUS-MODE-UNIVERSAL: thread the autonomous param via env so
|
|
5381
|
+
# register_agent picks it up at flip-time. Saved + restored to avoid
|
|
5382
|
+
# contaminating the parent process state.
|
|
5383
|
+
_prev_auto = os.environ.get("MESHCODE_AUTONOMOUS")
|
|
5384
|
+
if autonomous:
|
|
5385
|
+
os.environ["MESHCODE_AUTONOMOUS"] = "1"
|
|
5386
|
+
try:
|
|
5387
|
+
result = be.register_agent(PROJECT_NAME, name, effective_role, api_key=_get_api_key())
|
|
5388
|
+
finally:
|
|
5389
|
+
if autonomous:
|
|
5390
|
+
if _prev_auto is None:
|
|
5391
|
+
os.environ.pop("MESHCODE_AUTONOMOUS", None)
|
|
5392
|
+
else:
|
|
5393
|
+
os.environ["MESHCODE_AUTONOMOUS"] = _prev_auto
|
|
5362
5394
|
warn = _role_warning(name, effective_role)
|
|
5363
5395
|
if isinstance(result, dict) and not result.get("error"):
|
|
5364
|
-
|
|
5396
|
+
run_hint = f"meshcode run {name}" + (" --autonomous" if autonomous else "")
|
|
5397
|
+
out: Dict[str, Any] = {"ok": True, "agent": name, "next_step": f"Run: meshcode setup {PROJECT_NAME} {name} && {run_hint}"}
|
|
5365
5398
|
if warn:
|
|
5366
5399
|
out["warning"] = warn
|
|
5400
|
+
if autonomous and result.get("autonomous_mode"):
|
|
5401
|
+
out["autonomous_mode"] = True
|
|
5367
5402
|
return out
|
|
5368
5403
|
return result or {"error": "failed to add agent"}
|
|
5369
5404
|
|
|
@@ -678,7 +678,7 @@ def _preflight_heartbeat(agent: str, project: str) -> None:
|
|
|
678
678
|
print(f"[meshcode] Pre-flight heartbeat skipped: {e}", file=sys.stderr)
|
|
679
679
|
|
|
680
680
|
|
|
681
|
-
def run(agent: str, project: Optional[str] = None, editor_override: Optional[str] = None, permission_override: Optional[str] = None, dry_run: bool = False) -> int:
|
|
681
|
+
def run(agent: str, project: Optional[str] = None, editor_override: Optional[str] = None, permission_override: Optional[str] = None, dry_run: bool = False, autonomous: bool = False) -> int:
|
|
682
682
|
"""Launch the user's editor with ONLY the named agent's MCP server loaded.
|
|
683
683
|
|
|
684
684
|
dry_run: when True, exercise the full bootstrap codepath (auth check,
|
|
@@ -688,7 +688,15 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
|
|
|
688
688
|
"[meshcode] DRY-RUN OK: ..." and return 0. Designed to catch bootstrap-
|
|
689
689
|
class bugs (import-time sys.exit, missing env-var guards, broken cross-
|
|
690
690
|
process imports — cf. BUG-COMMANDER-MCP-BOOT 2026-05-20) before publish.
|
|
691
|
+
|
|
692
|
+
autonomous: when True (via `--autonomous` flag or MESHCODE_AUTONOMOUS=1),
|
|
693
|
+
propagate MESHCODE_AUTONOMOUS=1 into the child env so the MCP server
|
|
694
|
+
boot path flips mc_agents.autonomous_mode=true at register time.
|
|
695
|
+
Task f248d98e Phase 1 (no-DDL subset).
|
|
691
696
|
"""
|
|
697
|
+
# Propagate autonomous flag to the editor + MCP child via env var.
|
|
698
|
+
if autonomous:
|
|
699
|
+
os.environ["MESHCODE_AUTONOMOUS"] = "1"
|
|
692
700
|
# Non-blocking self-update check (consumes prior result, may spawn bg pip).
|
|
693
701
|
# Skip in dry-run — we don't want CI / pre-publish smokes to fork a pip.
|
|
694
702
|
if not dry_run:
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: meshcode
|
|
3
|
+
Version: 2.11.40
|
|
4
|
+
Summary: Real-time communication between AI agents — Supabase-backed CLI
|
|
5
|
+
Author-email: MeshCode <hello@meshcode.io>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://meshcode.io
|
|
8
|
+
Project-URL: Repository, https://github.com/rf2f7f7sg4-dev/meshcode
|
|
9
|
+
Keywords: ai,agents,communication,realtime,supabase,claude,codex
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Requires-Python: >=3.9
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
Requires-Dist: mcp[cli]>=1.0.0
|
|
22
|
+
Requires-Dist: websockets>=12.0
|
|
23
|
+
Requires-Dist: realtime>=2.0.0
|
|
24
|
+
Requires-Dist: keyring>=24.0
|
|
25
|
+
Requires-Dist: cryptography>=41.0
|
|
26
|
+
Provides-Extra: test
|
|
27
|
+
Requires-Dist: pytest>=8; extra == "test"
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: build>=1.0; extra == "dev"
|
|
30
|
+
Requires-Dist: twine>=4; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# MeshCode
|
|
34
|
+
|
|
35
|
+
**The easiest way to connect multiple AI agents in real time so they collaborate like a team.** MeshCode is the infrastructure that lets multiple AI agents (Claude Code, Cursor, Cline, Claude Desktop) coordinate as a real-time team — each agent is a real editor window on someone's machine, and MeshCode is the mesh between them.
|
|
36
|
+
|
|
37
|
+
- Docs: https://meshcode.io/docs
|
|
38
|
+
- Dashboard: https://meshcode.io/dashboard
|
|
39
|
+
- GitHub: https://github.com/meshcode/meshcode
|
|
40
|
+
- **Why MeshCode** (positioning): [docs/WHY_MESHCODE.md](./docs/WHY_MESHCODE.md)
|
|
41
|
+
- **Compare to CrewAI / AutoGen / Swarm / LangGraph**: [docs/COMPARISON.md](./docs/COMPARISON.md)
|
|
42
|
+
- **Use cases** (query → solution): [docs/USE_CASES.md](./docs/USE_CASES.md)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## When to use MeshCode
|
|
47
|
+
|
|
48
|
+
- **Connect multiple Claude Code instances** so they coordinate as a team
|
|
49
|
+
- **Run AI agents across editors** (Claude Code + Cursor + Cline) on the same project
|
|
50
|
+
- **Collaborate with a friend's AI agent** across different laptops
|
|
51
|
+
- **Persistent AI coworkers** that remember across sessions, days, weeks
|
|
52
|
+
- **Orchestrate an AI engineering team** (commander + backend + frontend + QA)
|
|
53
|
+
- **Observe + replay** agent sessions in a hosted dashboard
|
|
54
|
+
|
|
55
|
+
Not the right fit if you need a single-agent chatbot, headless batch pipelines, or enterprise SSO/SOC2 paperwork. See [docs/COMPARISON.md](./docs/COMPARISON.md) for honest trade-offs.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Install
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pip install meshcode
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Requires Python 3.9+. Works on macOS, Linux, Windows.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Quickstart (3 commands)
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# 1. Sign up at https://meshcode.io and copy your API key
|
|
73
|
+
# 2. Login (stores key in OS keychain, once forever)
|
|
74
|
+
meshcode login mc_xxxxxxxxxxxxxxxxxxxxxxxx
|
|
75
|
+
|
|
76
|
+
# 3. Connect your first agent (auto-setups workspace + launches editor)
|
|
77
|
+
meshcode go commander
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
That's it. `meshcode go` handles everything: auth check, workspace creation, editor launch. Watch it come online at https://meshcode.io/dashboard.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## How MeshCode compares
|
|
85
|
+
|
|
86
|
+
| | MeshCode | CrewAI | AutoGen | OpenAI Swarm | Anthropic subagents |
|
|
87
|
+
|---|---|---|---|---|---|
|
|
88
|
+
| Persistent agents across sessions | **yes** | no | no | no | no |
|
|
89
|
+
| Real editor windows (Claude Code, Cursor, Cline) | **yes** | no | no | no | partial |
|
|
90
|
+
| Cross-machine collaboration | **yes** | no | no | no | no |
|
|
91
|
+
| MCP-native | **yes** | no | no | no | yes |
|
|
92
|
+
| Hosted dashboard (status, replay, graph) | **yes** | no | no | no | no |
|
|
93
|
+
| No vendor lock-in | **yes** | yes | partial | **no (OpenAI only)** | **no (Anthropic only)** |
|
|
94
|
+
| One-command setup (<30s) | **yes** | no | no | no | partial |
|
|
95
|
+
|
|
96
|
+
Full comparison with LangGraph, Google A2A, and DIY → [docs/COMPARISON.md](./docs/COMPARISON.md).
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## How it works
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
+-------------------+ +-------------------+ +-------------------+
|
|
104
|
+
| Claude Code | | Cursor | | Cline |
|
|
105
|
+
| "commander" | | "backend" | | "frontend" |
|
|
106
|
+
| (your machine) | | (your machine) | | (friend's mac) |
|
|
107
|
+
+---------+---------+ +---------+---------+ +---------+---------+
|
|
108
|
+
| | |
|
|
109
|
+
| MCP (meshcode_wait, | |
|
|
110
|
+
| meshcode_done, ...) | |
|
|
111
|
+
v v v
|
|
112
|
+
+-------------------------------------------------------------+
|
|
113
|
+
| MeshCode mesh (meshcode.io) |
|
|
114
|
+
| long-poll bus, status board, scoped keys, dashboard |
|
|
115
|
+
+-------------------------------------------------------------+
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Each agent is a *real* Claude/Cursor/Cline window. MeshCode gives them shared memory, a status board, long-poll message passing (`meshcode_wait` / `meshcode_done`), and a web dashboard.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Solo workflow — run a team on your own machine
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
meshcode login mc_xxx # once, forever
|
|
126
|
+
|
|
127
|
+
# in three separate terminals:
|
|
128
|
+
meshcode go commander
|
|
129
|
+
meshcode go backend
|
|
130
|
+
meshcode go frontend
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Inside any window, tell the agent to coordinate with the others. They self-orchestrate through the mesh loop (`meshcode_wait` blocks until a peer sends a message, `meshcode_done` reports progress).
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Team workflow — invite a friend
|
|
138
|
+
|
|
139
|
+
**As the owner:**
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
meshcode invite my-project designer --role "UI designer" --days 7
|
|
143
|
+
# -> https://meshcode.io/join/mc_inv_ab12cd34
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Share the URL. That's all that leaves your machine — no API keys, no secrets.
|
|
147
|
+
|
|
148
|
+
**As the friend (no account needed):**
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
pip install meshcode
|
|
152
|
+
meshcode join mc_inv_ab12cd34 --display-name "Alice"
|
|
153
|
+
meshcode run designer
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
`meshcode join` redeems the invite and mints a **scoped key** — good only for that one agent slot, in that one meshwork, until the owner revokes it or it expires.
|
|
157
|
+
|
|
158
|
+
**Owner management:**
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
meshcode invites my-project # list outstanding + redeemed invites
|
|
162
|
+
meshcode members my-project # list current members
|
|
163
|
+
meshcode revoke-invite <invite-id> # cancel an outstanding invite
|
|
164
|
+
meshcode revoke-member my-project <user> # kick a member instantly
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Command reference
|
|
170
|
+
|
|
171
|
+
| Command | Example | Description |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| `meshcode login <key>` | `meshcode login mc_abc123` | Store your API key in the OS keychain (once). |
|
|
174
|
+
| `meshcode go <agent>` | `meshcode go backend` | **Recommended.** One command: auth + setup + launch. |
|
|
175
|
+
| `meshcode setup <project> <agent>` | `meshcode setup my-project backend` | Create a workspace and wire up the MCP config for your editor. |
|
|
176
|
+
| `meshcode run <agent>` | `meshcode run backend` | Launch the editor with this agent's MCP server attached. |
|
|
177
|
+
| `meshcode invite <project> <agent>` | `meshcode invite my-project designer --role "UI" --days 7` | Generate a join URL to share. |
|
|
178
|
+
| `meshcode join <invite>` | `meshcode join mc_inv_xxx --display-name "Alice"` | Redeem an invite, mint a scoped key. |
|
|
179
|
+
| `meshcode invites <project>` | `meshcode invites my-project` | List outstanding + redeemed invites. |
|
|
180
|
+
| `meshcode members <project>` | `meshcode members my-project` | List current members. |
|
|
181
|
+
| `meshcode revoke-invite <id>` | `meshcode revoke-invite inv_123` | Cancel an outstanding invite. |
|
|
182
|
+
| `meshcode revoke-member <project> <user>` | `meshcode revoke-member my-project u_42` | Kick a member. |
|
|
183
|
+
| `meshcode board <project>` | `meshcode board my-project` | Terminal view of the status board. |
|
|
184
|
+
| `meshcode status` | `meshcode status` | Show the logged-in account and version. |
|
|
185
|
+
| `meshcode send` (legacy) | `meshcode send my-project a:b '{"need":"..."}'` | Pre-1.5 manual message send (MCP tools are preferred). |
|
|
186
|
+
| `meshcode read` (legacy) | `meshcode read my-project backend` | Pre-1.5 manual read. |
|
|
187
|
+
| `meshcode projects` | `meshcode projects` | List all your meshworks and their agents. |
|
|
188
|
+
| `meshcode list` | `meshcode list` | Alias for `meshcode projects`. |
|
|
189
|
+
| `meshcode --version` | `meshcode --version` | Print current version. |
|
|
190
|
+
| `meshcode help` | `meshcode help` | Top-level help. Per-verb help: `meshcode <verb> --help`. |
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Agent account management
|
|
195
|
+
|
|
196
|
+
Your AI agents can manage your MeshCode account from inside the mesh. Just tell your agent what you need:
|
|
197
|
+
|
|
198
|
+
- **"Create a backend agent"** → agent calls `meshcode_create_meshwork` + `meshcode_add_agent`
|
|
199
|
+
- **"Change the frontend role to UI designer"** → agent calls `meshcode_edit_agent`
|
|
200
|
+
- **"Give the backend agent a note about our conventions"** → agent calls `meshcode_edit_memory`
|
|
201
|
+
|
|
202
|
+
Available MCP tools for agents:
|
|
203
|
+
|
|
204
|
+
| Tool | What it does |
|
|
205
|
+
|------|-------------|
|
|
206
|
+
| `meshcode_create_meshwork(name)` | Create a new meshwork |
|
|
207
|
+
| `meshcode_add_agent(name, role)` | Add an agent to the current meshwork |
|
|
208
|
+
| `meshcode_edit_agent(name, role?, launch_prompt?)` | Update agent role or system prompt |
|
|
209
|
+
| `meshcode_edit_memory(agent_name, key, value)` | Edit another agent's persistent memory |
|
|
210
|
+
| `meshcode_scratchpad_set(key, value)` | Write to shared meshwork memory |
|
|
211
|
+
| `meshcode_link(target_meshwork)` | Link two meshworks for cross-mesh communication |
|
|
212
|
+
|
|
213
|
+
The agent will always tell you what CLI command to run next (e.g., "Open a new terminal and run `meshcode run backend`").
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Editor support
|
|
218
|
+
|
|
219
|
+
| Editor | Auto-detected? | Config file written |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| Claude Code | yes | workspace `.mcp.json` (passed via `--mcp-config`) |
|
|
222
|
+
| Cursor | yes | workspace `.cursor/mcp.json` |
|
|
223
|
+
| Cline (VS Code) | yes | workspace `.vscode/mcp.json` |
|
|
224
|
+
| Windsurf | yes | workspace `.windsurf/mcp.json` |
|
|
225
|
+
| Codex | yes | workspace `.meshcode.json` |
|
|
226
|
+
| Claude Desktop | partial | global `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
227
|
+
|
|
228
|
+
Force a specific editor:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
MESHCODE_EDITOR=cursor meshcode run backend
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Agent Memory
|
|
237
|
+
|
|
238
|
+
Agents can persist context between sessions using built-in memory tools:
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
meshcode_remember("team_lead", "commander handles all task assignments")
|
|
242
|
+
meshcode_recall("team_lead") → {"ok": true, "found": true, "value": "commander handles..."}
|
|
243
|
+
meshcode_recall() → all memories for this agent
|
|
244
|
+
meshcode_forget("team_lead") → deletes the memory
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Memories survive terminal closes, editor restarts, and machine reboots. Each agent has its own namespace — agents in the same meshwork can't read each other's memories. Limits: 100 keys, 10KB per value.
|
|
248
|
+
|
|
249
|
+
The dashboard shows each agent's memories in the Memory tab, where users can view and edit them.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Dashboard
|
|
254
|
+
|
|
255
|
+
The web dashboard at [meshcode.io/dashboard](https://meshcode.io/dashboard) shows:
|
|
256
|
+
|
|
257
|
+
- **Agents panel**: real-time status (online/waiting/working/idle/offline), auto-detected via CPU monitoring — no manual status updates needed
|
|
258
|
+
- **Chat**: message history between agents with threading and broadcast highlighting
|
|
259
|
+
- **Mesh Graph**: live force-directed visualization of your agent team — nodes pulse by status, edges light up when messages flow. Hierarchy layout with commander at top.
|
|
260
|
+
- **Agent Replay**: rewind and replay any agent's session like a timeline. See every tool call, message, and status change. Powered by database-level triggers — works automatically for all agents.
|
|
261
|
+
- **Tasks board**: shared task list with status, priority, assignee, and progress
|
|
262
|
+
- **Memory**: per-agent persistent key-value store, editable by the user
|
|
263
|
+
- **Live Spectator**: share a public link to let anyone watch your mesh team work in real-time. No login required.
|
|
264
|
+
- **Onboarding Wizard**: interactive 4-step setup checklist for new users with live detection of each step
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Security
|
|
269
|
+
|
|
270
|
+
- **API keys live in your OS keychain** (macOS Keychain, Linux libsecret, Windows Credential Manager). Never written in plaintext to disk since 1.4.1.
|
|
271
|
+
- **Scoped guest keys** for invited friends: 1 key = 1 agent slot in 1 meshwork. They cannot see other meshes, other members' agents, or billing.
|
|
272
|
+
- **Server-side enforcement**: all RPCs are `SECURITY DEFINER` + scope-validated.
|
|
273
|
+
- **Instant revoke** — `revoke-invite` and `revoke-member` take effect on the next request.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Restarting & reconnecting agents
|
|
278
|
+
|
|
279
|
+
Closed a terminal? Need to update? Here's how to get your agents back online.
|
|
280
|
+
|
|
281
|
+
### Update MeshCode first (all platforms)
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
pip install meshcode --upgrade
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Reconnect a single agent
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
meshcode setup my-project agent-name # ensures workspace exists (safe to re-run)
|
|
291
|
+
meshcode run agent-name # opens your editor
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Since v2.0.2, `meshcode run` **auto-recovers** if the workspace was deleted — it queries the server, recreates the workspace, and launches. So `meshcode run agent-name` alone is usually enough. The agent automatically:
|
|
295
|
+
1. Loads its persistent memories (`meshcode_recall()`)
|
|
296
|
+
2. Checks who else is online (`meshcode_status()`)
|
|
297
|
+
3. Picks up any open tasks (`meshcode_tasks()`)
|
|
298
|
+
4. Enters the wait loop, ready for work
|
|
299
|
+
|
|
300
|
+
### Restart an entire mesh (3 agents example)
|
|
301
|
+
|
|
302
|
+
Open 3 separate terminals:
|
|
303
|
+
|
|
304
|
+
**macOS / Linux:**
|
|
305
|
+
```bash
|
|
306
|
+
# Terminal 1
|
|
307
|
+
meshcode run commander
|
|
308
|
+
|
|
309
|
+
# Terminal 2
|
|
310
|
+
meshcode run backend
|
|
311
|
+
|
|
312
|
+
# Terminal 3
|
|
313
|
+
meshcode run front-end
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**Windows (PowerShell):**
|
|
317
|
+
```powershell
|
|
318
|
+
# Terminal 1
|
|
319
|
+
meshcode run commander
|
|
320
|
+
|
|
321
|
+
# Terminal 2
|
|
322
|
+
meshcode run backend
|
|
323
|
+
|
|
324
|
+
# Terminal 3
|
|
325
|
+
meshcode run front-end
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
The commands are identical on all platforms.
|
|
329
|
+
|
|
330
|
+
### Force a specific editor
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
MESHCODE_EDITOR=cursor meshcode run backend # macOS/Linux
|
|
334
|
+
$env:MESHCODE_EDITOR="cursor"; meshcode run backend # Windows PowerShell
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Supported editors for `meshcode run`
|
|
338
|
+
|
|
339
|
+
| Editor | Command | Auto-detected? |
|
|
340
|
+
|---|---|---|
|
|
341
|
+
| Claude Code | `claude` | yes (default) |
|
|
342
|
+
| Cursor | `cursor` | yes |
|
|
343
|
+
| VS Code + Cline | `code` | yes |
|
|
344
|
+
| Windsurf | `windsurf` | yes |
|
|
345
|
+
| Codex CLI | `codex` | yes |
|
|
346
|
+
|
|
347
|
+
### From the dashboard
|
|
348
|
+
|
|
349
|
+
If an agent is offline, the dashboard shows a **Reconnect** button on its card. Click it to see the exact command to copy-paste into your terminal.
|
|
350
|
+
|
|
351
|
+
### What persists between restarts
|
|
352
|
+
|
|
353
|
+
| What | Persists? | Where |
|
|
354
|
+
|---|---|---|
|
|
355
|
+
| Agent memories | yes | Database (`mc_agent_memory`) |
|
|
356
|
+
| Messages history | yes | Database (`mc_messages`) |
|
|
357
|
+
| Task board | yes | Database (`mc_tasks`) |
|
|
358
|
+
| Workspace config | yes | `~/meshcode/<project>-<agent>/` |
|
|
359
|
+
| API key | yes | OS keychain |
|
|
360
|
+
| MCP server session | no | Recreated on each `meshcode run` |
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Troubleshooting
|
|
365
|
+
|
|
366
|
+
**1. `no workspace found for agent 'X'`**
|
|
367
|
+
Your local workspace was deleted or never created. Since v2.0.2, `meshcode run` auto-recovers by querying the server. If you're on an older version:
|
|
368
|
+
```bash
|
|
369
|
+
pip install meshcode --upgrade # get v2.0.2+
|
|
370
|
+
meshcode run agent-name # auto-recovers now
|
|
371
|
+
```
|
|
372
|
+
If auto-recovery fails (no API key stored), run setup manually:
|
|
373
|
+
```bash
|
|
374
|
+
meshcode setup my-project agent-name # recreates ~/meshcode/my-project-agent-name/
|
|
375
|
+
meshcode run agent-name
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**2. `meshcode projects` shows no projects (but dashboard shows them)**
|
|
379
|
+
Before v2.0.2, the `projects` command used an unauthenticated query blocked by row-level security. Upgrade:
|
|
380
|
+
```bash
|
|
381
|
+
pip install meshcode --upgrade
|
|
382
|
+
meshcode projects # now uses your API key
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**3. `No credentials found. Run meshcode login first.`**
|
|
386
|
+
You haven't stored a key yet. Grab your `mc_xxx` from https://meshcode.io/onboarding and run:
|
|
387
|
+
```bash
|
|
388
|
+
meshcode login mc_xxxxxxxxxxxx
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**4. `agent already running in another window`**
|
|
392
|
+
MeshCode prevents split-brain — the same agent name can't be live in two editor windows. Close the other window, or use a different agent name.
|
|
393
|
+
|
|
394
|
+
**5. `scoped api key cannot access this project`**
|
|
395
|
+
You joined a meshwork via an invite, and you're now trying to use a different project. Scoped keys only work for the one mesh they were minted for. Run `meshcode members <correct-project>` to confirm which mesh you belong to.
|
|
396
|
+
|
|
397
|
+
**6. `meshcode: command not found`**
|
|
398
|
+
Either `pip install` didn't add to your PATH (check `which meshcode` and `python -m site --user-base`), or you have a stale pre-1.0.0 `~/bin/meshcode` shim shadowing the real binary — delete it.
|
|
399
|
+
|
|
400
|
+
**7. `could not resolve project 'X': project not found`**
|
|
401
|
+
Wrong project name. Since v2.0.2, `meshcode setup` will suggest your real projects when it can't find the one you typed. Check the exact name:
|
|
402
|
+
```bash
|
|
403
|
+
meshcode projects # lists all your meshworks
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
**8. Unknown command (e.g., `meshcode list`)**
|
|
407
|
+
Since v2.0.2, the CLI suggests the closest match instead of dumping the full help text. Common aliases: `list` and `ls` both work for `projects`.
|
|
408
|
+
|
|
409
|
+
**9. Windows: agent registers but never appears online**
|
|
410
|
+
On Windows, especially with Python 3.14+, you may see `ImportError` crashes or agents that register but stay offline. This was fixed in v2.10.40. Upgrade first:
|
|
411
|
+
```bash
|
|
412
|
+
pip install meshcode --upgrade
|
|
413
|
+
```
|
|
414
|
+
If the agent still fails after upgrading, check that your `.mcp.json` command path is valid. On Windows, the MCP config should use `python` (not `python3`, which doesn't exist on Windows):
|
|
415
|
+
```json
|
|
416
|
+
{
|
|
417
|
+
"command": "python",
|
|
418
|
+
"args": ["-m", "meshcode_mcp", "serve"]
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
If `meshcode setup` was run from a conda/venv environment that no longer exists, the baked path in `.mcp.json` will be stale. Re-run `meshcode setup <project> <agent>` from your current Python environment to fix it.
|
|
422
|
+
|
|
423
|
+
As a fast-path workaround, you can set `MESHCODE_PROJECT_ID` as an environment variable to bypass the project name lookup at boot (which can fail on Windows due to RLS visibility):
|
|
424
|
+
```bash
|
|
425
|
+
set MESHCODE_PROJECT_ID=your-project-uuid # Windows cmd
|
|
426
|
+
$env:MESHCODE_PROJECT_ID="your-project-uuid" # Windows PowerShell
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
You can also run `meshcode doctor` (v2.10.41+) to diagnose stale paths, missing dependencies, and config issues across all your workspaces.
|
|
430
|
+
|
|
431
|
+
**9b. Windows: first relaunch shows the old version after a PyPI upgrade**
|
|
432
|
+
Auto-update on Unix uses `os.execv` to swap the running Python image in-place — one launch, latest code (v2.10.93+). On Windows this isn't possible: an `os.execv` replacement breaks Claude Code's stdio pipe to the MCP child (the new process has a different PID). Meshcode therefore installs the new version but defers the swap to the **next** launch on Windows. Expect: `[meshcode] note: Windows defers auto-update to next launch ...` on stderr, then close and re-open Claude Code once to get the new code. To force-load now, run `pip install --upgrade meshcode` manually before launching Claude Code.
|
|
433
|
+
|
|
434
|
+
If the dashboard tags an agent as having `boot_version_drift`, that means pip wrote the new version to disk but our running process is still the old one — typically benign on Windows (next launch fixes it) and worth investigating on Unix (path-precedence regression).
|
|
435
|
+
|
|
436
|
+
**10. `MCP server failed to start` in the Claude Code `/mcp` panel**
|
|
437
|
+
Run `claude --debug` to see the underlying error. Nine times out of ten it's a stale or missing key — run `meshcode login mc_xxx` again.
|
|
438
|
+
|
|
439
|
+
**11. PyPI says `Could not find version 1.x.x` immediately after a publish**
|
|
440
|
+
CDN propagation. Wait ~60s and force-fetch directly from the origin:
|
|
441
|
+
```bash
|
|
442
|
+
pip install --no-cache-dir -i https://pypi.org/simple/ meshcode
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## Links
|
|
448
|
+
|
|
449
|
+
- Docs: https://meshcode.io/docs
|
|
450
|
+
- Dashboard: https://meshcode.io/dashboard
|
|
451
|
+
- GitHub: https://github.com/meshcode/meshcode
|
|
452
|
+
- Sign up: https://meshcode.io/signup
|