cortex-mcp 1.0.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.
- package/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +293 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/config.d.ts +13 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +33 -0
- package/dist/config/config.js.map +1 -0
- package/dist/core/event-bus.d.ts +19 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +51 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/db/database.d.ts +19 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +254 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/event-log.d.ts +28 -0
- package/dist/db/event-log.d.ts.map +1 -0
- package/dist/db/event-log.js +87 -0
- package/dist/db/event-log.js.map +1 -0
- package/dist/db/memory-store.d.ts +65 -0
- package/dist/db/memory-store.d.ts.map +1 -0
- package/dist/db/memory-store.js +370 -0
- package/dist/db/memory-store.js.map +1 -0
- package/dist/embedding-worker.d.ts +3 -0
- package/dist/embedding-worker.d.ts.map +1 -0
- package/dist/embedding-worker.js +94 -0
- package/dist/embedding-worker.js.map +1 -0
- package/dist/hooks/cortex-run.d.ts +15 -0
- package/dist/hooks/cortex-run.d.ts.map +1 -0
- package/dist/hooks/cortex-run.js +148 -0
- package/dist/hooks/cortex-run.js.map +1 -0
- package/dist/hooks/git-capture.d.ts +21 -0
- package/dist/hooks/git-capture.d.ts.map +1 -0
- package/dist/hooks/git-capture.js +178 -0
- package/dist/hooks/git-capture.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +12 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +130 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp-stdio.d.ts +10 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +247 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/memory/anticipation-engine.d.ts +19 -0
- package/dist/memory/anticipation-engine.d.ts.map +1 -0
- package/dist/memory/anticipation-engine.js +76 -0
- package/dist/memory/anticipation-engine.js.map +1 -0
- package/dist/memory/attention-ranker.d.ts +19 -0
- package/dist/memory/attention-ranker.d.ts.map +1 -0
- package/dist/memory/attention-ranker.js +97 -0
- package/dist/memory/attention-ranker.js.map +1 -0
- package/dist/memory/auto-learner.d.ts +20 -0
- package/dist/memory/auto-learner.d.ts.map +1 -0
- package/dist/memory/auto-learner.js +179 -0
- package/dist/memory/auto-learner.js.map +1 -0
- package/dist/memory/confidence-decay.d.ts +22 -0
- package/dist/memory/confidence-decay.d.ts.map +1 -0
- package/dist/memory/confidence-decay.js +54 -0
- package/dist/memory/confidence-decay.js.map +1 -0
- package/dist/memory/embedding-manager.d.ts +5 -0
- package/dist/memory/embedding-manager.d.ts.map +1 -0
- package/dist/memory/embedding-manager.js +118 -0
- package/dist/memory/embedding-manager.js.map +1 -0
- package/dist/memory/export-import.d.ts +49 -0
- package/dist/memory/export-import.d.ts.map +1 -0
- package/dist/memory/export-import.js +131 -0
- package/dist/memory/export-import.js.map +1 -0
- package/dist/memory/git-memory.d.ts +15 -0
- package/dist/memory/git-memory.d.ts.map +1 -0
- package/dist/memory/git-memory.js +178 -0
- package/dist/memory/git-memory.js.map +1 -0
- package/dist/memory/learning-rate.d.ts +24 -0
- package/dist/memory/learning-rate.d.ts.map +1 -0
- package/dist/memory/learning-rate.js +95 -0
- package/dist/memory/learning-rate.js.map +1 -0
- package/dist/memory/llm-enhancer.d.ts +54 -0
- package/dist/memory/llm-enhancer.d.ts.map +1 -0
- package/dist/memory/llm-enhancer.js +270 -0
- package/dist/memory/llm-enhancer.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +5 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +37 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +14 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +156 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-decay.d.ts +10 -0
- package/dist/memory/memory-decay.d.ts.map +1 -0
- package/dist/memory/memory-decay.js +79 -0
- package/dist/memory/memory-decay.js.map +1 -0
- package/dist/memory/memory-quality.d.ts +37 -0
- package/dist/memory/memory-quality.d.ts.map +1 -0
- package/dist/memory/memory-quality.js +203 -0
- package/dist/memory/memory-quality.js.map +1 -0
- package/dist/memory/memory-ranker.d.ts +14 -0
- package/dist/memory/memory-ranker.d.ts.map +1 -0
- package/dist/memory/memory-ranker.js +68 -0
- package/dist/memory/memory-ranker.js.map +1 -0
- package/dist/memory/meta-memory.d.ts +11 -0
- package/dist/memory/meta-memory.d.ts.map +1 -0
- package/dist/memory/meta-memory.js +141 -0
- package/dist/memory/meta-memory.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +39 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +127 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/memory/temporal-engine.d.ts +25 -0
- package/dist/memory/temporal-engine.d.ts.map +1 -0
- package/dist/memory/temporal-engine.js +106 -0
- package/dist/memory/temporal-engine.js.map +1 -0
- package/dist/retrieval/hybrid-retriever.d.ts +23 -0
- package/dist/retrieval/hybrid-retriever.d.ts.map +1 -0
- package/dist/retrieval/hybrid-retriever.js +120 -0
- package/dist/retrieval/hybrid-retriever.js.map +1 -0
- package/dist/scanners/architecture-graph.d.ts +30 -0
- package/dist/scanners/architecture-graph.d.ts.map +1 -0
- package/dist/scanners/architecture-graph.js +315 -0
- package/dist/scanners/architecture-graph.js.map +1 -0
- package/dist/scanners/code-verifier.d.ts +70 -0
- package/dist/scanners/code-verifier.d.ts.map +1 -0
- package/dist/scanners/code-verifier.js +374 -0
- package/dist/scanners/code-verifier.js.map +1 -0
- package/dist/scanners/context-builder.d.ts +19 -0
- package/dist/scanners/context-builder.d.ts.map +1 -0
- package/dist/scanners/context-builder.js +102 -0
- package/dist/scanners/context-builder.js.map +1 -0
- package/dist/scanners/export-map.d.ts +22 -0
- package/dist/scanners/export-map.d.ts.map +1 -0
- package/dist/scanners/export-map.js +249 -0
- package/dist/scanners/export-map.js.map +1 -0
- package/dist/scanners/file-verifier.d.ts +22 -0
- package/dist/scanners/file-verifier.d.ts.map +1 -0
- package/dist/scanners/file-verifier.js +140 -0
- package/dist/scanners/file-verifier.js.map +1 -0
- package/dist/scanners/project-scanner.d.ts +31 -0
- package/dist/scanners/project-scanner.d.ts.map +1 -0
- package/dist/scanners/project-scanner.js +398 -0
- package/dist/scanners/project-scanner.js.map +1 -0
- package/dist/security/encryption.d.ts +15 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +116 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/feature-gate.d.ts +30 -0
- package/dist/security/feature-gate.d.ts.map +1 -0
- package/dist/security/feature-gate.js +91 -0
- package/dist/security/feature-gate.js.map +1 -0
- package/dist/security/license.d.ts +24 -0
- package/dist/security/license.d.ts.map +1 -0
- package/dist/security/license.js +168 -0
- package/dist/security/license.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +60 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/server/dashboard.d.ts +3 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +258 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/mcp-handler.d.ts +12 -0
- package/dist/server/mcp-handler.d.ts.map +1 -0
- package/dist/server/mcp-handler.js +1392 -0
- package/dist/server/mcp-handler.js.map +1 -0
- package/dist/strategies/embedders/local-minilm.d.ts +35 -0
- package/dist/strategies/embedders/local-minilm.d.ts.map +1 -0
- package/dist/strategies/embedders/local-minilm.js +176 -0
- package/dist/strategies/embedders/local-minilm.js.map +1 -0
- package/dist/types.d.ts +207 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Bus — Typed pub/sub for decoupling components.
|
|
3
|
+
*/
|
|
4
|
+
import type { BrainEvent, EventHandler } from '../types';
|
|
5
|
+
export declare class CognitiveEventBus {
|
|
6
|
+
private handlers;
|
|
7
|
+
private globalHandlers;
|
|
8
|
+
/** Subscribe to a specific event type */
|
|
9
|
+
on(eventType: string, handler: EventHandler): void;
|
|
10
|
+
/** Subscribe to ALL events */
|
|
11
|
+
onAll(handler: EventHandler): void;
|
|
12
|
+
/** Unsubscribe from a specific event type */
|
|
13
|
+
off(eventType: string, handler: EventHandler): void;
|
|
14
|
+
/** Emit an event to all matching handlers */
|
|
15
|
+
emit(eventType: string, event: BrainEvent): Promise<void>;
|
|
16
|
+
/** Clear all handlers */
|
|
17
|
+
clear(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEzD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,cAAc,CAAgC;IAEtD,yCAAyC;IACzC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAOlD,8BAA8B;IAC9B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIlC,6CAA6C;IAC7C,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAInD,6CAA6C;IACvC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB/D,yBAAyB;IACzB,KAAK,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CognitiveEventBus = void 0;
|
|
4
|
+
class CognitiveEventBus {
|
|
5
|
+
handlers = new Map();
|
|
6
|
+
globalHandlers = new Set();
|
|
7
|
+
/** Subscribe to a specific event type */
|
|
8
|
+
on(eventType, handler) {
|
|
9
|
+
if (!this.handlers.has(eventType)) {
|
|
10
|
+
this.handlers.set(eventType, new Set());
|
|
11
|
+
}
|
|
12
|
+
this.handlers.get(eventType).add(handler);
|
|
13
|
+
}
|
|
14
|
+
/** Subscribe to ALL events */
|
|
15
|
+
onAll(handler) {
|
|
16
|
+
this.globalHandlers.add(handler);
|
|
17
|
+
}
|
|
18
|
+
/** Unsubscribe from a specific event type */
|
|
19
|
+
off(eventType, handler) {
|
|
20
|
+
this.handlers.get(eventType)?.delete(handler);
|
|
21
|
+
}
|
|
22
|
+
/** Emit an event to all matching handlers */
|
|
23
|
+
async emit(eventType, event) {
|
|
24
|
+
const typeHandlers = this.handlers.get(eventType);
|
|
25
|
+
const promises = [];
|
|
26
|
+
if (typeHandlers) {
|
|
27
|
+
for (const handler of typeHandlers) {
|
|
28
|
+
const result = handler(event);
|
|
29
|
+
if (result instanceof Promise) {
|
|
30
|
+
promises.push(result);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const handler of this.globalHandlers) {
|
|
35
|
+
const result = handler(event);
|
|
36
|
+
if (result instanceof Promise) {
|
|
37
|
+
promises.push(result);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (promises.length > 0) {
|
|
41
|
+
await Promise.allSettled(promises);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Clear all handlers */
|
|
45
|
+
clear() {
|
|
46
|
+
this.handlers.clear();
|
|
47
|
+
this.globalHandlers.clear();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.CognitiveEventBus = CognitiveEventBus;
|
|
51
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":";;;AAKA,MAAa,iBAAiB;IAClB,QAAQ,GAAmC,IAAI,GAAG,EAAE,CAAC;IACrD,cAAc,GAAsB,IAAI,GAAG,EAAE,CAAC;IAEtD,yCAAyC;IACzC,EAAE,CAAC,SAAiB,EAAE,OAAqB;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,OAAqB;QACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,6CAA6C;IAC7C,GAAG,CAAC,SAAiB,EAAE,OAAqB;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,KAAiB;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,IAAI,YAAY,EAAE,CAAC;YACf,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1B,CAAC;YACL,CAAC;QACL,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACJ;AArDD,8CAqDC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SqliteDatabase } from '../types';
|
|
2
|
+
export declare class CognitiveDatabase {
|
|
3
|
+
private db;
|
|
4
|
+
private _dbPath;
|
|
5
|
+
constructor(storagePath: string);
|
|
6
|
+
private initialize;
|
|
7
|
+
private migrate;
|
|
8
|
+
/** Get the raw database connection for direct queries */
|
|
9
|
+
get connection(): SqliteDatabase;
|
|
10
|
+
/** Get database file path */
|
|
11
|
+
get dbPath(): string;
|
|
12
|
+
/** Get database size in bytes */
|
|
13
|
+
get sizeBytes(): number;
|
|
14
|
+
/** Checkpoint WAL to main database */
|
|
15
|
+
checkpoint(): void;
|
|
16
|
+
/** Close the database connection */
|
|
17
|
+
close(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA0I/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,MAAM;IAiB/B,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,OAAO;IAMf,yDAAyD;IACzD,IAAI,UAAU,IAAI,cAAc,CAE/B;IAED,6BAA6B;IAC7B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,iCAAiC;IACjC,IAAI,SAAS,IAAI,MAAM,CAOtB;IAED,sCAAsC;IACtC,UAAU,IAAI,IAAI;IAIlB,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CognitiveDatabase = void 0;
|
|
40
|
+
/**
|
|
41
|
+
* Database — Single SQLite database with all schemas.
|
|
42
|
+
* WAL mode for concurrent reads/writes.
|
|
43
|
+
*/
|
|
44
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const SCHEMA_VERSION = 1;
|
|
48
|
+
const SCHEMA_SQL = `
|
|
49
|
+
-- ═══ SETTINGS ═══
|
|
50
|
+
PRAGMA journal_mode=WAL;
|
|
51
|
+
PRAGMA synchronous=NORMAL;
|
|
52
|
+
PRAGMA cache_size=-64000;
|
|
53
|
+
PRAGMA temp_store=MEMORY;
|
|
54
|
+
PRAGMA foreign_keys=ON;
|
|
55
|
+
|
|
56
|
+
-- ═══ SCHEMA VERSION ═══
|
|
57
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
58
|
+
version INTEGER PRIMARY KEY
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
-- ═══ EVENT LOG (immutable) ═══
|
|
62
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
63
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
64
|
+
event_type TEXT NOT NULL,
|
|
65
|
+
source TEXT NOT NULL,
|
|
66
|
+
content TEXT NOT NULL,
|
|
67
|
+
diff TEXT,
|
|
68
|
+
file TEXT,
|
|
69
|
+
metadata TEXT,
|
|
70
|
+
timestamp INTEGER NOT NULL,
|
|
71
|
+
processed INTEGER DEFAULT 0
|
|
72
|
+
);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_events_unprocessed ON events(processed) WHERE processed = 0;
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_events_ts ON events(timestamp DESC);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_events_file ON events(file) WHERE file IS NOT NULL;
|
|
76
|
+
|
|
77
|
+
-- ═══ MEMORY UNITS (projection from events) ═══
|
|
78
|
+
CREATE TABLE IF NOT EXISTS memory_units (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
type TEXT NOT NULL,
|
|
81
|
+
intent TEXT NOT NULL,
|
|
82
|
+
action TEXT NOT NULL,
|
|
83
|
+
reason TEXT,
|
|
84
|
+
impact TEXT,
|
|
85
|
+
outcome TEXT DEFAULT 'unknown',
|
|
86
|
+
related_files TEXT,
|
|
87
|
+
code_snippet TEXT,
|
|
88
|
+
tags TEXT,
|
|
89
|
+
timestamp INTEGER NOT NULL,
|
|
90
|
+
confidence REAL DEFAULT 0.5,
|
|
91
|
+
importance REAL DEFAULT 0.5,
|
|
92
|
+
access_count INTEGER DEFAULT 0,
|
|
93
|
+
last_accessed INTEGER,
|
|
94
|
+
superseded_by TEXT,
|
|
95
|
+
is_active INTEGER DEFAULT 1,
|
|
96
|
+
source_event_id INTEGER,
|
|
97
|
+
created_at INTEGER NOT NULL
|
|
98
|
+
);
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_mu_active ON memory_units(is_active, timestamp DESC);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_mu_type ON memory_units(type) WHERE is_active = 1;
|
|
101
|
+
|
|
102
|
+
-- ═══ FULL-TEXT SEARCH ═══
|
|
103
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
|
|
104
|
+
id UNINDEXED, intent, action, reason, impact, tags,
|
|
105
|
+
content='memory_units', content_rowid='rowid',
|
|
106
|
+
tokenize='porter unicode61'
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
-- FTS triggers for auto-sync
|
|
110
|
+
CREATE TRIGGER IF NOT EXISTS memory_fts_insert AFTER INSERT ON memory_units BEGIN
|
|
111
|
+
INSERT INTO memory_fts(rowid, id, intent, action, reason, impact, tags)
|
|
112
|
+
VALUES (new.rowid, new.id, new.intent, new.action, new.reason, new.impact, new.tags);
|
|
113
|
+
END;
|
|
114
|
+
|
|
115
|
+
CREATE TRIGGER IF NOT EXISTS memory_fts_delete AFTER DELETE ON memory_units BEGIN
|
|
116
|
+
INSERT INTO memory_fts(memory_fts, rowid, id, intent, action, reason, impact, tags)
|
|
117
|
+
VALUES ('delete', old.rowid, old.id, old.intent, old.action, old.reason, old.impact, old.tags);
|
|
118
|
+
END;
|
|
119
|
+
|
|
120
|
+
CREATE TRIGGER IF NOT EXISTS memory_fts_update AFTER UPDATE ON memory_units BEGIN
|
|
121
|
+
INSERT INTO memory_fts(memory_fts, rowid, id, intent, action, reason, impact, tags)
|
|
122
|
+
VALUES ('delete', old.rowid, old.id, old.intent, old.action, old.reason, old.impact, old.tags);
|
|
123
|
+
INSERT INTO memory_fts(rowid, id, intent, action, reason, impact, tags)
|
|
124
|
+
VALUES (new.rowid, new.id, new.intent, new.action, new.reason, new.impact, new.tags);
|
|
125
|
+
END;
|
|
126
|
+
|
|
127
|
+
-- ═══ GRAPH EDGES ═══
|
|
128
|
+
CREATE TABLE IF NOT EXISTS edges (
|
|
129
|
+
source_id TEXT NOT NULL,
|
|
130
|
+
target_id TEXT NOT NULL,
|
|
131
|
+
relation TEXT NOT NULL,
|
|
132
|
+
weight REAL DEFAULT 1.0,
|
|
133
|
+
timestamp INTEGER NOT NULL,
|
|
134
|
+
PRIMARY KEY (source_id, target_id, relation)
|
|
135
|
+
);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source_id);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target_id);
|
|
138
|
+
|
|
139
|
+
-- ═══ USER SIGNALS (learning) ═══
|
|
140
|
+
CREATE TABLE IF NOT EXISTS user_signals (
|
|
141
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
142
|
+
memory_id TEXT NOT NULL,
|
|
143
|
+
signal TEXT NOT NULL,
|
|
144
|
+
correction TEXT,
|
|
145
|
+
timestamp INTEGER NOT NULL
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
-- ═══ RETRIEVAL FEEDBACK ═══
|
|
149
|
+
CREATE TABLE IF NOT EXISTS feedback_log (
|
|
150
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
151
|
+
memory_id TEXT NOT NULL,
|
|
152
|
+
query_hash TEXT NOT NULL,
|
|
153
|
+
query_type TEXT,
|
|
154
|
+
search_method TEXT,
|
|
155
|
+
was_useful INTEGER,
|
|
156
|
+
timestamp INTEGER NOT NULL
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
-- ═══ PROJECT IDENTITY ═══
|
|
160
|
+
CREATE TABLE IF NOT EXISTS identity (
|
|
161
|
+
key TEXT PRIMARY KEY,
|
|
162
|
+
content TEXT NOT NULL,
|
|
163
|
+
updated_at INTEGER NOT NULL
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
-- ═══ DAILY SUMMARIES ═══
|
|
167
|
+
CREATE TABLE IF NOT EXISTS daily_summaries (
|
|
168
|
+
date TEXT PRIMARY KEY,
|
|
169
|
+
summary TEXT NOT NULL,
|
|
170
|
+
created_at INTEGER NOT NULL
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
-- ═══ ADAPTIVE CONFIG ═══
|
|
174
|
+
CREATE TABLE IF NOT EXISTS adaptive_config (
|
|
175
|
+
key TEXT PRIMARY KEY,
|
|
176
|
+
value TEXT NOT NULL,
|
|
177
|
+
default_value TEXT NOT NULL,
|
|
178
|
+
updated_at INTEGER NOT NULL
|
|
179
|
+
);
|
|
180
|
+
`;
|
|
181
|
+
class CognitiveDatabase {
|
|
182
|
+
db;
|
|
183
|
+
_dbPath;
|
|
184
|
+
constructor(storagePath) {
|
|
185
|
+
const dataDir = path.join(storagePath, 'data');
|
|
186
|
+
if (!fs.existsSync(dataDir)) {
|
|
187
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
188
|
+
}
|
|
189
|
+
this._dbPath = path.join(dataDir, 'cognitive.db');
|
|
190
|
+
// Support for pkg (standalone binaries) where native module is next to executable
|
|
191
|
+
const nativeBinding = process.pkg
|
|
192
|
+
? path.join(path.dirname(process.execPath), 'better_sqlite3.node')
|
|
193
|
+
: undefined;
|
|
194
|
+
this.db = new better_sqlite3_1.default(this._dbPath, { nativeBinding });
|
|
195
|
+
this.initialize();
|
|
196
|
+
}
|
|
197
|
+
initialize() {
|
|
198
|
+
// Execute pragmas first (they can't be in a transaction)
|
|
199
|
+
this.db.pragma('journal_mode=WAL');
|
|
200
|
+
this.db.pragma('synchronous=NORMAL');
|
|
201
|
+
this.db.pragma('cache_size=-64000');
|
|
202
|
+
this.db.pragma('temp_store=MEMORY');
|
|
203
|
+
this.db.pragma('foreign_keys=ON');
|
|
204
|
+
// Check schema version
|
|
205
|
+
const hasVersionTable = this.db
|
|
206
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='schema_version'")
|
|
207
|
+
.get();
|
|
208
|
+
if (!hasVersionTable) {
|
|
209
|
+
// First time — create all tables
|
|
210
|
+
this.db.exec(SCHEMA_SQL);
|
|
211
|
+
this.db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(SCHEMA_VERSION);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const row = this.db.prepare('SELECT version FROM schema_version LIMIT 1').get();
|
|
215
|
+
if (row && row.version < SCHEMA_VERSION) {
|
|
216
|
+
this.migrate(row.version);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
migrate(fromVersion) {
|
|
221
|
+
// Future migrations go here
|
|
222
|
+
// if (fromVersion < 2) { ... }
|
|
223
|
+
this.db.prepare('UPDATE schema_version SET version = ?').run(SCHEMA_VERSION);
|
|
224
|
+
}
|
|
225
|
+
/** Get the raw database connection for direct queries */
|
|
226
|
+
get connection() {
|
|
227
|
+
return this.db;
|
|
228
|
+
}
|
|
229
|
+
/** Get database file path */
|
|
230
|
+
get dbPath() {
|
|
231
|
+
return this._dbPath;
|
|
232
|
+
}
|
|
233
|
+
/** Get database size in bytes */
|
|
234
|
+
get sizeBytes() {
|
|
235
|
+
try {
|
|
236
|
+
const stats = fs.statSync(this._dbPath);
|
|
237
|
+
return stats.size;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return 0;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/** Checkpoint WAL to main database */
|
|
244
|
+
checkpoint() {
|
|
245
|
+
this.db.pragma('wal_checkpoint(TRUNCATE)');
|
|
246
|
+
}
|
|
247
|
+
/** Close the database connection */
|
|
248
|
+
close() {
|
|
249
|
+
this.checkpoint();
|
|
250
|
+
this.db.close();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.CognitiveDatabase = CognitiveDatabase;
|
|
254
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Log — Immutable append-only event store.
|
|
3
|
+
* All brain inputs are recorded here first.
|
|
4
|
+
*/
|
|
5
|
+
import type { BrainEvent } from '../types';
|
|
6
|
+
import type { CognitiveDatabase } from './database';
|
|
7
|
+
export declare class EventLog {
|
|
8
|
+
private db;
|
|
9
|
+
private appendStmt;
|
|
10
|
+
private markProcessedStmt;
|
|
11
|
+
constructor(database: CognitiveDatabase);
|
|
12
|
+
/** Append a new event (immutable — never modified after insert) */
|
|
13
|
+
append(event: BrainEvent): number;
|
|
14
|
+
/** Append multiple events in a single transaction */
|
|
15
|
+
appendBatch(events: BrainEvent[]): number[];
|
|
16
|
+
/** Mark an event as processed */
|
|
17
|
+
markProcessed(eventId: number): void;
|
|
18
|
+
/** Get unprocessed events (oldest first) */
|
|
19
|
+
getUnprocessed(limit?: number): BrainEvent[];
|
|
20
|
+
/** Get events by file */
|
|
21
|
+
getByFile(filePath: string, limit?: number): BrainEvent[];
|
|
22
|
+
/** Get recent events */
|
|
23
|
+
getRecent(limit?: number): BrainEvent[];
|
|
24
|
+
/** Total event count */
|
|
25
|
+
count(): number;
|
|
26
|
+
private rowToEvent;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.d.ts","sourceRoot":"","sources":["../../src/db/event-log.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,UAAU,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,qBAAa,QAAQ;IACjB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,iBAAiB,CAAwC;gBAErD,QAAQ,EAAE,iBAAiB;IAavC,mEAAmE;IACnE,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IAcjC,qDAAqD;IACrD,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE;IAW3C,iCAAiC;IACjC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC,4CAA4C;IAC5C,cAAc,CAAC,KAAK,GAAE,MAAY,GAAG,UAAU,EAAE;IAQjD,yBAAyB;IACzB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAQ7D,wBAAwB;IACxB,SAAS,CAAC,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAQ3C,wBAAwB;IACxB,KAAK,IAAI,MAAM;IAKf,OAAO,CAAC,UAAU;CAarB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventLog = void 0;
|
|
4
|
+
class EventLog {
|
|
5
|
+
db;
|
|
6
|
+
appendStmt;
|
|
7
|
+
markProcessedStmt;
|
|
8
|
+
constructor(database) {
|
|
9
|
+
this.db = database.connection;
|
|
10
|
+
this.appendStmt = this.db.prepare(`
|
|
11
|
+
INSERT INTO events (event_type, source, content, diff, file, metadata, timestamp, processed)
|
|
12
|
+
VALUES (@eventType, @source, @content, @diff, @file, @metadata, @timestamp, 0)
|
|
13
|
+
`);
|
|
14
|
+
this.markProcessedStmt = this.db.prepare(`
|
|
15
|
+
UPDATE events SET processed = 1 WHERE id = ?
|
|
16
|
+
`);
|
|
17
|
+
}
|
|
18
|
+
/** Append a new event (immutable — never modified after insert) */
|
|
19
|
+
append(event) {
|
|
20
|
+
const result = this.appendStmt.run({
|
|
21
|
+
eventType: event.eventType,
|
|
22
|
+
source: event.source,
|
|
23
|
+
content: event.content,
|
|
24
|
+
diff: event.diff || null,
|
|
25
|
+
file: event.file || null,
|
|
26
|
+
metadata: event.metadata ? JSON.stringify(event.metadata) : null,
|
|
27
|
+
timestamp: event.timestamp,
|
|
28
|
+
});
|
|
29
|
+
return Number(result.lastInsertRowid);
|
|
30
|
+
}
|
|
31
|
+
/** Append multiple events in a single transaction */
|
|
32
|
+
appendBatch(events) {
|
|
33
|
+
const ids = [];
|
|
34
|
+
const tx = this.db.transaction(() => {
|
|
35
|
+
for (const event of events) {
|
|
36
|
+
ids.push(this.append(event));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
tx();
|
|
40
|
+
return ids;
|
|
41
|
+
}
|
|
42
|
+
/** Mark an event as processed */
|
|
43
|
+
markProcessed(eventId) {
|
|
44
|
+
this.markProcessedStmt.run(eventId);
|
|
45
|
+
}
|
|
46
|
+
/** Get unprocessed events (oldest first) */
|
|
47
|
+
getUnprocessed(limit = 100) {
|
|
48
|
+
const rows = this.db
|
|
49
|
+
.prepare('SELECT * FROM events WHERE processed = 0 ORDER BY timestamp ASC LIMIT ?')
|
|
50
|
+
.all(limit);
|
|
51
|
+
return rows.map(this.rowToEvent);
|
|
52
|
+
}
|
|
53
|
+
/** Get events by file */
|
|
54
|
+
getByFile(filePath, limit = 50) {
|
|
55
|
+
const rows = this.db
|
|
56
|
+
.prepare('SELECT * FROM events WHERE file = ? ORDER BY timestamp DESC LIMIT ?')
|
|
57
|
+
.all(filePath, limit);
|
|
58
|
+
return rows.map(this.rowToEvent);
|
|
59
|
+
}
|
|
60
|
+
/** Get recent events */
|
|
61
|
+
getRecent(limit = 50) {
|
|
62
|
+
const rows = this.db
|
|
63
|
+
.prepare('SELECT * FROM events ORDER BY timestamp DESC LIMIT ?')
|
|
64
|
+
.all(limit);
|
|
65
|
+
return rows.map(this.rowToEvent);
|
|
66
|
+
}
|
|
67
|
+
/** Total event count */
|
|
68
|
+
count() {
|
|
69
|
+
const row = this.db.prepare('SELECT COUNT(*) as cnt FROM events').get();
|
|
70
|
+
return row.cnt;
|
|
71
|
+
}
|
|
72
|
+
rowToEvent(row) {
|
|
73
|
+
return {
|
|
74
|
+
id: row.id,
|
|
75
|
+
eventType: row.event_type,
|
|
76
|
+
source: row.source,
|
|
77
|
+
content: row.content,
|
|
78
|
+
diff: row.diff || undefined,
|
|
79
|
+
file: row.file || undefined,
|
|
80
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
81
|
+
timestamp: row.timestamp,
|
|
82
|
+
processed: row.processed === 1,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.EventLog = EventLog;
|
|
87
|
+
//# sourceMappingURL=event-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/db/event-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { MemoryUnit, MemoryType, GraphEdge, ScoredMemory } from '../types';
|
|
2
|
+
import type { CognitiveDatabase } from './database';
|
|
3
|
+
export declare class MemoryStore {
|
|
4
|
+
private db;
|
|
5
|
+
private insertMemoryStmt;
|
|
6
|
+
private updateMemoryStmt;
|
|
7
|
+
private getMemoryStmt;
|
|
8
|
+
private deactivateStmt;
|
|
9
|
+
private touchStmt;
|
|
10
|
+
private insertEdgeStmt;
|
|
11
|
+
private insertVectorStmt;
|
|
12
|
+
private vectors;
|
|
13
|
+
constructor(database: CognitiveDatabase);
|
|
14
|
+
/** Create a new memory unit (with deduplication) */
|
|
15
|
+
add(memory: Partial<MemoryUnit> & {
|
|
16
|
+
type: MemoryType;
|
|
17
|
+
intent: string;
|
|
18
|
+
action: string;
|
|
19
|
+
}): MemoryUnit;
|
|
20
|
+
/**
|
|
21
|
+
* Find a duplicate memory by type + intent similarity.
|
|
22
|
+
* Uses word-overlap (Jaccard similarity) — no ML needed.
|
|
23
|
+
* Returns existing memory if similarity > 0.7, else undefined.
|
|
24
|
+
*/
|
|
25
|
+
private findDuplicate;
|
|
26
|
+
/** Tokenize text into lowercase words (stop-word filtered) */
|
|
27
|
+
private tokenize;
|
|
28
|
+
/** Update an existing memory */
|
|
29
|
+
update(id: string, updates: Partial<MemoryUnit>): void;
|
|
30
|
+
/** Get a memory by ID */
|
|
31
|
+
get(id: string): MemoryUnit | undefined;
|
|
32
|
+
/** Deactivate a memory (soft delete) */
|
|
33
|
+
deactivate(id: string, supersededBy?: string): void;
|
|
34
|
+
/** Record an access (for importance tracking) */
|
|
35
|
+
touch(id: string): void;
|
|
36
|
+
/** Get all active memories */
|
|
37
|
+
getActive(limit?: number): MemoryUnit[];
|
|
38
|
+
/** Get memories by type */
|
|
39
|
+
getByType(type: MemoryType, limit?: number): MemoryUnit[];
|
|
40
|
+
/** Get memories related to a file */
|
|
41
|
+
getByFile(filePath: string, limit?: number): MemoryUnit[];
|
|
42
|
+
/** Full-text search via FTS5 */
|
|
43
|
+
searchFTS(query: string, limit?: number): ScoredMemory[];
|
|
44
|
+
/** Store a vector embedding */
|
|
45
|
+
storeVector(id: string, embedding: Float32Array): void;
|
|
46
|
+
/** Search by vector similarity */
|
|
47
|
+
searchVector(queryEmbedding: Float32Array, limit?: number): ScoredMemory[];
|
|
48
|
+
private cosineSimilarity;
|
|
49
|
+
private loadVectors;
|
|
50
|
+
/** Add an edge between memories */
|
|
51
|
+
addEdge(edge: GraphEdge): void;
|
|
52
|
+
/** Get edges from a source memory */
|
|
53
|
+
getEdgesFrom(sourceId: string): GraphEdge[];
|
|
54
|
+
/** Get edges to a target memory */
|
|
55
|
+
getEdgesTo(targetId: string): GraphEdge[];
|
|
56
|
+
/** Graph traversal — find related memories within N hops */
|
|
57
|
+
getRelated(memoryId: string, maxHops?: number, limit?: number): ScoredMemory[];
|
|
58
|
+
/** Total active memories */
|
|
59
|
+
activeCount(): number;
|
|
60
|
+
/** Total memories (including inactive) */
|
|
61
|
+
totalCount(): number;
|
|
62
|
+
private rowToMemory;
|
|
63
|
+
rebuildIndex(): void;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/db/memory-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAY,EAEf,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,qBAAa,WAAW;IACpB,OAAO,CAAC,EAAE,CAAiB;IAG3B,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,gBAAgB,CAAwC;IAGhE,OAAO,CAAC,OAAO,CAAwC;gBAE3C,QAAQ,EAAE,iBAAiB;IAkEvC,oDAAoD;IACpD,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;IAuDnG;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoBrB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAUhB,gCAAgC;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAoBtD,yBAAyB;IACzB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAKvC,wCAAwC;IACxC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAInD,iDAAiD;IACjD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIvB,8BAA8B;IAC9B,SAAS,CAAC,KAAK,GAAE,MAAa,GAAG,UAAU,EAAE;IAO7C,2BAA2B;IAC3B,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,GAAE,MAAY,GAAG,UAAU,EAAE;IAO9D,qCAAqC;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAS7D,gCAAgC;IAChC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAqB5D,+BAA+B;IAC/B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI;IAMtD,kCAAkC;IAClC,YAAY,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAoB9E,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,WAAW;IAWnB,mCAAmC;IACnC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAU9B,qCAAqC;IACrC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAM3C,mCAAmC;IACnC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAMzC,4DAA4D;IAC5D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,EAAE,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAgCrF,4BAA4B;IAC5B,WAAW,IAAI,MAAM;IAOrB,0CAA0C;IAC1C,UAAU,IAAI,MAAM;IASpB,OAAO,CAAC,WAAW;IAwBZ,YAAY,IAAI,IAAI;CAU9B"}
|