meshcode 2.11.64__tar.gz → 2.11.66__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.64 → meshcode-2.11.66}/PKG-INFO +1 -1
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/__init__.py +1 -1
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/hostd.py +15 -2
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/server.py +268 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode.egg-info/PKG-INFO +1 -1
- meshcode-2.11.66/meshcode.egg-info/SOURCES.txt +88 -0
- meshcode-2.11.66/meshcode.egg-info/top_level.txt +1 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/pyproject.toml +1 -1
- meshcode-2.11.64/meshcode/ascii_art.py +0 -638
- meshcode-2.11.64/meshcode/claude_update 2.py +0 -253
- meshcode-2.11.64/meshcode/claude_update 3.py +0 -253
- meshcode-2.11.64/meshcode/claude_update 4.py +0 -253
- meshcode-2.11.64/meshcode/cli.py +0 -42
- meshcode-2.11.64/meshcode/compat.py +0 -174
- meshcode-2.11.64/meshcode/error_hints.py +0 -74
- meshcode-2.11.64/meshcode/exceptions.py +0 -52
- meshcode-2.11.64/meshcode/hostd 2.py +0 -381
- meshcode-2.11.64/meshcode/hostd 3.py +0 -381
- meshcode-2.11.64/meshcode/hostd 4.py +0 -381
- meshcode-2.11.64/meshcode/invites.py +0 -406
- meshcode-2.11.64/meshcode/launcher.py +0 -353
- meshcode-2.11.64/meshcode/launcher_install.py +0 -414
- meshcode-2.11.64/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.64/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.64/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.64/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.64/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.64/meshcode/preferences.py +0 -260
- meshcode-2.11.64/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.64/meshcode/secrets.py +0 -365
- meshcode-2.11.64/meshcode/supervisor.py +0 -186
- meshcode-2.11.64/meshcode/up 2.py +0 -220
- meshcode-2.11.64/meshcode/up 3.py +0 -220
- meshcode-2.11.64/meshcode/upload.py +0 -125
- meshcode-2.11.64/meshcode-backend-wt/comms_v4.py +0 -1941
- meshcode-2.11.64/meshcode-backend-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.64/meshcode-backend-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.64/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.64/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.64/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.64/meshcode-backend-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.64/meshcode-backend-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.64/meshcode-backend-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.64/meshcode-backend-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.64/meshcode-backend-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.64/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -82
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -638
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -42
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -174
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -74
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -52
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -406
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -353
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -414
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -260
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -148
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -958
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -365
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -345
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -926
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -186
- meshcode-2.11.64/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -125
- meshcode-2.11.64/meshcode-noun-wt/comms_v4.py +0 -1941
- meshcode-2.11.64/meshcode-noun-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.64/meshcode-noun-wt/meshcode/ascii_art.py +0 -638
- meshcode-2.11.64/meshcode-noun-wt/meshcode/cli.py +0 -42
- meshcode-2.11.64/meshcode-noun-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.64/meshcode-noun-wt/meshcode/compat.py +0 -174
- meshcode-2.11.64/meshcode-noun-wt/meshcode/error_hints.py +0 -74
- meshcode-2.11.64/meshcode-noun-wt/meshcode/exceptions.py +0 -52
- meshcode-2.11.64/meshcode-noun-wt/meshcode/invites.py +0 -406
- meshcode-2.11.64/meshcode-noun-wt/meshcode/launcher.py +0 -353
- meshcode-2.11.64/meshcode-noun-wt/meshcode/launcher_install.py +0 -414
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.64/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.64/meshcode-noun-wt/meshcode/preferences.py +0 -260
- meshcode-2.11.64/meshcode-noun-wt/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.64/meshcode-noun-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.64/meshcode-noun-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.64/meshcode-noun-wt/meshcode/secrets.py +0 -365
- meshcode-2.11.64/meshcode-noun-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.64/meshcode-noun-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.64/meshcode-noun-wt/meshcode/supervisor.py +0 -186
- meshcode-2.11.64/meshcode-noun-wt/meshcode/upload.py +0 -125
- meshcode-2.11.64/meshcode-noun-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.64/meshcode-noun-wt/tests/test_core.py +0 -216
- meshcode-2.11.64/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.64/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.64/meshcode-noun-wt/tests/test_exceptions.py +0 -107
- meshcode-2.11.64/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.64/meshcode-noun-wt/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.64/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.64/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.64/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.64/meshcode-noun-wt/tests/test_security_regressions.py +0 -171
- meshcode-2.11.64/meshcode-noun-wt/tests/test_sentinel.py +0 -148
- meshcode-2.11.64/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -231
- meshcode-2.11.64/meshcode-tasks-wt/comms_v4.py +0 -1941
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/ascii_art.py +0 -638
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/cli.py +0 -42
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/compat.py +0 -174
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/error_hints.py +0 -74
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/exceptions.py +0 -52
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/invites.py +0 -406
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/launcher.py +0 -353
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/launcher_install.py +0 -414
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/preferences.py +0 -260
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/secrets.py +0 -365
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/supervisor.py +0 -186
- meshcode-2.11.64/meshcode-tasks-wt/meshcode/upload.py +0 -125
- meshcode-2.11.64/meshcode-tasks-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_core.py +0 -216
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_exceptions.py +0 -107
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_security_regressions.py +0 -171
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_sentinel.py +0 -148
- meshcode-2.11.64/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -231
- meshcode-2.11.64/meshcode.egg-info/SOURCES.txt +0 -250
- meshcode-2.11.64/meshcode.egg-info/top_level.txt +0 -4
- meshcode-2.11.64/tests/test_autonomous_prompt_inject 2.py +0 -126
- meshcode-2.11.64/tests/test_autonomous_prompt_inject 3.py +0 -126
- meshcode-2.11.64/tests/test_autonomous_prompt_inject 4.py +0 -126
- meshcode-2.11.64/tests/test_autonomous_prompt_inject 5.py +0 -126
- meshcode-2.11.64/tests/test_core.py +0 -216
- meshcode-2.11.64/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.64/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.64/tests/test_exceptions.py +0 -107
- meshcode-2.11.64/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.64/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.64/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.64/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.64/tests/test_security_regressions.py +0 -171
- meshcode-2.11.64/tests/test_sentinel.py +0 -148
- meshcode-2.11.64/tests/test_status_enum_coverage.py +0 -231
- {meshcode-2.11.64 → meshcode-2.11.66}/README.md +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/__main__.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/cli.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/compat.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/daemon.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/doctor.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/invites.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/launcher.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/preferences.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/secrets.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/self_update.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode/up.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/meshcode/upload.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/setup.cfg +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_core.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_doctor.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.64/meshcode-backend-wt → meshcode-2.11.66}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.64 → meshcode-2.11.66}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -252,11 +252,24 @@ def _do_recycles(api_key: str, host_id: str) -> int:
|
|
|
252
252
|
continue # task boundary only — never mid-task
|
|
253
253
|
if (now - first) >= float(value) * 3600.0:
|
|
254
254
|
_log(f"RECYCLE {proj}/{agent} (uptime {(now-first)/3600:.1f}h >= {value}h)")
|
|
255
|
-
|
|
255
|
+
# Server-authorized clean-exit (task 548c863e, mig 364): SIGNAL the
|
|
256
|
+
# recycle instead of spawning. A direct _spawn_agent here duplicates
|
|
257
|
+
# the still-alive process. mc_request_recycle sets a flag; the
|
|
258
|
+
# agent's wait-loop consumes it, returns must_exit/reason=recycle,
|
|
259
|
+
# exits CLEAN (Stop-hook writes the handoff), then the respawn path
|
|
260
|
+
# (_do_respawns) relaunches it fresh. Recorded via mc_record_recycle
|
|
261
|
+
# so it's NEVER counted against the crash respawn cap.
|
|
262
|
+
req = _rpc("mc_request_recycle",
|
|
263
|
+
{"p_api_key": api_key, "p_project_id": a.get("project_id"), "p_agent_name": agent})
|
|
264
|
+
if req and req.get("ok") and req.get("requested"):
|
|
256
265
|
_rpc("mc_record_recycle",
|
|
257
266
|
{"p_api_key": api_key, "p_project_id": a.get("project_id"), "p_agent_name": agent})
|
|
258
|
-
st[key] = now # reset clock after recycle
|
|
267
|
+
st[key] = now # reset clock after signaling recycle
|
|
259
268
|
n += 1
|
|
269
|
+
elif req and req.get("ok") and not req.get("requested"):
|
|
270
|
+
# Agent flipped busy between the roster read and the request —
|
|
271
|
+
# skip; retry next sweep at the next task boundary.
|
|
272
|
+
_log(f"SKIP recycle {proj}/{agent}: {req.get('reason','not_requested')}")
|
|
260
273
|
# prune state for agents no longer managed on this host
|
|
261
274
|
for k in [k for k in st if k not in seen]:
|
|
262
275
|
st.pop(k, None)
|
|
@@ -3372,6 +3372,33 @@ def _get_pending_tasks_summary() -> Optional[List[Dict[str, str]]]:
|
|
|
3372
3372
|
return None
|
|
3373
3373
|
|
|
3374
3374
|
|
|
3375
|
+
def _check_recycle_request() -> bool:
|
|
3376
|
+
"""Server-authorized recycle (task 548c863e, mig 364).
|
|
3377
|
+
|
|
3378
|
+
The hostd daemon sets mc_agents.recycle_requested_at at a TASK BOUNDARY
|
|
3379
|
+
when an agent exceeds its uptime-recycle policy. This consumes the flag
|
|
3380
|
+
(atomic read+clear via mc_consume_recycle — fires exactly once) so the
|
|
3381
|
+
wait-loop can return must_exit=True/reason=recycle a single time. The
|
|
3382
|
+
agent then exits CLEAN (its Stop-hook writes the handoff; the
|
|
3383
|
+
stay_on_loop hook already releases on must_exit=True), and the respawn
|
|
3384
|
+
path (mc_agents_needing_respawn → hostd._do_respawns) relaunches it fresh
|
|
3385
|
+
with that handoff — no duplicate process, no hard-kill, no lost state.
|
|
3386
|
+
Best-effort: any failure returns False (never blocks the loop).
|
|
3387
|
+
"""
|
|
3388
|
+
try:
|
|
3389
|
+
api_key = _get_api_key()
|
|
3390
|
+
if not api_key:
|
|
3391
|
+
return False
|
|
3392
|
+
resp = be.sb_rpc("mc_consume_recycle", {
|
|
3393
|
+
"p_api_key": api_key,
|
|
3394
|
+
"p_project_id": _PROJECT_ID,
|
|
3395
|
+
"p_agent_name": AGENT_NAME,
|
|
3396
|
+
})
|
|
3397
|
+
return bool(isinstance(resp, dict) and resp.get("ok") and resp.get("recycle"))
|
|
3398
|
+
except Exception:
|
|
3399
|
+
return False
|
|
3400
|
+
|
|
3401
|
+
|
|
3375
3402
|
def _try_auto_claim_self_assigned_tasks(max_claims: int = 20) -> List[Dict[str, str]]:
|
|
3376
3403
|
"""URGENT_RUNTIME_FIX_TASK_PULL (Samuel directive 2026-05-26T04:20Z msg
|
|
3377
3404
|
a15d7ed4 + commander msg 0cfca3f3 AUTOCLAIM_ON_RECONNECT): claim every
|
|
@@ -4031,6 +4058,13 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
|
|
|
4031
4058
|
# surface autonomy on the refused-path too so check
|
|
4032
4059
|
# parity holds when wait short-circuits on unread msgs.
|
|
4033
4060
|
resp["you_are_autonomous"] = _get_autonomous_mode()
|
|
4061
|
+
# c0ab14c1 Phase 2: time-awareness on the wait delivery path.
|
|
4062
|
+
try:
|
|
4063
|
+
_pa = _promise_awareness(_get_api_key())
|
|
4064
|
+
if _pa:
|
|
4065
|
+
resp["time_awareness"] = _pa
|
|
4066
|
+
except Exception:
|
|
4067
|
+
pass
|
|
4034
4068
|
return resp
|
|
4035
4069
|
# Ack-only batch — fall through to wait loop
|
|
4036
4070
|
except Exception:
|
|
@@ -4071,6 +4105,21 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
|
|
|
4071
4105
|
if result.get("timed_out"):
|
|
4072
4106
|
_CONSECUTIVE_IDLE_SECONDS += capped_timeout
|
|
4073
4107
|
|
|
4108
|
+
# Server-authorized recycle (task 548c863e): the daemon flagged
|
|
4109
|
+
# us for uptime-recycle at a task boundary. Exit CLEAN now so
|
|
4110
|
+
# the Stop-hook persists a handoff and the respawn path relaunches
|
|
4111
|
+
# us fresh. Checked BEFORE pending_tasks: the fresh session
|
|
4112
|
+
# re-attacks any open tasks on boot, so an outstanding backlog
|
|
4113
|
+
# must not pin a stale, context-heavy session alive.
|
|
4114
|
+
if _check_recycle_request():
|
|
4115
|
+
_set_state("sleeping", "recycle")
|
|
4116
|
+
result["must_exit"] = True
|
|
4117
|
+
result["exit_reason"] = (
|
|
4118
|
+
"recycle authorized — set status=sleeping and END the session now; "
|
|
4119
|
+
"hostd will relaunch you fresh with your handoff (do NOT meshcode_wait again)")
|
|
4120
|
+
result["recycle"] = True
|
|
4121
|
+
break
|
|
4122
|
+
|
|
4074
4123
|
# Check if new tasks appeared while we waited
|
|
4075
4124
|
pending_tasks = _get_pending_tasks_summary()
|
|
4076
4125
|
if pending_tasks:
|
|
@@ -5785,6 +5834,16 @@ def meshcode_boot() -> Dict[str, Any]:
|
|
|
5785
5834
|
# Non-fatal: surface that the hints are unavailable but boot succeeds.
|
|
5786
5835
|
resp.setdefault("time_context_available", False)
|
|
5787
5836
|
|
|
5837
|
+
# c0ab14c1 Phase 2: open-promise time-awareness (what I owe / what I'm
|
|
5838
|
+
# waiting on, with overdue/elapsed minutes). Soft-fail; only added when
|
|
5839
|
+
# there's something open.
|
|
5840
|
+
try:
|
|
5841
|
+
_pa = _promise_awareness(api_key)
|
|
5842
|
+
if _pa:
|
|
5843
|
+
resp["time_awareness"] = _pa
|
|
5844
|
+
except Exception:
|
|
5845
|
+
pass
|
|
5846
|
+
|
|
5788
5847
|
return resp
|
|
5789
5848
|
|
|
5790
5849
|
|
|
@@ -6219,6 +6278,215 @@ def meshcode_remember(
|
|
|
6219
6278
|
return result
|
|
6220
6279
|
|
|
6221
6280
|
|
|
6281
|
+
# ----------------- TIME-AWARE PROMISES / EXPECTATIONS (anti-stalemate) -----------------
|
|
6282
|
+
# Task c0ab14c1. Backend substrate = mc_promises + mig 371 backoff/re-nudge sweep +
|
|
6283
|
+
# mig 372 mc_promises_involving. Semantics: agent_name = RESPONSIBLE party (who must
|
|
6284
|
+
# act); to_target = waiter. When an ETA passes unfulfilled the server proactively
|
|
6285
|
+
# nudges the RESPONSIBLE agent (backoff/mute), escalates mutual deadlocks to the
|
|
6286
|
+
# commander, and routes cross-mesh overdue to the commander. Phase-1 server-side
|
|
6287
|
+
# parser already auto-captures explicit ETAs from messages; these tools make it
|
|
6288
|
+
# explicit + deterministic.
|
|
6289
|
+
|
|
6290
|
+
def _promise_expires_iso(eta_minutes: int) -> Optional[str]:
|
|
6291
|
+
"""now()+eta as ISO-8601 UTC. Returns None if eta is out of the 1..1440 horizon."""
|
|
6292
|
+
if not isinstance(eta_minutes, int) or eta_minutes < 1 or eta_minutes > 1440:
|
|
6293
|
+
return None
|
|
6294
|
+
from datetime import datetime as _dt, timezone as _tz, timedelta as _td
|
|
6295
|
+
return (_dt.now(_tz.utc) + _td(minutes=eta_minutes)).isoformat()
|
|
6296
|
+
|
|
6297
|
+
|
|
6298
|
+
def _promise_awareness(api_key: str) -> Optional[Dict[str, Any]]:
|
|
6299
|
+
"""Compact time-awareness block for boot/wait payloads: what I owe + what I'm
|
|
6300
|
+
waiting on, with overdue/elapsed minutes. None when there's nothing open."""
|
|
6301
|
+
try:
|
|
6302
|
+
r = be.sb_rpc("mc_promises_involving", {
|
|
6303
|
+
"p_api_key": api_key,
|
|
6304
|
+
"p_agent_name": AGENT_NAME,
|
|
6305
|
+
})
|
|
6306
|
+
except Exception:
|
|
6307
|
+
return None
|
|
6308
|
+
if not isinstance(r, dict) or not r.get("ok"):
|
|
6309
|
+
return None
|
|
6310
|
+
owe = r.get("i_owe") or []
|
|
6311
|
+
waiting = r.get("waiting_on") or []
|
|
6312
|
+
if not owe and not waiting:
|
|
6313
|
+
return None
|
|
6314
|
+
return {
|
|
6315
|
+
"i_owe": owe,
|
|
6316
|
+
"waiting_on": waiting,
|
|
6317
|
+
"overdue_i_owe": sum(1 for p in owe if isinstance(p, dict) and p.get("overdue")),
|
|
6318
|
+
"overdue_waiting_on": sum(1 for p in waiting if isinstance(p, dict) and p.get("overdue")),
|
|
6319
|
+
"hint": "Act on overdue items you owe; for items you're waiting on, the server is already nudging the responsible agent. meshcode_fulfill(promise_id) when done.",
|
|
6320
|
+
}
|
|
6321
|
+
|
|
6322
|
+
|
|
6323
|
+
@mcp.tool()
|
|
6324
|
+
@with_working_status
|
|
6325
|
+
def meshcode_promise(to: str, what: str, eta_minutes: int) -> Dict[str, Any]:
|
|
6326
|
+
"""Register a time-bound commitment YOU are responsible for: "I'll do <what>
|
|
6327
|
+
for <to> within <eta_minutes>". If the ETA passes unfulfilled, the server
|
|
6328
|
+
proactively pings YOU (exponential backoff, auto-mutes) so nothing stalls
|
|
6329
|
+
waiting on you. Call meshcode_fulfill(promise_id) when done.
|
|
6330
|
+
|
|
6331
|
+
Use this whenever you tell another agent an ETA. Horizon cap = 24h
|
|
6332
|
+
(1440 min) — for longer commitments create a task instead.
|
|
6333
|
+
|
|
6334
|
+
Args:
|
|
6335
|
+
to: the agent you're committing to (the waiter / beneficiary).
|
|
6336
|
+
what: short description of what you'll deliver.
|
|
6337
|
+
eta_minutes: minutes from now until you expect to deliver (1..1440).
|
|
6338
|
+
"""
|
|
6339
|
+
if not to or not to.strip():
|
|
6340
|
+
return {"ok": False, "error": "to (recipient agent) is required"}
|
|
6341
|
+
if not what or not what.strip():
|
|
6342
|
+
return {"ok": False, "error": "what (promise text) is required"}
|
|
6343
|
+
expires = _promise_expires_iso(eta_minutes)
|
|
6344
|
+
if expires is None:
|
|
6345
|
+
return {"ok": False, "error": "eta_minutes must be an integer 1..1440 (24h); use a task for longer"}
|
|
6346
|
+
return be.sb_rpc("mc_record_promise", {
|
|
6347
|
+
"p_api_key": _get_api_key(),
|
|
6348
|
+
"p_to_target": to.strip(),
|
|
6349
|
+
"p_text": what.strip(),
|
|
6350
|
+
"p_expires_at": expires,
|
|
6351
|
+
"p_source_msg_id": None,
|
|
6352
|
+
"p_agent_name": AGENT_NAME, # responsible = me
|
|
6353
|
+
})
|
|
6354
|
+
|
|
6355
|
+
|
|
6356
|
+
@mcp.tool()
|
|
6357
|
+
@with_working_status
|
|
6358
|
+
def meshcode_expect(of: str, what: str, eta_minutes: int) -> Dict[str, Any]:
|
|
6359
|
+
"""Register that you are WAITING on another agent: "<of> will do <what>
|
|
6360
|
+
within <eta_minutes>". If it doesn't happen in time, the server nudges
|
|
6361
|
+
<of> (the RESPONSIBLE agent) — not you. This is the anti-stalemate path:
|
|
6362
|
+
use it whenever you're blocked on someone else (e.g. "you push first, then
|
|
6363
|
+
I deploy"). Cancel with meshcode_fulfill(promise_id) once they deliver.
|
|
6364
|
+
|
|
6365
|
+
Args:
|
|
6366
|
+
of: the agent you're waiting on (the responsible party).
|
|
6367
|
+
what: short description of what you expect them to do.
|
|
6368
|
+
eta_minutes: minutes from now you expect it by (1..1440).
|
|
6369
|
+
"""
|
|
6370
|
+
if not of or not of.strip():
|
|
6371
|
+
return {"ok": False, "error": "of (agent you're waiting on) is required"}
|
|
6372
|
+
if not what or not what.strip():
|
|
6373
|
+
return {"ok": False, "error": "what (expectation text) is required"}
|
|
6374
|
+
expires = _promise_expires_iso(eta_minutes)
|
|
6375
|
+
if expires is None:
|
|
6376
|
+
return {"ok": False, "error": "eta_minutes must be an integer 1..1440 (24h); use a task for longer"}
|
|
6377
|
+
# responsible = `of`; waiter = me. Server nudges `of` when overdue.
|
|
6378
|
+
return be.sb_rpc("mc_record_promise", {
|
|
6379
|
+
"p_api_key": _get_api_key(),
|
|
6380
|
+
"p_to_target": AGENT_NAME,
|
|
6381
|
+
"p_text": what.strip(),
|
|
6382
|
+
"p_expires_at": expires,
|
|
6383
|
+
"p_source_msg_id": None,
|
|
6384
|
+
"p_agent_name": of.strip(), # responsible = the other agent
|
|
6385
|
+
})
|
|
6386
|
+
|
|
6387
|
+
|
|
6388
|
+
@mcp.tool()
|
|
6389
|
+
@with_working_status
|
|
6390
|
+
def meshcode_fulfill(promise_id: str) -> Dict[str, Any]:
|
|
6391
|
+
"""Mark a promise/expectation fulfilled — stops all follow-up nudges
|
|
6392
|
+
immediately. Call this the moment the committed work is delivered (or the
|
|
6393
|
+
thing you were waiting on arrives).
|
|
6394
|
+
|
|
6395
|
+
Args:
|
|
6396
|
+
promise_id: the id returned by meshcode_promise / meshcode_expect (or
|
|
6397
|
+
surfaced in a promise_overdue nudge or the boot/wait time_awareness block).
|
|
6398
|
+
"""
|
|
6399
|
+
if not promise_id or not str(promise_id).strip():
|
|
6400
|
+
return {"ok": False, "error": "promise_id is required"}
|
|
6401
|
+
return be.sb_rpc("mc_fulfill_promise", {
|
|
6402
|
+
"p_api_key": _get_api_key(),
|
|
6403
|
+
"p_promise_id": str(promise_id).strip(),
|
|
6404
|
+
})
|
|
6405
|
+
|
|
6406
|
+
|
|
6407
|
+
# ----------------- PENDING APPROVALS (flagship: GO/no-go gate) -----------------
|
|
6408
|
+
# Task bb396c9b. The agent asks for a GO/no-go before a gated action; a human (or an
|
|
6409
|
+
# autonomous commander) approves/rejects with one button in the dashboard panel.
|
|
6410
|
+
# AUTO-APPROVE: if the project commander is in autonomous_mode AND the action is NOT
|
|
6411
|
+
# destructive, mc_request_approval auto-approves at creation. SAFETY FLOOR: a
|
|
6412
|
+
# destructive/irreversible action ALWAYS escalates to a human, even in autonomous mode.
|
|
6413
|
+
|
|
6414
|
+
_APPROVAL_RISK = ("low", "medium", "high", "critical")
|
|
6415
|
+
_APPROVAL_ACTIONS = ("push", "ddl", "deploy", "send", "task_complete", "custom")
|
|
6416
|
+
|
|
6417
|
+
|
|
6418
|
+
@mcp.tool()
|
|
6419
|
+
@with_working_status
|
|
6420
|
+
def meshcode_request_approval(
|
|
6421
|
+
title: str,
|
|
6422
|
+
detail: Optional[str] = None,
|
|
6423
|
+
risk_level: str = "medium",
|
|
6424
|
+
action_type: str = "custom",
|
|
6425
|
+
is_destructive: bool = False,
|
|
6426
|
+
context: Optional[Dict[str, Any]] = None,
|
|
6427
|
+
timeout_seconds: int = 1800,
|
|
6428
|
+
) -> Dict[str, Any]:
|
|
6429
|
+
"""Request a human/commander GO-no-go approval before a gated action, then BLOCK
|
|
6430
|
+
until it's resolved. Use before anything risky/outward-facing you want a human to
|
|
6431
|
+
confirm (prod DDL, deploy, force-push, external send, spending money, etc.).
|
|
6432
|
+
|
|
6433
|
+
Auto-approves instantly IF the project's commander is in autonomous_mode AND the
|
|
6434
|
+
action is NOT destructive. A destructive/irreversible action ALWAYS waits for a
|
|
6435
|
+
human, even under autonomous_mode (safety floor).
|
|
6436
|
+
|
|
6437
|
+
Args:
|
|
6438
|
+
title: short one-line summary of what you want to do (shown as the panel row).
|
|
6439
|
+
detail: optional markdown detail (the diff/command/plan/target).
|
|
6440
|
+
risk_level: 'low' | 'med' | 'high'.
|
|
6441
|
+
action_type: 'push' | 'ddl' | 'deploy' | 'send' | 'task_complete' | 'custom'.
|
|
6442
|
+
is_destructive: True for irreversible/destructive actions (always human-gated).
|
|
6443
|
+
context: optional jsonb context (diff, command, target ids).
|
|
6444
|
+
timeout_seconds: how long to block waiting for the decision (default 1800).
|
|
6445
|
+
|
|
6446
|
+
Returns: {ok, approval_id, decision: 'approved'|'rejected'|'expired'|'timeout',
|
|
6447
|
+
auto_approved: bool, resolved_by?}.
|
|
6448
|
+
"""
|
|
6449
|
+
if not title or not title.strip():
|
|
6450
|
+
return {"ok": False, "error": "title is required"}
|
|
6451
|
+
if risk_level not in _APPROVAL_RISK:
|
|
6452
|
+
return {"ok": False, "error": f"risk_level must be one of {_APPROVAL_RISK}"}
|
|
6453
|
+
if action_type not in _APPROVAL_ACTIONS:
|
|
6454
|
+
return {"ok": False, "error": f"action_type must be one of {_APPROVAL_ACTIONS}"}
|
|
6455
|
+
api_key = _get_api_key()
|
|
6456
|
+
created = be.sb_rpc("mc_request_approval", {
|
|
6457
|
+
"p_api_key": api_key,
|
|
6458
|
+
"p_title": title.strip(),
|
|
6459
|
+
"p_detail": (detail or None),
|
|
6460
|
+
"p_risk_level": risk_level,
|
|
6461
|
+
"p_action_type": action_type,
|
|
6462
|
+
"p_is_destructive": bool(is_destructive),
|
|
6463
|
+
"p_context": context if isinstance(context, dict) else None,
|
|
6464
|
+
})
|
|
6465
|
+
if not isinstance(created, dict) or not created.get("ok"):
|
|
6466
|
+
return created if isinstance(created, dict) else {"ok": False, "error": "create_failed"}
|
|
6467
|
+
approval_id = created.get("approval_id")
|
|
6468
|
+
status = created.get("status")
|
|
6469
|
+
# Auto-approved at creation (autonomous commander, non-destructive) -> return now.
|
|
6470
|
+
if status in ("approved", "auto_approved"):
|
|
6471
|
+
return {"ok": True, "approval_id": approval_id, "decision": status,
|
|
6472
|
+
"auto_approved": (status == "auto_approved"), "resolved_by": created.get("resolved_by")}
|
|
6473
|
+
if status in ("rejected", "expired"):
|
|
6474
|
+
return {"ok": True, "approval_id": approval_id, "decision": status, "auto_approved": False}
|
|
6475
|
+
# Pending -> block-poll until resolved / expired / timeout.
|
|
6476
|
+
import time as _time
|
|
6477
|
+
deadline = _time.monotonic() + max(30, int(timeout_seconds))
|
|
6478
|
+
while _time.monotonic() < deadline:
|
|
6479
|
+
_time.sleep(4)
|
|
6480
|
+
st = be.sb_rpc("mc_approval_status", {"p_api_key": api_key, "p_approval_id": approval_id})
|
|
6481
|
+
if isinstance(st, dict) and st.get("ok"):
|
|
6482
|
+
cur = st.get("status")
|
|
6483
|
+
if cur in ("approved", "auto_approved", "rejected", "expired"):
|
|
6484
|
+
return {"ok": True, "approval_id": approval_id, "decision": cur,
|
|
6485
|
+
"auto_approved": False, "resolved_by": st.get("resolved_by")}
|
|
6486
|
+
return {"ok": True, "approval_id": approval_id, "decision": "timeout", "auto_approved": False,
|
|
6487
|
+
"hint": "still pending; re-check with the panel or call again"}
|
|
6488
|
+
|
|
6489
|
+
|
|
6222
6490
|
@mcp.tool()
|
|
6223
6491
|
@with_working_status
|
|
6224
6492
|
def meshcode_seed_fixture(
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
meshcode/__init__.py
|
|
4
|
+
meshcode/__main__.py
|
|
5
|
+
meshcode/_stop_hook_template.py
|
|
6
|
+
meshcode/ascii_art.py
|
|
7
|
+
meshcode/atomic_push.py
|
|
8
|
+
meshcode/claude_update.py
|
|
9
|
+
meshcode/cli.py
|
|
10
|
+
meshcode/comms_v4.py
|
|
11
|
+
meshcode/compat.py
|
|
12
|
+
meshcode/daemon.py
|
|
13
|
+
meshcode/date_parse.py
|
|
14
|
+
meshcode/doctor.py
|
|
15
|
+
meshcode/error_hints.py
|
|
16
|
+
meshcode/exceptions.py
|
|
17
|
+
meshcode/hostd.py
|
|
18
|
+
meshcode/invites.py
|
|
19
|
+
meshcode/launcher.py
|
|
20
|
+
meshcode/launcher_install.py
|
|
21
|
+
meshcode/preferences.py
|
|
22
|
+
meshcode/protocol_handler.py
|
|
23
|
+
meshcode/protocol_v2.py
|
|
24
|
+
meshcode/quickstart.py
|
|
25
|
+
meshcode/rpc_allowlist.py
|
|
26
|
+
meshcode/run_agent.py
|
|
27
|
+
meshcode/secrets.py
|
|
28
|
+
meshcode/self_update.py
|
|
29
|
+
meshcode/setup_clients.py
|
|
30
|
+
meshcode/supervisor.py
|
|
31
|
+
meshcode/up.py
|
|
32
|
+
meshcode/upload.py
|
|
33
|
+
meshcode.egg-info/PKG-INFO
|
|
34
|
+
meshcode.egg-info/SOURCES.txt
|
|
35
|
+
meshcode.egg-info/dependency_links.txt
|
|
36
|
+
meshcode.egg-info/entry_points.txt
|
|
37
|
+
meshcode.egg-info/requires.txt
|
|
38
|
+
meshcode.egg-info/top_level.txt
|
|
39
|
+
meshcode/meshcode_mcp/__init__.py
|
|
40
|
+
meshcode/meshcode_mcp/__main__.py
|
|
41
|
+
meshcode/meshcode_mcp/backend.py
|
|
42
|
+
meshcode/meshcode_mcp/realtime.py
|
|
43
|
+
meshcode/meshcode_mcp/server.py
|
|
44
|
+
meshcode/meshcode_mcp/sleep_signals.py
|
|
45
|
+
meshcode/meshcode_mcp/test_backend.py
|
|
46
|
+
meshcode/meshcode_mcp/test_boot_timing.py
|
|
47
|
+
meshcode/meshcode_mcp/test_install_guard.py
|
|
48
|
+
meshcode/meshcode_mcp/test_prefs_claude_version.py
|
|
49
|
+
meshcode/meshcode_mcp/test_realtime.py
|
|
50
|
+
meshcode/meshcode_mcp/test_server_wrapper.py
|
|
51
|
+
meshcode/scripts/check_secrets.py
|
|
52
|
+
meshcode/scripts/race_rate_harness.py
|
|
53
|
+
tests/test_auto_update_hardening.py
|
|
54
|
+
tests/test_autonomous_closegap_1.py
|
|
55
|
+
tests/test_autonomous_closegap_2.py
|
|
56
|
+
tests/test_autonomous_closegap_3.py
|
|
57
|
+
tests/test_autonomous_prompt_inject.py
|
|
58
|
+
tests/test_boot_bug_regression.py
|
|
59
|
+
tests/test_color_truecolor.py
|
|
60
|
+
tests/test_core.py
|
|
61
|
+
tests/test_cross_agent_messaging.py
|
|
62
|
+
tests/test_date_parse.py
|
|
63
|
+
tests/test_doctor.py
|
|
64
|
+
tests/test_epistemic_v1_python_sdk.py
|
|
65
|
+
tests/test_epistemic_v1_stop_conditions.py
|
|
66
|
+
tests/test_esc_deaf_state.py
|
|
67
|
+
tests/test_exceptions.py
|
|
68
|
+
tests/test_file_upload.py
|
|
69
|
+
tests/test_init_device_code.py
|
|
70
|
+
tests/test_install_guard.py
|
|
71
|
+
tests/test_lease_sigterm_release.py
|
|
72
|
+
tests/test_mark_read_batch.py
|
|
73
|
+
tests/test_marketplace_ratings.py
|
|
74
|
+
tests/test_migration_integrity.py
|
|
75
|
+
tests/test_realtime_event_freshness.py
|
|
76
|
+
tests/test_rls_cross_tenant.py
|
|
77
|
+
tests/test_rpc_grants.py
|
|
78
|
+
tests/test_rpc_migrations.py
|
|
79
|
+
tests/test_run_agent_dry_run.py
|
|
80
|
+
tests/test_run_agent_no_server_import.py
|
|
81
|
+
tests/test_security_regressions.py
|
|
82
|
+
tests/test_self_update_user_site.py
|
|
83
|
+
tests/test_sentinel.py
|
|
84
|
+
tests/test_setup_path.py
|
|
85
|
+
tests/test_sleep_signals.py
|
|
86
|
+
tests/test_status_enum_coverage.py
|
|
87
|
+
tests/test_stay_on_loop_hook.py
|
|
88
|
+
tests/test_wait_open_tasks_contradiction.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
meshcode
|