meshcode 2.11.139__tar.gz → 2.11.140__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 (105) hide show
  1. {meshcode-2.11.139 → meshcode-2.11.140}/PKG-INFO +1 -1
  2. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode.egg-info/PKG-INFO +1 -1
  4. {meshcode-2.11.139 → meshcode-2.11.140}/pyproject.toml +1 -1
  5. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_terminal_lifecycle.py +35 -7
  6. {meshcode-2.11.139 → meshcode-2.11.140}/README.md +0 -0
  7. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/_session_handoff_template.py +0 -0
  9. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/_stop_hook_template.py +0 -0
  10. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/ascii_art.py +0 -0
  11. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/atomic_push.py +0 -0
  12. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/claude_update.py +0 -0
  13. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/cli.py +0 -0
  14. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/comms_v4.py +0 -0
  15. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/compat.py +0 -0
  16. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/daemon.py +0 -0
  17. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/date_parse.py +0 -0
  18. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/doctor.py +0 -0
  19. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/error_hints.py +0 -0
  20. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/exceptions.py +0 -0
  21. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/helper_visuals.py +0 -0
  22. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/hooks/__init__.py +0 -0
  23. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/hooks/repo_path_lock.py +0 -0
  24. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/hostd.py +0 -0
  25. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/invites.py +0 -0
  26. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/launcher.py +0 -0
  27. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/launcher_install.py +0 -0
  28. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/__init__.py +0 -0
  29. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/__main__.py +0 -0
  30. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/backend.py +0 -0
  31. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/realtime.py +0 -0
  32. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/server.py +0 -0
  33. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  34. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/swarm.py +0 -0
  35. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_backend.py +0 -0
  36. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  37. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  38. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  39. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  40. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  41. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/meshcode_mcp/test_swarm.py +0 -0
  42. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/preferences.py +0 -0
  43. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/protocol_handler.py +0 -0
  44. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/protocol_v2.py +0 -0
  45. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/quickstart.py +0 -0
  46. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/rpc_allowlist.py +0 -0
  47. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/run_agent.py +0 -0
  48. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/scripts/check_secrets.py +0 -0
  49. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/scripts/race_rate_harness.py +0 -0
  50. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/secrets.py +0 -0
  51. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/self_update.py +0 -0
  52. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/setup_clients.py +0 -0
  53. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/supervisor.py +0 -0
  54. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/up.py +0 -0
  55. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode/upload.py +0 -0
  56. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode.egg-info/SOURCES.txt +0 -0
  57. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode.egg-info/dependency_links.txt +0 -0
  58. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode.egg-info/entry_points.txt +0 -0
  59. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode.egg-info/requires.txt +0 -0
  60. {meshcode-2.11.139 → meshcode-2.11.140}/meshcode.egg-info/top_level.txt +0 -0
  61. {meshcode-2.11.139 → meshcode-2.11.140}/setup.cfg +0 -0
  62. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_auto_update_hardening.py +0 -0
  63. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_autonomous_closegap_1.py +0 -0
  64. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_autonomous_closegap_2.py +0 -0
  65. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_autonomous_closegap_3.py +0 -0
  66. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_autonomous_prompt_inject.py +0 -0
  67. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_boot_bug_regression.py +0 -0
  68. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_color_truecolor.py +0 -0
  69. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_core.py +0 -0
  70. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_cross_agent_messaging.py +0 -0
  71. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_date_parse.py +0 -0
  72. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_doctor.py +0 -0
  73. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_epistemic_v1_python_sdk.py +0 -0
  74. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  75. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_esc_deaf_state.py +0 -0
  76. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_exceptions.py +0 -0
  77. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_file_upload.py +0 -0
  78. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_helper_visuals.py +0 -0
  79. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_hostd_zombie_sessions.py +0 -0
  80. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_init_device_code.py +0 -0
  81. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_install_guard.py +0 -0
  82. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_lease_sigterm_release.py +0 -0
  83. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_live_mesh_guard.py +0 -0
  84. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_mark_read_batch.py +0 -0
  85. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_marketplace_ratings.py +0 -0
  86. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_migration_integrity.py +0 -0
  87. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_pretrust_claude.py +0 -0
  88. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_realtime_event_freshness.py +0 -0
  89. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_rls_cross_tenant.py +0 -0
  90. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_rpc_grants.py +0 -0
  91. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_rpc_migrations.py +0 -0
  92. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_run_agent_dry_run.py +0 -0
  93. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_run_agent_no_server_import.py +0 -0
  94. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_security_regressions.py +0 -0
  95. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_self_update_user_site.py +0 -0
  96. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_sentinel.py +0 -0
  97. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_session_replay_gate.py +0 -0
  98. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_setup_path.py +0 -0
  99. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_sleep_signals.py +0 -0
  100. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_status_enum_coverage.py +0 -0
  101. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_stay_on_loop_hook.py +0 -0
  102. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_stop_ghost_terminal.py +0 -0
  103. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_swarm_events.py +0 -0
  104. {meshcode-2.11.139 → meshcode-2.11.140}/tests/test_task_progress.py +0 -0
  105. {meshcode-2.11.139 → meshcode-2.11.140}/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.139
3
+ Version: 2.11.140
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.139"
2
+ __version__ = "2.11.140"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.139
3
+ Version: 2.11.140
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.139"
7
+ version = "2.11.140"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -23,24 +23,52 @@ import sys
23
23
  import types
24
24
  from pathlib import Path
25
25
 
26
+ import pytest
27
+
26
28
  sys.path.insert(0, str(Path(__file__).parent.parent))
27
29
 
28
30
  from meshcode import hostd, protocol_handler # noqa: E402
29
31
 
30
32
  REPO = Path(__file__).parent.parent
31
- MIG490 = REPO / "supabase" / "migrations" / "20260610_490_respawn_tombstone_exclusion.sql"
33
+ MIGRATIONS = REPO / "supabase" / "migrations"
34
+
35
+
36
+ def _latest_respawn_migration() -> Path:
37
+ """The current authoritative definition of mc_agents_needing_respawn.
38
+
39
+ The provisional mig490_respawn_tombstone_exclusion was dropped and
40
+ consolidated into main with final numbering (mesh-core de52240e, to avoid
41
+ double-apply at tag 2.11.130); today it lives in mig500. Resolve it by
42
+ filename order so the test follows future re-definitions instead of pinning
43
+ a path that the next consolidation will move again.
44
+ """
45
+ defs = [p for p in MIGRATIONS.glob("*.sql")
46
+ if "FUNCTION public.mc_agents_needing_respawn" in p.read_text(errors="replace")]
47
+ assert defs, "no migration defines mc_agents_needing_respawn"
48
+ return max(defs, key=lambda p: p.name)
32
49
 
33
50
 
34
51
  class TestGap1TombstoneLoop:
35
52
  def test_mig490_excludes_tombstoned_from_candidates(self):
36
- sql = MIG490.read_text(errors="replace")
37
- body = sql[sql.index("INTO v_rows"):sql.index("INTO v_tomb")]
38
- assert "disconnected_at IS NULL" in body, (
53
+ sql = _latest_respawn_migration().read_text(errors="replace")
54
+ # candidates must exclude ACTIVE tombstones (mig499 predicate: a tombstone
55
+ # counts only when the Disconnect is at/after the last spawn).
56
+ assert "disconnected_at IS NULL" in sql, (
39
57
  "respawn candidates must exclude tombstoned agents")
40
-
58
+ assert "disconnected_at < COALESCE(a.spawned_at" in sql, (
59
+ "exclusion must use the active-tombstone predicate (disconnect >= last spawn)")
60
+
61
+ @pytest.mark.xfail(reason=(
62
+ "REGRESSION (task 9e9a2953): the mig490->mig500 consolidation dropped the "
63
+ "'tombstoned' key from mc_agents_needing_respawn's return, so hostd's gap-1 "
64
+ "visible SKIP-respawn log never fires (silent skip = the original 2h bug). "
65
+ "Escalated to self-improve (owns the RPC) with the exact fix. Remove this "
66
+ "xfail once the 'tombstoned' surfacing is restored."), strict=False)
41
67
  def test_mig490_surfaces_tombstoned_list(self):
42
- sql = MIG490.read_text(errors="replace")
43
- assert "'tombstoned'" in sql and "disconnected_at IS NOT NULL" in sql
68
+ sql = _latest_respawn_migration().read_text(errors="replace")
69
+ assert "'tombstoned'" in sql and "disconnected_at IS NOT NULL" in sql, (
70
+ "mc_agents_needing_respawn must surface the tombstoned list so hostd logs "
71
+ "WHY a Disconnect-blocked agent will not respawn")
44
72
 
45
73
  def test_hostd_logs_tombstone_skip_visibly(self):
46
74
  import inspect
File without changes
File without changes
File without changes
File without changes