@context-vault/core 2.17.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/capture.d.ts +21 -0
  2. package/dist/capture.d.ts.map +1 -0
  3. package/dist/capture.js +269 -0
  4. package/dist/capture.js.map +1 -0
  5. package/dist/categories.d.ts +6 -0
  6. package/dist/categories.d.ts.map +1 -0
  7. package/dist/categories.js +50 -0
  8. package/dist/categories.js.map +1 -0
  9. package/dist/config.d.ts +4 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +190 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/constants.d.ts +33 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +23 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/db.d.ts +13 -0
  18. package/dist/db.d.ts.map +1 -0
  19. package/dist/db.js +191 -0
  20. package/dist/db.js.map +1 -0
  21. package/dist/embed.d.ts +5 -0
  22. package/dist/embed.d.ts.map +1 -0
  23. package/dist/embed.js +78 -0
  24. package/dist/embed.js.map +1 -0
  25. package/dist/files.d.ts +13 -0
  26. package/dist/files.d.ts.map +1 -0
  27. package/dist/files.js +66 -0
  28. package/dist/files.js.map +1 -0
  29. package/dist/formatters.d.ts +8 -0
  30. package/dist/formatters.d.ts.map +1 -0
  31. package/dist/formatters.js +18 -0
  32. package/dist/formatters.js.map +1 -0
  33. package/dist/frontmatter.d.ts +12 -0
  34. package/dist/frontmatter.d.ts.map +1 -0
  35. package/dist/frontmatter.js +101 -0
  36. package/dist/frontmatter.js.map +1 -0
  37. package/dist/index.d.ts +10 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +297 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/ingest-url.d.ts +20 -0
  42. package/dist/ingest-url.d.ts.map +1 -0
  43. package/dist/ingest-url.js +113 -0
  44. package/dist/ingest-url.js.map +1 -0
  45. package/dist/main.d.ts +14 -0
  46. package/dist/main.d.ts.map +1 -0
  47. package/dist/main.js +25 -0
  48. package/dist/main.js.map +1 -0
  49. package/dist/search.d.ts +18 -0
  50. package/dist/search.d.ts.map +1 -0
  51. package/dist/search.js +238 -0
  52. package/dist/search.js.map +1 -0
  53. package/dist/types.d.ts +176 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +2 -0
  56. package/dist/types.js.map +1 -0
  57. package/package.json +66 -16
  58. package/src/capture.ts +308 -0
  59. package/src/categories.ts +54 -0
  60. package/src/{core/config.js → config.ts} +34 -33
  61. package/src/{constants.js → constants.ts} +6 -3
  62. package/src/db.ts +229 -0
  63. package/src/{index/embed.js → embed.ts} +10 -35
  64. package/src/{core/files.js → files.ts} +15 -20
  65. package/src/{capture/formatters.js → formatters.ts} +13 -11
  66. package/src/{core/frontmatter.js → frontmatter.ts} +26 -33
  67. package/src/index.ts +351 -0
  68. package/src/ingest-url.ts +99 -0
  69. package/src/main.ts +111 -0
  70. package/src/{retrieve/index.js → search.ts} +62 -150
  71. package/src/types.ts +166 -0
  72. package/src/capture/file-ops.js +0 -99
  73. package/src/capture/import-pipeline.js +0 -46
  74. package/src/capture/importers.js +0 -387
  75. package/src/capture/index.js +0 -250
  76. package/src/capture/ingest-url.js +0 -252
  77. package/src/consolidation/index.js +0 -112
  78. package/src/core/categories.js +0 -73
  79. package/src/core/error-log.js +0 -54
  80. package/src/core/linking.js +0 -161
  81. package/src/core/migrate-dirs.js +0 -196
  82. package/src/core/status.js +0 -350
  83. package/src/core/telemetry.js +0 -90
  84. package/src/core/temporal.js +0 -146
  85. package/src/index/db.js +0 -586
  86. package/src/index/index.js +0 -583
  87. package/src/index.js +0 -71
  88. package/src/server/helpers.js +0 -44
  89. package/src/server/tools/clear-context.js +0 -47
  90. package/src/server/tools/context-status.js +0 -182
  91. package/src/server/tools/create-snapshot.js +0 -200
  92. package/src/server/tools/delete-context.js +0 -60
  93. package/src/server/tools/get-context.js +0 -765
  94. package/src/server/tools/ingest-project.js +0 -244
  95. package/src/server/tools/ingest-url.js +0 -88
  96. package/src/server/tools/list-buckets.js +0 -116
  97. package/src/server/tools/list-context.js +0 -163
  98. package/src/server/tools/save-context.js +0 -632
  99. package/src/server/tools/session-start.js +0 -285
  100. package/src/server/tools.js +0 -172
  101. package/src/sync/sync.js +0 -235
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,+BAA+B,CAAC;AACvD,MAAM,CAAC,MAAM,OAAO,GAAG,+BAA+B,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,0BAA0B,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAC5B,iDAAiD,CAAC;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5C,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC5C,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;IACvE,gBAAgB,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;CAChC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAG1B;IACF,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;IAC/B,SAAS,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;CACpC,CAAC"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import type { PreparedStatements } from "./types.js";
3
+ export declare class NativeModuleError extends Error {
4
+ originalError: Error;
5
+ constructor(originalError: Error);
6
+ }
7
+ export declare const SCHEMA_DDL = "\n CREATE TABLE IF NOT EXISTS vault (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n category TEXT NOT NULL DEFAULT 'knowledge',\n title TEXT,\n body TEXT NOT NULL,\n meta TEXT,\n tags TEXT,\n source TEXT,\n file_path TEXT UNIQUE,\n identity_key TEXT,\n expires_at TEXT,\n superseded_by TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT,\n hit_count INTEGER DEFAULT 0,\n last_accessed_at TEXT,\n source_files TEXT,\n tier TEXT DEFAULT 'working' CHECK(tier IN ('ephemeral', 'working', 'durable')),\n related_to TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_vault_kind ON vault(kind);\n CREATE INDEX IF NOT EXISTS idx_vault_category ON vault(category);\n CREATE INDEX IF NOT EXISTS idx_vault_category_created ON vault(category, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_vault_updated ON vault(updated_at DESC);\n CREATE UNIQUE INDEX IF NOT EXISTS idx_vault_identity ON vault(kind, identity_key) WHERE identity_key IS NOT NULL AND category = 'entity';\n CREATE INDEX IF NOT EXISTS idx_vault_superseded ON vault(superseded_by) WHERE superseded_by IS NOT NULL;\n CREATE INDEX IF NOT EXISTS idx_vault_tier ON vault(tier);\n\n CREATE VIRTUAL TABLE IF NOT EXISTS vault_fts USING fts5(\n title, body, tags, kind,\n content='vault', content_rowid='rowid'\n );\n\n CREATE TRIGGER IF NOT EXISTS vault_ai AFTER INSERT ON vault BEGIN\n INSERT INTO vault_fts(rowid, title, body, tags, kind)\n VALUES (new.rowid, new.title, new.body, new.tags, new.kind);\n END;\n CREATE TRIGGER IF NOT EXISTS vault_ad AFTER DELETE ON vault BEGIN\n INSERT INTO vault_fts(vault_fts, rowid, title, body, tags, kind)\n VALUES ('delete', old.rowid, old.title, old.body, old.tags, old.kind);\n END;\n CREATE TRIGGER IF NOT EXISTS vault_au AFTER UPDATE ON vault BEGIN\n INSERT INTO vault_fts(vault_fts, rowid, title, body, tags, kind)\n VALUES ('delete', old.rowid, old.title, old.body, old.tags, old.kind);\n INSERT INTO vault_fts(rowid, title, body, tags, kind)\n VALUES (new.rowid, new.title, new.body, new.tags, new.kind);\n END;\n\n CREATE VIRTUAL TABLE IF NOT EXISTS vault_vec USING vec0(embedding float[384]);\n";
8
+ export declare function initDatabase(dbPath: string): Promise<DatabaseSync>;
9
+ export declare function prepareStatements(db: DatabaseSync): PreparedStatements;
10
+ export declare function insertVec(stmts: PreparedStatements, rowid: number, embedding: Float32Array): void;
11
+ export declare function deleteVec(stmts: PreparedStatements, rowid: number): void;
12
+ export declare function testConnection(db: DatabaseSync): boolean;
13
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,aAAa,EAAE,KAAK,CAAC;gBACT,aAAa,EAAE,KAAK;CAMjC;AAkCD,eAAO,MAAM,UAAU,szEAoDtB,CAAC;AAIF,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAsDxE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,kBAAkB,CA6CtE;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,YAAY,GACtB,IAAI,CAIN;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIxE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAOxD"}
package/dist/db.js ADDED
@@ -0,0 +1,191 @@
1
+ import { unlinkSync, copyFileSync, existsSync } from "node:fs";
2
+ import { DatabaseSync } from "node:sqlite";
3
+ export class NativeModuleError extends Error {
4
+ originalError;
5
+ constructor(originalError) {
6
+ const diagnostic = formatNativeModuleError(originalError);
7
+ super(diagnostic);
8
+ this.name = "NativeModuleError";
9
+ this.originalError = originalError;
10
+ }
11
+ }
12
+ function formatNativeModuleError(err) {
13
+ const msg = err.message || "";
14
+ return [
15
+ `sqlite-vec extension failed to load: ${msg}`,
16
+ "",
17
+ ` Running Node.js: ${process.version} (${process.execPath})`,
18
+ "",
19
+ " Fix: Reinstall context-vault:",
20
+ " npx -y context-vault@latest setup",
21
+ ].join("\n");
22
+ }
23
+ let _sqliteVec = null;
24
+ async function loadSqliteVec() {
25
+ if (_sqliteVec)
26
+ return _sqliteVec;
27
+ const vecMod = await import("sqlite-vec");
28
+ _sqliteVec = vecMod;
29
+ return _sqliteVec;
30
+ }
31
+ function runTransaction(db, fn) {
32
+ db.exec("BEGIN");
33
+ try {
34
+ fn();
35
+ db.exec("COMMIT");
36
+ }
37
+ catch (e) {
38
+ db.exec("ROLLBACK");
39
+ throw e;
40
+ }
41
+ }
42
+ export const SCHEMA_DDL = `
43
+ CREATE TABLE IF NOT EXISTS vault (
44
+ id TEXT PRIMARY KEY,
45
+ kind TEXT NOT NULL,
46
+ category TEXT NOT NULL DEFAULT 'knowledge',
47
+ title TEXT,
48
+ body TEXT NOT NULL,
49
+ meta TEXT,
50
+ tags TEXT,
51
+ source TEXT,
52
+ file_path TEXT UNIQUE,
53
+ identity_key TEXT,
54
+ expires_at TEXT,
55
+ superseded_by TEXT,
56
+ created_at TEXT DEFAULT (datetime('now')),
57
+ updated_at TEXT,
58
+ hit_count INTEGER DEFAULT 0,
59
+ last_accessed_at TEXT,
60
+ source_files TEXT,
61
+ tier TEXT DEFAULT 'working' CHECK(tier IN ('ephemeral', 'working', 'durable')),
62
+ related_to TEXT
63
+ );
64
+
65
+ CREATE INDEX IF NOT EXISTS idx_vault_kind ON vault(kind);
66
+ CREATE INDEX IF NOT EXISTS idx_vault_category ON vault(category);
67
+ CREATE INDEX IF NOT EXISTS idx_vault_category_created ON vault(category, created_at DESC);
68
+ CREATE INDEX IF NOT EXISTS idx_vault_updated ON vault(updated_at DESC);
69
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_vault_identity ON vault(kind, identity_key) WHERE identity_key IS NOT NULL AND category = 'entity';
70
+ CREATE INDEX IF NOT EXISTS idx_vault_superseded ON vault(superseded_by) WHERE superseded_by IS NOT NULL;
71
+ CREATE INDEX IF NOT EXISTS idx_vault_tier ON vault(tier);
72
+
73
+ CREATE VIRTUAL TABLE IF NOT EXISTS vault_fts USING fts5(
74
+ title, body, tags, kind,
75
+ content='vault', content_rowid='rowid'
76
+ );
77
+
78
+ CREATE TRIGGER IF NOT EXISTS vault_ai AFTER INSERT ON vault BEGIN
79
+ INSERT INTO vault_fts(rowid, title, body, tags, kind)
80
+ VALUES (new.rowid, new.title, new.body, new.tags, new.kind);
81
+ END;
82
+ CREATE TRIGGER IF NOT EXISTS vault_ad AFTER DELETE ON vault BEGIN
83
+ INSERT INTO vault_fts(vault_fts, rowid, title, body, tags, kind)
84
+ VALUES ('delete', old.rowid, old.title, old.body, old.tags, old.kind);
85
+ END;
86
+ CREATE TRIGGER IF NOT EXISTS vault_au AFTER UPDATE ON vault BEGIN
87
+ INSERT INTO vault_fts(vault_fts, rowid, title, body, tags, kind)
88
+ VALUES ('delete', old.rowid, old.title, old.body, old.tags, old.kind);
89
+ INSERT INTO vault_fts(rowid, title, body, tags, kind)
90
+ VALUES (new.rowid, new.title, new.body, new.tags, new.kind);
91
+ END;
92
+
93
+ CREATE VIRTUAL TABLE IF NOT EXISTS vault_vec USING vec0(embedding float[384]);
94
+ `;
95
+ const CURRENT_VERSION = 15;
96
+ export async function initDatabase(dbPath) {
97
+ const sqliteVec = await loadSqliteVec();
98
+ function createDb(path) {
99
+ const db = new DatabaseSync(path, { allowExtension: true });
100
+ db.exec("PRAGMA journal_mode = WAL");
101
+ db.exec("PRAGMA foreign_keys = ON");
102
+ try {
103
+ sqliteVec.load(db);
104
+ }
105
+ catch (e) {
106
+ throw new NativeModuleError(e);
107
+ }
108
+ return db;
109
+ }
110
+ const db = createDb(dbPath);
111
+ const version = db.prepare("PRAGMA user_version").get().user_version;
112
+ if (version > 0 && version < 15) {
113
+ console.error(`[context-vault] Schema v${version} is outdated. Rebuilding database...`);
114
+ const backupPath = `${dbPath}.v${version}.backup`;
115
+ try {
116
+ db.close();
117
+ if (existsSync(dbPath)) {
118
+ copyFileSync(dbPath, backupPath);
119
+ console.error(`[context-vault] Backed up old database to: ${backupPath}`);
120
+ }
121
+ }
122
+ catch (backupErr) {
123
+ console.error(`[context-vault] Warning: could not backup old database: ${backupErr.message}`);
124
+ }
125
+ unlinkSync(dbPath);
126
+ try {
127
+ unlinkSync(dbPath + "-wal");
128
+ }
129
+ catch { }
130
+ try {
131
+ unlinkSync(dbPath + "-shm");
132
+ }
133
+ catch { }
134
+ const freshDb = createDb(dbPath);
135
+ freshDb.exec(SCHEMA_DDL);
136
+ freshDb.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
137
+ return freshDb;
138
+ }
139
+ if (version < 15) {
140
+ db.exec(SCHEMA_DDL);
141
+ db.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
142
+ }
143
+ return db;
144
+ }
145
+ export function prepareStatements(db) {
146
+ try {
147
+ return {
148
+ insertEntry: db.prepare(`INSERT INTO vault (id, kind, category, title, body, meta, tags, source, file_path, identity_key, expires_at, created_at, updated_at, source_files, tier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),
149
+ updateEntry: db.prepare(`UPDATE vault SET title = ?, body = ?, meta = ?, tags = ?, source = ?, category = ?, identity_key = ?, expires_at = ?, updated_at = datetime('now') WHERE file_path = ?`),
150
+ deleteEntry: db.prepare(`DELETE FROM vault WHERE id = ?`),
151
+ getRowid: db.prepare(`SELECT rowid FROM vault WHERE id = ?`),
152
+ getRowidByPath: db.prepare(`SELECT rowid FROM vault WHERE file_path = ?`),
153
+ getEntryById: db.prepare(`SELECT * FROM vault WHERE id = ?`),
154
+ getByIdentityKey: db.prepare(`SELECT * FROM vault WHERE kind = ? AND identity_key = ?`),
155
+ upsertByIdentityKey: db.prepare(`UPDATE vault SET title = ?, body = ?, meta = ?, tags = ?, source = ?, category = ?, file_path = ?, expires_at = ?, source_files = ?, updated_at = datetime('now') WHERE kind = ? AND identity_key = ?`),
156
+ updateSourceFiles: db.prepare(`UPDATE vault SET source_files = ? WHERE id = ?`),
157
+ updateRelatedTo: db.prepare(`UPDATE vault SET related_to = ? WHERE id = ?`),
158
+ insertVecStmt: db.prepare(`INSERT INTO vault_vec (rowid, embedding) VALUES (?, ?)`),
159
+ deleteVecStmt: db.prepare(`DELETE FROM vault_vec WHERE rowid = ?`),
160
+ updateSupersededBy: db.prepare(`UPDATE vault SET superseded_by = ? WHERE id = ?`),
161
+ clearSupersededByRef: db.prepare(`UPDATE vault SET superseded_by = NULL WHERE superseded_by = ?`),
162
+ };
163
+ }
164
+ catch (e) {
165
+ throw new Error(`Failed to prepare database statements. The database may be corrupted.\n` +
166
+ `Try deleting and rebuilding: context-vault reindex\n` +
167
+ `Original error: ${e.message}`);
168
+ }
169
+ }
170
+ export function insertVec(stmts, rowid, embedding) {
171
+ const safeRowid = BigInt(rowid);
172
+ if (safeRowid < 1n)
173
+ throw new Error(`Invalid rowid: ${rowid}`);
174
+ stmts.insertVecStmt.run(safeRowid, embedding);
175
+ }
176
+ export function deleteVec(stmts, rowid) {
177
+ const safeRowid = BigInt(rowid);
178
+ if (safeRowid < 1n)
179
+ throw new Error(`Invalid rowid: ${rowid}`);
180
+ stmts.deleteVecStmt.run(safeRowid);
181
+ }
182
+ export function testConnection(db) {
183
+ try {
184
+ db.prepare("SELECT 1").get();
185
+ return true;
186
+ }
187
+ catch {
188
+ return false;
189
+ }
190
+ }
191
+ //# 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":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function embed(text: string): Promise<Float32Array | null>;
2
+ export declare function embedBatch(texts: string[]): Promise<(Float32Array | null)[]>;
3
+ export declare function resetEmbedPipeline(): void;
4
+ export declare function isEmbedAvailable(): boolean | null;
5
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAgDA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAYtE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAmBlF;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAEjD"}
package/dist/embed.js ADDED
@@ -0,0 +1,78 @@
1
+ import { join } from "node:path";
2
+ import { homedir } from "node:os";
3
+ import { mkdirSync } from "node:fs";
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ let extractor = null;
6
+ let embedAvailable = null;
7
+ let loadingPromise = null;
8
+ async function ensurePipeline() {
9
+ if (embedAvailable === false)
10
+ return null;
11
+ if (extractor)
12
+ return extractor;
13
+ if (loadingPromise)
14
+ return loadingPromise;
15
+ loadingPromise = (async () => {
16
+ try {
17
+ const { pipeline, env } = await import("@huggingface/transformers");
18
+ const modelCacheDir = join(homedir(), ".context-mcp", "models");
19
+ mkdirSync(modelCacheDir, { recursive: true });
20
+ env.cacheDir = modelCacheDir;
21
+ console.error("[context-vault] Loading embedding model (first run may download ~22MB)...");
22
+ extractor = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
23
+ embedAvailable = true;
24
+ return extractor;
25
+ }
26
+ catch (e) {
27
+ embedAvailable = false;
28
+ console.error(`[context-vault] Failed to load embedding model: ${e.message}`);
29
+ console.error(`[context-vault] Semantic search disabled. Full-text search still works.`);
30
+ return null;
31
+ }
32
+ finally {
33
+ loadingPromise = null;
34
+ }
35
+ })();
36
+ return loadingPromise;
37
+ }
38
+ export async function embed(text) {
39
+ const ext = await ensurePipeline();
40
+ if (!ext)
41
+ return null;
42
+ const result = await ext([text], { pooling: "mean", normalize: true });
43
+ if (!result?.data?.length) {
44
+ extractor = null;
45
+ embedAvailable = null;
46
+ loadingPromise = null;
47
+ throw new Error("Embedding pipeline returned empty result");
48
+ }
49
+ return new Float32Array(result.data);
50
+ }
51
+ export async function embedBatch(texts) {
52
+ if (!texts.length)
53
+ return [];
54
+ const ext = await ensurePipeline();
55
+ if (!ext)
56
+ return texts.map(() => null);
57
+ const result = await ext(texts, { pooling: "mean", normalize: true });
58
+ if (!result?.data?.length) {
59
+ extractor = null;
60
+ embedAvailable = null;
61
+ loadingPromise = null;
62
+ throw new Error("Embedding pipeline returned empty result");
63
+ }
64
+ const dim = result.data.length / texts.length;
65
+ if (!Number.isInteger(dim) || dim <= 0) {
66
+ throw new Error(`Unexpected embedding dimension: ${result.data.length} / ${texts.length} = ${dim}`);
67
+ }
68
+ return texts.map((_, i) => result.data.subarray(i * dim, (i + 1) * dim));
69
+ }
70
+ export function resetEmbedPipeline() {
71
+ extractor = null;
72
+ embedAvailable = null;
73
+ loadingPromise = null;
74
+ }
75
+ export function isEmbedAvailable() {
76
+ return embedAvailable;
77
+ }
78
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function ulid(): string;
2
+ export declare function slugify(text: string, maxLen?: number): string;
3
+ export declare function kindToDir(kind: string): string;
4
+ export declare function dirToKind(dirName: string): string;
5
+ export declare function normalizeKind(input: string): string;
6
+ export declare function kindToPath(kind: string): string;
7
+ export declare function safeJoin(base: string, ...parts: string[]): string;
8
+ export interface WalkResult {
9
+ filePath: string;
10
+ relDir: string;
11
+ }
12
+ export declare function walkDir(dir: string): WalkResult[];
13
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAMA,wBAAgB,IAAI,IAAI,MAAM,CAa7B;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,CAUzD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CASjE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAcjD"}
package/dist/files.js ADDED
@@ -0,0 +1,66 @@
1
+ import { readdirSync } from "node:fs";
2
+ import { join, resolve, sep } from "node:path";
3
+ import { categoryDirFor } from "./categories.js";
4
+ const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
5
+ export function ulid() {
6
+ const now = Date.now();
7
+ let ts = "";
8
+ let t = now;
9
+ for (let i = 0; i < 10; i++) {
10
+ ts = CROCKFORD[t & 31] + ts;
11
+ t = Math.floor(t / 32);
12
+ }
13
+ let rand = "";
14
+ for (let i = 0; i < 16; i++) {
15
+ rand += CROCKFORD[Math.floor(Math.random() * 32)];
16
+ }
17
+ return ts + rand;
18
+ }
19
+ export function slugify(text, maxLen = 60) {
20
+ let slug = text
21
+ .toLowerCase()
22
+ .replace(/[^a-z0-9]+/g, "-")
23
+ .replace(/^-+|-+$/g, "");
24
+ if (slug.length > maxLen) {
25
+ slug =
26
+ slug.slice(0, maxLen).replace(/-[^-]*$/, "") || slug.slice(0, maxLen);
27
+ }
28
+ return slug;
29
+ }
30
+ export function kindToDir(kind) {
31
+ return kind;
32
+ }
33
+ export function dirToKind(dirName) {
34
+ return dirName;
35
+ }
36
+ export function normalizeKind(input) {
37
+ return input;
38
+ }
39
+ export function kindToPath(kind) {
40
+ return `${categoryDirFor(kind)}/${kindToDir(kind)}`;
41
+ }
42
+ export function safeJoin(base, ...parts) {
43
+ const resolvedBase = resolve(base);
44
+ const result = resolve(join(base, ...parts));
45
+ if (!result.startsWith(resolvedBase + sep) && result !== resolvedBase) {
46
+ throw new Error(`Path traversal blocked: resolved path escapes base directory`);
47
+ }
48
+ return result;
49
+ }
50
+ export function walkDir(dir) {
51
+ const results = [];
52
+ function walk(currentDir, relDir) {
53
+ for (const entry of readdirSync(currentDir, { withFileTypes: true })) {
54
+ const fullPath = join(currentDir, entry.name);
55
+ if (entry.isDirectory() && !entry.name.startsWith("_")) {
56
+ walk(fullPath, relDir ? join(relDir, entry.name) : entry.name);
57
+ }
58
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
59
+ results.push({ filePath: fullPath, relDir });
60
+ }
61
+ }
62
+ }
63
+ walk(dir, "");
64
+ return results;
65
+ }
66
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface FormatInput {
2
+ title?: string | null;
3
+ body: string;
4
+ meta?: Record<string, unknown>;
5
+ }
6
+ export declare function formatBody(kind: string, input: FormatInput): string;
7
+ export {};
8
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAoBD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GACjB,MAAM,CAGR"}
@@ -0,0 +1,18 @@
1
+ const FORMATTERS = {
2
+ insight: ({ body }) => "\n" + body + "\n",
3
+ decision: ({ title, body }) => {
4
+ const t = title || body.slice(0, 80);
5
+ return "\n## Decision\n\n" + t + "\n\n## Rationale\n\n" + body + "\n";
6
+ },
7
+ pattern: ({ title, body, meta }) => {
8
+ const t = title || body.slice(0, 80);
9
+ const lang = meta?.language || "";
10
+ return "\n# " + t + "\n\n```" + lang + "\n" + body + "\n```\n";
11
+ },
12
+ };
13
+ const DEFAULT_FORMATTER = ({ title, body }) => title ? "\n# " + title + "\n\n" + body + "\n" : "\n" + body + "\n";
14
+ export function formatBody(kind, input) {
15
+ const fn = FORMATTERS[kind] || DEFAULT_FORMATTER;
16
+ return fn(input);
17
+ }
18
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,GAAmD;IACjE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;IAEzC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,mBAAmB,GAAG,CAAC,GAAG,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,GAAI,IAAI,EAAE,QAAmB,IAAI,EAAE,CAAC;QAC9C,OAAO,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IACjE,CAAC;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAe,EAAU,EAAE,CACjE,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAErE,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,KAAkB;IAElB,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC;IACjD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function formatFrontmatter(meta: Record<string, unknown>): string;
2
+ export declare function parseFrontmatter(text: string): {
3
+ meta: Record<string, unknown>;
4
+ body: string;
5
+ };
6
+ export declare function extractCustomMeta(fmMeta: Record<string, unknown>): Record<string, unknown> | null;
7
+ export declare function parseEntryFromMarkdown(kind: string, body: string, fmMeta: Record<string, unknown>): {
8
+ title: string | null;
9
+ body: string;
10
+ meta: Record<string, unknown> | null;
11
+ };
12
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAevE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd,CAoCA;AAcD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMhC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,CA6B9E"}
@@ -0,0 +1,101 @@
1
+ const NEEDS_QUOTING = /[:#'"{}[\],>|&*?!@`]/;
2
+ export function formatFrontmatter(meta) {
3
+ const lines = ["---"];
4
+ for (const [k, v] of Object.entries(meta)) {
5
+ if (v === undefined || v === null)
6
+ continue;
7
+ if (Array.isArray(v)) {
8
+ lines.push(`${k}: [${v.map((i) => JSON.stringify(i)).join(", ")}]`);
9
+ }
10
+ else {
11
+ const str = String(v);
12
+ lines.push(`${k}: ${NEEDS_QUOTING.test(str) ? JSON.stringify(str) : str}`);
13
+ }
14
+ }
15
+ lines.push("---");
16
+ return lines.join("\n");
17
+ }
18
+ export function parseFrontmatter(text) {
19
+ const normalized = text.replace(/\r\n/g, "\n");
20
+ const match = normalized.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
21
+ if (!match)
22
+ return { meta: {}, body: normalized.trim() };
23
+ const meta = {};
24
+ for (const line of match[1].split("\n")) {
25
+ const idx = line.indexOf(":");
26
+ if (idx === -1)
27
+ continue;
28
+ const key = line.slice(0, idx).trim();
29
+ let val = line.slice(idx + 1).trim();
30
+ if (typeof val === "string" &&
31
+ val.length >= 2 &&
32
+ val.startsWith('"') &&
33
+ val.endsWith('"') &&
34
+ !val.startsWith('["')) {
35
+ try {
36
+ val = JSON.parse(val);
37
+ }
38
+ catch {
39
+ /* keep as-is */
40
+ }
41
+ }
42
+ if (typeof val === "string" && val.startsWith("[") && val.endsWith("]")) {
43
+ try {
44
+ val = JSON.parse(val);
45
+ }
46
+ catch {
47
+ val = val
48
+ .slice(1, -1)
49
+ .split(",")
50
+ .map((s) => s.trim().replace(/^"|"$/g, ""));
51
+ }
52
+ }
53
+ meta[key] = val;
54
+ }
55
+ return { meta, body: match[2].trim() };
56
+ }
57
+ const RESERVED_FM_KEYS = new Set([
58
+ "id",
59
+ "tags",
60
+ "source",
61
+ "created",
62
+ "updated",
63
+ "identity_key",
64
+ "expires_at",
65
+ "supersedes",
66
+ "related_to",
67
+ ]);
68
+ export function extractCustomMeta(fmMeta) {
69
+ const custom = {};
70
+ for (const [k, v] of Object.entries(fmMeta)) {
71
+ if (!RESERVED_FM_KEYS.has(k))
72
+ custom[k] = v;
73
+ }
74
+ return Object.keys(custom).length ? custom : null;
75
+ }
76
+ export function parseEntryFromMarkdown(kind, body, fmMeta) {
77
+ if (kind === "insight") {
78
+ return { title: null, body, meta: extractCustomMeta(fmMeta) };
79
+ }
80
+ if (kind === "decision") {
81
+ const titleMatch = body.match(/^## Decision\s*\n+([\s\S]*?)(?=\n## |\n*$)/);
82
+ const rationaleMatch = body.match(/## Rationale\s*\n+([\s\S]*?)$/);
83
+ const title = titleMatch ? titleMatch[1].trim() : body.slice(0, 100);
84
+ const rationale = rationaleMatch ? rationaleMatch[1].trim() : body;
85
+ return { title, body: rationale, meta: extractCustomMeta(fmMeta) };
86
+ }
87
+ if (kind === "pattern") {
88
+ const titleMatch = body.match(/^# (.+)/);
89
+ const title = titleMatch ? titleMatch[1].trim() : body.slice(0, 80);
90
+ const codeMatch = body.match(/```[\w]*\n([\s\S]*?)```/);
91
+ const content = codeMatch ? codeMatch[1].trim() : body;
92
+ return { title, body: content, meta: extractCustomMeta(fmMeta) };
93
+ }
94
+ const headingMatch = body.match(/^#+ (.+)/);
95
+ return {
96
+ title: headingMatch ? headingMatch[1].trim() : null,
97
+ body,
98
+ meta: extractCustomMeta(fmMeta),
99
+ };
100
+ }
101
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { BaseCtx, IndexEntryInput, ReindexStats } from "./types.js";
2
+ export declare function indexEntry(ctx: BaseCtx, entry: IndexEntryInput & {
3
+ supersedes?: string[] | null;
4
+ related_to?: string[] | null;
5
+ }): Promise<void>;
6
+ export declare function pruneExpired(ctx: BaseCtx): Promise<number>;
7
+ export declare function reindex(ctx: BaseCtx, opts?: {
8
+ fullSync?: boolean;
9
+ }): Promise<ReindexStats>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAMzE,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,eAAe,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,GACtF,OAAO,CAAC,IAAI,CAAC,CAuFf;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBhE;AAED,wBAAsB,OAAO,CAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,YAAY,CAAC,CA8NvB"}