n8n-nodes-engram 0.4.1 → 0.5.1

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 (69) hide show
  1. package/README.md +69 -5
  2. package/dist/extraction/EntityExtractor.d.ts +4 -0
  3. package/dist/extraction/EntityExtractor.js +19 -4
  4. package/dist/extraction/EntityExtractor.js.map +1 -1
  5. package/dist/extraction/ExtractionPipeline.d.ts +10 -0
  6. package/dist/extraction/ExtractionPipeline.js +153 -64
  7. package/dist/extraction/ExtractionPipeline.js.map +1 -1
  8. package/dist/extraction/ExtractionSource.d.ts +15 -0
  9. package/dist/extraction/ExtractionSource.js +32 -0
  10. package/dist/extraction/ExtractionSource.js.map +1 -0
  11. package/dist/extraction/RelationshipExtractor.d.ts +4 -0
  12. package/dist/extraction/RelationshipExtractor.js +19 -4
  13. package/dist/extraction/RelationshipExtractor.js.map +1 -1
  14. package/dist/extraction/prompts.d.ts +2 -0
  15. package/dist/extraction/prompts.js +27 -2
  16. package/dist/extraction/prompts.js.map +1 -1
  17. package/dist/memory/EngramChatMemory.d.ts +33 -1
  18. package/dist/memory/EngramChatMemory.js +163 -24
  19. package/dist/memory/EngramChatMemory.js.map +1 -1
  20. package/dist/memory/EngramChatMessageHistory.d.ts +14 -1
  21. package/dist/memory/EngramChatMessageHistory.js +24 -11
  22. package/dist/memory/EngramChatMessageHistory.js.map +1 -1
  23. package/dist/nodes/EngramAdmin/EngramAdmin.node.js +312 -12
  24. package/dist/nodes/EngramAdmin/EngramAdmin.node.js.map +1 -1
  25. package/dist/nodes/EngramExplorer/EngramExplorer.node.js +613 -2
  26. package/dist/nodes/EngramExplorer/EngramExplorer.node.js.map +1 -1
  27. package/dist/nodes/EngramMemory/EngramMemory.node.js +377 -3
  28. package/dist/nodes/EngramMemory/EngramMemory.node.js.map +1 -1
  29. package/dist/schemas/EpisodicNode.schema.d.ts +91 -0
  30. package/dist/schemas/EpisodicNode.schema.js +37 -5
  31. package/dist/schemas/EpisodicNode.schema.js.map +1 -1
  32. package/dist/schemas/ExtractionMetadata.schema.d.ts +123 -0
  33. package/dist/schemas/ExtractionMetadata.schema.js +96 -0
  34. package/dist/schemas/ExtractionMetadata.schema.js.map +1 -0
  35. package/dist/schemas/GraphData.schema.d.ts +979 -4
  36. package/dist/schemas/GraphData.schema.js +22 -13
  37. package/dist/schemas/GraphData.schema.js.map +1 -1
  38. package/dist/schemas/GraphDataMigration.d.ts +37 -0
  39. package/dist/schemas/GraphDataMigration.js +106 -0
  40. package/dist/schemas/GraphDataMigration.js.map +1 -0
  41. package/dist/schemas/index.d.ts +4 -2
  42. package/dist/schemas/index.js +21 -1
  43. package/dist/schemas/index.js.map +1 -1
  44. package/dist/search/ContextBudget.d.ts +15 -0
  45. package/dist/search/ContextBudget.js +70 -0
  46. package/dist/search/ContextBudget.js.map +1 -0
  47. package/dist/search/HybridSearchEngine.d.ts +54 -2
  48. package/dist/search/HybridSearchEngine.js +224 -27
  49. package/dist/search/HybridSearchEngine.js.map +1 -1
  50. package/dist/search/RetrievalGovernance.d.ts +56 -0
  51. package/dist/search/RetrievalGovernance.js +173 -0
  52. package/dist/search/RetrievalGovernance.js.map +1 -0
  53. package/dist/storage/EpisodeHygiene.d.ts +4 -0
  54. package/dist/storage/EpisodeHygiene.js +22 -0
  55. package/dist/storage/EpisodeHygiene.js.map +1 -0
  56. package/dist/storage/GraphologyStorage.d.ts +39 -6
  57. package/dist/storage/GraphologyStorage.js +812 -234
  58. package/dist/storage/GraphologyStorage.js.map +1 -1
  59. package/dist/storage/IGraphStorage.d.ts +112 -3
  60. package/dist/storage/Neo4jStorage.d.ts +25 -4
  61. package/dist/storage/Neo4jStorage.js +547 -38
  62. package/dist/storage/Neo4jStorage.js.map +1 -1
  63. package/dist/traversal/GraphTraverser.d.ts +2 -0
  64. package/dist/traversal/GraphTraverser.js +7 -1
  65. package/dist/traversal/GraphTraverser.js.map +1 -1
  66. package/dist/utils/logWrapper.js +1 -2
  67. package/dist/utils/logWrapper.js.map +1 -1
  68. package/docs/production-neo4j.md +15 -0
  69. package/package.json +1 -1
package/README.md CHANGED
@@ -25,6 +25,7 @@
25
25
 
26
26
  <p align="center">
27
27
  <a href="#installation">Installation</a> &middot;
28
+ <a href="#upgrading-from-v04x">Upgrade</a> &middot;
28
29
  <a href="#node-reference">Nodes</a> &middot;
29
30
  <a href="#storage-backends">Storage</a> &middot;
30
31
  <a href="#knowledge-extraction">Extraction</a> &middot;
@@ -53,7 +54,7 @@ Every conversation is stored as an episode. An optional LLM extraction pipeline
53
54
  | **2** | Storage Backends | Embedded (zero-setup) or Neo4j (production) |
54
55
  | **5** | Extraction Stages | Entity, dedup, relationships, contradictions, embeddings |
55
56
  | **3** | Search Modes | Full-text, vector, hybrid RRF fusion |
56
- | **253** | Tests | Unit + integration across 26 test suites |
57
+ | **350** | Tests | Unit + integration across 35 test suites |
57
58
 
58
59
  ---
59
60
 
@@ -100,6 +101,49 @@ npm install n8n-nodes-engram
100
101
 
101
102
  ---
102
103
 
104
+ ## Upgrading from v0.4.x
105
+
106
+ Version `0.5.0` adds episode provenance and governance fields. Storage migration and n8n node-version upgrades are separate steps.
107
+
108
+ 1. Create a current Engram export or storage/database backup before upgrading the package.
109
+ 2. Upgrade `n8n-nodes-engram`, restart n8n, and confirm the installed package version.
110
+ 3. Complete the storage-backend steps below.
111
+ 4. Run **Engram Admin > Monitoring > Diagnostics** and confirm that no storage migration remains.
112
+ 5. Upgrade selected Engram Memory nodes to v2 in an inactive workflow copy before changing production workflows.
113
+
114
+ ### Embedded Storage
115
+
116
+ No migration node is required. On first initialization after the package upgrade, Engram:
117
+
118
+ - migrates the embedded graph before opening it;
119
+ - creates and verifies a backup ending in `.pre-schema-2.0.backup.json`;
120
+ - replaces the graph atomically; and
121
+ - leaves the original graph unchanged if backup verification or migration fails.
122
+
123
+ After initialization, use **Engram Admin > Monitoring > Diagnostics** to verify the migration and backup status.
124
+
125
+ ### Neo4j Storage
126
+
127
+ Neo4j migration is intentionally operator-controlled so Engram does not perform an unbounded database rewrite during startup.
128
+
129
+ 1. Add an **Engram Admin** node configured with the same Neo4j credentials as the production memory workflow.
130
+ 2. Select **Lifecycle > Migrate Storage Schema** and run **Dry Run**.
131
+ 3. Review the matched legacy episode count.
132
+ 4. Select **Migrate**, set **Confirm Migration** to **Confirmed**, and execute a bounded batch.
133
+ 5. Repeat until `remaining_count` is `0`, then confirm the result with **Monitoring > Diagnostics**.
134
+
135
+ The Neo4j migration is additive and only fills missing governance fields with conservative defaults.
136
+
137
+ ### Engram Memory v2
138
+
139
+ Installing `0.5.0` does not silently change saved Engram Memory nodes. Existing v1 nodes retain their previous behavior until explicitly upgraded through n8n's node upgrade action.
140
+
141
+ - Keep **Human Episode Kind > Active Human** for direct agent conversations.
142
+ - Select **Passive Human** for observed or curated human messages stored by passive ingestion workflows.
143
+ - Validate the upgraded node in an inactive workflow copy before replacing the production workflow.
144
+
145
+ ---
146
+
103
147
  ## Quick Start
104
148
 
105
149
  ### Minimal Setup (No LLM Required)
@@ -140,6 +184,11 @@ On each conversation turn, Engram Memory:
140
184
  | --- | --- | --- |
141
185
  | Storage Backend | Embedded (Graphology) or Neo4j | Embedded |
142
186
  | Knowledge Extraction | LLM-powered entity extraction | Disabled |
187
+ | Store Human Episodes | Persist human messages as episodes (v2) | Enabled |
188
+ | Human Episode Kind | Classify human input as active or passive provenance (v2) | Active Human |
189
+ | Store AI Episodes | Persist assistant replies as episodes (v2) | Enabled |
190
+ | Extract from Human Messages | Allow human content to produce facts (v2) | Enabled |
191
+ | Extract from AI Messages | Allow assistant content to produce facts (v2) | Disabled |
143
192
  | Semantic Search | Vector embeddings for hybrid search | Disabled |
144
193
  | Graph Traversal | BFS enrichment from matched entities | Disabled |
145
194
  | Context Window | Recent turns to include | 10 |
@@ -147,6 +196,8 @@ On each conversation turn, Engram Memory:
147
196
  | Min Relevance Score | Threshold for inclusion (0&ndash;1) | 0.5 |
148
197
  | Retention Policy | Episode lifecycle management | Forever |
149
198
 
199
+ Existing saved Engram Memory nodes retain their original node version and behavior when the package is upgraded. Use n8n's node upgrade action on a workflow copy to adopt v2 controls. Passive ingestion workflows should select **Human Episode Kind > Passive Human**, while direct agent conversations should keep the default **Active Human** classification.
200
+
150
201
  ### Engram Explorer
151
202
 
152
203
  > Regular node&mdash;CRUD operations on the knowledge graph.
@@ -154,8 +205,8 @@ On each conversation turn, Engram Memory:
154
205
  | Resource | Operations |
155
206
  | --- | --- |
156
207
  | **Entity** | Create, Get, Get by Name, List, Search, Update, Delete |
157
- | **Relationship** | Create, Get, Get Between, Get for Entity, Search, Update, Delete, Get Changelog |
158
- | **Episode** | Get, Get Recent, Get by Date Range, Get Count |
208
+ | **Relationship** | Create, Get, Get Between, Get for Entity, Search, Review, Update, Delete, Get Changelog |
209
+ | **Episode** | Get, Get Recent, Get by Date Range, Get Count, List, Update, Delete |
159
210
  | **Traversal** | BFS from Entity, BFS from Episodes |
160
211
 
161
212
  ### Engram Admin
@@ -165,7 +216,7 @@ On each conversation turn, Engram Memory:
165
216
  | Resource | Operations |
166
217
  | --- | --- |
167
218
  | **Monitoring** | Stats, List Groups, Group Stats, Embedding Coverage, Diagnostics |
168
- | **Lifecycle** | Apply Retention, Clear Group, Bulk Clear Groups, Clear All |
219
+ | **Lifecycle** | Apply Retention, Purge Episodes, Migrate Storage Schema, Clear Group, Bulk Clear Groups, Clear All |
169
220
  | **Hygiene** | Orphaned Entities, Duplicate Entities, Expire Stale Edges, Rebuild Search Index, Backfill Embeddings |
170
221
  | **Portability** | Export, Import |
171
222
  | **Analysis** | Detect Communities |
@@ -178,11 +229,23 @@ On each conversation turn, Engram Memory:
178
229
 
179
230
  Engram Admin includes a read-only **Monitoring > Diagnostics** operation for production checks. By default it returns quick storage and graph counts only. Optional deep checks scan the full graph to report embedding coverage, expired/invalidated edges, dangling edges, and duplicate entity-name groups.
180
231
 
232
+ For embedded storage, diagnostics also report the most recent mutation's queue wait, file-lock wait, disk refresh, rollback export, graph mutation, snapshot write, rollback restore, total duration, and snapshot size. These timings help distinguish lock contention from large-snapshot persistence costs.
233
+
181
234
  Use **Monitoring > Embedding Coverage** to check whether entities and facts have vectors before enabling hybrid search broadly. Use **Hygiene > Rebuild Search Index** to rebuild the embedded full-text index from stored graph data. Use **Hygiene > Backfill Embeddings** in dry-run mode first, then disable dry-run to fill missing embeddings with the configured embedding model.
182
235
 
236
+ Explorer entity and relationship searches can optionally return retrieval diagnostics. The aggregate trace shows active filters, bounded candidate scores and decisions, rejection reasons, and which complete items fit the context preview budget. Diagnostics are disabled by default.
237
+
183
238
  ### Import, Export, and Backups
184
239
 
185
- Engram exports include count metadata and a SHA-256 checksum. Imports support **Dry Run** mode, optional maximum item limits, checksum verification, and dangling-edge warnings before writing data.
240
+ Engram exports use graph format `2.0` and include count metadata and a SHA-256 checksum. Imports support **Dry Run** mode, optional maximum item limits, checksum verification before migration, migration reporting, and reference-integrity warnings before writing data. Existing `1.0` backups remain importable; episodes without provenance are classified as `legacy`, `unverified`, and `proposed` rather than being accepted automatically.
241
+
242
+ Embedded storage upgrades automatically before the graph is opened. Engram creates and verifies an owner-readable backup beside the storage file, writes the migrated graph with atomic replacement, and stops without changing the source if backup verification or migration fails. The backup name ends with `.pre-schema-2.0.backup.json`, and **Monitoring > Diagnostics** reports its path and verification state.
243
+
244
+ Neo4j remains available during an upgrade and does not perform an unbounded startup rewrite. Use **Lifecycle > Migrate Storage Schema** in **Dry Run** mode to inspect the remaining legacy episode count, then apply confirmed bounded batches until the remaining count reaches zero. The migration is additive: it only fills missing governance fields with conservative legacy defaults.
245
+
246
+ For a staged restore, first run the import in **Dry Run** mode and review the source/target versions, default counts, and warnings. Keep the original export unchanged, then perform the write import only after the report matches expectations. Export the restored graph again to create a checksummed `2.0` backup.
247
+
248
+ To remove historical monitor or tool pollution, use Explorer episode filters to inspect the affected source, kind, trust level, or date range. Admin **Lifecycle > Purge Episodes** can also match empty assistant output or a case-insensitive content fragment. Always run the bounded purge in dry-run mode and review the matched episodes before confirming deletion.
186
249
 
187
250
  For production Neo4j deployments, see [`docs/production-neo4j.md`](docs/production-neo4j.md). Ready-to-import starter workflows are available in [`docs/workflows/`](docs/workflows/).
188
251
 
@@ -281,6 +344,7 @@ Engram stores conversation data and extracted knowledge. You should understand w
281
344
  - Data is stored as a JSON file at `~/.n8n/storage/n8n-nodes-engram/{workflowId}-engram.json` by default
282
345
  - You can override the default with **Custom Storage Path** when using embedded storage
283
346
  - The file contains all entities, relationships, episodes, and embeddings in plain text
347
+ - A normal human-and-assistant turn is committed as one atomic episode batch, preserving episode order while avoiding duplicate snapshot writes
284
348
  - Backups: copy the JSON file
285
349
 
286
350
  **Neo4j backend:**
@@ -1,11 +1,15 @@
1
1
  import type { LlmClient } from './LlmClient';
2
+ import { type ExtractionSource } from './ExtractionSource';
2
3
  export interface ExtractedEntity {
3
4
  name: string;
4
5
  entity_type: string;
5
6
  summary: string;
7
+ confidence: number | null;
6
8
  }
7
9
  export declare class EntityExtractor {
8
10
  private llm;
9
11
  constructor(llm: LlmClient);
10
12
  extract(humanMessage: string, aiMessage: string, entityTypes: string[], existingEntities: string[]): Promise<ExtractedEntity[]>;
13
+ extractSources(sources: ExtractionSource[], entityTypes: string[], existingEntities: string[], requireConfidence?: boolean): Promise<ExtractedEntity[]>;
14
+ private extractWithPrompt;
11
15
  }
@@ -2,18 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EntityExtractor = void 0;
4
4
  const prompts_1 = require("./prompts");
5
+ const ExtractionSource_1 = require("./ExtractionSource");
5
6
  class EntityExtractor {
6
7
  constructor(llm) {
7
8
  this.llm = llm;
8
9
  }
9
10
  async extract(humanMessage, aiMessage, entityTypes, existingEntities) {
11
+ return this.extractWithPrompt((0, prompts_1.entityExtractionUser)(humanMessage, aiMessage, entityTypes, existingEntities), entityTypes, false);
12
+ }
13
+ async extractSources(sources, entityTypes, existingEntities, requireConfidence = false) {
14
+ return this.extractWithPrompt((0, prompts_1.entityExtractionSourcesUser)((0, ExtractionSource_1.formatExtractionSources)(sources), entityTypes, existingEntities), entityTypes, requireConfidence);
15
+ }
16
+ async extractWithPrompt(prompt, entityTypes, requireConfidence) {
10
17
  try {
11
18
  const result = await this.llm.chatJson([
12
19
  { role: 'system', content: prompts_1.ENTITY_EXTRACTION_SYSTEM },
13
- {
14
- role: 'user',
15
- content: (0, prompts_1.entityExtractionUser)(humanMessage, aiMessage, entityTypes, existingEntities),
16
- },
20
+ { role: 'user', content: prompt },
17
21
  ]);
18
22
  if (!result.entities || !Array.isArray(result.entities)) {
19
23
  return [];
@@ -25,11 +29,22 @@ class EntityExtractor {
25
29
  typeof e.entity_type === 'string' &&
26
30
  e.entity_type.trim() !== '' &&
27
31
  typeof e.summary === 'string' &&
32
+ (!requireConfidence ||
33
+ (typeof e.confidence === 'number' &&
34
+ Number.isFinite(e.confidence) &&
35
+ e.confidence >= 0 &&
36
+ e.confidence <= 1)) &&
28
37
  (allowedTypes.size === 0 || allowedTypes.has(e.entity_type.toLowerCase().trim())))
29
38
  .map((e) => ({
30
39
  name: e.name.trim(),
31
40
  entity_type: e.entity_type.trim(),
32
41
  summary: e.summary.trim(),
42
+ confidence: typeof e.confidence === 'number' &&
43
+ Number.isFinite(e.confidence) &&
44
+ e.confidence >= 0 &&
45
+ e.confidence <= 1
46
+ ? e.confidence
47
+ : null,
33
48
  }));
34
49
  }
35
50
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"EntityExtractor.js","sourceRoot":"","sources":["../../src/extraction/EntityExtractor.ts"],"names":[],"mappings":";;;AACA,uCAA2E;AAY3E,MAAa,eAAe;IAG1B,YAAY,GAAc;QACxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,YAAoB,EACpB,SAAiB,EACjB,WAAqB,EACrB,gBAA0B;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAyB;gBAC7D,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAwB,EAAE;gBACrD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAA,8BAAoB,EAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC;iBACtF;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAEnF,OAAO,MAAM,CAAC,QAAQ;iBACnB,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBACpB,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;gBACjC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC3B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;gBAC7B,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CACpF;iBACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;gBACnB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE;gBACjC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;aAC1B,CAAC,CAAC,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AAjDD,0CAiDC"}
1
+ {"version":3,"file":"EntityExtractor.js","sourceRoot":"","sources":["../../src/extraction/EntityExtractor.ts"],"names":[],"mappings":";;;AACA,uCAImB;AACnB,yDAAoF;AAapF,MAAa,eAAe;IAG1B,YAAY,GAAc;QACxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,YAAoB,EACpB,SAAiB,EACjB,WAAqB,EACrB,gBAA0B;QAE1B,OAAO,IAAI,CAAC,iBAAiB,CAC3B,IAAA,8BAAoB,EAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAC5E,WAAW,EACX,KAAK,CACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,OAA2B,EAC3B,WAAqB,EACrB,gBAA0B,EAC1B,iBAAiB,GAAG,KAAK;QAEzB,OAAO,IAAI,CAAC,iBAAiB,CAC3B,IAAA,qCAA2B,EAAC,IAAA,0CAAuB,EAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAC5F,WAAW,EACX,iBAAiB,CAClB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,MAAc,EACd,WAAqB,EACrB,iBAA0B;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAyB;gBAC7D,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAwB,EAAE;gBACrD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAEnF,OAAO,MAAM,CAAC,QAAQ;iBACnB,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBACpB,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;gBACjC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC3B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;gBAC7B,CAAC,CAAC,iBAAiB;oBACjB,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;wBAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;wBAC7B,CAAC,CAAC,UAAU,IAAI,CAAC;wBACjB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;gBACvB,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CACpF;iBACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;gBACnB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE;gBACjC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;gBACzB,UAAU,EACR,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;oBAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;oBAC7B,CAAC,CAAC,UAAU,IAAI,CAAC;oBACjB,CAAC,CAAC,UAAU,IAAI,CAAC;oBACf,CAAC,CAAC,CAAC,CAAC,UAAU;oBACd,CAAC,CAAC,IAAI;aACX,CAAC,CAAC,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AAnFD,0CAmFC"}
@@ -1,11 +1,15 @@
1
1
  import type { IGraphStorage } from '../storage/IGraphStorage';
2
+ import { type ExtractionThresholdPolicy } from '../schemas';
2
3
  import { type LlmClientConfig } from './LlmClient';
3
4
  import { type EmbeddingConfig } from '../embeddings';
5
+ import { type ExtractionSource } from './ExtractionSource';
4
6
  export interface ExtractionPipelineConfig {
5
7
  llmConfig: LlmClientConfig;
6
8
  entityTypes: string[];
7
9
  groupId: string;
8
10
  embeddingConfig?: EmbeddingConfig;
11
+ requireConfidence?: boolean;
12
+ thresholdPolicy?: ExtractionThresholdPolicy;
9
13
  }
10
14
  export declare class ExtractionPipeline {
11
15
  private storage;
@@ -17,11 +21,17 @@ export declare class ExtractionPipeline {
17
21
  private embeddingService;
18
22
  private entityTypes;
19
23
  private groupId;
24
+ private requireConfidence;
25
+ private thresholdPolicy?;
20
26
  constructor(storage: IGraphStorage, config: ExtractionPipelineConfig);
21
27
  process(humanMessage: string, aiMessage: string, episodeUuids?: string[]): Promise<void>;
28
+ processSources(sources: ExtractionSource[]): Promise<void>;
22
29
  private resolveEntity;
23
30
  private expireContradictedEdges;
24
31
  private persistRelationship;
25
32
  private buildEdgeUpdates;
33
+ private createExtractionMetadata;
34
+ private reviewStatus;
35
+ private mergeExtractionMetadata;
26
36
  private findEntity;
27
37
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExtractionPipeline = void 0;
4
+ const schemas_1 = require("../schemas");
4
5
  const LlmClient_1 = require("./LlmClient");
5
6
  const EntityExtractor_1 = require("./EntityExtractor");
6
7
  const RelationshipExtractor_1 = require("./RelationshipExtractor");
@@ -9,9 +10,10 @@ const ContradictionDetector_1 = require("./ContradictionDetector");
9
10
  const EdgeDeduplicator_1 = require("./EdgeDeduplicator");
10
11
  const embeddings_1 = require("../embeddings");
11
12
  const temporal_1 = require("../utils/temporal");
12
- const EXTRACTION_METADATA_VERSION = 1;
13
+ const ExtractionSource_1 = require("./ExtractionSource");
13
14
  class ExtractionPipeline {
14
15
  constructor(storage, config) {
16
+ var _a;
15
17
  this.embeddingService = null;
16
18
  const llm = new LlmClient_1.LlmClient(config.llmConfig);
17
19
  this.storage = storage;
@@ -22,30 +24,62 @@ class ExtractionPipeline {
22
24
  this.edgeDeduplicator = new EdgeDeduplicator_1.EdgeDeduplicator(llm);
23
25
  this.entityTypes = config.entityTypes;
24
26
  this.groupId = config.groupId;
27
+ this.requireConfidence = (_a = config.requireConfidence) !== null && _a !== void 0 ? _a : false;
28
+ this.thresholdPolicy = config.thresholdPolicy;
29
+ if (this.thresholdPolicy) {
30
+ (0, schemas_1.decideExtractionReview)(0.5, this.thresholdPolicy);
31
+ }
25
32
  if (config.embeddingConfig) {
26
33
  this.embeddingService = new embeddings_1.EmbeddingService(config.embeddingConfig);
27
34
  }
28
35
  }
29
36
  async process(humanMessage, aiMessage, episodeUuids = []) {
37
+ var _a, _b;
38
+ const sources = [];
39
+ if (humanMessage) {
40
+ sources.push({
41
+ content: humanMessage,
42
+ role: 'human',
43
+ episode_kind: 'active_human',
44
+ episode_uuid: (_a = episodeUuids[0]) !== null && _a !== void 0 ? _a : null,
45
+ });
46
+ }
47
+ if (aiMessage) {
48
+ sources.push({
49
+ content: aiMessage,
50
+ role: 'ai',
51
+ episode_kind: 'assistant_reply',
52
+ episode_uuid: (_b = episodeUuids[1]) !== null && _b !== void 0 ? _b : null,
53
+ });
54
+ }
55
+ await this.processSources(sources);
56
+ }
57
+ async processSources(sources) {
58
+ const selectedSources = sources.filter((source) => source.content.trim().length > 0);
59
+ if (selectedSources.length === 0)
60
+ return;
61
+ const episodeUuids = (0, ExtractionSource_1.extractionEpisodeUuids)(selectedSources);
30
62
  const existingEntities = await this.storage.listEntities(this.groupId);
31
63
  const existingNames = existingEntities.map((e) => e.name);
32
- const extractedEntities = await this.entityExtractor.extract(humanMessage, aiMessage, this.entityTypes, existingNames);
64
+ const extractedEntities = await this.entityExtractor.extractSources(selectedSources, this.entityTypes, existingNames, this.requireConfidence);
33
65
  if (extractedEntities.length === 0)
34
66
  return;
35
67
  const resolvedEntities = new Map();
36
68
  for (const extracted of extractedEntities) {
37
- const resolved = await this.resolveEntity(extracted, existingEntities);
69
+ const resolved = await this.resolveEntity(extracted, existingEntities, episodeUuids);
38
70
  resolvedEntities.set(extracted.name.toLowerCase(), resolved);
39
71
  }
40
72
  const allEntityNames = [
41
73
  ...new Set([...existingNames, ...[...resolvedEntities.values()].map((e) => e.name)]),
42
74
  ];
43
- const extractedRelationships = await this.relationshipExtractor.extract(humanMessage, aiMessage, allEntityNames);
75
+ const extractedRelationships = await this.relationshipExtractor.extractSources(selectedSources, allEntityNames, this.requireConfidence);
44
76
  for (const rel of extractedRelationships) {
45
77
  await this.persistRelationship(rel, resolvedEntities, existingEntities, episodeUuids);
46
78
  }
47
79
  }
48
- async resolveEntity(extracted, existingEntities) {
80
+ async resolveEntity(extracted, existingEntities, episodeUuids) {
81
+ const incomingMetadata = this.createExtractionMetadata(extracted.confidence, episodeUuids);
82
+ const incomingStatus = incomingMetadata.review_status;
49
83
  for (const existing of existingEntities) {
50
84
  const { isDuplicate, mergedSummary } = await this.deduplicator.isDuplicate(extracted, {
51
85
  name: existing.name,
@@ -53,10 +87,19 @@ class ExtractionPipeline {
53
87
  entity_type: existing.entity_type,
54
88
  });
55
89
  if (isDuplicate) {
56
- if (mergedSummary && mergedSummary !== existing.summary) {
57
- return await this.storage.updateEntity(existing.uuid, {
58
- summary: mergedSummary,
59
- });
90
+ const existingStatus = this.reviewStatus(existing.attributes);
91
+ const updates = {};
92
+ if (mergedSummary &&
93
+ mergedSummary !== existing.summary &&
94
+ (!this.thresholdPolicy || incomingStatus === 'accepted' || existingStatus !== 'accepted')) {
95
+ updates.summary = mergedSummary;
96
+ }
97
+ const mergedMetadata = this.mergeExtractionMetadata((0, schemas_1.extractionMetadataFromAttributes)(existing.attributes), incomingMetadata, episodeUuids);
98
+ if (mergedMetadata) {
99
+ updates.attributes = { ...existing.attributes, engram_extraction: mergedMetadata };
100
+ }
101
+ if (Object.keys(updates).length > 0) {
102
+ return await this.storage.updateEntity(existing.uuid, updates);
60
103
  }
61
104
  return existing;
62
105
  }
@@ -78,13 +121,7 @@ class ExtractionPipeline {
78
121
  entity_type: extracted.entity_type,
79
122
  name_embedding: nameEmbedding !== null && nameEmbedding !== void 0 ? nameEmbedding : null,
80
123
  attributes: {
81
- engram_extraction: {
82
- version: EXTRACTION_METADATA_VERSION,
83
- source: 'llm',
84
- confidence: null,
85
- reviewed: false,
86
- extracted_at: (0, temporal_1.nowIso)(),
87
- },
124
+ engram_extraction: incomingMetadata,
88
125
  },
89
126
  });
90
127
  }
@@ -92,6 +129,9 @@ class ExtractionPipeline {
92
129
  for (const existingEdge of edges) {
93
130
  if (existingEdge.expired_at)
94
131
  continue;
132
+ if (this.thresholdPolicy && this.reviewStatus(existingEdge.attributes) !== 'accepted') {
133
+ continue;
134
+ }
95
135
  const resolution = await this.contradictionDetector.detect(existingEdge.fact, newFact, sourceEntityName, targetEntityName, existingEdge.name, newEdgeName);
96
136
  if (resolution.isContradiction && resolution.expiredAt) {
97
137
  await this.storage.updateEdge(existingEdge.uuid, {
@@ -107,6 +147,8 @@ class ExtractionPipeline {
107
147
  if (!sourceEntity || !targetEntity)
108
148
  return;
109
149
  const normalizedNewEdgeName = rel.name.toUpperCase().replace(/\s+/g, '_');
150
+ const incomingMetadata = this.createExtractionMetadata(rel.confidence, episodeUuids);
151
+ const incomingStatus = incomingMetadata.review_status;
110
152
  let samePairEdges = [];
111
153
  try {
112
154
  samePairEdges = await this.storage.getEdgesBetween(sourceEntity.uuid, targetEntity.uuid);
@@ -114,52 +156,62 @@ class ExtractionPipeline {
114
156
  catch (error) {
115
157
  console.warn('Engram: Failed to fetch edges between', sourceEntity.name, 'and', targetEntity.name + ':', error.message);
116
158
  }
117
- try {
118
- const existingMatchingEdge = samePairEdges.find((e) => e.name === normalizedNewEdgeName && !e.expired_at);
119
- if (existingMatchingEdge) {
120
- const { isDuplicate, mergedFact } = await this.edgeDeduplicator.isDuplicate(existingMatchingEdge.fact, rel.fact, normalizedNewEdgeName, sourceEntity.name, targetEntity.name);
121
- if (isDuplicate) {
122
- const updates = await this.buildEdgeUpdates(existingMatchingEdge, mergedFact || rel.fact, episodeUuids);
123
- if (Object.keys(updates).length > 0) {
124
- await this.storage.updateEdge(existingMatchingEdge.uuid, updates);
159
+ if (incomingStatus !== 'rejected') {
160
+ try {
161
+ const existingMatchingEdge = samePairEdges.find((e) => e.name === normalizedNewEdgeName &&
162
+ !e.expired_at &&
163
+ this.reviewStatus(e.attributes) !== 'rejected');
164
+ if (existingMatchingEdge) {
165
+ const { isDuplicate, mergedFact } = await this.edgeDeduplicator.isDuplicate(existingMatchingEdge.fact, rel.fact, normalizedNewEdgeName, sourceEntity.name, targetEntity.name);
166
+ if (isDuplicate) {
167
+ const updates = await this.buildEdgeUpdates(existingMatchingEdge, mergedFact || rel.fact, episodeUuids, incomingMetadata);
168
+ if (Object.keys(updates).length > 0) {
169
+ await this.storage.updateEdge(existingMatchingEdge.uuid, updates);
170
+ }
171
+ return;
125
172
  }
126
- return;
127
173
  }
128
174
  }
175
+ catch (error) {
176
+ console.warn('Engram: Edge deduplication failed for', sourceEntity.name, '->', targetEntity.name + ':', error.message);
177
+ }
129
178
  }
130
- catch (error) {
131
- console.warn('Engram: Edge deduplication failed for', sourceEntity.name, '->', targetEntity.name + ':', error.message);
132
- }
133
- try {
134
- const crossNameCandidates = samePairEdges.filter((e) => e.name !== normalizedNewEdgeName && !e.expired_at);
135
- if (crossNameCandidates.length > 0) {
136
- const candidate = crossNameCandidates[0];
137
- const { isDuplicate, mergedFact } = await this.edgeDeduplicator.isDuplicateCrossName(candidate.fact, rel.fact, candidate.name, normalizedNewEdgeName, sourceEntity.name, targetEntity.name);
138
- if (isDuplicate) {
139
- const updates = await this.buildEdgeUpdates(candidate, mergedFact || rel.fact, episodeUuids);
140
- if (Object.keys(updates).length > 0) {
141
- await this.storage.updateEdge(candidate.uuid, updates);
179
+ if (incomingStatus !== 'rejected') {
180
+ try {
181
+ const crossNameCandidates = samePairEdges.filter((e) => e.name !== normalizedNewEdgeName &&
182
+ !e.expired_at &&
183
+ this.reviewStatus(e.attributes) !== 'rejected');
184
+ if (crossNameCandidates.length > 0) {
185
+ const candidate = crossNameCandidates[0];
186
+ const { isDuplicate, mergedFact } = await this.edgeDeduplicator.isDuplicateCrossName(candidate.fact, rel.fact, candidate.name, normalizedNewEdgeName, sourceEntity.name, targetEntity.name);
187
+ if (isDuplicate) {
188
+ const updates = await this.buildEdgeUpdates(candidate, mergedFact || rel.fact, episodeUuids, incomingMetadata);
189
+ if (Object.keys(updates).length > 0) {
190
+ await this.storage.updateEdge(candidate.uuid, updates);
191
+ }
192
+ return;
142
193
  }
143
- return;
144
194
  }
145
195
  }
196
+ catch (error) {
197
+ console.warn('Engram: Cross-name edge deduplication failed for', sourceEntity.name, '->', targetEntity.name + ':', error.message);
198
+ }
146
199
  }
147
- catch (error) {
148
- console.warn('Engram: Cross-name edge deduplication failed for', sourceEntity.name, '->', targetEntity.name + ':', error.message);
149
- }
150
- try {
151
- await this.expireContradictedEdges(samePairEdges, rel.fact, sourceEntity.name, targetEntity.name, normalizedNewEdgeName);
152
- const checkedUuids = new Set(samePairEdges.map((e) => e.uuid));
153
- const allSourceEdges = await this.storage.getEdgesForEntity(sourceEntity.uuid);
154
- const crossTargetEdges = allSourceEdges.filter((e) => e.source_node_uuid === sourceEntity.uuid &&
155
- e.name === normalizedNewEdgeName &&
156
- e.target_node_uuid !== targetEntity.uuid &&
157
- !e.expired_at &&
158
- !checkedUuids.has(e.uuid));
159
- await this.expireContradictedEdges(crossTargetEdges, rel.fact, sourceEntity.name, targetEntity.name, normalizedNewEdgeName);
160
- }
161
- catch (error) {
162
- console.warn('Engram: Contradiction detection failed for edge between', sourceEntity.name, 'and', targetEntity.name + ':', error.message);
200
+ if (!this.thresholdPolicy || incomingStatus === 'accepted') {
201
+ try {
202
+ await this.expireContradictedEdges(samePairEdges, rel.fact, sourceEntity.name, targetEntity.name, normalizedNewEdgeName);
203
+ const checkedUuids = new Set(samePairEdges.map((e) => e.uuid));
204
+ const allSourceEdges = await this.storage.getEdgesForEntity(sourceEntity.uuid);
205
+ const crossTargetEdges = allSourceEdges.filter((e) => e.source_node_uuid === sourceEntity.uuid &&
206
+ e.name === normalizedNewEdgeName &&
207
+ e.target_node_uuid !== targetEntity.uuid &&
208
+ !e.expired_at &&
209
+ !checkedUuids.has(e.uuid));
210
+ await this.expireContradictedEdges(crossTargetEdges, rel.fact, sourceEntity.name, targetEntity.name, normalizedNewEdgeName);
211
+ }
212
+ catch (error) {
213
+ console.warn('Engram: Contradiction detection failed for edge between', sourceEntity.name, 'and', targetEntity.name + ':', error.message);
214
+ }
163
215
  }
164
216
  let factEmbedding;
165
217
  if (this.embeddingService) {
@@ -181,20 +233,19 @@ class ExtractionPipeline {
181
233
  valid_at: (0, temporal_1.nowIso)(),
182
234
  episodes: episodeUuids,
183
235
  attributes: {
184
- engram_extraction: {
185
- version: EXTRACTION_METADATA_VERSION,
186
- source: 'llm',
187
- confidence: null,
188
- reviewed: false,
189
- extracted_at: (0, temporal_1.nowIso)(),
190
- episode_uuids: episodeUuids,
191
- },
236
+ engram_extraction: incomingMetadata,
192
237
  },
193
238
  });
194
239
  }
195
- async buildEdgeUpdates(existingEdge, effectiveFact, episodeUuids) {
240
+ async buildEdgeUpdates(existingEdge, effectiveFact, episodeUuids, incomingMetadata) {
241
+ var _a;
196
242
  const updates = {};
197
- if (effectiveFact !== existingEdge.fact) {
243
+ const existingMetadata = (0, schemas_1.extractionMetadataFromAttributes)(existingEdge.attributes);
244
+ const existingStatus = this.reviewStatus(existingEdge.attributes);
245
+ if (effectiveFact !== existingEdge.fact &&
246
+ (!this.thresholdPolicy ||
247
+ incomingMetadata.review_status === 'accepted' ||
248
+ existingStatus !== 'accepted')) {
198
249
  updates.fact = effectiveFact;
199
250
  if (this.embeddingService) {
200
251
  try {
@@ -218,8 +269,46 @@ class ExtractionPipeline {
218
269
  updates.episodes = mergedEpisodes;
219
270
  }
220
271
  }
272
+ const mergedEpisodeUuids = [
273
+ ...new Set([...((_a = existingMetadata === null || existingMetadata === void 0 ? void 0 : existingMetadata.episode_uuids) !== null && _a !== void 0 ? _a : []), ...episodeUuids]),
274
+ ];
275
+ const mergedMetadata = this.mergeExtractionMetadata(existingMetadata, incomingMetadata, mergedEpisodeUuids);
276
+ if (mergedMetadata) {
277
+ updates.attributes = {
278
+ ...existingEdge.attributes,
279
+ engram_extraction: mergedMetadata,
280
+ };
281
+ }
221
282
  return updates;
222
283
  }
284
+ createExtractionMetadata(confidence, episodeUuids) {
285
+ const decision = (0, schemas_1.decideExtractionReview)(confidence, this.thresholdPolicy);
286
+ return schemas_1.ExtractionMetadataV2Schema.parse({
287
+ version: 2,
288
+ source: 'llm',
289
+ confidence,
290
+ ...decision,
291
+ extracted_at: (0, temporal_1.nowIso)(),
292
+ episode_uuids: episodeUuids,
293
+ });
294
+ }
295
+ reviewStatus(attributes) {
296
+ var _a, _b;
297
+ return (_b = (_a = (0, schemas_1.extractionMetadataFromAttributes)(attributes)) === null || _a === void 0 ? void 0 : _a.review_status) !== null && _b !== void 0 ? _b : 'accepted';
298
+ }
299
+ mergeExtractionMetadata(existing, incoming, episodeUuids) {
300
+ var _a, _b;
301
+ if (!existing)
302
+ return null;
303
+ const rank = { rejected: 0, proposed: 1, accepted: 2 };
304
+ const winner = rank[incoming.review_status] > rank[existing.review_status] ? incoming : existing;
305
+ const confidence = Math.max((_a = existing.confidence) !== null && _a !== void 0 ? _a : 0, (_b = incoming.confidence) !== null && _b !== void 0 ? _b : 0);
306
+ return schemas_1.ExtractionMetadataV2Schema.parse({
307
+ ...winner,
308
+ confidence: existing.confidence === null && incoming.confidence === null ? null : confidence,
309
+ episode_uuids: [...new Set(episodeUuids)],
310
+ });
311
+ }
223
312
  findEntity(name, resolvedEntities, existingEntities) {
224
313
  const normalized = name.toLowerCase().trim();
225
314
  const resolved = resolvedEntities.get(normalized);
@@ -1 +1 @@
1
- {"version":3,"file":"ExtractionPipeline.js","sourceRoot":"","sources":["../../src/extraction/ExtractionPipeline.ts"],"names":[],"mappings":";;;AAEA,2CAA8D;AAC9D,uDAAoD;AACpD,mEAAgE;AAChE,6DAA0D;AAC1D,mEAAgE;AAChE,yDAAsD;AACtD,8CAAuE;AACvE,gDAA2C;AAE3C,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAmBtC,MAAa,kBAAkB;IAW7B,YAAY,OAAsB,EAAE,MAAgC;QAJ5D,qBAAgB,GAA4B,IAAI,CAAC;QAKvD,MAAM,GAAG,GAAG,IAAI,qBAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,iCAAe,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,qBAAqB,GAAG,IAAI,6CAAqB,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,uCAAkB,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,qBAAqB,GAAG,IAAI,6CAAqB,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,IAAI,mCAAgB,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE9B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,6BAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CACX,YAAoB,EACpB,SAAiB,EACjB,eAAyB,EAAE;QAG3B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAG1D,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAC1D,YAAY,EACZ,SAAS,EACT,IAAI,CAAC,WAAW,EAChB,aAAa,CACd,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAG3C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAsB,CAAC;QAEvD,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACvE,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;QAGD,MAAM,cAAc,GAAG;YACrB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SACrF,CAAC;QAEF,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CACrE,YAAY,EACZ,SAAS,EACT,cAAc,CACf,CAAC;QAGF,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,SAAiE,EACjE,gBAA8B;QAG9B,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE;gBACpF,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC,CAAC,CAAC;YAEH,IAAI,WAAW,EAAE,CAAC;gBAEhB,IAAI,aAAa,IAAI,aAAa,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACxD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;wBACpD,OAAO,EAAE,aAAa;qBACvB,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAGD,IAAI,aAAmC,CAAC;QACxC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACjE,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAClC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,QAAQ,EAAE,IAAI,CAAC,OAAO;YACtB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,cAAc,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,IAAI;YACrC,UAAU,EAAE;gBACV,iBAAiB,EAAE;oBACjB,OAAO,EAAE,2BAA2B;oBACpC,MAAM,EAAE,KAAK;oBACb,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,KAAK;oBACf,YAAY,EAAE,IAAA,iBAAM,GAAE;iBACvB;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,KAAwC,EACxC,OAAe,EACf,gBAAwB,EACxB,gBAAwB,EACxB,WAAmB;QAEnB,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;YACjC,IAAI,YAAY,CAAC,UAAU;gBAAE,SAAS;YAEtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CACxD,YAAY,CAAC,IAAI,EACjB,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,CAAC,IAAI,EACjB,WAAW,CACZ,CAAC;YAEF,IAAI,UAAU,CAAC,eAAe,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE;oBAC/C,UAAU,EAAE,UAAU,CAAC,SAAS;oBAChC,UAAU,EAAE,UAAU,CAAC,SAAS;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,GAKC,EACD,gBAAyC,EACzC,gBAA8B,EAC9B,YAAsB;QAGtB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC5F,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAE5F,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY;YAAE,OAAO;QAE3C,MAAM,qBAAqB,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAG1E,IAAI,aAAa,GAAsC,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,uCAAuC,EACvC,YAAY,CAAC,IAAI,EACjB,KAAK,EACL,YAAY,CAAC,IAAI,GAAG,GAAG,EACtB,KAAe,CAAC,OAAO,CACzB,CAAC;QAEJ,CAAC;QAKD,IAAI,CAAC;YACH,MAAM,oBAAoB,GAAG,aAAa,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,IAAI,CAAC,CAAC,CAAC,UAAU,CACzD,CAAC;YAEF,IAAI,oBAAoB,EAAE,CAAC;gBACzB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CACzE,oBAAoB,CAAC,IAAI,EACzB,GAAG,CAAC,IAAI,EACR,qBAAqB,EACrB,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,IAAI,CAClB,CAAC;gBAEF,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,oBAAoB,EACpB,UAAU,IAAI,GAAG,CAAC,IAAI,EACtB,YAAY,CACb,CAAC;oBACF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACpE,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,uCAAuC,EACvC,YAAY,CAAC,IAAI,EACjB,IAAI,EACJ,YAAY,CAAC,IAAI,GAAG,GAAG,EACtB,KAAe,CAAC,OAAO,CACzB,CAAC;QAEJ,CAAC;QAOD,IAAI,CAAC;YACH,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,IAAI,CAAC,CAAC,CAAC,UAAU,CACzD,CAAC;YAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAEnC,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAClF,SAAS,CAAC,IAAI,EACd,GAAG,CAAC,IAAI,EACR,SAAS,CAAC,IAAI,EACd,qBAAqB,EACrB,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,IAAI,CAClB,CAAC;gBAEF,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,SAAS,EACT,UAAU,IAAI,GAAG,CAAC,IAAI,EACtB,YAAY,CACb,CAAC;oBACF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACzD,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,kDAAkD,EAClD,YAAY,CAAC,IAAI,EACjB,IAAI,EACJ,YAAY,CAAC,IAAI,GAAG,GAAG,EACtB,KAAe,CAAC,OAAO,CACzB,CAAC;QAEJ,CAAC;QAGD,IAAI,CAAC;YAIH,MAAM,IAAI,CAAC,uBAAuB,CAChC,aAAa,EACb,GAAG,CAAC,IAAI,EACR,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,IAAI,EACjB,qBAAqB,CACtB,CAAC;YAKF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC/E,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,gBAAgB,KAAK,YAAY,CAAC,IAAI;gBACxC,CAAC,CAAC,IAAI,KAAK,qBAAqB;gBAChC,CAAC,CAAC,gBAAgB,KAAK,YAAY,CAAC,IAAI;gBACxC,CAAC,CAAC,CAAC,UAAU;gBACb,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5B,CAAC;YACF,MAAM,IAAI,CAAC,uBAAuB,CAChC,gBAAgB,EAChB,GAAG,CAAC,IAAI,EACR,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,IAAI,EACjB,qBAAqB,CACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,yDAAyD,EACzD,YAAY,CAAC,IAAI,EACjB,KAAK,EACL,YAAY,CAAC,IAAI,GAAG,GAAG,EACtB,KAAe,CAAC,OAAO,CACzB,CAAC;QACJ,CAAC;QAGD,IAAI,aAAmC,CAAC;QACxC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3D,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACzB,QAAQ,EAAE,IAAI,CAAC,OAAO;YACtB,gBAAgB,EAAE,YAAY,CAAC,IAAI;YACnC,gBAAgB,EAAE,YAAY,CAAC,IAAI;YACnC,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,cAAc,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,IAAI;YACrC,QAAQ,EAAE,IAAA,iBAAM,GAAE;YAClB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE;gBACV,iBAAiB,EAAE;oBACjB,OAAO,EAAE,2BAA2B;oBACpC,MAAM,EAAE,KAAK;oBACb,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,KAAK;oBACf,YAAY,EAAE,IAAA,iBAAM,GAAE;oBACtB,aAAa,EAAE,YAAY;iBAC5B;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAMO,KAAK,CAAC,gBAAgB,CAC5B,YAA6C,EAC7C,aAAqB,EACrB,YAAsB;QAEtB,MAAM,OAAO,GAA4B,EAAE,CAAC;QAE5C,IAAI,aAAa,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC;YAG7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBAChE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC5C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;QAGD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,gBAAgB,GAAG,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC;YACrD,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAC7C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1C,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,IAAI,cAAc,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACtD,OAAO,CAAC,QAAQ,GAAG,cAAc,CAAC;YACpC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU,CAChB,IAAY,EACZ,gBAAyC,EACzC,gBAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAG7C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAG9B,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC,CAAC;IAClF,CAAC;CACF;AAlZD,gDAkZC"}
1
+ {"version":3,"file":"ExtractionPipeline.js","sourceRoot":"","sources":["../../src/extraction/ExtractionPipeline.ts"],"names":[],"mappings":"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"}