meshcode 2.10.89__tar.gz → 2.10.91__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 (200) hide show
  1. {meshcode-2.10.89 → meshcode-2.10.91}/PKG-INFO +1 -1
  2. meshcode-2.10.91/meshcode/__init__.py +82 -0
  3. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/server.py +89 -4
  4. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.10.89 → meshcode-2.10.91}/pyproject.toml +1 -1
  6. meshcode-2.10.89/meshcode/__init__.py +0 -82
  7. {meshcode-2.10.89 → meshcode-2.10.91}/README.md +0 -0
  8. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/ascii_art.py +0 -0
  9. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/cli.py +0 -0
  10. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/comms_v4.py +0 -0
  11. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/compat.py +0 -0
  12. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/error_hints.py +0 -0
  13. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/exceptions.py +0 -0
  14. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/invites.py +0 -0
  15. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/launcher.py +0 -0
  16. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/launcher_install.py +0 -0
  17. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/__init__.py +0 -0
  18. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/__main__.py +0 -0
  19. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/backend.py +0 -0
  20. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/realtime.py +0 -0
  21. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/test_backend.py +0 -0
  22. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  23. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  24. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/preferences.py +0 -0
  25. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/protocol_v2.py +0 -0
  26. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/quickstart.py +0 -0
  27. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/run_agent.py +0 -0
  28. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/secrets.py +0 -0
  29. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/self_update.py +0 -0
  30. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/setup_clients.py +0 -0
  31. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/supervisor.py +0 -0
  32. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode/upload.py +0 -0
  33. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/comms_v4.py +0 -0
  34. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  35. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  36. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/cli.py +0 -0
  37. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  38. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/compat.py +0 -0
  39. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  40. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  41. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/invites.py +0 -0
  42. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  43. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  44. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  45. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  46. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  47. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  48. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  49. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  50. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  51. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  52. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  53. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  54. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  55. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  56. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  57. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  58. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  59. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  60. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/meshcode/upload.py +0 -0
  61. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  62. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_core.py +0 -0
  63. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  64. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  65. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  66. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  67. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  68. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  69. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  70. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  71. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  72. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  73. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  74. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  75. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  76. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  77. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  78. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  79. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  80. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  81. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  82. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  83. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  84. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  85. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  86. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  87. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  88. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  89. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  90. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  91. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  92. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  93. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  94. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  95. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  96. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  97. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  98. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  99. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  100. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  101. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/comms_v4.py +0 -0
  102. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  103. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  104. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/cli.py +0 -0
  105. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  106. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/compat.py +0 -0
  107. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  108. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  109. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/invites.py +0 -0
  110. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  111. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  112. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  113. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  114. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  115. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  116. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  117. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  118. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  119. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  120. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  121. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  122. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  123. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  124. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  125. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  126. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  127. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  128. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/meshcode/upload.py +0 -0
  129. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  130. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_core.py +0 -0
  131. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  132. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  133. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  134. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  135. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  136. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  137. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  138. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  139. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  140. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  141. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  142. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/comms_v4.py +0 -0
  143. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  144. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  145. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  146. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  147. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  148. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  149. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  150. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  151. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  152. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  153. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  154. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  155. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  156. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  157. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  158. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  159. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  160. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  161. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  162. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  163. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  164. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  165. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  166. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  167. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  168. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  169. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  170. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  171. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_core.py +0 -0
  172. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  173. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  174. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  175. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  176. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  177. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  178. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  179. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  180. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  181. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  182. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  183. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode.egg-info/SOURCES.txt +0 -0
  184. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode.egg-info/dependency_links.txt +0 -0
  185. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode.egg-info/entry_points.txt +0 -0
  186. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode.egg-info/requires.txt +0 -0
  187. {meshcode-2.10.89 → meshcode-2.10.91}/meshcode.egg-info/top_level.txt +0 -0
  188. {meshcode-2.10.89 → meshcode-2.10.91}/setup.cfg +0 -0
  189. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_core.py +0 -0
  190. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_cross_agent_messaging.py +0 -0
  191. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_esc_deaf_state.py +0 -0
  192. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_exceptions.py +0 -0
  193. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_mark_read_batch.py +0 -0
  194. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_migration_integrity.py +0 -0
  195. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_realtime_event_freshness.py +0 -0
  196. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_rls_cross_tenant.py +0 -0
  197. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_rpc_migrations.py +0 -0
  198. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_security_regressions.py +0 -0
  199. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_sentinel.py +0 -0
  200. {meshcode-2.10.89 → meshcode-2.10.91}/tests/test_status_enum_coverage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.89
3
+ Version: 2.10.91
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,82 @@
1
+ """MeshCode — Real-time communication between AI agents."""
2
+ __version__ = "2.10.91"
3
+
4
+ # Exception hierarchy — eagerly imported (lightweight, no deps)
5
+ from meshcode.exceptions import ( # noqa: F401
6
+ MeshCodeError,
7
+ AuthError,
8
+ RPCError,
9
+ MeshCodeTimeoutError,
10
+ MeshCodeConnectionError,
11
+ )
12
+
13
+ # Public API — lazy imports to avoid heavy deps at import time
14
+ def __getattr__(name):
15
+ if name == "backend":
16
+ from meshcode.meshcode_mcp import backend
17
+ return backend
18
+ if name in _BACKEND_EXPORTS:
19
+ from meshcode.meshcode_mcp import backend
20
+ return getattr(backend, name)
21
+ if name in _SECRETS_EXPORTS:
22
+ from meshcode import secrets
23
+ return getattr(secrets, name)
24
+ raise AttributeError(f"module 'meshcode' has no attribute {name!r}")
25
+
26
+
27
+ # Backend: core messaging & agent management
28
+ _BACKEND_EXPORTS = {
29
+ "send_message",
30
+ "read_inbox",
31
+ "count_pending",
32
+ "get_board",
33
+ "heartbeat",
34
+ "set_status",
35
+ "register_agent",
36
+ "get_project_id",
37
+ "sb_rpc",
38
+ "task_create",
39
+ "task_list",
40
+ "encrypt_payload",
41
+ "decrypt_payload",
42
+ }
43
+
44
+ # Secrets: credential management
45
+ _SECRETS_EXPORTS = {
46
+ "get_api_key",
47
+ "set_api_key",
48
+ "list_profiles",
49
+ }
50
+
51
+ __all__ = [
52
+ "__version__",
53
+ "backend",
54
+ # Exceptions
55
+ "MeshCodeError",
56
+ "AuthError",
57
+ "RPCError",
58
+ "MeshCodeTimeoutError",
59
+ "MeshCodeConnectionError",
60
+ # Messaging
61
+ "send_message",
62
+ "read_inbox",
63
+ "count_pending",
64
+ # Agent management
65
+ "register_agent",
66
+ "get_project_id",
67
+ "get_board",
68
+ "heartbeat",
69
+ "set_status",
70
+ # Tasks
71
+ "task_create",
72
+ "task_list",
73
+ # Low-level
74
+ "sb_rpc",
75
+ # Encryption
76
+ "encrypt_payload",
77
+ "decrypt_payload",
78
+ # Credentials
79
+ "get_api_key",
80
+ "set_api_key",
81
+ "list_profiles",
82
+ ]
@@ -731,6 +731,19 @@ def with_working_status(func):
731
731
  # Auto-log to activity feed (skip noisy read-only tools)
732
732
  if not skip and name not in _ACTIVITY_LOG_SKIP:
733
733
  _log_activity_bg("tool_call", f"{AGENT_NAME}: {name}")
734
+ # Persona hint injection (BE-S4.1.sdk): once per session.
735
+ global _PERSONA_INJECTED
736
+ if (not skip and not _PERSONA_INJECTED and _PERSONA
737
+ and isinstance(result, dict)):
738
+ _hint_fields = {
739
+ k: _PERSONA[k]
740
+ for k in ("tone", "language", "reply_max_tokens",
741
+ "emoji_policy", "decision_style")
742
+ if k in _PERSONA and _PERSONA[k] is not None
743
+ }
744
+ if _hint_fields:
745
+ result.setdefault("persona_hint", _hint_fields)
746
+ _PERSONA_INJECTED = True
734
747
  return result
735
748
  except asyncio.CancelledError:
736
749
  log.debug(f"[meshcode] tool {name} cancelled by client (ESC)")
@@ -759,6 +772,22 @@ def with_working_status(func):
759
772
  result = func(*args, **kwargs)
760
773
  if not skip and name not in _ACTIVITY_LOG_SKIP:
761
774
  _log_activity_bg("tool_call", f"{AGENT_NAME}: {name}")
775
+ # Persona hint injection (BE-S4.1.sdk): on the FIRST non-wait
776
+ # tool call after boot, attach a persona_hint envelope so the
777
+ # LLM stays in voice. Only once per session — agents are
778
+ # supposed to internalize tone after seeing it once.
779
+ global _PERSONA_INJECTED
780
+ if (not skip and not _PERSONA_INJECTED and _PERSONA
781
+ and isinstance(result, dict)):
782
+ _hint_fields = {
783
+ k: _PERSONA[k]
784
+ for k in ("tone", "language", "reply_max_tokens",
785
+ "emoji_policy", "decision_style")
786
+ if k in _PERSONA and _PERSONA[k] is not None
787
+ }
788
+ if _hint_fields:
789
+ result.setdefault("persona_hint", _hint_fields)
790
+ _PERSONA_INJECTED = True
762
791
  return result
763
792
  except Exception as e:
764
793
  if not skip:
@@ -790,6 +819,11 @@ _BOOT_PPID = os.getppid()
790
819
  _BOOT_CONTEXT_BUNDLE: Optional[Dict[str, Any]] = None
791
820
  _BOOT_CONTEXT_AT: float = 0.0
792
821
  _BOOT_CONTEXT_TTL_SECONDS: float = 30.0
822
+ # Per-agent persona JSONB (mig 232) cached at lifespan start. Drives tone /
823
+ # voice / reply length on first tool call after boot. TTL infinite within a
824
+ # session — persona changes are rare and need a relaunch to take effect.
825
+ _PERSONA: Optional[Dict[str, Any]] = None
826
+ _PERSONA_INJECTED: bool = False
793
827
 
794
828
  def _acquire_lease() -> bool:
795
829
  api_key = _get_api_key()
@@ -1640,6 +1674,28 @@ async def lifespan(_app):
1640
1674
  log.warning(f"initial heartbeat attempt {_attempt+1} failed: {e}")
1641
1675
  import time; time.sleep(2)
1642
1676
 
1677
+ # Per-agent persona (BE-S4.1.sdk / mig 232): tone/voice/policy that
1678
+ # shapes how the agent talks. Loaded once per session; soft-fail if the
1679
+ # RPC is unavailable on older projects.
1680
+ global _PERSONA
1681
+ try:
1682
+ _persona_resp = be.sb_rpc("mc_agent_persona", {
1683
+ "p_api_key": _get_api_key(),
1684
+ "p_project_id": _PROJECT_ID,
1685
+ "p_agent_name": AGENT_NAME,
1686
+ })
1687
+ if isinstance(_persona_resp, dict) and _persona_resp.get("ok"):
1688
+ _PERSONA = _persona_resp.get("persona") or {}
1689
+ log.info(
1690
+ f"[meshcode] persona loaded: tone={_PERSONA.get('tone','default')} "
1691
+ f"language={_PERSONA.get('language','en')} "
1692
+ f"reply_max_tokens={_PERSONA.get('reply_max_tokens','unset')}"
1693
+ )
1694
+ else:
1695
+ log.debug(f"persona load returned non-ok: {_persona_resp} — continuing without")
1696
+ except Exception as e:
1697
+ log.debug(f"persona RPC unavailable ({e}) — continuing without")
1698
+
1643
1699
  # Boot-context bundle (S1-2.F2 / mig 217): single RPC returns last_seen
1644
1700
  # + recent msgs + open tasks + relevant memories + peer state. Cached on
1645
1701
  # the module global so the first ~30s of tool calls can short-circuit.
@@ -1786,8 +1842,16 @@ async def meshcode_debug_sleep(seconds: int = 30) -> Dict[str, Any]:
1786
1842
  @mcp.tool()
1787
1843
  @with_working_status
1788
1844
  def meshcode_send(to: str, message: Any, in_reply_to: Optional[str] = None,
1789
- sensitive: bool = False, encrypted: bool = False) -> Dict[str, Any]:
1790
- """Send message. Use "agent@meshwork" for cross-mesh. sensitive=True hides from exports. Pass encrypted=True for secrets/credentials (AES-256-GCM)."""
1845
+ sensitive: bool = False, encrypted: bool = False,
1846
+ type: Optional[str] = None) -> Dict[str, Any]:
1847
+ """Send message. Use "agent@meshwork" for cross-mesh. sensitive=True hides from exports. Pass encrypted=True for secrets/credentials (AES-256-GCM).
1848
+
1849
+ Optional `type` argument (mig 233 typed catalog): one of report, ask,
1850
+ proposal, status, blocker, decision, broadcast, ack, msg, dm, etc.
1851
+ When passed, the SDK soft-validates the payload against the schema
1852
+ in mc_message_schema(p_type) and logs a warning on mismatch — never
1853
+ refuses the send (per memory feedback_meshcode_wait_mark_read).
1854
+ """
1791
1855
  if not to or not to.strip():
1792
1856
  return {"error": "recipient 'to' cannot be empty"}
1793
1857
  to = to.strip()
@@ -1816,6 +1880,26 @@ def meshcode_send(to: str, message: Any, in_reply_to: Optional[str] = None,
1816
1880
  if _payload_len > 2000:
1817
1881
  return {"error": f"message too large ({_payload_len} chars). Use meshcode_task_create for long content. Messages must be structured JSON <2000 chars."}
1818
1882
 
1883
+ # Typed-catalog soft validation (BE-S4.2.sdk / mig 233): if caller
1884
+ # passes type=, fetch the schema and check required fields. NEVER
1885
+ # refuses the send — best-effort warn-only. Skips when no type given,
1886
+ # when schema fetch fails, or when the type is unknown.
1887
+ if type:
1888
+ try:
1889
+ _schema_resp = be.sb_rpc("mc_message_schema", {"p_type": type})
1890
+ if isinstance(_schema_resp, dict) and _schema_resp.get("ok"):
1891
+ _schema = _schema_resp.get("schema") or {}
1892
+ _required = (_schema.get("required") or []) if isinstance(_schema, dict) else []
1893
+ _missing = [k for k in _required if k not in payload]
1894
+ if _missing:
1895
+ log.warning(
1896
+ f"meshcode_send type={type!r} payload missing required "
1897
+ f"fields {_missing} per mc_message_schema. Sending anyway "
1898
+ f"(soft validation)."
1899
+ )
1900
+ except Exception as _vex:
1901
+ log.debug(f"type-schema validation skipped: {_vex}")
1902
+
1819
1903
  # Cross-mesh routing: if 'to' contains '@', parse as agent@meshwork
1820
1904
  if "@" in to:
1821
1905
  target_agent, target_meshwork = to.split("@", 1)
@@ -1848,13 +1932,14 @@ def meshcode_send(to: str, message: Any, in_reply_to: Optional[str] = None,
1848
1932
  "p_to_project": target_meshwork,
1849
1933
  "p_to_agent": target_agent,
1850
1934
  "p_payload": payload,
1851
- "p_type": "msg",
1935
+ "p_type": type or "msg",
1852
1936
  })
1853
1937
  if isinstance(result, dict) and result.get("ok") and encrypted:
1854
1938
  result["encrypted"] = True
1855
1939
  return result
1856
1940
 
1857
- return be.send_message(_PROJECT_ID, AGENT_NAME, to, payload, msg_type="msg",
1941
+ return be.send_message(_PROJECT_ID, AGENT_NAME, to, payload,
1942
+ msg_type=type or "msg",
1858
1943
  parent_msg_id=in_reply_to, sensitive=sensitive,
1859
1944
  api_key=_get_api_key(), encrypted=encrypted)
1860
1945
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.89
3
+ Version: 2.10.91
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.10.89"
7
+ version = "2.10.91"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -1,82 +0,0 @@
1
- """MeshCode — Real-time communication between AI agents."""
2
- __version__ = "2.10.89"
3
-
4
- # Exception hierarchy — eagerly imported (lightweight, no deps)
5
- from meshcode.exceptions import ( # noqa: F401
6
- MeshCodeError,
7
- AuthError,
8
- RPCError,
9
- MeshCodeTimeoutError,
10
- MeshCodeConnectionError,
11
- )
12
-
13
- # Public API — lazy imports to avoid heavy deps at import time
14
- def __getattr__(name):
15
- if name == "backend":
16
- from meshcode.meshcode_mcp import backend
17
- return backend
18
- if name in _BACKEND_EXPORTS:
19
- from meshcode.meshcode_mcp import backend
20
- return getattr(backend, name)
21
- if name in _SECRETS_EXPORTS:
22
- from meshcode import secrets
23
- return getattr(secrets, name)
24
- raise AttributeError(f"module 'meshcode' has no attribute {name!r}")
25
-
26
-
27
- # Backend: core messaging & agent management
28
- _BACKEND_EXPORTS = {
29
- "send_message",
30
- "read_inbox",
31
- "count_pending",
32
- "get_board",
33
- "heartbeat",
34
- "set_status",
35
- "register_agent",
36
- "get_project_id",
37
- "sb_rpc",
38
- "task_create",
39
- "task_list",
40
- "encrypt_payload",
41
- "decrypt_payload",
42
- }
43
-
44
- # Secrets: credential management
45
- _SECRETS_EXPORTS = {
46
- "get_api_key",
47
- "set_api_key",
48
- "list_profiles",
49
- }
50
-
51
- __all__ = [
52
- "__version__",
53
- "backend",
54
- # Exceptions
55
- "MeshCodeError",
56
- "AuthError",
57
- "RPCError",
58
- "MeshCodeTimeoutError",
59
- "MeshCodeConnectionError",
60
- # Messaging
61
- "send_message",
62
- "read_inbox",
63
- "count_pending",
64
- # Agent management
65
- "register_agent",
66
- "get_project_id",
67
- "get_board",
68
- "heartbeat",
69
- "set_status",
70
- # Tasks
71
- "task_create",
72
- "task_list",
73
- # Low-level
74
- "sb_rpc",
75
- # Encryption
76
- "encrypt_payload",
77
- "decrypt_payload",
78
- # Credentials
79
- "get_api_key",
80
- "set_api_key",
81
- "list_profiles",
82
- ]
File without changes
File without changes
File without changes