meshcode 2.11.15__tar.gz → 2.11.16__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 (227) hide show
  1. {meshcode-2.11.15 → meshcode-2.11.16}/PKG-INFO +1 -1
  2. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/__init__.py +1 -1
  3. meshcode-2.11.16/meshcode/rpc_allowlist.py +106 -0
  4. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode.egg-info/SOURCES.txt +2 -0
  6. {meshcode-2.11.15 → meshcode-2.11.16}/pyproject.toml +1 -1
  7. meshcode-2.11.16/tests/test_rpc_grants.py +76 -0
  8. {meshcode-2.11.15 → meshcode-2.11.16}/README.md +0 -0
  9. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/__main__.py +0 -0
  10. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/_stop_hook_template.py +0 -0
  11. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/ascii_art.py +0 -0
  12. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/cli.py +0 -0
  13. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/comms_v4.py +0 -0
  14. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/compat.py +0 -0
  15. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/daemon.py +0 -0
  16. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/date_parse.py +0 -0
  17. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/doctor.py +0 -0
  18. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/error_hints.py +0 -0
  19. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/exceptions.py +0 -0
  20. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/invites.py +0 -0
  21. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/launcher.py +0 -0
  22. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/launcher_install.py +0 -0
  23. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/__init__.py +0 -0
  24. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/__main__.py +0 -0
  25. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/backend.py +0 -0
  26. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/realtime.py +0 -0
  27. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/server.py +0 -0
  28. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  29. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_backend.py +0 -0
  30. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  31. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  32. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  33. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  34. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  35. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/preferences.py +0 -0
  36. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/protocol_handler.py +0 -0
  37. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/protocol_v2.py +0 -0
  38. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/quickstart.py +0 -0
  39. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/run_agent.py +0 -0
  40. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/scripts/check_secrets.py +0 -0
  41. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/scripts/race_rate_harness.py +0 -0
  42. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/secrets.py +0 -0
  43. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/self_update.py +0 -0
  44. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/setup_clients.py +0 -0
  45. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/supervisor.py +0 -0
  46. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode/upload.py +0 -0
  47. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/comms_v4.py +0 -0
  48. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  49. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  50. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/cli.py +0 -0
  51. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  52. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/compat.py +0 -0
  53. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  54. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  55. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/invites.py +0 -0
  56. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  57. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  58. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  59. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  60. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  61. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  62. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  63. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  64. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  65. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  66. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  67. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  68. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  69. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  70. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  71. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  72. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  73. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  74. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/upload.py +0 -0
  75. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  76. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_core.py +0 -0
  77. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  78. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  79. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  80. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  81. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  82. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  83. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  84. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  85. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  86. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  87. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  88. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  89. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  90. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  91. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  92. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  93. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  94. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  95. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  96. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  97. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  98. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  99. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  100. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  101. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  102. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  103. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  104. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  105. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  106. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  107. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  108. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  109. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  110. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  111. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  112. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  113. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  114. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  115. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/comms_v4.py +0 -0
  116. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  117. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  118. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/cli.py +0 -0
  119. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  120. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/compat.py +0 -0
  121. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  122. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  123. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/invites.py +0 -0
  124. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  125. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  126. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  127. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  128. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  129. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  130. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  131. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  132. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  133. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  134. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  135. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  136. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  137. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  138. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  139. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  140. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  141. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  142. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/upload.py +0 -0
  143. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  144. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_core.py +0 -0
  145. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  146. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  147. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  148. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  149. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  150. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  151. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  152. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  153. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  154. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  155. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  156. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/comms_v4.py +0 -0
  157. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  158. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  159. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  160. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  161. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  162. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  163. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  164. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  165. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  166. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  167. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  168. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  169. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  170. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  171. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  172. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  173. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  174. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  175. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  176. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  177. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  178. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  179. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  180. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  181. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  182. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  183. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  184. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  185. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_core.py +0 -0
  186. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  187. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  188. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  189. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  190. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  191. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  192. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  193. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  194. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  195. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  196. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  197. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode.egg-info/dependency_links.txt +0 -0
  198. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode.egg-info/entry_points.txt +0 -0
  199. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode.egg-info/requires.txt +0 -0
  200. {meshcode-2.11.15 → meshcode-2.11.16}/meshcode.egg-info/top_level.txt +0 -0
  201. {meshcode-2.11.15 → meshcode-2.11.16}/setup.cfg +0 -0
  202. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_auto_update_hardening.py +0 -0
  203. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_boot_bug_regression.py +0 -0
  204. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_color_truecolor.py +0 -0
  205. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_core.py +0 -0
  206. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_cross_agent_messaging.py +0 -0
  207. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_date_parse.py +0 -0
  208. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_doctor.py +0 -0
  209. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_epistemic_v1_python_sdk.py +0 -0
  210. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  211. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_esc_deaf_state.py +0 -0
  212. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_exceptions.py +0 -0
  213. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_init_device_code.py +0 -0
  214. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_install_guard.py +0 -0
  215. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_lease_sigterm_release.py +0 -0
  216. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_mark_read_batch.py +0 -0
  217. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_migration_integrity.py +0 -0
  218. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_realtime_event_freshness.py +0 -0
  219. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_rls_cross_tenant.py +0 -0
  220. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_rpc_migrations.py +0 -0
  221. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_security_regressions.py +0 -0
  222. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_sentinel.py +0 -0
  223. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_setup_path.py +0 -0
  224. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_sleep_signals.py +0 -0
  225. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_status_enum_coverage.py +0 -0
  226. {meshcode-2.11.15 → meshcode-2.11.16}/tests/test_stay_on_loop_hook.py +0 -0
  227. {meshcode-2.11.15 → meshcode-2.11.16}/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.15
3
+ Version: 2.11.16
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.15"
2
+ __version__ = "2.11.16"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -0,0 +1,106 @@
1
+ """Single source of truth for agent-callable mc_* RPCs.
2
+
3
+ Used by:
4
+ - mig 334 (GRANT EXECUTE TO anon, authenticated, service_role per name)
5
+ - scripts/check_rpc_grants.py (CI gate calling mc_check_rpc_grants)
6
+ - tests/test_rpc_grants.py (unit test that asserts list invariants)
7
+
8
+ When adding a new agent-callable RPC, add its bare name (no schema, no args)
9
+ here AND issue a mig that grants it. The CI gate then catches drift.
10
+
11
+ Excluded by convention (must NOT be on this list):
12
+ - mc_admin_* (privileged management)
13
+ - mc_billing_* (billing surface)
14
+ - mc_force_* (force operations — service_role only)
15
+ - _mc_* (internal helpers)
16
+
17
+ Exception: mc_force_clear_stale_lease is intentionally agent-callable —
18
+ it's the install-guard's recovery path for orphan leases (mig 086 + 136).
19
+ See FORCE_PREFIX_EXEMPT.
20
+ """
21
+
22
+ FORCE_PREFIX_EXEMPT = {"mc_force_clear_stale_lease"}
23
+
24
+ AGENT_CALLABLE_RPCS = [
25
+ # ── Tasks
26
+ "mc_task_create",
27
+ "mc_task_claim",
28
+ "mc_task_complete",
29
+ "mc_task_reassign",
30
+ "mc_task_cancel",
31
+ "mc_task_reject",
32
+ "mc_task_approve",
33
+ "mc_task_search",
34
+ "mc_task_reschedule", # mig 330
35
+ "mc_task_get_deps", # mig 330
36
+ "mc_tasks_due_soon", # mig 329
37
+ "mc_task_is_blocked", # mig 329
38
+ "mc_task_unblock_chain", # mig 329
39
+ "mc_tasks_for_goal", # mig 230
40
+
41
+ # ── Agents
42
+ "mc_register_agent",
43
+ "mc_agent_set_status_by_api_key",
44
+ "mc_acquire_agent_lease",
45
+ "mc_release_agent_lease",
46
+ "mc_force_clear_stale_lease",
47
+ "mc_heartbeat",
48
+ "mc_get_agent_idle_times", # mig 322
49
+ "mc_agent_persona",
50
+ "mc_agent_time_context", # mig 328
51
+ "mc_agent_time_context_all", # mig 328
52
+
53
+ # ── Boot context
54
+ "mc_boot", # mig 271
55
+ "mc_agent_boot_context",
56
+ "mc_resolve_project",
57
+
58
+ # ── Messages
59
+ "mc_send_message",
60
+ "mc_send_multi",
61
+ "mc_broadcast",
62
+ "mc_log_activity",
63
+ "mc_dispatch_should_refuse", # mig 327
64
+
65
+ # ── Memory
66
+ "mc_memory_set",
67
+ "mc_memory_list",
68
+ "mc_memory_search",
69
+ "mc_memory_contradictions",
70
+
71
+ # ── Decisions / outcomes
72
+ "mc_has_open_decision",
73
+ "mc_decide",
74
+ "mc_outcome",
75
+ "mc_explain",
76
+
77
+ # ── Validation / pairing
78
+ "mc_validate_api_key",
79
+ "mc_create_pairing_session",
80
+ "mc_poll_pairing_session",
81
+
82
+ # ── Device-code OAuth (mig 326)
83
+ "mc_device_code_create",
84
+ "mc_device_code_session_info",
85
+ "mc_device_code_approve",
86
+ "mc_device_code_poll",
87
+ "mc_device_token_validate",
88
+ "mc_device_token_revoke",
89
+ "mc_device_token_rename",
90
+ "mc_device_tokens_list",
91
+
92
+ # ── Tier check (mig 330)
93
+ "mc_tier_check_limit",
94
+
95
+ # ── Health (mig 335)
96
+ "mc_health_check_secrets",
97
+ "mc_check_rpc_grants", # mig 336 — self-referential is fine
98
+
99
+ # ── Misc agent-callable
100
+ "mc_list_user_projects",
101
+ ]
102
+
103
+
104
+ def is_agent_callable(name: str) -> bool:
105
+ """Quick membership check."""
106
+ return name in AGENT_CALLABLE_RPCS
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.15
3
+ Version: 2.11.16
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -19,6 +19,7 @@ meshcode/preferences.py
19
19
  meshcode/protocol_handler.py
20
20
  meshcode/protocol_v2.py
21
21
  meshcode/quickstart.py
22
+ meshcode/rpc_allowlist.py
22
23
  meshcode/run_agent.py
23
24
  meshcode/secrets.py
24
25
  meshcode/self_update.py
@@ -213,6 +214,7 @@ tests/test_mark_read_batch.py
213
214
  tests/test_migration_integrity.py
214
215
  tests/test_realtime_event_freshness.py
215
216
  tests/test_rls_cross_tenant.py
217
+ tests/test_rpc_grants.py
216
218
  tests/test_rpc_migrations.py
217
219
  tests/test_security_regressions.py
218
220
  tests/test_sentinel.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meshcode"
7
- version = "2.11.15"
7
+ version = "2.11.16"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -0,0 +1,76 @@
1
+ """Tests for the rpc_allowlist + grant-coverage script (AUDIT-S2).
2
+
3
+ Live grant verification runs in CI via scripts/check_rpc_grants.py against
4
+ a real Supabase. These tests check the allowlist invariants offline so
5
+ local dev pytest still works without DB credentials.
6
+ """
7
+ import re
8
+
9
+ import pytest
10
+
11
+ from meshcode.rpc_allowlist import (
12
+ AGENT_CALLABLE_RPCS,
13
+ FORCE_PREFIX_EXEMPT,
14
+ is_agent_callable,
15
+ )
16
+
17
+
18
+ def test_allowlist_is_nonempty():
19
+ assert len(AGENT_CALLABLE_RPCS) >= 10
20
+
21
+
22
+ def test_allowlist_has_no_duplicates():
23
+ assert len(AGENT_CALLABLE_RPCS) == len(set(AGENT_CALLABLE_RPCS))
24
+
25
+
26
+ def test_allowlist_no_excluded_prefixes():
27
+ """Per convention, admin/billing/force/internal RPCs MUST NOT be agent-callable.
28
+
29
+ Exception: FORCE_PREFIX_EXEMPT lists known mc_force_* RPCs that are
30
+ legitimately agent-callable (install-guard recovery path).
31
+ """
32
+ forbidden = re.compile(r"^(mc_admin_|mc_billing_|mc_force_|_mc_)")
33
+ bad = [
34
+ n for n in AGENT_CALLABLE_RPCS
35
+ if forbidden.match(n) and n not in FORCE_PREFIX_EXEMPT
36
+ ]
37
+ assert not bad, f"convention violation — these must not be agent-callable: {bad}"
38
+
39
+
40
+ def test_allowlist_all_start_with_mc_prefix():
41
+ bad = [n for n in AGENT_CALLABLE_RPCS if not n.startswith("mc_")]
42
+ assert not bad, f"all entries must be public.mc_* RPCs; bad: {bad}"
43
+
44
+
45
+ def test_is_agent_callable_helper():
46
+ assert is_agent_callable("mc_task_create") is True
47
+ assert is_agent_callable("mc_admin_disconnect") is False
48
+ assert is_agent_callable("nonexistent_rpc") is False
49
+
50
+
51
+ def test_known_agent_rpcs_are_listed():
52
+ """Sentinel: if any of these go missing the allowlist has regressed."""
53
+ must_have = [
54
+ "mc_task_create",
55
+ "mc_send_message",
56
+ "mc_heartbeat",
57
+ "mc_boot",
58
+ "mc_acquire_agent_lease",
59
+ "mc_validate_api_key",
60
+ "mc_memory_set",
61
+ ]
62
+ missing = [n for n in must_have if n not in AGENT_CALLABLE_RPCS]
63
+ assert not missing, f"core agent RPCs missing from allowlist: {missing}"
64
+
65
+
66
+ def test_known_non_agent_rpcs_are_NOT_listed():
67
+ must_not_have = [
68
+ "mc_admin_disconnect_agent",
69
+ "mc_admin_force_release_lease",
70
+ "mc_billing_set_plan",
71
+ "mc_force_clear_all",
72
+ "_mc_assert_task_scope",
73
+ "_mc_api_key_row",
74
+ ]
75
+ leaks = [n for n in must_not_have if n in AGENT_CALLABLE_RPCS]
76
+ assert not leaks, f"privileged RPCs incorrectly on allowlist: {leaks}"
File without changes
File without changes
File without changes