nexo-brain 5.2.0 → 5.2.1

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": "5.2.0",
3
+ "version": "5.2.1",
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexo-brain",
3
- "version": "5.2.0",
3
+ "version": "5.2.1",
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",
@@ -19,7 +19,7 @@ import os
19
19
  import re
20
20
  import secrets
21
21
  import time
22
- from datetime import datetime
22
+ from datetime import datetime, timedelta
23
23
  from pathlib import Path
24
24
 
25
25
 
@@ -897,6 +897,27 @@ def handle_cortex_decide(
897
897
  task_id=task_id,
898
898
  )
899
899
 
900
+ # Auto-create outcome when none exists, so cortex decisions
901
+ # get verified by outcome-checker and close the feedback loop.
902
+ if resolved_outcome_id is None and clean_goal and task_id:
903
+ try:
904
+ from db import create_outcome
905
+
906
+ _deadline = (datetime.now() + timedelta(days=7)).strftime("%Y-%m-%d")
907
+ _outcome = create_outcome(
908
+ action_type="cortex_decision",
909
+ description=f"Cortex decision: {clean_goal[:120]}",
910
+ expected_result=f"Recommended '{scored[0]['name']}' succeeds",
911
+ metric_source="decision_outcome",
912
+ action_id=task_id,
913
+ session_id=session_id,
914
+ deadline=_deadline,
915
+ )
916
+ if isinstance(_outcome, dict) and _outcome.get("id"):
917
+ resolved_outcome_id = int(_outcome["id"])
918
+ except Exception:
919
+ pass # non-critical: decision still records without outcome
920
+
900
921
  try:
901
922
  from db import create_cortex_evaluation
902
923
 
@@ -855,7 +855,8 @@ def _parse_any_datetime(value) -> datetime | None:
855
855
  except Exception:
856
856
  continue
857
857
  try:
858
- return datetime.fromisoformat(raw.replace("Z", "+00:00").replace("+00:00", ""))
858
+ dt = datetime.fromisoformat(raw.replace("Z", "+00:00"))
859
+ return dt.replace(tzinfo=None)
859
860
  except Exception:
860
861
  return None
861
862