meshcode 2.11.86__tar.gz → 2.11.88__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.86 → meshcode-2.11.88}/PKG-INFO +1 -1
  2. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/_session_handoff_template.py +51 -0
  4. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/hostd.py +63 -0
  5. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/setup_clients.py +66 -1
  6. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/PKG-INFO +1 -1
  7. meshcode-2.11.88/meshcode.egg-info/SOURCES.txt +89 -0
  8. meshcode-2.11.88/meshcode.egg-info/top_level.txt +1 -0
  9. {meshcode-2.11.86 → meshcode-2.11.88}/pyproject.toml +1 -1
  10. meshcode-2.11.86/meshcode/ascii_art.py +0 -638
  11. meshcode-2.11.86/meshcode/cli.py +0 -42
  12. meshcode-2.11.86/meshcode/compat.py +0 -174
  13. meshcode-2.11.86/meshcode/error_hints.py +0 -74
  14. meshcode-2.11.86/meshcode/exceptions.py +0 -52
  15. meshcode-2.11.86/meshcode/invites.py +0 -406
  16. meshcode-2.11.86/meshcode/launcher.py +0 -353
  17. meshcode-2.11.86/meshcode/launcher_install.py +0 -414
  18. meshcode-2.11.86/meshcode/meshcode_mcp/__init__.py +0 -22
  19. meshcode-2.11.86/meshcode/meshcode_mcp/__main__.py +0 -62
  20. meshcode-2.11.86/meshcode/meshcode_mcp/test_backend.py +0 -86
  21. meshcode-2.11.86/meshcode/meshcode_mcp/test_realtime.py +0 -95
  22. meshcode-2.11.86/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  23. meshcode-2.11.86/meshcode/preferences.py +0 -260
  24. meshcode-2.11.86/meshcode/protocol_v2.py +0 -129
  25. meshcode-2.11.86/meshcode/secrets.py +0 -365
  26. meshcode-2.11.86/meshcode/supervisor.py +0 -186
  27. meshcode-2.11.86/meshcode/upload.py +0 -125
  28. meshcode-2.11.86/meshcode-backend-wt/comms_v4.py +0 -1941
  29. meshcode-2.11.86/meshcode-backend-wt/meshcode/__init__.py +0 -82
  30. meshcode-2.11.86/meshcode-backend-wt/meshcode/comms_v4.py +0 -3563
  31. meshcode-2.11.86/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -1261
  32. meshcode-2.11.86/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -460
  33. meshcode-2.11.86/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -4117
  34. meshcode-2.11.86/meshcode-backend-wt/meshcode/quickstart.py +0 -148
  35. meshcode-2.11.86/meshcode-backend-wt/meshcode/run_agent.py +0 -958
  36. meshcode-2.11.86/meshcode-backend-wt/meshcode/self_update.py +0 -345
  37. meshcode-2.11.86/meshcode-backend-wt/meshcode/setup_clients.py +0 -926
  38. meshcode-2.11.86/meshcode-backend-wt/scripts/sentinel.py +0 -257
  39. meshcode-2.11.86/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -387
  40. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -82
  41. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -638
  42. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -42
  43. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -3563
  44. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -174
  45. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -74
  46. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -52
  47. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -406
  48. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -353
  49. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -414
  50. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -22
  51. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -62
  52. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -1261
  53. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -460
  54. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -4117
  55. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -86
  56. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -95
  57. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  58. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -260
  59. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -129
  60. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -148
  61. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -958
  62. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -365
  63. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -345
  64. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -926
  65. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -186
  66. meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -125
  67. meshcode-2.11.86/meshcode-noun-wt/comms_v4.py +0 -1941
  68. meshcode-2.11.86/meshcode-noun-wt/meshcode/__init__.py +0 -82
  69. meshcode-2.11.86/meshcode-noun-wt/meshcode/ascii_art.py +0 -638
  70. meshcode-2.11.86/meshcode-noun-wt/meshcode/cli.py +0 -42
  71. meshcode-2.11.86/meshcode-noun-wt/meshcode/comms_v4.py +0 -3563
  72. meshcode-2.11.86/meshcode-noun-wt/meshcode/compat.py +0 -174
  73. meshcode-2.11.86/meshcode-noun-wt/meshcode/error_hints.py +0 -74
  74. meshcode-2.11.86/meshcode-noun-wt/meshcode/exceptions.py +0 -52
  75. meshcode-2.11.86/meshcode-noun-wt/meshcode/invites.py +0 -406
  76. meshcode-2.11.86/meshcode-noun-wt/meshcode/launcher.py +0 -353
  77. meshcode-2.11.86/meshcode-noun-wt/meshcode/launcher_install.py +0 -414
  78. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -22
  79. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -62
  80. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -1261
  81. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -460
  82. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -4117
  83. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
  84. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
  85. meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  86. meshcode-2.11.86/meshcode-noun-wt/meshcode/preferences.py +0 -260
  87. meshcode-2.11.86/meshcode-noun-wt/meshcode/protocol_v2.py +0 -129
  88. meshcode-2.11.86/meshcode-noun-wt/meshcode/quickstart.py +0 -148
  89. meshcode-2.11.86/meshcode-noun-wt/meshcode/run_agent.py +0 -958
  90. meshcode-2.11.86/meshcode-noun-wt/meshcode/secrets.py +0 -365
  91. meshcode-2.11.86/meshcode-noun-wt/meshcode/self_update.py +0 -345
  92. meshcode-2.11.86/meshcode-noun-wt/meshcode/setup_clients.py +0 -926
  93. meshcode-2.11.86/meshcode-noun-wt/meshcode/supervisor.py +0 -186
  94. meshcode-2.11.86/meshcode-noun-wt/meshcode/upload.py +0 -125
  95. meshcode-2.11.86/meshcode-noun-wt/scripts/sentinel.py +0 -257
  96. meshcode-2.11.86/meshcode-noun-wt/tests/test_core.py +0 -216
  97. meshcode-2.11.86/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -366
  98. meshcode-2.11.86/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -361
  99. meshcode-2.11.86/meshcode-noun-wt/tests/test_exceptions.py +0 -107
  100. meshcode-2.11.86/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -200
  101. meshcode-2.11.86/meshcode-noun-wt/tests/test_migration_integrity.py +0 -176
  102. meshcode-2.11.86/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -236
  103. meshcode-2.11.86/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -255
  104. meshcode-2.11.86/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -387
  105. meshcode-2.11.86/meshcode-noun-wt/tests/test_security_regressions.py +0 -171
  106. meshcode-2.11.86/meshcode-noun-wt/tests/test_sentinel.py +0 -148
  107. meshcode-2.11.86/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -231
  108. meshcode-2.11.86/meshcode-tasks-wt/comms_v4.py +0 -1941
  109. meshcode-2.11.86/meshcode-tasks-wt/meshcode/__init__.py +0 -82
  110. meshcode-2.11.86/meshcode-tasks-wt/meshcode/ascii_art.py +0 -638
  111. meshcode-2.11.86/meshcode-tasks-wt/meshcode/cli.py +0 -42
  112. meshcode-2.11.86/meshcode-tasks-wt/meshcode/comms_v4.py +0 -3563
  113. meshcode-2.11.86/meshcode-tasks-wt/meshcode/compat.py +0 -174
  114. meshcode-2.11.86/meshcode-tasks-wt/meshcode/error_hints.py +0 -74
  115. meshcode-2.11.86/meshcode-tasks-wt/meshcode/exceptions.py +0 -52
  116. meshcode-2.11.86/meshcode-tasks-wt/meshcode/invites.py +0 -406
  117. meshcode-2.11.86/meshcode-tasks-wt/meshcode/launcher.py +0 -353
  118. meshcode-2.11.86/meshcode-tasks-wt/meshcode/launcher_install.py +0 -414
  119. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -22
  120. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -62
  121. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -1261
  122. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -460
  123. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -4117
  124. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
  125. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
  126. meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
  127. meshcode-2.11.86/meshcode-tasks-wt/meshcode/preferences.py +0 -260
  128. meshcode-2.11.86/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -129
  129. meshcode-2.11.86/meshcode-tasks-wt/meshcode/quickstart.py +0 -148
  130. meshcode-2.11.86/meshcode-tasks-wt/meshcode/run_agent.py +0 -958
  131. meshcode-2.11.86/meshcode-tasks-wt/meshcode/secrets.py +0 -365
  132. meshcode-2.11.86/meshcode-tasks-wt/meshcode/self_update.py +0 -345
  133. meshcode-2.11.86/meshcode-tasks-wt/meshcode/setup_clients.py +0 -926
  134. meshcode-2.11.86/meshcode-tasks-wt/meshcode/supervisor.py +0 -186
  135. meshcode-2.11.86/meshcode-tasks-wt/meshcode/upload.py +0 -125
  136. meshcode-2.11.86/meshcode-tasks-wt/scripts/sentinel.py +0 -257
  137. meshcode-2.11.86/meshcode-tasks-wt/tests/test_core.py +0 -216
  138. meshcode-2.11.86/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -366
  139. meshcode-2.11.86/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -361
  140. meshcode-2.11.86/meshcode-tasks-wt/tests/test_exceptions.py +0 -107
  141. meshcode-2.11.86/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -200
  142. meshcode-2.11.86/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -176
  143. meshcode-2.11.86/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -236
  144. meshcode-2.11.86/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -255
  145. meshcode-2.11.86/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -387
  146. meshcode-2.11.86/meshcode-tasks-wt/tests/test_security_regressions.py +0 -171
  147. meshcode-2.11.86/meshcode-tasks-wt/tests/test_sentinel.py +0 -148
  148. meshcode-2.11.86/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -231
  149. meshcode-2.11.86/meshcode.egg-info/SOURCES.txt +0 -240
  150. meshcode-2.11.86/meshcode.egg-info/top_level.txt +0 -4
  151. meshcode-2.11.86/tests/test_autonomous_prompt_inject 2.py +0 -126
  152. meshcode-2.11.86/tests/test_core.py +0 -216
  153. meshcode-2.11.86/tests/test_cross_agent_messaging.py +0 -366
  154. meshcode-2.11.86/tests/test_esc_deaf_state.py +0 -361
  155. meshcode-2.11.86/tests/test_exceptions.py +0 -107
  156. meshcode-2.11.86/tests/test_mark_read_batch.py +0 -200
  157. meshcode-2.11.86/tests/test_migration_integrity.py +0 -176
  158. meshcode-2.11.86/tests/test_realtime_event_freshness.py +0 -236
  159. meshcode-2.11.86/tests/test_rls_cross_tenant.py +0 -255
  160. meshcode-2.11.86/tests/test_security_regressions.py +0 -171
  161. meshcode-2.11.86/tests/test_sentinel.py +0 -148
  162. meshcode-2.11.86/tests/test_status_enum_coverage.py +0 -231
  163. {meshcode-2.11.86 → meshcode-2.11.88}/README.md +0 -0
  164. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/__main__.py +0 -0
  165. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/_stop_hook_template.py +0 -0
  166. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/ascii_art.py +0 -0
  167. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/atomic_push.py +0 -0
  168. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/claude_update.py +0 -0
  169. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/cli.py +0 -0
  170. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/comms_v4.py +0 -0
  171. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/compat.py +0 -0
  172. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/daemon.py +0 -0
  173. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/date_parse.py +0 -0
  174. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/doctor.py +0 -0
  175. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/error_hints.py +0 -0
  176. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/exceptions.py +0 -0
  177. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/invites.py +0 -0
  178. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/launcher.py +0 -0
  179. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/launcher_install.py +0 -0
  180. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/__init__.py +0 -0
  181. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/__main__.py +0 -0
  182. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/backend.py +0 -0
  183. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/realtime.py +0 -0
  184. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/server.py +0 -0
  185. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  186. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/test_backend.py +0 -0
  187. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  188. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  189. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  190. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  191. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  192. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/preferences.py +0 -0
  193. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/protocol_handler.py +0 -0
  194. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/protocol_v2.py +0 -0
  195. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/quickstart.py +0 -0
  196. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/rpc_allowlist.py +0 -0
  197. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/run_agent.py +0 -0
  198. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/scripts/check_secrets.py +0 -0
  199. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/scripts/race_rate_harness.py +0 -0
  200. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/secrets.py +0 -0
  201. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/self_update.py +0 -0
  202. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/supervisor.py +0 -0
  203. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/up.py +0 -0
  204. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/upload.py +0 -0
  205. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/dependency_links.txt +0 -0
  206. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/entry_points.txt +0 -0
  207. {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/requires.txt +0 -0
  208. {meshcode-2.11.86 → meshcode-2.11.88}/setup.cfg +0 -0
  209. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_auto_update_hardening.py +0 -0
  210. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_closegap_1.py +0 -0
  211. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_closegap_2.py +0 -0
  212. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_closegap_3.py +0 -0
  213. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_prompt_inject.py +0 -0
  214. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_boot_bug_regression.py +0 -0
  215. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_color_truecolor.py +0 -0
  216. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_core.py +0 -0
  217. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_cross_agent_messaging.py +0 -0
  218. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_date_parse.py +0 -0
  219. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_doctor.py +0 -0
  220. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_epistemic_v1_python_sdk.py +0 -0
  221. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  222. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_esc_deaf_state.py +0 -0
  223. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_exceptions.py +0 -0
  224. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_file_upload.py +0 -0
  225. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_init_device_code.py +0 -0
  226. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_install_guard.py +0 -0
  227. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_lease_sigterm_release.py +0 -0
  228. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_mark_read_batch.py +0 -0
  229. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_marketplace_ratings.py +0 -0
  230. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_migration_integrity.py +0 -0
  231. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_realtime_event_freshness.py +0 -0
  232. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_rls_cross_tenant.py +0 -0
  233. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_rpc_grants.py +0 -0
  234. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_rpc_migrations.py +0 -0
  235. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_run_agent_dry_run.py +0 -0
  236. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_run_agent_no_server_import.py +0 -0
  237. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_security_regressions.py +0 -0
  238. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_self_update_user_site.py +0 -0
  239. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_sentinel.py +0 -0
  240. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_setup_path.py +0 -0
  241. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_sleep_signals.py +0 -0
  242. {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_status_enum_coverage.py +0 -0
  243. {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_stay_on_loop_hook.py +0 -0
  244. {meshcode-2.11.86 → meshcode-2.11.88}/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.86
3
+ Version: 2.11.88
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.86"
2
+ __version__ = "2.11.88"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -113,6 +113,54 @@ def _extract_tail(transcript_path: str):
113
113
  return rows[-MAX_TURNS:]
114
114
 
115
115
 
116
+ def _request_recycle_if_marked(project_dir) -> None:
117
+ """CTX-CLOSE-RELAUNCH (task 400fc536): commander-tier sessions ask the
118
+ server to recycle (close+relaunch fresh) at the next task-edge, right after
119
+ the handoff is snapshotted. Gated by the scaffold-baked
120
+ .claude/meshcode_hook_ctx.json recycle_on_compact flag (commander-only v1).
121
+
122
+ Best-effort in every dimension: missing marker/flag, missing creds, import
123
+ failure, network error -> silently skip. handoff.json is already written, so
124
+ a context-recycle still relaunches WITH context; and the actual exit is the
125
+ server's call (mc_consume_recycle at a task boundary), never this hook.
126
+ """
127
+ try:
128
+ ctx_path = project_dir / ".claude" / "meshcode_hook_ctx.json"
129
+ if not ctx_path.exists():
130
+ return
131
+ if not json.loads(ctx_path.read_text(encoding="utf-8")).get("recycle_on_compact"):
132
+ return # non-commander -> in-place autocompact, no recycle
133
+ mcp = json.loads((project_dir / ".mcp.json").read_text(encoding="utf-8"))
134
+ env = (next(iter((mcp.get("mcpServers") or {}).values()), {}) or {}).get("env", {}) or {}
135
+ url = env.get("SUPABASE_URL"); key = env.get("SUPABASE_KEY")
136
+ pid = env.get("MESHCODE_PROJECT_ID"); agent = env.get("MESHCODE_AGENT")
137
+ if not (url and key and pid and agent):
138
+ return
139
+ api_key = os.environ.get("MESHCODE_API_KEY")
140
+ if not api_key:
141
+ try:
142
+ import importlib
143
+ api_key = importlib.import_module("meshcode.secrets").get_api_key(
144
+ profile=env.get("MESHCODE_KEYCHAIN_PROFILE") or "default")
145
+ except Exception:
146
+ api_key = None
147
+ if not api_key:
148
+ return
149
+ import urllib.request as _u
150
+ body = json.dumps({
151
+ "p_api_key": api_key, "p_project_id": pid,
152
+ "p_agent_name": agent, "p_allow_busy": True, # flag-now; exit deferred to wait-loop
153
+ }).encode("utf-8")
154
+ req = _u.Request(
155
+ url.rstrip("/") + "/rest/v1/rpc/mc_request_recycle",
156
+ data=body, method="POST",
157
+ headers={"apikey": key, "Authorization": "Bearer " + key,
158
+ "Content-Type": "application/json"})
159
+ _u.urlopen(req, timeout=5).read() # best-effort; ignore result per backend contract
160
+ except Exception as e: # noqa: BLE001 — never block compaction
161
+ sys.stderr.write(f"[session_handoff_write] recycle-request skipped: {e}\\n")
162
+
163
+
116
164
  def main() -> int:
117
165
  try:
118
166
  raw = sys.stdin.read()
@@ -137,6 +185,9 @@ def main() -> int:
137
185
  tmp.replace(d / "handoff.json")
138
186
  except OSError as e:
139
187
  sys.stderr.write(f"[session_handoff_write] skipped: {e}\\n")
188
+ # CTX-CLOSE-RELAUNCH (task 400fc536): now that the thread is snapshotted,
189
+ # commander-tier sessions ask the server to recycle at the next task-edge.
190
+ _request_recycle_if_marked(_project_dir())
140
191
  return 0
141
192
 
142
193
 
@@ -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"
@@ -980,6 +1039,10 @@ def cmd_hostd(args: list) -> int:
980
1039
  _rpc("mc_host_heartbeat", {"p_api_key": api_key, "p_host_id": host_id})
981
1040
  except Exception:
982
1041
  pass
1042
+ # ca947d7f: keep this daemon CURRENT — if a newer SDK is on disk,
1043
+ # re-exec NOW (before doing work) so Stop's kill sweep + launch fixes
1044
+ # always run on a stale-running host without manual intervention.
1045
+ _maybe_self_restart_on_version_drift()
983
1046
  relaunched = _do_respawns(api_key, host_id)
984
1047
  recycled = _do_recycles(api_key, host_id)
985
1048
  ver_recycled = _do_version_recycles(api_key, host_id)
@@ -288,6 +288,49 @@ def _stop_hook_command() -> str:
288
288
  return _hook_command("stay_on_loop.py")
289
289
 
290
290
 
291
+ # Mirror of server.py _LEADER_KEYWORDS / _is_leader_agent — the canonical
292
+ # agent-side commander/leader signal. Kept in sync intentionally (small, stable).
293
+ _LEADER_KEYWORDS = (
294
+ 'commander', 'lead', 'orchestrat', 'coordinator', 'coordinat',
295
+ 'coordinad', 'jefe', 'líder', 'lider', 'director', 'manager',
296
+ 'chief', 'captain', 'boss', 'head agent',
297
+ )
298
+
299
+
300
+ def _is_commander_role(name: str, role: str = "") -> bool:
301
+ """True if this agent is commander/leader tier (name+role keyword match).
302
+
303
+ CTX-CLOSE-RELAUNCH (task 400fc536): the PreCompact handoff hook self-requests
304
+ a context-recycle ONLY for commander-tier sessions (v1 = commander-only).
305
+ The hook subprocess cannot import server.py's _is_leader_agent (its module
306
+ globals aren't set there), so we BAKE this decision into the workspace at
307
+ scaffold time (commander directive) using the SAME heuristic the SDK already
308
+ uses everywhere for leader detection. This is a client-side BEHAVIOUR gate,
309
+ not authorization — the server's owner check in mc_request_recycle is the
310
+ real security boundary — so the name/role heuristic is safe here.
311
+ """
312
+ hay = ((name or "") + " " + (role or "")).lower()
313
+ return any(k in hay for k in _LEADER_KEYWORDS)
314
+
315
+
316
+ def _write_hook_ctx_marker(ws: Path, is_commander: bool, agent: str = "", project: str = "") -> None:
317
+ """Write .claude/meshcode_hook_ctx.json — the scaffold-baked signal the
318
+ PreCompact handoff hook reads to decide whether to self-request a
319
+ context-recycle (CTX-CLOSE-RELAUNCH). Best-effort."""
320
+ try:
321
+ (ws / ".claude").mkdir(parents=True, exist_ok=True)
322
+ (ws / ".claude" / "meshcode_hook_ctx.json").write_text(
323
+ json.dumps({
324
+ "recycle_on_compact": bool(is_commander),
325
+ "agent": agent,
326
+ "project": project,
327
+ }, indent=2) + "\n",
328
+ encoding="utf-8",
329
+ )
330
+ except Exception as _e: # noqa: BLE001 — never block scaffold on this marker
331
+ print(f"[meshcode] WARNING: could not write hook ctx marker: {_e}", file=sys.stderr)
332
+
333
+
291
334
  # The meshcode hooks (event -> hook-script filename). Each is matched in
292
335
  # settings.json by its script filename so the heal touches ONLY meshcode's own
293
336
  # hooks and never a user-added hook on the same event.
@@ -1487,6 +1530,10 @@ Call `meshcode_wait` now.
1487
1530
  except OSError:
1488
1531
  pass
1489
1532
  (ws / ".claude" / "settings.json").write_text(settings_body, encoding="utf-8")
1533
+ # CTX-CLOSE-RELAUNCH (task 400fc536): bake the commander-tier signal the
1534
+ # PreCompact handoff hook reads to decide whether to self-request a
1535
+ # context-recycle (commander-only v1).
1536
+ _write_hook_ctx_marker(ws, _is_commander_role(agent, role), agent=agent, project=project)
1490
1537
  except Exception as _e:
1491
1538
  print(f"[meshcode] WARNING: could not write /meshcode-wait command + hooks: {_e}", file=sys.stderr)
1492
1539
 
@@ -1749,7 +1796,25 @@ def patch_hooks(dry_run: bool = False) -> int:
1749
1796
  except Exception as e: # noqa: BLE001 — never let one ws abort the sweep
1750
1797
  settings_changed, settings_note = False, f"settings heal failed: {e}"
1751
1798
 
1752
- record = f"{ws.name} ({body_note}; {settings_note})"
1799
+ # CTX-CLOSE-RELAUNCH (task 400fc536): backfill the commander-tier marker
1800
+ # the PreCompact hook reads. Recompute is_commander from the workspace's
1801
+ # baked .mcp.json (MESHCODE_AGENT + MESHCODE_ROLE) so existing commanders
1802
+ # get the recycle trigger without a full re-scaffold.
1803
+ marker_note = "marker skipped"
1804
+ if not dry_run:
1805
+ try:
1806
+ mcp = json.loads((ws / ".mcp.json").read_text(encoding="utf-8"))
1807
+ env = (next(iter((mcp.get("mcpServers") or {}).values()), {}) or {}).get("env", {}) or {}
1808
+ _agent = env.get("MESHCODE_AGENT") or ws.name
1809
+ _role = env.get("MESHCODE_ROLE") or ""
1810
+ _write_hook_ctx_marker(ws, _is_commander_role(_agent, _role), agent=_agent, project=env.get("MESHCODE_PROJECT") or "")
1811
+ marker_note = "marker written"
1812
+ except Exception as e: # noqa: BLE001
1813
+ marker_note = f"marker skipped ({e})"
1814
+ else:
1815
+ marker_note = "marker would write"
1816
+
1817
+ record = f"{ws.name} ({body_note}; {settings_note}; {marker_note})"
1753
1818
  (patched if (body_changed or settings_changed) else skipped).append(record)
1754
1819
 
1755
1820
  verb = "would patch" if dry_run else "patched"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.86
3
+ Version: 2.11.88
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.86"
7
+ version = "2.11.88"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}