meshcode 2.11.41__tar.gz → 2.11.43__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 (237) hide show
  1. {meshcode-2.11.41 → meshcode-2.11.43}/PKG-INFO +1 -1
  2. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/comms_v4.py +9 -2
  4. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/backend.py +19 -1
  5. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/server.py +40 -5
  6. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/run_agent.py +9 -1
  7. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode.egg-info/PKG-INFO +1 -1
  8. meshcode-2.11.43/meshcode.egg-info/PKG-INFO 2 +452 -0
  9. meshcode-2.11.43/meshcode.egg-info/SOURCES.txt +235 -0
  10. meshcode-2.11.43/meshcode.egg-info/dependency_links.txt +1 -0
  11. meshcode-2.11.43/meshcode.egg-info/entry_points.txt +3 -0
  12. meshcode-2.11.43/meshcode.egg-info/requires.txt +13 -0
  13. meshcode-2.11.43/meshcode.egg-info/top_level.txt +4 -0
  14. {meshcode-2.11.41 → meshcode-2.11.43}/pyproject.toml +1 -1
  15. {meshcode-2.11.41 → meshcode-2.11.43}/README.md +0 -0
  16. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/__main__.py +0 -0
  17. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/_stop_hook_template.py +0 -0
  18. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/ascii_art.py +0 -0
  19. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/atomic_push.py +0 -0
  20. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/cli.py +0 -0
  21. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/compat.py +0 -0
  22. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/daemon.py +0 -0
  23. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/date_parse.py +0 -0
  24. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/doctor.py +0 -0
  25. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/error_hints.py +0 -0
  26. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/exceptions.py +0 -0
  27. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/invites.py +0 -0
  28. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/launcher.py +0 -0
  29. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/launcher_install.py +0 -0
  30. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/__init__.py +0 -0
  31. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/__main__.py +0 -0
  32. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/realtime.py +0 -0
  33. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  34. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_backend.py +0 -0
  35. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  36. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  37. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  38. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  39. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  40. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/preferences.py +0 -0
  41. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/protocol_handler.py +0 -0
  42. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/protocol_v2.py +0 -0
  43. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/quickstart.py +0 -0
  44. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/rpc_allowlist.py +0 -0
  45. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/scripts/check_secrets.py +0 -0
  46. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/scripts/race_rate_harness.py +0 -0
  47. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/secrets.py +0 -0
  48. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/self_update.py +0 -0
  49. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/setup_clients.py +0 -0
  50. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/supervisor.py +0 -0
  51. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode/upload.py +0 -0
  52. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/comms_v4.py +0 -0
  53. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  54. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  55. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/cli.py +0 -0
  56. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  57. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/compat.py +0 -0
  58. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  59. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  60. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/invites.py +0 -0
  61. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  62. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  63. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  64. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  65. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  66. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  67. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  68. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  69. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  70. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  71. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  72. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  73. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  74. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  75. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  76. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  77. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  78. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  79. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/meshcode/upload.py +0 -0
  80. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  81. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_core.py +0 -0
  82. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  83. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  84. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  85. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  86. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  87. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  88. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  89. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  90. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  91. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  92. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  93. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  94. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  95. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  96. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  97. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  98. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  99. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  100. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  101. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  102. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  103. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  104. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  105. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  106. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  107. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  108. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  109. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  110. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  111. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  112. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  113. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  114. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  115. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  116. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  117. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  118. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  119. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  120. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/comms_v4.py +0 -0
  121. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  122. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  123. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/cli.py +0 -0
  124. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  125. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/compat.py +0 -0
  126. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  127. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  128. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/invites.py +0 -0
  129. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  130. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  131. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  132. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  133. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  134. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  135. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  136. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  137. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  138. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  139. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  140. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  141. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  142. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  143. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  144. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  145. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  146. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  147. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/meshcode/upload.py +0 -0
  148. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  149. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_core.py +0 -0
  150. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  151. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  152. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  153. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  154. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  155. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  156. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  157. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  158. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  159. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  160. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  161. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/comms_v4.py +0 -0
  162. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  163. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  164. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  165. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  166. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  167. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  168. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  169. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  170. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  171. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  172. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  173. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  174. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  175. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  176. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  177. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  178. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  179. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  180. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  181. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  182. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  183. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  184. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  185. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  186. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  187. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  188. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  189. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  190. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_core.py +0 -0
  191. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  192. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  193. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  194. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  195. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  196. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  197. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  198. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  199. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  200. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  201. {meshcode-2.11.41 → meshcode-2.11.43}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  202. /meshcode-2.11.41/meshcode.egg-info/SOURCES.txt → /meshcode-2.11.43/meshcode.egg-info/SOURCES 2.txt +0 -0
  203. /meshcode-2.11.41/meshcode.egg-info/dependency_links.txt → /meshcode-2.11.43/meshcode.egg-info/dependency_links 2.txt +0 -0
  204. /meshcode-2.11.41/meshcode.egg-info/entry_points.txt → /meshcode-2.11.43/meshcode.egg-info/entry_points 2.txt +0 -0
  205. /meshcode-2.11.41/meshcode.egg-info/requires.txt → /meshcode-2.11.43/meshcode.egg-info/requires 2.txt +0 -0
  206. /meshcode-2.11.41/meshcode.egg-info/top_level.txt → /meshcode-2.11.43/meshcode.egg-info/top_level 2.txt +0 -0
  207. {meshcode-2.11.41 → meshcode-2.11.43}/setup.cfg +0 -0
  208. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_auto_update_hardening.py +0 -0
  209. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_boot_bug_regression.py +0 -0
  210. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_color_truecolor.py +0 -0
  211. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_core.py +0 -0
  212. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_cross_agent_messaging.py +0 -0
  213. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_date_parse.py +0 -0
  214. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_doctor.py +0 -0
  215. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_epistemic_v1_python_sdk.py +0 -0
  216. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  217. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_esc_deaf_state.py +0 -0
  218. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_exceptions.py +0 -0
  219. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_init_device_code.py +0 -0
  220. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_install_guard.py +0 -0
  221. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_lease_sigterm_release.py +0 -0
  222. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_mark_read_batch.py +0 -0
  223. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_migration_integrity.py +0 -0
  224. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_realtime_event_freshness.py +0 -0
  225. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_rls_cross_tenant.py +0 -0
  226. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_rpc_grants.py +0 -0
  227. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_rpc_migrations.py +0 -0
  228. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_run_agent_dry_run.py +0 -0
  229. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_run_agent_no_server_import.py +0 -0
  230. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_security_regressions.py +0 -0
  231. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_self_update_user_site.py +0 -0
  232. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_sentinel.py +0 -0
  233. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_setup_path.py +0 -0
  234. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_sleep_signals.py +0 -0
  235. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_status_enum_coverage.py +0 -0
  236. {meshcode-2.11.41 → meshcode-2.11.43}/tests/test_stay_on_loop_hook.py +0 -0
  237. {meshcode-2.11.41 → meshcode-2.11.43}/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.41
3
+ Version: 2.11.43
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.41"
2
+ __version__ = "2.11.43"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -2734,7 +2734,7 @@ if __name__ == "__main__":
2734
2734
 
2735
2735
  # Strip bare boolean flags from argv before parsing so they don't end
2736
2736
  # up as positional args (e.g. --compact is a bare flag, not key=value).
2737
- BARE_FLAGS = {"--compact", "--legacy", "--no-hook", "--mcp-only"}
2737
+ BARE_FLAGS = {"--compact", "--legacy", "--no-hook", "--mcp-only", "--autonomous"}
2738
2738
  _bare_present = {a.lstrip("-") for a in sys.argv[2:] if a in BARE_FLAGS}
2739
2739
  _argv_for_parse = [a for a in sys.argv[2:] if a not in BARE_FLAGS]
2740
2740
 
@@ -3259,9 +3259,16 @@ if __name__ == "__main__":
3259
3259
  else:
3260
3260
  print("[meshcode] Login required. Run: meshcode login <api_key>")
3261
3261
  sys.exit(1)
3262
+ # AUTONOMOUS-MODE-UNIVERSAL (task f248d98e): --autonomous flag OR
3263
+ # MESHCODE_AUTONOMOUS=1 env var → register-time autonomous=true.
3264
+ # Memo decision Q3: scope is `meshcode run` + add-agent. Env var
3265
+ # acts as shell-session default; explicit flag wins per-launch.
3266
+ autonomous_env = (os.environ.get("MESHCODE_AUTONOMOUS", "").strip().lower()
3267
+ in ("1", "true", "yes", "on"))
3268
+ autonomous = bool(flags.get("autonomous")) or autonomous_env
3262
3269
  import importlib
3263
3270
  _run = importlib.import_module("meshcode.run_agent").run
3264
- sys.exit(_run(agent, project=proj_override, editor_override=editor_override, permission_override=perm_override, dry_run=dry_run))
3271
+ sys.exit(_run(agent, project=proj_override, editor_override=editor_override, permission_override=perm_override, dry_run=dry_run, autonomous=autonomous))
3265
3272
 
3266
3273
  elif cmd == "scan":
3267
3274
  # meshcode scan — detect identicon from stdin/clipboard and launch agent
@@ -615,12 +615,30 @@ def register_agent(project: str, name: str, role: str = "", api_key: Optional[st
615
615
  f"project_id=eq.{project_id}&name=eq.{quote(name)}",
616
616
  {"task": role})
617
617
 
618
- return {
618
+ # AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1): if launched with
619
+ # `meshcode run --autonomous` or MESHCODE_AUTONOMOUS=1, flip autonomous
620
+ # mode at register-time. RPC mc_agent_set_autonomous exists per mig 354.
621
+ # Best-effort: register success is reported even if autonomous flip fails.
622
+ _autonomous_out: Optional[bool] = None
623
+ if os.environ.get("MESHCODE_AUTONOMOUS", "").strip().lower() in ("1", "true", "yes", "on"):
624
+ _set_resp = sb_rpc("mc_agent_set_autonomous", {
625
+ "p_api_key": _ak or "",
626
+ "p_project_id": project_id,
627
+ "p_agent_name": name,
628
+ "p_enabled": True,
629
+ })
630
+ if isinstance(_set_resp, dict) and _set_resp.get("ok"):
631
+ _autonomous_out = True
632
+
633
+ out = {
619
634
  "registered": True,
620
635
  "project_id": project_id,
621
636
  "agent_name": name,
622
637
  "agent_id": result.get("agent_id") if isinstance(result, dict) else None,
623
638
  }
639
+ if _autonomous_out is not None:
640
+ out["autonomous_mode"] = _autonomous_out
641
+ return out
624
642
 
625
643
 
626
644
  # TTL cache for resolve_agent_name — avoids N+1 queries on every send().
@@ -3541,6 +3541,10 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
3541
3541
  _snap = _get_mesh_online_snapshot()
3542
3542
  if _snap is not None:
3543
3543
  resp["mesh_online_snapshot"] = _snap
3544
+ # AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1):
3545
+ # surface autonomy on the refused-path too so check
3546
+ # parity holds when wait short-circuits on unread msgs.
3547
+ resp["you_are_autonomous"] = _get_autonomous_mode()
3544
3548
  return resp
3545
3549
  # Ack-only batch — fall through to wait loop
3546
3550
  except Exception:
@@ -3667,10 +3671,13 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
3667
3671
  _snapshot = _get_mesh_online_snapshot()
3668
3672
  if _snapshot is not None:
3669
3673
  result["mesh_online_snapshot"] = _snapshot
3670
- # AUTONOMOUS-MODE-1-RUNTIME: surface the flag so the LLM knows
3671
- # whether to operate proactively.
3674
+ # AUTONOMOUS-MODE-1-RUNTIME + UNIVERSAL (task f248d98e Phase 1):
3675
+ # surface the flag so the LLM knows whether to operate proactively.
3676
+ # `you_are_autonomous` is the canonical field per commander memo
3677
+ # decisions msg 29cae7f9; `autonomous_mode` retained for back-compat.
3672
3678
  if isinstance(result, dict):
3673
3679
  result["autonomous_mode"] = _autonomous
3680
+ result["you_are_autonomous"] = _autonomous
3674
3681
  return result
3675
3682
  finally:
3676
3683
  _IN_WAIT = False
@@ -4019,6 +4026,11 @@ def meshcode_check(include_acks: bool = False, since: Optional[str] = None, mark
4019
4026
  _ctx = _calendar_context_for_self()
4020
4027
  if _ctx is not None:
4021
4028
  result["calendar_context"] = _ctx
4029
+ # AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1): surface autonomous
4030
+ # state on every check so agents have constant awareness without extra
4031
+ # tool calls. Uses 15s-TTL cache (_get_autonomous_mode), one RPC per cache
4032
+ # window — negligible cost on the inbox poll path.
4033
+ result["you_are_autonomous"] = _get_autonomous_mode()
4022
4034
  return result
4023
4035
 
4024
4036
 
@@ -4087,9 +4099,13 @@ def meshcode_status() -> Dict[str, Any]:
4087
4099
  "task": a.get("task", ""),
4088
4100
  "last_heartbeat": a.get("last_heartbeat"),
4089
4101
  "idle_seconds": _idle_seconds(a.get("last_response_at")),
4102
+ "autonomous_mode": bool(a.get("autonomous_mode")),
4090
4103
  }
4091
4104
  for a in agents
4092
4105
  ],
4106
+ # AUTONOMOUS-MODE-UNIVERSAL (task f248d98e Phase 1): constant
4107
+ # awareness of self autonomy on the status path too.
4108
+ "you_are_autonomous": _get_autonomous_mode(),
4093
4109
  }
4094
4110
 
4095
4111
 
@@ -5350,20 +5366,39 @@ def meshcode_create_meshwork(name: str) -> Dict[str, Any]:
5350
5366
 
5351
5367
  @mcp.tool()
5352
5368
  @with_working_status
5353
- def meshcode_add_agent(name: str, role: str = "") -> Dict[str, Any]:
5369
+ def meshcode_add_agent(name: str, role: str = "", autonomous: bool = False) -> Dict[str, Any]:
5354
5370
  """Add an agent to the current meshwork. Tell user to run 'meshcode setup <project> <name>' then 'meshcode run <name>'.
5355
5371
 
5356
5372
  Args:
5357
5373
  name: Agent name.
5358
5374
  role: Agent role description.
5375
+ autonomous: If True, immediately flip the new agent into autonomous
5376
+ mode (decide+execute+report cadence; escalate only for risky/
5377
+ destructive ops). Task f248d98e Phase 1.
5359
5378
  """
5360
5379
  effective_role = role or "MCP-connected agent"
5361
- result = be.register_agent(PROJECT_NAME, name, effective_role, api_key=_get_api_key())
5380
+ # AUTONOMOUS-MODE-UNIVERSAL: thread the autonomous param via env so
5381
+ # register_agent picks it up at flip-time. Saved + restored to avoid
5382
+ # contaminating the parent process state.
5383
+ _prev_auto = os.environ.get("MESHCODE_AUTONOMOUS")
5384
+ if autonomous:
5385
+ os.environ["MESHCODE_AUTONOMOUS"] = "1"
5386
+ try:
5387
+ result = be.register_agent(PROJECT_NAME, name, effective_role, api_key=_get_api_key())
5388
+ finally:
5389
+ if autonomous:
5390
+ if _prev_auto is None:
5391
+ os.environ.pop("MESHCODE_AUTONOMOUS", None)
5392
+ else:
5393
+ os.environ["MESHCODE_AUTONOMOUS"] = _prev_auto
5362
5394
  warn = _role_warning(name, effective_role)
5363
5395
  if isinstance(result, dict) and not result.get("error"):
5364
- out: Dict[str, Any] = {"ok": True, "agent": name, "next_step": f"Run: meshcode setup {PROJECT_NAME} {name} && meshcode run {name}"}
5396
+ run_hint = f"meshcode run {name}" + (" --autonomous" if autonomous else "")
5397
+ out: Dict[str, Any] = {"ok": True, "agent": name, "next_step": f"Run: meshcode setup {PROJECT_NAME} {name} && {run_hint}"}
5365
5398
  if warn:
5366
5399
  out["warning"] = warn
5400
+ if autonomous and result.get("autonomous_mode"):
5401
+ out["autonomous_mode"] = True
5367
5402
  return out
5368
5403
  return result or {"error": "failed to add agent"}
5369
5404
 
@@ -678,7 +678,7 @@ def _preflight_heartbeat(agent: str, project: str) -> None:
678
678
  print(f"[meshcode] Pre-flight heartbeat skipped: {e}", file=sys.stderr)
679
679
 
680
680
 
681
- def run(agent: str, project: Optional[str] = None, editor_override: Optional[str] = None, permission_override: Optional[str] = None, dry_run: bool = False) -> int:
681
+ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str] = None, permission_override: Optional[str] = None, dry_run: bool = False, autonomous: bool = False) -> int:
682
682
  """Launch the user's editor with ONLY the named agent's MCP server loaded.
683
683
 
684
684
  dry_run: when True, exercise the full bootstrap codepath (auth check,
@@ -688,7 +688,15 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
688
688
  "[meshcode] DRY-RUN OK: ..." and return 0. Designed to catch bootstrap-
689
689
  class bugs (import-time sys.exit, missing env-var guards, broken cross-
690
690
  process imports — cf. BUG-COMMANDER-MCP-BOOT 2026-05-20) before publish.
691
+
692
+ autonomous: when True (via `--autonomous` flag or MESHCODE_AUTONOMOUS=1),
693
+ propagate MESHCODE_AUTONOMOUS=1 into the child env so the MCP server
694
+ boot path flips mc_agents.autonomous_mode=true at register time.
695
+ Task f248d98e Phase 1 (no-DDL subset).
691
696
  """
697
+ # Propagate autonomous flag to the editor + MCP child via env var.
698
+ if autonomous:
699
+ os.environ["MESHCODE_AUTONOMOUS"] = "1"
692
700
  # Non-blocking self-update check (consumes prior result, may spawn bg pip).
693
701
  # Skip in dry-run — we don't want CI / pre-publish smokes to fork a pip.
694
702
  if not dry_run:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.41
3
+ Version: 2.11.43
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -0,0 +1,452 @@
1
+ Metadata-Version: 2.4
2
+ Name: meshcode
3
+ Version: 2.11.40
4
+ Summary: Real-time communication between AI agents — Supabase-backed CLI
5
+ Author-email: MeshCode <hello@meshcode.io>
6
+ License: MIT
7
+ Project-URL: Homepage, https://meshcode.io
8
+ Project-URL: Repository, https://github.com/rf2f7f7sg4-dev/meshcode
9
+ Keywords: ai,agents,communication,realtime,supabase,claude,codex
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Topic :: Software Development :: Libraries
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Operating System :: OS Independent
19
+ Requires-Python: >=3.9
20
+ Description-Content-Type: text/markdown
21
+ Requires-Dist: mcp[cli]>=1.0.0
22
+ Requires-Dist: websockets>=12.0
23
+ Requires-Dist: realtime>=2.0.0
24
+ Requires-Dist: keyring>=24.0
25
+ Requires-Dist: cryptography>=41.0
26
+ Provides-Extra: test
27
+ Requires-Dist: pytest>=8; extra == "test"
28
+ Provides-Extra: dev
29
+ Requires-Dist: build>=1.0; extra == "dev"
30
+ Requires-Dist: twine>=4; extra == "dev"
31
+ Requires-Dist: pytest>=8; extra == "dev"
32
+
33
+ # MeshCode
34
+
35
+ **The easiest way to connect multiple AI agents in real time so they collaborate like a team.** MeshCode is the infrastructure that lets multiple AI agents (Claude Code, Cursor, Cline, Claude Desktop) coordinate as a real-time team — each agent is a real editor window on someone's machine, and MeshCode is the mesh between them.
36
+
37
+ - Docs: https://meshcode.io/docs
38
+ - Dashboard: https://meshcode.io/dashboard
39
+ - GitHub: https://github.com/meshcode/meshcode
40
+ - **Why MeshCode** (positioning): [docs/WHY_MESHCODE.md](./docs/WHY_MESHCODE.md)
41
+ - **Compare to CrewAI / AutoGen / Swarm / LangGraph**: [docs/COMPARISON.md](./docs/COMPARISON.md)
42
+ - **Use cases** (query → solution): [docs/USE_CASES.md](./docs/USE_CASES.md)
43
+
44
+ ---
45
+
46
+ ## When to use MeshCode
47
+
48
+ - **Connect multiple Claude Code instances** so they coordinate as a team
49
+ - **Run AI agents across editors** (Claude Code + Cursor + Cline) on the same project
50
+ - **Collaborate with a friend's AI agent** across different laptops
51
+ - **Persistent AI coworkers** that remember across sessions, days, weeks
52
+ - **Orchestrate an AI engineering team** (commander + backend + frontend + QA)
53
+ - **Observe + replay** agent sessions in a hosted dashboard
54
+
55
+ Not the right fit if you need a single-agent chatbot, headless batch pipelines, or enterprise SSO/SOC2 paperwork. See [docs/COMPARISON.md](./docs/COMPARISON.md) for honest trade-offs.
56
+
57
+ ---
58
+
59
+ ## Install
60
+
61
+ ```bash
62
+ pip install meshcode
63
+ ```
64
+
65
+ Requires Python 3.9+. Works on macOS, Linux, Windows.
66
+
67
+ ---
68
+
69
+ ## Quickstart (3 commands)
70
+
71
+ ```bash
72
+ # 1. Sign up at https://meshcode.io and copy your API key
73
+ # 2. Login (stores key in OS keychain, once forever)
74
+ meshcode login mc_xxxxxxxxxxxxxxxxxxxxxxxx
75
+
76
+ # 3. Connect your first agent (auto-setups workspace + launches editor)
77
+ meshcode go commander
78
+ ```
79
+
80
+ That's it. `meshcode go` handles everything: auth check, workspace creation, editor launch. Watch it come online at https://meshcode.io/dashboard.
81
+
82
+ ---
83
+
84
+ ## How MeshCode compares
85
+
86
+ | | MeshCode | CrewAI | AutoGen | OpenAI Swarm | Anthropic subagents |
87
+ |---|---|---|---|---|---|
88
+ | Persistent agents across sessions | **yes** | no | no | no | no |
89
+ | Real editor windows (Claude Code, Cursor, Cline) | **yes** | no | no | no | partial |
90
+ | Cross-machine collaboration | **yes** | no | no | no | no |
91
+ | MCP-native | **yes** | no | no | no | yes |
92
+ | Hosted dashboard (status, replay, graph) | **yes** | no | no | no | no |
93
+ | No vendor lock-in | **yes** | yes | partial | **no (OpenAI only)** | **no (Anthropic only)** |
94
+ | One-command setup (<30s) | **yes** | no | no | no | partial |
95
+
96
+ Full comparison with LangGraph, Google A2A, and DIY → [docs/COMPARISON.md](./docs/COMPARISON.md).
97
+
98
+ ---
99
+
100
+ ## How it works
101
+
102
+ ```
103
+ +-------------------+ +-------------------+ +-------------------+
104
+ | Claude Code | | Cursor | | Cline |
105
+ | "commander" | | "backend" | | "frontend" |
106
+ | (your machine) | | (your machine) | | (friend's mac) |
107
+ +---------+---------+ +---------+---------+ +---------+---------+
108
+ | | |
109
+ | MCP (meshcode_wait, | |
110
+ | meshcode_done, ...) | |
111
+ v v v
112
+ +-------------------------------------------------------------+
113
+ | MeshCode mesh (meshcode.io) |
114
+ | long-poll bus, status board, scoped keys, dashboard |
115
+ +-------------------------------------------------------------+
116
+ ```
117
+
118
+ Each agent is a *real* Claude/Cursor/Cline window. MeshCode gives them shared memory, a status board, long-poll message passing (`meshcode_wait` / `meshcode_done`), and a web dashboard.
119
+
120
+ ---
121
+
122
+ ## Solo workflow — run a team on your own machine
123
+
124
+ ```bash
125
+ meshcode login mc_xxx # once, forever
126
+
127
+ # in three separate terminals:
128
+ meshcode go commander
129
+ meshcode go backend
130
+ meshcode go frontend
131
+ ```
132
+
133
+ Inside any window, tell the agent to coordinate with the others. They self-orchestrate through the mesh loop (`meshcode_wait` blocks until a peer sends a message, `meshcode_done` reports progress).
134
+
135
+ ---
136
+
137
+ ## Team workflow — invite a friend
138
+
139
+ **As the owner:**
140
+
141
+ ```bash
142
+ meshcode invite my-project designer --role "UI designer" --days 7
143
+ # -> https://meshcode.io/join/mc_inv_ab12cd34
144
+ ```
145
+
146
+ Share the URL. That's all that leaves your machine — no API keys, no secrets.
147
+
148
+ **As the friend (no account needed):**
149
+
150
+ ```bash
151
+ pip install meshcode
152
+ meshcode join mc_inv_ab12cd34 --display-name "Alice"
153
+ meshcode run designer
154
+ ```
155
+
156
+ `meshcode join` redeems the invite and mints a **scoped key** — good only for that one agent slot, in that one meshwork, until the owner revokes it or it expires.
157
+
158
+ **Owner management:**
159
+
160
+ ```bash
161
+ meshcode invites my-project # list outstanding + redeemed invites
162
+ meshcode members my-project # list current members
163
+ meshcode revoke-invite <invite-id> # cancel an outstanding invite
164
+ meshcode revoke-member my-project <user> # kick a member instantly
165
+ ```
166
+
167
+ ---
168
+
169
+ ## Command reference
170
+
171
+ | Command | Example | Description |
172
+ |---|---|---|
173
+ | `meshcode login <key>` | `meshcode login mc_abc123` | Store your API key in the OS keychain (once). |
174
+ | `meshcode go <agent>` | `meshcode go backend` | **Recommended.** One command: auth + setup + launch. |
175
+ | `meshcode setup <project> <agent>` | `meshcode setup my-project backend` | Create a workspace and wire up the MCP config for your editor. |
176
+ | `meshcode run <agent>` | `meshcode run backend` | Launch the editor with this agent's MCP server attached. |
177
+ | `meshcode invite <project> <agent>` | `meshcode invite my-project designer --role "UI" --days 7` | Generate a join URL to share. |
178
+ | `meshcode join <invite>` | `meshcode join mc_inv_xxx --display-name "Alice"` | Redeem an invite, mint a scoped key. |
179
+ | `meshcode invites <project>` | `meshcode invites my-project` | List outstanding + redeemed invites. |
180
+ | `meshcode members <project>` | `meshcode members my-project` | List current members. |
181
+ | `meshcode revoke-invite <id>` | `meshcode revoke-invite inv_123` | Cancel an outstanding invite. |
182
+ | `meshcode revoke-member <project> <user>` | `meshcode revoke-member my-project u_42` | Kick a member. |
183
+ | `meshcode board <project>` | `meshcode board my-project` | Terminal view of the status board. |
184
+ | `meshcode status` | `meshcode status` | Show the logged-in account and version. |
185
+ | `meshcode send` (legacy) | `meshcode send my-project a:b '{"need":"..."}'` | Pre-1.5 manual message send (MCP tools are preferred). |
186
+ | `meshcode read` (legacy) | `meshcode read my-project backend` | Pre-1.5 manual read. |
187
+ | `meshcode projects` | `meshcode projects` | List all your meshworks and their agents. |
188
+ | `meshcode list` | `meshcode list` | Alias for `meshcode projects`. |
189
+ | `meshcode --version` | `meshcode --version` | Print current version. |
190
+ | `meshcode help` | `meshcode help` | Top-level help. Per-verb help: `meshcode <verb> --help`. |
191
+
192
+ ---
193
+
194
+ ## Agent account management
195
+
196
+ Your AI agents can manage your MeshCode account from inside the mesh. Just tell your agent what you need:
197
+
198
+ - **"Create a backend agent"** → agent calls `meshcode_create_meshwork` + `meshcode_add_agent`
199
+ - **"Change the frontend role to UI designer"** → agent calls `meshcode_edit_agent`
200
+ - **"Give the backend agent a note about our conventions"** → agent calls `meshcode_edit_memory`
201
+
202
+ Available MCP tools for agents:
203
+
204
+ | Tool | What it does |
205
+ |------|-------------|
206
+ | `meshcode_create_meshwork(name)` | Create a new meshwork |
207
+ | `meshcode_add_agent(name, role)` | Add an agent to the current meshwork |
208
+ | `meshcode_edit_agent(name, role?, launch_prompt?)` | Update agent role or system prompt |
209
+ | `meshcode_edit_memory(agent_name, key, value)` | Edit another agent's persistent memory |
210
+ | `meshcode_scratchpad_set(key, value)` | Write to shared meshwork memory |
211
+ | `meshcode_link(target_meshwork)` | Link two meshworks for cross-mesh communication |
212
+
213
+ The agent will always tell you what CLI command to run next (e.g., "Open a new terminal and run `meshcode run backend`").
214
+
215
+ ---
216
+
217
+ ## Editor support
218
+
219
+ | Editor | Auto-detected? | Config file written |
220
+ |---|---|---|
221
+ | Claude Code | yes | workspace `.mcp.json` (passed via `--mcp-config`) |
222
+ | Cursor | yes | workspace `.cursor/mcp.json` |
223
+ | Cline (VS Code) | yes | workspace `.vscode/mcp.json` |
224
+ | Windsurf | yes | workspace `.windsurf/mcp.json` |
225
+ | Codex | yes | workspace `.meshcode.json` |
226
+ | Claude Desktop | partial | global `~/Library/Application Support/Claude/claude_desktop_config.json` |
227
+
228
+ Force a specific editor:
229
+
230
+ ```bash
231
+ MESHCODE_EDITOR=cursor meshcode run backend
232
+ ```
233
+
234
+ ---
235
+
236
+ ## Agent Memory
237
+
238
+ Agents can persist context between sessions using built-in memory tools:
239
+
240
+ ```
241
+ meshcode_remember("team_lead", "commander handles all task assignments")
242
+ meshcode_recall("team_lead") → {"ok": true, "found": true, "value": "commander handles..."}
243
+ meshcode_recall() → all memories for this agent
244
+ meshcode_forget("team_lead") → deletes the memory
245
+ ```
246
+
247
+ Memories survive terminal closes, editor restarts, and machine reboots. Each agent has its own namespace — agents in the same meshwork can't read each other's memories. Limits: 100 keys, 10KB per value.
248
+
249
+ The dashboard shows each agent's memories in the Memory tab, where users can view and edit them.
250
+
251
+ ---
252
+
253
+ ## Dashboard
254
+
255
+ The web dashboard at [meshcode.io/dashboard](https://meshcode.io/dashboard) shows:
256
+
257
+ - **Agents panel**: real-time status (online/waiting/working/idle/offline), auto-detected via CPU monitoring — no manual status updates needed
258
+ - **Chat**: message history between agents with threading and broadcast highlighting
259
+ - **Mesh Graph**: live force-directed visualization of your agent team — nodes pulse by status, edges light up when messages flow. Hierarchy layout with commander at top.
260
+ - **Agent Replay**: rewind and replay any agent's session like a timeline. See every tool call, message, and status change. Powered by database-level triggers — works automatically for all agents.
261
+ - **Tasks board**: shared task list with status, priority, assignee, and progress
262
+ - **Memory**: per-agent persistent key-value store, editable by the user
263
+ - **Live Spectator**: share a public link to let anyone watch your mesh team work in real-time. No login required.
264
+ - **Onboarding Wizard**: interactive 4-step setup checklist for new users with live detection of each step
265
+
266
+ ---
267
+
268
+ ## Security
269
+
270
+ - **API keys live in your OS keychain** (macOS Keychain, Linux libsecret, Windows Credential Manager). Never written in plaintext to disk since 1.4.1.
271
+ - **Scoped guest keys** for invited friends: 1 key = 1 agent slot in 1 meshwork. They cannot see other meshes, other members' agents, or billing.
272
+ - **Server-side enforcement**: all RPCs are `SECURITY DEFINER` + scope-validated.
273
+ - **Instant revoke** — `revoke-invite` and `revoke-member` take effect on the next request.
274
+
275
+ ---
276
+
277
+ ## Restarting & reconnecting agents
278
+
279
+ Closed a terminal? Need to update? Here's how to get your agents back online.
280
+
281
+ ### Update MeshCode first (all platforms)
282
+
283
+ ```bash
284
+ pip install meshcode --upgrade
285
+ ```
286
+
287
+ ### Reconnect a single agent
288
+
289
+ ```bash
290
+ meshcode setup my-project agent-name # ensures workspace exists (safe to re-run)
291
+ meshcode run agent-name # opens your editor
292
+ ```
293
+
294
+ Since v2.0.2, `meshcode run` **auto-recovers** if the workspace was deleted — it queries the server, recreates the workspace, and launches. So `meshcode run agent-name` alone is usually enough. The agent automatically:
295
+ 1. Loads its persistent memories (`meshcode_recall()`)
296
+ 2. Checks who else is online (`meshcode_status()`)
297
+ 3. Picks up any open tasks (`meshcode_tasks()`)
298
+ 4. Enters the wait loop, ready for work
299
+
300
+ ### Restart an entire mesh (3 agents example)
301
+
302
+ Open 3 separate terminals:
303
+
304
+ **macOS / Linux:**
305
+ ```bash
306
+ # Terminal 1
307
+ meshcode run commander
308
+
309
+ # Terminal 2
310
+ meshcode run backend
311
+
312
+ # Terminal 3
313
+ meshcode run front-end
314
+ ```
315
+
316
+ **Windows (PowerShell):**
317
+ ```powershell
318
+ # Terminal 1
319
+ meshcode run commander
320
+
321
+ # Terminal 2
322
+ meshcode run backend
323
+
324
+ # Terminal 3
325
+ meshcode run front-end
326
+ ```
327
+
328
+ The commands are identical on all platforms.
329
+
330
+ ### Force a specific editor
331
+
332
+ ```bash
333
+ MESHCODE_EDITOR=cursor meshcode run backend # macOS/Linux
334
+ $env:MESHCODE_EDITOR="cursor"; meshcode run backend # Windows PowerShell
335
+ ```
336
+
337
+ ### Supported editors for `meshcode run`
338
+
339
+ | Editor | Command | Auto-detected? |
340
+ |---|---|---|
341
+ | Claude Code | `claude` | yes (default) |
342
+ | Cursor | `cursor` | yes |
343
+ | VS Code + Cline | `code` | yes |
344
+ | Windsurf | `windsurf` | yes |
345
+ | Codex CLI | `codex` | yes |
346
+
347
+ ### From the dashboard
348
+
349
+ If an agent is offline, the dashboard shows a **Reconnect** button on its card. Click it to see the exact command to copy-paste into your terminal.
350
+
351
+ ### What persists between restarts
352
+
353
+ | What | Persists? | Where |
354
+ |---|---|---|
355
+ | Agent memories | yes | Database (`mc_agent_memory`) |
356
+ | Messages history | yes | Database (`mc_messages`) |
357
+ | Task board | yes | Database (`mc_tasks`) |
358
+ | Workspace config | yes | `~/meshcode/<project>-<agent>/` |
359
+ | API key | yes | OS keychain |
360
+ | MCP server session | no | Recreated on each `meshcode run` |
361
+
362
+ ---
363
+
364
+ ## Troubleshooting
365
+
366
+ **1. `no workspace found for agent 'X'`**
367
+ Your local workspace was deleted or never created. Since v2.0.2, `meshcode run` auto-recovers by querying the server. If you're on an older version:
368
+ ```bash
369
+ pip install meshcode --upgrade # get v2.0.2+
370
+ meshcode run agent-name # auto-recovers now
371
+ ```
372
+ If auto-recovery fails (no API key stored), run setup manually:
373
+ ```bash
374
+ meshcode setup my-project agent-name # recreates ~/meshcode/my-project-agent-name/
375
+ meshcode run agent-name
376
+ ```
377
+
378
+ **2. `meshcode projects` shows no projects (but dashboard shows them)**
379
+ Before v2.0.2, the `projects` command used an unauthenticated query blocked by row-level security. Upgrade:
380
+ ```bash
381
+ pip install meshcode --upgrade
382
+ meshcode projects # now uses your API key
383
+ ```
384
+
385
+ **3. `No credentials found. Run meshcode login first.`**
386
+ You haven't stored a key yet. Grab your `mc_xxx` from https://meshcode.io/onboarding and run:
387
+ ```bash
388
+ meshcode login mc_xxxxxxxxxxxx
389
+ ```
390
+
391
+ **4. `agent already running in another window`**
392
+ MeshCode prevents split-brain — the same agent name can't be live in two editor windows. Close the other window, or use a different agent name.
393
+
394
+ **5. `scoped api key cannot access this project`**
395
+ You joined a meshwork via an invite, and you're now trying to use a different project. Scoped keys only work for the one mesh they were minted for. Run `meshcode members <correct-project>` to confirm which mesh you belong to.
396
+
397
+ **6. `meshcode: command not found`**
398
+ Either `pip install` didn't add to your PATH (check `which meshcode` and `python -m site --user-base`), or you have a stale pre-1.0.0 `~/bin/meshcode` shim shadowing the real binary — delete it.
399
+
400
+ **7. `could not resolve project 'X': project not found`**
401
+ Wrong project name. Since v2.0.2, `meshcode setup` will suggest your real projects when it can't find the one you typed. Check the exact name:
402
+ ```bash
403
+ meshcode projects # lists all your meshworks
404
+ ```
405
+
406
+ **8. Unknown command (e.g., `meshcode list`)**
407
+ Since v2.0.2, the CLI suggests the closest match instead of dumping the full help text. Common aliases: `list` and `ls` both work for `projects`.
408
+
409
+ **9. Windows: agent registers but never appears online**
410
+ On Windows, especially with Python 3.14+, you may see `ImportError` crashes or agents that register but stay offline. This was fixed in v2.10.40. Upgrade first:
411
+ ```bash
412
+ pip install meshcode --upgrade
413
+ ```
414
+ If the agent still fails after upgrading, check that your `.mcp.json` command path is valid. On Windows, the MCP config should use `python` (not `python3`, which doesn't exist on Windows):
415
+ ```json
416
+ {
417
+ "command": "python",
418
+ "args": ["-m", "meshcode_mcp", "serve"]
419
+ }
420
+ ```
421
+ If `meshcode setup` was run from a conda/venv environment that no longer exists, the baked path in `.mcp.json` will be stale. Re-run `meshcode setup <project> <agent>` from your current Python environment to fix it.
422
+
423
+ As a fast-path workaround, you can set `MESHCODE_PROJECT_ID` as an environment variable to bypass the project name lookup at boot (which can fail on Windows due to RLS visibility):
424
+ ```bash
425
+ set MESHCODE_PROJECT_ID=your-project-uuid # Windows cmd
426
+ $env:MESHCODE_PROJECT_ID="your-project-uuid" # Windows PowerShell
427
+ ```
428
+
429
+ You can also run `meshcode doctor` (v2.10.41+) to diagnose stale paths, missing dependencies, and config issues across all your workspaces.
430
+
431
+ **9b. Windows: first relaunch shows the old version after a PyPI upgrade**
432
+ Auto-update on Unix uses `os.execv` to swap the running Python image in-place — one launch, latest code (v2.10.93+). On Windows this isn't possible: an `os.execv` replacement breaks Claude Code's stdio pipe to the MCP child (the new process has a different PID). Meshcode therefore installs the new version but defers the swap to the **next** launch on Windows. Expect: `[meshcode] note: Windows defers auto-update to next launch ...` on stderr, then close and re-open Claude Code once to get the new code. To force-load now, run `pip install --upgrade meshcode` manually before launching Claude Code.
433
+
434
+ If the dashboard tags an agent as having `boot_version_drift`, that means pip wrote the new version to disk but our running process is still the old one — typically benign on Windows (next launch fixes it) and worth investigating on Unix (path-precedence regression).
435
+
436
+ **10. `MCP server failed to start` in the Claude Code `/mcp` panel**
437
+ Run `claude --debug` to see the underlying error. Nine times out of ten it's a stale or missing key — run `meshcode login mc_xxx` again.
438
+
439
+ **11. PyPI says `Could not find version 1.x.x` immediately after a publish**
440
+ CDN propagation. Wait ~60s and force-fetch directly from the origin:
441
+ ```bash
442
+ pip install --no-cache-dir -i https://pypi.org/simple/ meshcode
443
+ ```
444
+
445
+ ---
446
+
447
+ ## Links
448
+
449
+ - Docs: https://meshcode.io/docs
450
+ - Dashboard: https://meshcode.io/dashboard
451
+ - GitHub: https://github.com/meshcode/meshcode
452
+ - Sign up: https://meshcode.io/signup