@pcircle/memesh 2.9.1 → 2.9.3

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 (121) hide show
  1. package/README.de.md +119 -78
  2. package/README.es.md +116 -75
  3. package/README.fr.md +116 -75
  4. package/README.id.md +115 -74
  5. package/README.ja.md +111 -70
  6. package/README.ko.md +116 -75
  7. package/README.md +113 -72
  8. package/README.th.md +118 -77
  9. package/README.vi.md +116 -75
  10. package/README.zh-CN.md +120 -79
  11. package/README.zh-TW.md +116 -75
  12. package/dist/core/GitCommandParser.d.ts +11 -0
  13. package/dist/core/GitCommandParser.d.ts.map +1 -0
  14. package/dist/core/GitCommandParser.js +43 -0
  15. package/dist/core/GitCommandParser.js.map +1 -0
  16. package/dist/core/HookIntegration.d.ts +0 -3
  17. package/dist/core/HookIntegration.d.ts.map +1 -1
  18. package/dist/core/HookIntegration.js +6 -30
  19. package/dist/core/HookIntegration.js.map +1 -1
  20. package/dist/embeddings/EmbeddingService.d.ts +3 -0
  21. package/dist/embeddings/EmbeddingService.d.ts.map +1 -1
  22. package/dist/embeddings/EmbeddingService.js +32 -6
  23. package/dist/embeddings/EmbeddingService.js.map +1 -1
  24. package/dist/embeddings/InMemoryVectorAdapter.d.ts +15 -0
  25. package/dist/embeddings/InMemoryVectorAdapter.d.ts.map +1 -0
  26. package/dist/embeddings/InMemoryVectorAdapter.js +58 -0
  27. package/dist/embeddings/InMemoryVectorAdapter.js.map +1 -0
  28. package/dist/embeddings/SqliteVecAdapter.d.ts +15 -0
  29. package/dist/embeddings/SqliteVecAdapter.d.ts.map +1 -0
  30. package/dist/embeddings/SqliteVecAdapter.js +107 -0
  31. package/dist/embeddings/SqliteVecAdapter.js.map +1 -0
  32. package/dist/embeddings/VectorExtension.d.ts +2 -4
  33. package/dist/embeddings/VectorExtension.d.ts.map +1 -1
  34. package/dist/embeddings/VectorExtension.js.map +1 -1
  35. package/dist/embeddings/VectorSearchAdapter.d.ts +17 -0
  36. package/dist/embeddings/VectorSearchAdapter.d.ts.map +1 -0
  37. package/dist/embeddings/VectorSearchAdapter.js +2 -0
  38. package/dist/embeddings/VectorSearchAdapter.js.map +1 -0
  39. package/dist/embeddings/index.d.ts +6 -1
  40. package/dist/embeddings/index.d.ts.map +1 -1
  41. package/dist/embeddings/index.js +4 -1
  42. package/dist/embeddings/index.js.map +1 -1
  43. package/dist/knowledge-graph/ContentHasher.d.ts +4 -0
  44. package/dist/knowledge-graph/ContentHasher.d.ts.map +1 -0
  45. package/dist/knowledge-graph/ContentHasher.js +8 -0
  46. package/dist/knowledge-graph/ContentHasher.js.map +1 -0
  47. package/dist/knowledge-graph/KGSearchEngine.d.ts +36 -0
  48. package/dist/knowledge-graph/KGSearchEngine.d.ts.map +1 -0
  49. package/dist/knowledge-graph/KGSearchEngine.js +257 -0
  50. package/dist/knowledge-graph/KGSearchEngine.js.map +1 -0
  51. package/dist/knowledge-graph/index.d.ts +18 -7
  52. package/dist/knowledge-graph/index.d.ts.map +1 -1
  53. package/dist/knowledge-graph/index.js +147 -242
  54. package/dist/knowledge-graph/index.js.map +1 -1
  55. package/dist/mcp/ServerInitializer.d.ts.map +1 -1
  56. package/dist/mcp/ServerInitializer.js +1 -1
  57. package/dist/mcp/ServerInitializer.js.map +1 -1
  58. package/dist/mcp/StdinBufferManager.d.ts +11 -0
  59. package/dist/mcp/StdinBufferManager.d.ts.map +1 -0
  60. package/dist/mcp/StdinBufferManager.js +62 -0
  61. package/dist/mcp/StdinBufferManager.js.map +1 -0
  62. package/dist/mcp/daemon/StdioProxyClient.d.ts.map +1 -1
  63. package/dist/mcp/daemon/StdioProxyClient.js +6 -0
  64. package/dist/mcp/daemon/StdioProxyClient.js.map +1 -1
  65. package/dist/mcp/handlers/HookToolHandler.d.ts +10 -0
  66. package/dist/mcp/handlers/HookToolHandler.d.ts.map +1 -0
  67. package/dist/mcp/handlers/HookToolHandler.js +92 -0
  68. package/dist/mcp/handlers/HookToolHandler.js.map +1 -0
  69. package/dist/mcp/handlers/MemoryToolHandler.d.ts +21 -0
  70. package/dist/mcp/handlers/MemoryToolHandler.d.ts.map +1 -0
  71. package/dist/mcp/handlers/MemoryToolHandler.js +430 -0
  72. package/dist/mcp/handlers/MemoryToolHandler.js.map +1 -0
  73. package/dist/mcp/handlers/SystemToolHandler.d.ts +14 -0
  74. package/dist/mcp/handlers/SystemToolHandler.d.ts.map +1 -0
  75. package/dist/mcp/handlers/SystemToolHandler.js +224 -0
  76. package/dist/mcp/handlers/SystemToolHandler.js.map +1 -0
  77. package/dist/mcp/handlers/ToolHandlers.d.ts +4 -17
  78. package/dist/mcp/handlers/ToolHandlers.d.ts.map +1 -1
  79. package/dist/mcp/handlers/ToolHandlers.js +19 -689
  80. package/dist/mcp/handlers/ToolHandlers.js.map +1 -1
  81. package/dist/mcp/handlers/index.d.ts +3 -0
  82. package/dist/mcp/handlers/index.d.ts.map +1 -1
  83. package/dist/mcp/handlers/index.js +3 -0
  84. package/dist/mcp/handlers/index.js.map +1 -1
  85. package/dist/mcp/server-bootstrap.js +24 -59
  86. package/dist/mcp/server-bootstrap.js.map +1 -1
  87. package/dist/mcp/tools/create-entities.d.ts.map +1 -1
  88. package/dist/mcp/tools/create-entities.js +18 -24
  89. package/dist/mcp/tools/create-entities.js.map +1 -1
  90. package/dist/memory/MemorySearchEngine.d.ts +17 -0
  91. package/dist/memory/MemorySearchEngine.d.ts.map +1 -0
  92. package/dist/memory/MemorySearchEngine.js +88 -0
  93. package/dist/memory/MemorySearchEngine.js.map +1 -0
  94. package/dist/memory/ProactiveRecaller.d.ts +26 -0
  95. package/dist/memory/ProactiveRecaller.d.ts.map +1 -0
  96. package/dist/memory/ProactiveRecaller.js +96 -0
  97. package/dist/memory/ProactiveRecaller.js.map +1 -0
  98. package/dist/memory/UnifiedMemoryStore.d.ts +1 -0
  99. package/dist/memory/UnifiedMemoryStore.d.ts.map +1 -1
  100. package/dist/memory/UnifiedMemoryStore.js +7 -63
  101. package/dist/memory/UnifiedMemoryStore.js.map +1 -1
  102. package/dist/memory/index.d.ts +3 -0
  103. package/dist/memory/index.d.ts.map +1 -1
  104. package/dist/memory/index.js +2 -0
  105. package/dist/memory/index.js.map +1 -1
  106. package/dist/utils/index.d.ts +0 -2
  107. package/dist/utils/index.d.ts.map +1 -1
  108. package/dist/utils/index.js +0 -2
  109. package/dist/utils/index.js.map +1 -1
  110. package/dist/utils/tracing/index.d.ts +0 -1
  111. package/dist/utils/tracing/index.d.ts.map +1 -1
  112. package/dist/utils/tracing/index.js +0 -1
  113. package/dist/utils/tracing/index.js.map +1 -1
  114. package/package.json +2 -11
  115. package/plugin.json +1 -1
  116. package/scripts/hooks/__tests__/post-tool-use-recall.test.js +192 -0
  117. package/scripts/hooks/__tests__/session-start-recall.test.js +86 -0
  118. package/scripts/hooks/post-tool-use-recall-utils.js +74 -0
  119. package/scripts/hooks/post-tool-use.js +79 -0
  120. package/scripts/hooks/session-start-recall-utils.js +40 -0
  121. package/scripts/hooks/session-start.js +66 -0
@@ -0,0 +1,58 @@
1
+ import { DEFAULT_EMBEDDING_DIMENSIONS } from './VectorSearchAdapter.js';
2
+ export class InMemoryVectorAdapter {
3
+ vectors = new Map();
4
+ loadExtension(_db) {
5
+ }
6
+ createVectorTable(_db, _dimensions) {
7
+ }
8
+ insertEmbedding(_db, entityName, embedding, dimensions = DEFAULT_EMBEDDING_DIMENSIONS) {
9
+ if (embedding.length !== dimensions) {
10
+ throw new Error(`Invalid embedding dimensions: expected ${dimensions}, got ${embedding.length}. Entity: ${entityName}`);
11
+ }
12
+ this.vectors.set(entityName, new Float32Array(embedding));
13
+ }
14
+ deleteEmbedding(_db, entityName) {
15
+ this.vectors.delete(entityName);
16
+ }
17
+ knnSearch(_db, queryEmbedding, k, dimensions = DEFAULT_EMBEDDING_DIMENSIONS) {
18
+ if (queryEmbedding.length !== dimensions) {
19
+ throw new Error(`Invalid query embedding dimensions: expected ${dimensions}, got ${queryEmbedding.length}`);
20
+ }
21
+ const results = [];
22
+ for (const [name, vec] of this.vectors) {
23
+ results.push({
24
+ entityName: name,
25
+ distance: this.cosineDistance(queryEmbedding, vec),
26
+ });
27
+ }
28
+ results.sort((a, b) => a.distance - b.distance);
29
+ return results.slice(0, k);
30
+ }
31
+ getEmbedding(_db, entityName) {
32
+ const vec = this.vectors.get(entityName);
33
+ if (!vec)
34
+ return null;
35
+ return new Float32Array(vec);
36
+ }
37
+ hasEmbedding(_db, entityName) {
38
+ return this.vectors.has(entityName);
39
+ }
40
+ getEmbeddingCount(_db) {
41
+ return this.vectors.size;
42
+ }
43
+ cosineDistance(a, b) {
44
+ let dot = 0;
45
+ let normA = 0;
46
+ let normB = 0;
47
+ for (let i = 0; i < a.length; i++) {
48
+ dot += a[i] * b[i];
49
+ normA += a[i] * a[i];
50
+ normB += b[i] * b[i];
51
+ }
52
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
53
+ if (denom === 0)
54
+ return 1;
55
+ return 1 - dot / denom;
56
+ }
57
+ }
58
+ //# sourceMappingURL=InMemoryVectorAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryVectorAdapter.js","sourceRoot":"","sources":["../../src/embeddings/InMemoryVectorAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { VectorSearchAdapter, KnnSearchResult } from './VectorSearchAdapter.js';
3
+ export declare class SqliteVecAdapter implements VectorSearchAdapter {
4
+ private extensionLoaded;
5
+ loadExtension(db: Database.Database): void;
6
+ createVectorTable(db: Database.Database, dimensions?: number): void;
7
+ insertEmbedding(db: Database.Database, entityName: string, embedding: Float32Array, dimensions?: number): void;
8
+ deleteEmbedding(db: Database.Database, entityName: string): void;
9
+ knnSearch(db: Database.Database, queryEmbedding: Float32Array, k: number, dimensions?: number): KnnSearchResult[];
10
+ getEmbedding(db: Database.Database, entityName: string): Float32Array | null;
11
+ hasEmbedding(db: Database.Database, entityName: string): boolean;
12
+ getEmbeddingCount(db: Database.Database): number;
13
+ private ensureExtensionLoaded;
14
+ }
15
+ //# sourceMappingURL=SqliteVecAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteVecAdapter.d.ts","sourceRoot":"","sources":["../../src/embeddings/SqliteVecAdapter.ts"],"names":[],"mappings":"AAQA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAqBrF,qBAAa,gBAAiB,YAAW,mBAAmB;IAE1D,OAAO,CAAC,eAAe,CAAoC;IAE3D,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAiB1C,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAE,MAAqC,GAAG,IAAI;IAajG,eAAe,CACb,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,YAAY,EACvB,UAAU,GAAE,MAAqC,GAChD,IAAI;IAwBP,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAMhE,SAAS,CACP,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,YAAY,EAC5B,CAAC,EAAE,MAAM,EACT,UAAU,GAAE,MAAqC,GAChD,eAAe,EAAE;IA4BpB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAsB5E,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAOhE,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM;IAShD,OAAO,CAAC,qBAAqB;CAK9B"}
@@ -0,0 +1,107 @@
1
+ import * as sqliteVec from 'sqlite-vec';
2
+ import { logger } from '../utils/logger.js';
3
+ import { DEFAULT_EMBEDDING_DIMENSIONS } from './VectorSearchAdapter.js';
4
+ function bufferToFloat32Array(buffer) {
5
+ const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
6
+ return new Float32Array(arrayBuffer);
7
+ }
8
+ export class SqliteVecAdapter {
9
+ extensionLoaded = new WeakSet();
10
+ loadExtension(db) {
11
+ if (this.extensionLoaded.has(db)) {
12
+ return;
13
+ }
14
+ try {
15
+ sqliteVec.load(db);
16
+ this.extensionLoaded.add(db);
17
+ logger.debug('sqlite-vec extension loaded successfully');
18
+ }
19
+ catch (error) {
20
+ logger.error('Failed to load sqlite-vec extension', { error });
21
+ throw new Error(`Failed to load sqlite-vec: ${error instanceof Error ? error.message : error}`);
22
+ }
23
+ }
24
+ createVectorTable(db, dimensions = DEFAULT_EMBEDDING_DIMENSIONS) {
25
+ this.ensureExtensionLoaded(db);
26
+ db.exec(`
27
+ CREATE VIRTUAL TABLE IF NOT EXISTS entity_embeddings USING vec0(
28
+ entity_name TEXT PRIMARY KEY,
29
+ embedding float[${dimensions}] distance_metric=cosine
30
+ )
31
+ `);
32
+ logger.debug('Vector table created', { dimensions });
33
+ }
34
+ insertEmbedding(db, entityName, embedding, dimensions = DEFAULT_EMBEDDING_DIMENSIONS) {
35
+ if (embedding.length !== dimensions) {
36
+ throw new Error(`Invalid embedding dimensions: expected ${dimensions}, got ${embedding.length}. ` +
37
+ `Entity: ${entityName}`);
38
+ }
39
+ this.ensureExtensionLoaded(db);
40
+ const deleteStmt = db.prepare('DELETE FROM entity_embeddings WHERE entity_name = ?');
41
+ deleteStmt.run(entityName);
42
+ const insertStmt = db.prepare(`
43
+ INSERT INTO entity_embeddings (entity_name, embedding)
44
+ VALUES (?, ?)
45
+ `);
46
+ const vectorJson = JSON.stringify(Array.from(embedding));
47
+ insertStmt.run(entityName, vectorJson);
48
+ }
49
+ deleteEmbedding(db, entityName) {
50
+ this.ensureExtensionLoaded(db);
51
+ const stmt = db.prepare('DELETE FROM entity_embeddings WHERE entity_name = ?');
52
+ stmt.run(entityName);
53
+ }
54
+ knnSearch(db, queryEmbedding, k, dimensions = DEFAULT_EMBEDDING_DIMENSIONS) {
55
+ if (queryEmbedding.length !== dimensions) {
56
+ throw new Error(`Invalid query embedding dimensions: expected ${dimensions}, got ${queryEmbedding.length}`);
57
+ }
58
+ this.ensureExtensionLoaded(db);
59
+ const queryJson = JSON.stringify(Array.from(queryEmbedding));
60
+ const stmt = db.prepare(`
61
+ SELECT
62
+ entity_name,
63
+ distance
64
+ FROM entity_embeddings
65
+ WHERE embedding MATCH ?
66
+ AND k = ?
67
+ `);
68
+ const rows = stmt.all(queryJson, k);
69
+ return rows.map(row => ({
70
+ entityName: row.entity_name,
71
+ distance: row.distance
72
+ }));
73
+ }
74
+ getEmbedding(db, entityName) {
75
+ this.ensureExtensionLoaded(db);
76
+ const stmt = db.prepare('SELECT embedding FROM entity_embeddings WHERE entity_name = ?');
77
+ const row = stmt.get(entityName);
78
+ if (!row) {
79
+ return null;
80
+ }
81
+ if (Buffer.isBuffer(row.embedding)) {
82
+ return bufferToFloat32Array(row.embedding);
83
+ }
84
+ if (typeof row.embedding === 'string') {
85
+ return new Float32Array(JSON.parse(row.embedding));
86
+ }
87
+ logger.warn('Unexpected embedding format for entity', { entityName });
88
+ return null;
89
+ }
90
+ hasEmbedding(db, entityName) {
91
+ this.ensureExtensionLoaded(db);
92
+ const stmt = db.prepare('SELECT 1 FROM entity_embeddings WHERE entity_name = ? LIMIT 1');
93
+ const row = stmt.get(entityName);
94
+ return row !== undefined;
95
+ }
96
+ getEmbeddingCount(db) {
97
+ const stmt = db.prepare('SELECT COUNT(*) as cnt FROM entity_embeddings');
98
+ const row = stmt.get();
99
+ return row.cnt;
100
+ }
101
+ ensureExtensionLoaded(db) {
102
+ if (!this.extensionLoaded.has(db)) {
103
+ this.loadExtension(db);
104
+ }
105
+ }
106
+ }
107
+ //# sourceMappingURL=SqliteVecAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteVecAdapter.js","sourceRoot":"","sources":["../../src/embeddings/SqliteVecAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  import Database from 'better-sqlite3';
2
- export interface KnnSearchResult {
3
- entityName: string;
4
- distance: number;
5
- }
2
+ import type { KnnSearchResult } from './VectorSearchAdapter.js';
3
+ export type { KnnSearchResult } from './VectorSearchAdapter.js';
6
4
  export declare const DEFAULT_EMBEDDING_DIMENSIONS = 384;
7
5
  export declare class VectorExtension {
8
6
  private static extensionLoaded;
@@ -1 +1 @@
1
- {"version":3,"file":"VectorExtension.d.ts","sourceRoot":"","sources":["../../src/embeddings/VectorExtension.ts"],"names":[],"mappings":"AA6BA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC,MAAM,WAAW,eAAe;IAE9B,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAoBhD,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,eAAe,CAAoC;IAWlE,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAwBjD,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAE,MAAY,GAAG,IAAI;IA2B/E,MAAM,CAAC,eAAe,CACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,YAAY,EACvB,kBAAkB,GAAE,MAAqC,GACxD,IAAI;IAiCP,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAmBvE,MAAM,CAAC,SAAS,CACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,YAAY,EAC5B,CAAC,EAAE,MAAM,EACT,kBAAkB,GAAE,MAAqC,GACxD,eAAe,EAAE;IAuCpB,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IA8BnF,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAavE,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM;IAYvD,OAAO,CAAC,MAAM,CAAC,qBAAqB;CAKrC"}
1
+ {"version":3,"file":"VectorExtension.d.ts","sourceRoot":"","sources":["../../src/embeddings/VectorExtension.ts"],"names":[],"mappings":"AA6BA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAoBhD,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,eAAe,CAAoC;IAWlE,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAwBjD,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAE,MAAY,GAAG,IAAI;IA2B/E,MAAM,CAAC,eAAe,CACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,YAAY,EACvB,kBAAkB,GAAE,MAAqC,GACxD,IAAI;IAiCP,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAmBvE,MAAM,CAAC,SAAS,CACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,YAAY,EAC5B,CAAC,EAAE,MAAM,EACT,kBAAkB,GAAE,MAAqC,GACxD,eAAe,EAAE;IAuCpB,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IA8BnF,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAavE,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM;IAYvD,OAAO,CAAC,MAAM,CAAC,qBAAqB;CAKrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"VectorExtension.js","sourceRoot":"","sources":["../../src/embeddings/VectorExtension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VectorExtension.js","sourceRoot":"","sources":["../../src/embeddings/VectorExtension.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAMhD,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CACrC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CACtC,CAAC;IACF,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AAQD,MAAM,OAAO,eAAe;IAElB,MAAM,CAAC,eAAe,GAAG,IAAI,OAAO,EAAqB,CAAC;IAWlE,MAAM,CAAC,aAAa,CAAC,EAAqB;QACxC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAWD,MAAM,CAAC,iBAAiB,CAAC,EAAqB,EAAE,aAAqB,GAAG;QACtE,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAI/B,EAAE,CAAC,IAAI,CAAC;;;0BAGc,UAAU;;KAE/B,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IAcD,MAAM,CAAC,eAAe,CACpB,EAAqB,EACrB,UAAkB,EAClB,SAAuB,EACvB,qBAA6B,4BAA4B;QAGzD,IAAI,SAAS,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,0CAA0C,kBAAkB,SAAS,SAAS,CAAC,MAAM,IAAI;gBACzF,WAAW,UAAU,EAAE,CACxB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAI/B,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;QACrF,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE3B,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC;QAIH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAQD,MAAM,CAAC,eAAe,CAAC,EAAqB,EAAE,UAAkB;QAC9D,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IAeD,MAAM,CAAC,SAAS,CACd,EAAqB,EACrB,cAA4B,EAC5B,CAAS,EACT,qBAA6B,4BAA4B;QAGzD,IAAI,cAAc,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CACb,gDAAgD,kBAAkB,SAAS,cAAc,CAAC,MAAM,EAAE,CACnG,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAG/B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAI7D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;KAOvB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAqD,CAAC;QAExF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC,CAAC;IACN,CAAC;IASD,MAAM,CAAC,YAAY,CAAC,EAAqB,EAAE,UAAkB;QAC3D,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAA+C,CAAC;QAE/E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,OAAO,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IASD,MAAM,CAAC,YAAY,CAAC,EAAqB,EAAE,UAAkB;QAC3D,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAQD,MAAM,CAAC,iBAAiB,CAAC,EAAqB;QAC5C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAqB,CAAC;QAC1C,OAAO,GAAG,CAAC,GAAG,CAAC;IACjB,CAAC;IAQO,MAAM,CAAC,qBAAqB,CAAC,EAAqB;QACxD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface KnnSearchResult {
3
+ entityName: string;
4
+ distance: number;
5
+ }
6
+ export declare const DEFAULT_EMBEDDING_DIMENSIONS = 384;
7
+ export interface VectorSearchAdapter {
8
+ loadExtension(db: Database.Database): void;
9
+ createVectorTable(db: Database.Database, dimensions?: number): void;
10
+ insertEmbedding(db: Database.Database, entityName: string, embedding: Float32Array, dimensions?: number): void;
11
+ deleteEmbedding(db: Database.Database, entityName: string): void;
12
+ knnSearch(db: Database.Database, queryEmbedding: Float32Array, k: number, dimensions?: number): KnnSearchResult[];
13
+ getEmbedding(db: Database.Database, entityName: string): Float32Array | null;
14
+ hasEmbedding(db: Database.Database, entityName: string): boolean;
15
+ getEmbeddingCount(db: Database.Database): number;
16
+ }
17
+ //# sourceMappingURL=VectorSearchAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorSearchAdapter.d.ts","sourceRoot":"","sources":["../../src/embeddings/VectorSearchAdapter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,MAAM,WAAW,eAAe;IAE9B,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAWhD,MAAM,WAAW,mBAAmB;IAElC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;IAG3C,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGpE,eAAe,CACb,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,YAAY,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAAC;IAGR,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjE,SAAS,CACP,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,YAAY,EAC5B,CAAC,EAAE,MAAM,EACT,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,EAAE,CAAC;IAGrB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IAG7E,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAGjE,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC;CAClD"}
@@ -0,0 +1,2 @@
1
+ export const DEFAULT_EMBEDDING_DIMENSIONS = 384;
2
+ //# sourceMappingURL=VectorSearchAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorSearchAdapter.js","sourceRoot":"","sources":["../../src/embeddings/VectorSearchAdapter.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC"}
@@ -1,4 +1,9 @@
1
1
  export { ModelManager } from './ModelManager.js';
2
2
  export { EmbeddingService, LazyEmbeddingService } from './EmbeddingService.js';
3
- export { VectorExtension, type KnnSearchResult, DEFAULT_EMBEDDING_DIMENSIONS, } from './VectorExtension.js';
3
+ export type { VectorSearchAdapter } from './VectorSearchAdapter.js';
4
+ export { DEFAULT_EMBEDDING_DIMENSIONS } from './VectorSearchAdapter.js';
5
+ export type { KnnSearchResult } from './VectorSearchAdapter.js';
6
+ export { SqliteVecAdapter } from './SqliteVecAdapter.js';
7
+ export { InMemoryVectorAdapter } from './InMemoryVectorAdapter.js';
8
+ export { VectorExtension } from './VectorExtension.js';
4
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,KAAK,eAAe,EACpB,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG/E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,4 +1,7 @@
1
1
  export { ModelManager } from './ModelManager.js';
2
2
  export { EmbeddingService, LazyEmbeddingService } from './EmbeddingService.js';
3
- export { VectorExtension, DEFAULT_EMBEDDING_DIMENSIONS, } from './VectorExtension.js';
3
+ export { DEFAULT_EMBEDDING_DIMENSIONS } from './VectorSearchAdapter.js';
4
+ export { SqliteVecAdapter } from './SqliteVecAdapter.js';
5
+ export { InMemoryVectorAdapter } from './InMemoryVectorAdapter.js';
6
+ export { VectorExtension } from './VectorExtension.js';
4
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,eAAe,EAEf,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare class ContentHasher {
2
+ static hashEmbeddingSource(entityName: string, observations?: string[]): string;
3
+ }
4
+ //# sourceMappingURL=ContentHasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentHasher.d.ts","sourceRoot":"","sources":["../../src/knowledge-graph/ContentHasher.ts"],"names":[],"mappings":"AAOA,qBAAa,aAAa;IASxB,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM;CAIpF"}
@@ -0,0 +1,8 @@
1
+ import { createHash } from 'crypto';
2
+ export class ContentHasher {
3
+ static hashEmbeddingSource(entityName, observations = []) {
4
+ const text = [entityName, ...observations].join(' ');
5
+ return createHash('sha256').update(text).digest('hex').substring(0, 16);
6
+ }
7
+ }
8
+ //# sourceMappingURL=ContentHasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentHasher.js","sourceRoot":"","sources":["../../src/knowledge-graph/ContentHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAOpC,MAAM,OAAO,aAAa;IASxB,MAAM,CAAC,mBAAmB,CAAC,UAAkB,EAAE,eAAyB,EAAE;QACxE,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { Entity, SearchQuery } from './types.js';
3
+ import type { VectorSearchAdapter } from '../embeddings/VectorSearchAdapter.js';
4
+ import { QueryCache } from '../db/QueryCache.js';
5
+ export interface SemanticSearchResult {
6
+ entity: Entity;
7
+ similarity: number;
8
+ }
9
+ export declare const CONTROL_CHAR_PATTERN: RegExp;
10
+ export interface KGSearchEngineContext {
11
+ db: Database.Database;
12
+ getVectorAdapter: () => VectorSearchAdapter | null;
13
+ isVectorEnabled: () => boolean;
14
+ getVectorInitPromise: () => Promise<void> | null;
15
+ getEntity: (name: string) => Entity | null;
16
+ queryCache: QueryCache<string, any>;
17
+ }
18
+ export declare class KGSearchEngine {
19
+ private readonly ctx;
20
+ constructor(context: KGSearchEngineContext);
21
+ escapeLikePattern(pattern: string): string;
22
+ searchFTS5(query: string, limit: number): number[];
23
+ prepareFTS5Query(query: string): string;
24
+ searchEntities(query: SearchQuery): Entity[];
25
+ semanticSearch(query: string, options?: {
26
+ limit?: number;
27
+ minSimilarity?: number;
28
+ entityTypes?: string[];
29
+ }): Promise<SemanticSearchResult[]>;
30
+ hybridSearch(query: string, options?: {
31
+ limit?: number;
32
+ minSimilarity?: number;
33
+ }): Promise<SemanticSearchResult[]>;
34
+ keywordSearchAsSemanticResults(query: string, limit: number): SemanticSearchResult[];
35
+ }
36
+ //# sourceMappingURL=KGSearchEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KGSearchEngine.d.ts","sourceRoot":"","sources":["../../src/knowledge-graph/KGSearchEngine.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAWjD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,eAAO,MAAM,oBAAoB,QAA8C,CAAC;AAMhF,MAAM,WAAW,qBAAqB;IAEpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAEtB,gBAAgB,EAAE,MAAM,mBAAmB,GAAG,IAAI,CAAC;IAEnD,eAAe,EAAE,MAAM,OAAO,CAAC;IAE/B,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEjD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAE3C,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACrC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEhC,OAAO,EAAE,qBAAqB;IAY1C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAoB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAqClD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA4DvC,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE;IA+ItC,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GAC/E,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgD5B,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,GACvD,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAwClC,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,oBAAoB,EAAE;CAIrF"}
@@ -0,0 +1,257 @@
1
+ import { ValidationError } from '../errors/index.js';
2
+ import { logger } from '../utils/logger.js';
3
+ import { safeJsonParse } from '../utils/json.js';
4
+ import { validateNonEmptyString } from '../utils/validation.js';
5
+ export const CONTROL_CHAR_PATTERN = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\x80-\x9F]/;
6
+ export class KGSearchEngine {
7
+ ctx;
8
+ constructor(context) {
9
+ this.ctx = context;
10
+ }
11
+ escapeLikePattern(pattern) {
12
+ if (typeof pattern !== 'string') {
13
+ throw new Error(`Pattern must be a string, got ${typeof pattern}`);
14
+ }
15
+ return pattern
16
+ .replace(/!/g, '!!')
17
+ .replace(/%/g, '!%')
18
+ .replace(/_/g, '!_')
19
+ .replace(/\[/g, '![')
20
+ .replace(/\]/g, '!]');
21
+ }
22
+ searchFTS5(query, limit) {
23
+ if (!query || query.trim() === '') {
24
+ return [];
25
+ }
26
+ const ftsQuery = this.prepareFTS5Query(query);
27
+ if (!ftsQuery) {
28
+ return [];
29
+ }
30
+ try {
31
+ const results = this.ctx.db.prepare(`
32
+ SELECT rowid, bm25(entities_fts, 10.0, 5.0) as rank
33
+ FROM entities_fts
34
+ WHERE entities_fts MATCH ?
35
+ ORDER BY rank
36
+ LIMIT ?
37
+ `).all(ftsQuery, limit);
38
+ return results.map(r => r.rowid);
39
+ }
40
+ catch (error) {
41
+ logger.warn('[KG] FTS5 search failed, will use LIKE fallback:', {
42
+ query,
43
+ ftsQuery,
44
+ error: error instanceof Error ? error.message : String(error)
45
+ });
46
+ return [];
47
+ }
48
+ }
49
+ prepareFTS5Query(query) {
50
+ const MAX_QUERY_LENGTH = 10000;
51
+ const MAX_TOKENS = 100;
52
+ let normalized = query.trim().replace(/\s+/g, ' ');
53
+ if (!normalized) {
54
+ return '';
55
+ }
56
+ if (normalized.length > MAX_QUERY_LENGTH) {
57
+ logger.warn(`[KG] FTS5 query too long (${normalized.length} chars), truncating to ${MAX_QUERY_LENGTH}`);
58
+ normalized = normalized.substring(0, MAX_QUERY_LENGTH);
59
+ }
60
+ let tokens = normalized.split(' ').filter(t => t.length > 0);
61
+ if (tokens.length === 0) {
62
+ return '';
63
+ }
64
+ if (tokens.length > MAX_TOKENS) {
65
+ logger.warn(`[KG] FTS5 query has too many tokens (${tokens.length}), using first ${MAX_TOKENS}`);
66
+ tokens = tokens.slice(0, MAX_TOKENS);
67
+ }
68
+ const ftsTokens = tokens
69
+ .filter(token => {
70
+ const upper = token.toUpperCase();
71
+ return upper !== 'AND' && upper !== 'OR' && upper !== 'NOT' && upper !== 'NEAR';
72
+ })
73
+ .map(token => {
74
+ const escaped = token
75
+ .replace(/"/g, '""')
76
+ .replace(/\*/g, '')
77
+ .replace(/\^/g, '')
78
+ .replace(/:/g, '')
79
+ .replace(/[(){}[\]]/g, '');
80
+ if (!escaped) {
81
+ return null;
82
+ }
83
+ return `"${escaped}"*`;
84
+ })
85
+ .filter((t) => t !== null);
86
+ if (ftsTokens.length === 0) {
87
+ return '';
88
+ }
89
+ return ftsTokens.join(' OR ');
90
+ }
91
+ searchEntities(query) {
92
+ const MAX_LIMIT = 1000;
93
+ if (query.limit === 0) {
94
+ return [];
95
+ }
96
+ let effectiveLimit = query.limit;
97
+ if (query.limit !== undefined) {
98
+ if (query.limit < 0) {
99
+ throw new ValidationError('Limit must be non-negative', {
100
+ component: 'KGSearchEngine',
101
+ method: 'searchEntities',
102
+ providedLimit: query.limit,
103
+ });
104
+ }
105
+ if (query.limit > MAX_LIMIT) {
106
+ logger.warn(`Limit ${query.limit} exceeds maximum, capping to ${MAX_LIMIT}`);
107
+ effectiveLimit = MAX_LIMIT;
108
+ }
109
+ }
110
+ if (query.offset !== undefined && query.offset < 0) {
111
+ throw new ValidationError('Offset must be non-negative', {
112
+ component: 'KGSearchEngine',
113
+ method: 'searchEntities',
114
+ providedOffset: query.offset,
115
+ });
116
+ }
117
+ if (query.namePattern !== undefined && query.namePattern !== '') {
118
+ validateNonEmptyString(query.namePattern, 'Name pattern');
119
+ if (CONTROL_CHAR_PATTERN.test(query.namePattern)) {
120
+ throw new ValidationError('Name pattern must not contain control characters', {
121
+ component: 'KGSearchEngine',
122
+ method: 'searchEntities',
123
+ namePattern: query.namePattern.slice(0, 100),
124
+ });
125
+ }
126
+ }
127
+ const cacheKeyQuery = { ...query, limit: effectiveLimit };
128
+ const cacheKey = `entities:${JSON.stringify(cacheKeyQuery)}`;
129
+ const cached = this.ctx.queryCache.get(cacheKey);
130
+ if (cached) {
131
+ return cached;
132
+ }
133
+ let sql = `
134
+ SELECT e.*,
135
+ (SELECT json_group_array(content) FROM observations o WHERE o.entity_id = e.id) as observations_json,
136
+ (SELECT json_group_array(tag) FROM tags t WHERE t.entity_id = e.id) as tags_json
137
+ FROM entities e
138
+ WHERE 1=1
139
+ `;
140
+ const params = [];
141
+ if (query.entityType) {
142
+ sql += ' AND e.type = ?';
143
+ params.push(query.entityType);
144
+ }
145
+ if (query.tag) {
146
+ sql += ' AND e.id IN (SELECT entity_id FROM tags WHERE tag = ?)';
147
+ params.push(query.tag);
148
+ }
149
+ if (query.namePattern) {
150
+ const ftsResults = this.searchFTS5(query.namePattern, effectiveLimit || 100);
151
+ if (ftsResults.length > 0) {
152
+ sql += ' AND e.id IN (' + ftsResults.map(() => '?').join(',') + ')';
153
+ params.push(...ftsResults);
154
+ }
155
+ else {
156
+ sql += " AND (e.name LIKE ? ESCAPE '!' OR e.id IN (SELECT entity_id FROM observations WHERE content LIKE ? ESCAPE '!'))";
157
+ const escapedPattern = `%${this.escapeLikePattern(query.namePattern)}%`;
158
+ params.push(escapedPattern);
159
+ params.push(escapedPattern);
160
+ }
161
+ }
162
+ sql += ' ORDER BY e.created_at DESC';
163
+ if (effectiveLimit !== undefined) {
164
+ sql += ' LIMIT ?';
165
+ params.push(effectiveLimit);
166
+ }
167
+ if (query.offset !== undefined) {
168
+ sql += ' OFFSET ?';
169
+ params.push(query.offset);
170
+ }
171
+ const stmt = this.ctx.db.prepare(sql);
172
+ const rows = stmt.all(...params);
173
+ const entities = new Array(rows.length);
174
+ for (let i = 0; i < rows.length; i++) {
175
+ const r = rows[i];
176
+ const observations = safeJsonParse(r.observations_json, [])
177
+ .filter(value => value);
178
+ const tags = safeJsonParse(r.tags_json, [])
179
+ .filter(value => value);
180
+ entities[i] = {
181
+ id: r.id,
182
+ name: r.name,
183
+ entityType: r.type,
184
+ observations,
185
+ tags,
186
+ metadata: r.metadata ? safeJsonParse(r.metadata, {}) : {},
187
+ createdAt: new Date(r.created_at)
188
+ };
189
+ }
190
+ this.ctx.queryCache.set(cacheKey, entities);
191
+ return entities;
192
+ }
193
+ async semanticSearch(query, options = {}) {
194
+ const { limit = 10, minSimilarity = 0.3 } = options;
195
+ const vectorInitPromise = this.ctx.getVectorInitPromise();
196
+ if (vectorInitPromise) {
197
+ await vectorInitPromise;
198
+ }
199
+ const vectorAdapter = this.ctx.getVectorAdapter();
200
+ if (!this.ctx.isVectorEnabled() || !vectorAdapter) {
201
+ return this.keywordSearchAsSemanticResults(query, limit);
202
+ }
203
+ try {
204
+ const { LazyEmbeddingService } = await import('../embeddings/EmbeddingService.js');
205
+ const service = await LazyEmbeddingService.get();
206
+ const queryEmbedding = await service.encode(query);
207
+ const knnResults = vectorAdapter.knnSearch(this.ctx.db, queryEmbedding, limit * 2);
208
+ const results = [];
209
+ for (const knn of knnResults) {
210
+ const similarity = 1 - knn.distance;
211
+ if (similarity < minSimilarity)
212
+ continue;
213
+ const entity = this.ctx.getEntity(knn.entityName);
214
+ if (!entity)
215
+ continue;
216
+ results.push({ entity, similarity });
217
+ }
218
+ return results.slice(0, limit);
219
+ }
220
+ catch (error) {
221
+ logger.warn('[KG] Semantic search failed, falling back to keyword', {
222
+ error: error instanceof Error ? error.message : String(error),
223
+ });
224
+ return this.keywordSearchAsSemanticResults(query, limit);
225
+ }
226
+ }
227
+ async hybridSearch(query, options = {}) {
228
+ const { limit = 10, minSimilarity = 0.3 } = options;
229
+ const keywordResults = this.keywordSearchAsSemanticResults(query, limit);
230
+ const vectorInitPromise = this.ctx.getVectorInitPromise();
231
+ if (vectorInitPromise) {
232
+ await vectorInitPromise;
233
+ }
234
+ if (!this.ctx.isVectorEnabled()) {
235
+ return keywordResults;
236
+ }
237
+ const semanticResults = await this.semanticSearch(query, { limit, minSimilarity });
238
+ const merged = new Map();
239
+ for (const r of keywordResults) {
240
+ merged.set(r.entity.name, r);
241
+ }
242
+ for (const r of semanticResults) {
243
+ const existing = merged.get(r.entity.name);
244
+ if (!existing || r.similarity > existing.similarity) {
245
+ merged.set(r.entity.name, r);
246
+ }
247
+ }
248
+ return Array.from(merged.values())
249
+ .sort((a, b) => b.similarity - a.similarity)
250
+ .slice(0, limit);
251
+ }
252
+ keywordSearchAsSemanticResults(query, limit) {
253
+ const entities = this.searchEntities({ namePattern: query, limit });
254
+ return entities.map(entity => ({ entity, similarity: 0.5 }));
255
+ }
256
+ }
257
+ //# sourceMappingURL=KGSearchEngine.js.map