nexo-brain 7.30.32 → 7.30.33

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.32",
3
+ "version": "7.30.33",
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.32` is the current packaged-runtime line. Patch release over v7.30.31 - packaged update/doctor now repair npm/npx wrapper drift, archive stale personal script backups, validate observable automation health contracts, and block legacy Claude/Codex project memory writes.
21
+ Version `7.30.33` is the current packaged-runtime line. Patch release over v7.30.32 - personal agent/script status now keeps the newest real run between manual executions and cron history, so a successful manual agent run cannot be hidden behind an older scheduled failure.
22
+
23
+ Previously in `7.30.32`: patch release over v7.30.31 - packaged update/doctor now repair npm/npx wrapper drift, archive stale personal script backups, validate observable automation health contracts, and block legacy Claude/Codex project memory writes.
22
24
 
23
25
  Previously in `7.30.31`: patch release over v7.30.30 - Core Rules now reach agents both through a compact managed bootstrap summary and task-specific `cortex/task_open` injection from the protected `core_rules` registry.
24
26
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexo-brain",
3
- "version": "7.30.32",
3
+ "version": "7.30.33",
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",
@@ -23,6 +23,30 @@ def _now_text() -> str:
23
23
  return datetime.datetime.now().isoformat(timespec="seconds")
24
24
 
25
25
 
26
+ def _run_timestamp_sort_key(value: str | None) -> tuple[int, str]:
27
+ text = str(value or "").strip()
28
+ if not text:
29
+ return (0, "")
30
+ normalized = text.replace("Z", "+00:00")
31
+ try:
32
+ parsed = datetime.datetime.fromisoformat(normalized)
33
+ except ValueError:
34
+ return (1, text)
35
+ if parsed.tzinfo is not None:
36
+ parsed = parsed.astimezone(datetime.timezone.utc).replace(tzinfo=None)
37
+ return (2, parsed.isoformat(timespec="seconds"))
38
+
39
+
40
+ def _newer_run(candidate: dict | None, current: dict | None) -> dict | None:
41
+ if not candidate or not candidate.get("started_at"):
42
+ return current
43
+ if not current or not current.get("started_at"):
44
+ return candidate
45
+ if _run_timestamp_sort_key(candidate.get("started_at")) > _run_timestamp_sort_key(current.get("started_at")):
46
+ return candidate
47
+ return current
48
+
49
+
26
50
  def _get_db():
27
51
  """Resolve db._core lazily so reload-heavy tests use the live connection module."""
28
52
  return importlib.import_module("db._core").get_db()
@@ -406,11 +430,16 @@ def list_personal_scripts(include_disabled: bool = True, *, include_core: bool =
406
430
  schedule["last_exit_code"] = latest["exit_code"]
407
431
  script["schedules"] = script_schedules
408
432
  script["has_schedule"] = bool(script_schedules)
409
- latest = None
433
+ latest = _newer_run(
434
+ {"started_at": script.get("last_run_at"), "exit_code": script.get("last_exit_code")},
435
+ None,
436
+ )
410
437
  for schedule in script_schedules:
411
438
  started_at = schedule.get("last_run_at")
412
- if started_at and (latest is None or started_at > latest.get("started_at", "")):
413
- latest = {"started_at": started_at, "exit_code": schedule.get("last_exit_code")}
439
+ latest = _newer_run(
440
+ {"started_at": started_at, "exit_code": schedule.get("last_exit_code")},
441
+ latest,
442
+ )
414
443
  if latest:
415
444
  script["last_run_at"] = latest["started_at"]
416
445
  script["last_exit_code"] = latest["exit_code"]
@@ -6,11 +6,13 @@
6
6
  "chrome-devtools-mcp": {
7
7
  "source_type": "npm",
8
8
  "package": "chrome-devtools-mcp",
9
- "version": "1.1.1",
10
- "integrity": "sha512-Fs/ASXAkQqvYCbJjHIx/pnShjyIoZoPxdg4J3wjaA9FLkRb2ngGnisu2AGcBIXdw5qrPkOuV/cOlGOonpsE1qw==",
11
- "tarball": "https://registry.npmjs.org/chrome-devtools-mcp/-/chrome-devtools-mcp-1.1.1.tgz",
9
+ "version": "1.2.0",
10
+ "integrity": "sha512-xHd8hoLZQArDsYhu8OUHvKBIiihx1Co9DgAPHWaM4kzRf41TpZ0IuxKioIWTEGzFKpRqQzIxpFqydY4AKqP5sQ==",
11
+ "tarball": "https://registry.npmjs.org/chrome-devtools-mcp/-/chrome-devtools-mcp-1.2.0.tgz",
12
12
  "bin": "chrome-devtools-mcp",
13
- "engines": {"node": "^20.19.0 || ^22.12.0 || >=23"}
13
+ "engines": {
14
+ "node": "^20.19.0 || ^22.12.0 || >=23"
15
+ }
14
16
  },
15
17
  "mac-use-mcp": {
16
18
  "source_type": "npm",
@@ -19,7 +21,9 @@
19
21
  "integrity": "sha512-UcVkzvHuw+f21nEZwb3MwdqWGxLK/nYlhN55SRD6FZ2yn2t3ji0zKLD2XvQLp0ugeYyS92TqVgnw6E4P5VB+bg==",
20
22
  "tarball": "https://registry.npmjs.org/mac-use-mcp/-/mac-use-mcp-1.1.1.tgz",
21
23
  "bin": "mac-use-mcp",
22
- "engines": {"node": ">=22"}
24
+ "engines": {
25
+ "node": ">=22"
26
+ }
23
27
  },
24
28
  "native-devtools-mcp": {
25
29
  "source_type": "npm",
@@ -28,7 +32,9 @@
28
32
  "integrity": "sha512-TIR8QCKzYCaHY+N1IWB7OM6pZH49HJxRj1dZjT4RNkviA1QpgINm8H95ohMCbf4ZC5jdFssMlb9KmWNZnCeCSw==",
29
33
  "tarball": "https://registry.npmjs.org/native-devtools-mcp/-/native-devtools-mcp-0.10.1.tgz",
30
34
  "bin": "native-devtools-mcp",
31
- "engines": {"node": ">=18"}
35
+ "engines": {
36
+ "node": ">=18"
37
+ }
32
38
  },
33
39
  "open-computer-use": {
34
40
  "source_type": "npm",
@@ -37,7 +43,7 @@
37
43
  "integrity": "sha512-KlOHmFvXHe2IEMGE/O+zMN5ASo+FQ42copj4j1xEOnyeLq4oxUxhtHqEdPUACCUcMZaHzKXfZboL1dk5a2GjLA==",
38
44
  "tarball": "https://registry.npmjs.org/open-computer-use/-/open-computer-use-0.1.52.tgz",
39
45
  "bin": "open-computer-use-mcp",
40
- "engines": {"node": "^20.19.0 || ^22.12.0 || >=23"}
46
+ "engines": {}
41
47
  },
42
48
  "desktop-commander": {
43
49
  "source_type": "npm",
@@ -46,7 +52,9 @@
46
52
  "integrity": "sha512-ZgdBDihpaLfrzQQQGQCPmElYMx91oUXeVEWbxbygeUfq2aOZvHrcVMeuTGy9oMDp9vxjq6d/+ZGE0mQLJnAWkw==",
47
53
  "tarball": "https://registry.npmjs.org/@wonderwhy-er/desktop-commander/-/desktop-commander-0.2.42.tgz",
48
54
  "bin": "desktop-commander",
49
- "engines": {"node": ">=18.0.0"}
55
+ "engines": {
56
+ "node": ">=18.0.0"
57
+ }
50
58
  }
51
59
  }
52
60
  }