mindgraph-core 0.1.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 (169) hide show
  1. package/dist/embeddings/embedder-interface.d.ts +15 -0
  2. package/dist/embeddings/embedder-interface.d.ts.map +1 -0
  3. package/dist/embeddings/embedder-interface.js +2 -0
  4. package/dist/embeddings/embedder-interface.js.map +1 -0
  5. package/dist/embeddings/ollama-embedder.d.ts +21 -0
  6. package/dist/embeddings/ollama-embedder.d.ts.map +1 -0
  7. package/dist/embeddings/ollama-embedder.js +78 -0
  8. package/dist/embeddings/ollama-embedder.js.map +1 -0
  9. package/dist/embeddings/transformers-embedder.d.ts +20 -0
  10. package/dist/embeddings/transformers-embedder.d.ts.map +1 -0
  11. package/dist/embeddings/transformers-embedder.js +61 -0
  12. package/dist/embeddings/transformers-embedder.js.map +1 -0
  13. package/dist/extraction/anthropic-extractor.d.ts +17 -0
  14. package/dist/extraction/anthropic-extractor.d.ts.map +1 -0
  15. package/dist/extraction/anthropic-extractor.js +43 -0
  16. package/dist/extraction/anthropic-extractor.js.map +1 -0
  17. package/dist/extraction/basic-extractor.d.ts +17 -0
  18. package/dist/extraction/basic-extractor.d.ts.map +1 -0
  19. package/dist/extraction/basic-extractor.js +135 -0
  20. package/dist/extraction/basic-extractor.js.map +1 -0
  21. package/dist/extraction/confidence-gate.d.ts +7 -0
  22. package/dist/extraction/confidence-gate.d.ts.map +1 -0
  23. package/dist/extraction/confidence-gate.js +13 -0
  24. package/dist/extraction/confidence-gate.js.map +1 -0
  25. package/dist/extraction/contradiction-detector.d.ts +46 -0
  26. package/dist/extraction/contradiction-detector.d.ts.map +1 -0
  27. package/dist/extraction/contradiction-detector.js +205 -0
  28. package/dist/extraction/contradiction-detector.js.map +1 -0
  29. package/dist/extraction/entity-index.d.ts +31 -0
  30. package/dist/extraction/entity-index.d.ts.map +1 -0
  31. package/dist/extraction/entity-index.js +90 -0
  32. package/dist/extraction/entity-index.js.map +1 -0
  33. package/dist/extraction/entity-resolver.d.ts +28 -0
  34. package/dist/extraction/entity-resolver.d.ts.map +1 -0
  35. package/dist/extraction/entity-resolver.js +111 -0
  36. package/dist/extraction/entity-resolver.js.map +1 -0
  37. package/dist/extraction/extractor-interface.d.ts +51 -0
  38. package/dist/extraction/extractor-interface.d.ts.map +1 -0
  39. package/dist/extraction/extractor-interface.js +2 -0
  40. package/dist/extraction/extractor-interface.js.map +1 -0
  41. package/dist/extraction/llm-extractor.d.ts +21 -0
  42. package/dist/extraction/llm-extractor.d.ts.map +1 -0
  43. package/dist/extraction/llm-extractor.js +97 -0
  44. package/dist/extraction/llm-extractor.js.map +1 -0
  45. package/dist/extraction/ollama-extractor.d.ts +18 -0
  46. package/dist/extraction/ollama-extractor.d.ts.map +1 -0
  47. package/dist/extraction/ollama-extractor.js +50 -0
  48. package/dist/extraction/ollama-extractor.js.map +1 -0
  49. package/dist/extraction/open-loop-detector.d.ts +24 -0
  50. package/dist/extraction/open-loop-detector.d.ts.map +1 -0
  51. package/dist/extraction/open-loop-detector.js +187 -0
  52. package/dist/extraction/open-loop-detector.js.map +1 -0
  53. package/dist/extraction/openai-extractor.d.ts +20 -0
  54. package/dist/extraction/openai-extractor.d.ts.map +1 -0
  55. package/dist/extraction/openai-extractor.js +44 -0
  56. package/dist/extraction/openai-extractor.js.map +1 -0
  57. package/dist/extraction/prompts/entity-extraction.d.ts +2 -0
  58. package/dist/extraction/prompts/entity-extraction.d.ts.map +1 -0
  59. package/dist/extraction/prompts/entity-extraction.js +42 -0
  60. package/dist/extraction/prompts/entity-extraction.js.map +1 -0
  61. package/dist/extraction/prompts/proposition-extraction.d.ts +2 -0
  62. package/dist/extraction/prompts/proposition-extraction.d.ts.map +1 -0
  63. package/dist/extraction/prompts/proposition-extraction.js +39 -0
  64. package/dist/extraction/prompts/proposition-extraction.js.map +1 -0
  65. package/dist/extraction/prompts/thought-extraction.d.ts +2 -0
  66. package/dist/extraction/prompts/thought-extraction.d.ts.map +1 -0
  67. package/dist/extraction/prompts/thought-extraction.js +41 -0
  68. package/dist/extraction/prompts/thought-extraction.js.map +1 -0
  69. package/dist/index.d.ts +41 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +33 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/ingestion/chunk-id.d.ts +27 -0
  74. package/dist/ingestion/chunk-id.d.ts.map +1 -0
  75. package/dist/ingestion/chunk-id.js +45 -0
  76. package/dist/ingestion/chunk-id.js.map +1 -0
  77. package/dist/ingestion/chunker.d.ts +29 -0
  78. package/dist/ingestion/chunker.d.ts.map +1 -0
  79. package/dist/ingestion/chunker.js +182 -0
  80. package/dist/ingestion/chunker.js.map +1 -0
  81. package/dist/ingestion/hasher.d.ts +7 -0
  82. package/dist/ingestion/hasher.d.ts.map +1 -0
  83. package/dist/ingestion/hasher.js +18 -0
  84. package/dist/ingestion/hasher.js.map +1 -0
  85. package/dist/ingestion/pipeline.d.ts +58 -0
  86. package/dist/ingestion/pipeline.d.ts.map +1 -0
  87. package/dist/ingestion/pipeline.js +653 -0
  88. package/dist/ingestion/pipeline.js.map +1 -0
  89. package/dist/models/citation.d.ts +2 -0
  90. package/dist/models/citation.d.ts.map +1 -0
  91. package/dist/models/citation.js +2 -0
  92. package/dist/models/citation.js.map +1 -0
  93. package/dist/models/extraction-result.d.ts +2 -0
  94. package/dist/models/extraction-result.d.ts.map +1 -0
  95. package/dist/models/extraction-result.js +2 -0
  96. package/dist/models/extraction-result.js.map +1 -0
  97. package/dist/models/query-result.d.ts +2 -0
  98. package/dist/models/query-result.d.ts.map +1 -0
  99. package/dist/models/query-result.js +2 -0
  100. package/dist/models/query-result.js.map +1 -0
  101. package/dist/query/answer-builder.d.ts +15 -0
  102. package/dist/query/answer-builder.d.ts.map +1 -0
  103. package/dist/query/answer-builder.js +51 -0
  104. package/dist/query/answer-builder.js.map +1 -0
  105. package/dist/query/citation-builder.d.ts +19 -0
  106. package/dist/query/citation-builder.d.ts.map +1 -0
  107. package/dist/query/citation-builder.js +54 -0
  108. package/dist/query/citation-builder.js.map +1 -0
  109. package/dist/query/graph-data.d.ts +39 -0
  110. package/dist/query/graph-data.d.ts.map +1 -0
  111. package/dist/query/graph-data.js +115 -0
  112. package/dist/query/graph-data.js.map +1 -0
  113. package/dist/query/graph-search.d.ts +43 -0
  114. package/dist/query/graph-search.d.ts.map +1 -0
  115. package/dist/query/graph-search.js +315 -0
  116. package/dist/query/graph-search.js.map +1 -0
  117. package/dist/query/query-engine.d.ts +41 -0
  118. package/dist/query/query-engine.d.ts.map +1 -0
  119. package/dist/query/query-engine.js +178 -0
  120. package/dist/query/query-engine.js.map +1 -0
  121. package/dist/query/semantic-search.d.ts +26 -0
  122. package/dist/query/semantic-search.d.ts.map +1 -0
  123. package/dist/query/semantic-search.js +132 -0
  124. package/dist/query/semantic-search.js.map +1 -0
  125. package/dist/schema/edge-types.d.ts +95 -0
  126. package/dist/schema/edge-types.d.ts.map +1 -0
  127. package/dist/schema/edge-types.js +6 -0
  128. package/dist/schema/edge-types.js.map +1 -0
  129. package/dist/schema/node-types.d.ts +100 -0
  130. package/dist/schema/node-types.d.ts.map +1 -0
  131. package/dist/schema/node-types.js +6 -0
  132. package/dist/schema/node-types.js.map +1 -0
  133. package/dist/schema/types.d.ts +134 -0
  134. package/dist/schema/types.d.ts.map +1 -0
  135. package/dist/schema/types.js +52 -0
  136. package/dist/schema/types.js.map +1 -0
  137. package/dist/schema/validation.d.ts +6 -0
  138. package/dist/schema/validation.d.ts.map +1 -0
  139. package/dist/schema/validation.js +140 -0
  140. package/dist/schema/validation.js.map +1 -0
  141. package/dist/storage/export-import.d.ts +28 -0
  142. package/dist/storage/export-import.d.ts.map +1 -0
  143. package/dist/storage/export-import.js +189 -0
  144. package/dist/storage/export-import.js.map +1 -0
  145. package/dist/storage/memory/memory-adapter.d.ts +36 -0
  146. package/dist/storage/memory/memory-adapter.d.ts.map +1 -0
  147. package/dist/storage/memory/memory-adapter.js +231 -0
  148. package/dist/storage/memory/memory-adapter.js.map +1 -0
  149. package/dist/storage/sqlite/graph-traversal.d.ts +11 -0
  150. package/dist/storage/sqlite/graph-traversal.d.ts.map +1 -0
  151. package/dist/storage/sqlite/graph-traversal.js +79 -0
  152. package/dist/storage/sqlite/graph-traversal.js.map +1 -0
  153. package/dist/storage/sqlite/query-builder.d.ts +8 -0
  154. package/dist/storage/sqlite/query-builder.d.ts.map +1 -0
  155. package/dist/storage/sqlite/query-builder.js +55 -0
  156. package/dist/storage/sqlite/query-builder.js.map +1 -0
  157. package/dist/storage/sqlite/sqlite-adapter.d.ts +53 -0
  158. package/dist/storage/sqlite/sqlite-adapter.d.ts.map +1 -0
  159. package/dist/storage/sqlite/sqlite-adapter.js +497 -0
  160. package/dist/storage/sqlite/sqlite-adapter.js.map +1 -0
  161. package/dist/storage/storage-interface.d.ts +64 -0
  162. package/dist/storage/storage-interface.d.ts.map +1 -0
  163. package/dist/storage/storage-interface.js +2 -0
  164. package/dist/storage/storage-interface.js.map +1 -0
  165. package/dist/utils/retry-fetch.d.ts +20 -0
  166. package/dist/utils/retry-fetch.d.ts.map +1 -0
  167. package/dist/utils/retry-fetch.js +71 -0
  168. package/dist/utils/retry-fetch.js.map +1 -0
  169. package/package.json +28 -0
@@ -0,0 +1,15 @@
1
+ export interface EmbeddingProvider {
2
+ readonly modelId: string;
3
+ readonly dimensions: number;
4
+ /** Initialize the model (download if needed, load into memory). */
5
+ initialize(): Promise<void>;
6
+ /** Embed a single text. */
7
+ embed(text: string): Promise<Float32Array>;
8
+ /** Embed multiple texts (batch). May be more efficient. */
9
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
10
+ /** Check if the provider is available (e.g., Ollama running). */
11
+ isAvailable(): Promise<boolean>;
12
+ /** Release resources. */
13
+ dispose(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=embedder-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-interface.d.ts","sourceRoot":"","sources":["../../src/embeddings/embedder-interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,mEAAmE;IACnE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,2BAA2B;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3C,2DAA2D;IAC3D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAErD,iEAAiE;IACjE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC,yBAAyB;IACzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embedder-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-interface.js","sourceRoot":"","sources":["../../src/embeddings/embedder-interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { EmbeddingProvider } from './embedder-interface.js';
2
+ export interface OllamaEmbedderOptions {
3
+ baseUrl?: string;
4
+ model?: string;
5
+ }
6
+ /**
7
+ * Embedding provider using Ollama's embedding API.
8
+ * Uses nomic-embed-text by default (768 dimensions).
9
+ */
10
+ export declare class OllamaEmbedder implements EmbeddingProvider {
11
+ readonly modelId: string;
12
+ readonly dimensions: number;
13
+ private readonly baseUrl;
14
+ constructor(options?: OllamaEmbedderOptions);
15
+ initialize(): Promise<void>;
16
+ embed(text: string): Promise<Float32Array>;
17
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
18
+ isAvailable(): Promise<boolean>;
19
+ dispose(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=ollama-embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-embedder.d.ts","sourceRoot":"","sources":["../../src/embeddings/ollama-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,qBAA0B;IAOzC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA4BpD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAc/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Embedding provider using Ollama's embedding API.
3
+ * Uses nomic-embed-text by default (768 dimensions).
4
+ */
5
+ export class OllamaEmbedder {
6
+ constructor(options = {}) {
7
+ this.baseUrl = options.baseUrl ?? 'http://localhost:11434';
8
+ this.modelId = options.model ?? 'nomic-embed-text';
9
+ // nomic-embed-text: 768d, all-minilm: 384d, mxbai-embed-large: 1024d
10
+ this.dimensions = this.modelId.includes('minilm') ? 384 : this.modelId.includes('mxbai') ? 1024 : 768;
11
+ }
12
+ async initialize() {
13
+ // Verify Ollama is running and model is available
14
+ const available = await this.isAvailable();
15
+ if (!available) {
16
+ throw new Error(`Ollama not available at ${this.baseUrl} or model ${this.modelId} not found`);
17
+ }
18
+ }
19
+ async embed(text) {
20
+ const response = await fetch(`${this.baseUrl}/api/embeddings`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify({
24
+ model: this.modelId,
25
+ prompt: text,
26
+ }),
27
+ });
28
+ if (!response.ok) {
29
+ throw new Error(`Ollama embedding failed: ${response.status} ${response.statusText}`);
30
+ }
31
+ const data = (await response.json());
32
+ return new Float32Array(data.embedding);
33
+ }
34
+ async embedBatch(texts) {
35
+ if (texts.length <= 1) {
36
+ return texts.length === 0 ? [] : [await this.embed(texts[0])];
37
+ }
38
+ // Try Ollama's /api/embed batch endpoint first
39
+ try {
40
+ const response = await fetch(`${this.baseUrl}/api/embed`, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify({ model: this.modelId, input: texts }),
44
+ });
45
+ if (response.ok) {
46
+ const data = (await response.json());
47
+ return data.embeddings.map((e) => new Float32Array(e));
48
+ }
49
+ }
50
+ catch {
51
+ // Fall through to sequential
52
+ }
53
+ // Fallback: sequential
54
+ const results = [];
55
+ for (const text of texts) {
56
+ results.push(await this.embed(text));
57
+ }
58
+ return results;
59
+ }
60
+ async isAvailable() {
61
+ try {
62
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
63
+ signal: AbortSignal.timeout(3000),
64
+ });
65
+ if (!response.ok)
66
+ return false;
67
+ const data = (await response.json());
68
+ return data.models.some((m) => m.name.includes(this.modelId));
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ async dispose() {
75
+ // no-op
76
+ }
77
+ }
78
+ //# sourceMappingURL=ollama-embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-embedder.js","sourceRoot":"","sources":["../../src/embeddings/ollama-embedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { EmbeddingProvider } from './embedder-interface.js';
2
+ /**
3
+ * In-process embedding using Transformers.js (ONNX Runtime / WASM).
4
+ * Uses all-MiniLM-L6-v2 (384 dimensions, ~80MB model).
5
+ * Runs entirely locally — no external dependencies.
6
+ */
7
+ export declare class TransformersEmbedder implements EmbeddingProvider {
8
+ private readonly cacheDir?;
9
+ readonly modelId = "all-MiniLM-L6-v2";
10
+ readonly dimensions = 384;
11
+ private pipeline;
12
+ private pipelineFn;
13
+ constructor(cacheDir?: string | undefined);
14
+ initialize(): Promise<void>;
15
+ embed(text: string): Promise<Float32Array>;
16
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
17
+ isAvailable(): Promise<boolean>;
18
+ dispose(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=transformers-embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers-embedder.d.ts","sourceRoot":"","sources":["../../src/embeddings/transformers-embedder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAOhD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IANtC,QAAQ,CAAC,OAAO,sBAAsB;IACtC,QAAQ,CAAC,UAAU,OAAO;IAE1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAiB;gBAEN,QAAQ,CAAC,EAAE,MAAM,YAAA;IAExC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASpD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * In-process embedding using Transformers.js (ONNX Runtime / WASM).
3
+ * Uses all-MiniLM-L6-v2 (384 dimensions, ~80MB model).
4
+ * Runs entirely locally — no external dependencies.
5
+ */
6
+ export class TransformersEmbedder {
7
+ constructor(cacheDir) {
8
+ this.cacheDir = cacheDir;
9
+ this.modelId = 'all-MiniLM-L6-v2';
10
+ this.dimensions = 384;
11
+ this.pipeline = null;
12
+ this.pipelineFn = null;
13
+ }
14
+ async initialize() {
15
+ // Dynamic import to avoid bundling issues
16
+ const { pipeline, env } = await import('@huggingface/transformers');
17
+ if (this.cacheDir) {
18
+ env.cacheDir = this.cacheDir;
19
+ }
20
+ // Disable remote model downloads attempt if offline
21
+ env.allowRemoteModels = true;
22
+ this.pipelineFn = pipeline;
23
+ this.pipeline = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2', {
24
+ quantized: true,
25
+ });
26
+ }
27
+ async embed(text) {
28
+ if (!this.pipeline) {
29
+ throw new Error('TransformersEmbedder not initialized. Call initialize() first.');
30
+ }
31
+ const embedFn = this.pipeline;
32
+ const result = await embedFn(text, {
33
+ pooling: 'mean',
34
+ normalize: true,
35
+ });
36
+ return new Float32Array(result.data);
37
+ }
38
+ async embedBatch(texts) {
39
+ // Transformers.js handles batching internally
40
+ const results = [];
41
+ for (const text of texts) {
42
+ results.push(await this.embed(text));
43
+ }
44
+ return results;
45
+ }
46
+ async isAvailable() {
47
+ try {
48
+ if (!this.pipeline)
49
+ await this.initialize();
50
+ return true;
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ async dispose() {
57
+ this.pipeline = null;
58
+ this.pipelineFn = null;
59
+ }
60
+ }
61
+ //# sourceMappingURL=transformers-embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers-embedder.js","sourceRoot":"","sources":["../../src/embeddings/transformers-embedder.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAO/B,YAA6B,QAAiB;QAAjB,aAAQ,GAAR,QAAQ,CAAS;QANrC,YAAO,GAAG,kBAAkB,CAAC;QAC7B,eAAU,GAAG,GAAG,CAAC;QAElB,aAAQ,GAAY,IAAI,CAAC;QACzB,eAAU,GAAY,IAAI,CAAC;IAEc,CAAC;IAElD,KAAK,CAAC,UAAU;QACd,0CAA0C;QAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,CAAC;QAED,oDAAoD;QACpD,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,MAAO,QAAqB,CAAC,oBAAoB,EAAE,yBAAyB,EAAE;YAC5F,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAGe,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;YACjC,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,8CAA8C;QAC9C,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import { LLMExtractor } from './llm-extractor.js';
2
+ export interface AnthropicExtractorOptions {
3
+ apiKey: string;
4
+ model?: string;
5
+ }
6
+ /**
7
+ * LLM-based extractor using the Anthropic Messages API.
8
+ */
9
+ export declare class AnthropicExtractor extends LLMExtractor {
10
+ readonly name = "anthropic";
11
+ private readonly apiKey;
12
+ private readonly model;
13
+ constructor(options: AnthropicExtractorOptions);
14
+ isAvailable(): Promise<boolean>;
15
+ protected callLLM(prompt: string): Promise<string>;
16
+ }
17
+ //# sourceMappingURL=anthropic-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-extractor.d.ts","sourceRoot":"","sources":["../../src/extraction/anthropic-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,EAAE,yBAAyB;IAMxC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;cAIrB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA4BzD"}
@@ -0,0 +1,43 @@
1
+ import { LLMExtractor } from './llm-extractor.js';
2
+ import { retryFetch } from '../utils/retry-fetch.js';
3
+ /**
4
+ * LLM-based extractor using the Anthropic Messages API.
5
+ */
6
+ export class AnthropicExtractor extends LLMExtractor {
7
+ constructor(options) {
8
+ super();
9
+ this.name = 'anthropic';
10
+ this.apiKey = options.apiKey;
11
+ this.model = options.model ?? 'claude-haiku-4-5-20251001';
12
+ }
13
+ async isAvailable() {
14
+ return this.apiKey.trim().length > 0;
15
+ }
16
+ async callLLM(prompt) {
17
+ const response = await retryFetch('https://api.anthropic.com/v1/messages', {
18
+ method: 'POST',
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ 'x-api-key': this.apiKey,
22
+ 'anthropic-version': '2023-06-01',
23
+ },
24
+ body: JSON.stringify({
25
+ model: this.model,
26
+ system: 'You are a structured data extraction system. Always respond with valid JSON only, no extra text.',
27
+ messages: [
28
+ { role: 'user', content: prompt },
29
+ ],
30
+ max_tokens: 2048,
31
+ temperature: 0.1,
32
+ }),
33
+ });
34
+ if (!response.ok) {
35
+ const text = await response.text().catch(() => '');
36
+ throw new Error(`Anthropic request failed: ${response.status} ${text}`);
37
+ }
38
+ const data = (await response.json());
39
+ const textBlock = data.content.find((b) => b.type === 'text');
40
+ return textBlock?.text ?? '{}';
41
+ }
42
+ }
43
+ //# sourceMappingURL=anthropic-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-extractor.js","sourceRoot":"","sources":["../../src/extraction/anthropic-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAWrD;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAKlD,YAAY,OAAkC;QAC5C,KAAK,EAAE,CAAC;QALD,SAAI,GAAG,WAAW,CAAC;QAM1B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,2BAA2B,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,MAAc;QACpC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,uCAAuC,EAAE;YACzE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,kGAAkG;gBAC1G,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;iBAClC;gBACD,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,GAAG;aACjB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAC9D,OAAO,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import type { Chunk } from '../ingestion/chunker.js';
2
+ import type { ExtractionProvider, ExtractionResult } from './extractor-interface.js';
3
+ /**
4
+ * Heuristic/regex-based extractor.
5
+ * Zero-dependency fallback that works without Ollama.
6
+ * Extracts:
7
+ * - Wiki-links [[like this]] as entities/concepts
8
+ * - #tags as concepts
9
+ * - Capitalized multi-word phrases as potential entities
10
+ * - URLs, dates, locations (basic patterns)
11
+ */
12
+ export declare class BasicExtractor implements ExtractionProvider {
13
+ readonly name = "basic";
14
+ isAvailable(): Promise<boolean>;
15
+ extract(chunk: Chunk, _noteContent: string): Promise<ExtractionResult>;
16
+ }
17
+ //# sourceMappingURL=basic-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-extractor.d.ts","sourceRoot":"","sources":["../../src/extraction/basic-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAGjB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;GAQG;AACH,qBAAa,cAAe,YAAW,kBAAkB;IACvD,QAAQ,CAAC,IAAI,WAAW;IAElB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAyF7E"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Heuristic/regex-based extractor.
3
+ * Zero-dependency fallback that works without Ollama.
4
+ * Extracts:
5
+ * - Wiki-links [[like this]] as entities/concepts
6
+ * - #tags as concepts
7
+ * - Capitalized multi-word phrases as potential entities
8
+ * - URLs, dates, locations (basic patterns)
9
+ */
10
+ export class BasicExtractor {
11
+ constructor() {
12
+ this.name = 'basic';
13
+ }
14
+ async isAvailable() {
15
+ return true; // always available
16
+ }
17
+ async extract(chunk, _noteContent) {
18
+ const text = chunk.text;
19
+ const entities = [];
20
+ const concepts = [];
21
+ // Extract [[wiki-links]]
22
+ const wikiLinkRegex = /\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g;
23
+ let match;
24
+ while ((match = wikiLinkRegex.exec(text)) !== null) {
25
+ const target = match[1].trim();
26
+ const alias = match[2]?.trim();
27
+ const start = chunk.startOffset + match.index;
28
+ const end = start + match[0].length;
29
+ // Classify: if it looks like a proper noun, it's an entity; otherwise concept
30
+ if (looksLikeProperNoun(target)) {
31
+ const existing = entities.find((e) => e.name.toLowerCase() === target.toLowerCase());
32
+ if (existing) {
33
+ existing.spans.push({ start, end });
34
+ if (alias && !existing.aliases.includes(alias)) {
35
+ existing.aliases.push(alias);
36
+ }
37
+ }
38
+ else {
39
+ entities.push({
40
+ name: target,
41
+ entityType: 'other',
42
+ aliases: alias ? [alias] : [],
43
+ description: '',
44
+ confidence: 0.7,
45
+ spans: [{ start, end }],
46
+ });
47
+ }
48
+ }
49
+ else {
50
+ if (!concepts.find((c) => c.name.toLowerCase() === target.toLowerCase())) {
51
+ concepts.push({
52
+ name: target,
53
+ domain: '',
54
+ description: '',
55
+ confidence: 0.6,
56
+ });
57
+ }
58
+ }
59
+ }
60
+ // Extract #tags as concepts
61
+ const tagRegex = /#([a-zA-Z][\w/-]*)/g;
62
+ while ((match = tagRegex.exec(text)) !== null) {
63
+ const tag = match[1];
64
+ if (!concepts.find((c) => c.name.toLowerCase() === tag.toLowerCase())) {
65
+ concepts.push({
66
+ name: tag,
67
+ domain: '',
68
+ description: `Tag: ${tag}`,
69
+ confidence: 0.8,
70
+ });
71
+ }
72
+ }
73
+ // Extract capitalized multi-word phrases (potential named entities)
74
+ const namedEntityRegex = /(?:^|[\s,;(])((?:[A-Z][a-z]+\s+){1,3}[A-Z][a-z]+)/g;
75
+ while ((match = namedEntityRegex.exec(text)) !== null) {
76
+ const name = match[1].trim();
77
+ // Skip common false positives
78
+ if (isCommonPhrase(name))
79
+ continue;
80
+ if (entities.find((e) => e.name.toLowerCase() === name.toLowerCase()))
81
+ continue;
82
+ const start = chunk.startOffset + match.index;
83
+ const end = start + match[0].length;
84
+ entities.push({
85
+ name,
86
+ entityType: guessEntityType(name),
87
+ aliases: [],
88
+ description: '',
89
+ confidence: 0.4, // lower confidence for regex matches
90
+ spans: [{ start, end }],
91
+ });
92
+ }
93
+ return {
94
+ entities,
95
+ concepts,
96
+ propositions: [], // basic extractor doesn't extract propositions
97
+ thoughts: [], // basic extractor doesn't extract thoughts
98
+ };
99
+ }
100
+ }
101
+ function looksLikeProperNoun(text) {
102
+ const words = text.split(/\s+/);
103
+ return words.some((w) => /^[A-Z][a-z]/.test(w));
104
+ }
105
+ function guessEntityType(name) {
106
+ const lower = name.toLowerCase();
107
+ const orgSuffixes = ['inc', 'corp', 'co', 'ltd', 'llc', 'foundation', 'institute', 'university', 'company'];
108
+ if (orgSuffixes.some((s) => lower.endsWith(s)))
109
+ return 'organization';
110
+ // Simple heuristic: 2-3 word names are likely people
111
+ const words = name.split(/\s+/);
112
+ if (words.length >= 2 && words.length <= 3)
113
+ return 'person';
114
+ return 'other';
115
+ }
116
+ const COMMON_PHRASES = new Set([
117
+ 'the first', 'the last', 'the next', 'the other',
118
+ 'for example', 'in addition', 'on the', 'in the',
119
+ 'this is', 'that is', 'there are', 'there is',
120
+ 'new york', // keep this as entity
121
+ ]);
122
+ function isCommonPhrase(phrase) {
123
+ const lower = phrase.toLowerCase();
124
+ // Filter out very short or generic phrases
125
+ if (phrase.length < 4)
126
+ return true;
127
+ if (COMMON_PHRASES.has(lower))
128
+ return true;
129
+ // Filter phrases starting with common words
130
+ if (/^(the|a|an|this|that|these|those|my|your|his|her|its|our|their)\s/i.test(phrase)) {
131
+ return true;
132
+ }
133
+ return false;
134
+ }
135
+ //# sourceMappingURL=basic-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-extractor.js","sourceRoot":"","sources":["../../src/extraction/basic-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ExtractionResult } from './extractor-interface.js';
2
+ /**
3
+ * Filter extraction results by confidence threshold.
4
+ * Items below the threshold are dropped.
5
+ */
6
+ export declare function applyConfidenceGate(result: ExtractionResult, threshold?: number): ExtractionResult;
7
+ //# sourceMappingURL=confidence-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence-gate.d.ts","sourceRoot":"","sources":["../../src/extraction/confidence-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,SAAS,GAAE,MAAY,GACtB,gBAAgB,CAOlB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Filter extraction results by confidence threshold.
3
+ * Items below the threshold are dropped.
4
+ */
5
+ export function applyConfidenceGate(result, threshold = 0.5) {
6
+ return {
7
+ entities: result.entities.filter((e) => e.confidence >= threshold),
8
+ concepts: result.concepts.filter((c) => c.confidence >= threshold),
9
+ propositions: result.propositions.filter((p) => p.confidence >= threshold),
10
+ thoughts: result.thoughts.filter((t) => t.confidence >= threshold),
11
+ };
12
+ }
13
+ //# sourceMappingURL=confidence-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence-gate.js","sourceRoot":"","sources":["../../src/extraction/confidence-gate.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAwB,EACxB,YAAoB,GAAG;IAEvB,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC;QAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC;QAClE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC;QAC1E,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC;KACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { StorageAdapter } from '../storage/storage-interface.js';
2
+ import type { EmbeddingProvider } from '../embeddings/embedder-interface.js';
3
+ import { type GraphNode } from '../schema/types.js';
4
+ export interface ContradictionCandidate {
5
+ propositionA: GraphNode;
6
+ propositionB: GraphNode;
7
+ similarityScore: number;
8
+ sharedTargets: string[];
9
+ method: 'negation_heuristic' | 'llm_judge';
10
+ evidence: {
11
+ p1Span?: string;
12
+ p2Span?: string;
13
+ };
14
+ }
15
+ /**
16
+ * Detects contradictions between propositions.
17
+ * Strategy: embedding similarity to find candidates, then topic-grounding filter,
18
+ * then heuristic conflict check.
19
+ */
20
+ export declare class ContradictionDetector {
21
+ private storage;
22
+ private embedder;
23
+ constructor(storage: StorageAdapter, embedder: EmbeddingProvider | null);
24
+ /**
25
+ * Find propositions that may contradict the given proposition.
26
+ * Uses embedding similarity to find candidates about the same topic,
27
+ * then filters by shared ABOUT targets (topic grounding).
28
+ */
29
+ findCandidates(propositionId: string, topK?: number, similarityThreshold?: number): Promise<ContradictionCandidate[]>;
30
+ /**
31
+ * Create CONTRADICTS edges for confirmed contradictions with enriched data.
32
+ */
33
+ createContradictionEdges(candidates: ContradictionCandidate[]): Promise<string[]>;
34
+ /**
35
+ * Get ABOUT edge target IDs for a proposition.
36
+ */
37
+ private getAboutTargetIds;
38
+ /**
39
+ * Fallback: find shared entity/concept mentions from source chunks.
40
+ */
41
+ private getSharedMentionTargets;
42
+ private getSourceChunkIds;
43
+ private findCandidatesByText;
44
+ private statementsConflict;
45
+ }
46
+ //# sourceMappingURL=contradiction-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contradiction-detector.d.ts","sourceRoot":"","sources":["../../src/extraction/contradiction-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,iCAAiC,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAqB,KAAK,SAAS,EAAkB,MAAM,oBAAoB,CAAC;AAIvF,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,SAAS,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,oBAAoB,GAAG,WAAW,CAAC;IAC3C,QAAQ,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;;GAIG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;gBADR,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAG5C;;;;OAIG;IACG,cAAc,CAClB,aAAa,EAAE,MAAM,EACrB,IAAI,GAAE,MAAW,EACjB,mBAAmB,GAAE,MAAY,GAChC,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAsEpC;;OAEG;IACG,wBAAwB,CAAC,UAAU,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6BvF;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,uBAAuB;YAyBvB,iBAAiB;YAQjB,oBAAoB;IAqDlC,OAAO,CAAC,kBAAkB;CAU3B"}