meshcode 2.11.58__tar.gz → 2.11.60__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.58 → meshcode-2.11.60}/PKG-INFO +1 -1
  2. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/hostd.py +154 -2
  4. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.58 → meshcode-2.11.60}/pyproject.toml +1 -1
  6. {meshcode-2.11.58 → meshcode-2.11.60}/README.md +0 -0
  7. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/_stop_hook_template.py +0 -0
  9. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/ascii_art.py +0 -0
  10. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/atomic_push.py +0 -0
  11. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/claude_update.py +0 -0
  12. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/cli.py +0 -0
  13. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/comms_v4.py +0 -0
  14. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/compat.py +0 -0
  15. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/daemon.py +0 -0
  16. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/date_parse.py +0 -0
  17. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/doctor.py +0 -0
  18. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/error_hints.py +0 -0
  19. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/exceptions.py +0 -0
  20. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/invites.py +0 -0
  21. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/launcher.py +0 -0
  22. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/launcher_install.py +0 -0
  23. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/__init__.py +0 -0
  24. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/__main__.py +0 -0
  25. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/backend.py +0 -0
  26. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/realtime.py +0 -0
  27. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/server.py +0 -0
  28. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  29. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_backend.py +0 -0
  30. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  31. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  32. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  33. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  34. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  35. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/preferences.py +0 -0
  36. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/protocol_handler.py +0 -0
  37. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/protocol_v2.py +0 -0
  38. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/quickstart.py +0 -0
  39. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/rpc_allowlist.py +0 -0
  40. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/run_agent.py +0 -0
  41. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/scripts/check_secrets.py +0 -0
  42. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/scripts/race_rate_harness.py +0 -0
  43. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/secrets.py +0 -0
  44. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/self_update.py +0 -0
  45. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/setup_clients.py +0 -0
  46. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/supervisor.py +0 -0
  47. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/upload.py +0 -0
  48. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/comms_v4.py +0 -0
  49. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/__init__.py +0 -0
  50. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
  51. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/cli.py +0 -0
  52. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
  53. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/compat.py +0 -0
  54. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
  55. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
  56. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/invites.py +0 -0
  57. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/launcher.py +0 -0
  58. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
  59. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  60. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  61. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
  62. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  63. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
  64. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  65. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  66. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  67. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/preferences.py +0 -0
  68. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
  69. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
  70. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
  71. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/secrets.py +0 -0
  72. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/self_update.py +0 -0
  73. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
  74. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
  75. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/upload.py +0 -0
  76. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/scripts/sentinel.py +0 -0
  77. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_core.py +0 -0
  78. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
  79. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
  80. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
  81. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
  82. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
  83. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
  84. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
  85. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
  86. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
  87. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
  88. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
  89. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
  90. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
  91. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
  92. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
  93. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
  94. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
  95. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
  96. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
  97. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
  98. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
  99. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
  100. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
  101. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
  102. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
  103. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
  104. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
  105. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
  106. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  107. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
  108. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
  109. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
  110. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
  111. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
  112. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
  113. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
  114. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
  115. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
  116. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/comms_v4.py +0 -0
  117. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/__init__.py +0 -0
  118. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
  119. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/cli.py +0 -0
  120. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
  121. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/compat.py +0 -0
  122. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
  123. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
  124. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/invites.py +0 -0
  125. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/launcher.py +0 -0
  126. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
  127. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  128. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  129. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
  130. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  131. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
  132. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  133. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  134. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  135. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/preferences.py +0 -0
  136. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
  137. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
  138. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
  139. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/secrets.py +0 -0
  140. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/self_update.py +0 -0
  141. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
  142. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
  143. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/upload.py +0 -0
  144. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/scripts/sentinel.py +0 -0
  145. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_core.py +0 -0
  146. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
  147. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
  148. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
  149. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
  150. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
  151. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
  152. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
  153. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
  154. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
  155. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
  156. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
  157. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/comms_v4.py +0 -0
  158. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
  159. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
  160. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/cli.py +0 -0
  161. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
  162. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/compat.py +0 -0
  163. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
  164. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
  165. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/invites.py +0 -0
  166. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
  167. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
  168. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
  169. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
  170. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
  171. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
  172. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
  173. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
  174. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
  175. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  176. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
  177. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
  178. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
  179. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
  180. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
  181. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
  182. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
  183. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
  184. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/upload.py +0 -0
  185. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
  186. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_core.py +0 -0
  187. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
  188. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
  189. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
  190. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
  191. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
  192. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
  193. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
  194. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
  195. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
  196. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
  197. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
  198. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/SOURCES.txt +0 -0
  199. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/dependency_links.txt +0 -0
  200. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/entry_points.txt +0 -0
  201. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/requires.txt +0 -0
  202. {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/top_level.txt +0 -0
  203. {meshcode-2.11.58 → meshcode-2.11.60}/setup.cfg +0 -0
  204. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_auto_update_hardening.py +0 -0
  205. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_closegap_1.py +0 -0
  206. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_closegap_2.py +0 -0
  207. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_closegap_3.py +0 -0
  208. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_prompt_inject 2.py +0 -0
  209. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_prompt_inject.py +0 -0
  210. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_boot_bug_regression.py +0 -0
  211. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_color_truecolor.py +0 -0
  212. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_core.py +0 -0
  213. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_cross_agent_messaging.py +0 -0
  214. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_date_parse.py +0 -0
  215. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_doctor.py +0 -0
  216. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_epistemic_v1_python_sdk.py +0 -0
  217. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  218. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_esc_deaf_state.py +0 -0
  219. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_exceptions.py +0 -0
  220. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_file_upload.py +0 -0
  221. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_init_device_code.py +0 -0
  222. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_install_guard.py +0 -0
  223. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_lease_sigterm_release.py +0 -0
  224. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_mark_read_batch.py +0 -0
  225. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_marketplace_ratings.py +0 -0
  226. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_migration_integrity.py +0 -0
  227. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_realtime_event_freshness.py +0 -0
  228. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_rls_cross_tenant.py +0 -0
  229. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_rpc_grants.py +0 -0
  230. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_rpc_migrations.py +0 -0
  231. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_run_agent_dry_run.py +0 -0
  232. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_run_agent_no_server_import.py +0 -0
  233. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_security_regressions.py +0 -0
  234. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_self_update_user_site.py +0 -0
  235. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_sentinel.py +0 -0
  236. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_setup_path.py +0 -0
  237. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_sleep_signals.py +0 -0
  238. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_status_enum_coverage.py +0 -0
  239. {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_stay_on_loop_hook.py +0 -0
  240. {meshcode-2.11.58 → meshcode-2.11.60}/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.58
3
+ Version: 2.11.60
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.58"
2
+ __version__ = "2.11.60"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -193,6 +193,151 @@ def _do_respawns(api_key: str, host_id: str) -> int:
193
193
  return n
194
194
 
195
195
 
196
+ # ------------------------------------------------------------------
197
+ # Recycle — relaunch a managed agent at a TASK BOUNDARY when it exceeds
198
+ # its recycle policy. Uptime-recycle is daemon-driven (needs mig370's
199
+ # project_name in the roster). Context-recycle is agent-cooperative (the
200
+ # agent self-persists handoff + exits at a boundary; our respawn path then
201
+ # relaunches it). Recorded via mc_record_recycle — NEVER counted against
202
+ # the crash respawn cap.
203
+ # ------------------------------------------------------------------
204
+
205
+ _HOSTD_STATE_PATH = STATE_DIR / "hostd_state.json"
206
+
207
+
208
+ def _load_state() -> dict:
209
+ try:
210
+ if _HOSTD_STATE_PATH.exists():
211
+ return json.loads(_HOSTD_STATE_PATH.read_text(encoding="utf-8"))
212
+ except Exception:
213
+ pass
214
+ return {}
215
+
216
+
217
+ def _save_state(st: dict) -> None:
218
+ try:
219
+ STATE_DIR.mkdir(parents=True, exist_ok=True)
220
+ _HOSTD_STATE_PATH.write_text(json.dumps(st), encoding="utf-8")
221
+ except Exception:
222
+ pass
223
+
224
+
225
+ def _do_recycles(api_key: str, host_id: str) -> int:
226
+ """Uptime-based recycle at task boundary. Returns number recycled."""
227
+ cfg = _rpc("mc_host_config_get", {"p_api_key": api_key, "p_host_id": host_id})
228
+ if not cfg or not cfg.get("ok"):
229
+ return 0
230
+ pol = _rpc("mc_host_recycle_policy", {"p_api_key": api_key, "p_host_id": host_id})
231
+ mode = (pol or {}).get("recycle_mode")
232
+ value = (pol or {}).get("recycle_value")
233
+ if mode != "time" or not value:
234
+ return 0 # context-recycle is agent-cooperative; only time is daemon-driven
235
+ st = _load_state()
236
+ now = time.time()
237
+ n = 0
238
+ seen = set()
239
+ for a in cfg.get("agents", []):
240
+ if a.get("desired_state") != "running":
241
+ continue
242
+ proj, agent = a.get("project_name"), a.get("name")
243
+ if not proj or not agent:
244
+ continue
245
+ key = f"{a.get('project_id')}/{agent}"
246
+ seen.add(key)
247
+ first = st.get(key)
248
+ if first is None:
249
+ st[key] = now # start the uptime clock on first observation
250
+ continue
251
+ if (a.get("status") or "") in BUSY_STATUSES:
252
+ continue # task boundary only — never mid-task
253
+ if (now - first) >= float(value) * 3600.0:
254
+ _log(f"RECYCLE {proj}/{agent} (uptime {(now-first)/3600:.1f}h >= {value}h)")
255
+ if _spawn_agent(proj, agent):
256
+ _rpc("mc_record_recycle",
257
+ {"p_api_key": api_key, "p_project_id": a.get("project_id"), "p_agent_name": agent})
258
+ st[key] = now # reset clock after recycle
259
+ n += 1
260
+ # prune state for agents no longer managed on this host
261
+ for k in [k for k in st if k not in seen]:
262
+ st.pop(k, None)
263
+ _save_state(st)
264
+ return n
265
+
266
+
267
+ # ------------------------------------------------------------------
268
+ # launchd trigger-start (macOS) — extends supervisor.py pattern.
269
+ # The hostd daemon is NOT autostart-at-login: RunAtLoad=false. It is
270
+ # kicked off on demand (button -> meshcode:// -> `launchctl kickstart`)
271
+ # and KeepAlive keeps it alive while it runs. One job per host.
272
+ # ------------------------------------------------------------------
273
+
274
+ _HOSTD_PLIST_LABEL = "io.meshcode.hostd"
275
+
276
+
277
+ def _hostd_plist_path():
278
+ return Path.home() / "Library" / "LaunchAgents" / f"{_HOSTD_PLIST_LABEL}.plist"
279
+
280
+
281
+ def _hostd_plist_xml() -> str:
282
+ import shutil
283
+ mc = shutil.which("meshcode") or f"{sys.executable} -m meshcode"
284
+ args = (mc.split() + ["hostd", "run"]) if " -m " in mc else [mc, "hostd", "run"]
285
+ args_xml = "\n".join(f" <string>{a}</string>" for a in args)
286
+ logdir = STATE_DIR / "logs"
287
+ logdir.mkdir(parents=True, exist_ok=True)
288
+ return f"""<?xml version="1.0" encoding="UTF-8"?>
289
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
290
+ <plist version="1.0">
291
+ <dict>
292
+ <key>Label</key><string>{_HOSTD_PLIST_LABEL}</string>
293
+ <key>ProgramArguments</key>
294
+ <array>
295
+ {args_xml}
296
+ </array>
297
+ <key>RunAtLoad</key><false/>
298
+ <key>KeepAlive</key><true/>
299
+ <key>ThrottleInterval</key><integer>10</integer>
300
+ <key>StandardOutPath</key><string>{logdir / "hostd.stdout.log"}</string>
301
+ <key>StandardErrorPath</key><string>{logdir / "hostd.stderr.log"}</string>
302
+ <key>EnvironmentVariables</key>
303
+ <dict>
304
+ <key>PATH</key><string>/usr/local/bin:/usr/bin:/bin:{os.path.dirname(sys.executable)}</string>
305
+ <key>MESHCODE_NO_AUTO_UPDATE</key><string>1</string>
306
+ </dict>
307
+ </dict>
308
+ </plist>
309
+ """
310
+
311
+
312
+ def _hostd_install() -> int:
313
+ import platform
314
+ if platform.system() != "Darwin":
315
+ print("[hostd] launchd install is macOS only (Linux: use systemd --user; or run `meshcode hostd run` under your own supervisor).", file=sys.stderr)
316
+ return 2
317
+ plist = _hostd_plist_path()
318
+ plist.parent.mkdir(parents=True, exist_ok=True)
319
+ plist.write_text(_hostd_plist_xml(), encoding="utf-8")
320
+ subprocess.run(["launchctl", "unload", str(plist)], capture_output=True, text=True)
321
+ r = subprocess.run(["launchctl", "load", str(plist)], capture_output=True, text=True)
322
+ if r.returncode != 0:
323
+ print(f"[hostd] launchctl load failed: {r.stderr.strip()}", file=sys.stderr)
324
+ return 1
325
+ print(f"[hostd] installed (RunAtLoad=false, trigger-start). plist: {plist}")
326
+ print(f"[hostd] start now: launchctl kickstart gui/$(id -u)/{_HOSTD_PLIST_LABEL}")
327
+ return 0
328
+
329
+
330
+ def _hostd_uninstall() -> int:
331
+ plist = _hostd_plist_path()
332
+ if not plist.exists():
333
+ print("[hostd] not installed")
334
+ return 0
335
+ subprocess.run(["launchctl", "unload", str(plist)], capture_output=True, text=True)
336
+ plist.unlink(missing_ok=True)
337
+ print("[hostd] uninstalled")
338
+ return 0
339
+
340
+
196
341
  def cmd_hostd(args: list) -> int:
197
342
  """Entry point for `meshcode hostd ...`."""
198
343
  if not args or args[0] in ("-h", "--help"):
@@ -211,6 +356,12 @@ def cmd_hostd(args: list) -> int:
211
356
  print(json.dumps({"host_id": host_id, "needing_respawn": res}, indent=2))
212
357
  return 0
213
358
 
359
+ if sub == "install":
360
+ return _hostd_install()
361
+
362
+ if sub == "uninstall":
363
+ return _hostd_uninstall()
364
+
214
365
  if sub == "run":
215
366
  if not api_key:
216
367
  _log("FATAL: no api key — set MESHCODE_API_KEY")
@@ -219,8 +370,9 @@ def cmd_hostd(args: list) -> int:
219
370
  while True:
220
371
  try:
221
372
  relaunched = _do_respawns(api_key, host_id)
222
- if relaunched:
223
- _log(f"sweep done {relaunched} relaunched")
373
+ recycled = _do_recycles(api_key, host_id)
374
+ if relaunched or recycled:
375
+ _log(f"sweep done — {relaunched} respawned, {recycled} recycled")
224
376
  except Exception as e:
225
377
  _log(f"WARN: sweep error: {e}")
226
378
  time.sleep(POLL_INTERVAL_SEC)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.58
3
+ Version: 2.11.60
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.58"
7
+ version = "2.11.60"
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