meshcode 2.11.141__tar.gz → 2.11.143__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.141 → meshcode-2.11.143}/PKG-INFO +1 -1
  2. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/backend.py +23 -0
  4. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/server.py +56 -16
  5. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/run_agent.py +10 -0
  6. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode.egg-info/PKG-INFO +1 -1
  7. {meshcode-2.11.141 → meshcode-2.11.143}/pyproject.toml +1 -1
  8. {meshcode-2.11.141 → meshcode-2.11.143}/README.md +0 -0
  9. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/__main__.py +0 -0
  10. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/_session_handoff_template.py +0 -0
  11. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/_stop_hook_template.py +0 -0
  12. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/ascii_art.py +0 -0
  13. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/atomic_push.py +0 -0
  14. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/claude_update.py +0 -0
  15. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/cli.py +0 -0
  16. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/comms_v4.py +0 -0
  17. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/compat.py +0 -0
  18. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/daemon.py +0 -0
  19. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/date_parse.py +0 -0
  20. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/doctor.py +0 -0
  21. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/error_hints.py +0 -0
  22. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/exceptions.py +0 -0
  23. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/helper_visuals.py +0 -0
  24. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/hooks/__init__.py +0 -0
  25. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/hooks/repo_path_lock.py +0 -0
  26. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/hostd.py +0 -0
  27. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/invites.py +0 -0
  28. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/launcher.py +0 -0
  29. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/launcher_install.py +0 -0
  30. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/__init__.py +0 -0
  31. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/__main__.py +0 -0
  32. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/realtime.py +0 -0
  33. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  34. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/swarm.py +0 -0
  35. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_backend.py +0 -0
  36. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  37. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  38. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  39. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  40. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  41. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/meshcode_mcp/test_swarm.py +0 -0
  42. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/preferences.py +0 -0
  43. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/protocol_handler.py +0 -0
  44. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/protocol_v2.py +0 -0
  45. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/quickstart.py +0 -0
  46. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/rpc_allowlist.py +0 -0
  47. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/scripts/check_secrets.py +0 -0
  48. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/scripts/race_rate_harness.py +0 -0
  49. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/secrets.py +0 -0
  50. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/self_update.py +0 -0
  51. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/setup_clients.py +0 -0
  52. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/supervisor.py +0 -0
  53. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/up.py +0 -0
  54. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode/upload.py +0 -0
  55. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode.egg-info/SOURCES.txt +0 -0
  56. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode.egg-info/dependency_links.txt +0 -0
  57. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode.egg-info/entry_points.txt +0 -0
  58. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode.egg-info/requires.txt +0 -0
  59. {meshcode-2.11.141 → meshcode-2.11.143}/meshcode.egg-info/top_level.txt +0 -0
  60. {meshcode-2.11.141 → meshcode-2.11.143}/setup.cfg +0 -0
  61. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_auto_update_hardening.py +0 -0
  62. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_autonomous_closegap_1.py +0 -0
  63. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_autonomous_closegap_2.py +0 -0
  64. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_autonomous_closegap_3.py +0 -0
  65. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_autonomous_prompt_inject.py +0 -0
  66. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_boot_bug_regression.py +0 -0
  67. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_color_truecolor.py +0 -0
  68. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_core.py +0 -0
  69. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_cross_agent_messaging.py +0 -0
  70. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_date_parse.py +0 -0
  71. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_doctor.py +0 -0
  72. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_epistemic_v1_python_sdk.py +0 -0
  73. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  74. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_esc_deaf_state.py +0 -0
  75. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_exceptions.py +0 -0
  76. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_file_upload.py +0 -0
  77. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_helper_visuals.py +0 -0
  78. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_hostd_zombie_sessions.py +0 -0
  79. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_init_device_code.py +0 -0
  80. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_install_guard.py +0 -0
  81. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_lease_sigterm_release.py +0 -0
  82. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_live_mesh_guard.py +0 -0
  83. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_mark_read_batch.py +0 -0
  84. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_marketplace_ratings.py +0 -0
  85. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_migration_integrity.py +0 -0
  86. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_pretrust_claude.py +0 -0
  87. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_realtime_event_freshness.py +0 -0
  88. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_rls_cross_tenant.py +0 -0
  89. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_rpc_grants.py +0 -0
  90. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_rpc_migrations.py +0 -0
  91. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_run_agent_dry_run.py +0 -0
  92. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_run_agent_no_server_import.py +0 -0
  93. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_security_regressions.py +0 -0
  94. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_self_update_user_site.py +0 -0
  95. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_sentinel.py +0 -0
  96. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_session_replay_gate.py +0 -0
  97. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_setup_path.py +0 -0
  98. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_sleep_signals.py +0 -0
  99. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_status_enum_coverage.py +0 -0
  100. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_stay_on_loop_hook.py +0 -0
  101. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_stop_ghost_terminal.py +0 -0
  102. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_swarm_events.py +0 -0
  103. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_task_progress.py +0 -0
  104. {meshcode-2.11.141 → meshcode-2.11.143}/tests/test_terminal_lifecycle.py +0 -0
  105. {meshcode-2.11.141 → meshcode-2.11.143}/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.141
3
+ Version: 2.11.143
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.141"
2
+ __version__ = "2.11.143"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -1297,6 +1297,29 @@ def set_status(project_id: str, agent: str, status: str, task: str = "", api_key
1297
1297
  return {"ok": True, "status": status}
1298
1298
 
1299
1299
 
1300
+ def loop_tick(api_key: str, project_id: str, agent: str,
1301
+ since_ts: Optional[str] = None, msg_limit: int = 20,
1302
+ task_limit: int = 10) -> Dict:
1303
+ """mc_agent_loop_tick: 1 RPC replaces count_pending + task_list + heartbeat.
1304
+
1305
+ Returns pending_count, new_messages_since, new_tasks_since, heartbeat_set
1306
+ in one round-trip. Falls back to None on any error so callers can use legacy.
1307
+ """
1308
+ params: Dict[str, Any] = {
1309
+ "p_api_key": api_key,
1310
+ "p_project_id": project_id,
1311
+ "p_agent": agent,
1312
+ "p_msg_limit": msg_limit,
1313
+ "p_task_limit": task_limit,
1314
+ }
1315
+ if since_ts:
1316
+ params["p_since_ts"] = since_ts
1317
+ result = sb_rpc("mc_agent_loop_tick", params)
1318
+ if isinstance(result, dict) and result.get("ok"):
1319
+ return result
1320
+ return {"ok": False, "error": result}
1321
+
1322
+
1300
1323
  def task_create(api_key, project_id, creator_agent, title, description="",
1301
1324
  assignee="*", priority="normal", parent_task_id=None,
1302
1325
  goal_id=None, strict=False,
@@ -3727,6 +3727,28 @@ def _wait_poll_or_legacy() -> Dict[str, Any]:
3727
3727
  }
3728
3728
 
3729
3729
 
3730
+ # ── LOOP TICK (mig 311): 1 RPC replaces task_list + count_pending + heartbeat ──
3731
+ _LAST_LOOP_TICK_TS: Optional[str] = None # ISO ts from server for incremental polling
3732
+
3733
+
3734
+ def _loop_tick() -> Optional[Dict[str, Any]]:
3735
+ """Call mc_agent_loop_tick: pending_count + messages + tasks + heartbeat in 1 RPC.
3736
+ Returns None on any error so callers fall back to legacy multi-RPC path."""
3737
+ global _LAST_LOOP_TICK_TS
3738
+ try:
3739
+ api_key = _get_api_key()
3740
+ if not api_key:
3741
+ return None
3742
+ result = be.loop_tick(api_key, _PROJECT_ID, AGENT_NAME,
3743
+ since_ts=_LAST_LOOP_TICK_TS)
3744
+ if isinstance(result, dict) and result.get("ok"):
3745
+ _LAST_LOOP_TICK_TS = result.get("server_now")
3746
+ return result
3747
+ except Exception as e:
3748
+ log.debug(f"[meshcode] mc_agent_loop_tick failed; legacy fallback: {e}")
3749
+ return None
3750
+
3751
+
3730
3752
  def _drain_unread_response(include_acks: bool,
3731
3753
  rpc_result: Optional[Dict[str, Any]] = None) -> Optional[Dict[str, Any]]:
3732
3754
  """SDK-EFF (task ab1f9f5a): read+mark unread DB messages and shape them as
@@ -4396,10 +4418,12 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
4396
4418
  # offline at create time" gap. Always-on, not gated on
4397
4419
  # autonomous_mode. Best-effort.
4398
4420
  try:
4399
- # SDK-EFF (task ab1f9f5a): ONE mc_task_list serves both the auto-claim
4400
- # sweep and the pending summary below they were identical back-to-back
4401
- # fetches. The post-claim snapshot stays valid for _pending_filter:
4402
- # a just-claimed task still matches on assignee==me with status 'open'.
4421
+ # LOOP-TICK (mig 311 adoption, task f81a5060): mc_agent_loop_tick
4422
+ # gives pending_count + heartbeat in 1 RPC (replaces count_pending).
4423
+ # task_list is kept for auto-claim sweep because new_tasks_since is
4424
+ # incremental and could miss older unclaimed tasks (commander review).
4425
+ _entry_tick = _loop_tick()
4426
+ _entry_tick_pending = _entry_tick.get("pending_count", 0) or 0 if _entry_tick else 0
4403
4427
  _entry_tasks_raw = None
4404
4428
  try:
4405
4429
  _tl = be.task_list(_get_api_key(), _PROJECT_ID, AGENT_NAME, status_filter=None)
@@ -4410,6 +4434,7 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
4410
4434
  _wait_entry_auto_claimed = _try_auto_claim_self_assigned_tasks(tasks=_entry_tasks_raw)
4411
4435
  except Exception:
4412
4436
  _wait_entry_auto_claimed = []
4437
+ _entry_tick_pending = 0
4413
4438
 
4414
4439
  pending_tasks = (_pending_filter(_entry_tasks_raw) if _entry_tasks_raw is not None
4415
4440
  else _get_pending_tasks_summary())
@@ -4447,13 +4472,14 @@ async def meshcode_wait(timeout_seconds: int = 20, include_acks: bool = False) -
4447
4472
  # ("te escribo y no sale palomita azul en nadie"). If there are unread messages,
4448
4473
  # skip task_pull and fall through to PRODUCT RULE 2 so they get delivered + marked
4449
4474
  # read first. Task-pull still fires normally when the inbox is empty.
4450
- # SDK-EFF (task ab1f9f5a): count once, share with PRODUCT RULE 2 below —
4451
- # the entry path was issuing the identical count_pending twice in a row.
4452
- _entry_db_pending = 0
4453
- try:
4454
- _entry_db_pending = be.count_pending(_PROJECT_ID, AGENT_NAME, api_key=_get_api_key()) or 0
4455
- except Exception:
4456
- _entry_db_pending = 0
4475
+ # LOOP-TICK: reuse pending_count from _loop_tick (already fetched above).
4476
+ # Falls back to count_pending RPC only if loop_tick didn't run.
4477
+ _entry_db_pending = _entry_tick_pending
4478
+ if not _entry_db_pending and not _entry_tick:
4479
+ try:
4480
+ _entry_db_pending = be.count_pending(_PROJECT_ID, AGENT_NAME, api_key=_get_api_key()) or 0
4481
+ except Exception:
4482
+ _entry_db_pending = 0
4457
4483
  _has_unread = bool(_entry_db_pending)
4458
4484
  if _tasks_to_start and not _is_leader_agent() and not _has_unread:
4459
4485
  # Auto-start the highest priority OPEN task so the agent sees it as
@@ -4952,6 +4978,8 @@ async def _meshcode_wait_inner(actual_timeout: int, include_acks: bool) -> Dict[
4952
4978
  else:
4953
4979
  # 2b) Realtime NOT subscribed — aggressive DB polling every 5s
4954
4980
  # so messages arrive within seconds, not after 120s timeout.
4981
+ # LOOP-TICK (task f81a5060): use mc_agent_loop_tick (1 RPC) instead
4982
+ # of count_pending + read_inbox (2 RPCs). Falls back to legacy on error.
4955
4983
  _poll_interval = 5
4956
4984
  _elapsed = 0
4957
4985
  while _elapsed < actual_timeout:
@@ -4962,10 +4990,18 @@ async def _meshcode_wait_inner(actual_timeout: int, include_acks: bool) -> Dict[
4962
4990
  return {"timed_out": True, "reason": "cancelled_by_client"}
4963
4991
  _elapsed += _poll_interval
4964
4992
  try:
4965
- api_key = _get_api_key()
4966
- if api_key:
4967
- db_pending = be.count_pending(_PROJECT_ID, AGENT_NAME, api_key=api_key)
4968
- if db_pending and db_pending > 0:
4993
+ _tick = _loop_tick()
4994
+ _has_pending = False
4995
+ if _tick:
4996
+ _has_pending = bool(_tick.get("pending_count", 0))
4997
+ else:
4998
+ # Fallback: legacy count_pending
4999
+ api_key = _get_api_key()
5000
+ if api_key:
5001
+ _has_pending = bool(be.count_pending(_PROJECT_ID, AGENT_NAME, api_key=api_key))
5002
+ if _has_pending:
5003
+ api_key = _get_api_key()
5004
+ if api_key:
4969
5005
  raw = be.read_inbox(_PROJECT_ID, AGENT_NAME, mark_read=True, api_key=api_key)
4970
5006
  if raw:
4971
5007
  msgs = [
@@ -7791,12 +7827,16 @@ def meshcode_health() -> Dict[str, Any]:
7791
7827
  health["uptime_seconds"] = "unknown (psutil not available)"
7792
7828
 
7793
7829
  # Server-side system health (aggregate metrics from DB)
7830
+ # mig 558: pass p_project_id to scope active/stale counts to THIS mesh
7794
7831
  try:
7795
- sys_health = be.sb_rpc("mc_system_health", {})
7832
+ sys_health = be.sb_rpc("mc_system_health", {"p_project_id": _PROJECT_ID})
7796
7833
  if isinstance(sys_health, dict) and sys_health.get("ok"):
7797
7834
  health["system"] = {
7835
+ "scope": sys_health.get("scope", "global"),
7798
7836
  "active_agents": sys_health.get("active_agent_count"),
7837
+ "active_agents_global": sys_health.get("active_agent_count_global"),
7799
7838
  "stale_agents": sys_health.get("stale_agent_count"),
7839
+ "stale_agents_global": sys_health.get("stale_agent_count_global"),
7800
7840
  "message_delivery_rate": sys_health.get("message_delivery_rate"),
7801
7841
  "messages_1h": sys_health.get("total_messages_1h"),
7802
7842
  "failed_rpcs_1h": sys_health.get("failed_rpc_count_1h"),
@@ -32,6 +32,10 @@ from . import claude_update
32
32
  WORKSPACES_ROOT = Path.home() / "meshcode"
33
33
  REGISTRY_PATH = WORKSPACES_ROOT / ".registry.json"
34
34
 
35
+ # Samuel directive 2026-06-17: all agents boot with the best model by default.
36
+ # Overrides (settings.json "model" or mc_agent_model_pref RPC) still respected.
37
+ PLATFORM_DEFAULT_MODEL = "opus"
38
+
35
39
 
36
40
  def _pretrust_claude_workspace(*paths) -> None:
37
41
  """Pre-trust workspace dirs in ~/.claude.json (task 2e6a8d63, Samuel
@@ -1351,6 +1355,12 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
1351
1355
  except Exception as _me:
1352
1356
  print(f"[meshcode] model-pref skipped: {_me}", file=sys.stderr)
1353
1357
 
1358
+ # Platform default: best model for all agents (Samuel directive 2026-06-17).
1359
+ # Applied only when no explicit override was set via settings.json or model_pref RPC.
1360
+ if "--model" not in cmd:
1361
+ cmd += ["--model", PLATFORM_DEFAULT_MODEL]
1362
+ print(f"[meshcode] Model: {PLATFORM_DEFAULT_MODEL} (platform default)", file=sys.stderr)
1363
+
1354
1364
  if mode == "bypass":
1355
1365
  bypass_check_cmd = effective_editor if not pinned_version else "claude"
1356
1366
  if pinned_version or _claude_supports_bypass(bypass_check_cmd):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.141
3
+ Version: 2.11.143
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.141"
7
+ version = "2.11.143"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes
File without changes