meshcode 2.11.80__tar.gz → 2.11.82__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 (240) hide show
  1. {meshcode-2.11.80 → meshcode-2.11.82}/PKG-INFO +1 -1
  2. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/hostd.py +64 -19
  4. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/server.py +14 -0
  5. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/run_agent.py +7 -0
  6. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode.egg-info/PKG-INFO +1 -1
  7. {meshcode-2.11.80 → meshcode-2.11.82}/pyproject.toml +1 -1
  8. {meshcode-2.11.80 → meshcode-2.11.82}/README.md +0 -0
  9. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/__main__.py +0 -0
  10. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/_stop_hook_template.py +0 -0
  11. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/ascii_art.py +0 -0
  12. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/atomic_push.py +0 -0
  13. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/claude_update.py +0 -0
  14. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/cli.py +0 -0
  15. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/comms_v4.py +0 -0
  16. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/compat.py +0 -0
  17. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/daemon.py +0 -0
  18. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/date_parse.py +0 -0
  19. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/doctor.py +0 -0
  20. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/error_hints.py +0 -0
  21. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/exceptions.py +0 -0
  22. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/invites.py +0 -0
  23. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/launcher.py +0 -0
  24. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/launcher_install.py +0 -0
  25. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/__init__.py +0 -0
  26. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/__main__.py +0 -0
  27. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/backend.py +0 -0
  28. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/realtime.py +0 -0
  29. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  30. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/test_backend.py +0 -0
  31. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  32. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  33. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  34. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  35. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  36. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/preferences.py +0 -0
  37. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/protocol_handler.py +0 -0
  38. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/protocol_v2.py +0 -0
  39. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/quickstart.py +0 -0
  40. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/rpc_allowlist.py +0 -0
  41. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/scripts/check_secrets.py +0 -0
  42. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/scripts/race_rate_harness.py +0 -0
  43. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/secrets.py +0 -0
  44. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/self_update.py +0 -0
  45. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/setup_clients.py +0 -0
  46. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/supervisor.py +0 -0
  47. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/up.py +0 -0
  48. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode/upload.py +0 -0
  49. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/comms_v4.py +0 -0
  50. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  51. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  52. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/cli.py +0 -0
  53. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  54. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/compat.py +0 -0
  55. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  56. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  57. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/invites.py +0 -0
  58. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  59. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  60. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  61. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  62. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  63. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  64. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  65. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  66. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  67. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  68. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  69. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  70. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  71. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  72. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  73. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  74. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  75. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  76. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/meshcode/upload.py +0 -0
  77. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  78. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_core.py +0 -0
  79. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  80. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  81. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  82. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  83. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  84. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  85. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  86. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  87. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  88. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  89. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  90. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  91. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  92. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  93. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  94. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  95. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  96. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  97. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  98. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  99. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  100. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  101. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  102. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  103. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  104. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  105. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  106. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  107. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  108. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  109. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  110. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  111. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  112. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  113. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  114. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  115. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  116. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  117. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/comms_v4.py +0 -0
  118. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  119. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  120. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/cli.py +0 -0
  121. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  122. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/compat.py +0 -0
  123. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  124. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  125. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/invites.py +0 -0
  126. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  127. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  128. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  129. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  130. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  131. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  132. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  133. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  134. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  135. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  136. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  137. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  138. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  139. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  140. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  141. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  142. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  143. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  144. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/meshcode/upload.py +0 -0
  145. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  146. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_core.py +0 -0
  147. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  148. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  149. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  150. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  151. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  152. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  153. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  154. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  155. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  156. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  157. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  158. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/comms_v4.py +0 -0
  159. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  160. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  161. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  162. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  163. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  164. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  165. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  166. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  167. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  168. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  169. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  170. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  171. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  172. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  173. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  174. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  175. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  176. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  177. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  178. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  179. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  180. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  181. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  182. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  183. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  184. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  185. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  186. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  187. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_core.py +0 -0
  188. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  189. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  190. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  191. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  192. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  193. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  194. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  195. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  196. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  197. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  198. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  199. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode.egg-info/SOURCES.txt +0 -0
  200. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode.egg-info/dependency_links.txt +0 -0
  201. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode.egg-info/entry_points.txt +0 -0
  202. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode.egg-info/requires.txt +0 -0
  203. {meshcode-2.11.80 → meshcode-2.11.82}/meshcode.egg-info/top_level.txt +0 -0
  204. {meshcode-2.11.80 → meshcode-2.11.82}/setup.cfg +0 -0
  205. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_auto_update_hardening.py +0 -0
  206. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_autonomous_closegap_1.py +0 -0
  207. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_autonomous_closegap_2.py +0 -0
  208. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_autonomous_closegap_3.py +0 -0
  209. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_autonomous_prompt_inject.py +0 -0
  210. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_boot_bug_regression.py +0 -0
  211. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_color_truecolor.py +0 -0
  212. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_core.py +0 -0
  213. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_cross_agent_messaging.py +0 -0
  214. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_date_parse.py +0 -0
  215. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_doctor.py +0 -0
  216. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_epistemic_v1_python_sdk.py +0 -0
  217. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  218. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_esc_deaf_state.py +0 -0
  219. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_exceptions.py +0 -0
  220. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_file_upload.py +0 -0
  221. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_init_device_code.py +0 -0
  222. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_install_guard.py +0 -0
  223. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_lease_sigterm_release.py +0 -0
  224. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_mark_read_batch.py +0 -0
  225. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_marketplace_ratings.py +0 -0
  226. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_migration_integrity.py +0 -0
  227. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_realtime_event_freshness.py +0 -0
  228. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_rls_cross_tenant.py +0 -0
  229. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_rpc_grants.py +0 -0
  230. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_rpc_migrations.py +0 -0
  231. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_run_agent_dry_run.py +0 -0
  232. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_run_agent_no_server_import.py +0 -0
  233. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_security_regressions.py +0 -0
  234. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_self_update_user_site.py +0 -0
  235. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_sentinel.py +0 -0
  236. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_setup_path.py +0 -0
  237. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_sleep_signals.py +0 -0
  238. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_status_enum_coverage.py +0 -0
  239. {meshcode-2.11.80 → meshcode-2.11.82}/tests/test_stay_on_loop_hook.py +0 -0
  240. {meshcode-2.11.80 → meshcode-2.11.82}/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.80
3
+ Version: 2.11.82
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.80"
2
+ __version__ = "2.11.82"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -502,7 +502,7 @@ def _hostd_install_windows() -> int:
502
502
  '$a = New-ScheduledTaskAction -Execute "cmd.exe" -Argument \'/c "' + str(launch_cmd) + '"\';'
503
503
  '$t1 = New-ScheduledTaskTrigger -AtLogOn;'
504
504
  '$t2 = New-ScheduledTaskTrigger -Once -At (Get-Date) '
505
- '-RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration (New-TimeSpan -Days 3650);'
505
+ '-RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration (New-TimeSpan -Days 3650);'
506
506
  '$s = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries'
507
507
  ' -ExecutionTimeLimit ([TimeSpan]::Zero) -RestartCount 999'
508
508
  ' -RestartInterval (New-TimeSpan -Minutes 1) -MultipleInstances IgnoreNew -Hidden;'
@@ -641,6 +641,32 @@ def _hostd_uninstall() -> int:
641
641
  return 0
642
642
 
643
643
 
644
+ _BOOTSTRAP_MARKER = STATE_DIR / ".bootstrap_check"
645
+
646
+
647
+ def _hostd_bootstrap_if_needed(ttl_sec: int = 3600, verbose: bool = False) -> bool:
648
+ """TTL-guarded bootstrap for the `meshcode run` / MCP-serve entry points (task 61b22c7b Phase 1):
649
+ bootstrap hostd if it wasn't checked within ttl_sec — covers users who run an agent BEFORE/without
650
+ `meshcode login`. The TTL avoids hammering schtasks/launchctl on every agent spawn (hostd spawns N
651
+ agents; only the first bootstraps). Best-effort: never raises."""
652
+ try:
653
+ if _BOOTSTRAP_MARKER.exists() and (time.time() - _BOOTSTRAP_MARKER.stat().st_mtime) < ttl_sec:
654
+ return False # recently bootstrapped — skip
655
+ except Exception:
656
+ pass
657
+ ok = False
658
+ try:
659
+ ok = _hostd_bootstrap(verbose=verbose)
660
+ except Exception:
661
+ pass
662
+ try:
663
+ STATE_DIR.mkdir(parents=True, exist_ok=True)
664
+ _BOOTSTRAP_MARKER.write_text(str(int(time.time())), encoding="utf-8")
665
+ except Exception:
666
+ pass
667
+ return ok
668
+
669
+
644
670
  def _hostd_bootstrap(verbose: bool = False) -> bool:
645
671
  """Idempotent auto-install + start of hostd (task f12b9d36) — called from `meshcode login`
646
672
  so onboarding is just `pip install meshcode` + `meshcode login` (no manual `hostd install`).
@@ -765,32 +791,51 @@ def cmd_hostd(args: list) -> int:
765
791
  if not api_key:
766
792
  _log("FATAL: no api key — run `meshcode login` (key is read from the keychain)")
767
793
  return 1
768
- # Register this host in mc_host_config so the dashboard can list it as a
769
- # launch target (Path2 canonical: dashboard -> mc_host_set_agents ->
770
- # mc_agents.desired_state='running' -> this daemon polls + spawns).
771
- # mc_host_config_set upserts (host_id, owner_user_id) idempotently.
794
+ # P1 hostd_CRASH_LOOP: the detached Windows daemon has NO console, so crashes (incl hard
795
+ # faults / uncaught exceptions) went to INVISIBLE stderr — hostd.log showed nothing. Capture
796
+ # stderr + faulthandler tracebacks to a file + install an excepthook so the NEXT crash is
797
+ # diagnosable, and the daemon never dies silently.
798
+ try:
799
+ import faulthandler, traceback as _tbmod
800
+ (STATE_DIR / "logs").mkdir(parents=True, exist_ok=True)
801
+ _errf = open(STATE_DIR / "logs" / "hostd.stderr.log", "a", buffering=1, encoding="utf-8")
802
+ sys.stderr = _errf
803
+ faulthandler.enable(file=_errf, all_threads=True)
804
+ sys.excepthook = lambda t, v, tb: _log("UNCAUGHT: " + "".join(_tbmod.format_exception(t, v, tb)))
805
+ except Exception:
806
+ pass
807
+ # Register this host in mc_host_config so the dashboard can list it as a launch target.
772
808
  _reg = _rpc("mc_host_config_set", {"p_api_key": api_key, "p_host_id": host_id})
773
809
  if _reg and _reg.get("ok"):
774
810
  _log(f"registered host {host_id} in mc_host_config")
775
811
  else:
776
812
  _log(f"WARN: host registration failed (dashboard may not list this host): {_reg}")
777
813
  _log(f"hostd starting — host_id={host_id} interval={POLL_INTERVAL_SEC}s stale={STALE_SECONDS}s")
814
+ # OUTER resilience (P1): a code exception in the poll loop must NEVER kill the daemon.
778
815
  while True:
779
816
  try:
780
- # task 843f282c: heartbeat so the cloud knows this daemon is ALIVE — launch-request
781
- # detects host_offline (dead hostd) and toasts instead of spinning forever (Ian's bug).
782
- try:
783
- _rpc("mc_host_heartbeat", {"p_api_key": api_key, "p_host_id": host_id})
784
- except Exception:
785
- pass
786
- relaunched = _do_respawns(api_key, host_id)
787
- recycled = _do_recycles(api_key, host_id)
788
- ver_recycled = _do_version_recycles(api_key, host_id)
789
- if relaunched or recycled or ver_recycled:
790
- _log(f"sweep done — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled")
791
- except Exception as e:
792
- _log(f"WARN: sweep error: {e}")
793
- time.sleep(POLL_INTERVAL_SEC)
817
+ while True:
818
+ try:
819
+ # heartbeat so the cloud knows this daemon is ALIVE (host_offline detection).
820
+ try:
821
+ _rpc("mc_host_heartbeat", {"p_api_key": api_key, "p_host_id": host_id})
822
+ except Exception:
823
+ pass
824
+ relaunched = _do_respawns(api_key, host_id)
825
+ recycled = _do_recycles(api_key, host_id)
826
+ ver_recycled = _do_version_recycles(api_key, host_id)
827
+ if relaunched or recycled or ver_recycled:
828
+ _log(f"sweep done {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled")
829
+ except Exception as e:
830
+ import traceback as _tb
831
+ _log(f"WARN: sweep error: {e}\n{_tb.format_exc()}")
832
+ time.sleep(POLL_INTERVAL_SEC)
833
+ except (KeyboardInterrupt, SystemExit):
834
+ raise # honor a real shutdown signal
835
+ except BaseException as e:
836
+ import traceback as _tb
837
+ _log(f"FATAL: poll loop crashed (restarting loop in 5s): {e}\n{_tb.format_exc()}")
838
+ time.sleep(5)
794
839
 
795
840
  print(f"[hostd] unknown subcommand: {sub}", file=sys.stderr)
796
841
  return 1
@@ -7406,6 +7406,20 @@ def _check_boot_version_drift():
7406
7406
  def run_server():
7407
7407
  """Start the MCP server on stdio (default for Claude Code)."""
7408
7408
  _auto_update()
7409
+ # task 61b22c7b Phase 1: best-effort, NON-blocking — ensure a hostd is running even if this
7410
+ # agent's MCP serve came up without a prior `meshcode login`/hostd. TTL-guarded + idempotent;
7411
+ # runs in a daemon thread so it never delays the MCP handshake.
7412
+ try:
7413
+ import threading as _th_bs
7414
+ def _bg_hostd_bootstrap():
7415
+ try:
7416
+ from meshcode import hostd as _hostd_bs
7417
+ _hostd_bs._hostd_bootstrap_if_needed()
7418
+ except Exception:
7419
+ pass
7420
+ _th_bs.Thread(target=_bg_hostd_bootstrap, daemon=True).start()
7421
+ except Exception:
7422
+ pass
7409
7423
  # Telemetry canary: surface any installed/loaded version drift loudly
7410
7424
  # to stderr so it shows up in Claude Code's MCP server output. The first
7411
7425
  # heartbeat carries the loaded version to mc_agents; this stderr line is
@@ -708,6 +708,13 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
708
708
  self_update.check_and_maybe_update()
709
709
  except Exception:
710
710
  pass
711
+ # task 61b22c7b Phase 1: ensure a hostd is running even if the user ran an agent BEFORE
712
+ # (or without) `meshcode login` — idempotent + TTL-guarded so spawned agents don't hammer it.
713
+ try:
714
+ from . import hostd as _hostd
715
+ _hostd._hostd_bootstrap_if_needed()
716
+ except Exception:
717
+ pass
711
718
 
712
719
  # Detect: are we already inside a Claude Code session? os.execvp(claude)
713
720
  # from inside an existing claude won't work — claude needs a fresh
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.80
3
+ Version: 2.11.82
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.80"
7
+ version = "2.11.82"
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