nexo-brain 7.30.16 → 7.30.17

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.16",
3
+ "version": "7.30.17",
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.16` is the current packaged-runtime line. Patch release over v7.30.14 - Desktop diagnostics can read embedding migration status without warming models, and the coordinated Desktop update path is covered for bundled model verification and obsolete managed model cleanup.
21
+ Version `7.30.17` is the current packaged-runtime line. Patch release over v7.30.16 - F0.6 repairs promoted helper imports for personal scripts by adding a core-backed compatibility shim without duplicating the script catalog.
22
+
23
+ Previously in `7.30.16`: patch release over v7.30.14 - Desktop diagnostics can read embedding migration status without warming models, and the coordinated Desktop update path is covered for bundled model verification and obsolete managed model cleanup.
22
24
 
23
25
  Previously in `7.30.14`: patch release over v7.30.13 - support tickets, provider capability discovery, task-close rearming, internal audit followups, and the memory-observation watchdog are aligned for Desktop-managed agents.
24
26
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexo-brain",
3
- "version": "7.30.16",
3
+ "version": "7.30.17",
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",
@@ -3154,6 +3154,103 @@ def _ensure_f06_legacy_shims() -> None:
3154
3154
  paths.finalize_backup_snapshot(conflict_root)
3155
3155
 
3156
3156
 
3157
+ def _ensure_f06_personal_script_import_shims() -> None:
3158
+ """Expose promoted core helpers to legacy personal scripts.
3159
+
3160
+ Some operator-owned scripts are executed directly from
3161
+ ``NEXO_HOME/personal/scripts`` and therefore only get that directory on
3162
+ ``sys.path``. When Block E.6 promoted ``nexo_personal_automation.py`` into
3163
+ ``core/scripts``, those direct scripts lost the bare import
3164
+ ``from nexo_personal_automation import ...``. Keep the source of truth in
3165
+ core, but add a tiny compatibility entry in personal/scripts.
3166
+ """
3167
+
3168
+ helper_names = ("nexo_personal_automation.py",)
3169
+ core_scripts = NEXO_HOME / "core" / "scripts"
3170
+ personal_scripts = NEXO_HOME / "personal" / "scripts"
3171
+ stub_marker = "# Auto-generated by NEXO F0.6 personal import shim."
3172
+
3173
+ def _same_file(a: Path, b: Path) -> bool:
3174
+ try:
3175
+ return a.is_file() and b.is_file() and a.read_bytes() == b.read_bytes()
3176
+ except Exception:
3177
+ return False
3178
+
3179
+ def _managed_stub(path: Path) -> bool:
3180
+ try:
3181
+ return path.is_file() and path.read_text(encoding="utf-8", errors="ignore").startswith(stub_marker)
3182
+ except Exception:
3183
+ return False
3184
+
3185
+ def _write_stub(shim: Path, target: Path) -> None:
3186
+ relative = os.path.relpath(str(target), str(shim.parent))
3187
+ shim.write_text(
3188
+ f"""{stub_marker}
3189
+ from __future__ import annotations
3190
+
3191
+ import importlib.util as _importlib_util
3192
+ from pathlib import Path as _Path
3193
+
3194
+ _TARGET = (_Path(__file__).resolve().parent / {relative!r}).resolve()
3195
+ _SPEC = _importlib_util.spec_from_file_location("_nexo_core_personal_automation", _TARGET)
3196
+ if _SPEC is None or _SPEC.loader is None:
3197
+ raise ImportError(f"Cannot load NEXO core helper at {{_TARGET}}")
3198
+ _MODULE = _importlib_util.module_from_spec(_SPEC)
3199
+ _SPEC.loader.exec_module(_MODULE)
3200
+ __all__ = getattr(_MODULE, "__all__", [name for name in vars(_MODULE) if not name.startswith("_")])
3201
+ globals().update({{name: getattr(_MODULE, name) for name in __all__}})
3202
+ """,
3203
+ encoding="utf-8",
3204
+ )
3205
+
3206
+ try:
3207
+ personal_scripts.mkdir(parents=True, exist_ok=True)
3208
+ except Exception as exc:
3209
+ _log(f"[F0.6 shim] could not create personal/scripts for import shims: {exc}")
3210
+ return
3211
+
3212
+ for name in helper_names:
3213
+ target = core_scripts / name
3214
+ if not target.is_file():
3215
+ continue
3216
+ shim = personal_scripts / name
3217
+
3218
+ if shim.is_symlink():
3219
+ try:
3220
+ if shim.resolve(strict=False) == target.resolve(strict=False):
3221
+ continue
3222
+ except Exception:
3223
+ pass
3224
+ try:
3225
+ shim.unlink()
3226
+ except Exception as exc:
3227
+ _log(f"[F0.6 shim] could not replace personal import symlink {name}: {exc}")
3228
+ continue
3229
+
3230
+ if shim.exists():
3231
+ if shim.is_file() and (_same_file(shim, target) or _managed_stub(shim)):
3232
+ try:
3233
+ shim.unlink()
3234
+ except Exception as exc:
3235
+ _log(f"[F0.6 shim] could not replace personal import copy {name}: {exc}")
3236
+ continue
3237
+ else:
3238
+ _log(f"[F0.6 shim] preserving distinct personal import helper {shim}")
3239
+ continue
3240
+
3241
+ try:
3242
+ relative = os.path.relpath(str(target), str(shim.parent))
3243
+ shim.symlink_to(relative)
3244
+ continue
3245
+ except Exception as exc:
3246
+ _log(f"[F0.6 shim] symlink create failed for personal import helper {name}: {exc}")
3247
+
3248
+ try:
3249
+ _write_stub(shim, target)
3250
+ except Exception as exc:
3251
+ _log(f"[F0.6 shim] stub create failed for personal import helper {name}: {exc}")
3252
+
3253
+
3157
3254
  def _rewrite_f06_launch_agents() -> int:
3158
3255
  """Rewrite lingering LaunchAgent paths to canonical F0.6 locations."""
3159
3256
  import re as _re
@@ -3279,6 +3376,7 @@ def _maybe_migrate_to_f06_layout() -> None:
3279
3376
  _promote_packaged_runtime_code_to_core()
3280
3377
  if _f06_live_legacy_paths():
3281
3378
  _ensure_f06_legacy_shims()
3379
+ _ensure_f06_personal_script_import_shims()
3282
3380
  _cleanup_f06_root_residue()
3283
3381
  try:
3284
3382
  _rewrite_f06_launch_agents()
@@ -3498,6 +3596,7 @@ def _maybe_migrate_to_f06_layout() -> None:
3498
3596
  except Exception as e:
3499
3597
  _log(f"[F0.6] marker write failed: {e}")
3500
3598
  _ensure_f06_legacy_shims()
3599
+ _ensure_f06_personal_script_import_shims()
3501
3600
  _cleanup_f06_root_residue()
3502
3601
  try:
3503
3602
  rewritten = _rewrite_f06_launch_agents()