meshcode 2.11.31__tar.gz → 2.11.32__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.31 → meshcode-2.11.32}/PKG-INFO +1 -1
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/__init__.py +1 -1
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/server.py +63 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.31 → meshcode-2.11.32}/pyproject.toml +1 -1
- {meshcode-2.11.31 → meshcode-2.11.32}/README.md +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/__main__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/cli.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/compat.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/daemon.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/doctor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/invites.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/launcher.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/preferences.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/secrets.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/self_update.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/upload.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/setup.cfg +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_core.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_doctor.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -3299,6 +3299,56 @@ def _get_pending_tasks_summary() -> Optional[List[Dict[str, str]]]:
|
|
|
3299
3299
|
return None
|
|
3300
3300
|
|
|
3301
3301
|
|
|
3302
|
+
def _check_task_dedupe(title: str, assignee: str) -> Optional[Dict[str, Any]]:
|
|
3303
|
+
"""Find an open/in_progress task with similar title + same assignee.
|
|
3304
|
+
|
|
3305
|
+
Samuel directive 2026-05-21T23:41Z (`commander_dedupe_before_task_from_status_msg`):
|
|
3306
|
+
commanders kept creating duplicate tasks when reacting to status msgs from
|
|
3307
|
+
agents that had already claimed/shipped the same work. The 5ac1d9fe /
|
|
3308
|
+
dd41054d MOBILE-FIRST-3/4 dupes sat OPEN since 2026-05-20 because nobody
|
|
3309
|
+
deduped before creating new ones. Server-side soft guard surfaces a
|
|
3310
|
+
`dedupe_warning` in task_create responses when a likely duplicate
|
|
3311
|
+
exists — non-blocking, so legitimate near-titles still create, but the
|
|
3312
|
+
commander sees the dupe candidate and can cancel + reuse instead.
|
|
3313
|
+
"""
|
|
3314
|
+
try:
|
|
3315
|
+
api_key = _get_api_key()
|
|
3316
|
+
if not api_key:
|
|
3317
|
+
return None
|
|
3318
|
+
result = be.task_list(api_key, _PROJECT_ID, AGENT_NAME, status_filter=None)
|
|
3319
|
+
if not isinstance(result, dict) or not result.get("ok"):
|
|
3320
|
+
return None
|
|
3321
|
+
tasks = result.get("tasks", [])
|
|
3322
|
+
target = (title or "").strip().lower()
|
|
3323
|
+
if not target:
|
|
3324
|
+
return None
|
|
3325
|
+
target_prefix = target[:40]
|
|
3326
|
+
for t in tasks:
|
|
3327
|
+
if t.get("status") not in ("open", "in_progress"):
|
|
3328
|
+
continue
|
|
3329
|
+
if t.get("assignee") != assignee:
|
|
3330
|
+
continue
|
|
3331
|
+
t_title = (t.get("title") or "").strip().lower()
|
|
3332
|
+
if not t_title:
|
|
3333
|
+
continue
|
|
3334
|
+
t_prefix = t_title[:40]
|
|
3335
|
+
match = None
|
|
3336
|
+
if t_prefix == target_prefix:
|
|
3337
|
+
match = "prefix-40"
|
|
3338
|
+
elif target in t_title or t_title in target:
|
|
3339
|
+
match = "substring"
|
|
3340
|
+
if match:
|
|
3341
|
+
return {
|
|
3342
|
+
"dupe_task_id": t.get("id"),
|
|
3343
|
+
"dupe_title": t.get("title"),
|
|
3344
|
+
"dupe_status": t.get("status"),
|
|
3345
|
+
"match_type": match,
|
|
3346
|
+
}
|
|
3347
|
+
except Exception:
|
|
3348
|
+
pass
|
|
3349
|
+
return None
|
|
3350
|
+
|
|
3351
|
+
|
|
3302
3352
|
def _attach_pending_tasks_to_resp(resp: Dict[str, Any]) -> Dict[str, Any]:
|
|
3303
3353
|
"""Surface this agent's open/in_progress assigned tasks on EVERY wait response.
|
|
3304
3354
|
|
|
@@ -4076,11 +4126,24 @@ def meshcode_task_create(title: str, description: str = "", assignee: Optional[s
|
|
|
4076
4126
|
except Exception as _de:
|
|
4077
4127
|
return {"error": f"due_parse_failed: {_de}"}
|
|
4078
4128
|
api_key = _get_api_key()
|
|
4129
|
+
# Soft dedupe guard (Samuel directive 2026-05-21): surface likely-duplicate
|
|
4130
|
+
# open/in_progress task with same assignee + similar title. Non-blocking —
|
|
4131
|
+
# caller still gets the new task_id, but sees `dedupe_warning` and can
|
|
4132
|
+
# cancel + reuse the existing task instead of accumulating dupes.
|
|
4133
|
+
dedupe_hit = _check_task_dedupe(title.strip(), assignee) if assignee != "auto" else None
|
|
4079
4134
|
result = be.task_create(api_key, _PROJECT_ID, AGENT_NAME, title.strip(),
|
|
4080
4135
|
description=description, assignee=assignee,
|
|
4081
4136
|
priority=priority, parent_task_id=parent_task_id,
|
|
4082
4137
|
due_at=parsed_due_at, due_label=parsed_due_label,
|
|
4083
4138
|
depends_on=depends_on or None)
|
|
4139
|
+
if isinstance(result, dict) and result.get("ok") and dedupe_hit:
|
|
4140
|
+
result["dedupe_warning"] = (
|
|
4141
|
+
f"Possible duplicate of task {dedupe_hit['dupe_task_id'][:8]} "
|
|
4142
|
+
f"('{dedupe_hit['dupe_title'][:60]}', status={dedupe_hit['dupe_status']}, "
|
|
4143
|
+
f"match={dedupe_hit['match_type']}). Consider canceling this new task "
|
|
4144
|
+
f"and reusing the existing one."
|
|
4145
|
+
)
|
|
4146
|
+
result["dedupe_candidate"] = dedupe_hit
|
|
4084
4147
|
# Auto-notify the resolved assignee so they wake from meshcode_wait.
|
|
4085
4148
|
# Read result["assignee"] (server may have resolved 'auto' to a real name).
|
|
4086
4149
|
if isinstance(result, dict) and result.get("ok"):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_cross_agent_messaging.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_status_enum_coverage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|