meshcode 2.11.105__tar.gz → 2.11.107__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 (278) hide show
  1. {meshcode-2.11.105 → meshcode-2.11.107}/PKG-INFO +1 -1
  2. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/hostd.py +48 -2
  4. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/server.py +27 -5
  5. meshcode-2.11.107/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +4117 -0
  6. meshcode-2.11.107/meshcode-backend-wt/meshcode/run_agent.py +958 -0
  7. meshcode-2.11.107/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +638 -0
  8. meshcode-2.11.107/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +3563 -0
  9. meshcode-2.11.107/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +460 -0
  10. meshcode-2.11.107/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +4117 -0
  11. meshcode-2.11.107/meshcode-noun-wt/build/lib/meshcode/run_agent.py +958 -0
  12. meshcode-2.11.107/meshcode-noun-wt/comms_v4.py +1941 -0
  13. meshcode-2.11.107/meshcode-noun-wt/meshcode/ascii_art.py +638 -0
  14. meshcode-2.11.107/meshcode-noun-wt/meshcode/comms_v4.py +3563 -0
  15. meshcode-2.11.107/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +1261 -0
  16. meshcode-2.11.107/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +460 -0
  17. meshcode-2.11.107/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +4117 -0
  18. meshcode-2.11.107/meshcode-noun-wt/meshcode/run_agent.py +958 -0
  19. meshcode-2.11.107/meshcode-noun-wt/meshcode/setup_clients.py +926 -0
  20. meshcode-2.11.107/meshcode-tasks-wt/comms_v4.py +1941 -0
  21. meshcode-2.11.107/meshcode-tasks-wt/meshcode/ascii_art.py +638 -0
  22. meshcode-2.11.107/meshcode-tasks-wt/meshcode/comms_v4.py +3563 -0
  23. meshcode-2.11.107/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +1261 -0
  24. meshcode-2.11.107/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +460 -0
  25. meshcode-2.11.107/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +4117 -0
  26. meshcode-2.11.107/meshcode-tasks-wt/meshcode/run_agent.py +958 -0
  27. meshcode-2.11.107/meshcode-tasks-wt/meshcode/setup_clients.py +926 -0
  28. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/PKG-INFO +1 -1
  29. {meshcode-2.11.105 → meshcode-2.11.107}/pyproject.toml +1 -1
  30. meshcode-2.11.105/meshcode-backend-wt/comms_v4.py +0 -0
  31. meshcode-2.11.105/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  32. meshcode-2.11.105/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  33. meshcode-2.11.105/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  34. meshcode-2.11.105/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  35. meshcode-2.11.105/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  36. meshcode-2.11.105/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  37. meshcode-2.11.105/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  38. meshcode-2.11.105/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  39. meshcode-2.11.105/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  40. meshcode-2.11.105/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  41. meshcode-2.11.105/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  42. meshcode-2.11.105/meshcode-noun-wt/comms_v4.py +0 -0
  43. meshcode-2.11.105/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  44. meshcode-2.11.105/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  45. meshcode-2.11.105/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  46. meshcode-2.11.105/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  47. meshcode-2.11.105/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  48. meshcode-2.11.105/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  49. meshcode-2.11.105/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  50. meshcode-2.11.105/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  51. meshcode-2.11.105/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  52. meshcode-2.11.105/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  53. {meshcode-2.11.105 → meshcode-2.11.107}/README.md +0 -0
  54. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/__main__.py +0 -0
  55. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/_session_handoff_template 2.py +0 -0
  56. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/_session_handoff_template 3.py +0 -0
  57. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/_session_handoff_template.py +0 -0
  58. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/_stop_hook_template.py +0 -0
  59. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/ascii_art.py +0 -0
  60. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/atomic_push.py +0 -0
  61. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/claude_update 2.py +0 -0
  62. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/claude_update 3.py +0 -0
  63. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/claude_update.py +0 -0
  64. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/cli.py +0 -0
  65. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/comms_v4.py +0 -0
  66. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/compat.py +0 -0
  67. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/daemon.py +0 -0
  68. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/date_parse.py +0 -0
  69. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/doctor.py +0 -0
  70. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/error_hints.py +0 -0
  71. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/exceptions.py +0 -0
  72. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/hostd 2.py +0 -0
  73. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/invites.py +0 -0
  74. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/launcher.py +0 -0
  75. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/launcher_install.py +0 -0
  76. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/__init__.py +0 -0
  77. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/__main__.py +0 -0
  78. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/backend.py +0 -0
  79. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/realtime.py +0 -0
  80. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  81. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/test_backend.py +0 -0
  82. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  83. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  84. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  85. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  86. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  87. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/preferences.py +0 -0
  88. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/protocol_handler.py +0 -0
  89. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/protocol_v2.py +0 -0
  90. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/quickstart.py +0 -0
  91. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/rpc_allowlist.py +0 -0
  92. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/run_agent.py +0 -0
  93. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/scripts/check_secrets.py +0 -0
  94. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/scripts/race_rate_harness.py +0 -0
  95. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/secrets.py +0 -0
  96. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/self_update.py +0 -0
  97. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/setup_clients.py +0 -0
  98. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/supervisor.py +0 -0
  99. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/up 2.py +0 -0
  100. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/up.py +0 -0
  101. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode/upload.py +0 -0
  102. {meshcode-2.11.105/meshcode-tasks-wt → meshcode-2.11.107/meshcode-backend-wt}/comms_v4.py +0 -0
  103. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  104. {meshcode-2.11.105/meshcode-noun-wt/build/lib → meshcode-2.11.107/meshcode-backend-wt}/meshcode/ascii_art.py +0 -0
  105. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/cli.py +0 -0
  106. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  107. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/compat.py +0 -0
  108. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  109. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  110. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/invites.py +0 -0
  111. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  112. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  113. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  114. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  115. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  116. {meshcode-2.11.105/meshcode-tasks-wt → meshcode-2.11.107/meshcode-backend-wt}/meshcode/meshcode_mcp/realtime.py +0 -0
  117. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  118. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  119. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  120. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  121. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  122. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  123. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  124. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  125. {meshcode-2.11.105/meshcode-noun-wt → meshcode-2.11.107/meshcode-backend-wt}/meshcode/setup_clients.py +0 -0
  126. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  127. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/meshcode/upload.py +0 -0
  128. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  129. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_core.py +0 -0
  130. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  131. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  132. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  133. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  134. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  135. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  136. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  137. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  138. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  139. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  140. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  141. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  142. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  143. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  144. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  145. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  146. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  147. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  148. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  149. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  150. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  151. {meshcode-2.11.105/meshcode-tasks-wt → meshcode-2.11.107/meshcode-noun-wt/build/lib}/meshcode/meshcode_mcp/backend.py +0 -0
  152. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  153. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  154. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  155. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  156. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  157. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  158. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  159. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  160. {meshcode-2.11.105/meshcode-tasks-wt → meshcode-2.11.107/meshcode-noun-wt/build/lib}/meshcode/setup_clients.py +0 -0
  161. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  162. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  163. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  164. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/cli.py +0 -0
  165. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/compat.py +0 -0
  166. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  167. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  168. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/invites.py +0 -0
  169. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  170. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  171. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  172. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  173. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  174. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  175. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  176. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  177. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  178. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  179. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  180. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  181. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  182. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/meshcode/upload.py +0 -0
  183. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  184. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_core.py +0 -0
  185. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  186. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  187. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  188. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  189. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  190. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  191. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  192. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  193. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  194. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  195. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  196. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  197. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  198. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  199. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  200. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  201. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  202. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  203. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  204. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  205. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  206. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  207. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  208. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  209. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  210. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  211. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  212. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  213. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  214. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  215. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  216. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  217. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_core.py +0 -0
  218. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  219. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  220. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  221. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  222. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  223. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  224. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  225. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  226. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  227. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  228. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  229. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/PKG-INFO 2 +0 -0
  230. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/SOURCES 2.txt +0 -0
  231. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/SOURCES.txt +0 -0
  232. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/dependency_links 2.txt +0 -0
  233. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/dependency_links.txt +0 -0
  234. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/entry_points 2.txt +0 -0
  235. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/entry_points.txt +0 -0
  236. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/requires 2.txt +0 -0
  237. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/requires.txt +0 -0
  238. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/top_level 2.txt +0 -0
  239. {meshcode-2.11.105 → meshcode-2.11.107}/meshcode.egg-info/top_level.txt +0 -0
  240. {meshcode-2.11.105 → meshcode-2.11.107}/setup.cfg +0 -0
  241. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_auto_update_hardening.py +0 -0
  242. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_autonomous_closegap_1.py +0 -0
  243. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_autonomous_closegap_2.py +0 -0
  244. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_autonomous_closegap_3.py +0 -0
  245. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_autonomous_prompt_inject 2.py +0 -0
  246. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_autonomous_prompt_inject 3.py +0 -0
  247. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_autonomous_prompt_inject.py +0 -0
  248. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_boot_bug_regression.py +0 -0
  249. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_color_truecolor.py +0 -0
  250. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_core.py +0 -0
  251. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_cross_agent_messaging.py +0 -0
  252. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_date_parse.py +0 -0
  253. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_doctor.py +0 -0
  254. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_epistemic_v1_python_sdk.py +0 -0
  255. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  256. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_esc_deaf_state.py +0 -0
  257. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_exceptions.py +0 -0
  258. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_file_upload.py +0 -0
  259. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_init_device_code.py +0 -0
  260. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_install_guard.py +0 -0
  261. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_lease_sigterm_release.py +0 -0
  262. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_mark_read_batch.py +0 -0
  263. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_marketplace_ratings.py +0 -0
  264. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_migration_integrity.py +0 -0
  265. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_realtime_event_freshness.py +0 -0
  266. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_rls_cross_tenant.py +0 -0
  267. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_rpc_grants.py +0 -0
  268. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_rpc_migrations.py +0 -0
  269. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_run_agent_dry_run.py +0 -0
  270. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_run_agent_no_server_import.py +0 -0
  271. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_security_regressions.py +0 -0
  272. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_self_update_user_site.py +0 -0
  273. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_sentinel.py +0 -0
  274. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_setup_path.py +0 -0
  275. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_sleep_signals.py +0 -0
  276. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_status_enum_coverage.py +0 -0
  277. {meshcode-2.11.105 → meshcode-2.11.107}/tests/test_stay_on_loop_hook.py +0 -0
  278. {meshcode-2.11.105 → meshcode-2.11.107}/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.105
3
+ Version: 2.11.107
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.105"
2
+ __version__ = "2.11.107"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -801,6 +801,51 @@ def _do_stops(api_key: str, host_id: str) -> int:
801
801
  return n
802
802
 
803
803
 
804
+ # 38523a98 Gap 1: explicit human force-kill of VISIBLE agents. DRY-RUN first (same gate as the reaper).
805
+ _FORCE_KILL_DRYRUN = True
806
+
807
+
808
+ def _do_force_kills(api_key: str, host_id: str) -> int:
809
+ """38523a98 Gap 1 — EXPLICIT human force-kill of VISIBLE agents. The user clicked Stop/Remove
810
+ (desired_state='stopped' via mc_agent_power) but the visible agent didn't close/self-exit -> kill its
811
+ process ('lo cerré y sigue ahí'). Reads mc_agents_to_force_kill (visible + stopped + alive; ONLY this
812
+ new hostd calls that RPC, old hostd ignores it -> the DDL is safe to apply ahead of the deploy). This
813
+ fires ONLY on an explicit human stop — the AUTONOMOUS reaper (_do_reap) NEVER touches visible. DRY-RUN
814
+ (log-only) until verified. Returns count killed (0 while dry-run)."""
815
+ res = _rpc("mc_agents_to_force_kill", {"p_api_key": api_key, "p_host_id": host_id})
816
+ if not res or not res.get("ok"):
817
+ return 0 # old DB without the RPC -> {} -> no-op
818
+ agents = res.get("agents") or []
819
+ if not agents:
820
+ return 0
821
+ st = _load_state()
822
+ pids = st.get("headless_pids") or {}
823
+ n = 0
824
+ for a in agents:
825
+ proj, agent = a.get("project_name"), a.get("agent")
826
+ if not proj or not agent:
827
+ continue
828
+ target = f"{proj}/{agent}"
829
+ # recorded PID first, else discover by cmdline (visible agents aren't always in headless_pids).
830
+ cands = []
831
+ if pids.get(target):
832
+ cands.append(pids.get(target))
833
+ cands += [p for p in _discover_agent_pids(target) if p not in cands]
834
+ for pid in cands:
835
+ if not pid:
836
+ continue
837
+ if _FORCE_KILL_DRYRUN:
838
+ _log(f"FORCE-KILL-DRYRUN {target}: WOULD kill visible pid {pid} (explicit human stop, "
839
+ f"hb {a.get('heartbeat_age_s')}s) — log-only. Flip _FORCE_KILL_DRYRUN=False to enforce.")
840
+ elif _kill_headless_pid(target, pid):
841
+ pids.pop(target, None)
842
+ n += 1
843
+ _log(f"FORCE-KILL {target}: killed visible pid {pid} (explicit human stop)")
844
+ st["headless_pids"] = pids
845
+ _save_state(st)
846
+ return n
847
+
848
+
804
849
  # 38523a98 reaper. Commander guardrail #1: DRY-RUN FIRST — ship LOG-ONLY, confirm ZERO false positives in
805
850
  # the logs (REAP-DRYRUN lines), THEN flip _REAP_DRYRUN=False to actually kill. Protects against mis-killing
806
851
  # a live agent (Samuel's trauma). Guardrail #2: the orphan grace before reaping a stopped-but-alive zombie.
@@ -1518,11 +1563,12 @@ def cmd_hostd(args: list) -> int:
1518
1563
  recycled = _do_recycles(api_key, host_id)
1519
1564
  ver_recycled = _do_version_recycles(api_key, host_id)
1520
1565
  stopped = _do_stops(api_key, host_id)
1566
+ force_killed = _do_force_kills(api_key, host_id) # 38523a98 Gap1: visible explicit human stop
1521
1567
  reaped = _do_reap(api_key, host_id) # 38523a98: kill ghosts/dup-PIDs/crashed-orphans
1522
1568
  _gc_headless_pids() # cb90b058: drop dead PIDs (stale entry can't mask a live agent)
1523
1569
  _up = int(time.monotonic() - _spawn_mono)
1524
- if relaunched or recycled or ver_recycled or stopped or enforced or reaped:
1525
- _log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced, {reaped} reaped")
1570
+ if relaunched or recycled or ver_recycled or stopped or enforced or reaped or force_killed:
1571
+ _log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {force_killed} force-killed, {enforced} recycle-enforced, {reaped} reaped")
1526
1572
  elif time.monotonic() - _last_alive_log >= 60:
1527
1573
  _log(f"alive — uptime={_up}s")
1528
1574
  _last_alive_log = time.monotonic()
@@ -4030,14 +4030,36 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
4030
4030
  # legacy "no paraba hasta completar todos" cadence. Non-leader
4031
4031
  # agents only — leaders need to stay in wait to triage wildcard
4032
4032
  # tasks for the mesh.
4033
- if pending_tasks and not _is_leader_agent():
4034
- # Auto-start the highest priority claimed task so the agent
4035
- # sees it as in_progress and works it immediately. Samuel
4036
- # directive: "agents should claim and work right away one by one."
4033
+ # DURABLE-NO-IDLE-SPIN (task 2adb1705): the task-pull short-circuit must
4034
+ # only fire for tasks that still need STARTING (status 'open'). A task
4035
+ # already in_progress by THIS agent means it has been started and is being
4036
+ # worked or is BLOCKED on an external gate (e.g. a missing credential).
4037
+ # Re-emitting the pull every wait for an in_progress task is exactly the
4038
+ # idle-spin that burned ~45min/148k tokens re-printing "holding". So we
4039
+ # only short-circuit on _tasks_to_start; in_progress tasks fall through to
4040
+ # the normal message-blocking wait (surfaced as a non-blocking reminder).
4041
+ _tasks_to_start = [t for t in (pending_tasks or []) if t.get("status") == "open"]
4042
+ _in_progress_mine = [t for t in (pending_tasks or []) if t.get("status") == "in_progress"]
4043
+ # CHAT-DELIVERY-FIX (2026-06-04, Samuel "fix now"): message delivery MUST take
4044
+ # priority over the task-pull short-circuit. Previously this block returned BEFORE
4045
+ # PRODUCT RULE 2 (below), so any agent holding an OPEN task went DEAF to incoming
4046
+ # messages — never read them, no blue check, the human's chat appeared broken
4047
+ # ("te escribo y no sale palomita azul en nadie"). If there are unread messages,
4048
+ # skip task_pull and fall through to PRODUCT RULE 2 so they get delivered + marked
4049
+ # read first. Task-pull still fires normally when the inbox is empty.
4050
+ _has_unread = False
4051
+ try:
4052
+ _has_unread = bool(be.count_pending(_PROJECT_ID, AGENT_NAME, api_key=_get_api_key()))
4053
+ except Exception:
4054
+ _has_unread = False
4055
+ if _tasks_to_start and not _is_leader_agent() and not _has_unread:
4056
+ # Auto-start the highest priority OPEN task so the agent sees it as
4057
+ # in_progress and works it immediately. Samuel directive: "agents
4058
+ # should claim and work right away one by one."
4037
4059
  _auto_started = None
4038
4060
  _PRIO_ORDER = {"urgent": 0, "high": 1, "normal": 2, "low": 3}
4039
4061
  _sorted_pending = sorted(
4040
- pending_tasks,
4062
+ _tasks_to_start,
4041
4063
  key=lambda t: (_PRIO_ORDER.get(t.get("priority", "normal"), 2), t.get("id", "")),
4042
4064
  )
4043
4065
  for _pt in _sorted_pending: