meshcode 2.11.7__tar.gz → 2.11.9__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.7 → meshcode-2.11.9}/PKG-INFO +1 -1
- meshcode-2.11.9/meshcode/__init__.py +90 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/comms_v4.py +7 -2
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/backend.py +111 -2
- meshcode-2.11.9/meshcode/meshcode_mcp/realtime.py +465 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/server.py +325 -119
- meshcode-2.11.9/meshcode/meshcode_mcp/test_boot_timing.py +110 -0
- meshcode-2.11.9/meshcode/meshcode_mcp/test_install_guard.py +75 -0
- meshcode-2.11.9/meshcode/meshcode_mcp/test_prefs_claude_version.py +82 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode.egg-info/SOURCES.txt +4 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/pyproject.toml +1 -1
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_boot_bug_regression.py +1 -1
- meshcode-2.11.9/tests/test_epistemic_v1_python_sdk.py +177 -0
- meshcode-2.11.7/meshcode/__init__.py +0 -82
- meshcode-2.11.7/meshcode/meshcode_mcp/realtime.py +0 -460
- {meshcode-2.11.7 → meshcode-2.11.9}/README.md +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/daemon.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/setup.cfg +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.9}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""MeshCode — Real-time communication between AI agents."""
|
|
2
|
+
__version__ = "2.11.9"
|
|
3
|
+
|
|
4
|
+
# Exception hierarchy — eagerly imported (lightweight, no deps)
|
|
5
|
+
from meshcode.exceptions import ( # noqa: F401
|
|
6
|
+
MeshCodeError,
|
|
7
|
+
AuthError,
|
|
8
|
+
RPCError,
|
|
9
|
+
MeshCodeTimeoutError,
|
|
10
|
+
MeshCodeConnectionError,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
# Public API — lazy imports to avoid heavy deps at import time
|
|
14
|
+
def __getattr__(name):
|
|
15
|
+
if name == "backend":
|
|
16
|
+
from meshcode.meshcode_mcp import backend
|
|
17
|
+
return backend
|
|
18
|
+
if name in _BACKEND_EXPORTS:
|
|
19
|
+
from meshcode.meshcode_mcp import backend
|
|
20
|
+
return getattr(backend, name)
|
|
21
|
+
if name in _SECRETS_EXPORTS:
|
|
22
|
+
from meshcode import secrets
|
|
23
|
+
return getattr(secrets, name)
|
|
24
|
+
raise AttributeError(f"module 'meshcode' has no attribute {name!r}")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# Backend: core messaging & agent management
|
|
28
|
+
_BACKEND_EXPORTS = {
|
|
29
|
+
"send_message",
|
|
30
|
+
"read_inbox",
|
|
31
|
+
"count_pending",
|
|
32
|
+
"get_board",
|
|
33
|
+
"heartbeat",
|
|
34
|
+
"set_status",
|
|
35
|
+
"register_agent",
|
|
36
|
+
"get_project_id",
|
|
37
|
+
"sb_rpc",
|
|
38
|
+
"task_create",
|
|
39
|
+
"task_list",
|
|
40
|
+
"encrypt_payload",
|
|
41
|
+
"decrypt_payload",
|
|
42
|
+
# Epistemic v1
|
|
43
|
+
"decide",
|
|
44
|
+
"outcome",
|
|
45
|
+
"explain",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Secrets: credential management
|
|
49
|
+
_SECRETS_EXPORTS = {
|
|
50
|
+
"get_api_key",
|
|
51
|
+
"set_api_key",
|
|
52
|
+
"list_profiles",
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
__all__ = [
|
|
56
|
+
"__version__",
|
|
57
|
+
"backend",
|
|
58
|
+
# Exceptions
|
|
59
|
+
"MeshCodeError",
|
|
60
|
+
"AuthError",
|
|
61
|
+
"RPCError",
|
|
62
|
+
"MeshCodeTimeoutError",
|
|
63
|
+
"MeshCodeConnectionError",
|
|
64
|
+
# Messaging
|
|
65
|
+
"send_message",
|
|
66
|
+
"read_inbox",
|
|
67
|
+
"count_pending",
|
|
68
|
+
# Agent management
|
|
69
|
+
"register_agent",
|
|
70
|
+
"get_project_id",
|
|
71
|
+
"get_board",
|
|
72
|
+
"heartbeat",
|
|
73
|
+
"set_status",
|
|
74
|
+
# Tasks
|
|
75
|
+
"task_create",
|
|
76
|
+
"task_list",
|
|
77
|
+
# Low-level
|
|
78
|
+
"sb_rpc",
|
|
79
|
+
# Epistemic v1
|
|
80
|
+
"decide",
|
|
81
|
+
"outcome",
|
|
82
|
+
"explain",
|
|
83
|
+
# Encryption
|
|
84
|
+
"encrypt_payload",
|
|
85
|
+
"decrypt_payload",
|
|
86
|
+
# Credentials
|
|
87
|
+
"get_api_key",
|
|
88
|
+
"set_api_key",
|
|
89
|
+
"list_profiles",
|
|
90
|
+
]
|
|
@@ -3397,11 +3397,16 @@ if __name__ == "__main__":
|
|
|
3397
3397
|
from meshcode.preferences import load_prefs, save_prefs
|
|
3398
3398
|
if len(sys.argv) > 3:
|
|
3399
3399
|
ver = sys.argv[3].strip()
|
|
3400
|
-
if ver in ("reset", "unpin"
|
|
3400
|
+
if ver in ("reset", "unpin"):
|
|
3401
3401
|
prefs = load_prefs()
|
|
3402
3402
|
prefs.pop("claude_version", None)
|
|
3403
3403
|
save_prefs(prefs)
|
|
3404
|
-
print("[meshcode] Claude Code version pin removed — will use
|
|
3404
|
+
print("[meshcode] Claude Code version pin removed — will use default ESC-safe pin")
|
|
3405
|
+
elif ver in ("latest", "none", "skip"):
|
|
3406
|
+
prefs = load_prefs()
|
|
3407
|
+
prefs["claude_version"] = ver
|
|
3408
|
+
save_prefs(prefs)
|
|
3409
|
+
print(f"[meshcode] Claude Code version pinning disabled ({ver}) — using installed version")
|
|
3405
3410
|
else:
|
|
3406
3411
|
prefs = load_prefs()
|
|
3407
3412
|
prefs["claude_version"] = ver
|
|
@@ -1132,7 +1132,7 @@ def get_board(project_id: str, api_key: Optional[str] = None) -> List[Dict]:
|
|
|
1132
1132
|
"p_api_key": _ak,
|
|
1133
1133
|
"p_project_id": project_id,
|
|
1134
1134
|
"p_agent_name": None,
|
|
1135
|
-
"p_select": ["name", "role", "status", "task", "last_heartbeat", "registered_at"],
|
|
1135
|
+
"p_select": ["name", "role", "status", "task", "last_heartbeat", "last_response_at", "registered_at"],
|
|
1136
1136
|
"p_limit": None,
|
|
1137
1137
|
})
|
|
1138
1138
|
if isinstance(_res, dict) and _res.get("ok"):
|
|
@@ -1140,7 +1140,7 @@ def get_board(project_id: str, api_key: Optional[str] = None) -> List[Dict]:
|
|
|
1140
1140
|
# Fallback: direct SELECT (gradual rollout)
|
|
1141
1141
|
return sb_select(
|
|
1142
1142
|
"mc_agents",
|
|
1143
|
-
f"project_id=eq.{project_id}&select=name,role,status,task,last_heartbeat,registered_at",
|
|
1143
|
+
f"project_id=eq.{project_id}&select=name,role,status,task,last_heartbeat,last_response_at,registered_at",
|
|
1144
1144
|
order="registered_at.asc",
|
|
1145
1145
|
)
|
|
1146
1146
|
|
|
@@ -1340,6 +1340,112 @@ def get_message_by_id(project_id: str, msg_id: str, api_key: Optional[str] = Non
|
|
|
1340
1340
|
return results[0] if results else None
|
|
1341
1341
|
|
|
1342
1342
|
|
|
1343
|
+
# ============================================================
|
|
1344
|
+
# EPISTEMIC V1: decide / outcome / explain — Python-embedded API.
|
|
1345
|
+
# Mirrors the MCP tools meshcode_decide/_outcome/_explain (server.py 5094-5184).
|
|
1346
|
+
# RPCs: public.mc_decide / mc_outcome / mc_explain (mig 314 wrappers around
|
|
1347
|
+
# meshcode.* SECDEF implementations). Use when integrating MeshCode into a
|
|
1348
|
+
# Python application directly (no MCP layer).
|
|
1349
|
+
# ============================================================
|
|
1350
|
+
|
|
1351
|
+
def decide(
|
|
1352
|
+
project_id: str,
|
|
1353
|
+
agent_name: str,
|
|
1354
|
+
decision: str,
|
|
1355
|
+
alternatives: Optional[List[str]] = None,
|
|
1356
|
+
evidence_refs: Optional[List[Dict[str, Any]]] = None,
|
|
1357
|
+
tier: str = "episodic",
|
|
1358
|
+
api_key: Optional[str] = None,
|
|
1359
|
+
) -> Dict[str, Any]:
|
|
1360
|
+
"""Log a non-trivial decision to mc_traces. Returns {trace_id}.
|
|
1361
|
+
|
|
1362
|
+
Pair with outcome() later when the result becomes observable.
|
|
1363
|
+
|
|
1364
|
+
Args:
|
|
1365
|
+
project_id: UUID of the project.
|
|
1366
|
+
agent_name: Name of the agent making the decision.
|
|
1367
|
+
decision: What was decided (one sentence).
|
|
1368
|
+
alternatives: Other options considered (list of strings).
|
|
1369
|
+
evidence_refs: Evidence pointers (list of {type, id|key} dicts);
|
|
1370
|
+
type values: 'memory','msg','task','file','rpc'.
|
|
1371
|
+
tier: 'episodic' (default) | 'reference' | 'critical'.
|
|
1372
|
+
api_key: Required for the SECDEF RPC. Falls back to env via _get_api_key().
|
|
1373
|
+
"""
|
|
1374
|
+
if not decision or not decision.strip():
|
|
1375
|
+
return {"ok": False, "error": "decision required"}
|
|
1376
|
+
return sb_rpc("mc_decide", {
|
|
1377
|
+
"p_api_key": api_key or _get_api_key(),
|
|
1378
|
+
"p_project_id": project_id,
|
|
1379
|
+
"p_agent_name": agent_name,
|
|
1380
|
+
"p_decision": decision.strip(),
|
|
1381
|
+
"p_alternatives": json.dumps(alternatives or []),
|
|
1382
|
+
"p_evidence_refs": json.dumps(evidence_refs or []),
|
|
1383
|
+
"p_tier": tier,
|
|
1384
|
+
})
|
|
1385
|
+
|
|
1386
|
+
|
|
1387
|
+
def outcome(
|
|
1388
|
+
project_id: str,
|
|
1389
|
+
agent_name: str,
|
|
1390
|
+
trace_id: str,
|
|
1391
|
+
outcome: str,
|
|
1392
|
+
outcome_eval: str,
|
|
1393
|
+
api_key: Optional[str] = None,
|
|
1394
|
+
) -> Dict[str, Any]:
|
|
1395
|
+
"""Record the observable outcome of a prior decision().
|
|
1396
|
+
|
|
1397
|
+
Args:
|
|
1398
|
+
project_id: UUID of the project.
|
|
1399
|
+
agent_name: Name of the agent recording the outcome.
|
|
1400
|
+
trace_id: UUID returned by decide().
|
|
1401
|
+
outcome: Free-form description of what happened.
|
|
1402
|
+
outcome_eval: 'success' | 'failure' | 'partial' | 'unknown'.
|
|
1403
|
+
api_key: Required for the SECDEF RPC. Falls back to env.
|
|
1404
|
+
"""
|
|
1405
|
+
if outcome_eval not in ("success", "failure", "partial", "unknown"):
|
|
1406
|
+
return {"ok": False, "error": "outcome_eval must be success|failure|partial|unknown"}
|
|
1407
|
+
return sb_rpc("mc_outcome", {
|
|
1408
|
+
"p_api_key": api_key or _get_api_key(),
|
|
1409
|
+
"p_project_id": project_id,
|
|
1410
|
+
"p_agent_name": agent_name,
|
|
1411
|
+
"p_trace_id": trace_id,
|
|
1412
|
+
"p_outcome": outcome,
|
|
1413
|
+
"p_outcome_eval": outcome_eval,
|
|
1414
|
+
})
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
def explain(
|
|
1418
|
+
project_id: str,
|
|
1419
|
+
agent_name: str,
|
|
1420
|
+
memory_key: Optional[str] = None,
|
|
1421
|
+
decision_substring: Optional[str] = None,
|
|
1422
|
+
trace_limit: int = 20,
|
|
1423
|
+
api_key: Optional[str] = None,
|
|
1424
|
+
) -> Dict[str, Any]:
|
|
1425
|
+
"""Surface recent traces + open contradictions tied to a memory key or
|
|
1426
|
+
decision substring. Exactly one of (memory_key, decision_substring) is
|
|
1427
|
+
required.
|
|
1428
|
+
|
|
1429
|
+
Args:
|
|
1430
|
+
project_id: UUID of the project.
|
|
1431
|
+
agent_name: Name of the agent asking.
|
|
1432
|
+
memory_key: Match traces whose evidence_refs reference this key.
|
|
1433
|
+
decision_substring: ILIKE match against the decision text.
|
|
1434
|
+
trace_limit: Cap on returned traces (1..200, default 20).
|
|
1435
|
+
api_key: Required for the SECDEF RPC. Falls back to env.
|
|
1436
|
+
"""
|
|
1437
|
+
if not memory_key and not decision_substring:
|
|
1438
|
+
return {"ok": False, "error": "one of (memory_key, decision_substring) required"}
|
|
1439
|
+
return sb_rpc("mc_explain", {
|
|
1440
|
+
"p_api_key": api_key or _get_api_key(),
|
|
1441
|
+
"p_project_id": project_id,
|
|
1442
|
+
"p_agent_name": agent_name,
|
|
1443
|
+
"p_memory_key": memory_key,
|
|
1444
|
+
"p_decision_substring": decision_substring,
|
|
1445
|
+
"p_trace_limit": trace_limit,
|
|
1446
|
+
})
|
|
1447
|
+
|
|
1448
|
+
|
|
1343
1449
|
# ============================================================
|
|
1344
1450
|
# Convenience class so `from meshcode.meshcode_mcp.backend import MeshCodeBackend`
|
|
1345
1451
|
# works for users who expect a class-based API (e.g. Windows onboarding docs).
|
|
@@ -1370,3 +1476,6 @@ class MeshCodeBackend:
|
|
|
1370
1476
|
sb_select = staticmethod(sb_select)
|
|
1371
1477
|
sb_insert = staticmethod(sb_insert)
|
|
1372
1478
|
sb_update = staticmethod(sb_update)
|
|
1479
|
+
decide = staticmethod(decide)
|
|
1480
|
+
outcome = staticmethod(outcome)
|
|
1481
|
+
explain = staticmethod(explain)
|