meshcode 2.11.39__tar.gz → 2.11.41__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.39 → meshcode-2.11.41}/PKG-INFO +1 -1
  2. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/backend.py +8 -1
  4. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/server.py +120 -10
  5. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode.egg-info/PKG-INFO +1 -1
  6. {meshcode-2.11.39 → meshcode-2.11.41}/pyproject.toml +1 -1
  7. {meshcode-2.11.39 → meshcode-2.11.41}/README.md +0 -0
  8. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/__main__.py +0 -0
  9. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/_stop_hook_template.py +0 -0
  10. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/ascii_art.py +0 -0
  11. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/atomic_push.py +0 -0
  12. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/cli.py +0 -0
  13. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/comms_v4.py +0 -0
  14. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/compat.py +0 -0
  15. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/daemon.py +0 -0
  16. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/date_parse.py +0 -0
  17. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/doctor.py +0 -0
  18. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/error_hints.py +0 -0
  19. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/exceptions.py +0 -0
  20. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/invites.py +0 -0
  21. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/launcher.py +0 -0
  22. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/launcher_install.py +0 -0
  23. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/__init__.py +0 -0
  24. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/__main__.py +0 -0
  25. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/realtime.py +0 -0
  26. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  27. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/test_backend.py +0 -0
  28. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  29. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  30. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  31. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  32. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  33. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/preferences.py +0 -0
  34. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/protocol_handler.py +0 -0
  35. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/protocol_v2.py +0 -0
  36. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/quickstart.py +0 -0
  37. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/rpc_allowlist.py +0 -0
  38. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/run_agent.py +0 -0
  39. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/scripts/check_secrets.py +0 -0
  40. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/scripts/race_rate_harness.py +0 -0
  41. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/secrets.py +0 -0
  42. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/self_update.py +0 -0
  43. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/setup_clients.py +0 -0
  44. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/supervisor.py +0 -0
  45. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode/upload.py +0 -0
  46. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/comms_v4.py +0 -0
  47. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  48. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  49. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/cli.py +0 -0
  50. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  51. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/compat.py +0 -0
  52. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  53. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  54. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/invites.py +0 -0
  55. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  56. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  57. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  58. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  59. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  60. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  61. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  62. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  63. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  64. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  65. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  66. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  67. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  68. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  69. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  70. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  71. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  72. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  73. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/meshcode/upload.py +0 -0
  74. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  75. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_core.py +0 -0
  76. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  77. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  78. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  79. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  80. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  81. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  82. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  83. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  84. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  85. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  86. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  87. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  88. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  89. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  90. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  91. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  92. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  93. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  94. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  95. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  96. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  97. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  98. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  99. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  100. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  101. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  102. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  103. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  104. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  105. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  106. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  107. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  108. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  109. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  110. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  111. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  112. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  113. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  114. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/comms_v4.py +0 -0
  115. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  116. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  117. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/cli.py +0 -0
  118. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  119. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/compat.py +0 -0
  120. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  121. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  122. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/invites.py +0 -0
  123. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  124. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  125. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  126. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  127. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  128. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  129. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  130. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  131. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  132. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  133. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  134. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  135. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  136. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  137. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  138. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  139. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  140. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  141. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/meshcode/upload.py +0 -0
  142. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  143. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_core.py +0 -0
  144. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  145. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  146. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  147. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  148. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  149. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  150. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  151. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  152. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  153. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  154. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  155. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/comms_v4.py +0 -0
  156. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  157. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  158. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  159. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  160. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  161. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  162. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  163. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  164. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  165. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  166. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  167. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  168. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  169. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  170. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  171. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  172. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  173. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  174. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  175. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  176. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  177. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  178. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  179. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  180. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  181. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  182. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  183. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  184. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_core.py +0 -0
  185. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  186. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  187. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  188. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  189. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  190. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  191. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  192. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  193. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  194. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  195. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  196. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode.egg-info/SOURCES.txt +0 -0
  197. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode.egg-info/dependency_links.txt +0 -0
  198. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode.egg-info/entry_points.txt +0 -0
  199. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode.egg-info/requires.txt +0 -0
  200. {meshcode-2.11.39 → meshcode-2.11.41}/meshcode.egg-info/top_level.txt +0 -0
  201. {meshcode-2.11.39 → meshcode-2.11.41}/setup.cfg +0 -0
  202. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_auto_update_hardening.py +0 -0
  203. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_boot_bug_regression.py +0 -0
  204. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_color_truecolor.py +0 -0
  205. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_core.py +0 -0
  206. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_cross_agent_messaging.py +0 -0
  207. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_date_parse.py +0 -0
  208. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_doctor.py +0 -0
  209. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_epistemic_v1_python_sdk.py +0 -0
  210. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  211. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_esc_deaf_state.py +0 -0
  212. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_exceptions.py +0 -0
  213. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_init_device_code.py +0 -0
  214. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_install_guard.py +0 -0
  215. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_lease_sigterm_release.py +0 -0
  216. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_mark_read_batch.py +0 -0
  217. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_migration_integrity.py +0 -0
  218. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_realtime_event_freshness.py +0 -0
  219. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_rls_cross_tenant.py +0 -0
  220. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_rpc_grants.py +0 -0
  221. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_rpc_migrations.py +0 -0
  222. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_run_agent_dry_run.py +0 -0
  223. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_run_agent_no_server_import.py +0 -0
  224. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_security_regressions.py +0 -0
  225. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_self_update_user_site.py +0 -0
  226. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_sentinel.py +0 -0
  227. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_setup_path.py +0 -0
  228. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_sleep_signals.py +0 -0
  229. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_status_enum_coverage.py +0 -0
  230. {meshcode-2.11.39 → meshcode-2.11.41}/tests/test_stay_on_loop_hook.py +0 -0
  231. {meshcode-2.11.39 → meshcode-2.11.41}/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.39
3
+ Version: 2.11.41
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.39"
2
+ __version__ = "2.11.41"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -437,7 +437,14 @@ _recording_session_id = ""
437
437
  _SKIP_RECORDING = {"mc_heartbeat", "mc_record_event", "mc_agent_set_status_by_api_key",
438
438
  "mc_acquire_agent_lease", "mc_release_agent_lease",
439
439
  "mc_update_agent", "mc_get_agents",
440
- "mc_task_list", "mc_count_pending", "mc_mark_message_read"}
440
+ "mc_task_list", "mc_count_pending", "mc_mark_message_read",
441
+ # Stop-gap (per commander 1b789a11): mc_tasks_due_soon lives
442
+ # only in `meshcode` schema (mig 329); no `public` wrapper
443
+ # exists, so PostgREST returns PGRST202 ~every wait cycle.
444
+ # ~18k err/12h log pollution. The two call sites already
445
+ # treat it as soft-fail. Silence telemetry until Samuel
446
+ # approves the public-wrapper DDL.
447
+ "mc_tasks_due_soon"}
441
448
 
442
449
 
443
450
  def _get_api_key() -> Optional[str]:
@@ -95,6 +95,58 @@ def _agent_color(name: str) -> str:
95
95
  return _ANSI_COLORS[h % len(_ANSI_COLORS)]
96
96
 
97
97
 
98
+ # DUP-AGENTS-P3 (memo afc88b8f, vote 2/2 + chief pending): register-time
99
+ # name/role family sanity check. Catches the class-of-bug where an agent
100
+ # named `front-2` gets registered with role="Backend Engineer". Warning-only:
101
+ # never blocks; surfaces via `warning` field that admin UI renders as badge.
102
+ _ROLE_FAMILY_PREFIX_MAP = (
103
+ ("commander", "Commander"),
104
+ ("chief", "Commander"),
105
+ ("co-dev-", "Engineer"),
106
+ ("front-", "Frontend"),
107
+ ("back-", "Backend"),
108
+ ("backend", "Backend"),
109
+ ("frontend", "Frontend"),
110
+ ("qa-", "QA"),
111
+ ("qa", "QA"),
112
+ ("design-", "Design"),
113
+ ("ops-", "Ops"),
114
+ ("data-", "Data"),
115
+ )
116
+
117
+
118
+ def _role_family_from_name(name: str) -> Optional[str]:
119
+ """Derive expected role family from agent name prefix. None = unknown
120
+ prefix, no opinion (skip warning to avoid noise on names like
121
+ `mesh-commander` or one-off custom names)."""
122
+ if not name:
123
+ return None
124
+ lower = name.lower()
125
+ for prefix, family in _ROLE_FAMILY_PREFIX_MAP:
126
+ if prefix.endswith("-"):
127
+ if lower.startswith(prefix):
128
+ return family
129
+ else:
130
+ if lower == prefix or lower.startswith(prefix + "-") or lower.startswith(prefix + "_"):
131
+ return family
132
+ return None
133
+
134
+
135
+ def _role_warning(name: str, role: str) -> Optional[str]:
136
+ """Returns a warning string if name-prefix family ≠ role text family.
137
+ None when names with unknown prefixes (avoid false positives), or when
138
+ role text contains the expected family substring (case-insensitive).
139
+ """
140
+ if not name or not role:
141
+ return None
142
+ expected = _role_family_from_name(name)
143
+ if not expected:
144
+ return None
145
+ if expected.lower() in role.lower():
146
+ return None
147
+ return f"name '{name}' suggests {expected} but role is '{role}' — possible typo or mislabel"
148
+
149
+
98
150
  def _mc_log(msg: str, level: str = "info") -> None:
99
151
  """Colored [meshcode-mcp] log line. Uses agent color if available.
100
152
 
@@ -3349,6 +3401,36 @@ def _try_auto_claim_task() -> Optional[Dict[str, str]]:
3349
3401
  _LAST_ROSTER_SNAPSHOT: Optional[List[Dict[str, Any]]] = None
3350
3402
  _LAST_ROSTER_SNAPSHOT_TS: float = 0.0
3351
3403
 
3404
+ # AUTONOMOUS-MODE-1-RUNTIME (mig 354 backend slice already live): cache the
3405
+ # autonomous_mode flag so the wait loop modulation is cheap. Refresh every
3406
+ # 15s — short enough to react to dashboard toggle within ~1 wait cycle,
3407
+ # long enough to avoid hammering the RPC.
3408
+ _AUTONOMOUS_MODE_CACHE: Optional[bool] = None
3409
+ _AUTONOMOUS_MODE_CACHE_TS: float = 0.0
3410
+
3411
+
3412
+ def _get_autonomous_mode(max_age_s: float = 15.0) -> bool:
3413
+ global _AUTONOMOUS_MODE_CACHE, _AUTONOMOUS_MODE_CACHE_TS
3414
+ now_ts = _time.monotonic()
3415
+ if _AUTONOMOUS_MODE_CACHE is not None and (now_ts - _AUTONOMOUS_MODE_CACHE_TS) < max_age_s:
3416
+ return _AUTONOMOUS_MODE_CACHE
3417
+ try:
3418
+ api_key = _get_api_key()
3419
+ if not api_key:
3420
+ return False
3421
+ resp = be.sb_rpc("mc_agent_get_autonomous", {
3422
+ "p_api_key": api_key,
3423
+ "p_project_id": _PROJECT_ID,
3424
+ "p_agent_name": AGENT_NAME,
3425
+ })
3426
+ flag = bool(isinstance(resp, dict) and resp.get("ok") and resp.get("autonomous_mode"))
3427
+ _AUTONOMOUS_MODE_CACHE = flag
3428
+ _AUTONOMOUS_MODE_CACHE_TS = now_ts
3429
+ return flag
3430
+ except Exception as e:
3431
+ log.debug(f"[meshcode] autonomous_mode fetch failed: {e}")
3432
+ return False
3433
+
3352
3434
 
3353
3435
  def _get_mesh_online_snapshot(max_age_s: float = 10.0) -> Optional[List[Dict[str, Any]]]:
3354
3436
  global _LAST_ROSTER_SNAPSHOT, _LAST_ROSTER_SNAPSHOT_TS
@@ -3466,7 +3548,14 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
3466
3548
 
3467
3549
  _IN_WAIT = True
3468
3550
  _set_state("waiting", "listening for messages")
3469
- capped_timeout = min(max(1, int(timeout_seconds)), 20)
3551
+ # AUTONOMOUS-MODE-1-RUNTIME: when the agent is in autonomous mode,
3552
+ # tighten the wait timeout so the loop reacts to mesh activity faster
3553
+ # and reaches the proactive auto-claim path sooner.
3554
+ _autonomous = _get_autonomous_mode()
3555
+ if _autonomous:
3556
+ capped_timeout = min(max(1, int(timeout_seconds)), 5)
3557
+ else:
3558
+ capped_timeout = min(max(1, int(timeout_seconds)), 20)
3470
3559
  try:
3471
3560
  # ── INTERNAL LOOP ──────────────────────────────────────────
3472
3561
  # Keep polling until something actionable arrives.
@@ -3498,10 +3587,12 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
3498
3587
  result["pending_tasks"] = pending_tasks
3499
3588
  break # Return so agent can work tasks
3500
3589
 
3501
- # Auto-claim: when idle >30s with no assigned tasks, try to
3502
- # claim the oldest open wildcard task. This makes agents
3503
- # self-directing instead of waiting passively for assignment.
3504
- if _CONSECUTIVE_IDLE_SECONDS >= 30 and not _is_leader_agent():
3590
+ # Auto-claim: when idle >30s (or >10s in autonomous mode)
3591
+ # with no assigned tasks, try to claim the oldest open
3592
+ # wildcard task. Autonomous agents react faster to make
3593
+ # the mesh feel proactive.
3594
+ _auto_claim_threshold = 10 if _autonomous else 30
3595
+ if _CONSECUTIVE_IDLE_SECONDS >= _auto_claim_threshold and not _is_leader_agent():
3505
3596
  claimed = _try_auto_claim_task()
3506
3597
  if claimed:
3507
3598
  result["auto_claimed"] = claimed
@@ -3576,6 +3667,10 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
3576
3667
  _snapshot = _get_mesh_online_snapshot()
3577
3668
  if _snapshot is not None:
3578
3669
  result["mesh_online_snapshot"] = _snapshot
3670
+ # AUTONOMOUS-MODE-1-RUNTIME: surface the flag so the LLM knows
3671
+ # whether to operate proactively.
3672
+ if isinstance(result, dict):
3673
+ result["autonomous_mode"] = _autonomous
3579
3674
  return result
3580
3675
  finally:
3581
3676
  _IN_WAIT = False
@@ -4002,7 +4097,12 @@ def meshcode_status() -> Dict[str, Any]:
4002
4097
  @with_working_status
4003
4098
  def meshcode_register(role: str = "") -> Dict[str, Any]:
4004
4099
  """Re-register agent (update role)."""
4005
- return be.register_agent(PROJECT_NAME, AGENT_NAME, role or AGENT_ROLE, api_key=_get_api_key())
4100
+ effective_role = role or AGENT_ROLE
4101
+ result = be.register_agent(PROJECT_NAME, AGENT_NAME, effective_role, api_key=_get_api_key())
4102
+ warn = _role_warning(AGENT_NAME, effective_role)
4103
+ if warn and isinstance(result, dict):
4104
+ result = {**result, "warning": warn}
4105
+ return result
4006
4106
 
4007
4107
 
4008
4108
  @mcp.tool()
@@ -4059,8 +4159,13 @@ def meshcode_init(project: str, agent: str, role: str = "") -> Dict[str, Any]:
4059
4159
  if not pid:
4060
4160
  return {"error": f"project '{project}' not found"}
4061
4161
  _PROJECT_ID = pid
4062
- result = be.register_agent(project, agent, role or "MCP-connected agent", api_key=_get_api_key())
4063
- return {"ok": True, "project": project, "agent": agent, "register": result}
4162
+ effective_role = role or "MCP-connected agent"
4163
+ result = be.register_agent(project, agent, effective_role, api_key=_get_api_key())
4164
+ warn = _role_warning(agent, effective_role)
4165
+ out: Dict[str, Any] = {"ok": True, "project": project, "agent": agent, "register": result}
4166
+ if warn:
4167
+ out["warning"] = warn
4168
+ return out
4064
4169
 
4065
4170
 
4066
4171
  @mcp.tool()
@@ -5252,9 +5357,14 @@ def meshcode_add_agent(name: str, role: str = "") -> Dict[str, Any]:
5252
5357
  name: Agent name.
5253
5358
  role: Agent role description.
5254
5359
  """
5255
- result = be.register_agent(PROJECT_NAME, name, role or "MCP-connected agent", api_key=_get_api_key())
5360
+ effective_role = role or "MCP-connected agent"
5361
+ result = be.register_agent(PROJECT_NAME, name, effective_role, api_key=_get_api_key())
5362
+ warn = _role_warning(name, effective_role)
5256
5363
  if isinstance(result, dict) and not result.get("error"):
5257
- return {"ok": True, "agent": name, "next_step": f"Run: meshcode setup {PROJECT_NAME} {name} && meshcode run {name}"}
5364
+ out: Dict[str, Any] = {"ok": True, "agent": name, "next_step": f"Run: meshcode setup {PROJECT_NAME} {name} && meshcode run {name}"}
5365
+ if warn:
5366
+ out["warning"] = warn
5367
+ return out
5258
5368
  return result or {"error": "failed to add agent"}
5259
5369
 
5260
5370
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.39
3
+ Version: 2.11.41
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.39"
7
+ version = "2.11.41"
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