meshcode 2.11.101__tar.gz → 2.11.103__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.101 → meshcode-2.11.103}/PKG-INFO +1 -1
  2. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/hostd.py +78 -2
  4. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.101 → meshcode-2.11.103}/pyproject.toml +1 -1
  6. {meshcode-2.11.101 → meshcode-2.11.103}/README.md +0 -0
  7. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/_session_handoff_template 2.py +0 -0
  9. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/_session_handoff_template.py +0 -0
  10. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/_stop_hook_template.py +0 -0
  11. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/ascii_art.py +0 -0
  12. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/atomic_push.py +0 -0
  13. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/claude_update 2.py +0 -0
  14. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/claude_update.py +0 -0
  15. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/cli.py +0 -0
  16. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/comms_v4.py +0 -0
  17. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/compat.py +0 -0
  18. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/daemon.py +0 -0
  19. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/date_parse.py +0 -0
  20. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/doctor.py +0 -0
  21. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/error_hints.py +0 -0
  22. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/exceptions.py +0 -0
  23. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/hostd 2.py +0 -0
  24. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/invites.py +0 -0
  25. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/launcher.py +0 -0
  26. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/launcher_install.py +0 -0
  27. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/__init__.py +0 -0
  28. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/__main__.py +0 -0
  29. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/backend.py +0 -0
  30. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/realtime.py +0 -0
  31. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/server.py +0 -0
  32. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  33. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/test_backend.py +0 -0
  34. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  35. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  36. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  37. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  38. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  39. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/preferences.py +0 -0
  40. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/protocol_handler.py +0 -0
  41. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/protocol_v2.py +0 -0
  42. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/quickstart.py +0 -0
  43. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/rpc_allowlist.py +0 -0
  44. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/run_agent.py +0 -0
  45. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/scripts/check_secrets.py +0 -0
  46. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/scripts/race_rate_harness.py +0 -0
  47. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/secrets.py +0 -0
  48. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/self_update.py +0 -0
  49. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/setup_clients.py +0 -0
  50. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/supervisor.py +0 -0
  51. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/up 2.py +0 -0
  52. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/up.py +0 -0
  53. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode/upload.py +0 -0
  54. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/comms_v4.py +0 -0
  55. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  56. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  57. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/cli.py +0 -0
  58. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  59. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/compat.py +0 -0
  60. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  61. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  62. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/invites.py +0 -0
  63. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  64. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  65. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  66. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  67. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  68. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  69. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  70. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  71. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  72. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  73. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  74. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  75. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  76. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  77. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  78. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  79. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  80. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  81. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/meshcode/upload.py +0 -0
  82. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  83. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_core.py +0 -0
  84. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  85. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  86. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  87. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  88. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  89. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  90. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  91. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  92. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  93. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  94. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  95. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  96. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  97. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  98. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  99. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  100. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  101. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  102. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  103. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  104. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  105. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  106. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  107. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  108. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  109. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  110. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  111. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  112. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  113. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  114. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  115. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  116. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  117. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  118. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  119. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  120. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  121. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  122. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/comms_v4.py +0 -0
  123. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  124. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  125. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/cli.py +0 -0
  126. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  127. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/compat.py +0 -0
  128. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  129. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  130. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/invites.py +0 -0
  131. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  132. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  133. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  134. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  135. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  136. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  137. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  138. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  139. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  140. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  141. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  142. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  143. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  144. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  145. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  146. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  147. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  148. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  149. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/meshcode/upload.py +0 -0
  150. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  151. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_core.py +0 -0
  152. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  153. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  154. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  155. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  156. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  157. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  158. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  159. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  160. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  161. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  162. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  163. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/comms_v4.py +0 -0
  164. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  165. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  166. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  167. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  168. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  169. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  170. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  171. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  172. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  173. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  174. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  175. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  176. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  177. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  178. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  179. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  180. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  181. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  182. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  183. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  184. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  185. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  186. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  187. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  188. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  189. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  190. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  191. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  192. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_core.py +0 -0
  193. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  194. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  195. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  196. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  197. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  198. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  199. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  200. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  201. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  202. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  203. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  204. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/PKG-INFO 2 +0 -0
  205. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/SOURCES 2.txt +0 -0
  206. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/SOURCES.txt +0 -0
  207. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/dependency_links 2.txt +0 -0
  208. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/dependency_links.txt +0 -0
  209. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/entry_points 2.txt +0 -0
  210. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/entry_points.txt +0 -0
  211. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/requires 2.txt +0 -0
  212. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/requires.txt +0 -0
  213. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/top_level 2.txt +0 -0
  214. {meshcode-2.11.101 → meshcode-2.11.103}/meshcode.egg-info/top_level.txt +0 -0
  215. {meshcode-2.11.101 → meshcode-2.11.103}/setup.cfg +0 -0
  216. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_auto_update_hardening.py +0 -0
  217. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_autonomous_closegap_1.py +0 -0
  218. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_autonomous_closegap_2.py +0 -0
  219. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_autonomous_closegap_3.py +0 -0
  220. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_autonomous_prompt_inject 2.py +0 -0
  221. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_autonomous_prompt_inject.py +0 -0
  222. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_boot_bug_regression.py +0 -0
  223. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_color_truecolor.py +0 -0
  224. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_core.py +0 -0
  225. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_cross_agent_messaging.py +0 -0
  226. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_date_parse.py +0 -0
  227. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_doctor.py +0 -0
  228. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_epistemic_v1_python_sdk.py +0 -0
  229. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  230. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_esc_deaf_state.py +0 -0
  231. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_exceptions.py +0 -0
  232. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_file_upload.py +0 -0
  233. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_init_device_code.py +0 -0
  234. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_install_guard.py +0 -0
  235. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_lease_sigterm_release.py +0 -0
  236. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_mark_read_batch.py +0 -0
  237. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_marketplace_ratings.py +0 -0
  238. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_migration_integrity.py +0 -0
  239. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_realtime_event_freshness.py +0 -0
  240. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_rls_cross_tenant.py +0 -0
  241. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_rpc_grants.py +0 -0
  242. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_rpc_migrations.py +0 -0
  243. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_run_agent_dry_run.py +0 -0
  244. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_run_agent_no_server_import.py +0 -0
  245. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_security_regressions.py +0 -0
  246. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_self_update_user_site.py +0 -0
  247. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_sentinel.py +0 -0
  248. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_setup_path.py +0 -0
  249. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_sleep_signals.py +0 -0
  250. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_status_enum_coverage.py +0 -0
  251. {meshcode-2.11.101 → meshcode-2.11.103}/tests/test_stay_on_loop_hook.py +0 -0
  252. {meshcode-2.11.101 → meshcode-2.11.103}/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.101
3
+ Version: 2.11.103
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.101"
2
+ __version__ = "2.11.103"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -801,6 +801,72 @@ def _do_stops(api_key: str, host_id: str) -> int:
801
801
  return n
802
802
 
803
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
+
804
870
  def _do_recycle_enforce(api_key: str, host_id: str) -> int:
805
871
  """RECYCLE-MUST-GUARANTEE-RESPAWN (task c0fc5597). An interactive claude (no --print) can't
806
872
  self-exit on must_exit=recycle: the model leaves its loop but the process idles + the MCP
@@ -840,6 +906,15 @@ def _do_recycle_enforce(api_key: str, host_id: str) -> int:
840
906
  f"recycled {c.get('recycled_age_s')}s ago, hb {c.get('heartbeat_age_s')}s) "
841
907
  f"-> fast-path respawn will relaunch it.")
842
908
  n += 1
909
+ # mig425 companion (49fd4ebf, anti kill-loop): a 'requested_never_consumed' candidate was
910
+ # killed for NEVER consuming its recycle (last_recycle_at still NULL). Record the recycle NOW
911
+ # so the respawn does NOT immediately re-match mig425 branch 2 (which keys on last_recycle_at
912
+ # IS NULL) -> it would otherwise force-kill the fresh process every sweep forever. Recording
913
+ # moves it into branch 1's window, which ages out. NO-OP until mig425 lands: mig419 candidates
914
+ # carry no enforce_reason, so this is skipped (the consumed-still-alive path already records).
915
+ if c.get("enforce_reason") == "requested_never_consumed":
916
+ _rpc("mc_record_recycle",
917
+ {"p_api_key": api_key, "p_project_id": c.get("project_id"), "p_agent_name": agent})
843
918
  st["headless_pids"] = pids
844
919
  _save_state(st)
845
920
  return n
@@ -1387,10 +1462,11 @@ def cmd_hostd(args: list) -> int:
1387
1462
  recycled = _do_recycles(api_key, host_id)
1388
1463
  ver_recycled = _do_version_recycles(api_key, host_id)
1389
1464
  stopped = _do_stops(api_key, host_id)
1465
+ reaped = _do_reap(api_key, host_id) # 38523a98: kill ghosts/dup-PIDs/crashed-orphans
1390
1466
  _gc_headless_pids() # cb90b058: drop dead PIDs (stale entry can't mask a live agent)
1391
1467
  _up = int(time.monotonic() - _spawn_mono)
1392
- if relaunched or recycled or ver_recycled or stopped or enforced:
1393
- _log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced")
1468
+ if relaunched or recycled or ver_recycled or stopped or enforced or reaped:
1469
+ _log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced, {reaped} reaped")
1394
1470
  elif time.monotonic() - _last_alive_log >= 60:
1395
1471
  _log(f"alive — uptime={_up}s")
1396
1472
  _last_alive_log = time.monotonic()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.101
3
+ Version: 2.11.103
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.101"
7
+ version = "2.11.103"
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