meshcode 2.11.100__tar.gz → 2.11.102__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.100 → meshcode-2.11.102}/PKG-INFO +1 -1
  2. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/hostd.py +81 -2
  4. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.100 → meshcode-2.11.102}/pyproject.toml +1 -1
  6. {meshcode-2.11.100 → meshcode-2.11.102}/README.md +0 -0
  7. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/_session_handoff_template 2.py +0 -0
  9. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/_session_handoff_template.py +0 -0
  10. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/_stop_hook_template.py +0 -0
  11. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/ascii_art.py +0 -0
  12. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/atomic_push.py +0 -0
  13. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/claude_update 2.py +0 -0
  14. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/claude_update.py +0 -0
  15. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/cli.py +0 -0
  16. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/comms_v4.py +0 -0
  17. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/compat.py +0 -0
  18. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/daemon.py +0 -0
  19. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/date_parse.py +0 -0
  20. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/doctor.py +0 -0
  21. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/error_hints.py +0 -0
  22. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/exceptions.py +0 -0
  23. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/hostd 2.py +0 -0
  24. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/invites.py +0 -0
  25. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/launcher.py +0 -0
  26. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/launcher_install.py +0 -0
  27. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/__init__.py +0 -0
  28. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/__main__.py +0 -0
  29. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/backend.py +0 -0
  30. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/realtime.py +0 -0
  31. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/server.py +0 -0
  32. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  33. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_backend.py +0 -0
  34. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  35. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  36. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  37. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  38. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  39. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/preferences.py +0 -0
  40. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/protocol_handler.py +0 -0
  41. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/protocol_v2.py +0 -0
  42. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/quickstart.py +0 -0
  43. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/rpc_allowlist.py +0 -0
  44. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/run_agent.py +0 -0
  45. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/scripts/check_secrets.py +0 -0
  46. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/scripts/race_rate_harness.py +0 -0
  47. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/secrets.py +0 -0
  48. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/self_update.py +0 -0
  49. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/setup_clients.py +0 -0
  50. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/supervisor.py +0 -0
  51. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/up 2.py +0 -0
  52. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/up.py +0 -0
  53. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode/upload.py +0 -0
  54. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/comms_v4.py +0 -0
  55. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  56. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  57. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/cli.py +0 -0
  58. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  59. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/compat.py +0 -0
  60. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  61. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  62. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/invites.py +0 -0
  63. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  64. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  65. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  66. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  67. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  68. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  69. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  70. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  71. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  72. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  73. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  74. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  75. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  76. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  77. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  78. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  79. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  80. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  81. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/upload.py +0 -0
  82. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  83. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_core.py +0 -0
  84. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  85. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  86. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  87. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  88. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  89. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  90. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  91. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  92. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  93. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  94. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  95. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  96. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  97. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  98. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  99. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  100. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  101. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  102. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  103. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  104. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  105. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  106. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  107. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  108. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  109. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  110. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  111. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  112. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  113. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  114. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  115. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  116. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  117. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  118. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  119. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  120. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  121. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  122. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/comms_v4.py +0 -0
  123. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  124. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  125. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/cli.py +0 -0
  126. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  127. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/compat.py +0 -0
  128. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  129. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  130. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/invites.py +0 -0
  131. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  132. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  133. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  134. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  135. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  136. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  137. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  138. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  139. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  140. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  141. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  142. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  143. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  144. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  145. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  146. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  147. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  148. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  149. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/upload.py +0 -0
  150. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  151. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_core.py +0 -0
  152. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  153. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  154. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  155. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  156. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  157. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  158. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  159. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  160. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  161. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  162. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  163. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/comms_v4.py +0 -0
  164. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  165. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  166. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  167. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  168. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  169. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  170. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  171. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  172. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  173. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  174. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  175. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  176. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  177. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  178. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  179. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  180. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  181. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  182. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  183. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  184. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  185. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  186. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  187. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  188. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  189. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  190. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  191. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  192. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_core.py +0 -0
  193. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  194. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  195. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  196. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  197. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  198. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  199. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  200. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  201. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  202. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  203. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  204. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/PKG-INFO 2 +0 -0
  205. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/SOURCES 2.txt +0 -0
  206. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/SOURCES.txt +0 -0
  207. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/dependency_links 2.txt +0 -0
  208. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/dependency_links.txt +0 -0
  209. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/entry_points 2.txt +0 -0
  210. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/entry_points.txt +0 -0
  211. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/requires 2.txt +0 -0
  212. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/requires.txt +0 -0
  213. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/top_level 2.txt +0 -0
  214. {meshcode-2.11.100 → meshcode-2.11.102}/meshcode.egg-info/top_level.txt +0 -0
  215. {meshcode-2.11.100 → meshcode-2.11.102}/setup.cfg +0 -0
  216. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_auto_update_hardening.py +0 -0
  217. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_autonomous_closegap_1.py +0 -0
  218. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_autonomous_closegap_2.py +0 -0
  219. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_autonomous_closegap_3.py +0 -0
  220. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_autonomous_prompt_inject 2.py +0 -0
  221. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_autonomous_prompt_inject.py +0 -0
  222. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_boot_bug_regression.py +0 -0
  223. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_color_truecolor.py +0 -0
  224. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_core.py +0 -0
  225. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_cross_agent_messaging.py +0 -0
  226. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_date_parse.py +0 -0
  227. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_doctor.py +0 -0
  228. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_epistemic_v1_python_sdk.py +0 -0
  229. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  230. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_esc_deaf_state.py +0 -0
  231. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_exceptions.py +0 -0
  232. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_file_upload.py +0 -0
  233. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_init_device_code.py +0 -0
  234. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_install_guard.py +0 -0
  235. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_lease_sigterm_release.py +0 -0
  236. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_mark_read_batch.py +0 -0
  237. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_marketplace_ratings.py +0 -0
  238. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_migration_integrity.py +0 -0
  239. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_realtime_event_freshness.py +0 -0
  240. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_rls_cross_tenant.py +0 -0
  241. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_rpc_grants.py +0 -0
  242. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_rpc_migrations.py +0 -0
  243. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_run_agent_dry_run.py +0 -0
  244. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_run_agent_no_server_import.py +0 -0
  245. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_security_regressions.py +0 -0
  246. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_self_update_user_site.py +0 -0
  247. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_sentinel.py +0 -0
  248. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_setup_path.py +0 -0
  249. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_sleep_signals.py +0 -0
  250. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_status_enum_coverage.py +0 -0
  251. {meshcode-2.11.100 → meshcode-2.11.102}/tests/test_stay_on_loop_hook.py +0 -0
  252. {meshcode-2.11.100 → meshcode-2.11.102}/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.100
3
+ Version: 2.11.102
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.100"
2
+ __version__ = "2.11.102"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -458,6 +458,10 @@ def _spawn_agent(project: str, agent: str, headless: bool = False) -> bool:
458
458
  return False
459
459
 
460
460
 
461
+ # 38523a98: max terminals opened per host per sweep (anti boot-storm; excess defers to next sweep).
462
+ _MAX_SPAWNS_PER_SWEEP = 3
463
+
464
+
461
465
  def _do_respawns(api_key: str, host_id: str) -> int:
462
466
  """One respawn sweep. Returns number relaunched."""
463
467
  res = _rpc("mc_agents_needing_respawn",
@@ -466,6 +470,14 @@ def _do_respawns(api_key: str, host_id: str) -> int:
466
470
  return 0
467
471
  n = 0
468
472
  for c in res.get("candidates", []):
473
+ # 38523a98 GLOBAL spawn cap: never open more than _MAX_SPAWNS_PER_SWEEP terminals in one ~10s
474
+ # sweep (canonical model: 2-3, not 7-at-once). Excess agents respawn on the NEXT sweep — smooths
475
+ # the boot-storm Samuel hit (a fresh host with the whole fleet stale spawned every agent at once).
476
+ # Per-target rate-limit + circuit-breaker still apply below; this is the cross-agent backstop.
477
+ if n >= _MAX_SPAWNS_PER_SWEEP:
478
+ _log(f"GLOBAL spawn cap {_MAX_SPAWNS_PER_SWEEP}/sweep hit — deferring remaining respawn(s) "
479
+ f"to next sweep (anti boot-storm)")
480
+ break
469
481
  proj, agent = c.get("project_name"), c.get("agent")
470
482
  if not proj or not agent:
471
483
  continue
@@ -789,6 +801,72 @@ def _do_stops(api_key: str, host_id: str) -> int:
789
801
  return n
790
802
 
791
803
 
804
+ 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."""
817
+ cfg = _rpc("mc_host_config_get", {"p_api_key": api_key, "p_host_id": host_id})
818
+ if not cfg or not cfg.get("ok"):
819
+ return 0
820
+ agents = cfg.get("agents") or []
821
+ if not agents:
822
+ return 0
823
+
824
+ def _alive(p) -> bool:
825
+ if not p:
826
+ return False
827
+ try:
828
+ os.kill(int(p), 0)
829
+ return True
830
+ except ProcessLookupError:
831
+ return False
832
+ except PermissionError:
833
+ return True # exists, owned by another uid — treat as alive (don't reap blindly)
834
+ except Exception:
835
+ return False
836
+
837
+ st = _load_state()
838
+ pids = st.get("headless_pids") or {}
839
+ n = 0
840
+ for a in agents:
841
+ if not a.get("headless"):
842
+ continue # NEVER reap a visible agent — the user closes its window
843
+ proj, agent = a.get("project_name"), a.get("name")
844
+ if not proj or not agent:
845
+ continue
846
+ target = f"{proj}/{agent}"
847
+ hb = a.get("heartbeat_age_s")
848
+ fresh = (hb is not None and hb < 90) # genuinely alive => never reap
849
+ keep = pids.get(target)
850
+ keep_alive = _alive(keep)
851
+ # (A) DEDUP — only with a CONFIRMED-ALIVE survivor to keep.
852
+ if keep_alive:
853
+ discovered = _discover_agent_pids(target)
854
+ if len(discovered) > 1:
855
+ 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}")
865
+ st["headless_pids"] = pids
866
+ _save_state(st)
867
+ return n
868
+
869
+
792
870
  def _do_recycle_enforce(api_key: str, host_id: str) -> int:
793
871
  """RECYCLE-MUST-GUARANTEE-RESPAWN (task c0fc5597). An interactive claude (no --print) can't
794
872
  self-exit on must_exit=recycle: the model leaves its loop but the process idles + the MCP
@@ -1375,10 +1453,11 @@ def cmd_hostd(args: list) -> int:
1375
1453
  recycled = _do_recycles(api_key, host_id)
1376
1454
  ver_recycled = _do_version_recycles(api_key, host_id)
1377
1455
  stopped = _do_stops(api_key, host_id)
1456
+ reaped = _do_reap(api_key, host_id) # 38523a98: kill ghosts/dup-PIDs/crashed-orphans
1378
1457
  _gc_headless_pids() # cb90b058: drop dead PIDs (stale entry can't mask a live agent)
1379
1458
  _up = int(time.monotonic() - _spawn_mono)
1380
- if relaunched or recycled or ver_recycled or stopped or enforced:
1381
- _log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced")
1459
+ if relaunched or recycled or ver_recycled or stopped or enforced or reaped:
1460
+ _log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced, {reaped} reaped")
1382
1461
  elif time.monotonic() - _last_alive_log >= 60:
1383
1462
  _log(f"alive — uptime={_up}s")
1384
1463
  _last_alive_log = time.monotonic()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.100
3
+ Version: 2.11.102
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.100"
7
+ version = "2.11.102"
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
File without changes