crbro-memory 1.4.0 β†’ 1.5.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 (43) hide show
  1. package/README.md +49 -8
  2. package/bin/crbro.mjs +109 -0
  3. package/dist/engine/brain.d.ts +3 -0
  4. package/dist/engine/brain.d.ts.map +1 -1
  5. package/dist/engine/brain.js +15 -1
  6. package/dist/engine/brain.js.map +1 -1
  7. package/dist/engine/cortex.d.ts +61 -7
  8. package/dist/engine/cortex.d.ts.map +1 -1
  9. package/dist/engine/cortex.js +168 -23
  10. package/dist/engine/cortex.js.map +1 -1
  11. package/dist/engine/maintenance.d.ts +6 -1
  12. package/dist/engine/maintenance.d.ts.map +1 -1
  13. package/dist/engine/maintenance.js +19 -5
  14. package/dist/engine/maintenance.js.map +1 -1
  15. package/dist/engine/prefrontal.d.ts +13 -2
  16. package/dist/engine/prefrontal.d.ts.map +1 -1
  17. package/dist/engine/prefrontal.js +46 -10
  18. package/dist/engine/prefrontal.js.map +1 -1
  19. package/dist/miner/index.d.ts.map +1 -1
  20. package/dist/miner/index.js +35 -30
  21. package/dist/miner/index.js.map +1 -1
  22. package/dist/search/index.d.ts +46 -6
  23. package/dist/search/index.d.ts.map +1 -1
  24. package/dist/search/index.js +335 -74
  25. package/dist/search/index.js.map +1 -1
  26. package/dist/search/tokenize.d.ts +23 -0
  27. package/dist/search/tokenize.d.ts.map +1 -0
  28. package/dist/search/tokenize.js +83 -0
  29. package/dist/search/tokenize.js.map +1 -0
  30. package/dist/server.d.ts.map +1 -1
  31. package/dist/server.js +125 -14
  32. package/dist/server.js.map +1 -1
  33. package/dist/types/index.d.ts +39 -1
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/utils/fs.d.ts +3 -1
  36. package/dist/utils/fs.d.ts.map +1 -1
  37. package/dist/utils/fs.js +6 -2
  38. package/dist/utils/fs.js.map +1 -1
  39. package/dist/utils/hash.d.ts +20 -0
  40. package/dist/utils/hash.d.ts.map +1 -0
  41. package/dist/utils/hash.js +45 -0
  42. package/dist/utils/hash.js.map +1 -0
  43. package/package.json +53 -53
package/README.md CHANGED
@@ -1,14 +1,23 @@
1
1
  # 🧠 CRBRO β€” Persistent Neural Memory for AI
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/crbro-memory)](https://www.npmjs.com/package/crbro-memory)
4
+ [![license](https://img.shields.io/github/license/Octonove/crbro-memory)](LICENSE)
5
+ [![MCP](https://img.shields.io/badge/MCP-Claude%20Code%20%C2%B7%20Claude%20Desktop%20%C2%B7%20Cursor-1E3A5F)](https://modelcontextprotocol.io)
6
+
3
7
  **CRBRO** is a local MCP (Model Context Protocol) server that gives your AI assistant **persistent long-term memory** across sessions. It uses a biological neural architecture β€” cortex, synapses, hippocampus β€” to store, connect, and retrieve knowledge automatically.
4
8
 
5
- Free and open source (MIT). All 15 tools included β€” no license, no account, no tiers.
9
+ ![CRBRO demo](docs/demo.gif)
10
+
11
+ Free and open source (MIT). All 16 tools included β€” no license, no account, no tiers.
12
+
13
+ > ⭐ **If CRBRO gives your AI a memory worth keeping, a star on GitHub is the best way to support it.**
6
14
 
7
15
  ## Features
8
16
 
9
17
  - **🧬 Biological Architecture** β€” Knowledge organized as neurons (cortex), connections (synapses), and session memory (hippocampus)
10
- - **πŸ” Hybrid Search** β€” Powered by [Orama](https://orama.com/) for fast BM25 + fuzzy text search
18
+ - **πŸ” Fact-Level Search** β€” Powered by [Orama](https://orama.com/). Every fact is indexed on its own, so a topic with hundreds of facts stays as findable as one with three, and each result comes back with the exact fact that matched and the date it was recorded
11
19
  - **πŸ”₯ Heat Scores** β€” Automatic relevance tracking based on frequency, recency, and connectivity
20
+ - **✏️ Correctable** β€” Knowledge can be superseded or retracted, not just piled up. A memory that only appends keeps serving yesterday's answer with today's confidence
12
21
  - **πŸ—ΊοΈ Global Map** β€” Cluster detection and cross-domain bridge identification
13
22
  - **⛏️ Knowledge Miner** β€” Optionally scans your local `.md`/`.txt` notes and feeds them into the brain
14
23
  - **πŸ”’ Fully Local** β€” Runs on Node.js alone: no Python, no Docker, no databases, no external services. Your memory never leaves your machine
@@ -25,6 +34,17 @@ npx crbro-memory init
25
34
 
26
35
  ### 2. Add to your MCP config
27
36
 
37
+ > **Register CRBRO at the user level, not per-project.** Your brain lives in
38
+ > `~/.crbro/` and is shared across every folder β€” but if you register the
39
+ > server inside a single project, other folders won't have the tools and it
40
+ > will *look* like the memory is gone. User-level registration makes it
41
+ > available everywhere, which is the whole point.
42
+
43
+ **Claude Code** (one command, available in every folder):
44
+ ```bash
45
+ claude mcp add --scope user crbro -- npx -y crbro-memory
46
+ ```
47
+
28
48
  **Claude Desktop** (`~/AppData/Roaming/Claude/claude_desktop_config.json`):
29
49
  ```json
30
50
  {
@@ -37,7 +57,7 @@ npx crbro-memory init
37
57
  }
38
58
  ```
39
59
 
40
- **Cursor** (`.cursor/mcp.json`):
60
+ **Cursor** (`~/.cursor/mcp.json` β€” the one in your home folder, not a project's `.cursor/`):
41
61
  ```json
42
62
  {
43
63
  "mcpServers": {
@@ -51,7 +71,7 @@ npx crbro-memory init
51
71
 
52
72
  ### 3. Start using it
53
73
 
54
- Your AI will now have access to 15 memory tools. Start any session with `crbro_boot`.
74
+ Your AI will now have access to 16 memory tools. Start any session with `crbro_boot`.
55
75
 
56
76
  ## Tools
57
77
 
@@ -62,7 +82,7 @@ Your AI will now have access to 15 memory tools. Start any session with `crbro_b
62
82
  | `crbro_learn` | Store a fact, decision, pattern, or preference |
63
83
  | `crbro_neuron` | Read a specific neuron (topic) with all its knowledge |
64
84
  | `crbro_neurons` | List neurons with optional filters (domain, type, heat) |
65
- | `crbro_recall` | Search the brain using hybrid text search |
85
+ | `crbro_recall` | Search every stored fact, not just topic names β€” returns the fact that matched |
66
86
  | `crbro_connect` | Create or strengthen a connection between neurons |
67
87
  | `crbro_connections` | Get all connections for a neuron |
68
88
  | `crbro_session_log` | Log a session summary |
@@ -70,7 +90,8 @@ Your AI will now have access to 15 memory tools. Start any session with `crbro_b
70
90
  | `crbro_context` | Read/update active working context |
71
91
  | `crbro_hot_topics` | Get the most active topics by heat score |
72
92
  | `crbro_global_map` | View the neural network β€” clusters and cross-domain bridges |
73
- | `crbro_maintenance` | Full brain maintenance β€” archive, prune, rebuild |
93
+ | `crbro_revise` | Mark facts as superseded or retracted when they stop being true |
94
+ | `crbro_maintenance` | Brain maintenance β€” heat, pruning, integrity, index rebuild |
74
95
  | `crbro_consolidate` | End-of-session consolidation |
75
96
 
76
97
  ## Architecture
@@ -89,9 +110,9 @@ Your AI will now have access to 15 memory tools. Start any session with `crbro_b
89
110
  β”‚ β”œβ”€β”€ active_context.json
90
111
  β”‚ β”œβ”€β”€ hot_topics.json
91
112
  β”‚ └── global_map.json
92
- β”œβ”€β”€ archives/ ← Cold neurons
113
+ β”œβ”€β”€ archives/ ← Cold neurons (opt-in; nothing is archived unless you ask)
93
114
  └── .search/ ← Orama search index
94
- └── orama.index.json
115
+ └── chunks.index.json ← one document per fact
95
116
  ```
96
117
 
97
118
  ## Heat Score Algorithm
@@ -121,9 +142,29 @@ npx crbro-memory remove-miner # Remove the scheduled task
121
142
  npx crbro-memory # Start MCP server (stdio)
122
143
  npx crbro-memory init # Initialize brain + detect IDEs
123
144
  npx crbro-memory status # Show brain status
145
+ npx crbro-memory reindex # Rebuild the search index
146
+ npx crbro-memory eval # Measure retrieval quality against your own query set
124
147
  npx crbro-memory --help # Help
125
148
  ```
126
149
 
150
+ ### Measuring retrieval
151
+
152
+ `eval` is there so you can tell a fix from a feeling. Write
153
+ `~/.crbro/.eval/queries.json` as a list of questions you would actually ask,
154
+ each naming the neuron that should answer it:
155
+
156
+ ```json
157
+ [
158
+ { "query": "how we deploy the api",
159
+ "expect_neuron": "project_octochat",
160
+ "expect_contains": "Cloud Run" }
161
+ ]
162
+ ```
163
+
164
+ Then `npx crbro-memory eval` reports how often the right neuron comes back
165
+ first, how often it makes the top three, and MRR β€” plus every miss, so you can
166
+ see what it got wrong instead of guessing.
167
+
127
168
  ## License
128
169
 
129
170
  MIT β€” see [LICENSE](LICENSE). Built by [Octonove](https://github.com/Octonove).
package/bin/crbro.mjs CHANGED
@@ -273,6 +273,111 @@ if (command === 'init') {
273
273
  console.log('');
274
274
  }).catch(console.error);
275
275
 
276
+ } else if (command === 'reindex') {
277
+ // ─── Rebuild the search index from the cortex ──────────────────
278
+ Promise.all([
279
+ import('../dist/engine/brain.js'),
280
+ import('../dist/search/index.js'),
281
+ ]).then(async ([{ Brain }, { SearchEngine }]) => {
282
+ const brain = new Brain();
283
+ const engine = new SearchEngine(brain);
284
+
285
+ console.log('');
286
+ console.log(' πŸ” Rebuilding the CRBRO search index...');
287
+ const started = Date.now();
288
+ const indexed = await engine.rebuild();
289
+ const seconds = ((Date.now() - started) / 1000).toFixed(1);
290
+
291
+ console.log('');
292
+ console.log(` βœ… ${indexed} chunks indexed in ${seconds}s`);
293
+ console.log(' Every fact, decision and pattern is now searchable on its own,');
294
+ console.log(' so a big neuron is no longer buried by short ones.');
295
+ console.log('');
296
+ }).catch(console.error);
297
+
298
+ } else if (command === 'eval') {
299
+ // ─── Measure retrieval quality against a query set ─────────────
300
+ //
301
+ // Without a number you cannot tell a fix from a feeling. The file is
302
+ // .crbro/.eval/queries.json β€” a list of { query, expect_neuron } and
303
+ // optionally expect_contains, the substring the matched fact should carry.
304
+ Promise.all([
305
+ import('../dist/engine/brain.js'),
306
+ import('../dist/search/index.js'),
307
+ import('fs/promises'),
308
+ ]).then(async ([{ Brain }, { SearchEngine }, fsp]) => {
309
+ const brain = new Brain();
310
+ const evalPath = join(brain.paths.root, '.eval', 'queries.json');
311
+
312
+ let queries;
313
+ try {
314
+ queries = JSON.parse(await fsp.readFile(evalPath, 'utf-8'));
315
+ } catch {
316
+ console.log('');
317
+ console.log(` No query set found at ${evalPath}`);
318
+ console.log(' Create it as a JSON array, for example:');
319
+ console.log('');
320
+ console.log(' [');
321
+ console.log(' { "query": "how we deploy the api", "expect_neuron": "project_octochat",');
322
+ console.log(' "expect_contains": "Cloud Run" }');
323
+ console.log(' ]');
324
+ console.log('');
325
+ console.log(' Build it from facts you already saved: take six or eight words');
326
+ console.log(' out of a real fact and name the neuron that holds it.');
327
+ console.log('');
328
+ return;
329
+ }
330
+
331
+ const engine = new SearchEngine(brain);
332
+ await engine.init();
333
+
334
+ let atOne = 0, atThree = 0, reciprocal = 0, contentOk = 0;
335
+ const misses = [];
336
+
337
+ for (const q of queries) {
338
+ const results = await engine.search(q.query, { limit: 10 });
339
+ const rank = results.findIndex(r => r.neuron_id === q.expect_neuron);
340
+
341
+ if (rank === 0) atOne++;
342
+ if (rank >= 0 && rank < 3) atThree++;
343
+ if (rank >= 0) reciprocal += 1 / (rank + 1);
344
+
345
+ if (rank === 0 && q.expect_contains) {
346
+ if (results[0].matching_content.includes(q.expect_contains)) contentOk++;
347
+ else misses.push(` ~ "${q.query}" β€” right neuron, wrong fact returned`);
348
+ }
349
+
350
+ if (rank !== 0) {
351
+ const got = results[0] ? results[0].neuron_id : '(nothing)';
352
+ misses.push(` βœ— "${q.query}" β€” expected ${q.expect_neuron}, got ${got}` +
353
+ (rank > 0 ? ` (it was #${rank + 1})` : ''));
354
+ }
355
+ }
356
+
357
+ const n = queries.length;
358
+ const pct = (x) => `${((x / n) * 100).toFixed(1)}%`;
359
+
360
+ console.log('');
361
+ console.log(' πŸ“Š CRBRO retrieval eval');
362
+ console.log(' ───────────────────────');
363
+ console.log(` Queries: ${n}`);
364
+ console.log(` Right first hit: ${atOne}/${n} (${pct(atOne)})`);
365
+ console.log(` In the top 3: ${atThree}/${n} (${pct(atThree)})`);
366
+ console.log(` MRR: ${(reciprocal / n).toFixed(3)}`);
367
+ if (queries.some(q => q.expect_contains)) {
368
+ const withContent = queries.filter(q => q.expect_contains).length;
369
+ console.log(` Right fact shown: ${contentOk}/${withContent}`);
370
+ }
371
+
372
+ if (misses.length > 0) {
373
+ console.log('');
374
+ console.log(' Misses:');
375
+ for (const m of misses.slice(0, 25)) console.log(m);
376
+ if (misses.length > 25) console.log(` ... and ${misses.length - 25} more`);
377
+ }
378
+ console.log('');
379
+ }).catch(console.error);
380
+
276
381
  } else if (command === '--help' || command === '-h') {
277
382
  // ─── Help ──────────────────────────────────────────────────────
278
383
  console.log('');
@@ -289,6 +394,10 @@ if (command === 'init') {
289
394
  console.log(' npx crbro-memory miner-status Check auto-miner status');
290
395
  console.log(' npx crbro-memory remove-miner Remove auto-miner');
291
396
  console.log('');
397
+ console.log(' Search:');
398
+ console.log(' npx crbro-memory reindex Rebuild the search index');
399
+ console.log(' npx crbro-memory eval Measure retrieval against .crbro/.eval/queries.json');
400
+ console.log('');
292
401
  console.log(' Server:');
293
402
  console.log(' npx crbro-memory Start MCP server (stdio)');
294
403
  console.log('');
@@ -16,7 +16,10 @@ export declare class BrainPaths {
16
16
  activeContext(): string;
17
17
  hotTopics(): string;
18
18
  globalMap(): string;
19
+ /** Pre-v2 index. Kept only so the migration can delete it. */
19
20
  searchIndex(): string;
21
+ /** Chunk-level index (v2+). Separate filename so an old index is never loaded. */
22
+ chunksIndex(): string;
20
23
  }
21
24
  export declare class Brain {
22
25
  private manifest;
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/engine/brain.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAoC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAQnH,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,CAAC,EAAE,MAAM;IAW5B,QAAQ,IAAI,MAAM;IAIlB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI1B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI3B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI3B,aAAa,IAAI,MAAM;IAIvB,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;CAGtB;AAID,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAyB;IACzC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;gBAEf,OAAO,CAAC,EAAE,MAAM;IAI5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC;IAkDrC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAmDjC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAUtC;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA4CpD"}
1
+ {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/engine/brain.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAoC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAQnH,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,CAAC,EAAE,MAAM;IAW5B,QAAQ,IAAI,MAAM;IAIlB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI1B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI3B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAI3B,aAAa,IAAI,MAAM;IAIvB,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAInB,8DAA8D;IAC9D,WAAW,IAAI,MAAM;IAIrB,kFAAkF;IAClF,WAAW,IAAI,MAAM;CAGtB;AAID,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAyB;IACzC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;gBAEf,OAAO,CAAC,EAAE,MAAM;IAI5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC;IAkDrC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAgEjC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAUtC;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA4CpD"}
@@ -53,9 +53,14 @@ class BrainPaths {
53
53
  globalMap() {
54
54
  return node_path_1.default.join(this.prefrontal, 'global_map.json');
55
55
  }
56
+ /** Pre-v2 index. Kept only so the migration can delete it. */
56
57
  searchIndex() {
57
58
  return node_path_1.default.join(this.search, 'orama.index.json');
58
59
  }
60
+ /** Chunk-level index (v2+). Separate filename so an old index is never loaded. */
61
+ chunksIndex() {
62
+ return node_path_1.default.join(this.search, 'chunks.index.json');
63
+ }
59
64
  }
60
65
  exports.BrainPaths = BrainPaths;
61
66
  // ─── Brain Manager ───────────────────────────────────────────────
@@ -144,6 +149,11 @@ class Brain {
144
149
  const activeContext = await (0, fs_js_1.readJSON)(this.paths.activeContext());
145
150
  // Load active protocols
146
151
  const activeProtocols = await this.loadProtocols();
152
+ // Pending items, split into what is open and what was just closed.
153
+ const openItems = (activeContext?.pending_tasks || []).map(t => typeof t === 'string'
154
+ ? { id: '', text: t, added: '' }
155
+ : t);
156
+ const recentlyClosed = activeContext?.recently_closed || [];
147
157
  // Update boot timestamp
148
158
  this.manifest.last_boot = (0, fs_js_1.now)();
149
159
  await (0, fs_js_1.writeJSON)(this.paths.manifest(), this.manifest);
@@ -156,7 +166,11 @@ class Brain {
156
166
  last_session: activeContext?.last_session || null,
157
167
  active_context: activeContext,
158
168
  active_protocols: activeProtocols,
159
- message: `CRBRO boot complete. ${this.manifest.total_neurons} neurons, ${this.manifest.total_synapses} synapses, ${this.manifest.total_sessions} sessions. ${activeProtocols.length} active protocol(s).`,
169
+ open_items: openItems,
170
+ recently_closed: recentlyClosed,
171
+ message: `CRBRO boot complete. ${this.manifest.total_neurons} neurons, ${this.manifest.total_synapses} synapses, ` +
172
+ `${this.manifest.total_sessions} sessions. ${activeProtocols.length} active protocol(s). ` +
173
+ `${openItems.length} open item(s), ${recentlyClosed.length} recently closed.`,
160
174
  };
161
175
  }
162
176
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/engine/brain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/engine/brain.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,gEAAgE;;;;;;AAEhE,0DAA6B;AAC7B,qCAAyC;AACzC,0CAAsE;AAGtE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC7H,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,oEAAoE;AAEpE,MAAa,UAAU;IACZ,IAAI,CAAS;IACb,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,WAAW,CAAS;IACpB,UAAU,CAAS;IACnB,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,OAAO,CAAS;IAEzB,YAAY,OAAgB;QAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,SAAS,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,QAAQ;QACN,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,aAAa;QACX,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IAED,SAAS;QACP,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACvD,CAAC;IAED,SAAS;QACP,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACvD,CAAC;IAED,8DAA8D;IAC9D,WAAW;QACT,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACpD,CAAC;IAED,kFAAkF;IAClF,WAAW;QACT,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,CAAC;CACF;AA1DD,gCA0DC;AAED,oEAAoE;AAEpE,MAAa,KAAK;IACR,QAAQ,GAAoB,IAAI,CAAC;IAChC,KAAK,CAAa;IAE3B,YAAY,OAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,qBAAqB;QACrB,MAAM,IAAI,GAAG;YACX,IAAI,CAAC,KAAK,CAAC,MAAM;YACjB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACnB,IAAI,CAAC,KAAK,CAAC,WAAW;YACtB,IAAI,CAAC,KAAK,CAAC,UAAU;YACrB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM;YACjB,IAAI,CAAC,KAAK,CAAC,OAAO;SACnB,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,kBAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,kBAAkB;QAClB,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,IAAA,WAAG,GAAE;YACd,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC3B,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,IAAI;YACf,kBAAkB,EAAE,IAAI;SACzB,CAAC;QAEF,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,gCAAgC;QAChC,MAAM,YAAY,GAAkB;YAClC,YAAY,EAAE,EAAE;YAChB,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,IAAA,WAAG,GAAE;SACpB,CAAC;QACF,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;QAE1D,MAAM,cAAc,GAAc;YAChC,MAAM,EAAE,EAAE;YACV,iBAAiB,EAAE,IAAA,WAAG,GAAE;SACzB,CAAC;QACF,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;QAExD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,OAAO;gBACL,MAAM,EAAE,aAAa;gBACrB,aAAa,EAAE,CAAC;gBAChB,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,CAAC;gBACjB,UAAU,EAAE,EAAE;gBACd,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,EAAE;gBACpB,OAAO,EAAE,8BAA8B,IAAI,CAAC,KAAK,CAAC,IAAI,4BAA4B;aACnF,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAA,gBAAQ,EAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAG,MAAM,IAAA,gBAAQ,EAAY,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAEpE,sBAAsB;QACtB,MAAM,aAAa,GAAG,MAAM,IAAA,gBAAQ,EAAgB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;QAEhF,wBAAwB;QACxB,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAEnD,mEAAmE;QACnE,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC7D,OAAO,CAAC,KAAK,QAAQ;YACnB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YAChC,CAAC,CAAC,CAAC,CACN,CAAC;QACF,MAAM,cAAc,GAAG,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC;QAE5D,wBAAwB;QACxB,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAA,WAAG,GAAE,CAAC;QAChC,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtD,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc;YAC5C,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc;YAC5C,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,EAAE;YACnC,YAAY,EAAE,aAAa,EAAE,YAAY,IAAI,IAAI;YACjD,cAAc,EAAE,aAAa;YAC7B,gBAAgB,EAAE,eAAe;YACjC,UAAU,EAAE,SAAS;YACrB,eAAe,EAAE,cAAc;YAC/B,OAAO,EACL,wBAAwB,IAAI,CAAC,QAAQ,CAAC,aAAa,aAAa,IAAI,CAAC,QAAQ,CAAC,cAAc,aAAa;gBACzG,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,cAAc,eAAe,CAAC,MAAM,uBAAuB;gBAC1F,GAAG,SAAS,CAAC,MAAM,kBAAkB,cAAc,CAAC,MAAM,mBAAmB;SAChF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAA,gBAAQ,EAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAA0B;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACpC,MAAM,SAAS,GAAwB,EAAE,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAEvE,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAQ,EAAS,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,MAAM;oBAAE,SAAS;gBAEtB,mDAAmD;gBACnD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvE,sDAAsD;gBACtD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAE9D,oDAAoD;gBACpD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK;qBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAChB,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEhB,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;oBACxB,SAAS,CAAC,IAAI,CAAC;wBACb,EAAE,EAAE,MAAM,CAAC,EAAE;wBACb,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,QAAQ;wBACR,YAAY;wBACZ,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;QAED,mCAAmC;QACnC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA1MD,sBA0MC"}
@@ -1,8 +1,18 @@
1
1
  import type { Brain } from './brain.js';
2
- import type { Neuron, NeuronType } from '../types/index.js';
2
+ import type { Neuron, NeuronType, FactStatus } from '../types/index.js';
3
+ export type Indexer = (neuron: Neuron) => Promise<void> | void;
3
4
  export declare class Cortex {
4
5
  private brain;
6
+ /**
7
+ * Optional hook invoked after every write. Wiring it here β€” rather than
8
+ * calling the search engine from each caller β€” is what guarantees the miner
9
+ * path gets indexed too. Before this, the miner wrote straight to disk and
10
+ * 91% of the brain never reached the index.
11
+ */
12
+ private indexer;
5
13
  constructor(brain: Brain);
14
+ setIndexer(indexer: Indexer | null): void;
15
+ private reindex;
6
16
  /**
7
17
  * Get a neuron by ID.
8
18
  */
@@ -12,27 +22,71 @@ export declare class Cortex {
12
22
  */
13
23
  peek(id: string): Promise<Neuron | null>;
14
24
  /**
15
- * Find a neuron by name (fuzzy match against existing neurons).
16
- * Returns the best match or null.
25
+ * Find a neuron by name.
26
+ *
27
+ * Returns null rather than guessing. That is the point: the previous
28
+ * implementation fell back to substring containment in either direction,
29
+ * which routed "Coches Chinos" into
30
+ * `project_walkthrough_skill_articulo_coches_chinos_primera_publicacin`
31
+ * and "SEO" into `process_walkthrough_creacin_de_4_2_pendientes...`.
32
+ * Knowledge written into the wrong neuron is recalled attributed to the
33
+ * wrong neuron, and no amount of index tuning repairs that. A wrong guess
34
+ * is worse than a new neuron.
17
35
  */
18
36
  findByName(name: string): Promise<Neuron | null>;
19
37
  /**
20
38
  * Create a new neuron.
39
+ * Refuses to clobber: two different names can slugify to the same id, and
40
+ * the old code wrote straight over the existing file, losing every fact in it.
21
41
  */
22
42
  create(name: string, type: NeuronType, domain: string, summary?: string): Promise<Neuron>;
23
43
  /**
24
- * Learn β€” add a fact, decision, or pattern to a neuron.
25
- * If the neuron doesn't exist, creates it first.
44
+ * Learn β€” add a fact, decision, pattern or preference to a neuron.
45
+ * Creates the neuron if it does not exist.
26
46
  */
27
47
  learn(topic: string, type: 'fact' | 'decision' | 'pattern' | 'preference', content: string, options?: {
28
48
  confidence?: number;
29
49
  domain?: string;
30
50
  rationale?: string;
31
51
  neuronType?: NeuronType;
52
+ /** Write to this exact neuron and skip name resolution entirely. */
53
+ neuronId?: string;
54
+ /** Who is writing: 'session' (default), 'miner', 'manual'. */
55
+ source?: string;
56
+ /** Ids or verbatim texts of facts this one replaces. */
57
+ supersedes?: string[];
58
+ /**
59
+ * Create the neuron when the topic is unknown. Default true.
60
+ * The miner passes false: an automated pass guessing at topic names is
61
+ * how a brain ends up with a thousand neurons called things like
62
+ * `lang_juego_billar_8_ball`, each of them shorter -- and therefore
63
+ * easier to retrieve -- than the knowledge that matters.
64
+ */
65
+ createIfMissing?: boolean;
66
+ }): Promise<{
67
+ neuron: Neuron | null;
68
+ action: 'created' | 'updated' | 'skipped';
69
+ superseded: number;
70
+ }>;
71
+ /**
72
+ * Mark facts as no longer current.
73
+ *
74
+ * `superseded` β€” a newer fact replaces it.
75
+ * `retracted` β€” it was never true.
76
+ *
77
+ * Facts are matched by id, and failing that by verbatim text, because the
78
+ * caller usually has the text in front of it and not the hash.
79
+ */
80
+ revise(neuronRef: string, targets: string[], options?: {
81
+ status?: FactStatus;
82
+ note?: string;
83
+ replacedBy?: string;
32
84
  }): Promise<{
33
- neuron: Neuron;
34
- action: 'created' | 'updated';
85
+ neuron: Neuron | null;
86
+ revised: number;
35
87
  }>;
88
+ /** Flip matching facts to a non-active status. Returns how many changed. */
89
+ private retire;
36
90
  /**
37
91
  * List all neurons with optional filters.
38
92
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cortex.d.ts","sourceRoot":"","sources":["../../src/engine/cortex.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAE5E,qBAAa,MAAM;IACL,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEhC;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW7C;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9C;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBtD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B/F;;;OAGG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,EACpD,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB,GACA,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC;IAmE7D;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,UAAU,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAwCH;;OAEG;IACG,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUxE;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAajE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAI/B"}
1
+ {"version":3,"file":"cortex.d.ts","sourceRoot":"","sources":["../../src/engine/cortex.ts"],"names":[],"mappings":"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"}