meshcode 2.11.93__tar.gz → 2.11.94__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.93 → meshcode-2.11.94}/PKG-INFO +1 -1
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/__init__.py +1 -1
- meshcode-2.11.94/meshcode/cli.py +42 -0
- meshcode-2.11.94/meshcode/compat.py +174 -0
- meshcode-2.11.94/meshcode/daemon.py +0 -0
- meshcode-2.11.94/meshcode/error_hints.py +74 -0
- meshcode-2.11.94/meshcode/exceptions.py +52 -0
- meshcode-2.11.94/meshcode/invites.py +406 -0
- meshcode-2.11.94/meshcode/launcher.py +353 -0
- meshcode-2.11.94/meshcode/launcher_install.py +414 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/__init__.py +22 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/__main__.py +62 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/backend.py +0 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/meshcode_mcp/server.py +33 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/test_backend.py +86 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/test_realtime.py +95 -0
- meshcode-2.11.94/meshcode/meshcode_mcp/test_server_wrapper.py +117 -0
- meshcode-2.11.94/meshcode/preferences.py +260 -0
- meshcode-2.11.94/meshcode/protocol_v2.py +129 -0
- meshcode-2.11.94/meshcode/secrets.py +365 -0
- meshcode-2.11.94/meshcode/self_update.py +0 -0
- meshcode-2.11.94/meshcode/setup_clients.py +0 -0
- meshcode-2.11.94/meshcode/supervisor.py +186 -0
- meshcode-2.11.94/meshcode/upload.py +125 -0
- meshcode-2.11.94/meshcode-backend-wt/comms_v4.py +0 -0
- meshcode-2.11.94/meshcode-backend-wt/meshcode/__init__.py +82 -0
- meshcode-2.11.94/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- meshcode-2.11.94/meshcode-backend-wt/meshcode/comms_v4.py +3563 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/meshcode_mcp/backend.py +31 -319
- meshcode-2.11.94/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- meshcode-2.11.94/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- meshcode-2.11.94/meshcode-backend-wt/meshcode/quickstart.py +148 -0
- meshcode-2.11.94/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/self_update.py +4 -203
- meshcode-2.11.94/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- meshcode-2.11.94/meshcode-backend-wt/scripts/sentinel.py +257 -0
- meshcode-2.11.94/meshcode-backend-wt/tests/test_rpc_migrations.py +387 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/__init__.py +82 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +638 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/cli.py +42 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/compat.py +174 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/error_hints.py +74 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/exceptions.py +52 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/invites.py +406 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/launcher.py +353 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +414 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +22 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +62 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +86 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +95 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +117 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/preferences.py +260 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +129 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/quickstart.py +148 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/secrets.py +365 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/self_update.py +345 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/supervisor.py +186 -0
- meshcode-2.11.94/meshcode-noun-wt/build/lib/meshcode/upload.py +125 -0
- meshcode-2.11.94/meshcode-noun-wt/comms_v4.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/__init__.py +82 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/cli.py +42 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/compat.py +174 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/error_hints.py +74 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/exceptions.py +52 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/invites.py +406 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/launcher.py +353 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/launcher_install.py +414 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +22 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +62 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +86 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +95 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +117 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/preferences.py +260 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/protocol_v2.py +129 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/quickstart.py +148 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/secrets.py +365 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/self_update.py +345 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/setup_clients.py +926 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/supervisor.py +186 -0
- meshcode-2.11.94/meshcode-noun-wt/meshcode/upload.py +125 -0
- meshcode-2.11.94/meshcode-noun-wt/scripts/sentinel.py +257 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_core.py +216 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_cross_agent_messaging.py +366 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_esc_deaf_state.py +361 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_exceptions.py +107 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_mark_read_batch.py +200 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_migration_integrity.py +176 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_realtime_event_freshness.py +236 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_rls_cross_tenant.py +255 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_rpc_migrations.py +387 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_security_regressions.py +171 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_sentinel.py +148 -0
- meshcode-2.11.94/meshcode-noun-wt/tests/test_status_enum_coverage.py +231 -0
- meshcode-2.11.94/meshcode-tasks-wt/comms_v4.py +1941 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/__init__.py +82 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/cli.py +42 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/compat.py +174 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/error_hints.py +74 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/exceptions.py +52 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/invites.py +406 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/launcher.py +353 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/launcher_install.py +414 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +22 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +62 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +1261 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-tasks-wt}/meshcode/meshcode_mcp/realtime.py +0 -5
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +86 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +95 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +117 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/preferences.py +260 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/protocol_v2.py +129 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/quickstart.py +148 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/secrets.py +365 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/self_update.py +345 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/setup_clients.py +926 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/supervisor.py +186 -0
- meshcode-2.11.94/meshcode-tasks-wt/meshcode/upload.py +125 -0
- meshcode-2.11.94/meshcode-tasks-wt/scripts/sentinel.py +257 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_core.py +216 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +366 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_esc_deaf_state.py +361 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_exceptions.py +107 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_mark_read_batch.py +200 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_migration_integrity.py +176 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +236 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +255 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_rpc_migrations.py +387 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_security_regressions.py +171 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_sentinel.py +148 -0
- meshcode-2.11.94/meshcode-tasks-wt/tests/test_status_enum_coverage.py +231 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode.egg-info/PKG-INFO +1 -1
- meshcode-2.11.94/meshcode.egg-info/SOURCES.txt +239 -0
- meshcode-2.11.94/meshcode.egg-info/top_level.txt +4 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/pyproject.toml +1 -1
- meshcode-2.11.94/tests/test_core.py +216 -0
- meshcode-2.11.94/tests/test_cross_agent_messaging.py +366 -0
- meshcode-2.11.94/tests/test_esc_deaf_state.py +361 -0
- meshcode-2.11.94/tests/test_exceptions.py +107 -0
- meshcode-2.11.94/tests/test_mark_read_batch.py +200 -0
- meshcode-2.11.94/tests/test_migration_integrity.py +176 -0
- meshcode-2.11.94/tests/test_realtime_event_freshness.py +236 -0
- meshcode-2.11.94/tests/test_rls_cross_tenant.py +255 -0
- meshcode-2.11.94/tests/test_security_regressions.py +171 -0
- meshcode-2.11.94/tests/test_sentinel.py +148 -0
- meshcode-2.11.94/tests/test_status_enum_coverage.py +231 -0
- meshcode-2.11.93/meshcode/daemon.py +0 -492
- meshcode-2.11.93/meshcode/setup_clients.py +0 -1884
- meshcode-2.11.93/meshcode.egg-info/SOURCES.txt +0 -89
- meshcode-2.11.93/meshcode.egg-info/top_level.txt +0 -1
- {meshcode-2.11.93 → meshcode-2.11.94}/README.md +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/__main__.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/_session_handoff_template.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/doctor.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/hostd.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode/up.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/cli.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/compat.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/invites.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/launcher.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/preferences.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/secrets.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/meshcode/upload.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_core.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94/meshcode-backend-wt}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/setup.cfg +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_doctor.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.93 → meshcode-2.11.94}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""MeshCode CLI entry point for pip install."""
|
|
3
|
+
import sys
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
# Force UTF-8 on stdout/stderr for Windows terminals (cp1252 default crashes
|
|
7
|
+
# on emojis, em-dashes, and any non-ASCII output the CLI prints).
|
|
8
|
+
# Python 3.7+ supports reconfigure(); older versions get a no-op.
|
|
9
|
+
try:
|
|
10
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
11
|
+
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
12
|
+
if hasattr(sys.stderr, "reconfigure"):
|
|
13
|
+
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
|
|
14
|
+
except Exception:
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def main():
|
|
19
|
+
"""Entry point that delegates to comms_v4.py within the package."""
|
|
20
|
+
# Find comms_v4.py — first in package dir, then in repo root
|
|
21
|
+
pkg_dir = os.path.dirname(os.path.abspath(__file__))
|
|
22
|
+
repo_root = os.path.dirname(pkg_dir)
|
|
23
|
+
|
|
24
|
+
for candidate in [
|
|
25
|
+
os.path.join(pkg_dir, "comms_v4.py"),
|
|
26
|
+
os.path.join(repo_root, "comms_v4.py"),
|
|
27
|
+
]:
|
|
28
|
+
if os.path.exists(candidate):
|
|
29
|
+
sys.argv[0] = candidate
|
|
30
|
+
# Set __name__ and __file__ for the script
|
|
31
|
+
globs = {"__name__": "__main__", "__file__": candidate}
|
|
32
|
+
# Force UTF-8 on Windows (cp1252 default crashes on non-ASCII)
|
|
33
|
+
with open(candidate, encoding="utf-8") as f:
|
|
34
|
+
exec(compile(f.read(), candidate, "exec"), globs)
|
|
35
|
+
return
|
|
36
|
+
|
|
37
|
+
print("[meshcode] ERROR: comms_v4.py not found. Reinstall: pip install meshcode")
|
|
38
|
+
sys.exit(1)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
if __name__ == "__main__":
|
|
42
|
+
main()
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"""Claude Code version compatibility matrix.
|
|
2
|
+
|
|
3
|
+
Tracks known-good and known-bad Claude Code versions so the SDK can
|
|
4
|
+
adjust behavior at runtime and warn users about regressions.
|
|
5
|
+
|
|
6
|
+
HEARTBEAT THRESHOLD CONTRACT (reference):
|
|
7
|
+
clear(60) < guard(90) < decay(180) < display(300) < client(600)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import subprocess
|
|
13
|
+
import shutil
|
|
14
|
+
from typing import Optional, Dict, List, Tuple
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# ============================================================
|
|
18
|
+
# COMPATIBILITY MATRIX
|
|
19
|
+
# ============================================================
|
|
20
|
+
# Each entry: version_prefix -> {status, issues[], mitigations[]}
|
|
21
|
+
# status: "safe", "degraded", "broken"
|
|
22
|
+
# Versions not listed are assumed "unknown" (treated as safe with warning).
|
|
23
|
+
|
|
24
|
+
MATRIX: Dict[str, Dict] = {
|
|
25
|
+
# Known-good versions
|
|
26
|
+
"2.1.104": {
|
|
27
|
+
"status": "safe",
|
|
28
|
+
"issues": [],
|
|
29
|
+
"mitigations": [],
|
|
30
|
+
},
|
|
31
|
+
# ESC/MCP stdio regression range: 2.1.111 through 2.1.119
|
|
32
|
+
"2.1.111": {
|
|
33
|
+
"status": "broken",
|
|
34
|
+
"issues": ["ESC closes MCP stdio pipe instead of sending cancel notification"],
|
|
35
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
36
|
+
},
|
|
37
|
+
"2.1.112": {
|
|
38
|
+
"status": "broken",
|
|
39
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
40
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
41
|
+
},
|
|
42
|
+
"2.1.113": {
|
|
43
|
+
"status": "broken",
|
|
44
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
45
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
46
|
+
},
|
|
47
|
+
"2.1.114": {
|
|
48
|
+
"status": "broken",
|
|
49
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
50
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
51
|
+
},
|
|
52
|
+
"2.1.115": {
|
|
53
|
+
"status": "broken",
|
|
54
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
55
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
56
|
+
},
|
|
57
|
+
"2.1.116": {
|
|
58
|
+
"status": "broken",
|
|
59
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
60
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
61
|
+
},
|
|
62
|
+
"2.1.117": {
|
|
63
|
+
"status": "broken",
|
|
64
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
65
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
66
|
+
},
|
|
67
|
+
"2.1.118": {
|
|
68
|
+
"status": "broken",
|
|
69
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
70
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
71
|
+
},
|
|
72
|
+
"2.1.119": {
|
|
73
|
+
"status": "broken",
|
|
74
|
+
"issues": ["ESC closes MCP stdio pipe (same as 2.1.111)"],
|
|
75
|
+
"mitigations": ["Pin to 2.1.104: npm i -g @anthropic-ai/claude-code@2.1.104"],
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
RECOMMENDED_VERSION = "2.1.104"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def detect_cc_version() -> Optional[str]:
|
|
83
|
+
"""Detect installed Claude Code version. Returns version string or None."""
|
|
84
|
+
claude_bin = shutil.which("claude")
|
|
85
|
+
if not claude_bin:
|
|
86
|
+
return None
|
|
87
|
+
try:
|
|
88
|
+
out = subprocess.run(
|
|
89
|
+
[claude_bin, "--version"],
|
|
90
|
+
capture_output=True, text=True, timeout=5,
|
|
91
|
+
)
|
|
92
|
+
# Output like "2.1.104 (Claude Code)" or "Claude Code 2.1.104"
|
|
93
|
+
text = out.stdout.strip()
|
|
94
|
+
for part in text.split():
|
|
95
|
+
# Find the version-like token
|
|
96
|
+
if part[0].isdigit() and "." in part:
|
|
97
|
+
return part.strip("()")
|
|
98
|
+
except Exception:
|
|
99
|
+
pass
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def lookup(version: str) -> Dict:
|
|
104
|
+
"""Look up a version in the matrix. Returns entry or unknown default."""
|
|
105
|
+
if version in MATRIX:
|
|
106
|
+
return MATRIX[version]
|
|
107
|
+
# Try prefix match (e.g., "2.1.104" matches "2.1.104-beta")
|
|
108
|
+
for key in MATRIX:
|
|
109
|
+
if version.startswith(key):
|
|
110
|
+
return MATRIX[key]
|
|
111
|
+
return {
|
|
112
|
+
"status": "unknown",
|
|
113
|
+
"issues": [],
|
|
114
|
+
"mitigations": [],
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def check() -> Tuple[str, str, Dict]:
|
|
119
|
+
"""Check current CC version against matrix.
|
|
120
|
+
|
|
121
|
+
Returns: (version_str, status, entry_dict)
|
|
122
|
+
"""
|
|
123
|
+
version = detect_cc_version()
|
|
124
|
+
if not version:
|
|
125
|
+
return ("not found", "unknown", {
|
|
126
|
+
"status": "unknown",
|
|
127
|
+
"issues": ["Claude Code not found in PATH"],
|
|
128
|
+
"mitigations": ["Install: npm i -g @anthropic-ai/claude-code"],
|
|
129
|
+
})
|
|
130
|
+
entry = lookup(version)
|
|
131
|
+
return (version, entry["status"], entry)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def get_runtime_adjustments(version: str) -> Dict:
|
|
135
|
+
"""Return runtime parameter adjustments for a given CC version.
|
|
136
|
+
|
|
137
|
+
These can be applied by the MCP server to mitigate known issues.
|
|
138
|
+
"""
|
|
139
|
+
entry = lookup(version)
|
|
140
|
+
adjustments = {}
|
|
141
|
+
|
|
142
|
+
if entry["status"] == "broken":
|
|
143
|
+
# ESC kills MCP: use shorter wait timeouts so if MCP dies,
|
|
144
|
+
# it restarts faster and doesn't miss too many messages.
|
|
145
|
+
adjustments["wait_timeout_cap"] = 10 # seconds (default 20)
|
|
146
|
+
adjustments["heartbeat_interval"] = 15 # seconds (default 30)
|
|
147
|
+
adjustments["warn_on_boot"] = True
|
|
148
|
+
|
|
149
|
+
elif entry["status"] == "degraded":
|
|
150
|
+
adjustments["heartbeat_interval"] = 20 # slightly more aggressive
|
|
151
|
+
adjustments["warn_on_boot"] = True
|
|
152
|
+
|
|
153
|
+
return adjustments
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def format_report(version: str, entry: Dict) -> str:
|
|
157
|
+
"""Format a human-readable compatibility report."""
|
|
158
|
+
lines = []
|
|
159
|
+
lines.append(f" Claude Code version: {version}")
|
|
160
|
+
lines.append(f" Status: {entry.get('status', 'unknown').upper()}")
|
|
161
|
+
lines.append(f" Recommended: {RECOMMENDED_VERSION}")
|
|
162
|
+
if entry.get("issues"):
|
|
163
|
+
lines.append("")
|
|
164
|
+
lines.append(" Known issues:")
|
|
165
|
+
for issue in entry["issues"]:
|
|
166
|
+
lines.append(f" - {issue}")
|
|
167
|
+
if entry.get("mitigations"):
|
|
168
|
+
lines.append("")
|
|
169
|
+
lines.append(" Fixes:")
|
|
170
|
+
for m in entry["mitigations"]:
|
|
171
|
+
lines.append(f" - {m}")
|
|
172
|
+
if entry.get("status") == "safe":
|
|
173
|
+
lines.append(" No known issues.")
|
|
174
|
+
return "\n".join(lines)
|
|
File without changes
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Smart error messages — maps common error patterns to actionable fix commands.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
from meshcode.error_hints import hint_for_error
|
|
5
|
+
print(hint_for_error("agent not found"))
|
|
6
|
+
# → "Run: meshcode register <project> <agent> <role>"
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
_HINTS = [
|
|
10
|
+
# Auth errors
|
|
11
|
+
("invalid api_key", "Run: meshcode login <api_key> to set your credentials"),
|
|
12
|
+
("api key", "Run: meshcode login <api_key> to refresh credentials"),
|
|
13
|
+
("auth_failed", "Run: meshcode login to re-authenticate"),
|
|
14
|
+
("forbidden", "You don't have permission. Check: meshcode doctor"),
|
|
15
|
+
("not authenticated", "Run: meshcode login <api_key>"),
|
|
16
|
+
|
|
17
|
+
# Agent errors
|
|
18
|
+
("agent not found", "Run: meshcode register <project> <agent_name> <role>"),
|
|
19
|
+
("agent.*not registered", "Run: meshcode register <project> <agent_name> <role>"),
|
|
20
|
+
|
|
21
|
+
# Project errors
|
|
22
|
+
("project.*not found", "Check project name with: meshcode projects"),
|
|
23
|
+
("no projects found", "Create one at meshcode.io/dashboard or: meshcode init <project_name>"),
|
|
24
|
+
|
|
25
|
+
# Network errors
|
|
26
|
+
("circuit breaker open", "Supabase is temporarily unavailable. Wait 30s and retry. Details: meshcode doctor"),
|
|
27
|
+
("connection refused", "Check internet connection. If persists: meshcode doctor"),
|
|
28
|
+
("network error", "Check internet connection. If persists: meshcode doctor"),
|
|
29
|
+
("timeout", "Request timed out. Check connection: meshcode doctor"),
|
|
30
|
+
|
|
31
|
+
# MCP errors
|
|
32
|
+
("MCP server crashed", "Restart: meshcode run <agent>"),
|
|
33
|
+
("stdin EOF", "MCP pipe closed. Restart the MCP server or Claude Code session"),
|
|
34
|
+
("mcp.*failed", "Check MCP config: meshcode doctor"),
|
|
35
|
+
|
|
36
|
+
# Task errors
|
|
37
|
+
("task.*already claimed", "This task is being worked on. Try: meshcode tasks to see available tasks"),
|
|
38
|
+
("task not found", "Check task ID. List tasks: meshcode tasks"),
|
|
39
|
+
|
|
40
|
+
# Config errors
|
|
41
|
+
("comms_v4.py not found", "Reinstall: pip install --upgrade meshcode"),
|
|
42
|
+
("\.mcp\.json", "Run: meshcode setup <project> <agent> to create config"),
|
|
43
|
+
|
|
44
|
+
# Token errors
|
|
45
|
+
("token expired", "Generate a new token from the dashboard"),
|
|
46
|
+
("token already used", "Generate a new token from the dashboard"),
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def hint_for_error(error_msg: str) -> str:
|
|
51
|
+
"""Return an actionable fix suggestion for a given error message.
|
|
52
|
+
|
|
53
|
+
Returns empty string if no hint matches.
|
|
54
|
+
"""
|
|
55
|
+
import re
|
|
56
|
+
lower = error_msg.lower()
|
|
57
|
+
for pattern, hint in _HINTS:
|
|
58
|
+
if re.search(pattern, lower):
|
|
59
|
+
return hint
|
|
60
|
+
return ""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def format_error(error_msg: str, prefix: str = "[meshcode]") -> str:
|
|
64
|
+
"""Format an error with an actionable hint if available.
|
|
65
|
+
|
|
66
|
+
Example output:
|
|
67
|
+
[meshcode] ERROR: agent not found
|
|
68
|
+
[meshcode] Fix: Run: meshcode register <project> <agent_name> <role>
|
|
69
|
+
"""
|
|
70
|
+
lines = [f"{prefix} ERROR: {error_msg}"]
|
|
71
|
+
hint = hint_for_error(error_msg)
|
|
72
|
+
if hint:
|
|
73
|
+
lines.append(f"{prefix} Fix: {hint}")
|
|
74
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""MeshCode exception hierarchy.
|
|
2
|
+
|
|
3
|
+
All SDK-specific errors inherit from :class:`MeshCodeError` so callers can
|
|
4
|
+
catch a single base class, or narrow down to the specific failure mode.
|
|
5
|
+
|
|
6
|
+
CLI entry points (cli.py, launcher.py, server.py boot) catch these and
|
|
7
|
+
convert to ``sys.exit(2)`` so end-user behaviour is unchanged.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MeshCodeError(Exception):
|
|
12
|
+
"""Base exception for all MeshCode SDK errors."""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AuthError(MeshCodeError):
|
|
16
|
+
"""Authentication or API-key related failure.
|
|
17
|
+
|
|
18
|
+
Raised when:
|
|
19
|
+
- No API key is found in the keychain or environment
|
|
20
|
+
- The secrets module cannot be loaded
|
|
21
|
+
- An API key is rejected by the server
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class RPCError(MeshCodeError):
|
|
26
|
+
"""A Supabase RPC call returned an error payload.
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
rpc_name: Name of the RPC function that failed (if known).
|
|
30
|
+
detail: Server-provided error message.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, message: str, *, rpc_name: str = "", detail: str = ""):
|
|
34
|
+
super().__init__(message)
|
|
35
|
+
self.rpc_name = rpc_name
|
|
36
|
+
self.detail = detail
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class MeshCodeTimeoutError(MeshCodeError):
|
|
40
|
+
"""A network or RPC call timed out.
|
|
41
|
+
|
|
42
|
+
Named ``MeshCodeTimeoutError`` to avoid shadowing the builtin
|
|
43
|
+
:class:`TimeoutError`.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class MeshCodeConnectionError(MeshCodeError):
|
|
48
|
+
"""Could not reach the MeshCode / Supabase backend.
|
|
49
|
+
|
|
50
|
+
Named ``MeshCodeConnectionError`` to avoid shadowing the builtin
|
|
51
|
+
:class:`ConnectionError`.
|
|
52
|
+
"""
|