nexo-brain 7.30.9 → 7.30.10

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexo-brain",
3
- "version": "7.30.9",
3
+ "version": "7.30.10",
4
4
  "description": "Local cognitive runtime for Claude Code \u2014 persistent memory, overnight learning, doctor diagnostics, personal scripts, recovery-aware jobs, startup preflight, and optional dashboard/power helper.",
5
5
  "author": {
6
6
  "name": "NEXO Brain",
package/README.md CHANGED
@@ -18,7 +18,9 @@
18
18
 
19
19
  [Watch the overview video](https://nexo-brain.com/watch/) · [Watch on YouTube](https://www.youtube.com/watch?v=i2lkGhKyVqI) · [Open the infographic](https://nexo-brain.com/assets/nexo-brain-infographic-v5.png)
20
20
 
21
- Version `7.30.9` is the current packaged-runtime line. Patch release over v7.30.8 - post-update self-heal now stamps a verified repair baseline, and doctor release gates distinguish current installation failures from historical operator/session drift.
21
+ Version `7.30.10` is the current packaged-runtime line. Patch release over v7.30.9 - packaged `nexo update` now stamps the verified repair baseline after import verification, including same-version maintenance runs.
22
+
23
+ Previously in `7.30.9`: patch release over v7.30.8 - post-update self-heal now stamps a verified repair baseline, and doctor release gates distinguish current installation failures from historical operator/session drift.
22
24
 
23
25
  Previously in `7.30.8`: patch release over v7.30.7 - Deep Sleep now folds parallel Codex sub-agents into their parent thread and Local Context stops the `entity_facts` cartesian blow-up that created runaway sidecar databases.
24
26
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexo-brain",
3
- "version": "7.30.9",
3
+ "version": "7.30.10",
4
4
  "mcpName": "io.github.wazionapps/nexo",
5
5
  "description": "NEXO Brain — Shared brain for AI agents. Persistent memory, semantic RAG, natural forgetting, metacognitive guard, trust scoring, 150+ MCP tools. Works with Claude Code, Codex, Claude Desktop & any MCP client. 100% local, free.",
6
6
  "homepage": "https://nexo-brain.com",
@@ -152,6 +152,23 @@ NEXO_HOME = export_resolved_nexo_home()
152
152
  DATA_DIR = paths.data_dir()
153
153
  BACKUP_BASE = paths.backups_dir()
154
154
  TECHNICAL_BACKUP_KEEP = 5
155
+ REPAIR_BASELINE_FILE = "last-repair-baseline.json"
156
+
157
+
158
+ def _stamp_runtime_repair_baseline(source: str = "plugins.update") -> str:
159
+ operations_dir = NEXO_HOME / "operations"
160
+ operations_dir.mkdir(parents=True, exist_ok=True)
161
+ now = time.time()
162
+ payload = {
163
+ "last_repair_epoch": now,
164
+ "last_repair_at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(now)),
165
+ "source": source,
166
+ "reason": "verified runtime repair baseline after update/post-sync",
167
+ }
168
+ (operations_dir / REPAIR_BASELINE_FILE).write_text(
169
+ json.dumps(payload, indent=2, ensure_ascii=False) + "\n"
170
+ )
171
+ return "runtime-repair-baseline"
155
172
 
156
173
 
157
174
  def _env_int(name: str, default: int) -> int:
@@ -1454,6 +1471,13 @@ def _handle_packaged_update(progress_fn=None, *, include_clis: bool = True) -> s
1454
1471
  verify_err = _verify_import()
1455
1472
  if verify_err:
1456
1473
  errors.append(f"verification: {verify_err}")
1474
+ repair_baseline_warning = None
1475
+ if not verify_err:
1476
+ try:
1477
+ _emit_progress(progress_fn, "Stamping runtime repair baseline...")
1478
+ _stamp_runtime_repair_baseline("plugins.update._handle_packaged_update")
1479
+ except Exception as exc:
1480
+ repair_baseline_warning = f"{exc.__class__.__name__}: {exc}"
1457
1481
 
1458
1482
  hook_sync_warning = None
1459
1483
  cron_sync_warning = None
@@ -1616,6 +1640,10 @@ def _handle_packaged_update(progress_fn=None, *, include_clis: bool = True) -> s
1616
1640
  lines.append(" Clients: configured client targets synced")
1617
1641
  else:
1618
1642
  lines.append(f" WARNING: client sync: {client_sync_warning}")
1643
+ if not repair_baseline_warning:
1644
+ lines.append(" Repair baseline: updated")
1645
+ else:
1646
+ lines.append(f" WARNING: repair baseline: {repair_baseline_warning}")
1619
1647
  if launchagent_reload_summary and launchagent_reload_summary.get("scanned"):
1620
1648
  if not launchagent_reload_warning:
1621
1649
  lines.append(
@@ -1765,6 +1793,12 @@ def handle_update(
1765
1793
  if verify_err:
1766
1794
  raise RuntimeError(f"Verification failed: {verify_err}")
1767
1795
  steps_done.append("verify")
1796
+ try:
1797
+ _emit_progress(progress_fn, "Stamping runtime repair baseline...")
1798
+ _stamp_runtime_repair_baseline("plugins.update.handle_update")
1799
+ steps_done.append("runtime-repair-baseline")
1800
+ except Exception as e:
1801
+ steps_done.append(f"runtime-repair-baseline-warning:{e.__class__.__name__}")
1768
1802
 
1769
1803
  # Step 8: Sync crons with manifest
1770
1804
  cron_sync_result = ""
@@ -1929,6 +1963,8 @@ def handle_update(
1929
1963
  trailing.insert(2 if len(trailing) >= 2 else len(trailing), " Crons: synced with manifest")
1930
1964
  if "client-sync" in steps_done:
1931
1965
  trailing.append(" Clients: configured client targets synced")
1966
+ if "runtime-repair-baseline" in steps_done:
1967
+ trailing.append(" Repair baseline: updated")
1932
1968
  if trailing:
1933
1969
  msg += "\n" + "\n".join(trailing)
1934
1970
  return msg
@@ -1954,6 +1990,8 @@ def handle_update(
1954
1990
  lines.extend(external_cli_lines)
1955
1991
  if "client-sync" in steps_done:
1956
1992
  lines.append(" Clients: configured client targets synced")
1993
+ if "runtime-repair-baseline" in steps_done:
1994
+ lines.append(" Repair baseline: updated")
1957
1995
  if versioned_runtime_summary and versioned_runtime_summary.get("ok"):
1958
1996
  lines.append(f" Runtime activation: core/current -> versions/{new_version}")
1959
1997
  if version_prune_summary and version_prune_summary.get("pruned"):