@j0hanz/memdb 1.0.8 → 1.0.10
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/dist/core/database-schema.d.ts +3 -0
- package/dist/core/database-schema.d.ts.map +1 -0
- package/dist/core/database-schema.js +65 -0
- package/dist/core/database-schema.js.map +1 -0
- package/dist/core/database.d.ts +4 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +44 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/memory-create.d.ts +8 -0
- package/dist/core/memory-create.d.ts.map +1 -0
- package/dist/core/memory-create.js +34 -0
- package/dist/core/memory-create.js.map +1 -0
- package/dist/core/memory-db.d.ts +3 -0
- package/dist/core/memory-db.d.ts.map +1 -0
- package/dist/core/memory-db.js +32 -0
- package/dist/core/memory-db.js.map +1 -0
- package/dist/core/memory-read.d.ts +4 -0
- package/dist/core/memory-read.d.ts.map +1 -0
- package/dist/core/memory-read.js +14 -0
- package/dist/core/memory-read.js.map +1 -0
- package/dist/core/memory-relations.d.ts +11 -0
- package/dist/core/memory-relations.d.ts.map +1 -0
- package/dist/core/memory-relations.js +58 -0
- package/dist/core/memory-relations.js.map +1 -0
- package/dist/core/memory-search.d.ts +9 -0
- package/dist/core/memory-search.d.ts.map +1 -0
- package/dist/core/memory-search.js +17 -0
- package/dist/core/memory-search.js.map +1 -0
- package/dist/core/memory-stats.d.ts +3 -0
- package/dist/core/memory-stats.d.ts.map +1 -0
- package/dist/core/memory-stats.js +52 -0
- package/dist/core/memory-stats.js.map +1 -0
- package/dist/core/memory-updates.d.ts +11 -0
- package/dist/core/memory-updates.d.ts.map +1 -0
- package/dist/core/memory-updates.js +116 -0
- package/dist/core/memory-updates.js.map +1 -0
- package/dist/core/relation-queries.d.ts +8 -0
- package/dist/core/relation-queries.d.ts.map +1 -0
- package/dist/core/relation-queries.js +126 -0
- package/dist/core/relation-queries.js.map +1 -0
- package/dist/core/row-mappers.d.ts +7 -0
- package/dist/core/row-mappers.d.ts.map +1 -0
- package/dist/core/row-mappers.js +53 -0
- package/dist/core/row-mappers.js.map +1 -0
- package/dist/core/search-errors.d.ts +2 -0
- package/dist/core/search-errors.d.ts.map +1 -0
- package/dist/core/search-errors.js +31 -0
- package/dist/core/search-errors.js.map +1 -0
- package/dist/core/search.d.ts +13 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +88 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/sqlite.d.ts +11 -0
- package/dist/core/sqlite.d.ts.map +1 -0
- package/dist/core/sqlite.js +74 -0
- package/dist/core/sqlite.js.map +1 -0
- package/dist/core/tags.d.ts +2 -0
- package/dist/core/tags.d.ts.map +1 -0
- package/dist/core/tags.js +28 -0
- package/dist/core/tags.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +20 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/schemas/inputs.d.ts +45 -0
- package/dist/schemas/inputs.d.ts.map +1 -0
- package/dist/schemas/inputs.js +98 -0
- package/dist/schemas/inputs.js.map +1 -0
- package/dist/schemas/outputs.d.ts +10 -0
- package/dist/schemas/outputs.d.ts.map +1 -0
- package/dist/schemas/outputs.js +29 -0
- package/dist/schemas/outputs.js.map +1 -0
- package/dist/tools/definitions/memory-core.d.ts +3 -0
- package/dist/tools/definitions/memory-core.d.ts.map +1 -0
- package/dist/tools/definitions/memory-core.js +80 -0
- package/dist/tools/definitions/memory-core.js.map +1 -0
- package/dist/tools/definitions/memory-relations.d.ts +3 -0
- package/dist/tools/definitions/memory-relations.d.ts.map +1 -0
- package/dist/tools/definitions/memory-relations.js +44 -0
- package/dist/tools/definitions/memory-relations.js.map +1 -0
- package/dist/tools/definitions/memory-search.d.ts +3 -0
- package/dist/tools/definitions/memory-search.d.ts.map +1 -0
- package/dist/tools/definitions/memory-search.js +30 -0
- package/dist/tools/definitions/memory-search.js.map +1 -0
- package/dist/tools/definitions/memory-stats.d.ts +3 -0
- package/dist/tools/definitions/memory-stats.d.ts.map +1 -0
- package/dist/tools/definitions/memory-stats.js +21 -0
- package/dist/tools/definitions/memory-stats.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/tool-handlers.d.ts +4 -0
- package/dist/tools/tool-handlers.d.ts.map +1 -0
- package/dist/tools/tool-handlers.js +20 -0
- package/dist/tools/tool-handlers.js.map +1 -0
- package/dist/tools/tool-types.d.ts +15 -0
- package/dist/tools/tool-types.d.ts.map +1 -0
- package/dist/tools/tool-types.js +2 -0
- package/dist/tools/tool-types.js.map +1 -0
- package/dist/types/index.d.ts +38 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +7 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +100 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const SCHEMA_SQL = "\n PRAGMA foreign_keys = ON;\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n\n CREATE TABLE IF NOT EXISTS memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n summary TEXT,\n importance INTEGER DEFAULT 0,\n memory_type TEXT DEFAULT 'general',\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n accessed_at TEXT DEFAULT CURRENT_TIMESTAMP,\n hash TEXT UNIQUE NOT NULL\n ) STRICT;\n\n CREATE TABLE IF NOT EXISTS tags (\n memory_id INTEGER NOT NULL,\n tag TEXT NOT NULL,\n PRIMARY KEY (memory_id, tag),\n FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE\n ) STRICT;\n\n CREATE INDEX IF NOT EXISTS idx_tags_tag_memory_id ON tags(tag, memory_id);\n\n CREATE TABLE IF NOT EXISTS relationships (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_memory_id INTEGER NOT NULL,\n to_memory_id INTEGER NOT NULL,\n relation_type TEXT NOT NULL,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n FOREIGN KEY (from_memory_id) REFERENCES memories(id) ON DELETE CASCADE,\n FOREIGN KEY (to_memory_id) REFERENCES memories(id) ON DELETE CASCADE,\n UNIQUE(from_memory_id, to_memory_id, relation_type)\n ) STRICT;\n\n CREATE INDEX IF NOT EXISTS idx_relationships_to_memory_id ON relationships(to_memory_id);\n\n CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n content,\n summary,\n content_rowid='id'\n );\n\n CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memories_fts(rowid, content, summary)\n VALUES (new.id, new.content, new.summary);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n DELETE FROM memories_fts WHERE rowid = old.id;\n INSERT INTO memories_fts(rowid, content, summary)\n VALUES (new.id, new.content, new.summary);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n DELETE FROM memories_fts WHERE rowid = old.id;\n END;\n";
|
|
2
|
+
export declare const FTS_SYNC_SQL = "\n INSERT INTO memories_fts(rowid, content, summary)\n SELECT id, content, summary FROM memories\n WHERE id NOT IN (SELECT rowid FROM memories_fts);\n";
|
|
3
|
+
//# sourceMappingURL=database-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-schema.d.ts","sourceRoot":"","sources":["../../src/core/database-schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,28DA0DtB,CAAC;AAEF,eAAO,MAAM,YAAY,8JAIxB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const SCHEMA_SQL = `
|
|
2
|
+
PRAGMA foreign_keys = ON;
|
|
3
|
+
PRAGMA journal_mode = WAL;
|
|
4
|
+
PRAGMA synchronous = NORMAL;
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
7
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
8
|
+
content TEXT NOT NULL,
|
|
9
|
+
summary TEXT,
|
|
10
|
+
importance INTEGER DEFAULT 0,
|
|
11
|
+
memory_type TEXT DEFAULT 'general',
|
|
12
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
accessed_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
14
|
+
hash TEXT UNIQUE NOT NULL
|
|
15
|
+
) STRICT;
|
|
16
|
+
|
|
17
|
+
CREATE TABLE IF NOT EXISTS tags (
|
|
18
|
+
memory_id INTEGER NOT NULL,
|
|
19
|
+
tag TEXT NOT NULL,
|
|
20
|
+
PRIMARY KEY (memory_id, tag),
|
|
21
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
22
|
+
) STRICT;
|
|
23
|
+
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_tags_tag_memory_id ON tags(tag, memory_id);
|
|
25
|
+
|
|
26
|
+
CREATE TABLE IF NOT EXISTS relationships (
|
|
27
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
28
|
+
from_memory_id INTEGER NOT NULL,
|
|
29
|
+
to_memory_id INTEGER NOT NULL,
|
|
30
|
+
relation_type TEXT NOT NULL,
|
|
31
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
32
|
+
FOREIGN KEY (from_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
|
|
33
|
+
FOREIGN KEY (to_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
|
|
34
|
+
UNIQUE(from_memory_id, to_memory_id, relation_type)
|
|
35
|
+
) STRICT;
|
|
36
|
+
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_relationships_to_memory_id ON relationships(to_memory_id);
|
|
38
|
+
|
|
39
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
40
|
+
content,
|
|
41
|
+
summary,
|
|
42
|
+
content_rowid='id'
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
46
|
+
INSERT INTO memories_fts(rowid, content, summary)
|
|
47
|
+
VALUES (new.id, new.content, new.summary);
|
|
48
|
+
END;
|
|
49
|
+
|
|
50
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
51
|
+
DELETE FROM memories_fts WHERE rowid = old.id;
|
|
52
|
+
INSERT INTO memories_fts(rowid, content, summary)
|
|
53
|
+
VALUES (new.id, new.content, new.summary);
|
|
54
|
+
END;
|
|
55
|
+
|
|
56
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
57
|
+
DELETE FROM memories_fts WHERE rowid = old.id;
|
|
58
|
+
END;
|
|
59
|
+
`;
|
|
60
|
+
export const FTS_SYNC_SQL = `
|
|
61
|
+
INSERT INTO memories_fts(rowid, content, summary)
|
|
62
|
+
SELECT id, content, summary FROM memories
|
|
63
|
+
WHERE id NOT IN (SELECT rowid FROM memories_fts);
|
|
64
|
+
`;
|
|
65
|
+
//# sourceMappingURL=database-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-schema.js","sourceRoot":"","sources":["../../src/core/database-schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DzB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;CAI3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0C3C,eAAO,MAAM,EAAE,cAAgC,CAAC;AAEhD,eAAO,MAAM,OAAO,QAAO,IAG1B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
|
+
import { config } from '../utils/config.js';
|
|
5
|
+
import { FTS_SYNC_SQL, SCHEMA_SQL } from './database-schema.js';
|
|
6
|
+
const ensureDbDirectory = async (dbPath) => {
|
|
7
|
+
if (dbPath === ':memory:')
|
|
8
|
+
return;
|
|
9
|
+
await mkdir(path.dirname(dbPath), { recursive: true });
|
|
10
|
+
};
|
|
11
|
+
const isEnableDefensive = (value) => {
|
|
12
|
+
return typeof value === 'function';
|
|
13
|
+
};
|
|
14
|
+
const enableDefensiveMode = (database) => {
|
|
15
|
+
const enableDefensive = Reflect.get(database, 'enableDefensive');
|
|
16
|
+
if (!isEnableDefensive(enableDefensive))
|
|
17
|
+
return;
|
|
18
|
+
enableDefensive(true);
|
|
19
|
+
};
|
|
20
|
+
const initializeSchema = (database) => {
|
|
21
|
+
database.exec(SCHEMA_SQL);
|
|
22
|
+
database.exec(FTS_SYNC_SQL);
|
|
23
|
+
};
|
|
24
|
+
const createDatabase = (dbPath) => {
|
|
25
|
+
const database = new DatabaseSync(dbPath, { timeout: 5000 });
|
|
26
|
+
enableDefensiveMode(database);
|
|
27
|
+
initializeSchema(database);
|
|
28
|
+
return database;
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
await ensureDbDirectory(config.dbPath);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
35
|
+
console.error(`[ERROR] Failed to create database directory: ${message}`);
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
export const db = createDatabase(config.dbPath);
|
|
39
|
+
export const closeDb = () => {
|
|
40
|
+
if (!db.isOpen)
|
|
41
|
+
return;
|
|
42
|
+
db.close();
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,iBAAiB,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;IAChE,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO;IAClC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,KAAc,EACsB,EAAE;IACtC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,QAAsB,EAAQ,EAAE;IAC3D,MAAM,eAAe,GAAY,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC1E,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC;QAAE,OAAO;IAChD,eAAe,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAsB,EAAQ,EAAE;IACxD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,MAAc,EAAgB,EAAE;IACtD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,IAAI,CAAC;IACH,MAAM,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,gDAAgD,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAS,EAAE;IAChC,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,OAAO;IACvB,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MemoryInsertResult } from '../types/index.js';
|
|
2
|
+
export declare const createMemory: (input: {
|
|
3
|
+
content: string;
|
|
4
|
+
tags?: readonly string[];
|
|
5
|
+
importance?: number;
|
|
6
|
+
memoryType?: string;
|
|
7
|
+
}) => MemoryInsertResult;
|
|
8
|
+
//# sourceMappingURL=memory-create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-create.d.ts","sourceRoot":"","sources":["../../src/core/memory-create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAuC5D,eAAO,MAAM,YAAY,GAAI,OAAO;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG,kBAkBA,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { db } from './database.js';
|
|
3
|
+
import { findMemoryIdByHash, insertTags } from './memory-db.js';
|
|
4
|
+
import { toSafeInteger } from './row-mappers.js';
|
|
5
|
+
import { executeGet, withImmediateTransaction } from './sqlite.js';
|
|
6
|
+
import { normalizeTags } from './tags.js';
|
|
7
|
+
const buildHash = (content) => crypto.createHash('md5').update(content).digest('hex');
|
|
8
|
+
const stmtInsertMemory = db.prepare('INSERT OR IGNORE INTO memories (content, importance, memory_type, hash) ' +
|
|
9
|
+
'VALUES (?, ?, ?, ?) RETURNING id');
|
|
10
|
+
const resolveMemoryId = (input) => {
|
|
11
|
+
const inserted = executeGet(stmtInsertMemory, input.content, input.importance, input.memoryType, input.hash);
|
|
12
|
+
if (inserted) {
|
|
13
|
+
return { id: toSafeInteger(inserted.id, 'id'), isNew: true };
|
|
14
|
+
}
|
|
15
|
+
const id = findMemoryIdByHash(input.hash);
|
|
16
|
+
if (id === undefined) {
|
|
17
|
+
throw new Error('Failed to resolve memory id');
|
|
18
|
+
}
|
|
19
|
+
return { id, isNew: false };
|
|
20
|
+
};
|
|
21
|
+
export const createMemory = (input) => withImmediateTransaction(() => {
|
|
22
|
+
const { content, tags = [], importance = 0, memoryType = 'general', } = input;
|
|
23
|
+
const hash = buildHash(content);
|
|
24
|
+
const normalizedTags = normalizeTags(tags, 100);
|
|
25
|
+
const { id, isNew } = resolveMemoryId({
|
|
26
|
+
content,
|
|
27
|
+
importance,
|
|
28
|
+
memoryType,
|
|
29
|
+
hash,
|
|
30
|
+
});
|
|
31
|
+
insertTags(id, normalizedTags);
|
|
32
|
+
return { id, hash, isNew };
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=memory-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-create.js","sourceRoot":"","sources":["../../src/core/memory-create.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,SAAS,GAAG,CAAC,OAAe,EAAU,EAAE,CAC5C,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzD,MAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CACjC,0EAA0E;IACxE,kCAAkC,CACrC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAKxB,EAAkC,EAAE;IACnC,MAAM,QAAQ,GAAG,UAAU,CACzB,gBAAgB,EAChB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,IAAI,CACX,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAK5B,EAAsB,EAAE,CACvB,wBAAwB,CAAC,GAAG,EAAE;IAC5B,MAAM,EACJ,OAAO,EACP,IAAI,GAAG,EAAE,EACT,UAAU,GAAG,CAAC,EACd,UAAU,GAAG,SAAS,GACvB,GAAG,KAAK,CAAC;IACV,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC;QACpC,OAAO;QACP,UAAU;QACV,UAAU;QACV,IAAI;KACL,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../../src/core/memory-db.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAI1D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,EAAE,MAAM,SAAS,MAAM,EAAE,KAAG,IAKtE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { db } from './database.js';
|
|
2
|
+
import { toSafeInteger } from './row-mappers.js';
|
|
3
|
+
import { executeGet, executeRun } from './sqlite.js';
|
|
4
|
+
const stmtFindMemoryIdByHash = db.prepare('SELECT id FROM memories WHERE hash = ?');
|
|
5
|
+
const buildTagInsert = (memoryId, tags) => {
|
|
6
|
+
const params = tags.flatMap((tag) => [memoryId, tag]);
|
|
7
|
+
return { params };
|
|
8
|
+
};
|
|
9
|
+
const tagInsertStatements = [];
|
|
10
|
+
const getInsertTagsStatement = (tagCount) => {
|
|
11
|
+
const cached = tagInsertStatements[tagCount];
|
|
12
|
+
if (cached)
|
|
13
|
+
return cached;
|
|
14
|
+
const placeholders = Array.from({ length: tagCount }, () => '(?, ?)').join(', ');
|
|
15
|
+
const stmt = db.prepare(`INSERT OR IGNORE INTO tags (memory_id, tag) VALUES ${placeholders}`);
|
|
16
|
+
tagInsertStatements[tagCount] = stmt;
|
|
17
|
+
return stmt;
|
|
18
|
+
};
|
|
19
|
+
export const findMemoryIdByHash = (hash) => {
|
|
20
|
+
const row = executeGet(stmtFindMemoryIdByHash, hash);
|
|
21
|
+
if (!row)
|
|
22
|
+
return undefined;
|
|
23
|
+
return toSafeInteger(row.id, 'id');
|
|
24
|
+
};
|
|
25
|
+
export const insertTags = (memoryId, tags) => {
|
|
26
|
+
if (tags.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
const { params } = buildTagInsert(memoryId, tags);
|
|
29
|
+
const stmt = getInsertTagsStatement(tags.length);
|
|
30
|
+
executeRun(stmt, ...params);
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=memory-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../src/core/memory-db.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,aAAa,CAAC;AAEpE,MAAM,sBAAsB,GAAG,EAAE,CAAC,OAAO,CACvC,wCAAwC,CACzC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,QAAgB,EAChB,IAAuB,EACC,EAAE;IAC1B,MAAM,MAAM,GAAe,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAkC,EAAE,CAAC;AAE9D,MAAM,sBAAsB,GAAG,CAAC,QAAgB,EAAiB,EAAE;IACjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CACxE,IAAI,CACL,CAAC;IACF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,sDAAsD,YAAY,EAAE,CACrE,CAAC;IACF,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAsB,EAAE;IACrE,MAAM,GAAG,GAAG,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,IAAuB,EAAQ,EAAE;IAC5E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;AAC9B,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-read.d.ts","sourceRoot":"","sources":["../../src/core/memory-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUjE,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAGjD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,eAG3C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { db } from './database.js';
|
|
2
|
+
import { mapRowToMemory, toSafeInteger } from './row-mappers.js';
|
|
3
|
+
import { executeGet, executeRun } from './sqlite.js';
|
|
4
|
+
const stmtGetMemoryByHash = db.prepare('SELECT * FROM memories WHERE hash = ?');
|
|
5
|
+
const stmtDeleteMemoryByHash = db.prepare('DELETE FROM memories WHERE hash = ?');
|
|
6
|
+
export const getMemory = (hash) => {
|
|
7
|
+
const row = executeGet(stmtGetMemoryByHash, hash);
|
|
8
|
+
return row ? mapRowToMemory(row) : undefined;
|
|
9
|
+
};
|
|
10
|
+
export const deleteMemory = (hash) => {
|
|
11
|
+
const result = executeRun(stmtDeleteMemoryByHash, hash);
|
|
12
|
+
return { changes: toSafeInteger(result.changes, 'changes') };
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=memory-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-read.js","sourceRoot":"","sources":["../../src/core/memory-read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,mBAAmB,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;AAChF,MAAM,sBAAsB,GAAG,EAAE,CAAC,OAAO,CACvC,qCAAqC,CACtC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAsB,EAAE;IAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAmB,EAAE;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;AAC/D,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RelatedMemory, StatementResult } from '../types/index.js';
|
|
2
|
+
type RelationDirection = 'outgoing' | 'incoming' | 'both';
|
|
3
|
+
export declare const linkMemories: (fromHash: string, toHash: string, relationType: string) => StatementResult;
|
|
4
|
+
export declare const getRelated: (input: {
|
|
5
|
+
hash: string;
|
|
6
|
+
relationType?: string;
|
|
7
|
+
depth?: number;
|
|
8
|
+
direction?: RelationDirection;
|
|
9
|
+
}) => RelatedMemory[];
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=memory-relations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-relations.d.ts","sourceRoot":"","sources":["../../src/core/memory-relations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAcxE,KAAK,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAiB1D,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,cAAc,MAAM,KACnB,eAUF,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,KAAG,aAAa,EAehB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { db } from './database.js';
|
|
2
|
+
import { findMemoryIdByHash } from './memory-db.js';
|
|
3
|
+
import { deduplicateByHash, queryBothDirect, queryIncomingDirect, queryIncomingRecursive, queryOutgoingDirect, queryOutgoingRecursive, } from './relation-queries.js';
|
|
4
|
+
import { toSafeInteger } from './row-mappers.js';
|
|
5
|
+
import { executeRun } from './sqlite.js';
|
|
6
|
+
const stmtInsertRelation = db.prepare('INSERT OR IGNORE INTO relationships (from_memory_id, to_memory_id, ' +
|
|
7
|
+
'relation_type) VALUES (?, ?, ?)');
|
|
8
|
+
const resolveMaxDepth = (depth, direction) => {
|
|
9
|
+
if (direction === 'both') {
|
|
10
|
+
return Math.min(depth, 2);
|
|
11
|
+
}
|
|
12
|
+
return Math.max(1, depth);
|
|
13
|
+
};
|
|
14
|
+
export const linkMemories = (fromHash, toHash, relationType) => {
|
|
15
|
+
const fromId = findMemoryIdByHash(fromHash);
|
|
16
|
+
const toId = findMemoryIdByHash(toHash);
|
|
17
|
+
if (fromId === undefined || toId === undefined) {
|
|
18
|
+
throw new Error('One or both memories not found');
|
|
19
|
+
}
|
|
20
|
+
const result = executeRun(stmtInsertRelation, fromId, toId, relationType);
|
|
21
|
+
return { changes: toSafeInteger(result.changes, 'changes') };
|
|
22
|
+
};
|
|
23
|
+
export const getRelated = (input) => {
|
|
24
|
+
const { hash, relationType, depth = 1, direction = 'outgoing' } = input;
|
|
25
|
+
const memoryId = findMemoryIdByHash(hash);
|
|
26
|
+
if (memoryId === undefined)
|
|
27
|
+
return [];
|
|
28
|
+
const maxDepth = resolveMaxDepth(depth, direction);
|
|
29
|
+
if (maxDepth === 1) {
|
|
30
|
+
return getRelatedDirect(memoryId, relationType, direction);
|
|
31
|
+
}
|
|
32
|
+
return getRelatedRecursive({
|
|
33
|
+
memoryId,
|
|
34
|
+
relationType,
|
|
35
|
+
maxDepth,
|
|
36
|
+
direction,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const getRelatedDirect = (memoryId, relationType, direction = 'outgoing') => {
|
|
40
|
+
if (direction === 'outgoing')
|
|
41
|
+
return queryOutgoingDirect(memoryId, relationType);
|
|
42
|
+
if (direction === 'incoming')
|
|
43
|
+
return queryIncomingDirect(memoryId, relationType);
|
|
44
|
+
return queryBothDirect(memoryId, relationType);
|
|
45
|
+
};
|
|
46
|
+
const getRelatedRecursive = (input) => {
|
|
47
|
+
const { memoryId, relationType, maxDepth, direction } = input;
|
|
48
|
+
if (direction === 'outgoing') {
|
|
49
|
+
return queryOutgoingRecursive(memoryId, relationType, maxDepth);
|
|
50
|
+
}
|
|
51
|
+
if (direction === 'incoming') {
|
|
52
|
+
return queryIncomingRecursive(memoryId, relationType, maxDepth);
|
|
53
|
+
}
|
|
54
|
+
const outgoing = queryOutgoingRecursive(memoryId, relationType, maxDepth);
|
|
55
|
+
const incoming = queryIncomingRecursive(memoryId, relationType, maxDepth);
|
|
56
|
+
return deduplicateByHash([...outgoing, ...incoming]);
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=memory-relations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-relations.js","sourceRoot":"","sources":["../../src/core/memory-relations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,kBAAkB,GAAG,EAAE,CAAC,OAAO,CACnC,qEAAqE;IACnE,iCAAiC,CACpC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,KAAa,EACb,SAA4B,EACpB,EAAE;IACV,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,QAAgB,EAChB,MAAc,EACd,YAAoB,EACH,EAAE;IACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC1E,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAK1B,EAAmB,EAAE;IACpB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;IACxE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,mBAAmB,CAAC;QACzB,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,QAAgB,EAChB,YAAqB,EACrB,YAA+B,UAAU,EACxB,EAAE;IACnB,IAAI,SAAS,KAAK,UAAU;QAC1B,OAAO,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACrD,IAAI,SAAS,KAAK,UAAU;QAC1B,OAAO,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACrD,OAAO,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAK5B,EAAmB,EAAE;IACpB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC9D,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1E,OAAO,iBAAiB,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SearchResult } from '../types/index.js';
|
|
2
|
+
export declare const searchMemories: (input: {
|
|
3
|
+
query: string;
|
|
4
|
+
limit?: number;
|
|
5
|
+
tags?: readonly string[];
|
|
6
|
+
minRelevance?: number;
|
|
7
|
+
offset?: number;
|
|
8
|
+
}) => SearchResult[];
|
|
9
|
+
//# sourceMappingURL=memory-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/core/memory-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,eAAO,MAAM,cAAc,GAAI,OAAO;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,KAAG,YAAY,EAYf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { mapRowToSearchResult } from './row-mappers.js';
|
|
2
|
+
import { buildSearchQuery, executeSearch } from './search.js';
|
|
3
|
+
import { normalizeTags } from './tags.js';
|
|
4
|
+
export const searchMemories = (input) => {
|
|
5
|
+
const { query, limit = 10, tags = [], minRelevance, offset } = input;
|
|
6
|
+
const searchInput = {
|
|
7
|
+
query,
|
|
8
|
+
limit,
|
|
9
|
+
tags: normalizeTags(tags, 50),
|
|
10
|
+
...(minRelevance !== undefined ? { minRelevance } : {}),
|
|
11
|
+
...(offset !== undefined ? { offset } : {}),
|
|
12
|
+
};
|
|
13
|
+
const { sql, params } = buildSearchQuery(searchInput);
|
|
14
|
+
const rows = executeSearch(sql, params);
|
|
15
|
+
return rows.map((row) => mapRowToSearchResult(row));
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=memory-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/core/memory-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAM9B,EAAkB,EAAE;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACrE,MAAM,WAAW,GAAG;QAClB,KAAK;QACL,KAAK;QACL,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;IACF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-stats.d.ts","sourceRoot":"","sources":["../../src/core/memory-stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAkDrD,eAAO,MAAM,QAAQ,QAAO,WAgB3B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { db } from './database.js';
|
|
2
|
+
import { toSafeInteger } from './row-mappers.js';
|
|
3
|
+
import { executeAll, executeGet } from './sqlite.js';
|
|
4
|
+
const stmtMemoryCount = db.prepare('SELECT COUNT(*) as count FROM memories');
|
|
5
|
+
const stmtRelationshipCount = db.prepare('SELECT COUNT(*) as count FROM relationships');
|
|
6
|
+
const stmtTagCount = db.prepare('SELECT COUNT(DISTINCT tag) as count FROM tags');
|
|
7
|
+
const stmtMemoryTypes = db.prepare('SELECT memory_type, COUNT(*) as count FROM memories GROUP BY memory_type');
|
|
8
|
+
const stmtDateRange = db.prepare('SELECT MIN(created_at) as oldest, MAX(created_at) as newest FROM memories');
|
|
9
|
+
const buildMemoryTypes = (typeRows) => {
|
|
10
|
+
const memoryTypes = {};
|
|
11
|
+
for (const row of typeRows) {
|
|
12
|
+
const rawType = row.memory_type;
|
|
13
|
+
const typeKey = typeof rawType === 'string' ? rawType : 'unknown';
|
|
14
|
+
memoryTypes[typeKey] = toSafeInteger(row.count, 'typeCount');
|
|
15
|
+
}
|
|
16
|
+
return memoryTypes;
|
|
17
|
+
};
|
|
18
|
+
const toDateString = (value) => {
|
|
19
|
+
if (value == null)
|
|
20
|
+
return null;
|
|
21
|
+
if (typeof value === 'string')
|
|
22
|
+
return value;
|
|
23
|
+
if (typeof value === 'number')
|
|
24
|
+
return String(value);
|
|
25
|
+
return null;
|
|
26
|
+
};
|
|
27
|
+
const queryCounts = () => {
|
|
28
|
+
const memoryRow = executeGet(stmtMemoryCount);
|
|
29
|
+
const relationshipRow = executeGet(stmtRelationshipCount);
|
|
30
|
+
const tagRow = executeGet(stmtTagCount);
|
|
31
|
+
if (!memoryRow)
|
|
32
|
+
throw new Error('Failed to load memory stats');
|
|
33
|
+
if (!relationshipRow)
|
|
34
|
+
throw new Error('Failed to load relationship stats');
|
|
35
|
+
if (!tagRow)
|
|
36
|
+
throw new Error('Failed to load tag stats');
|
|
37
|
+
return { memoryRow, relationshipRow, tagRow };
|
|
38
|
+
};
|
|
39
|
+
export const getStats = () => {
|
|
40
|
+
const { memoryRow, relationshipRow, tagRow } = queryCounts();
|
|
41
|
+
const typeRows = executeAll(stmtMemoryTypes);
|
|
42
|
+
const dateRow = executeGet(stmtDateRange);
|
|
43
|
+
return {
|
|
44
|
+
memoryCount: toSafeInteger(memoryRow.count, 'memoryCount'),
|
|
45
|
+
relationshipCount: toSafeInteger(relationshipRow.count, 'relationshipCount'),
|
|
46
|
+
tagCount: toSafeInteger(tagRow.count, 'tagCount'),
|
|
47
|
+
memoryTypes: buildMemoryTypes(typeRows),
|
|
48
|
+
oldestMemory: toDateString(dateRow?.oldest),
|
|
49
|
+
newestMemory: toDateString(dateRow?.newest),
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=memory-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-stats.js","sourceRoot":"","sources":["../../src/core/memory-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MemoryUpdateResult } from '../types/index.js';
|
|
2
|
+
interface UpdateMemoryOptions {
|
|
3
|
+
importance?: number | undefined;
|
|
4
|
+
memoryType?: string | undefined;
|
|
5
|
+
tags?: readonly string[] | undefined;
|
|
6
|
+
addTags?: readonly string[] | undefined;
|
|
7
|
+
removeTags?: readonly string[] | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare const updateMemory: (hash: string, options: UpdateMemoryOptions) => MemoryUpdateResult;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=memory-updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-updates.d.ts","sourceRoot":"","sources":["../../src/core/memory-updates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AA6C5D,UAAU,mBAAmB;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC5C;AA2GD,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,EACZ,SAAS,mBAAmB,KAC3B,kBASF,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { db } from './database.js';
|
|
2
|
+
import { findMemoryIdByHash, insertTags } from './memory-db.js';
|
|
3
|
+
import { executeAll, executeRun, withImmediateTransaction, } from './sqlite.js';
|
|
4
|
+
import { normalizeTags } from './tags.js';
|
|
5
|
+
const MAX_TAGS = 100;
|
|
6
|
+
const stmtLoadTagsForMemory = db.prepare('SELECT tag FROM tags WHERE memory_id = ?');
|
|
7
|
+
const stmtDeleteTagsForMemory = db.prepare('DELETE FROM tags WHERE memory_id = ?');
|
|
8
|
+
const deleteTagsStatements = [];
|
|
9
|
+
const getDeleteTagsStatement = (tagCount) => {
|
|
10
|
+
const cached = deleteTagsStatements[tagCount];
|
|
11
|
+
if (cached)
|
|
12
|
+
return cached;
|
|
13
|
+
const placeholders = Array.from({ length: tagCount }, () => '?').join(', ');
|
|
14
|
+
const stmt = db.prepare(`DELETE FROM tags WHERE memory_id = ? AND tag IN (${placeholders})`);
|
|
15
|
+
deleteTagsStatements[tagCount] = stmt;
|
|
16
|
+
return stmt;
|
|
17
|
+
};
|
|
18
|
+
const loadTagsForMemory = (memoryId) => {
|
|
19
|
+
const rows = executeAll(stmtLoadTagsForMemory, memoryId);
|
|
20
|
+
const tags = new Set();
|
|
21
|
+
for (const row of rows) {
|
|
22
|
+
if (typeof row.tag !== 'string') {
|
|
23
|
+
throw new Error('Invalid tag');
|
|
24
|
+
}
|
|
25
|
+
tags.add(row.tag);
|
|
26
|
+
}
|
|
27
|
+
return tags;
|
|
28
|
+
};
|
|
29
|
+
const buildMetadataUpdate = (options) => {
|
|
30
|
+
const updates = [];
|
|
31
|
+
const params = [];
|
|
32
|
+
if (options.importance !== undefined) {
|
|
33
|
+
updates.push('importance = ?');
|
|
34
|
+
params.push(options.importance);
|
|
35
|
+
}
|
|
36
|
+
if (options.memoryType !== undefined) {
|
|
37
|
+
updates.push('memory_type = ?');
|
|
38
|
+
params.push(options.memoryType);
|
|
39
|
+
}
|
|
40
|
+
return { updates, params };
|
|
41
|
+
};
|
|
42
|
+
const updateMetadataFields = (memoryId, options) => {
|
|
43
|
+
const { updates, params } = buildMetadataUpdate(options);
|
|
44
|
+
if (updates.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
params.push(memoryId);
|
|
47
|
+
executeRun(db.prepare(`UPDATE memories SET ${updates.join(', ')} WHERE id = ?`), ...params);
|
|
48
|
+
};
|
|
49
|
+
const replaceTags = (memoryId, tags) => {
|
|
50
|
+
executeRun(stmtDeleteTagsForMemory, memoryId);
|
|
51
|
+
insertTags(memoryId, normalizeTags(tags, MAX_TAGS));
|
|
52
|
+
};
|
|
53
|
+
const filterTagsToInsert = (tags, removeTags) => {
|
|
54
|
+
if (removeTags.length === 0)
|
|
55
|
+
return [...tags];
|
|
56
|
+
const removeSet = new Set(removeTags);
|
|
57
|
+
return tags.filter((tag) => !removeSet.has(tag));
|
|
58
|
+
};
|
|
59
|
+
const removeTagsFromSet = (tags, tagSet) => {
|
|
60
|
+
for (const tag of tags) {
|
|
61
|
+
tagSet.delete(tag);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const enforceTagLimit = (existingTags, tagsToInsert, maxTags) => {
|
|
65
|
+
let projectedCount = existingTags.size;
|
|
66
|
+
for (const tag of tagsToInsert) {
|
|
67
|
+
if (existingTags.has(tag))
|
|
68
|
+
continue;
|
|
69
|
+
projectedCount += 1;
|
|
70
|
+
if (projectedCount > maxTags) {
|
|
71
|
+
throw new Error('Too many tags (max ' + String(maxTags) + ')');
|
|
72
|
+
}
|
|
73
|
+
existingTags.add(tag);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const addTagsToMemory = (memoryId, tags, removeTags = []) => {
|
|
77
|
+
if (tags.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
const normalizedTags = normalizeTags(tags, MAX_TAGS);
|
|
80
|
+
const tagsToInsert = filterTagsToInsert(normalizedTags, removeTags);
|
|
81
|
+
if (tagsToInsert.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const existingTags = loadTagsForMemory(memoryId);
|
|
84
|
+
removeTagsFromSet(removeTags, existingTags);
|
|
85
|
+
enforceTagLimit(existingTags, tagsToInsert, MAX_TAGS);
|
|
86
|
+
insertTags(memoryId, tagsToInsert);
|
|
87
|
+
};
|
|
88
|
+
const removeTagsFromMemory = (memoryId, tags) => {
|
|
89
|
+
if (tags.length === 0)
|
|
90
|
+
return;
|
|
91
|
+
const stmt = getDeleteTagsStatement(tags.length);
|
|
92
|
+
executeRun(stmt, memoryId, ...tags);
|
|
93
|
+
};
|
|
94
|
+
const updateTags = (memoryId, options) => {
|
|
95
|
+
if (options.tags !== undefined) {
|
|
96
|
+
replaceTags(memoryId, options.tags);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (options.addTags !== undefined) {
|
|
100
|
+
addTagsToMemory(memoryId, options.addTags, options.removeTags ?? []);
|
|
101
|
+
}
|
|
102
|
+
if (options.removeTags !== undefined) {
|
|
103
|
+
removeTagsFromMemory(memoryId, options.removeTags);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
export const updateMemory = (hash, options) => {
|
|
107
|
+
const memoryId = findMemoryIdByHash(hash);
|
|
108
|
+
if (memoryId === undefined)
|
|
109
|
+
throw new Error('Memory not found');
|
|
110
|
+
return withImmediateTransaction(() => {
|
|
111
|
+
updateMetadataFields(memoryId, options);
|
|
112
|
+
updateTags(memoryId, options);
|
|
113
|
+
return { updated: true, hash };
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=memory-updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-updates.js","sourceRoot":"","sources":["../../src/core/memory-updates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RelatedMemory } from '../types/index.js';
|
|
2
|
+
export declare const queryOutgoingDirect: (memoryId: number, relationType?: string) => RelatedMemory[];
|
|
3
|
+
export declare const queryIncomingDirect: (memoryId: number, relationType?: string) => RelatedMemory[];
|
|
4
|
+
export declare const queryBothDirect: (memoryId: number, relationType?: string) => RelatedMemory[];
|
|
5
|
+
export declare const queryOutgoingRecursive: (memoryId: number, relationType: string | undefined, maxDepth: number) => RelatedMemory[];
|
|
6
|
+
export declare const queryIncomingRecursive: (memoryId: number, relationType: string | undefined, maxDepth: number) => RelatedMemory[];
|
|
7
|
+
export declare const deduplicateByHash: (memories: RelatedMemory[]) => RelatedMemory[];
|
|
8
|
+
//# sourceMappingURL=relation-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-queries.d.ts","sourceRoot":"","sources":["../../src/core/relation-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqGvD,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,EAChB,eAAe,MAAM,KACpB,aAAa,EAIf,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,EAChB,eAAe,MAAM,KACpB,aAAa,EAIf,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,eAAe,MAAM,KACpB,aAAa,EAmBf,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAChB,cAAc,MAAM,GAAG,SAAS,EAChC,UAAU,MAAM,KACf,aAAa,EAUf,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAChB,cAAc,MAAM,GAAG,SAAS,EAChC,UAAU,MAAM,KACf,aAAa,EAUf,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,UAAU,aAAa,EAAE,KACxB,aAAa,EAWf,CAAC"}
|