meshcode 2.11.87__tar.gz → 2.11.90__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 (244) hide show
  1. {meshcode-2.11.87 → meshcode-2.11.90}/PKG-INFO +1 -1
  2. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/hostd.py +110 -6
  4. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/PKG-INFO +1 -1
  5. meshcode-2.11.90/meshcode.egg-info/SOURCES.txt +89 -0
  6. meshcode-2.11.90/meshcode.egg-info/top_level.txt +1 -0
  7. {meshcode-2.11.87 → meshcode-2.11.90}/pyproject.toml +1 -1
  8. meshcode-2.11.87/meshcode/ascii_art.py +0 -638
  9. meshcode-2.11.87/meshcode/cli.py +0 -42
  10. meshcode-2.11.87/meshcode/compat.py +0 -174
  11. meshcode-2.11.87/meshcode/error_hints.py +0 -74
  12. meshcode-2.11.87/meshcode/exceptions.py +0 -52
  13. meshcode-2.11.87/meshcode/invites.py +0 -406
  14. meshcode-2.11.87/meshcode/launcher.py +0 -353
  15. meshcode-2.11.87/meshcode/launcher_install.py +0 -414
  16. meshcode-2.11.87/meshcode/meshcode_mcp/__init__.py +0 -22
  17. meshcode-2.11.87/meshcode/meshcode_mcp/__main__.py +0 -62
  18. meshcode-2.11.87/meshcode/meshcode_mcp/test_backend.py +0 -86
  19. meshcode-2.11.87/meshcode/meshcode_mcp/test_realtime.py +0 -95
  20. meshcode-2.11.87/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  21. meshcode-2.11.87/meshcode/preferences.py +0 -260
  22. meshcode-2.11.87/meshcode/protocol_v2.py +0 -129
  23. meshcode-2.11.87/meshcode/secrets.py +0 -365
  24. meshcode-2.11.87/meshcode/supervisor.py +0 -186
  25. meshcode-2.11.87/meshcode/upload.py +0 -125
  26. meshcode-2.11.87/meshcode-backend-wt/comms_v4.py +0 -1941
  27. meshcode-2.11.87/meshcode-backend-wt/meshcode/__init__.py +0 -82
  28. meshcode-2.11.87/meshcode-backend-wt/meshcode/comms_v4.py +0 -3563
  29. meshcode-2.11.87/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -1261
  30. meshcode-2.11.87/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -460
  31. meshcode-2.11.87/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -4117
  32. meshcode-2.11.87/meshcode-backend-wt/meshcode/quickstart.py +0 -148
  33. meshcode-2.11.87/meshcode-backend-wt/meshcode/run_agent.py +0 -958
  34. meshcode-2.11.87/meshcode-backend-wt/meshcode/self_update.py +0 -345
  35. meshcode-2.11.87/meshcode-backend-wt/meshcode/setup_clients.py +0 -926
  36. meshcode-2.11.87/meshcode-backend-wt/scripts/sentinel.py +0 -257
  37. meshcode-2.11.87/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -387
  38. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -82
  39. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -638
  40. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -42
  41. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -3563
  42. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -174
  43. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -74
  44. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -52
  45. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -406
  46. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -353
  47. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -414
  48. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -22
  49. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -62
  50. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -1261
  51. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -460
  52. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -4117
  53. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -86
  54. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -95
  55. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  56. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -260
  57. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -129
  58. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -148
  59. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -958
  60. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -365
  61. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -345
  62. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -926
  63. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -186
  64. meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -125
  65. meshcode-2.11.87/meshcode-noun-wt/comms_v4.py +0 -1941
  66. meshcode-2.11.87/meshcode-noun-wt/meshcode/__init__.py +0 -82
  67. meshcode-2.11.87/meshcode-noun-wt/meshcode/ascii_art.py +0 -638
  68. meshcode-2.11.87/meshcode-noun-wt/meshcode/cli.py +0 -42
  69. meshcode-2.11.87/meshcode-noun-wt/meshcode/comms_v4.py +0 -3563
  70. meshcode-2.11.87/meshcode-noun-wt/meshcode/compat.py +0 -174
  71. meshcode-2.11.87/meshcode-noun-wt/meshcode/error_hints.py +0 -74
  72. meshcode-2.11.87/meshcode-noun-wt/meshcode/exceptions.py +0 -52
  73. meshcode-2.11.87/meshcode-noun-wt/meshcode/invites.py +0 -406
  74. meshcode-2.11.87/meshcode-noun-wt/meshcode/launcher.py +0 -353
  75. meshcode-2.11.87/meshcode-noun-wt/meshcode/launcher_install.py +0 -414
  76. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -22
  77. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -62
  78. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -1261
  79. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -460
  80. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -4117
  81. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
  82. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
  83. meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  84. meshcode-2.11.87/meshcode-noun-wt/meshcode/preferences.py +0 -260
  85. meshcode-2.11.87/meshcode-noun-wt/meshcode/protocol_v2.py +0 -129
  86. meshcode-2.11.87/meshcode-noun-wt/meshcode/quickstart.py +0 -148
  87. meshcode-2.11.87/meshcode-noun-wt/meshcode/run_agent.py +0 -958
  88. meshcode-2.11.87/meshcode-noun-wt/meshcode/secrets.py +0 -365
  89. meshcode-2.11.87/meshcode-noun-wt/meshcode/self_update.py +0 -345
  90. meshcode-2.11.87/meshcode-noun-wt/meshcode/setup_clients.py +0 -926
  91. meshcode-2.11.87/meshcode-noun-wt/meshcode/supervisor.py +0 -186
  92. meshcode-2.11.87/meshcode-noun-wt/meshcode/upload.py +0 -125
  93. meshcode-2.11.87/meshcode-noun-wt/scripts/sentinel.py +0 -257
  94. meshcode-2.11.87/meshcode-noun-wt/tests/test_core.py +0 -216
  95. meshcode-2.11.87/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -366
  96. meshcode-2.11.87/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -361
  97. meshcode-2.11.87/meshcode-noun-wt/tests/test_exceptions.py +0 -107
  98. meshcode-2.11.87/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -200
  99. meshcode-2.11.87/meshcode-noun-wt/tests/test_migration_integrity.py +0 -176
  100. meshcode-2.11.87/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -236
  101. meshcode-2.11.87/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -255
  102. meshcode-2.11.87/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -387
  103. meshcode-2.11.87/meshcode-noun-wt/tests/test_security_regressions.py +0 -171
  104. meshcode-2.11.87/meshcode-noun-wt/tests/test_sentinel.py +0 -148
  105. meshcode-2.11.87/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -231
  106. meshcode-2.11.87/meshcode-tasks-wt/comms_v4.py +0 -1941
  107. meshcode-2.11.87/meshcode-tasks-wt/meshcode/__init__.py +0 -82
  108. meshcode-2.11.87/meshcode-tasks-wt/meshcode/ascii_art.py +0 -638
  109. meshcode-2.11.87/meshcode-tasks-wt/meshcode/cli.py +0 -42
  110. meshcode-2.11.87/meshcode-tasks-wt/meshcode/comms_v4.py +0 -3563
  111. meshcode-2.11.87/meshcode-tasks-wt/meshcode/compat.py +0 -174
  112. meshcode-2.11.87/meshcode-tasks-wt/meshcode/error_hints.py +0 -74
  113. meshcode-2.11.87/meshcode-tasks-wt/meshcode/exceptions.py +0 -52
  114. meshcode-2.11.87/meshcode-tasks-wt/meshcode/invites.py +0 -406
  115. meshcode-2.11.87/meshcode-tasks-wt/meshcode/launcher.py +0 -353
  116. meshcode-2.11.87/meshcode-tasks-wt/meshcode/launcher_install.py +0 -414
  117. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -22
  118. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -62
  119. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -1261
  120. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -460
  121. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -4117
  122. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
  123. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
  124. meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  125. meshcode-2.11.87/meshcode-tasks-wt/meshcode/preferences.py +0 -260
  126. meshcode-2.11.87/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -129
  127. meshcode-2.11.87/meshcode-tasks-wt/meshcode/quickstart.py +0 -148
  128. meshcode-2.11.87/meshcode-tasks-wt/meshcode/run_agent.py +0 -958
  129. meshcode-2.11.87/meshcode-tasks-wt/meshcode/secrets.py +0 -365
  130. meshcode-2.11.87/meshcode-tasks-wt/meshcode/self_update.py +0 -345
  131. meshcode-2.11.87/meshcode-tasks-wt/meshcode/setup_clients.py +0 -926
  132. meshcode-2.11.87/meshcode-tasks-wt/meshcode/supervisor.py +0 -186
  133. meshcode-2.11.87/meshcode-tasks-wt/meshcode/upload.py +0 -125
  134. meshcode-2.11.87/meshcode-tasks-wt/scripts/sentinel.py +0 -257
  135. meshcode-2.11.87/meshcode-tasks-wt/tests/test_core.py +0 -216
  136. meshcode-2.11.87/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -366
  137. meshcode-2.11.87/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -361
  138. meshcode-2.11.87/meshcode-tasks-wt/tests/test_exceptions.py +0 -107
  139. meshcode-2.11.87/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -200
  140. meshcode-2.11.87/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -176
  141. meshcode-2.11.87/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -236
  142. meshcode-2.11.87/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -255
  143. meshcode-2.11.87/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -387
  144. meshcode-2.11.87/meshcode-tasks-wt/tests/test_security_regressions.py +0 -171
  145. meshcode-2.11.87/meshcode-tasks-wt/tests/test_sentinel.py +0 -148
  146. meshcode-2.11.87/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -231
  147. meshcode-2.11.87/meshcode.egg-info/SOURCES.txt +0 -240
  148. meshcode-2.11.87/meshcode.egg-info/top_level.txt +0 -4
  149. meshcode-2.11.87/tests/test_autonomous_prompt_inject 2.py +0 -126
  150. meshcode-2.11.87/tests/test_core.py +0 -216
  151. meshcode-2.11.87/tests/test_cross_agent_messaging.py +0 -366
  152. meshcode-2.11.87/tests/test_esc_deaf_state.py +0 -361
  153. meshcode-2.11.87/tests/test_exceptions.py +0 -107
  154. meshcode-2.11.87/tests/test_mark_read_batch.py +0 -200
  155. meshcode-2.11.87/tests/test_migration_integrity.py +0 -176
  156. meshcode-2.11.87/tests/test_realtime_event_freshness.py +0 -236
  157. meshcode-2.11.87/tests/test_rls_cross_tenant.py +0 -255
  158. meshcode-2.11.87/tests/test_security_regressions.py +0 -171
  159. meshcode-2.11.87/tests/test_sentinel.py +0 -148
  160. meshcode-2.11.87/tests/test_status_enum_coverage.py +0 -231
  161. {meshcode-2.11.87 → meshcode-2.11.90}/README.md +0 -0
  162. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/__main__.py +0 -0
  163. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/_session_handoff_template.py +0 -0
  164. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/_stop_hook_template.py +0 -0
  165. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/ascii_art.py +0 -0
  166. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/atomic_push.py +0 -0
  167. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/claude_update.py +0 -0
  168. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/cli.py +0 -0
  169. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/comms_v4.py +0 -0
  170. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/compat.py +0 -0
  171. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/daemon.py +0 -0
  172. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/date_parse.py +0 -0
  173. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/doctor.py +0 -0
  174. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/error_hints.py +0 -0
  175. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/exceptions.py +0 -0
  176. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/invites.py +0 -0
  177. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/launcher.py +0 -0
  178. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/launcher_install.py +0 -0
  179. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/__init__.py +0 -0
  180. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/__main__.py +0 -0
  181. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/backend.py +0 -0
  182. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/realtime.py +0 -0
  183. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/server.py +0 -0
  184. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  185. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/test_backend.py +0 -0
  186. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  187. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  188. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  189. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  190. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  191. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/preferences.py +0 -0
  192. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/protocol_handler.py +0 -0
  193. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/protocol_v2.py +0 -0
  194. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/quickstart.py +0 -0
  195. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/rpc_allowlist.py +0 -0
  196. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/run_agent.py +0 -0
  197. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/scripts/check_secrets.py +0 -0
  198. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/scripts/race_rate_harness.py +0 -0
  199. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/secrets.py +0 -0
  200. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/self_update.py +0 -0
  201. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/setup_clients.py +0 -0
  202. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/supervisor.py +0 -0
  203. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/up.py +0 -0
  204. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/upload.py +0 -0
  205. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/dependency_links.txt +0 -0
  206. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/entry_points.txt +0 -0
  207. {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/requires.txt +0 -0
  208. {meshcode-2.11.87 → meshcode-2.11.90}/setup.cfg +0 -0
  209. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_auto_update_hardening.py +0 -0
  210. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_closegap_1.py +0 -0
  211. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_closegap_2.py +0 -0
  212. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_closegap_3.py +0 -0
  213. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_prompt_inject.py +0 -0
  214. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_boot_bug_regression.py +0 -0
  215. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_color_truecolor.py +0 -0
  216. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_core.py +0 -0
  217. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_cross_agent_messaging.py +0 -0
  218. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_date_parse.py +0 -0
  219. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_doctor.py +0 -0
  220. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_epistemic_v1_python_sdk.py +0 -0
  221. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  222. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_esc_deaf_state.py +0 -0
  223. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_exceptions.py +0 -0
  224. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_file_upload.py +0 -0
  225. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_init_device_code.py +0 -0
  226. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_install_guard.py +0 -0
  227. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_lease_sigterm_release.py +0 -0
  228. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_mark_read_batch.py +0 -0
  229. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_marketplace_ratings.py +0 -0
  230. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_migration_integrity.py +0 -0
  231. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_realtime_event_freshness.py +0 -0
  232. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_rls_cross_tenant.py +0 -0
  233. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_rpc_grants.py +0 -0
  234. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_rpc_migrations.py +0 -0
  235. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_run_agent_dry_run.py +0 -0
  236. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_run_agent_no_server_import.py +0 -0
  237. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_security_regressions.py +0 -0
  238. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_self_update_user_site.py +0 -0
  239. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_sentinel.py +0 -0
  240. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_setup_path.py +0 -0
  241. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_sleep_signals.py +0 -0
  242. {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_status_enum_coverage.py +0 -0
  243. {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_stay_on_loop_hook.py +0 -0
  244. {meshcode-2.11.87 → meshcode-2.11.90}/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.87
3
+ Version: 2.11.90
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.87"
2
+ __version__ = "2.11.90"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -45,6 +45,65 @@ import uuid
45
45
  from pathlib import Path
46
46
  from typing import Optional
47
47
 
48
+ # COMMANDER-LIFECYCLE-ALWAYS-WORKS (task ca947d7f): the version of the code THIS hostd
49
+ # process is executing, captured at import. A long-running hostd keeps this in memory, so a
50
+ # bg pip update (new SDK) does NOT land daemon-side fixes (e.g. the Stop kill sweep _do_stops,
51
+ # task 35bee961) until the PROCESS restarts — which is why Samuel's qa sat 'stopping' for ~1h.
52
+ # We compare this against the on-disk installed version each sweep and self-reexec on drift.
53
+ try:
54
+ from meshcode import __version__ as _RUNNING_VERSION
55
+ except Exception:
56
+ _RUNNING_VERSION = "0.0.0"
57
+ _LAST_UPDATE_KICK_MONO = 0.0
58
+
59
+
60
+ def _maybe_self_restart_on_version_drift() -> None:
61
+ """Keep a running hostd CURRENT so Stop/launch always work (task ca947d7f).
62
+
63
+ (a) periodically kicks the detached, TTL-guarded bg updater so even a host with no
64
+ agent launches still pulls new wheels onto disk;
65
+ (b) when the ON-DISK installed version is newer than the code we're running, os.execv-
66
+ restarts at this safe sweep boundary (no spawn in flight; hostd_state.json incl.
67
+ headless_pids is persisted and survives the re-exec, so in-flight stop targets aren't
68
+ lost). After re-exec, running == on-disk -> no re-exec loop.
69
+ Opt out with MESHCODE_HOSTD_NO_AUTORESTART=1.
70
+ """
71
+ global _LAST_UPDATE_KICK_MONO
72
+ if os.environ.get("MESHCODE_HOSTD_NO_AUTORESTART", "").lower() in ("1", "true", "yes"):
73
+ return
74
+ now = time.monotonic()
75
+ if now - _LAST_UPDATE_KICK_MONO >= 1800: # at most every 30min
76
+ _LAST_UPDATE_KICK_MONO = now
77
+ try:
78
+ from meshcode import self_update as _su
79
+ _su.check_and_maybe_update() # non-blocking, detached, TTL-guarded internally
80
+ except Exception:
81
+ pass
82
+ try:
83
+ import importlib.metadata as _ilmd
84
+ ondisk = _ilmd.version("meshcode") # reads dist-info METADATA on disk (pip-updated)
85
+ except Exception:
86
+ return
87
+ try:
88
+ from meshcode import self_update as _su
89
+ newer = _su._is_newer(ondisk, _RUNNING_VERSION)
90
+ except Exception:
91
+ def _vt(v):
92
+ return tuple(int(x) for x in v.split(".") if x.isdigit())
93
+ try:
94
+ newer = _vt(ondisk) > _vt(_RUNNING_VERSION)
95
+ except Exception:
96
+ newer = False
97
+ if not newer:
98
+ return
99
+ _log(f"VERSION DRIFT: running {_RUNNING_VERSION}, on-disk {ondisk} -> self-reexec to load "
100
+ f"new code (Stop kill sweep + daemon fixes). headless_pids persisted; KeepAlive re-attaches.")
101
+ try:
102
+ os.execv(sys.executable, [sys.executable, "-m", "meshcode"] + sys.argv[1:])
103
+ except Exception as e:
104
+ _log(f"WARN: self-reexec failed ({e}); exiting so the supervisor restarts us")
105
+ os._exit(0)
106
+
48
107
  STATE_DIR = Path.home() / ".meshcode"
49
108
  HOST_ID_PATH = STATE_DIR / "host_id"
50
109
  LOG_PATH = STATE_DIR / "hostd.log"
@@ -822,28 +881,58 @@ def _hostd_bootstrap_if_needed(ttl_sec: int = 3600, verbose: bool = False) -> bo
822
881
  return ok
823
882
 
824
883
 
884
+ def _running_daemon_is_stale() -> bool:
885
+ """ca947d7f: True ONLY if hostd_state.json records a running_version that is STRICTLY older
886
+ than the on-disk installed version. Absent / unknown / equal / newer -> False (FAIL-SAFE:
887
+ never bounce a healthy or ambiguous daemon on the login-critical path — commander's safety
888
+ condition). NOTE: a daemon predating the running_version stamp (<2.11.90) wrote no marker, so
889
+ this returns False for it — that one-time transition still needs a manual restart; this guards
890
+ FUTURE transitions as defense-in-depth (the daemon's own self-reexec is the primary path)."""
891
+ try:
892
+ rv = (_load_state() or {}).get("running_version")
893
+ if not rv:
894
+ return False
895
+ import importlib.metadata as _ilmd
896
+ ondisk = _ilmd.version("meshcode")
897
+ from meshcode import self_update as _su
898
+ return bool(_su._is_newer(ondisk, rv))
899
+ except Exception:
900
+ return False
901
+
902
+
825
903
  def _hostd_bootstrap(verbose: bool = False) -> bool:
826
904
  """Idempotent auto-install + start of hostd (task f12b9d36) — called from `meshcode login`
827
905
  so onboarding is just `pip install meshcode` + `meshcode login` (no manual `hostd install`).
828
- If the OS job already exists, just ensure it's running (don't bounce a live daemon); else
829
- install + start. Best-effort: NEVER raises login must not fail on a bootstrap hiccup."""
906
+ If the OS job already exists, just ensure it's running (don't bounce a live daemon) UNLESS the
907
+ running daemon is provably STALE (ca947d7f), in which case force-restart it so Stop's kill
908
+ sweep + launch fixes land. Best-effort: NEVER raises — login must not fail on a hiccup."""
830
909
  import platform
831
910
  try:
911
+ force = _running_daemon_is_stale() # bounce ONLY a provably-stale daemon
912
+ if force:
913
+ _log(f"hostd bootstrap: running daemon is STALE vs on-disk -> force-restart")
832
914
  sysname = platform.system()
833
915
  if sysname == "Darwin":
834
916
  if not _hostd_plist_path().exists():
835
917
  _hostd_install() # writes plist + launchctl load
836
918
  try:
837
919
  uid = str(os.getuid())
838
- subprocess.run(["launchctl", "kickstart", f"gui/{uid}/{_HOSTD_PLIST_LABEL}"],
839
- capture_output=True, text=True) # start if not already running
920
+ # `kickstart -k` restarts a running job; plain `kickstart` only starts if down.
921
+ args = ["launchctl", "kickstart", f"gui/{uid}/{_HOSTD_PLIST_LABEL}"]
922
+ if force:
923
+ args.insert(2, "-k")
924
+ subprocess.run(args, capture_output=True, text=True)
840
925
  except Exception:
841
926
  pass
842
927
  elif sysname == "Windows":
843
928
  q = subprocess.run(["schtasks", "/Query", "/TN", _HOSTD_TASK_NAME],
844
929
  capture_output=True, text=True)
845
930
  if q.returncode == 0:
846
- # task exists -> just ensure running (IgnoreNew => harmless if already up; no double-spawn)
931
+ if force:
932
+ # stale -> stop the running instance, then start fresh on the new wheel.
933
+ subprocess.run(["schtasks", "/End", "/TN", _HOSTD_TASK_NAME],
934
+ capture_output=True, text=True)
935
+ # task exists -> ensure running (IgnoreNew => harmless if already up; no double-spawn)
847
936
  subprocess.run(["schtasks", "/Run", "/TN", _HOSTD_TASK_NAME],
848
937
  capture_output=True, text=True)
849
938
  else:
@@ -851,6 +940,10 @@ def _hostd_bootstrap(verbose: bool = False) -> bool:
851
940
  _hostd_install_windows()
852
941
  else: # Linux + others
853
942
  if shutil.which("systemctl"):
943
+ if force:
944
+ subprocess.run(["systemctl", "--user", "restart", _HOSTD_SYSTEMD_UNIT],
945
+ capture_output=True, text=True)
946
+ return True
854
947
  act = subprocess.run(["systemctl", "--user", "is-active", _HOSTD_SYSTEMD_UNIT],
855
948
  capture_output=True, text=True)
856
949
  if act.stdout.strip() == "active":
@@ -965,7 +1058,14 @@ def cmd_hostd(args: list) -> int:
965
1058
  _log(f"registered host {host_id} in mc_host_config")
966
1059
  else:
967
1060
  _log(f"WARN: host registration failed (dashboard may not list this host): {_reg}")
968
- _log(f"hostd starting — host_id={host_id} interval={POLL_INTERVAL_SEC}s stale={STALE_SECONDS}s")
1061
+ _log(f"hostd starting — host_id={host_id} interval={POLL_INTERVAL_SEC}s stale={STALE_SECONDS}s v{_RUNNING_VERSION}")
1062
+ # ca947d7f: stamp the version THIS daemon is running into hostd_state.json so
1063
+ # `meshcode login` (_hostd_bootstrap) can detect a STALE running daemon and force-
1064
+ # restart it (the one-time transition onto a self-reexec-capable build). Best-effort.
1065
+ try:
1066
+ _st = _load_state(); _st["running_version"] = _RUNNING_VERSION; _save_state(_st)
1067
+ except Exception:
1068
+ pass
969
1069
  # uptime-since-spawn (core's suggestion): if the daemon dies <2min, the last alive log +
970
1070
  # the uptime stamped on the FATAL line reveal the <2min pattern for RC.
971
1071
  _spawn_mono = time.monotonic()
@@ -980,6 +1080,10 @@ def cmd_hostd(args: list) -> int:
980
1080
  _rpc("mc_host_heartbeat", {"p_api_key": api_key, "p_host_id": host_id})
981
1081
  except Exception:
982
1082
  pass
1083
+ # ca947d7f: keep this daemon CURRENT — if a newer SDK is on disk,
1084
+ # re-exec NOW (before doing work) so Stop's kill sweep + launch fixes
1085
+ # always run on a stale-running host without manual intervention.
1086
+ _maybe_self_restart_on_version_drift()
983
1087
  relaunched = _do_respawns(api_key, host_id)
984
1088
  recycled = _do_recycles(api_key, host_id)
985
1089
  ver_recycled = _do_version_recycles(api_key, host_id)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.87
3
+ Version: 2.11.90
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -0,0 +1,89 @@
1
+ README.md
2
+ pyproject.toml
3
+ meshcode/__init__.py
4
+ meshcode/__main__.py
5
+ meshcode/_session_handoff_template.py
6
+ meshcode/_stop_hook_template.py
7
+ meshcode/ascii_art.py
8
+ meshcode/atomic_push.py
9
+ meshcode/claude_update.py
10
+ meshcode/cli.py
11
+ meshcode/comms_v4.py
12
+ meshcode/compat.py
13
+ meshcode/daemon.py
14
+ meshcode/date_parse.py
15
+ meshcode/doctor.py
16
+ meshcode/error_hints.py
17
+ meshcode/exceptions.py
18
+ meshcode/hostd.py
19
+ meshcode/invites.py
20
+ meshcode/launcher.py
21
+ meshcode/launcher_install.py
22
+ meshcode/preferences.py
23
+ meshcode/protocol_handler.py
24
+ meshcode/protocol_v2.py
25
+ meshcode/quickstart.py
26
+ meshcode/rpc_allowlist.py
27
+ meshcode/run_agent.py
28
+ meshcode/secrets.py
29
+ meshcode/self_update.py
30
+ meshcode/setup_clients.py
31
+ meshcode/supervisor.py
32
+ meshcode/up.py
33
+ meshcode/upload.py
34
+ meshcode.egg-info/PKG-INFO
35
+ meshcode.egg-info/SOURCES.txt
36
+ meshcode.egg-info/dependency_links.txt
37
+ meshcode.egg-info/entry_points.txt
38
+ meshcode.egg-info/requires.txt
39
+ meshcode.egg-info/top_level.txt
40
+ meshcode/meshcode_mcp/__init__.py
41
+ meshcode/meshcode_mcp/__main__.py
42
+ meshcode/meshcode_mcp/backend.py
43
+ meshcode/meshcode_mcp/realtime.py
44
+ meshcode/meshcode_mcp/server.py
45
+ meshcode/meshcode_mcp/sleep_signals.py
46
+ meshcode/meshcode_mcp/test_backend.py
47
+ meshcode/meshcode_mcp/test_boot_timing.py
48
+ meshcode/meshcode_mcp/test_install_guard.py
49
+ meshcode/meshcode_mcp/test_prefs_claude_version.py
50
+ meshcode/meshcode_mcp/test_realtime.py
51
+ meshcode/meshcode_mcp/test_server_wrapper.py
52
+ meshcode/scripts/check_secrets.py
53
+ meshcode/scripts/race_rate_harness.py
54
+ tests/test_auto_update_hardening.py
55
+ tests/test_autonomous_closegap_1.py
56
+ tests/test_autonomous_closegap_2.py
57
+ tests/test_autonomous_closegap_3.py
58
+ tests/test_autonomous_prompt_inject.py
59
+ tests/test_boot_bug_regression.py
60
+ tests/test_color_truecolor.py
61
+ tests/test_core.py
62
+ tests/test_cross_agent_messaging.py
63
+ tests/test_date_parse.py
64
+ tests/test_doctor.py
65
+ tests/test_epistemic_v1_python_sdk.py
66
+ tests/test_epistemic_v1_stop_conditions.py
67
+ tests/test_esc_deaf_state.py
68
+ tests/test_exceptions.py
69
+ tests/test_file_upload.py
70
+ tests/test_init_device_code.py
71
+ tests/test_install_guard.py
72
+ tests/test_lease_sigterm_release.py
73
+ tests/test_mark_read_batch.py
74
+ tests/test_marketplace_ratings.py
75
+ tests/test_migration_integrity.py
76
+ tests/test_realtime_event_freshness.py
77
+ tests/test_rls_cross_tenant.py
78
+ tests/test_rpc_grants.py
79
+ tests/test_rpc_migrations.py
80
+ tests/test_run_agent_dry_run.py
81
+ tests/test_run_agent_no_server_import.py
82
+ tests/test_security_regressions.py
83
+ tests/test_self_update_user_site.py
84
+ tests/test_sentinel.py
85
+ tests/test_setup_path.py
86
+ tests/test_sleep_signals.py
87
+ tests/test_status_enum_coverage.py
88
+ tests/test_stay_on_loop_hook.py
89
+ tests/test_wait_open_tasks_contradiction.py
@@ -0,0 +1 @@
1
+ meshcode
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meshcode"
7
- version = "2.11.87"
7
+ version = "2.11.90"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}