meshcode 2.11.103__tar.gz → 2.11.104__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 (252) hide show
  1. {meshcode-2.11.103 → meshcode-2.11.104}/PKG-INFO +1 -1
  2. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/hostd.py +64 -26
  4. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.103 → meshcode-2.11.104}/pyproject.toml +1 -1
  6. {meshcode-2.11.103 → meshcode-2.11.104}/README.md +0 -0
  7. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/_session_handoff_template 2.py +0 -0
  9. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/_session_handoff_template.py +0 -0
  10. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/_stop_hook_template.py +0 -0
  11. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/ascii_art.py +0 -0
  12. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/atomic_push.py +0 -0
  13. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/claude_update 2.py +0 -0
  14. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/claude_update.py +0 -0
  15. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/cli.py +0 -0
  16. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/comms_v4.py +0 -0
  17. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/compat.py +0 -0
  18. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/daemon.py +0 -0
  19. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/date_parse.py +0 -0
  20. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/doctor.py +0 -0
  21. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/error_hints.py +0 -0
  22. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/exceptions.py +0 -0
  23. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/hostd 2.py +0 -0
  24. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/invites.py +0 -0
  25. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/launcher.py +0 -0
  26. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/launcher_install.py +0 -0
  27. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/__init__.py +0 -0
  28. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/__main__.py +0 -0
  29. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/backend.py +0 -0
  30. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/realtime.py +0 -0
  31. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/server.py +0 -0
  32. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  33. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_backend.py +0 -0
  34. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  35. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  36. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  37. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  38. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  39. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/preferences.py +0 -0
  40. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/protocol_handler.py +0 -0
  41. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/protocol_v2.py +0 -0
  42. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/quickstart.py +0 -0
  43. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/rpc_allowlist.py +0 -0
  44. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/run_agent.py +0 -0
  45. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/scripts/check_secrets.py +0 -0
  46. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/scripts/race_rate_harness.py +0 -0
  47. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/secrets.py +0 -0
  48. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/self_update.py +0 -0
  49. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/setup_clients.py +0 -0
  50. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/supervisor.py +0 -0
  51. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/up 2.py +0 -0
  52. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/up.py +0 -0
  53. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode/upload.py +0 -0
  54. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/comms_v4.py +0 -0
  55. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  56. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  57. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/cli.py +0 -0
  58. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  59. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/compat.py +0 -0
  60. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  61. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  62. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/invites.py +0 -0
  63. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  64. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  65. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  66. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  67. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  68. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  69. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  70. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  71. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  72. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  73. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  74. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  75. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  76. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  77. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  78. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  79. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  80. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  81. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/upload.py +0 -0
  82. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  83. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_core.py +0 -0
  84. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  85. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  86. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  87. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  88. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  89. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  90. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  91. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  92. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  93. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  94. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  95. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  96. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  97. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  98. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  99. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  100. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  101. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  102. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  103. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  104. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  105. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  106. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  107. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  108. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  109. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  110. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  111. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  112. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  113. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  114. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  115. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  116. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  117. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  118. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  119. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  120. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  121. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  122. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/comms_v4.py +0 -0
  123. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  124. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  125. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/cli.py +0 -0
  126. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  127. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/compat.py +0 -0
  128. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  129. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  130. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/invites.py +0 -0
  131. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  132. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  133. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  134. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  135. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  136. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  137. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  138. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  139. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  140. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  141. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  142. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  143. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  144. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  145. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  146. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  147. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  148. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  149. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/upload.py +0 -0
  150. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  151. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_core.py +0 -0
  152. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  153. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  154. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  155. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  156. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  157. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  158. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  159. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  160. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  161. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  162. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  163. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/comms_v4.py +0 -0
  164. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  165. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  166. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  167. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  168. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  169. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  170. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  171. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  172. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  173. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  174. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  175. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  176. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  177. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  178. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  179. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  180. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  181. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  182. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  183. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  184. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  185. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  186. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  187. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  188. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  189. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  190. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  191. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  192. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_core.py +0 -0
  193. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  194. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  195. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  196. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  197. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  198. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  199. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  200. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  201. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  202. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  203. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  204. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/PKG-INFO 2 +0 -0
  205. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/SOURCES 2.txt +0 -0
  206. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/SOURCES.txt +0 -0
  207. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/dependency_links 2.txt +0 -0
  208. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/dependency_links.txt +0 -0
  209. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/entry_points 2.txt +0 -0
  210. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/entry_points.txt +0 -0
  211. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/requires 2.txt +0 -0
  212. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/requires.txt +0 -0
  213. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/top_level 2.txt +0 -0
  214. {meshcode-2.11.103 → meshcode-2.11.104}/meshcode.egg-info/top_level.txt +0 -0
  215. {meshcode-2.11.103 → meshcode-2.11.104}/setup.cfg +0 -0
  216. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_auto_update_hardening.py +0 -0
  217. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_autonomous_closegap_1.py +0 -0
  218. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_autonomous_closegap_2.py +0 -0
  219. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_autonomous_closegap_3.py +0 -0
  220. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_autonomous_prompt_inject 2.py +0 -0
  221. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_autonomous_prompt_inject.py +0 -0
  222. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_boot_bug_regression.py +0 -0
  223. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_color_truecolor.py +0 -0
  224. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_core.py +0 -0
  225. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_cross_agent_messaging.py +0 -0
  226. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_date_parse.py +0 -0
  227. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_doctor.py +0 -0
  228. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_epistemic_v1_python_sdk.py +0 -0
  229. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  230. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_esc_deaf_state.py +0 -0
  231. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_exceptions.py +0 -0
  232. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_file_upload.py +0 -0
  233. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_init_device_code.py +0 -0
  234. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_install_guard.py +0 -0
  235. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_lease_sigterm_release.py +0 -0
  236. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_mark_read_batch.py +0 -0
  237. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_marketplace_ratings.py +0 -0
  238. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_migration_integrity.py +0 -0
  239. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_realtime_event_freshness.py +0 -0
  240. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_rls_cross_tenant.py +0 -0
  241. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_rpc_grants.py +0 -0
  242. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_rpc_migrations.py +0 -0
  243. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_run_agent_dry_run.py +0 -0
  244. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_run_agent_no_server_import.py +0 -0
  245. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_security_regressions.py +0 -0
  246. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_self_update_user_site.py +0 -0
  247. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_sentinel.py +0 -0
  248. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_setup_path.py +0 -0
  249. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_sleep_signals.py +0 -0
  250. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_status_enum_coverage.py +0 -0
  251. {meshcode-2.11.103 → meshcode-2.11.104}/tests/test_stay_on_loop_hook.py +0 -0
  252. {meshcode-2.11.103 → meshcode-2.11.104}/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.103
3
+ Version: 2.11.104
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.103"
2
+ __version__ = "2.11.104"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -801,19 +801,28 @@ def _do_stops(api_key: str, host_id: str) -> int:
801
801
  return n
802
802
 
803
803
 
804
+ # 38523a98 reaper. Commander guardrail #1: DRY-RUN FIRST — ship LOG-ONLY, confirm ZERO false positives in
805
+ # the logs (REAP-DRYRUN lines), THEN flip _REAP_DRYRUN=False to actually kill. Protects against mis-killing
806
+ # a live agent (Samuel's trauma). Guardrail #2: the orphan grace before reaping a stopped-but-alive zombie.
807
+ _REAP_DRYRUN = True
808
+ _REAP_ORPHAN_GRACE_SEC = 90 # don't reap a just-stopped agent — give the cooperative self-exit time first
809
+
810
+
804
811
  def _do_reap(api_key: str, host_id: str) -> int:
805
- """Reaper (38523a98) — kill headless processes that should NOT be running. CONSERVATIVE: a no-op in
806
- normal operation. Both cases are protected by _kill_headless_pid's cmdline reuse-guard (final safety):
807
- (A) DUP ghosts: an agent with >1 live `meshcode run <target>` process (a double-spawn left ghost
808
- terminals Samuel's 'se traslapan y desconectan otro'). Kill the EXTRAS, KEEP the recorded PID
809
- but ONLY when that recorded PID is itself confirmed ALIVE, so a known-good survivor stays. If
810
- the recorded PID is dead we do NOT guess a survivor (leave it to _do_respawns/_do_stops).
811
- (B) ORPHAN: a headless agent the owner set to a TERMINAL state (desired_state in stopped/crashed)
812
- whose recorded PID is still alive AND heartbeat is stale (>=90s, so NOT a just-recovered agent)
813
- the 'offline but still reading' case. _do_stops (runs first) already kills stopped+FRESH; this
814
- catches the stale-but-alive gap + 'crashed'.
815
- NEVER reaps: a VISIBLE agent (user owns the window), a FRESH-heartbeat agent (genuinely alive), or a
816
- desired_state='running' agent. Returns number of processes killed."""
812
+ """Reaper (38523a98) — identify headless processes that should NOT be running. CONSERVATIVE + currently
813
+ DRY-RUN (LOG-ONLY, _REAP_DRYRUN=True): logs what it WOULD kill, kills nothing, until verified. Cases,
814
+ both protected by _kill_headless_pid's cmdline reuse-guard (final safety):
815
+ (A) DUP ghosts: an agent with >1 live `meshcode run <target>` process (double-spawn ghost terminals —
816
+ Samuel's 'se traslapan y desconectan otro'). Reap the EXTRAS, KEEP the recorded PID only when
817
+ that recorded PID is confirmed ALIVE (known-good survivor). Dead recorded PID => don't guess.
818
+ (B) ORPHAN ZOMBIE: a headless agent the owner set to a TERMINAL state (desired_state stopped/crashed)
819
+ whose recorded PID is STILL ALIVE the 'offline-but-still-reading' / 'lo cerré y sigue ahí' case.
820
+ A FRESH heartbeat here IS the zombie (still reading despite stop). Reap it, but only AFTER a
821
+ ~90s grace from first-sighting (commander guardrail #2) so the cooperative self-exit
822
+ (mc_consume_stop -> must_exit) gets first crack. Grace tracked in hostd_state (reapseen/*).
823
+ NEVER touches: a VISIBLE agent (user owns the window), or a desired_state='running' agent (workers are
824
+ sacred — only the dup-EXTRA of a running agent is reapable, never its live survivor). Returns count
825
+ actually killed (0 while DRY-RUN)."""
817
826
  cfg = _rpc("mc_host_config_get", {"p_api_key": api_key, "p_host_id": host_id})
818
827
  if not cfg or not cfg.get("ok"):
819
828
  return 0
@@ -834,35 +843,64 @@ def _do_reap(api_key: str, host_id: str) -> int:
834
843
  except Exception:
835
844
  return False
836
845
 
846
+ def _reap(target, pid, reason):
847
+ """LOG-ONLY while _REAP_DRYRUN; else hard-kill (reuse-guard inside). Returns 1 if killed."""
848
+ nonlocal pids
849
+ if _REAP_DRYRUN:
850
+ _log(f"REAP-DRYRUN {target}: WOULD kill pid {pid} ({reason}) — log-only, no kill. "
851
+ f"Flip _REAP_DRYRUN=False after confirming zero false positives.")
852
+ return 0
853
+ if _kill_headless_pid(target, pid):
854
+ if pids.get(target) == pid:
855
+ pids.pop(target, None)
856
+ _log(f"REAP {target}: killed pid {pid} ({reason})")
857
+ return 1
858
+ return 0
859
+
837
860
  st = _load_state()
838
861
  pids = st.get("headless_pids") or {}
862
+ seen = st.get("reapseen") or {}
863
+ now = time.time()
839
864
  n = 0
865
+ live_targets = set()
840
866
  for a in agents:
841
- if not a.get("headless"):
842
- continue # NEVER reap a visible agent — the user closes its window
843
867
  proj, agent = a.get("project_name"), a.get("name")
844
868
  if not proj or not agent:
845
869
  continue
846
870
  target = f"{proj}/{agent}"
847
- hb = a.get("heartbeat_age_s")
848
- fresh = (hb is not None and hb < 90) # genuinely alive => never reap
871
+ live_targets.add(target)
872
+ if not a.get("headless"):
873
+ continue # NEVER reap a visible agent — the user closes its window
874
+ ds = a.get("desired_state")
849
875
  keep = pids.get(target)
850
876
  keep_alive = _alive(keep)
851
- # (A) DEDUP — only with a CONFIRMED-ALIVE survivor to keep.
877
+ # (A) DEDUP — only with a CONFIRMED-ALIVE survivor to keep. (Applies to running agents too: we only
878
+ # ever reap the EXTRA ghost, never the live survivor.)
852
879
  if keep_alive:
853
880
  discovered = _discover_agent_pids(target)
854
881
  if len(discovered) > 1:
855
882
  for p in discovered:
856
- if p != keep and _kill_headless_pid(target, p):
857
- n += 1
858
- _log(f"REAP-DUP {target}: killed duplicate ghost pid {p} (kept live {keep})")
859
- # (B) ORPHAN — owner set it stopped/crashed, it's not a recovered (fresh-hb) agent.
860
- if keep_alive and (a.get("desired_state") in ("stopped", "crashed")) and not fresh:
861
- if _kill_headless_pid(target, keep):
862
- pids.pop(target, None)
863
- n += 1
864
- _log(f"REAP {target}: killed orphan (desired={a.get('desired_state')}, hb={hb}s) headless pid {keep}")
883
+ if p != keep:
884
+ n += _reap(target, p, f"duplicate ghost; kept live {keep}")
885
+ # (B) ORPHAN ZOMBIE owner set stopped/crashed but the proc is still alive. NEVER for running.
886
+ if ds in ("stopped", "crashed") and keep_alive:
887
+ first = seen.get(target)
888
+ if first is None:
889
+ seen[target] = now # start the grace clock; self-exit gets first crack
890
+ _log(f"REAP-PENDING {target}: desired={ds} but pid {keep} alive (hb={a.get('heartbeat_age_s')}s) "
891
+ f" {_REAP_ORPHAN_GRACE_SEC}s grace for cooperative self-exit before reap")
892
+ elif now - float(first) >= _REAP_ORPHAN_GRACE_SEC:
893
+ n += _reap(target, keep, f"orphan zombie desired={ds}, hb={a.get('heartbeat_age_s')}s, "
894
+ f"alive {int(now-float(first))}s past stop")
895
+ seen.pop(target, None)
896
+ else:
897
+ seen.pop(target, None) # recovered / running / gone — clear the grace clock
898
+ # prune grace entries for agents no longer in the roster
899
+ for t in list(seen.keys()):
900
+ if t not in live_targets:
901
+ seen.pop(t, None)
865
902
  st["headless_pids"] = pids
903
+ st["reapseen"] = seen
866
904
  _save_state(st)
867
905
  return n
868
906
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.103
3
+ Version: 2.11.104
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meshcode"
7
- version = "2.11.103"
7
+ version = "2.11.104"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes