meshcode 2.11.31__tar.gz → 2.11.32__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. {meshcode-2.11.31 → meshcode-2.11.32}/PKG-INFO +1 -1
  2. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/server.py +63 -0
  4. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.31 → meshcode-2.11.32}/pyproject.toml +1 -1
  6. {meshcode-2.11.31 → meshcode-2.11.32}/README.md +0 -0
  7. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/_stop_hook_template.py +0 -0
  9. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/ascii_art.py +0 -0
  10. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/atomic_push.py +0 -0
  11. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/cli.py +0 -0
  12. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/comms_v4.py +0 -0
  13. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/compat.py +0 -0
  14. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/daemon.py +0 -0
  15. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/date_parse.py +0 -0
  16. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/doctor.py +0 -0
  17. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/error_hints.py +0 -0
  18. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/exceptions.py +0 -0
  19. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/invites.py +0 -0
  20. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/launcher.py +0 -0
  21. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/launcher_install.py +0 -0
  22. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/__init__.py +0 -0
  23. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/__main__.py +0 -0
  24. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/backend.py +0 -0
  25. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/realtime.py +0 -0
  26. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  27. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_backend.py +0 -0
  28. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  29. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  30. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  31. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  32. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  33. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/preferences.py +0 -0
  34. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/protocol_handler.py +0 -0
  35. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/protocol_v2.py +0 -0
  36. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/quickstart.py +0 -0
  37. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/rpc_allowlist.py +0 -0
  38. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/run_agent.py +0 -0
  39. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/scripts/check_secrets.py +0 -0
  40. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/scripts/race_rate_harness.py +0 -0
  41. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/secrets.py +0 -0
  42. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/self_update.py +0 -0
  43. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/setup_clients.py +0 -0
  44. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/supervisor.py +0 -0
  45. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode/upload.py +0 -0
  46. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/comms_v4.py +0 -0
  47. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  48. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  49. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/cli.py +0 -0
  50. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  51. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/compat.py +0 -0
  52. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  53. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  54. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/invites.py +0 -0
  55. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  56. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  57. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  58. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  59. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  60. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  61. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  62. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  63. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  64. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  65. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  66. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  67. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  68. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  69. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  70. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  71. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  72. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  73. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/meshcode/upload.py +0 -0
  74. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  75. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_core.py +0 -0
  76. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  77. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  78. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  79. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  80. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  81. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  82. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  83. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  84. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  85. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  86. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  87. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  88. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  89. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  90. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  91. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  92. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  93. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  94. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  95. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  96. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  97. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  98. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  99. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  100. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  101. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  102. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  103. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  104. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  105. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  106. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  107. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  108. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  109. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  110. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  111. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  112. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  113. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  114. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/comms_v4.py +0 -0
  115. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  116. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  117. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/cli.py +0 -0
  118. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  119. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/compat.py +0 -0
  120. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  121. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  122. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/invites.py +0 -0
  123. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  124. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  125. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  126. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  127. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  128. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  129. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  130. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  131. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  132. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  133. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  134. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  135. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  136. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  137. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  138. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  139. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  140. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  141. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/meshcode/upload.py +0 -0
  142. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  143. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_core.py +0 -0
  144. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  145. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  146. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  147. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  148. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  149. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  150. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  151. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  152. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  153. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  154. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  155. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/comms_v4.py +0 -0
  156. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  157. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  158. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  159. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  160. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  161. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  162. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  163. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  164. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  165. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  166. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  167. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  168. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  169. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  170. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  171. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  172. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  173. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  174. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  175. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  176. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  177. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  178. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  179. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  180. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  181. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  182. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  183. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  184. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_core.py +0 -0
  185. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  186. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  187. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  188. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  189. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  190. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  191. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  192. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  193. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  194. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  195. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  196. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/SOURCES.txt +0 -0
  197. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/dependency_links.txt +0 -0
  198. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/entry_points.txt +0 -0
  199. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/requires.txt +0 -0
  200. {meshcode-2.11.31 → meshcode-2.11.32}/meshcode.egg-info/top_level.txt +0 -0
  201. {meshcode-2.11.31 → meshcode-2.11.32}/setup.cfg +0 -0
  202. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_auto_update_hardening.py +0 -0
  203. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_boot_bug_regression.py +0 -0
  204. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_color_truecolor.py +0 -0
  205. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_core.py +0 -0
  206. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_cross_agent_messaging.py +0 -0
  207. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_date_parse.py +0 -0
  208. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_doctor.py +0 -0
  209. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_epistemic_v1_python_sdk.py +0 -0
  210. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  211. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_esc_deaf_state.py +0 -0
  212. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_exceptions.py +0 -0
  213. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_init_device_code.py +0 -0
  214. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_install_guard.py +0 -0
  215. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_lease_sigterm_release.py +0 -0
  216. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_mark_read_batch.py +0 -0
  217. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_migration_integrity.py +0 -0
  218. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_realtime_event_freshness.py +0 -0
  219. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_rls_cross_tenant.py +0 -0
  220. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_rpc_grants.py +0 -0
  221. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_rpc_migrations.py +0 -0
  222. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_run_agent_dry_run.py +0 -0
  223. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_run_agent_no_server_import.py +0 -0
  224. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_security_regressions.py +0 -0
  225. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_self_update_user_site.py +0 -0
  226. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_sentinel.py +0 -0
  227. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_setup_path.py +0 -0
  228. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_sleep_signals.py +0 -0
  229. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_status_enum_coverage.py +0 -0
  230. {meshcode-2.11.31 → meshcode-2.11.32}/tests/test_stay_on_loop_hook.py +0 -0
  231. {meshcode-2.11.31 → meshcode-2.11.32}/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.32
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.32"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -3299,6 +3299,56 @@ def _get_pending_tasks_summary() -> Optional[List[Dict[str, str]]]:
3299
3299
  return None
3300
3300
 
3301
3301
 
3302
+ def _check_task_dedupe(title: str, assignee: str) -> Optional[Dict[str, Any]]:
3303
+ """Find an open/in_progress task with similar title + same assignee.
3304
+
3305
+ Samuel directive 2026-05-21T23:41Z (`commander_dedupe_before_task_from_status_msg`):
3306
+ commanders kept creating duplicate tasks when reacting to status msgs from
3307
+ agents that had already claimed/shipped the same work. The 5ac1d9fe /
3308
+ dd41054d MOBILE-FIRST-3/4 dupes sat OPEN since 2026-05-20 because nobody
3309
+ deduped before creating new ones. Server-side soft guard surfaces a
3310
+ `dedupe_warning` in task_create responses when a likely duplicate
3311
+ exists — non-blocking, so legitimate near-titles still create, but the
3312
+ commander sees the dupe candidate and can cancel + reuse instead.
3313
+ """
3314
+ try:
3315
+ api_key = _get_api_key()
3316
+ if not api_key:
3317
+ return None
3318
+ result = be.task_list(api_key, _PROJECT_ID, AGENT_NAME, status_filter=None)
3319
+ if not isinstance(result, dict) or not result.get("ok"):
3320
+ return None
3321
+ tasks = result.get("tasks", [])
3322
+ target = (title or "").strip().lower()
3323
+ if not target:
3324
+ return None
3325
+ target_prefix = target[:40]
3326
+ for t in tasks:
3327
+ if t.get("status") not in ("open", "in_progress"):
3328
+ continue
3329
+ if t.get("assignee") != assignee:
3330
+ continue
3331
+ t_title = (t.get("title") or "").strip().lower()
3332
+ if not t_title:
3333
+ continue
3334
+ t_prefix = t_title[:40]
3335
+ match = None
3336
+ if t_prefix == target_prefix:
3337
+ match = "prefix-40"
3338
+ elif target in t_title or t_title in target:
3339
+ match = "substring"
3340
+ if match:
3341
+ return {
3342
+ "dupe_task_id": t.get("id"),
3343
+ "dupe_title": t.get("title"),
3344
+ "dupe_status": t.get("status"),
3345
+ "match_type": match,
3346
+ }
3347
+ except Exception:
3348
+ pass
3349
+ return None
3350
+
3351
+
3302
3352
  def _attach_pending_tasks_to_resp(resp: Dict[str, Any]) -> Dict[str, Any]:
3303
3353
  """Surface this agent's open/in_progress assigned tasks on EVERY wait response.
3304
3354
 
@@ -4076,11 +4126,24 @@ def meshcode_task_create(title: str, description: str = "", assignee: Optional[s
4076
4126
  except Exception as _de:
4077
4127
  return {"error": f"due_parse_failed: {_de}"}
4078
4128
  api_key = _get_api_key()
4129
+ # Soft dedupe guard (Samuel directive 2026-05-21): surface likely-duplicate
4130
+ # open/in_progress task with same assignee + similar title. Non-blocking —
4131
+ # caller still gets the new task_id, but sees `dedupe_warning` and can
4132
+ # cancel + reuse the existing task instead of accumulating dupes.
4133
+ dedupe_hit = _check_task_dedupe(title.strip(), assignee) if assignee != "auto" else None
4079
4134
  result = be.task_create(api_key, _PROJECT_ID, AGENT_NAME, title.strip(),
4080
4135
  description=description, assignee=assignee,
4081
4136
  priority=priority, parent_task_id=parent_task_id,
4082
4137
  due_at=parsed_due_at, due_label=parsed_due_label,
4083
4138
  depends_on=depends_on or None)
4139
+ if isinstance(result, dict) and result.get("ok") and dedupe_hit:
4140
+ result["dedupe_warning"] = (
4141
+ f"Possible duplicate of task {dedupe_hit['dupe_task_id'][:8]} "
4142
+ f"('{dedupe_hit['dupe_title'][:60]}', status={dedupe_hit['dupe_status']}, "
4143
+ f"match={dedupe_hit['match_type']}). Consider canceling this new task "
4144
+ f"and reusing the existing one."
4145
+ )
4146
+ result["dedupe_candidate"] = dedupe_hit
4084
4147
  # Auto-notify the resolved assignee so they wake from meshcode_wait.
4085
4148
  # Read result["assignee"] (server may have resolved 'auto' to a real name).
4086
4149
  if isinstance(result, dict) and result.get("ok"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.31
3
+ Version: 2.11.32
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.32"
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