meshcode 2.11.7__tar.gz → 2.11.8__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.8}/PKG-INFO +1 -1
- meshcode-2.11.8/meshcode/__init__.py +90 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/backend.py +111 -2
- meshcode-2.11.8/meshcode/meshcode_mcp/realtime.py +465 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/server.py +245 -87
- meshcode-2.11.8/meshcode/meshcode_mcp/test_boot_timing.py +110 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode.egg-info/SOURCES.txt +2 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/pyproject.toml +1 -1
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_boot_bug_regression.py +1 -1
- meshcode-2.11.8/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.8}/README.md +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/daemon.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/setup.cfg +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_core.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.7 → meshcode-2.11.8}/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.8"
|
|
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
|
+
]
|
|
@@ -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)
|