nexo-brain 2.1.0 → 2.2.0

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 (235) hide show
  1. package/README.md +3 -3
  2. package/bin/nexo-brain.js +53 -26
  3. package/package.json +1 -1
  4. package/scripts/migrate-to-unified 2.sh +813 -0
  5. package/scripts/migrate-v1.5-to-v1.6 2.py +778 -0
  6. package/scripts/migrate-v1.7-to-v1.8 2.py +214 -0
  7. package/scripts/pre-commit-check 2.sh +55 -0
  8. package/src/__pycache__/auto_update.cpython-310.pyc +0 -0
  9. package/src/__pycache__/hnsw_index.cpython-310.pyc +0 -0
  10. package/src/__pycache__/kg_populate.cpython-310.pyc +0 -0
  11. package/src/__pycache__/knowledge_graph.cpython-310.pyc +0 -0
  12. package/src/__pycache__/plugin_loader.cpython-310.pyc +0 -0
  13. package/src/__pycache__/tools_coordination.cpython-310.pyc +0 -0
  14. package/src/__pycache__/tools_credentials.cpython-310.pyc +0 -0
  15. package/src/__pycache__/tools_learnings.cpython-310.pyc +0 -0
  16. package/src/__pycache__/tools_menu.cpython-310.pyc +0 -0
  17. package/src/__pycache__/tools_reminders.cpython-310.pyc +0 -0
  18. package/src/__pycache__/tools_reminders_crud.cpython-310.pyc +0 -0
  19. package/src/__pycache__/tools_sessions.cpython-310.pyc +0 -0
  20. package/src/__pycache__/tools_task_history.cpython-310.pyc +0 -0
  21. package/src/auto_close_sessions 2.py +159 -0
  22. package/src/auto_update 2.py +634 -0
  23. package/src/claim_graph 2.py +323 -0
  24. package/src/cognitive/__init__ 2.py +62 -0
  25. package/src/cognitive/__pycache__/__init__.cpython-310.pyc +0 -0
  26. package/src/cognitive/__pycache__/_core.cpython-310.pyc +0 -0
  27. package/src/cognitive/__pycache__/_decay.cpython-310.pyc +0 -0
  28. package/src/cognitive/__pycache__/_ingest.cpython-310.pyc +0 -0
  29. package/src/cognitive/__pycache__/_memory.cpython-310.pyc +0 -0
  30. package/src/cognitive/__pycache__/_search.cpython-310.pyc +0 -0
  31. package/src/cognitive/__pycache__/_trust.cpython-310.pyc +0 -0
  32. package/src/cognitive/_core 2.py +567 -0
  33. package/src/cognitive/_decay 2.py +382 -0
  34. package/src/cognitive/_ingest 2.py +892 -0
  35. package/src/cognitive/_memory 2.py +912 -0
  36. package/src/cognitive/_search 2.py +949 -0
  37. package/src/cognitive/_trust 2.py +464 -0
  38. package/src/cognitive/_trust.py +10 -36
  39. package/src/crons/manifest 2.json +106 -0
  40. package/src/crons/sync 2.py +217 -0
  41. package/src/dashboard/__init__ 2.py +0 -0
  42. package/src/dashboard/__pycache__/__init__.cpython-310.pyc +0 -0
  43. package/src/dashboard/__pycache__/app.cpython-310.pyc +0 -0
  44. package/src/dashboard/app 2.py +789 -0
  45. package/src/db/__init__ 2.py +89 -0
  46. package/src/db/__pycache__/__init__.cpython-310.pyc +0 -0
  47. package/src/db/__pycache__/__init__.cpython-312.pyc +0 -0
  48. package/src/db/__pycache__/__init__.cpython-314.pyc +0 -0
  49. package/src/db/__pycache__/_core.cpython-310.pyc +0 -0
  50. package/src/db/__pycache__/_core.cpython-312.pyc +0 -0
  51. package/src/db/__pycache__/_core.cpython-314.pyc +0 -0
  52. package/src/db/__pycache__/_credentials.cpython-310.pyc +0 -0
  53. package/src/db/__pycache__/_credentials.cpython-312.pyc +0 -0
  54. package/src/db/__pycache__/_credentials.cpython-314.pyc +0 -0
  55. package/src/db/__pycache__/_entities.cpython-310.pyc +0 -0
  56. package/src/db/__pycache__/_entities.cpython-312.pyc +0 -0
  57. package/src/db/__pycache__/_entities.cpython-314.pyc +0 -0
  58. package/src/db/__pycache__/_episodic.cpython-310.pyc +0 -0
  59. package/src/db/__pycache__/_episodic.cpython-312.pyc +0 -0
  60. package/src/db/__pycache__/_episodic.cpython-314.pyc +0 -0
  61. package/src/db/__pycache__/_evolution.cpython-310.pyc +0 -0
  62. package/src/db/__pycache__/_evolution.cpython-312.pyc +0 -0
  63. package/src/db/__pycache__/_evolution.cpython-314.pyc +0 -0
  64. package/src/db/__pycache__/_fts.cpython-310.pyc +0 -0
  65. package/src/db/__pycache__/_fts.cpython-312.pyc +0 -0
  66. package/src/db/__pycache__/_fts.cpython-314.pyc +0 -0
  67. package/src/db/__pycache__/_learnings.cpython-310.pyc +0 -0
  68. package/src/db/__pycache__/_learnings.cpython-312.pyc +0 -0
  69. package/src/db/__pycache__/_learnings.cpython-314.pyc +0 -0
  70. package/src/db/__pycache__/_reminders.cpython-310.pyc +0 -0
  71. package/src/db/__pycache__/_reminders.cpython-312.pyc +0 -0
  72. package/src/db/__pycache__/_reminders.cpython-314.pyc +0 -0
  73. package/src/db/__pycache__/_schema.cpython-310.pyc +0 -0
  74. package/src/db/__pycache__/_schema.cpython-312.pyc +0 -0
  75. package/src/db/__pycache__/_schema.cpython-314.pyc +0 -0
  76. package/src/db/__pycache__/_sessions.cpython-310.pyc +0 -0
  77. package/src/db/__pycache__/_sessions.cpython-312.pyc +0 -0
  78. package/src/db/__pycache__/_sessions.cpython-314.pyc +0 -0
  79. package/src/db/__pycache__/_tasks.cpython-310.pyc +0 -0
  80. package/src/db/__pycache__/_tasks.cpython-312.pyc +0 -0
  81. package/src/db/__pycache__/_tasks.cpython-314.pyc +0 -0
  82. package/src/db/_core 2.py +417 -0
  83. package/src/db/_credentials 2.py +124 -0
  84. package/src/db/_entities 2.py +178 -0
  85. package/src/db/_episodic 2.py +738 -0
  86. package/src/db/_evolution 2.py +54 -0
  87. package/src/db/_fts 2.py +406 -0
  88. package/src/db/_learnings 2.py +168 -0
  89. package/src/db/_reminders 2.py +338 -0
  90. package/src/db/_schema 2.py +364 -0
  91. package/src/db/_sessions 2.py +300 -0
  92. package/src/db/_tasks 2.py +91 -0
  93. package/src/evolution_cycle 2.py +266 -0
  94. package/src/hnsw_index 2.py +254 -0
  95. package/src/hooks/auto_capture 2.py +208 -0
  96. package/src/hooks/caffeinate-guard 2.sh +8 -0
  97. package/src/hooks/capture-session 2.sh +21 -0
  98. package/src/hooks/capture-session.sh +2 -0
  99. package/src/hooks/capture-tool-logs 2.sh +127 -0
  100. package/src/hooks/capture-tool-logs.sh +3 -2
  101. package/src/hooks/daily-briefing-check 2.sh +33 -0
  102. package/src/hooks/inbox-hook 2.sh +76 -0
  103. package/src/hooks/inbox-hook.sh +3 -2
  104. package/src/hooks/post-compact 2.sh +148 -0
  105. package/src/hooks/post-compact.sh +1 -1
  106. package/src/hooks/pre-compact 2.sh +151 -0
  107. package/src/hooks/pre-compact.sh +1 -1
  108. package/src/hooks/session-start 2.sh +268 -0
  109. package/src/hooks/session-start.sh +6 -3
  110. package/src/hooks/session-stop 2.sh +140 -0
  111. package/src/hooks/session-stop.sh +1 -1
  112. package/src/kg_populate 2.py +290 -0
  113. package/src/knowledge_graph 2.py +257 -0
  114. package/src/maintenance 2.py +59 -0
  115. package/src/migrate_embeddings 2.py +122 -0
  116. package/src/plugin_loader 2.py +202 -0
  117. package/src/plugins/__init__ 2.py +0 -0
  118. package/src/plugins/__pycache__/__init__ 2.cpython-310.pyc +0 -0
  119. package/src/plugins/__pycache__/__init__.cpython-310.pyc +0 -0
  120. package/src/plugins/__pycache__/adaptive_mode 2.cpython-310.pyc +0 -0
  121. package/src/plugins/__pycache__/adaptive_mode.cpython-310.pyc +0 -0
  122. package/src/plugins/__pycache__/agents 2.cpython-310.pyc +0 -0
  123. package/src/plugins/__pycache__/agents.cpython-310.pyc +0 -0
  124. package/src/plugins/__pycache__/artifact_registry 2.cpython-310.pyc +0 -0
  125. package/src/plugins/__pycache__/artifact_registry.cpython-310.pyc +0 -0
  126. package/src/plugins/__pycache__/backup 2.cpython-310.pyc +0 -0
  127. package/src/plugins/__pycache__/backup.cpython-310.pyc +0 -0
  128. package/src/plugins/__pycache__/cognitive_memory 2.cpython-310.pyc +0 -0
  129. package/src/plugins/__pycache__/cognitive_memory.cpython-310.pyc +0 -0
  130. package/src/plugins/__pycache__/core_rules 2.cpython-310.pyc +0 -0
  131. package/src/plugins/__pycache__/core_rules.cpython-310.pyc +0 -0
  132. package/src/plugins/__pycache__/cortex 2.cpython-310.pyc +0 -0
  133. package/src/plugins/__pycache__/cortex.cpython-310.pyc +0 -0
  134. package/src/plugins/__pycache__/entities 2.cpython-310.pyc +0 -0
  135. package/src/plugins/__pycache__/entities.cpython-310.pyc +0 -0
  136. package/src/plugins/__pycache__/episodic_memory 2.cpython-310.pyc +0 -0
  137. package/src/plugins/__pycache__/episodic_memory.cpython-310.pyc +0 -0
  138. package/src/plugins/__pycache__/evolution 2.cpython-310.pyc +0 -0
  139. package/src/plugins/__pycache__/evolution.cpython-310.pyc +0 -0
  140. package/src/plugins/__pycache__/guard 2.cpython-310.pyc +0 -0
  141. package/src/plugins/__pycache__/guard.cpython-310.pyc +0 -0
  142. package/src/plugins/__pycache__/knowledge_graph_tools 2.cpython-310.pyc +0 -0
  143. package/src/plugins/__pycache__/knowledge_graph_tools.cpython-310.pyc +0 -0
  144. package/src/plugins/__pycache__/preferences 2.cpython-310.pyc +0 -0
  145. package/src/plugins/__pycache__/preferences.cpython-310.pyc +0 -0
  146. package/src/plugins/__pycache__/update 2.cpython-310.pyc +0 -0
  147. package/src/plugins/__pycache__/update.cpython-310.pyc +0 -0
  148. package/src/plugins/adaptive_mode 2.py +805 -0
  149. package/src/plugins/agents 2.py +52 -0
  150. package/src/plugins/artifact_registry 2.py +450 -0
  151. package/src/plugins/backup 2.py +104 -0
  152. package/src/plugins/cognitive_memory 2.py +564 -0
  153. package/src/plugins/core_rules 2.py +252 -0
  154. package/src/plugins/cortex 2.py +299 -0
  155. package/src/plugins/entities 2.py +67 -0
  156. package/src/plugins/episodic_memory 2.py +533 -0
  157. package/src/plugins/evolution 2.py +115 -0
  158. package/src/plugins/guard 2.py +746 -0
  159. package/src/plugins/knowledge_graph_tools 2.py +105 -0
  160. package/src/plugins/preferences 2.py +47 -0
  161. package/src/plugins/update 2.py +256 -0
  162. package/src/requirements 2.txt +12 -0
  163. package/src/rules/__init__ 2.py +0 -0
  164. package/src/rules/core-rules 2.json +331 -0
  165. package/src/rules/migrate 2.py +207 -0
  166. package/src/scripts/check-context 2.py +264 -0
  167. package/src/scripts/deep-sleep/apply_findings.py +58 -0
  168. package/src/scripts/deep-sleep/synthesize-prompt.md +30 -1
  169. package/src/scripts/nexo-auto-update 2.py +6 -0
  170. package/src/scripts/nexo-backup 2.sh +25 -0
  171. package/src/scripts/nexo-brain-activation 2.sh +140 -0
  172. package/src/scripts/nexo-catchup 2.py +242 -0
  173. package/src/scripts/nexo-cognitive-decay 2.py +182 -0
  174. package/src/scripts/nexo-daily-self-audit 2.py +552 -0
  175. package/src/scripts/nexo-deep-sleep 2.sh +97 -0
  176. package/src/scripts/nexo-evolution-run 2.py +597 -0
  177. package/src/scripts/nexo-followup-hygiene 2.py +112 -0
  178. package/src/scripts/nexo-github-monitor 2.py +256 -0
  179. package/src/scripts/nexo-immune 2.py +927 -0
  180. package/src/scripts/nexo-inbox-hook 2.sh +74 -0
  181. package/src/scripts/nexo-install 2.py +6 -0
  182. package/src/scripts/nexo-learning-housekeep 2.py +245 -0
  183. package/src/scripts/nexo-learning-validator 2.py +207 -0
  184. package/src/scripts/nexo-migrate 2.py +232 -0
  185. package/src/scripts/nexo-postmortem-consolidator 2.py +421 -0
  186. package/src/scripts/nexo-pre-commit 2.py +120 -0
  187. package/src/scripts/nexo-prevent-sleep 2.sh +29 -0
  188. package/src/scripts/nexo-proactive-dashboard 2.py +345 -0
  189. package/src/scripts/nexo-reflection 2.py +253 -0
  190. package/src/scripts/nexo-runtime-preflight 2.py +274 -0
  191. package/src/scripts/nexo-send-email 2.py +25 -0
  192. package/src/scripts/nexo-send-reply 2.py +178 -0
  193. package/src/scripts/nexo-sleep 2.py +592 -0
  194. package/src/scripts/nexo-snapshot-restore 2.sh +35 -0
  195. package/src/scripts/nexo-synthesis 2.py +253 -0
  196. package/src/scripts/nexo-tcc-approve 2.sh +79 -0
  197. package/src/scripts/nexo-update 2.sh +161 -0
  198. package/src/scripts/nexo-watchdog 2.sh +878 -0
  199. package/src/scripts/nexo-watchdog-smoke 2.py +119 -0
  200. package/src/server 2.py +733 -0
  201. package/src/server.py +6 -1
  202. package/src/storage_router 2.py +32 -0
  203. package/src/tools_coordination 2.py +102 -0
  204. package/src/tools_credentials 2.py +68 -0
  205. package/src/tools_learnings 2.py +220 -0
  206. package/src/tools_menu 2.py +227 -0
  207. package/src/tools_reminders 2.py +86 -0
  208. package/src/tools_reminders_crud 2.py +159 -0
  209. package/src/tools_reminders_crud.py +7 -0
  210. package/src/tools_sessions 2.py +476 -0
  211. package/src/tools_task_history 2.py +57 -0
  212. package/templates/CLAUDE.md 2.template +63 -0
  213. package/templates/openclaw 2.json +13 -0
  214. package/tests/__init__ 2.py +0 -0
  215. package/tests/conftest 2.py +71 -0
  216. package/tests/test_cognitive 2.py +205 -0
  217. package/tests/test_knowledge_graph 2.py +140 -0
  218. package/tests/test_migrations 2.py +137 -0
  219. package/src/__pycache__/hnsw_index.cpython-314.pyc +0 -0
  220. package/src/cognitive/__pycache__/__init__.cpython-312.pyc +0 -0
  221. package/src/cognitive/__pycache__/__init__.cpython-314.pyc +0 -0
  222. package/src/cognitive/__pycache__/_core.cpython-312.pyc +0 -0
  223. package/src/cognitive/__pycache__/_core.cpython-314.pyc +0 -0
  224. package/src/cognitive/__pycache__/_decay.cpython-312.pyc +0 -0
  225. package/src/cognitive/__pycache__/_decay.cpython-314.pyc +0 -0
  226. package/src/cognitive/__pycache__/_ingest.cpython-312.pyc +0 -0
  227. package/src/cognitive/__pycache__/_ingest.cpython-314.pyc +0 -0
  228. package/src/cognitive/__pycache__/_memory.cpython-312.pyc +0 -0
  229. package/src/cognitive/__pycache__/_memory.cpython-314.pyc +0 -0
  230. package/src/cognitive/__pycache__/_search.cpython-312.pyc +0 -0
  231. package/src/cognitive/__pycache__/_search.cpython-314.pyc +0 -0
  232. package/src/cognitive/__pycache__/_trust.cpython-312.pyc +0 -0
  233. package/src/cognitive/__pycache__/_trust.cpython-314.pyc +0 -0
  234. package/src/plugins/__pycache__/adaptive_mode.cpython-314.pyc +0 -0
  235. package/src/scripts/deep-sleep/__pycache__/extract.cpython-314.pyc +0 -0
package/README.md CHANGED
@@ -11,12 +11,12 @@
11
11
  **NEXO Brain transforms any MCP-compatible AI agent from a stateless assistant into a cognitive partner that remembers, learns, forgets, adapts, and builds a relationship with you over time.**
12
12
 
13
13
  <p align="center">
14
- <a href="https://www.youtube.com/watch?v=J0hCWnYU4UY">
15
- <img src="assets/nexo-brain-infographic-v4.png" alt="NEXO Brain Architecture" width="700">
14
+ <a href="https://www.youtube.com/watch?v=IBs7zh7ZMG0">
15
+ <img src="assets/nexo-brain-infographic-v5.png" alt="NEXO Brain Architecture" width="700">
16
16
  </a>
17
17
  </p>
18
18
 
19
- [Watch the 1-minute overview on YouTube](https://www.youtube.com/watch?v=J0hCWnYU4UY) · [Watch the full deep-dive](https://www.youtube.com/watch?v=-uvhicUhGTY)
19
+ [Watch the overview on YouTube](https://www.youtube.com/watch?v=IBs7zh7ZMG0) · [Watch the full deep-dive](https://www.youtube.com/watch?v=bKAfowyyy5M)
20
20
 
21
21
  Every time you close a session, everything is lost. Your agent doesn't remember yesterday's decisions, repeats the same mistakes, and starts from zero. NEXO Brain fixes this with a cognitive architecture modeled after how human memory actually works.
22
22
 
package/bin/nexo-brain.js CHANGED
@@ -54,7 +54,7 @@ function log(msg) {
54
54
 
55
55
  // ══════════════════════════════════════════════════════════════════════════════
56
56
  // CORE PROCESS & HOOK DEFINITIONS
57
- // All 13 nightly/periodic processes and all 7 core hooks that make NEXO functional.
57
+ // All 13 nightly/periodic processes and all 8 core hooks that make NEXO functional.
58
58
  // ══════════════════════════════════════════════════════════════════════════════
59
59
 
60
60
  /**
@@ -105,33 +105,36 @@ const ALL_PROCESSES = [
105
105
  ];
106
106
 
107
107
  /**
108
- * Complete definition of all 7 core hooks.
108
+ * Complete definition of all 8 core hooks.
109
109
  * event: Claude Code hook event name
110
110
  * matcher: glob matcher for the hook
111
111
  * script: script filename inside NEXO_HOME/hooks/ (or a raw command template)
112
112
  * key: unique identifier to detect if already registered (avoids duplicates)
113
+ * timeout: seconds before Claude Code kills the hook (prevents hangs)
113
114
  */
114
115
  const ALL_CORE_HOOKS = [
115
116
  { event: "SessionStart", key: "session-start-ts", commandTemplate: (nexoHome) =>
116
117
  `date +%s > ${path.join(nexoHome, "operations", ".session-start-ts")}`,
117
- purpose: "Session timing" },
118
+ timeout: 2, purpose: "Session timing" },
119
+ { event: "SessionStart", key: "daily-briefing-check.sh", script: "daily-briefing-check.sh",
120
+ timeout: 5, purpose: "Briefing schedule check" },
118
121
  { event: "SessionStart", key: "session-start.sh", script: "session-start.sh",
119
- purpose: "Briefing + context" },
122
+ timeout: 35, purpose: "Briefing + context" },
120
123
  { event: "Stop", key: "session-stop.sh", script: "session-stop.sh",
121
- purpose: "POSTMORTEM — the most important" },
124
+ timeout: 10, purpose: "POSTMORTEM — the most important" },
122
125
  { event: "PostToolUse", key: "capture-tool-logs.sh", script: "capture-tool-logs.sh",
123
- purpose: "Operation capture" },
126
+ timeout: 5, purpose: "Operation capture" },
124
127
  { event: "PostToolUse", key: "inbox-hook.sh", script: "inbox-hook.sh",
125
- purpose: "Inter-session messaging" },
128
+ timeout: 5, purpose: "Inter-session messaging" },
126
129
  { event: "PreCompact", key: "pre-compact.sh", script: "pre-compact.sh",
127
- purpose: "Memory preservation" },
130
+ timeout: 10, purpose: "Memory preservation" },
128
131
  { event: "PostCompact", key: "post-compact.sh", script: "post-compact.sh",
129
- purpose: "Memory restoration" },
132
+ timeout: 10, purpose: "Memory restoration" },
130
133
  ];
131
134
 
132
135
  /**
133
- * Register all 7 core hooks in settings.hooks.
134
- * Additive: adds missing hooks, never removes user's custom ones.
136
+ * Register all 8 core hooks in settings.hooks.
137
+ * Additive + auto-migrate: adds missing hooks, updates stale paths, never removes user's custom ones.
135
138
  */
136
139
  function registerAllCoreHooks(settings, hooksDir, nexoHome) {
137
140
  if (!settings.hooks) settings.hooks = {};
@@ -143,13 +146,7 @@ function registerAllCoreHooks(settings, hooksDir, nexoHome) {
143
146
  for (const hook of ALL_CORE_HOOKS) {
144
147
  if (!settings.hooks[hook.event]) settings.hooks[hook.event] = [];
145
148
 
146
- // Check if this specific hook is already registered (by key)
147
- const alreadyExists = settings.hooks[hook.event].some(
148
- (h) => h.command && h.command.includes(hook.key)
149
- );
150
- if (alreadyExists) continue;
151
-
152
- // Build the command
149
+ // Build the canonical command for this hook
153
150
  let command;
154
151
  if (hook.commandTemplate) {
155
152
  command = hook.commandTemplate(nexoHome);
@@ -157,10 +154,40 @@ function registerAllCoreHooks(settings, hooksDir, nexoHome) {
157
154
  command = `NEXO_HOME=${nexoHome} bash ${path.join(hooksDir, hook.script)}`;
158
155
  }
159
156
 
160
- settings.hooks[hook.event].push({
161
- type: "command",
162
- command: command,
163
- });
157
+ // Claude Code settings.hooks supports two formats:
158
+ // Flat: [{type:"command", command:"..."}]
159
+ // Nested: [{matcher:"*", hooks:[{type:"command", command:"..."}]}]
160
+ // We need to search and update in both formats.
161
+ let found = false;
162
+
163
+ for (const entry of settings.hooks[hook.event]) {
164
+ if (entry.hooks && Array.isArray(entry.hooks)) {
165
+ // Nested format: {matcher, hooks: [...]}
166
+ const subIdx = entry.hooks.findIndex(
167
+ (h) => h.command && h.command.includes(hook.key)
168
+ );
169
+ if (subIdx !== -1) {
170
+ const existing = entry.hooks[subIdx];
171
+ if (existing.command !== command) existing.command = command;
172
+ if (hook.timeout && !existing.timeout) existing.timeout = hook.timeout;
173
+ found = true;
174
+ break;
175
+ }
176
+ } else if (entry.command && entry.command.includes(hook.key)) {
177
+ // Flat format: {type:"command", command:"..."}
178
+ if (entry.command !== command) entry.command = command;
179
+ if (hook.timeout && !entry.timeout) entry.timeout = hook.timeout;
180
+ found = true;
181
+ break;
182
+ }
183
+ }
184
+
185
+ if (!found) {
186
+ // Hook missing — add it in flat format (Claude Code accepts both)
187
+ const newEntry = { type: "command", command };
188
+ if (hook.timeout) newEntry.timeout = hook.timeout;
189
+ settings.hooks[hook.event].push(newEntry);
190
+ }
164
191
  }
165
192
  }
166
193
 
@@ -649,7 +676,7 @@ async function main() {
649
676
  }
650
677
  log(" Scripts updated.");
651
678
 
652
- // Register ALL 7 core hooks in settings.json (additive — don't remove user's custom hooks)
679
+ // Register ALL 8 core hooks in settings.json (additive — don't remove user's custom hooks)
653
680
  let settings = {};
654
681
  if (fs.existsSync(CLAUDE_SETTINGS)) {
655
682
  try { settings = JSON.parse(fs.readFileSync(CLAUDE_SETTINGS, "utf8")); } catch {}
@@ -659,7 +686,7 @@ async function main() {
659
686
  registerAllCoreHooks(settings, migHooksDest, NEXO_HOME);
660
687
  fs.mkdirSync(path.dirname(CLAUDE_SETTINGS), { recursive: true });
661
688
  fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2));
662
- log(" All 7 core hooks registered in Claude Code settings.");
689
+ log(" All 8 core hooks registered in Claude Code settings.");
663
690
 
664
691
  // Regenerate ALL 13 LaunchAgents / systemd timers
665
692
  const migSchedule = loadOrCreateSchedule(NEXO_HOME);
@@ -1741,7 +1768,7 @@ ${doScan ? `- Stack: ${Object.keys(profileData.code.languages || {}).slice(0, 5)
1741
1768
  },
1742
1769
  };
1743
1770
 
1744
- // Configure ALL 7 core hooks for session capture (Sensory Register)
1771
+ // Configure ALL 8 core hooks for session capture (Sensory Register)
1745
1772
  if (!settings.hooks) settings.hooks = {};
1746
1773
 
1747
1774
  // Hook scripts already copied above — just reference the dest dir
@@ -1752,7 +1779,7 @@ ${doScan ? `- Stack: ${Object.keys(profileData.code.languages || {}).slice(0, 5)
1752
1779
  const settingsDir = path.dirname(CLAUDE_SETTINGS);
1753
1780
  fs.mkdirSync(settingsDir, { recursive: true });
1754
1781
  fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2));
1755
- log("MCP server + 7 core hooks configured in Claude Code settings.");
1782
+ log("MCP server + 8 core hooks configured in Claude Code settings.");
1756
1783
 
1757
1784
  // Step 7: Create schedule.json (only on fresh install) and install ALL 13 processes
1758
1785
  log("Setting up automated processes...");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexo-brain",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "mcpName": "io.github.wazionapps/nexo",
5
5
  "description": "NEXO — Cognitive co-operator for Claude Code. Memory, emotional intelligence, overnight learning (Deep Sleep), cron management, trust scoring, and adaptive calibration.",
6
6
  "bin": {