meshcode 2.11.78__tar.gz → 2.11.80__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.78 → meshcode-2.11.80}/PKG-INFO +1 -1
  2. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/hostd.py +82 -16
  4. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/run_agent.py +10 -0
  5. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode.egg-info/PKG-INFO +1 -1
  6. {meshcode-2.11.78 → meshcode-2.11.80}/pyproject.toml +1 -1
  7. {meshcode-2.11.78 → meshcode-2.11.80}/README.md +0 -0
  8. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/__main__.py +0 -0
  9. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/_stop_hook_template.py +0 -0
  10. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/ascii_art.py +0 -0
  11. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/atomic_push.py +0 -0
  12. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/claude_update.py +0 -0
  13. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/cli.py +0 -0
  14. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/comms_v4.py +0 -0
  15. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/compat.py +0 -0
  16. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/daemon.py +0 -0
  17. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/date_parse.py +0 -0
  18. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/doctor.py +0 -0
  19. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/error_hints.py +0 -0
  20. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/exceptions.py +0 -0
  21. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/invites.py +0 -0
  22. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/launcher.py +0 -0
  23. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/launcher_install.py +0 -0
  24. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/__init__.py +0 -0
  25. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/__main__.py +0 -0
  26. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/backend.py +0 -0
  27. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/realtime.py +0 -0
  28. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/server.py +0 -0
  29. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  30. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/test_backend.py +0 -0
  31. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  32. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  33. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  34. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  35. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  36. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/preferences.py +0 -0
  37. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/protocol_handler.py +0 -0
  38. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/protocol_v2.py +0 -0
  39. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/quickstart.py +0 -0
  40. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/rpc_allowlist.py +0 -0
  41. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/scripts/check_secrets.py +0 -0
  42. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/scripts/race_rate_harness.py +0 -0
  43. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/secrets.py +0 -0
  44. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/self_update.py +0 -0
  45. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/setup_clients.py +0 -0
  46. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/supervisor.py +0 -0
  47. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/up.py +0 -0
  48. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode/upload.py +0 -0
  49. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/comms_v4.py +0 -0
  50. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  51. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  52. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/cli.py +0 -0
  53. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  54. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/compat.py +0 -0
  55. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  56. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  57. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/invites.py +0 -0
  58. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  59. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  60. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  61. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  62. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  63. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  64. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  65. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  66. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  67. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  68. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  69. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  70. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  71. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  72. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  73. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  74. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  75. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  76. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/meshcode/upload.py +0 -0
  77. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  78. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_core.py +0 -0
  79. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  80. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  81. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  82. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  83. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  84. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  85. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  86. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  87. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  88. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  89. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  90. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  91. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  92. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  93. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  94. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  95. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  96. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  97. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  98. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  99. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  100. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  101. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  102. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  103. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  104. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  105. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  106. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  107. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  108. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  109. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  110. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  111. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  112. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  113. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  114. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  115. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  116. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  117. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/comms_v4.py +0 -0
  118. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  119. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  120. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/cli.py +0 -0
  121. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  122. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/compat.py +0 -0
  123. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  124. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  125. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/invites.py +0 -0
  126. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  127. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  128. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  129. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  130. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  131. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  132. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  133. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  134. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  135. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  136. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  137. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  138. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  139. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  140. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  141. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  142. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  143. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  144. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/meshcode/upload.py +0 -0
  145. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  146. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_core.py +0 -0
  147. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  148. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  149. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  150. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  151. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  152. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  153. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  154. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  155. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  156. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  157. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  158. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/comms_v4.py +0 -0
  159. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  160. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  161. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  162. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  163. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  164. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  165. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  166. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  167. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  168. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  169. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  170. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  171. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  172. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  173. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  174. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  175. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  176. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  177. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  178. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  179. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  180. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  181. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  182. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  183. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  184. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  185. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  186. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  187. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_core.py +0 -0
  188. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  189. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  190. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  191. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  192. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  193. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  194. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  195. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  196. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  197. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  198. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  199. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode.egg-info/SOURCES.txt +0 -0
  200. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode.egg-info/dependency_links.txt +0 -0
  201. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode.egg-info/entry_points.txt +0 -0
  202. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode.egg-info/requires.txt +0 -0
  203. {meshcode-2.11.78 → meshcode-2.11.80}/meshcode.egg-info/top_level.txt +0 -0
  204. {meshcode-2.11.78 → meshcode-2.11.80}/setup.cfg +0 -0
  205. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_auto_update_hardening.py +0 -0
  206. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_autonomous_closegap_1.py +0 -0
  207. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_autonomous_closegap_2.py +0 -0
  208. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_autonomous_closegap_3.py +0 -0
  209. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_autonomous_prompt_inject.py +0 -0
  210. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_boot_bug_regression.py +0 -0
  211. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_color_truecolor.py +0 -0
  212. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_core.py +0 -0
  213. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_cross_agent_messaging.py +0 -0
  214. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_date_parse.py +0 -0
  215. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_doctor.py +0 -0
  216. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_epistemic_v1_python_sdk.py +0 -0
  217. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  218. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_esc_deaf_state.py +0 -0
  219. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_exceptions.py +0 -0
  220. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_file_upload.py +0 -0
  221. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_init_device_code.py +0 -0
  222. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_install_guard.py +0 -0
  223. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_lease_sigterm_release.py +0 -0
  224. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_mark_read_batch.py +0 -0
  225. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_marketplace_ratings.py +0 -0
  226. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_migration_integrity.py +0 -0
  227. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_realtime_event_freshness.py +0 -0
  228. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_rls_cross_tenant.py +0 -0
  229. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_rpc_grants.py +0 -0
  230. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_rpc_migrations.py +0 -0
  231. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_run_agent_dry_run.py +0 -0
  232. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_run_agent_no_server_import.py +0 -0
  233. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_security_regressions.py +0 -0
  234. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_self_update_user_site.py +0 -0
  235. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_sentinel.py +0 -0
  236. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_setup_path.py +0 -0
  237. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_sleep_signals.py +0 -0
  238. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_status_enum_coverage.py +0 -0
  239. {meshcode-2.11.78 → meshcode-2.11.80}/tests/test_stay_on_loop_hook.py +0 -0
  240. {meshcode-2.11.78 → meshcode-2.11.80}/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.78
3
+ Version: 2.11.80
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.78"
2
+ __version__ = "2.11.80"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -321,6 +321,16 @@ def _do_respawns(api_key: str, host_id: str) -> int:
321
321
  # The old mc_set_desired_state(p_state=crashed) call passed NO agent id = no-op; dropped.
322
322
  if rec and rec.get("give_up"):
323
323
  _log(f"ALERT {proj}/{agent}: respawn cap hit — marked crashed (atomic). No more respawns.")
324
+ # task 843f282c Phase 2: an agent that spawned but NEVER came online (hit the cap) is
325
+ # almost always Claude Code not logged in (hangs on an invisible headless login prompt).
326
+ # Resolve the pending launch -> FE toast instead of an eternal spinner.
327
+ try:
328
+ _rpc("mc_resolve_launch", {
329
+ "p_api_key": api_key, "p_project_id": c.get("project_id"), "p_agent": agent,
330
+ "p_status": "failed", "p_reason": "spawn_failed",
331
+ "p_detail": "agent spawned but never connected — check Claude Code login (run `claude`)"})
332
+ except Exception:
333
+ pass
324
334
  n += 1
325
335
  return n
326
336
 
@@ -457,10 +467,21 @@ def _hostd_plist_xml() -> str:
457
467
  _HOSTD_TASK_NAME = "MeshCode hostd"
458
468
 
459
469
 
470
+ def _hostd_start_now_windows(launch_cmd) -> None:
471
+ """Start hostd detached NOW (CREATE_NO_WINDOW | DETACHED_PROCESS) so the current session has a live
472
+ host immediately, independent of whichever persistence tier installed."""
473
+ try:
474
+ subprocess.Popen(["cmd.exe", "/c", str(launch_cmd)],
475
+ creationflags=0x08000000 | 0x00000008,
476
+ stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
477
+ except Exception as e:
478
+ _log(f"hostd start-now (windows) failed: {e}")
479
+
480
+
460
481
  def _hostd_install_windows() -> int:
461
- """Windows Task Scheduler job (mesh-core ITEM2): at-logon, hidden, restart 3x/1min, no
462
- time-limit, runs `meshcode hostd run` with auto-update off. Proven model on Samuel's box
463
- (.meshcode/hostd-launch.cmd + scheduled task 'MeshCode hostd')."""
482
+ """Windows keep-alive NON-ADMIN safe (task 843f282c). Persistence is best-effort across 3 tiers
483
+ (Register-ScheduledTask w/ watchdog -> schtasks ONLOGON CLI -> HKCU\\Run registry); hostd is ALWAYS
484
+ started now so the session works even if all persistence tiers fail (non-admin)."""
464
485
  mc = shutil.which("meshcode") or "meshcode"
465
486
  STATE_DIR.mkdir(parents=True, exist_ok=True)
466
487
  (STATE_DIR / "logs").mkdir(parents=True, exist_ok=True)
@@ -473,23 +494,59 @@ def _hostd_install_windows() -> int:
473
494
  f'"{mc}" hostd run\r\n',
474
495
  encoding="utf-8",
475
496
  )
476
- # Register-ScheduledTask (PowerShell) for fidelity: hidden + restart + unlimited + at-logon.
497
+ # Register-ScheduledTask (PowerShell) ROBUST KEEP-ALIVE (task 843f282c CRITICAL: hostd died ~15:04
498
+ # and Task Scheduler did NOT revive it = silent dead daemon = stuck launches). Two triggers: at-logon
499
+ # AND a PERIODIC every-5min watchdog (re-starts if down; MultipleInstances=IgnoreNew so it never
500
+ # double-spawns a live one) + high RestartCount on crash + unlimited runtime + hidden.
477
501
  ps = (
478
502
  '$a = New-ScheduledTaskAction -Execute "cmd.exe" -Argument \'/c "' + str(launch_cmd) + '"\';'
479
- '$t = New-ScheduledTaskTrigger -AtLogOn;'
503
+ '$t1 = New-ScheduledTaskTrigger -AtLogOn;'
504
+ '$t2 = New-ScheduledTaskTrigger -Once -At (Get-Date) '
505
+ '-RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration (New-TimeSpan -Days 3650);'
480
506
  '$s = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries'
481
- ' -ExecutionTimeLimit ([TimeSpan]::Zero) -RestartCount 3'
482
- ' -RestartInterval (New-TimeSpan -Minutes 1) -Hidden;'
507
+ ' -ExecutionTimeLimit ([TimeSpan]::Zero) -RestartCount 999'
508
+ ' -RestartInterval (New-TimeSpan -Minutes 1) -MultipleInstances IgnoreNew -Hidden;'
483
509
  '$p = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Limited;'
484
- "Register-ScheduledTask -TaskName '" + _HOSTD_TASK_NAME + "' -Action $a -Trigger $t"
510
+ "Register-ScheduledTask -TaskName '" + _HOSTD_TASK_NAME + "' -Action $a -Trigger $t1,$t2"
485
511
  ' -Settings $s -Principal $p -Force | Out-Null'
486
512
  )
513
+ # NON-ADMIN tiered persistence (task 843f282c): 99% of users are NOT admin, and Register-ScheduledTask
514
+ # fails Access-Denied (0x80070005) for them. Fall back: schtasks CLI (user task) -> HKCU\Run registry.
515
+ # hostd is ALWAYS started now regardless, so the current session has a live host immediately.
516
+ method = None
517
+ task_made = False
487
518
  r = subprocess.run(["powershell", "-NoProfile", "-Command", ps], capture_output=True, text=True)
488
- if r.returncode != 0:
489
- print(f"[hostd] Register-ScheduledTask failed: {r.stderr.strip()}", file=sys.stderr)
490
- return 1
491
- print(f"[hostd] installed Windows Task Scheduler job '{_HOSTD_TASK_NAME}' (at-logon, hidden, restart). launcher: {launch_cmd}")
492
- print(f'[hostd] start now: schtasks /Run /TN "{_HOSTD_TASK_NAME}"')
519
+ if r.returncode == 0:
520
+ task_made = True
521
+ method = "Task Scheduler (at-logon + 5min watchdog + restart)"
522
+ else:
523
+ _log(f"Register-ScheduledTask failed ({(r.stderr or '').strip()[:120]}); trying non-admin fallbacks")
524
+ r2 = subprocess.run(["schtasks", "/Create", "/TN", _HOSTD_TASK_NAME,
525
+ "/TR", f'cmd /c "{launch_cmd}"', "/SC", "ONLOGON", "/F"],
526
+ capture_output=True, text=True)
527
+ if r2.returncode == 0:
528
+ task_made = True
529
+ method = "schtasks ONLOGON (CLI, non-admin; no watchdog)"
530
+ else:
531
+ _log(f"schtasks /Create failed ({((r2.stderr or '')+(r2.stdout or '')).strip()[:120]}); trying HKCU Run")
532
+ r3 = subprocess.run(["reg", "add",
533
+ r"HKCU\Software\Microsoft\Windows\CurrentVersion\Run",
534
+ "/v", "MeshCodeHostd", "/t", "REG_SZ", "/d", f'cmd /c "{launch_cmd}"', "/f"],
535
+ capture_output=True, text=True)
536
+ if r3.returncode == 0:
537
+ method = "HKCU\\Run registry (login autostart, no admin; no watchdog)"
538
+ # ensure hostd is RUNNING now (task tiers: start via the task w/ IgnoreNew; else detached Popen).
539
+ started = False
540
+ if task_made:
541
+ rr = subprocess.run(["schtasks", "/Run", "/TN", _HOSTD_TASK_NAME], capture_output=True, text=True)
542
+ started = (rr.returncode == 0)
543
+ if not started:
544
+ _hostd_start_now_windows(launch_cmd)
545
+ if method:
546
+ print(f"[hostd] keep-alive installed via {method}; hostd running now. launcher: {launch_cmd}")
547
+ return 0
548
+ print(f"[hostd] WARN: no persistence method available (non-admin) — hostd started for THIS session "
549
+ f"ONLY (re-run after reboot). launcher: {launch_cmd}", file=sys.stderr)
493
550
  return 0
494
551
 
495
552
 
@@ -604,10 +661,13 @@ def _hostd_bootstrap(verbose: bool = False) -> bool:
604
661
  elif sysname == "Windows":
605
662
  q = subprocess.run(["schtasks", "/Query", "/TN", _HOSTD_TASK_NAME],
606
663
  capture_output=True, text=True)
607
- if q.returncode != 0:
664
+ if q.returncode == 0:
665
+ # task exists -> just ensure running (IgnoreNew => harmless if already up; no double-spawn)
666
+ subprocess.run(["schtasks", "/Run", "/TN", _HOSTD_TASK_NAME],
667
+ capture_output=True, text=True)
668
+ else:
669
+ # no task (incl non-admin registry-only / first run) -> install best tier + start now
608
670
  _hostd_install_windows()
609
- subprocess.run(["schtasks", "/Run", "/TN", _HOSTD_TASK_NAME],
610
- capture_output=True, text=True) # harmless if already running
611
671
  else: # Linux + others
612
672
  if shutil.which("systemctl"):
613
673
  act = subprocess.run(["systemctl", "--user", "is-active", _HOSTD_SYSTEMD_UNIT],
@@ -717,6 +777,12 @@ def cmd_hostd(args: list) -> int:
717
777
  _log(f"hostd starting — host_id={host_id} interval={POLL_INTERVAL_SEC}s stale={STALE_SECONDS}s")
718
778
  while True:
719
779
  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
720
786
  relaunched = _do_respawns(api_key, host_id)
721
787
  recycled = _do_recycles(api_key, host_id)
722
788
  ver_recycled = _do_version_recycles(api_key, host_id)
@@ -1082,6 +1082,16 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
1082
1082
  os.execvp(cmd[0], cmd)
1083
1083
  except FileNotFoundError:
1084
1084
  print(f"[meshcode] ERROR: '{editor}' not found in PATH", file=sys.stderr)
1085
+ # task 843f282c Phase 2: tell the dashboard WHY (claude_not_installed) so the pending launch
1086
+ # toast fires with an actionable message instead of spinning forever. Best-effort.
1087
+ try:
1088
+ from .comms_v4 import sb_rpc as _rpc_resolve
1089
+ _rpc_resolve("mc_resolve_launch", {
1090
+ "p_api_key": api_key, "p_project_id": project_id, "p_agent": agent,
1091
+ "p_status": "failed", "p_reason": "claude_not_installed",
1092
+ "p_detail": f"'{editor}' not found in PATH — install: npm i -g @anthropic-ai/claude-code"})
1093
+ except Exception:
1094
+ pass
1085
1095
  return 127
1086
1096
  except Exception as e:
1087
1097
  print(f"[meshcode] ERROR launching {editor}: {e}", file=sys.stderr)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.78
3
+ Version: 2.11.80
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.78"
7
+ version = "2.11.80"
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