mor 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -21
- package/README.md +163 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +609 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +50 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +38 -0
- package/dist/db.js +134 -0
- package/dist/db.js.map +1 -0
- package/dist/embeddings/azure-openai.d.ts +12 -0
- package/dist/embeddings/azure-openai.js +41 -0
- package/dist/embeddings/azure-openai.js.map +1 -0
- package/dist/embeddings/none.d.ts +6 -0
- package/dist/embeddings/none.js +8 -0
- package/dist/embeddings/none.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +9 -0
- package/dist/embeddings/ollama.js +28 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.js +33 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +7 -0
- package/dist/embeddings/provider.js +18 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/filter.d.ts +11 -0
- package/dist/filter.js +47 -0
- package/dist/filter.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.js +269 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +22 -0
- package/dist/memory.js +129 -0
- package/dist/memory.js.map +1 -0
- package/dist/operations.d.ts +65 -0
- package/dist/operations.js +127 -0
- package/dist/operations.js.map +1 -0
- package/dist/query.d.ts +3 -0
- package/dist/query.js +44 -0
- package/dist/query.js.map +1 -0
- package/dist/remote.d.ts +37 -0
- package/dist/remote.js +77 -0
- package/dist/remote.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.js +341 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -18
- package/.dir-locals.el +0 -6
- package/.editorconfig +0 -15
- package/.eslintrc +0 -26
- package/.npmignore +0 -32
- package/alg/dfs.js +0 -36
- package/alg/revDfs.js +0 -36
- package/cli.js +0 -106
- package/mor-core.js +0 -60
- package/mor-link.js +0 -23
- package/mor-outdated.js +0 -26
package/dist/config.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
function expandHome(p) {
|
|
4
|
+
if (p.startsWith('~/') || p === '~') {
|
|
5
|
+
return path.join(process.env.HOME ?? '', p.slice(1));
|
|
6
|
+
}
|
|
7
|
+
return p;
|
|
8
|
+
}
|
|
9
|
+
function getConfigDir() {
|
|
10
|
+
if (process.env.MOR_HOME) {
|
|
11
|
+
return expandHome(process.env.MOR_HOME);
|
|
12
|
+
}
|
|
13
|
+
return path.join(process.env.HOME ?? '', '.config', 'mor');
|
|
14
|
+
}
|
|
15
|
+
const DEFAULT_CONFIG = {
|
|
16
|
+
memoryDir: '~/.config/mor/memories',
|
|
17
|
+
dbPath: '~/.config/mor/index.db',
|
|
18
|
+
};
|
|
19
|
+
export function loadConfig() {
|
|
20
|
+
const configDir = getConfigDir();
|
|
21
|
+
const configPath = path.join(configDir, 'config.json');
|
|
22
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
23
|
+
let config;
|
|
24
|
+
if (fs.existsSync(configPath)) {
|
|
25
|
+
const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
26
|
+
config = {
|
|
27
|
+
...DEFAULT_CONFIG,
|
|
28
|
+
...raw,
|
|
29
|
+
...(raw.embedding ? { embedding: raw.embedding } : {}),
|
|
30
|
+
...(raw.server ? { server: raw.server } : {}),
|
|
31
|
+
...(raw.serve ? { serve: raw.serve } : {}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
config = { ...DEFAULT_CONFIG };
|
|
36
|
+
config.memoryDir = path.join(configDir, 'memories');
|
|
37
|
+
config.dbPath = path.join(configDir, 'index.db');
|
|
38
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
39
|
+
}
|
|
40
|
+
// Resolve paths relative to configDir when they use ~
|
|
41
|
+
config.memoryDir = expandHome(config.memoryDir);
|
|
42
|
+
config.dbPath = expandHome(config.dbPath);
|
|
43
|
+
// Ensure memory directory exists
|
|
44
|
+
fs.mkdirSync(config.memoryDir, { recursive: true });
|
|
45
|
+
return config;
|
|
46
|
+
}
|
|
47
|
+
export function isRemote(config) {
|
|
48
|
+
return !!config.server?.url;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import type { Config } from './types.js';
|
|
3
|
+
export type DB = Database.Database;
|
|
4
|
+
export declare function openDb(config: Config): DB;
|
|
5
|
+
export declare function upsertMemoryChecked(db: DB, mem: {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
tags: string[];
|
|
9
|
+
type: string;
|
|
10
|
+
repository?: string;
|
|
11
|
+
created: string;
|
|
12
|
+
updated: string;
|
|
13
|
+
content: string;
|
|
14
|
+
filePath: string;
|
|
15
|
+
contentHash: string;
|
|
16
|
+
}): void;
|
|
17
|
+
export declare function deleteMemoryFromDb(db: DB, id: string): void;
|
|
18
|
+
export declare function searchFts(db: DB, query: string, limit?: number): Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
score: number;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function getMemoryById(db: DB, id: string): {
|
|
23
|
+
file_path: string;
|
|
24
|
+
} | undefined;
|
|
25
|
+
export declare function getMemoryByPrefix(db: DB, prefix: string): {
|
|
26
|
+
file_path: string;
|
|
27
|
+
id: string;
|
|
28
|
+
} | undefined;
|
|
29
|
+
export declare function getMemoryByFilename(db: DB, filename: string): {
|
|
30
|
+
file_path: string;
|
|
31
|
+
} | undefined;
|
|
32
|
+
export declare function getAllMemoryIds(db: DB): Set<string>;
|
|
33
|
+
export declare function getContentHash(db: DB, id: string): string | undefined;
|
|
34
|
+
export declare function grepMemories(db: DB, pattern: string, limit?: number, ignoreCase?: boolean): Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
file_path: string;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function clearDb(db: DB): void;
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
const SCHEMA = `
|
|
3
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
4
|
+
id TEXT PRIMARY KEY,
|
|
5
|
+
title TEXT NOT NULL,
|
|
6
|
+
tags TEXT NOT NULL DEFAULT '',
|
|
7
|
+
type TEXT NOT NULL DEFAULT 'knowledge',
|
|
8
|
+
repository TEXT,
|
|
9
|
+
created TEXT NOT NULL,
|
|
10
|
+
updated TEXT NOT NULL,
|
|
11
|
+
content TEXT NOT NULL,
|
|
12
|
+
file_path TEXT NOT NULL UNIQUE,
|
|
13
|
+
content_hash TEXT NOT NULL
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
17
|
+
title, tags, content, content='', content_rowid='rowid',
|
|
18
|
+
tokenize='porter unicode61'
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE IF NOT EXISTS embeddings (
|
|
22
|
+
id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
23
|
+
embedding BLOB NOT NULL,
|
|
24
|
+
model TEXT NOT NULL,
|
|
25
|
+
dimensions INTEGER NOT NULL
|
|
26
|
+
);
|
|
27
|
+
`;
|
|
28
|
+
export function openDb(config) {
|
|
29
|
+
const db = new Database(config.dbPath);
|
|
30
|
+
db.pragma('journal_mode = WAL');
|
|
31
|
+
db.pragma('foreign_keys = ON');
|
|
32
|
+
db.exec(SCHEMA);
|
|
33
|
+
return db;
|
|
34
|
+
}
|
|
35
|
+
export function upsertMemoryChecked(db, mem) {
|
|
36
|
+
db.transaction(() => {
|
|
37
|
+
const existing = db
|
|
38
|
+
.prepare('SELECT rowid, title, tags, content FROM memories WHERE id = ?')
|
|
39
|
+
.get(mem.id);
|
|
40
|
+
if (existing) {
|
|
41
|
+
db.prepare("INSERT INTO memories_fts(memories_fts, rowid, title, tags, content) VALUES('delete', ?, ?, ?, ?)").run(existing.rowid, existing.title, existing.tags, existing.content);
|
|
42
|
+
}
|
|
43
|
+
const tagsStr = mem.tags.join(',');
|
|
44
|
+
db.prepare(`INSERT INTO memories (id, title, tags, type, repository, created, updated, content, file_path, content_hash)
|
|
45
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
46
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
47
|
+
title=excluded.title, tags=excluded.tags, type=excluded.type,
|
|
48
|
+
repository=excluded.repository, updated=excluded.updated,
|
|
49
|
+
content=excluded.content, file_path=excluded.file_path,
|
|
50
|
+
content_hash=excluded.content_hash`).run(mem.id, mem.title, tagsStr, mem.type, mem.repository ?? null, mem.created, mem.updated, mem.content, mem.filePath, mem.contentHash);
|
|
51
|
+
const row = db
|
|
52
|
+
.prepare('SELECT rowid FROM memories WHERE id = ?')
|
|
53
|
+
.get(mem.id);
|
|
54
|
+
db.prepare('INSERT INTO memories_fts(rowid, title, tags, content) VALUES(?, ?, ?, ?)').run(row.rowid, mem.title, tagsStr, mem.content);
|
|
55
|
+
})();
|
|
56
|
+
}
|
|
57
|
+
export function deleteMemoryFromDb(db, id) {
|
|
58
|
+
db.transaction(() => {
|
|
59
|
+
const existing = db
|
|
60
|
+
.prepare('SELECT rowid, title, tags, content FROM memories WHERE id = ?')
|
|
61
|
+
.get(id);
|
|
62
|
+
if (existing) {
|
|
63
|
+
db.prepare("INSERT INTO memories_fts(memories_fts, rowid, title, tags, content) VALUES('delete', ?, ?, ?, ?)").run(existing.rowid, existing.title, existing.tags, existing.content);
|
|
64
|
+
db.prepare('DELETE FROM memories WHERE id = ?').run(id);
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
export function searchFts(db, query, limit = 20) {
|
|
69
|
+
const rows = db
|
|
70
|
+
.prepare(`SELECT m.id, rank
|
|
71
|
+
FROM memories_fts f
|
|
72
|
+
JOIN memories m ON m.rowid = f.rowid
|
|
73
|
+
WHERE memories_fts MATCH ?
|
|
74
|
+
ORDER BY rank
|
|
75
|
+
LIMIT ?`)
|
|
76
|
+
.all(escapeFtsQuery(query), limit);
|
|
77
|
+
// rank is negative (more negative = better match), normalize to relative 0-1 score
|
|
78
|
+
if (rows.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
const best = Math.abs(rows[0].rank) || 1;
|
|
81
|
+
return rows.map((r) => ({
|
|
82
|
+
id: r.id,
|
|
83
|
+
score: Math.abs(r.rank) / best,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
function escapeFtsQuery(query) {
|
|
87
|
+
// Quote each token and join with OR for union search ranked by relevance
|
|
88
|
+
// e.g. "retry-after" → '"retry-after"', "foo bar" → '"foo" OR "bar"'
|
|
89
|
+
const tokens = query
|
|
90
|
+
.split(/\s+/)
|
|
91
|
+
.filter(Boolean)
|
|
92
|
+
.map((token) => `"${token.replace(/"/g, '""')}"`);
|
|
93
|
+
return tokens.length > 1 ? tokens.join(' OR ') : (tokens[0] ?? '');
|
|
94
|
+
}
|
|
95
|
+
function escapeLike(s) {
|
|
96
|
+
return s.replace(/[%_\\]/g, '\\$&');
|
|
97
|
+
}
|
|
98
|
+
export function getMemoryById(db, id) {
|
|
99
|
+
return db.prepare('SELECT file_path FROM memories WHERE id = ?').get(id);
|
|
100
|
+
}
|
|
101
|
+
export function getMemoryByPrefix(db, prefix) {
|
|
102
|
+
const rows = db
|
|
103
|
+
.prepare("SELECT id, file_path FROM memories WHERE id LIKE ? || '%' ESCAPE '\\'")
|
|
104
|
+
.all(escapeLike(prefix));
|
|
105
|
+
return rows.length === 1 ? rows[0] : undefined;
|
|
106
|
+
}
|
|
107
|
+
export function getMemoryByFilename(db, filename) {
|
|
108
|
+
return db
|
|
109
|
+
.prepare("SELECT file_path FROM memories WHERE file_path LIKE '%/' || ? ESCAPE '\\'")
|
|
110
|
+
.get(escapeLike(filename));
|
|
111
|
+
}
|
|
112
|
+
export function getAllMemoryIds(db) {
|
|
113
|
+
const rows = db.prepare('SELECT id FROM memories').all();
|
|
114
|
+
return new Set(rows.map((r) => r.id));
|
|
115
|
+
}
|
|
116
|
+
export function getContentHash(db, id) {
|
|
117
|
+
const row = db
|
|
118
|
+
.prepare('SELECT content_hash FROM memories WHERE id = ?')
|
|
119
|
+
.get(id);
|
|
120
|
+
return row?.content_hash;
|
|
121
|
+
}
|
|
122
|
+
export function grepMemories(db, pattern, limit = 20, ignoreCase = false) {
|
|
123
|
+
const escaped = escapeLike(pattern);
|
|
124
|
+
const sql = ignoreCase
|
|
125
|
+
? `SELECT id, file_path FROM memories WHERE (content LIKE '%' || ? || '%' ESCAPE '\\' COLLATE NOCASE) OR (title LIKE '%' || ? || '%' ESCAPE '\\' COLLATE NOCASE) LIMIT ?`
|
|
126
|
+
: `SELECT id, file_path FROM memories WHERE (content LIKE '%' || ? || '%' ESCAPE '\\') OR (title LIKE '%' || ? || '%' ESCAPE '\\') LIMIT ?`;
|
|
127
|
+
return db.prepare(sql).all(escaped, escaped, limit);
|
|
128
|
+
}
|
|
129
|
+
export function clearDb(db) {
|
|
130
|
+
db.exec('DELETE FROM embeddings');
|
|
131
|
+
db.exec('DELETE FROM memories');
|
|
132
|
+
db.exec("INSERT INTO memories_fts(memories_fts) VALUES('delete-all')");
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBd,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAM,EACN,GAWC;IAED,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,+DAA+D,CAAC;aACxE,GAAG,CAAC,GAAG,CAAC,EAAE,CAEA,CAAC;QAEd,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,OAAO,CACR,kGAAkG,CACnG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,EAAE,CAAC,OAAO,CACR;;;;;;4CAMsC,CACvC,CAAC,GAAG,CACH,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,KAAK,EACT,OAAO,EACP,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,UAAU,IAAI,IAAI,EACtB,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,WAAW,CAChB,CAAC;QAEF,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,yCAAyC,CAAC;aAClD,GAAG,CAAC,GAAG,CAAC,EAAE,CAAsB,CAAC;QACpC,EAAE,CAAC,OAAO,CACR,0EAA0E,CAC3E,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAM,EAAE,EAAU;IACnD,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,+DAA+D,CAAC;aACxE,GAAG,CAAC,EAAE,CAEI,CAAC;QAEd,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,OAAO,CACR,kGAAkG,CACnG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,EAAM,EACN,KAAa,EACb,KAAK,GAAG,EAAE;IAEV,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;eAKS,CACV;SACA,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAwC,CAAC;IAE5E,mFAAmF;IACnF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,yEAAyE;IACzE,qEAAqE;IACrE,MAAM,MAAM,GAAG,KAAK;SACjB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAM,EACN,EAAU;IAEV,OAAO,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,EAAE,CAE1D,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAM,EACN,MAAc;IAEd,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,uEAAuE,CACxE;SACA,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAGvB,CAAC;IACH,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAM,EACN,QAAgB;IAEhB,OAAO,EAAE;SACN,OAAO,CACN,2EAA2E,CAC5E;SACA,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAsC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAM;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,GAAG,EAEpD,CAAC;IACH,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAM,EAAE,EAAU;IAC/C,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,gDAAgD,CAAC;SACzD,GAAG,CAAC,EAAE,CAAyC,CAAC;IACnD,OAAO,GAAG,EAAE,YAAY,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,EAAM,EACN,OAAe,EACf,KAAK,GAAG,EAAE,EACV,UAAU,GAAG,KAAK;IAElB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,UAAU;QACpB,CAAC,CAAC,uKAAuK;QACzK,CAAC,CAAC,yIAAyI,CAAC;IAC9I,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAGhD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAM;IAC5B,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAClC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EmbeddingConfig } from '../types.js';
|
|
2
|
+
import type { EmbeddingProvider } from './provider.js';
|
|
3
|
+
export declare class AzureOpenAIProvider implements EmbeddingProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
model: string;
|
|
6
|
+
private baseUrl;
|
|
7
|
+
private deployment;
|
|
8
|
+
private apiVersion;
|
|
9
|
+
private apiKey;
|
|
10
|
+
constructor(config: EmbeddingConfig);
|
|
11
|
+
embed(text: string): Promise<number[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class AzureOpenAIProvider {
|
|
2
|
+
name = 'azure-openai';
|
|
3
|
+
model;
|
|
4
|
+
baseUrl;
|
|
5
|
+
deployment;
|
|
6
|
+
apiVersion;
|
|
7
|
+
apiKey;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.model = config.model;
|
|
10
|
+
if (!config.baseUrl)
|
|
11
|
+
throw new Error('Azure OpenAI requires baseUrl in embedding config');
|
|
12
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
13
|
+
this.deployment = config.deployment ?? config.model;
|
|
14
|
+
this.apiVersion = config.apiVersion ?? '2024-10-21';
|
|
15
|
+
this.apiKey =
|
|
16
|
+
config.apiKey ??
|
|
17
|
+
process.env.AZURE_OPENAI_API_KEY ??
|
|
18
|
+
process.env.OPENAI_API_KEY ??
|
|
19
|
+
'';
|
|
20
|
+
}
|
|
21
|
+
async embed(text) {
|
|
22
|
+
const url = `${this.baseUrl}/openai/deployments/${this.deployment}/embeddings?api-version=${this.apiVersion}`;
|
|
23
|
+
const res = await fetch(url, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
'api-key': this.apiKey,
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ input: text }),
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
throw new Error(`Azure OpenAI embedding request failed: ${res.status} ${await res.text()}`);
|
|
33
|
+
}
|
|
34
|
+
const json = (await res.json());
|
|
35
|
+
if (!json.data?.[0]?.embedding) {
|
|
36
|
+
throw new Error('Azure OpenAI returned unexpected embedding response');
|
|
37
|
+
}
|
|
38
|
+
return json.data[0].embedding;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=azure-openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai.js","sourceRoot":"","sources":["../../src/embeddings/azure-openai.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,mBAAmB;IAC9B,IAAI,GAAG,cAAc,CAAC;IACtB,KAAK,CAAS;IACN,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,UAAU,CAAS;IACnB,MAAM,CAAS;IAEvB,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,OAAO;YACjB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,YAAY,CAAC;QACpD,IAAI,CAAC,MAAM;YACT,MAAM,CAAC,MAAM;gBACb,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAChC,OAAO,CAAC,GAAG,CAAC,cAAc;gBAC1B,EAAE,CAAC;IACP,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,uBAAuB,IAAI,CAAC,UAAU,2BAA2B,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9G,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,SAAS,EAAE,IAAI,CAAC,MAAM;aACvB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,0CAA0C,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6C,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"none.js","sourceRoot":"","sources":["../../src/embeddings/none.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACvB,IAAI,GAAG,MAAM,CAAC;IACd,KAAK,GAAG,MAAM,CAAC;IAEf,KAAK,CAAC,KAAK,CAAC,KAAa;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EmbeddingConfig } from '../types.js';
|
|
2
|
+
import type { EmbeddingProvider } from './provider.js';
|
|
3
|
+
export declare class OllamaProvider implements EmbeddingProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
model: string;
|
|
6
|
+
private baseUrl;
|
|
7
|
+
constructor(config: EmbeddingConfig);
|
|
8
|
+
embed(text: string): Promise<number[]>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class OllamaProvider {
|
|
2
|
+
name = 'ollama';
|
|
3
|
+
model;
|
|
4
|
+
baseUrl;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.model = config.model;
|
|
7
|
+
this.baseUrl = (config.baseUrl ?? 'http://localhost:11434').replace(/\/$/, '');
|
|
8
|
+
}
|
|
9
|
+
async embed(text) {
|
|
10
|
+
const res = await fetch(`${this.baseUrl}/api/embeddings`, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: { 'Content-Type': 'application/json' },
|
|
13
|
+
body: JSON.stringify({
|
|
14
|
+
model: this.model,
|
|
15
|
+
prompt: text,
|
|
16
|
+
}),
|
|
17
|
+
});
|
|
18
|
+
if (!res.ok) {
|
|
19
|
+
throw new Error(`Ollama embedding request failed: ${res.status} ${await res.text()}`);
|
|
20
|
+
}
|
|
21
|
+
const json = (await res.json());
|
|
22
|
+
if (!json.embedding) {
|
|
23
|
+
throw new Error('Ollama returned unexpected embedding response');
|
|
24
|
+
}
|
|
25
|
+
return json.embedding;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IAChB,KAAK,CAAS;IACN,OAAO,CAAS;IAExB,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC,OAAO,CACjE,KAAK,EACL,EAAE,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI;aACb,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,oCAAoC,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CACrE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EmbeddingConfig } from '../types.js';
|
|
2
|
+
import type { EmbeddingProvider } from './provider.js';
|
|
3
|
+
export declare class OpenAIProvider implements EmbeddingProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
model: string;
|
|
6
|
+
private baseUrl;
|
|
7
|
+
private apiKey;
|
|
8
|
+
constructor(config: EmbeddingConfig);
|
|
9
|
+
embed(text: string): Promise<number[]>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class OpenAIProvider {
|
|
2
|
+
name = 'openai';
|
|
3
|
+
model;
|
|
4
|
+
baseUrl;
|
|
5
|
+
apiKey;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.model = config.model;
|
|
8
|
+
this.baseUrl = (config.baseUrl ?? 'https://api.openai.com/v1').replace(/\/$/, '');
|
|
9
|
+
this.apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? '';
|
|
10
|
+
}
|
|
11
|
+
async embed(text) {
|
|
12
|
+
const res = await fetch(`${this.baseUrl}/embeddings`, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
|
|
17
|
+
},
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
model: this.model,
|
|
20
|
+
input: text,
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`OpenAI embedding request failed: ${res.status} ${await res.text()}`);
|
|
25
|
+
}
|
|
26
|
+
const json = (await res.json());
|
|
27
|
+
if (!json.data?.[0]?.embedding) {
|
|
28
|
+
throw new Error('OpenAI returned unexpected embedding response');
|
|
29
|
+
}
|
|
30
|
+
return json.data[0].embedding;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IAChB,KAAK,CAAS;IACN,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2BAA2B,CAAC,CAAC,OAAO,CACpE,KAAK,EACL,EAAE,CACH,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI;aACZ,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,oCAAoC,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CACrE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6C,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AzureOpenAIProvider } from './azure-openai.js';
|
|
2
|
+
import { NoneProvider } from './none.js';
|
|
3
|
+
import { OllamaProvider } from './ollama.js';
|
|
4
|
+
import { OpenAIProvider } from './openai.js';
|
|
5
|
+
export function createProvider(config) {
|
|
6
|
+
switch (config?.provider) {
|
|
7
|
+
case 'openai':
|
|
8
|
+
return new OpenAIProvider(config);
|
|
9
|
+
case 'azure-openai':
|
|
10
|
+
return new AzureOpenAIProvider(config);
|
|
11
|
+
case 'ollama':
|
|
12
|
+
return new OllamaProvider(config);
|
|
13
|
+
case 'none':
|
|
14
|
+
default:
|
|
15
|
+
return new NoneProvider();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,MAAM,UAAU,cAAc,CAAC,MAAwB;IACrD,QAAQ,MAAM,EAAE,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,cAAc;YACjB,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,IAAI,YAAY,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/dist/filter.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { Memory, SearchResult } from './types.js';
|
|
3
|
+
export interface MemoryFilter {
|
|
4
|
+
type?: string;
|
|
5
|
+
tag?: string;
|
|
6
|
+
repo?: string;
|
|
7
|
+
ext?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function filterMemories(memories: Memory[], filter: MemoryFilter): Memory[];
|
|
10
|
+
export declare function filterResults(results: SearchResult[], filter: MemoryFilter): SearchResult[];
|
|
11
|
+
export declare function addFilterOptions(cmd: Command): Command;
|
package/dist/filter.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
function globToRegex(pattern) {
|
|
2
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
3
|
+
const withWildcards = escaped.replace(/\*/g, '.*').replace(/\?/g, '.');
|
|
4
|
+
return new RegExp(`^${withWildcards}$`, 'i');
|
|
5
|
+
}
|
|
6
|
+
function matchGlob(value, pattern) {
|
|
7
|
+
return globToRegex(pattern).test(value);
|
|
8
|
+
}
|
|
9
|
+
function matchMemory(mem, filter) {
|
|
10
|
+
if (filter.type) {
|
|
11
|
+
const types = filter.type.split(',').map((t) => t.trim());
|
|
12
|
+
if (!types.some((t) => matchGlob(mem.type, t)))
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (filter.tag) {
|
|
16
|
+
if (!mem.tags.some((tag) => matchGlob(tag, filter.tag)))
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
if (filter.repo) {
|
|
20
|
+
if (!mem.repository || !matchGlob(mem.repository, filter.repo))
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (filter.ext) {
|
|
24
|
+
const ext = filter.ext.startsWith('.') ? filter.ext : `.${filter.ext}`;
|
|
25
|
+
if (!mem.title.toLowerCase().endsWith(ext.toLowerCase()))
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
export function filterMemories(memories, filter) {
|
|
31
|
+
if (!filter.type && !filter.tag && !filter.repo && !filter.ext)
|
|
32
|
+
return memories;
|
|
33
|
+
return memories.filter((mem) => matchMemory(mem, filter));
|
|
34
|
+
}
|
|
35
|
+
export function filterResults(results, filter) {
|
|
36
|
+
if (!filter.type && !filter.tag && !filter.repo && !filter.ext)
|
|
37
|
+
return results;
|
|
38
|
+
return results.filter((r) => matchMemory(r.memory, filter));
|
|
39
|
+
}
|
|
40
|
+
export function addFilterOptions(cmd) {
|
|
41
|
+
return cmd
|
|
42
|
+
.option('--type <type>', 'Filter by memory type (comma-separated, glob)')
|
|
43
|
+
.option('--tag <pattern>', 'Filter by tag (glob)')
|
|
44
|
+
.option('--repo <pattern>', 'Filter by repository (glob)')
|
|
45
|
+
.option('--ext <ext>', 'Filter by file extension in title');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DB } from './db.js';
|
|
2
|
+
import { type EmbeddingProvider } from './embeddings/provider.js';
|
|
3
|
+
import type { Config, Memory, SearchResult } from './types.js';
|
|
4
|
+
export declare function hashContent(content: string): string;
|
|
5
|
+
/** Debounced syncIndex for read paths — skips if synced within 200ms */
|
|
6
|
+
export declare function syncIndexIfNeeded(config: Config, db: DB): void;
|
|
7
|
+
export declare function syncIndex(config: Config, db: DB): void;
|
|
8
|
+
export declare function reindex(config: Config, db: DB): Promise<void>;
|
|
9
|
+
export declare function computeAndStoreEmbedding(db: DB, provider: EmbeddingProvider, mem: Memory): Promise<void>;
|
|
10
|
+
export declare function searchAsync(config: Config, db: DB, query: string, limit?: number, provider?: EmbeddingProvider): Promise<SearchResult[]>;
|