meshcode 2.11.31__tar.gz → 2.11.33__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.31 → meshcode-2.11.33}/PKG-INFO +1 -1
  2. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/backend.py +8 -2
  4. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/server.py +110 -5
  5. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode.egg-info/PKG-INFO +1 -1
  6. {meshcode-2.11.31 → meshcode-2.11.33}/pyproject.toml +1 -1
  7. {meshcode-2.11.31 → meshcode-2.11.33}/README.md +0 -0
  8. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/__main__.py +0 -0
  9. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/_stop_hook_template.py +0 -0
  10. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/ascii_art.py +0 -0
  11. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/atomic_push.py +0 -0
  12. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/cli.py +0 -0
  13. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/comms_v4.py +0 -0
  14. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/compat.py +0 -0
  15. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/daemon.py +0 -0
  16. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/date_parse.py +0 -0
  17. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/doctor.py +0 -0
  18. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/error_hints.py +0 -0
  19. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/exceptions.py +0 -0
  20. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/invites.py +0 -0
  21. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/launcher.py +0 -0
  22. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/launcher_install.py +0 -0
  23. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/__init__.py +0 -0
  24. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/__main__.py +0 -0
  25. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/realtime.py +0 -0
  26. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  27. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/test_backend.py +0 -0
  28. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  29. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  30. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  31. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  32. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  33. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/preferences.py +0 -0
  34. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/protocol_handler.py +0 -0
  35. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/protocol_v2.py +0 -0
  36. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/quickstart.py +0 -0
  37. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/rpc_allowlist.py +0 -0
  38. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/run_agent.py +0 -0
  39. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/scripts/check_secrets.py +0 -0
  40. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/scripts/race_rate_harness.py +0 -0
  41. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/secrets.py +0 -0
  42. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/self_update.py +0 -0
  43. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/setup_clients.py +0 -0
  44. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/supervisor.py +0 -0
  45. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode/upload.py +0 -0
  46. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/comms_v4.py +0 -0
  47. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  48. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  49. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/cli.py +0 -0
  50. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  51. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/compat.py +0 -0
  52. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  53. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  54. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/invites.py +0 -0
  55. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  56. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  57. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  58. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  59. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  60. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  61. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  62. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  63. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  64. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  65. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  66. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  67. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  68. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  69. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  70. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  71. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  72. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  73. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/meshcode/upload.py +0 -0
  74. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  75. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_core.py +0 -0
  76. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  77. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  78. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  79. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  80. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  81. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  82. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  83. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  84. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  85. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  86. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  87. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  88. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  89. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  90. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  91. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  92. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  93. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  94. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  95. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  96. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  97. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  98. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  99. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  100. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  101. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  102. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  103. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  104. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  105. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  106. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  107. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  108. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  109. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  110. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  111. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  112. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  113. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  114. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/comms_v4.py +0 -0
  115. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  116. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  117. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/cli.py +0 -0
  118. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  119. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/compat.py +0 -0
  120. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  121. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  122. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/invites.py +0 -0
  123. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  124. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  125. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  126. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  127. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  128. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  129. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  130. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  131. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  132. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  133. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  134. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  135. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  136. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  137. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  138. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  139. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  140. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  141. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/meshcode/upload.py +0 -0
  142. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  143. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_core.py +0 -0
  144. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  145. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  146. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  147. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  148. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  149. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  150. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  151. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  152. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  153. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  154. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  155. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/comms_v4.py +0 -0
  156. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  157. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  158. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  159. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  160. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  161. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  162. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  163. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  164. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  165. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  166. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  167. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  168. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  169. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  170. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  171. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  172. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  173. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  174. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  175. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  176. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  177. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  178. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  179. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  180. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  181. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  182. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  183. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  184. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_core.py +0 -0
  185. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  186. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  187. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  188. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  189. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  190. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  191. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  192. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  193. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  194. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  195. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  196. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode.egg-info/SOURCES.txt +0 -0
  197. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode.egg-info/dependency_links.txt +0 -0
  198. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode.egg-info/entry_points.txt +0 -0
  199. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode.egg-info/requires.txt +0 -0
  200. {meshcode-2.11.31 → meshcode-2.11.33}/meshcode.egg-info/top_level.txt +0 -0
  201. {meshcode-2.11.31 → meshcode-2.11.33}/setup.cfg +0 -0
  202. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_auto_update_hardening.py +0 -0
  203. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_boot_bug_regression.py +0 -0
  204. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_color_truecolor.py +0 -0
  205. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_core.py +0 -0
  206. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_cross_agent_messaging.py +0 -0
  207. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_date_parse.py +0 -0
  208. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_doctor.py +0 -0
  209. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_epistemic_v1_python_sdk.py +0 -0
  210. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  211. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_esc_deaf_state.py +0 -0
  212. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_exceptions.py +0 -0
  213. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_init_device_code.py +0 -0
  214. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_install_guard.py +0 -0
  215. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_lease_sigterm_release.py +0 -0
  216. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_mark_read_batch.py +0 -0
  217. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_migration_integrity.py +0 -0
  218. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_realtime_event_freshness.py +0 -0
  219. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_rls_cross_tenant.py +0 -0
  220. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_rpc_grants.py +0 -0
  221. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_rpc_migrations.py +0 -0
  222. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_run_agent_dry_run.py +0 -0
  223. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_run_agent_no_server_import.py +0 -0
  224. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_security_regressions.py +0 -0
  225. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_self_update_user_site.py +0 -0
  226. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_sentinel.py +0 -0
  227. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_setup_path.py +0 -0
  228. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_sleep_signals.py +0 -0
  229. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_status_enum_coverage.py +0 -0
  230. {meshcode-2.11.31 → meshcode-2.11.33}/tests/test_stay_on_loop_hook.py +0 -0
  231. {meshcode-2.11.31 → meshcode-2.11.33}/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.31
3
+ Version: 2.11.33
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.31"
2
+ __version__ = "2.11.33"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -428,10 +428,16 @@ _recording_project_id = ""
428
428
  _recording_agent_name = ""
429
429
  _recording_session_id = ""
430
430
 
431
- # RPCs that should NOT be recorded (internal/heartbeat/recording itself)
431
+ # RPCs that should NOT be recorded (internal/heartbeat/recording itself).
432
+ # M3a (SUPABASE-PROD-QUOTA-CRITICAL 2026-05-22): added mc_task_list +
433
+ # mc_count_pending + mc_mark_message_read — these were generating 87% of
434
+ # all session_events (~46k of 53k in last 6h) as null-tool tool_call rows
435
+ # from the wait-loop polling. Pure infrastructure noise — no analytic
436
+ # value. The session_events table was 1.2 GB driven mostly by these.
432
437
  _SKIP_RECORDING = {"mc_heartbeat", "mc_record_event", "mc_agent_set_status_by_api_key",
433
438
  "mc_acquire_agent_lease", "mc_release_agent_lease",
434
- "mc_update_agent", "mc_get_agents"}
439
+ "mc_update_agent", "mc_get_agents",
440
+ "mc_task_list", "mc_count_pending", "mc_mark_message_read"}
435
441
 
436
442
 
437
443
  def _get_api_key() -> Optional[str]:
@@ -2835,10 +2835,36 @@ def meshcode_send(to: Union[str, List[str]], message: Any, in_reply_to: Optional
2835
2835
  result["encrypted"] = True
2836
2836
  return result
2837
2837
 
2838
- return be.send_message(_PROJECT_ID, AGENT_NAME, to, payload,
2839
- msg_type=type or "msg",
2840
- parent_msg_id=in_reply_to, sensitive=sensitive,
2841
- api_key=_get_api_key(), encrypted=encrypted)
2838
+ _result = be.send_message(_PROJECT_ID, AGENT_NAME, to, payload,
2839
+ msg_type=type or "msg",
2840
+ parent_msg_id=in_reply_to, sensitive=sensitive,
2841
+ api_key=_get_api_key(), encrypted=encrypted)
2842
+
2843
+ # C2 (BACKEND-AUDIT-TASK-FRICTION F4, 2026-05-22): detect payloads that
2844
+ # look like the agent is trying to "claim" a task via a status message
2845
+ # instead of calling meshcode_task_claim. The status_msg path does NOT
2846
+ # update mc_tasks.claimed_by → task sits open while the agent believes
2847
+ # it's working it. Soft hint, never refuse.
2848
+ try:
2849
+ if isinstance(_result, dict) and _result.get("sent"):
2850
+ _ptype = str(payload.get("type", "")).lower()
2851
+ _ptext = str(payload.get("text", "")).lower()
2852
+ _has_task_ref = any(k in payload for k in ("task", "task_id"))
2853
+ _looks_like_claim = (
2854
+ _ptype in {"claim", "claim_status", "status_claim"}
2855
+ or ("claim" in _ptext and _has_task_ref)
2856
+ or (_ptype.startswith("status") and "claim" in _ptext)
2857
+ )
2858
+ if _looks_like_claim:
2859
+ _result["hint"] = (
2860
+ "claim_via_status_msg_does_not_update_task_table — "
2861
+ "call meshcode_task_claim(<task_id>) for the actual "
2862
+ "claim. status_msg is fine as a peer notification "
2863
+ "but is not the system-of-record."
2864
+ )
2865
+ except Exception:
2866
+ pass
2867
+ return _result
2842
2868
 
2843
2869
 
2844
2870
  @mcp.tool()
@@ -3236,6 +3262,14 @@ _AUTO_SLEEP_THRESHOLD = int(os.environ.get("MESHCODE_AUTO_SLEEP_SECONDS", "600")
3236
3262
  _STAY_AWAKE = False # Set by meshcode_set_status("online") — prevents auto-sleep
3237
3263
  _LAST_SEEN_TS: Optional[str] = None # auto-persisted for message dedup
3238
3264
 
3265
+ # M2 (SUPABASE-PROD-QUOTA-CRITICAL 2026-05-22): when an agent has been idle
3266
+ # longer than _M2_IDLE_THRESHOLD seconds, skip the per-tick mc_tasks poll on
3267
+ # (n-1)/n of timeouts — effective task-poll rate drops 1/N. Cuts mc_tasks
3268
+ # RPC volume which accounted for ~26.95M cumulative calls in the audit.
3269
+ _M2_IDLE_THRESHOLD = int(os.environ.get("MESHCODE_WAIT_IDLE_TASK_POLL_SKIP", "300")) # secs
3270
+ _M2_POLL_EVERY_N = int(os.environ.get("MESHCODE_WAIT_IDLE_POLL_EVERY_N", "3"))
3271
+ _M2_TICK_COUNTER = 0
3272
+
3239
3273
  # Hydrate _LAST_SEEN_TS from mesh memory on boot so restarts skip old messages
3240
3274
  try:
3241
3275
  _ls_result = be.sb_rpc("mc_memory_get", {
@@ -3299,6 +3333,56 @@ def _get_pending_tasks_summary() -> Optional[List[Dict[str, str]]]:
3299
3333
  return None
3300
3334
 
3301
3335
 
3336
+ def _check_task_dedupe(title: str, assignee: str) -> Optional[Dict[str, Any]]:
3337
+ """Find an open/in_progress task with similar title + same assignee.
3338
+
3339
+ Samuel directive 2026-05-21T23:41Z (`commander_dedupe_before_task_from_status_msg`):
3340
+ commanders kept creating duplicate tasks when reacting to status msgs from
3341
+ agents that had already claimed/shipped the same work. The 5ac1d9fe /
3342
+ dd41054d MOBILE-FIRST-3/4 dupes sat OPEN since 2026-05-20 because nobody
3343
+ deduped before creating new ones. Server-side soft guard surfaces a
3344
+ `dedupe_warning` in task_create responses when a likely duplicate
3345
+ exists — non-blocking, so legitimate near-titles still create, but the
3346
+ commander sees the dupe candidate and can cancel + reuse instead.
3347
+ """
3348
+ try:
3349
+ api_key = _get_api_key()
3350
+ if not api_key:
3351
+ return None
3352
+ result = be.task_list(api_key, _PROJECT_ID, AGENT_NAME, status_filter=None)
3353
+ if not isinstance(result, dict) or not result.get("ok"):
3354
+ return None
3355
+ tasks = result.get("tasks", [])
3356
+ target = (title or "").strip().lower()
3357
+ if not target:
3358
+ return None
3359
+ target_prefix = target[:40]
3360
+ for t in tasks:
3361
+ if t.get("status") not in ("open", "in_progress"):
3362
+ continue
3363
+ if t.get("assignee") != assignee:
3364
+ continue
3365
+ t_title = (t.get("title") or "").strip().lower()
3366
+ if not t_title:
3367
+ continue
3368
+ t_prefix = t_title[:40]
3369
+ match = None
3370
+ if t_prefix == target_prefix:
3371
+ match = "prefix-40"
3372
+ elif target in t_title or t_title in target:
3373
+ match = "substring"
3374
+ if match:
3375
+ return {
3376
+ "dupe_task_id": t.get("id"),
3377
+ "dupe_title": t.get("title"),
3378
+ "dupe_status": t.get("status"),
3379
+ "match_type": match,
3380
+ }
3381
+ except Exception:
3382
+ pass
3383
+ return None
3384
+
3385
+
3302
3386
  def _attach_pending_tasks_to_resp(resp: Dict[str, Any]) -> Dict[str, Any]:
3303
3387
  """Surface this agent's open/in_progress assigned tasks on EVERY wait response.
3304
3388
 
@@ -3465,8 +3549,16 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
3465
3549
  if result.get("timed_out"):
3466
3550
  _CONSECUTIVE_IDLE_SECONDS += capped_timeout
3467
3551
 
3552
+ # M2 (2026-05-22): when idle >5min, poll mc_tasks every Nth
3553
+ # tick instead of every tick. Active agents (recent msg)
3554
+ # keep checking every tick.
3555
+ global _M2_TICK_COUNTER
3556
+ _check_tasks = True
3557
+ if _CONSECUTIVE_IDLE_SECONDS >= _M2_IDLE_THRESHOLD and _M2_POLL_EVERY_N > 1:
3558
+ _M2_TICK_COUNTER = (_M2_TICK_COUNTER + 1) % _M2_POLL_EVERY_N
3559
+ _check_tasks = (_M2_TICK_COUNTER == 0)
3468
3560
  # Check if new tasks appeared while we waited
3469
- pending_tasks = _get_pending_tasks_summary()
3561
+ pending_tasks = _get_pending_tasks_summary() if _check_tasks else None
3470
3562
  if pending_tasks:
3471
3563
  result["pending_tasks"] = pending_tasks
3472
3564
  break # Return so agent can work tasks
@@ -4076,11 +4168,24 @@ def meshcode_task_create(title: str, description: str = "", assignee: Optional[s
4076
4168
  except Exception as _de:
4077
4169
  return {"error": f"due_parse_failed: {_de}"}
4078
4170
  api_key = _get_api_key()
4171
+ # Soft dedupe guard (Samuel directive 2026-05-21): surface likely-duplicate
4172
+ # open/in_progress task with same assignee + similar title. Non-blocking —
4173
+ # caller still gets the new task_id, but sees `dedupe_warning` and can
4174
+ # cancel + reuse the existing task instead of accumulating dupes.
4175
+ dedupe_hit = _check_task_dedupe(title.strip(), assignee) if assignee != "auto" else None
4079
4176
  result = be.task_create(api_key, _PROJECT_ID, AGENT_NAME, title.strip(),
4080
4177
  description=description, assignee=assignee,
4081
4178
  priority=priority, parent_task_id=parent_task_id,
4082
4179
  due_at=parsed_due_at, due_label=parsed_due_label,
4083
4180
  depends_on=depends_on or None)
4181
+ if isinstance(result, dict) and result.get("ok") and dedupe_hit:
4182
+ result["dedupe_warning"] = (
4183
+ f"Possible duplicate of task {dedupe_hit['dupe_task_id'][:8]} "
4184
+ f"('{dedupe_hit['dupe_title'][:60]}', status={dedupe_hit['dupe_status']}, "
4185
+ f"match={dedupe_hit['match_type']}). Consider canceling this new task "
4186
+ f"and reusing the existing one."
4187
+ )
4188
+ result["dedupe_candidate"] = dedupe_hit
4084
4189
  # Auto-notify the resolved assignee so they wake from meshcode_wait.
4085
4190
  # Read result["assignee"] (server may have resolved 'auto' to a real name).
4086
4191
  if isinstance(result, dict) and result.get("ok"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.31
3
+ Version: 2.11.33
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.31"
7
+ version = "2.11.33"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes