meshcode 2.11.27__tar.gz → 2.11.28__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.
Files changed (231) hide show
  1. {meshcode-2.11.27 → meshcode-2.11.28}/PKG-INFO +1 -1
  2. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/server.py +12 -0
  4. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.27 → meshcode-2.11.28}/pyproject.toml +1 -1
  6. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_auto_update_hardening.py +58 -1
  7. {meshcode-2.11.27 → meshcode-2.11.28}/README.md +0 -0
  8. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/__main__.py +0 -0
  9. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/_stop_hook_template.py +0 -0
  10. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/ascii_art.py +0 -0
  11. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/atomic_push.py +0 -0
  12. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/cli.py +0 -0
  13. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/comms_v4.py +0 -0
  14. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/compat.py +0 -0
  15. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/daemon.py +0 -0
  16. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/date_parse.py +0 -0
  17. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/doctor.py +0 -0
  18. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/error_hints.py +0 -0
  19. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/exceptions.py +0 -0
  20. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/invites.py +0 -0
  21. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/launcher.py +0 -0
  22. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/launcher_install.py +0 -0
  23. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/__init__.py +0 -0
  24. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/__main__.py +0 -0
  25. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/backend.py +0 -0
  26. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/realtime.py +0 -0
  27. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  28. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_backend.py +0 -0
  29. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  30. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  31. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  32. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  33. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  34. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/preferences.py +0 -0
  35. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/protocol_handler.py +0 -0
  36. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/protocol_v2.py +0 -0
  37. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/quickstart.py +0 -0
  38. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/rpc_allowlist.py +0 -0
  39. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/run_agent.py +0 -0
  40. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/scripts/check_secrets.py +0 -0
  41. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/scripts/race_rate_harness.py +0 -0
  42. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/secrets.py +0 -0
  43. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/self_update.py +0 -0
  44. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/setup_clients.py +0 -0
  45. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/supervisor.py +0 -0
  46. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/upload.py +0 -0
  47. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/comms_v4.py +0 -0
  48. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  49. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  50. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/cli.py +0 -0
  51. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  52. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/compat.py +0 -0
  53. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  54. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  55. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/invites.py +0 -0
  56. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  57. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  58. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  59. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  60. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  61. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  62. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  63. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  64. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  65. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  66. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  67. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  68. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  69. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  70. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  71. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  72. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  73. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  74. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/upload.py +0 -0
  75. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  76. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_core.py +0 -0
  77. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  78. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  79. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  80. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  81. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  82. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  83. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  84. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  85. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  86. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  87. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  88. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  89. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  90. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  91. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  92. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  93. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  94. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  95. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  96. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  97. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  98. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  99. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  100. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  101. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  102. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  103. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  104. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  105. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  106. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  107. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  108. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  109. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  110. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  111. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  112. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  113. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  114. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  115. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/comms_v4.py +0 -0
  116. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  117. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  118. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/cli.py +0 -0
  119. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  120. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/compat.py +0 -0
  121. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  122. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  123. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/invites.py +0 -0
  124. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  125. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  126. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  127. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  128. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  129. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  130. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  131. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  132. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  133. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  134. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  135. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  136. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  137. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  138. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  139. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  140. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  141. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  142. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/upload.py +0 -0
  143. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  144. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_core.py +0 -0
  145. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  146. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  147. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  148. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  149. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  150. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  151. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  152. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  153. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  154. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  155. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  156. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/comms_v4.py +0 -0
  157. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  158. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  159. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  160. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  161. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  162. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  163. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  164. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  165. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  166. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  167. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  168. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  169. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  170. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  171. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  172. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  173. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  174. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  175. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  176. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  177. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  178. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  179. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  180. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  181. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  182. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  183. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  184. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  185. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_core.py +0 -0
  186. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  187. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  188. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  189. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  190. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  191. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  192. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  193. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  194. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  195. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  196. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  197. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/SOURCES.txt +0 -0
  198. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/dependency_links.txt +0 -0
  199. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/entry_points.txt +0 -0
  200. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/requires.txt +0 -0
  201. {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/top_level.txt +0 -0
  202. {meshcode-2.11.27 → meshcode-2.11.28}/setup.cfg +0 -0
  203. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_boot_bug_regression.py +0 -0
  204. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_color_truecolor.py +0 -0
  205. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_core.py +0 -0
  206. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_cross_agent_messaging.py +0 -0
  207. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_date_parse.py +0 -0
  208. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_doctor.py +0 -0
  209. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_epistemic_v1_python_sdk.py +0 -0
  210. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  211. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_esc_deaf_state.py +0 -0
  212. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_exceptions.py +0 -0
  213. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_init_device_code.py +0 -0
  214. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_install_guard.py +0 -0
  215. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_lease_sigterm_release.py +0 -0
  216. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_mark_read_batch.py +0 -0
  217. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_migration_integrity.py +0 -0
  218. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_realtime_event_freshness.py +0 -0
  219. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_rls_cross_tenant.py +0 -0
  220. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_rpc_grants.py +0 -0
  221. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_rpc_migrations.py +0 -0
  222. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_run_agent_dry_run.py +0 -0
  223. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_run_agent_no_server_import.py +0 -0
  224. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_security_regressions.py +0 -0
  225. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_self_update_user_site.py +0 -0
  226. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_sentinel.py +0 -0
  227. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_setup_path.py +0 -0
  228. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_sleep_signals.py +0 -0
  229. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_status_enum_coverage.py +0 -0
  230. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_stay_on_loop_hook.py +0 -0
  231. {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_wait_open_tasks_contradiction.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.27
3
+ Version: 2.11.28
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -1,5 +1,5 @@
1
1
  """MeshCode — Real-time communication between AI agents."""
2
- __version__ = "2.11.27"
2
+ __version__ = "2.11.28"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -6104,6 +6104,18 @@ def _auto_update() -> None:
6104
6104
  # legitimate upgrade check. Per task 8d5eed7a.
6105
6105
  os.environ.pop("MESHCODE_UPDATED", None)
6106
6106
  return
6107
+ # MCP-serve guard: this function runs synchronously at the top of
6108
+ # run_server(), BEFORE FastMCP starts serving JSON-RPC. A blocking
6109
+ # `pip install --upgrade` (timeout 60s) here easily blows Claude
6110
+ # Code's MCP handshake window (~5s) — tools never register and the
6111
+ # agent boots into "MCP tools not available". The CLI-side
6112
+ # self_update.py (spawned by `meshcode go` before execv into the
6113
+ # editor) already handles user-facing upgrades; in MCP serve context
6114
+ # we should never block the handshake to chase a newer version.
6115
+ # Detected via the MESHCODE_MCP_SERVE=1 sentinel set in __main__.py.
6116
+ if os.environ.get("MESHCODE_MCP_SERVE") == "1":
6117
+ log.debug("[meshcode] Auto-update skipped in MCP serve subprocess (CLI handles upgrades)")
6118
+ return
6107
6119
 
6108
6120
  # Time-gate (task c0e7de87, 2026-05-19): the PyPI HEAD GET below has a 3s
6109
6121
  # timeout (line ~5430) and pip-install another 60s. Hammering PyPI on
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.27
3
+ Version: 2.11.28
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meshcode"
7
- version = "2.11.27"
7
+ version = "2.11.28"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -37,12 +37,18 @@ def _check_boot_version_drift_inline():
37
37
 
38
38
 
39
39
  def _auto_update_inline_skeleton():
40
- """Subset of _auto_update covering the env-var gates only."""
40
+ """Subset of _auto_update covering the env-var gates only.
41
+
42
+ Order matters: the MCP-serve gate must fire BEFORE any network /
43
+ pip work so the MCP handshake window is never blocked.
44
+ """
41
45
  if os.environ.get("MESHCODE_AUTO_UPDATE", "1").lower() in ("0", "false", "no"):
42
46
  return "disabled"
43
47
  if os.environ.get("MESHCODE_UPDATED") == "1":
44
48
  os.environ.pop("MESHCODE_UPDATED", None)
45
49
  return "post_exec_skip"
50
+ if os.environ.get("MESHCODE_MCP_SERVE") == "1":
51
+ return "mcp_serve_skip"
46
52
  return "would_check_pypi"
47
53
 
48
54
 
@@ -114,6 +120,57 @@ def test_auto_update_disabled_case_variants(monkeypatch):
114
120
  assert _auto_update_inline_skeleton() == "disabled", f"value {val!r} failed"
115
121
 
116
122
 
123
+ # ---------------------------------------------------------------------------
124
+ # 3b. MCP-serve gate (added 2026-05-20 / 2.11.28)
125
+ #
126
+ # Symptom: right after publishing 2.11.27, commander agents booted with
127
+ # "MCP meshcode tools are not available" — first-turn deferred-tools list
128
+ # missing all meshcode_* tools. RC: _auto_update runs synchronously at the
129
+ # top of run_server() and does a blocking `pip install --upgrade` (60s
130
+ # timeout). When PyPI advertises a newer version, the install easily
131
+ # exceeds Claude Code's ~5s MCP handshake window and tools never register.
132
+ # Fix: skip _auto_update entirely when MESHCODE_MCP_SERVE=1; the CLI's
133
+ # self_update.py handles user-facing upgrades before execv.
134
+ # ---------------------------------------------------------------------------
135
+
136
+ def test_mcp_serve_sentinel_skips_update(monkeypatch):
137
+ monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
138
+ monkeypatch.delenv("MESHCODE_AUTO_UPDATE", raising=False)
139
+ monkeypatch.delenv("MESHCODE_UPDATED", raising=False)
140
+ assert _auto_update_inline_skeleton() == "mcp_serve_skip"
141
+
142
+
143
+ def test_mcp_serve_gate_runs_before_pypi(monkeypatch):
144
+ """MCP-serve gate must short-circuit before any 'would_check_pypi'
145
+ branch fires — otherwise the gate is moot because the slow path
146
+ runs anyway."""
147
+ monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
148
+ monkeypatch.delenv("MESHCODE_AUTO_UPDATE", raising=False)
149
+ monkeypatch.delenv("MESHCODE_UPDATED", raising=False)
150
+ assert _auto_update_inline_skeleton() != "would_check_pypi"
151
+
152
+
153
+ def test_disabled_still_wins_over_mcp_serve(monkeypatch):
154
+ """Explicit MESHCODE_AUTO_UPDATE=0 must remain the highest-priority
155
+ opt-out — useful for CI / debugging where the user wants to be
156
+ 100% certain no pip side-effects fire."""
157
+ monkeypatch.setenv("MESHCODE_AUTO_UPDATE", "0")
158
+ monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
159
+ monkeypatch.delenv("MESHCODE_UPDATED", raising=False)
160
+ assert _auto_update_inline_skeleton() == "disabled"
161
+
162
+
163
+ def test_post_exec_sentinel_still_wins_over_mcp_serve(monkeypatch):
164
+ """If we just re-execed after an upgrade, the UPDATED sentinel
165
+ must still take precedence so it gets cleared (otherwise it
166
+ persists into subprocess children)."""
167
+ monkeypatch.setenv("MESHCODE_UPDATED", "1")
168
+ monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
169
+ monkeypatch.delenv("MESHCODE_AUTO_UPDATE", raising=False)
170
+ assert _auto_update_inline_skeleton() == "post_exec_skip"
171
+ assert "MESHCODE_UPDATED" not in os.environ
172
+
173
+
117
174
  # ---------------------------------------------------------------------------
118
175
  # 4. PyPI/pip behaviour matrix (mocked — covers the cells that don't need
119
176
  # a live relaunch). Uses an inlined version of the post-gate _auto_update
File without changes
File without changes
File without changes