@memberjunction/ai-vector-dupe 3.4.0 → 4.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.
package/README.md CHANGED
@@ -1,14 +1,42 @@
1
1
  # @memberjunction/ai-vector-dupe
2
2
 
3
- A MemberJunction package for identifying and managing duplicate records using AI-powered vector similarity search. This package generates vector representations of records and uses similarity scoring to detect potential duplicates, with options for automatic merging.
4
-
5
- ## Overview
6
-
7
- The AI Vector Dupe package provides sophisticated duplicate detection capabilities by:
8
- - Converting records into vector embeddings using AI models
9
- - Performing similarity searches in vector databases
10
- - Tracking duplicate detection runs and results
11
- - Optionally merging duplicates based on configurable thresholds
3
+ AI-powered duplicate record detection for MemberJunction entities. This package uses vector embeddings and similarity search to find potential duplicate records, track detection runs, and optionally auto-merge high-confidence matches.
4
+
5
+ ## Architecture
6
+
7
+ ```mermaid
8
+ graph TD
9
+ subgraph DupePkg["@memberjunction/ai-vector-dupe"]
10
+ DRD["DuplicateRecordDetector"]
11
+ VSB["VectorSyncBase"]
12
+ ESC["EntitySyncConfig"]
13
+ end
14
+
15
+ subgraph Pipeline["Detection Pipeline"]
16
+ LIST["Load Records<br/>from List"] --> VECT["Vectorize Records<br/>via Templates"]
17
+ VECT --> EMBED["Generate<br/>Embeddings"]
18
+ EMBED --> QUERY["Query Vector DB<br/>for Matches"]
19
+ QUERY --> FILTER["Filter by<br/>Threshold"]
20
+ FILTER --> TRACK["Track Results<br/>in Duplicate Runs"]
21
+ TRACK --> MERGE["Auto-Merge<br/>Above Threshold"]
22
+ end
23
+
24
+ subgraph Dependencies["Key Dependencies"]
25
+ VB["ai-vectors<br/>(VectorBase)"]
26
+ SYNC["ai-vector-sync<br/>(EntityVectorSyncer)"]
27
+ VDBB["ai-vectordb<br/>(VectorDBBase)"]
28
+ AI["ai<br/>(BaseEmbeddings)"]
29
+ end
30
+
31
+ DRD -->|extends| VB
32
+ DRD --> SYNC
33
+ DRD --> VDBB
34
+ DRD --> AI
35
+
36
+ style DupePkg fill:#2d6a9f,stroke:#1a4971,color:#fff
37
+ style Pipeline fill:#2d8659,stroke:#1a5c3a,color:#fff
38
+ style Dependencies fill:#7c5295,stroke:#563a6b,color:#fff
39
+ ```
12
40
 
13
41
  ## Installation
14
42
 
@@ -16,49 +44,99 @@ The AI Vector Dupe package provides sophisticated duplicate detection capabiliti
16
44
  npm install @memberjunction/ai-vector-dupe
17
45
  ```
18
46
 
19
- ## Prerequisites
47
+ ## Overview
20
48
 
21
- 1. **MemberJunction Framework**: A properly configured MemberJunction database with the core schema
22
- 2. **AI Model Provider**: API key for embedding models (OpenAI, Mistral, or other supported providers)
23
- 3. **Vector Database**: Currently supports Pinecone with appropriate API credentials
24
- 4. **Entity Documents**: Configured entity documents with templates for the entities you want to analyze
49
+ The package provides the `DuplicateRecordDetector` class, which orchestrates a complete duplicate detection workflow:
50
+
51
+ 1. Loads records from a MemberJunction List
52
+ 2. Vectorizes them using a configured Entity Document template and embedding model
53
+ 3. Queries the vector database for similarity matches
54
+ 4. Filters results against configurable thresholds
55
+ 5. Creates Duplicate Run, Duplicate Run Detail, and Duplicate Run Detail Match records for tracking
56
+ 6. Optionally auto-merges records that exceed the absolute match threshold
57
+
58
+ ## Duplicate Detection Flow
59
+
60
+ ```mermaid
61
+ sequenceDiagram
62
+ participant Caller
63
+ participant DRD as DuplicateRecordDetector
64
+ participant EVS as EntityVectorSyncer
65
+ participant Embed as Embedding Model
66
+ participant VDB as Vector Database
67
+ participant DB as MJ Database
68
+
69
+ Caller->>DRD: getDuplicateRecords(request, user)
70
+ DRD->>DB: Load Entity Document
71
+ DRD->>EVS: VectorizeEntity (ensure all records are indexed)
72
+ DRD->>DB: Load records from List
73
+
74
+ loop For each record
75
+ DRD->>Embed: Generate embedding from template
76
+ DRD->>VDB: queryIndex (topK=5)
77
+ VDB-->>DRD: Scored matches
78
+ DRD->>DRD: Filter by PotentialMatchThreshold
79
+ DRD->>DB: Create DuplicateRunDetailMatch records
80
+ end
81
+
82
+ DRD->>DRD: Check AbsoluteMatchThreshold
83
+ DRD->>DB: Auto-merge high-confidence duplicates
84
+ DRD-->>Caller: PotentialDuplicateResponse
85
+ ```
25
86
 
26
87
  ## Core Components
27
88
 
28
89
  ### DuplicateRecordDetector
29
90
 
30
- The main class that handles duplicate detection operations.
91
+ The main class that extends `VectorBase` from `@memberjunction/ai-vectors`.
31
92
 
32
- ```typescript
33
- import { DuplicateRecordDetector } from '@memberjunction/ai-vector-dupe';
34
- import { PotentialDuplicateRequest, UserInfo } from '@memberjunction/core';
93
+ **Key method:**
35
94
 
36
- const detector = new DuplicateRecordDetector();
95
+ ```typescript
96
+ getDuplicateRecords(
97
+ params: PotentialDuplicateRequest,
98
+ contextUser?: UserInfo
99
+ ): Promise<PotentialDuplicateResponse>
37
100
  ```
38
101
 
102
+ **Parameters in `PotentialDuplicateRequest`:**
103
+
104
+ | Field | Type | Description |
105
+ |---|---|---|
106
+ | `ListID` | `string` | ID of the List containing records to check |
107
+ | `EntityID` | `string` | ID of the entity type |
108
+ | `EntityDocumentID` | `string` | ID of the Entity Document with vectorization template |
109
+ | `Options.DuplicateRunID` | `string` (optional) | Resume an existing duplicate run |
110
+
111
+ **Thresholds (configured on Entity Document):**
112
+
113
+ | Threshold | Purpose |
114
+ |---|---|
115
+ | `PotentialMatchThreshold` | Minimum similarity score to report as potential duplicate |
116
+ | `AbsoluteMatchThreshold` | Minimum similarity score for automatic record merge |
117
+
39
118
  ### VectorSyncBase
40
119
 
41
- Abstract base class providing utilities for vector synchronization operations.
120
+ A utility base class providing helper methods for vector synchronization operations:
42
121
 
43
- ```typescript
44
- import { VectorSyncBase } from '@memberjunction/ai-vector-dupe';
45
- ```
122
+ - `parseStringTemplate(str, obj)` -- simple template variable substitution
123
+ - `timer(ms)` -- async delay
124
+ - `start()` / `end()` / `timeDiff()` -- execution timing
125
+ - `saveJSONData(data, path)` -- JSON file output
46
126
 
47
127
  ### EntitySyncConfig
48
128
 
49
- Type definition for entity synchronization configuration.
129
+ Configuration type for entity synchronization scheduling:
50
130
 
51
131
  ```typescript
52
- import { EntitySyncConfig } from '@memberjunction/ai-vector-dupe';
53
-
54
- const config: EntitySyncConfig = {
55
- EntityDocumentID: 'entity-doc-id',
56
- Interval: 3600,
57
- RunViewParams: { /* RunView parameters */ },
58
- IncludeInSync: true,
59
- LastRunDate: 'January 1, 2024 00:00:00',
60
- VectorIndexID: 1,
61
- VectorID: 1
132
+ type EntitySyncConfig = {
133
+ EntityDocumentID: string; // Entity Document to use
134
+ Interval: number; // Sync interval in seconds
135
+ RunViewParams: RunViewParams; // View parameters for fetching
136
+ IncludeInSync: boolean; // Whether to include in sync
137
+ LastRunDate: string; // Last sync timestamp
138
+ VectorIndexID: number; // Vector index ID
139
+ VectorID: number; // Vector database ID
62
140
  };
63
141
  ```
64
142
 
@@ -70,106 +148,109 @@ const config: EntitySyncConfig = {
70
148
  import { DuplicateRecordDetector } from '@memberjunction/ai-vector-dupe';
71
149
  import { PotentialDuplicateRequest, UserInfo } from '@memberjunction/core';
72
150
 
73
- // Initialize the detector
74
151
  const detector = new DuplicateRecordDetector();
75
152
 
76
- // Define the request parameters
77
153
  const request: PotentialDuplicateRequest = {
78
- ListID: 'your-list-id', // ID of the list containing records to check
79
- EntityID: 'your-entity-id', // ID of the entity type
80
- EntityDocumentID: 'doc-id', // ID of the entity document with template
81
- Options: {
82
- DuplicateRunID: 'run-id' // Optional: existing duplicate run to continue
83
- }
154
+ ListID: 'list-uuid',
155
+ EntityID: 'entity-uuid',
156
+ EntityDocumentID: 'doc-uuid'
84
157
  };
85
158
 
86
- // Execute duplicate detection
87
159
  const response = await detector.getDuplicateRecords(request, currentUser);
88
160
 
89
161
  if (response.Status === 'Success') {
90
- console.log(`Found ${response.PotentialDuplicateResult.length} records with potential duplicates`);
91
-
92
162
  for (const result of response.PotentialDuplicateResult) {
93
- console.log(`Record ${result.RecordCompositeKey.ToString()}:`);
94
- for (const duplicate of result.Duplicates) {
95
- console.log(` - Potential duplicate: ${duplicate.ToString()} (${duplicate.ProbabilityScore * 100}% match)`);
163
+ console.log(`Record: ${result.RecordCompositeKey.ToString()}`);
164
+ for (const dupe of result.Duplicates) {
165
+ console.log(` Match: ${dupe.ToString()} (${(dupe.ProbabilityScore * 100).toFixed(1)}%)`);
96
166
  }
97
167
  }
98
168
  }
99
169
  ```
100
170
 
101
- ### Advanced Configuration
171
+ ### Resuming an Existing Run
102
172
 
103
173
  ```typescript
104
- // Configure thresholds via Entity Document settings
105
- // PotentialMatchThreshold: Minimum score to consider as potential duplicate (e.g., 0.8)
106
- // AbsoluteMatchThreshold: Score at which automatic merging occurs (e.g., 0.95)
107
-
108
- const entityDocument = await vectorizer.GetEntityDocument(entityDocumentID);
109
- entityDocument.PotentialMatchThreshold = 0.8; // 80% similarity
110
- entityDocument.AbsoluteMatchThreshold = 0.95; // 95% for auto-merge
111
- await entityDocument.Save();
112
- ```
113
-
114
- ## API Reference
115
-
116
- ### DuplicateRecordDetector
117
-
118
- #### `getDuplicateRecords(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>`
119
-
120
- Performs duplicate detection on records in a list.
121
-
122
- **Parameters:**
123
- - `params`: Request parameters including:
124
- - `ListID`: ID of the list containing records to analyze
125
- - `EntityID`: ID of the entity type
126
- - `EntityDocumentID`: ID of the entity document configuration
127
- - `Options`: Optional configuration including `DuplicateRunID`
128
- - `contextUser`: Optional user context for permissions
129
-
130
- **Returns:** `PotentialDuplicateResponse` containing:
131
- - `Status`: 'Success' or 'Error'
132
- - `ErrorMessage`: Error details if failed
133
- - `PotentialDuplicateResult[]`: Array of results for each analyzed record
134
-
135
- ### VectorSyncBase
136
-
137
- Base class providing utility methods:
138
-
139
- - `parseStringTemplate(str: string, obj: any): string` - Parse template strings
140
- - `timer(ms: number): Promise<unknown>` - Async delay utility
141
- - `start()` / `end()` / `timeDiff()` - Timing utilities
142
- - `saveJSONData(data: any, path: string)` - JSON file operations
174
+ const request: PotentialDuplicateRequest = {
175
+ ListID: 'list-uuid',
176
+ EntityID: 'entity-uuid',
177
+ EntityDocumentID: 'doc-uuid',
178
+ Options: {
179
+ DuplicateRunID: 'existing-run-uuid'
180
+ }
181
+ };
143
182
 
144
- ## Workflow Details
183
+ const response = await detector.getDuplicateRecords(request, currentUser);
184
+ ```
145
185
 
146
- The duplicate detection process follows these steps:
186
+ ## Database Entities Used
187
+
188
+ The package reads from and writes to these MemberJunction entities:
189
+
190
+ ```mermaid
191
+ erDiagram
192
+ DUPLICATE_RUN {
193
+ string ID PK
194
+ string EntityID
195
+ string StartedByUserID
196
+ datetime StartedAt
197
+ datetime EndedAt
198
+ string ProcessingStatus
199
+ string ApprovalStatus
200
+ string SourceListID
201
+ }
147
202
 
148
- 1. **Vectorization**: Records are converted to vector embeddings using the configured AI model
149
- 2. **Similarity Search**: Each vector is compared against others in the vector database
150
- 3. **Threshold Filtering**: Results are filtered based on the potential match threshold
151
- 4. **Result Tracking**: All operations are logged in duplicate run tables
152
- 5. **Optional Merging**: Records exceeding the absolute match threshold are automatically merged
203
+ DUPLICATE_RUN_DETAIL {
204
+ string ID PK
205
+ string DuplicateRunID FK
206
+ string RecordID
207
+ string MatchStatus
208
+ string MergeStatus
209
+ }
153
210
 
154
- ## Database Schema Integration
211
+ DUPLICATE_RUN_DETAIL_MATCH {
212
+ string ID PK
213
+ string DuplicateRunDetailID FK
214
+ string MatchRecordID
215
+ float MatchProbability
216
+ datetime MatchedAt
217
+ string Action
218
+ string ApprovalStatus
219
+ string MergeStatus
220
+ }
155
221
 
156
- The package integrates with these MemberJunction entities:
222
+ LIST {
223
+ string ID PK
224
+ string Name
225
+ string EntityID
226
+ }
157
227
 
158
- - **Duplicate Runs**: Master record for each duplicate detection execution
159
- - **Duplicate Run Details**: Individual record analysis results
160
- - **Duplicate Run Detail Matches**: Specific duplicate matches found
161
- - **Lists**: Source lists containing records to analyze
162
- - **List Details**: Individual records within lists
163
- - **Entity Documents**: Configuration for entity vectorization
228
+ LIST_DETAIL {
229
+ string ID PK
230
+ string ListID FK
231
+ string RecordID
232
+ }
164
233
 
165
- ## Configuration
234
+ ENTITY_DOCUMENT {
235
+ string ID PK
236
+ string EntityID
237
+ string TemplateID
238
+ string AIModelID
239
+ string VectorDatabaseID
240
+ float PotentialMatchThreshold
241
+ float AbsoluteMatchThreshold
242
+ }
166
243
 
167
- ### Environment Variables
244
+ DUPLICATE_RUN ||--o{ DUPLICATE_RUN_DETAIL : contains
245
+ DUPLICATE_RUN_DETAIL ||--o{ DUPLICATE_RUN_DETAIL_MATCH : has
246
+ DUPLICATE_RUN }o--|| LIST : "source"
247
+ LIST ||--o{ LIST_DETAIL : contains
248
+ ```
168
249
 
169
- Create a `.env` file with:
250
+ ## Environment Variables
170
251
 
171
252
  ```env
172
- # AI Model Configuration
253
+ # AI Model API Keys
173
254
  OPENAI_API_KEY=your-openai-key
174
255
  MISTRAL_API_KEY=your-mistral-key
175
256
 
@@ -189,63 +270,37 @@ DB_DATABASE=your-database
189
270
  CURRENT_USER_EMAIL=user@example.com
190
271
  ```
191
272
 
192
- ### Entity Document Templates
193
-
194
- Entity documents use template syntax to define how records are converted to text for vectorization:
195
-
196
- ```javascript
197
- // Example template
198
- const template = "${FirstName} ${LastName} works at ${Company} as ${Title}";
199
- ```
200
-
201
273
  ## Dependencies
202
274
 
203
- - `@memberjunction/ai`: AI model abstractions
204
- - `@memberjunction/ai-vectordb`: Vector database interfaces
205
- - `@memberjunction/ai-vectors`: Vector operations
206
- - `@memberjunction/ai-vectors-pinecone`: Pinecone implementation
207
- - `@memberjunction/ai-vector-sync`: Entity vectorization
208
- - `@memberjunction/core`: Core MJ functionality
209
- - `@memberjunction/core-entities`: Entity definitions
275
+ | Package | Purpose |
276
+ |---|---|
277
+ | `@memberjunction/ai` | `BaseEmbeddings`, `GetAIAPIKey` |
278
+ | `@memberjunction/ai-vectordb` | `VectorDBBase`, `BaseResponse` |
279
+ | `@memberjunction/ai-vectors` | `VectorBase` base class |
280
+ | `@memberjunction/ai-vectors-pinecone` | Pinecone implementation |
281
+ | `@memberjunction/ai-vector-sync` | `EntityVectorSyncer`, `EntityDocumentTemplateParser` |
282
+ | `@memberjunction/aiengine` | AI engine integration |
283
+ | `@memberjunction/core` | Core MJ types and data access |
284
+ | `@memberjunction/core-entities` | Entity type definitions |
285
+ | `@memberjunction/global` | MJGlobal class factory |
210
286
 
211
- ## Best Practices
287
+ ## Limitations
212
288
 
213
- 1. **Batch Processing**: For large datasets, process records in batches to avoid timeouts
214
- 2. **Threshold Tuning**: Start with conservative thresholds and adjust based on results
215
- 3. **Template Design**: Create comprehensive templates that capture all relevant fields
216
- 4. **Regular Sync**: Keep vector databases synchronized with source data
217
- 5. **Monitor Performance**: Track processing times and optimize for large datasets
289
+ - Duplicate detection operates within a single entity type
290
+ - Requires pre-configured Entity Documents with templates
291
+ - Currently supports Pinecone as the vector database provider
292
+ - Records must be added to a List before detection can run
218
293
 
219
- ## Error Handling
294
+ ## Development
220
295
 
221
- The package provides detailed error messages for common issues:
296
+ ```bash
297
+ # Build
298
+ npm run build
222
299
 
223
- ```typescript
224
- try {
225
- const response = await detector.getDuplicateRecords(request, user);
226
- if (response.Status === 'Error') {
227
- console.error('Duplicate detection failed:', response.ErrorMessage);
228
- }
229
- } catch (error) {
230
- console.error('Unexpected error:', error.message);
231
- }
300
+ # Development mode
301
+ npm run start
232
302
  ```
233
303
 
234
- ## Limitations
235
-
236
- - Currently supports duplicate detection within a single entity type only
237
- - Requires pre-configured entity documents with templates
238
- - Vector database support limited to Pinecone
239
- - Performance depends on vector database query capabilities
240
-
241
- ## Future Enhancements
242
-
243
- - Cross-entity duplicate detection
244
- - Additional vector database providers
245
- - Batch processing improvements
246
- - Real-time duplicate prevention
247
- - Advanced merge strategies
248
-
249
- ## Support
304
+ ## License
250
305
 
251
- For issues, questions, or contributions, please refer to the [MemberJunction documentation](https://docs.memberjunction.org) or contact the development team.
306
+ ISC
package/dist/config.js CHANGED
@@ -1,21 +1,15 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.mistralAPIKey = exports.currentUserEmail = exports.serverPort = exports.dbDatabase = exports.dbPassword = exports.dbUsername = exports.dbPort = exports.dbHost = exports.pineconeDefaultIndex = exports.pineconeAPIKey = exports.pineconeHost = exports.openAIAPIKey = void 0;
7
- const dotenv_1 = __importDefault(require("dotenv"));
8
- dotenv_1.default.config();
9
- exports.openAIAPIKey = process.env.OPENAI_API_KEY;
10
- exports.pineconeHost = process.env.PINECONE_HOST;
11
- exports.pineconeAPIKey = process.env.PINECONE_API_KEY;
12
- exports.pineconeDefaultIndex = process.env.PINECONE_DEFAULT_INDEX;
13
- exports.dbHost = process.env.DB_HOST;
14
- exports.dbPort = Number(process.env.DB_PORT) || 1433;
15
- exports.dbUsername = process.env.DB_USERNAME;
16
- exports.dbPassword = process.env.DB_PASSWORD;
17
- exports.dbDatabase = process.env.DB_DATABASE;
18
- exports.serverPort = Number(process.env.PORT) || 8000;
19
- exports.currentUserEmail = process.env.CURRENT_USER_EMAIL;
20
- exports.mistralAPIKey = process.env.MISTRAL_API_KEY;
1
+ import dotenv from 'dotenv';
2
+ dotenv.config({ quiet: true });
3
+ export const openAIAPIKey = process.env.OPENAI_API_KEY;
4
+ export const pineconeHost = process.env.PINECONE_HOST;
5
+ export const pineconeAPIKey = process.env.PINECONE_API_KEY;
6
+ export const pineconeDefaultIndex = process.env.PINECONE_DEFAULT_INDEX;
7
+ export const dbHost = process.env.DB_HOST;
8
+ export const dbPort = Number(process.env.DB_PORT) || 1433;
9
+ export const dbUsername = process.env.DB_USERNAME;
10
+ export const dbPassword = process.env.DB_PASSWORD;
11
+ export const dbDatabase = process.env.DB_DATABASE;
12
+ export const serverPort = Number(process.env.PORT) || 8000;
13
+ export const currentUserEmail = process.env.CURRENT_USER_EMAIL;
14
+ export const mistralAPIKey = process.env.MISTRAL_API_KEY;
21
15
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEH,QAAA,YAAY,GAAW,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAClD,QAAA,YAAY,GAAW,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACjD,QAAA,cAAc,GAAW,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACtD,QAAA,oBAAoB,GAAW,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAElE,QAAA,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7B,QAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC7C,QAAA,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACrC,QAAA,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACrC,QAAA,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACrC,QAAA,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAE9C,QAAA,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAElD,QAAA,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAW,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAW,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAW,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAW,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC1D,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC"}
@@ -1,35 +1,40 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DuplicateRecordDetector = void 0;
4
- const ai_1 = require("@memberjunction/ai");
5
- const core_1 = require("@memberjunction/core");
6
- const core_2 = require("@memberjunction/core");
7
- const ai_vectordb_1 = require("@memberjunction/ai-vectordb");
8
- const global_1 = require("@memberjunction/global");
9
- const ai_vectors_1 = require("@memberjunction/ai-vectors");
10
- const ai_vector_sync_1 = require("@memberjunction/ai-vector-sync");
11
- class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
12
- _vectorDB;
13
- _embedding;
1
+ import { BaseEmbeddings, GetAIAPIKey } from "@memberjunction/ai";
2
+ import { PotentialDuplicateResponse, RunView, PotentialDuplicateResult, Metadata, LogError, RecordMergeRequest, PotentialDuplicate } from "@memberjunction/core";
3
+ import { LogStatus } from "@memberjunction/core";
4
+ import { VectorDBBase } from "@memberjunction/ai-vectordb";
5
+ import { MJGlobal } from "@memberjunction/global";
6
+ import { VectorBase } from "@memberjunction/ai-vectors";
7
+ import { EntityDocumentTemplateParser, EntityVectorSyncer } from "@memberjunction/ai-vector-sync";
8
+ export class DuplicateRecordDetector extends VectorBase {
14
9
  constructor() {
15
10
  super();
16
- this._runView = new core_1.RunView();
11
+ this._runView = new RunView();
17
12
  }
18
13
  async getDuplicateRecords(params, contextUser) {
19
14
  super.CurrentUser = contextUser;
20
- let vectorizer = new ai_vector_sync_1.EntityVectorSyncer();
15
+ //for testing
16
+ //params.EntityID = 25050001;
17
+ //params.EntityDocumentID = 17;
18
+ let vectorizer = new EntityVectorSyncer();
21
19
  vectorizer.CurrentUser = super.CurrentUser;
22
20
  let entityDocument = await vectorizer.GetEntityDocument(params.EntityDocumentID);
23
21
  if (!entityDocument) {
24
22
  throw Error(`No Entity Document found with ID ${params.EntityDocumentID}`);
23
+ //Update: No longer creating an entity docuement if one is not found
24
+ //If an entitiy document is not found, that is our indicator that the
25
+ //underlying entity's records have not been vectorized yet
26
+ //const defaultVectorDB: VectorDatabaseEntity = super.getVectorDatabase();
27
+ //const defaultAIModel: AIModelEntity = super.getAIModel();
28
+ //entityDocument = await this.createEntityDocumentForEntity(params.EntityID, defaultVectorDB, defaultAIModel);
25
29
  }
26
- let response = new core_1.PotentialDuplicateResponse();
30
+ let response = new PotentialDuplicateResponse();
27
31
  response.PotentialDuplicateResult = [];
28
32
  if (!entityDocument) {
29
33
  response.ErrorMessage = `No active Entity Document found for entity ${params.EntityID}`;
30
34
  response.Status = 'Error';
31
35
  return response;
32
36
  }
37
+ //for testing
33
38
  const request = {
34
39
  entityID: entityDocument.EntityID,
35
40
  entityDocumentID: entityDocument.ID,
@@ -38,26 +43,29 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
38
43
  CurrentUser: contextUser
39
44
  };
40
45
  console.log("vectorizing entity...");
41
- const templateParser = ai_vector_sync_1.EntityDocumentTemplateParser.CreateInstance();
46
+ const templateParser = EntityDocumentTemplateParser.CreateInstance();
42
47
  await vectorizer.VectorizeEntity(request, super.CurrentUser);
43
48
  const list = await this.getListEntity(params.ListID);
44
49
  let duplicateRun = params.Options?.DuplicateRunID ? await this.getDuplicateRunEntity(params.Options?.DuplicateRunID) : await this.getDuplicateRunEntityByListID(list.ID);
50
+ //let duplicateRun: DuplicateRunEntity = await this.createDuplicateRunRecord(entityDocument, list.ID);
45
51
  const duplicateRunDetails = await this.createDuplicateRunDetailRecordsByListID(list.ID, duplicateRun.ID);
46
- (0, core_2.LogStatus)(`Using vector database ${entityDocument.VectorDatabaseID} and AI Model ${entityDocument.AIModelID}`);
52
+ //await this.createListDetailsForDupeRun(params.RecordIDs, list.ID);
53
+ LogStatus(`Using vector database ${entityDocument.VectorDatabaseID} and AI Model ${entityDocument.AIModelID}`);
47
54
  const vectorDB = super.GetVectorDatabase(entityDocument.VectorDatabaseID);
48
55
  const aiModel = super.GetAIModel(entityDocument.AIModelID);
49
- (0, core_2.LogStatus)(`AIModel driver class: ${aiModel.DriverClass}`);
50
- (0, core_2.LogStatus)(`VectorDB class key: ${vectorDB.ClassKey}`);
51
- const embeddingAPIKey = (0, ai_1.GetAIAPIKey)(aiModel.DriverClass);
52
- const vectorDBAPIKey = (0, ai_1.GetAIAPIKey)(vectorDB.ClassKey);
56
+ LogStatus(`AIModel driver class: ${aiModel.DriverClass}`);
57
+ LogStatus(`VectorDB class key: ${vectorDB.ClassKey}`);
58
+ const embeddingAPIKey = GetAIAPIKey(aiModel.DriverClass);
59
+ const vectorDBAPIKey = GetAIAPIKey(vectorDB.ClassKey);
53
60
  if (!embeddingAPIKey) {
54
61
  throw Error(`No API Key found for AI Model ${aiModel.DriverClass}`);
55
62
  }
56
63
  if (!vectorDBAPIKey) {
57
64
  throw Error(`No API Key found for Vector Database ${vectorDB.ClassKey}`);
58
65
  }
59
- this._embedding = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(ai_1.BaseEmbeddings, aiModel.DriverClass, embeddingAPIKey);
60
- this._vectorDB = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(ai_vectordb_1.VectorDBBase, vectorDB.ClassKey, vectorDBAPIKey);
66
+ //LogStatus(`Embedding API Key: ${embeddingAPIKey} VectorDB API Key: ${vectorDBAPIKey}`);
67
+ this._embedding = MJGlobal.Instance.ClassFactory.CreateInstance(BaseEmbeddings, aiModel.DriverClass, embeddingAPIKey);
68
+ this._vectorDB = MJGlobal.Instance.ClassFactory.CreateInstance(VectorDBBase, vectorDB.ClassKey, vectorDBAPIKey);
61
69
  if (!this._embedding) {
62
70
  throw Error(`Failed to create Embeddings instance for AI Model ${aiModel.DriverClass}`);
63
71
  }
@@ -66,14 +74,16 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
66
74
  }
67
75
  let records = await this.GetRecordsByListID(list.ID, entityDocument.EntityID);
68
76
  if (records.length === 0) {
69
- (0, core_1.LogError)(`No records found in list ${list.Name}, with listID ${list.ID} and EntityID ${entityDocument.EntityID} exiting early`);
77
+ LogError(`No records found in list ${list.Name}, with listID ${list.ID} and EntityID ${entityDocument.EntityID} exiting early`);
70
78
  response.ErrorMessage = `No records found in list ${list.Name}`;
71
79
  response.Status = 'Error';
72
80
  return response;
73
81
  }
74
- (0, core_2.LogStatus)("Vectorizing " + records.length + " records");
82
+ LogStatus("Vectorizing " + records.length + " records");
75
83
  const recordTemplates = [];
84
+ //Relationship(entityID: number, entityRecord: any, relationshipName: string, maxRows: number, entityDocumentName: string)
76
85
  let sampleTemplate = entityDocument.Template;
86
+ //sampleTemplate += " ${Relationship('Deals', 5, 'Sample Relationship Document for crm.Deals Entity')} ${Relationship('Deals', 5, 'Second Sample Relationship Document for crm.Deals Entity')}";
77
87
  for (const record of records) {
78
88
  const template = await templateParser.Parse(sampleTemplate, entityDocument.EntityID, record, contextUser);
79
89
  recordTemplates.push(template);
@@ -85,7 +95,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
85
95
  const compositeKey = records[index].PrimaryKey;
86
96
  let filterResult = await this._vectorDB.queryIndex({ vector: vector, topK: topK, includeMetadata: true, includeValues: false });
87
97
  if (!filterResult.success) {
88
- (0, core_1.LogError)(`Failed to query index for record ${compositeKey.ToString()}`);
98
+ LogError(`Failed to query index for record ${compositeKey.ToString()}`);
89
99
  continue;
90
100
  }
91
101
  let queryResult = await this.getVectorDuplicates(filterResult);
@@ -95,6 +105,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
95
105
  queryResult.EntityID = entityDocument.EntityID;
96
106
  queryResult.RecordCompositeKey = compositeKey;
97
107
  results.push(queryResult);
108
+ //now update all of the dupe run detail records
98
109
  let dupeRunDetail = duplicateRunDetails.find((detail) => detail.RecordID === compositeKey.Values());
99
110
  if (dupeRunDetail) {
100
111
  const matchRecords = await this.createDuplicateRunDetailMatchesForRecord(dupeRunDetail.ID, queryResult);
@@ -102,13 +113,14 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
102
113
  dupeRunDetail.MatchStatus = 'Complete';
103
114
  let success = await super.SaveEntity(dupeRunDetail);
104
115
  if (!success) {
105
- (0, core_2.LogStatus)(`Failed to update Duplicate Run Detail record ${dupeRunDetail.ID}`);
116
+ LogStatus(`Failed to update Duplicate Run Detail record ${dupeRunDetail.ID}`);
106
117
  }
107
118
  }
108
119
  else {
109
- (0, core_1.LogError)(`Failed to find Duplicate Run Detail record for ${compositeKey.ToString()}`);
120
+ LogError(`Failed to find Duplicate Run Detail record for ${compositeKey.ToString()}`);
110
121
  }
111
122
  }
123
+ //almost done
112
124
  duplicateRun.ProcessingStatus = 'Complete';
113
125
  duplicateRun.EndedAt = new Date();
114
126
  let success = await super.SaveEntity(duplicateRun);
@@ -118,8 +130,8 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
118
130
  await this.mergeRecords(response, entityDocument);
119
131
  response.PotentialDuplicateResult = results;
120
132
  response.Status = 'Success';
121
- (0, core_2.LogStatus)("Dupe Run complete. Response:");
122
- (0, core_2.LogStatus)(JSON.stringify(response, null, "\t"));
133
+ LogStatus("Dupe Run complete. Response:");
134
+ LogStatus(JSON.stringify(response, null, "\t"));
123
135
  return response;
124
136
  }
125
137
  async GetRecordsByListID(listID, entityID) {
@@ -138,7 +150,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
138
150
  return rvResult.Results;
139
151
  }
140
152
  async createDuplicateRunRecord(entityDocument, listID) {
141
- const md = new core_1.Metadata();
153
+ const md = new Metadata();
142
154
  let duplicateRun = await md.GetEntityObject('Duplicate Runs');
143
155
  duplicateRun.NewRecord();
144
156
  duplicateRun.EntityID = entityDocument.EntityID;
@@ -155,7 +167,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
155
167
  }
156
168
  async createDuplicateRunDetailRecords(recordIDs, duplicateRunID) {
157
169
  let results = [];
158
- const md = new core_1.Metadata();
170
+ const md = new Metadata();
159
171
  for (const recordID of recordIDs) {
160
172
  let runDetail = await md.GetEntityObject('Duplicate Run Details');
161
173
  runDetail.NewRecord();
@@ -180,7 +192,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
180
192
  if (!viewResults.Success) {
181
193
  throw new Error(viewResults.ErrorMessage);
182
194
  }
183
- const md = new core_1.Metadata();
195
+ const md = new Metadata();
184
196
  const listDetails = viewResults.Results;
185
197
  for (const listDetail of listDetails) {
186
198
  let runDetail = await md.GetEntityObject('Duplicate Run Details');
@@ -194,13 +206,13 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
194
206
  results.push(runDetail);
195
207
  }
196
208
  else {
197
- (0, core_1.LogError)("Failed to save DuplicateRunDetailEntity", undefined, runDetail.LatestResult);
209
+ LogError("Failed to save DuplicateRunDetailEntity", undefined, runDetail.LatestResult);
198
210
  }
199
211
  }
200
212
  return results;
201
213
  }
202
214
  async getListEntity(listID) {
203
- const md = new core_1.Metadata();
215
+ const md = new Metadata();
204
216
  let list = await md.GetEntityObject('Lists');
205
217
  list.ContextCurrentUser = super.CurrentUser;
206
218
  const success = await list.Load(listID);
@@ -210,7 +222,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
210
222
  return list;
211
223
  }
212
224
  async getDuplicateRunEntity(DupeRunID) {
213
- const md = new core_1.Metadata();
225
+ const md = new Metadata();
214
226
  let dupeRun = await md.GetEntityObject('Duplicate Runs');
215
227
  dupeRun.ContextCurrentUser = super.CurrentUser;
216
228
  const success = await dupeRun.Load(DupeRunID);
@@ -227,7 +239,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
227
239
  return entity;
228
240
  }
229
241
  async createListForDupeRun(entityDocument) {
230
- const md = new core_1.Metadata();
242
+ const md = new Metadata();
231
243
  const list = await md.GetEntityObject('Lists');
232
244
  list.NewRecord();
233
245
  list.Name = `Potential Duplicate Run`;
@@ -241,7 +253,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
241
253
  return list;
242
254
  }
243
255
  async createDuplicateRunDetailMatchesForRecord(DuplicateRunDetailID, duplicateResult) {
244
- const md = new core_1.Metadata();
256
+ const md = new Metadata();
245
257
  let matchRecords = [];
246
258
  for (const dupe of duplicateResult.Duplicates) {
247
259
  const match = await md.GetEntityObject('Duplicate Run Detail Matches');
@@ -262,14 +274,16 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
262
274
  return matchRecords;
263
275
  }
264
276
  async mergeRecords(dupeResponse, entityDocument) {
265
- const md = new core_1.Metadata();
277
+ const md = new Metadata();
266
278
  for (const dupeResult of dupeResponse.PotentialDuplicateResult) {
267
279
  for (const [index, dupe] of dupeResult.Duplicates.entries()) {
268
280
  if (dupe.ToString() === dupeResult.RecordCompositeKey.ToString()) {
281
+ //same record, skip
269
282
  continue;
270
283
  }
271
284
  if (dupe.ProbabilityScore >= entityDocument.AbsoluteMatchThreshold) {
272
- let mergeParams = new core_1.RecordMergeRequest();
285
+ //merge
286
+ let mergeParams = new RecordMergeRequest();
273
287
  mergeParams.EntityName = entityDocument.Entity;
274
288
  mergeParams.SurvivingRecordCompositeKey = dupeResult.RecordCompositeKey;
275
289
  mergeParams.RecordsToMerge = [dupe];
@@ -278,7 +292,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
278
292
  let dupeRunMatchRecord = await md.GetEntityObject('Duplicate Run Detail Matches', super.CurrentUser);
279
293
  let loadResult = await dupeRunMatchRecord.Load(dupeResult.DuplicateRunDetailMatchRecordIDs[index]);
280
294
  if (!loadResult) {
281
- (0, core_1.LogError)(`Failed to load Duplicate Run Match record ${dupeResult.DuplicateRunDetailMatchRecordIDs[index]}`);
295
+ LogError(`Failed to load Duplicate Run Match record ${dupeResult.DuplicateRunDetailMatchRecordIDs[index]}`);
282
296
  continue;
283
297
  }
284
298
  dupeRunMatchRecord.MergeStatus = 'Complete';
@@ -286,28 +300,28 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
286
300
  dupeRunMatchRecord.MergedAt = new Date();
287
301
  let saveResult = await dupeRunMatchRecord.Save();
288
302
  if (!saveResult) {
289
- (0, core_1.LogError)(`Failed to update Duplicate Run Match record ${dupeRunMatchRecord.ID}`);
303
+ LogError(`Failed to update Duplicate Run Match record ${dupeRunMatchRecord.ID}`);
290
304
  }
291
305
  }
292
306
  else {
293
- (0, core_1.LogError)(`Failed to merge records ${dupeResult.RecordCompositeKey.ToString()} and ${dupe.ToString()}`);
307
+ LogError(`Failed to merge records ${dupeResult.RecordCompositeKey.ToString()} and ${dupe.ToString()}`);
294
308
  }
295
309
  }
296
310
  }
297
311
  }
298
312
  }
299
313
  async getVectorDuplicates(queryResponse) {
300
- let response = new core_1.PotentialDuplicateResult();
314
+ let response = new PotentialDuplicateResult();
301
315
  for (const match of queryResponse.data.matches) {
302
316
  const record = match;
303
317
  if (!record || !record.id) {
304
318
  continue;
305
319
  }
306
320
  if (!record.metadata || !record.metadata.RecordID) {
307
- (0, core_1.LogError)(`Invalid vector metadata: ${record.id}`);
321
+ LogError(`Invalid vector metadata: ${record.id}`);
308
322
  continue;
309
323
  }
310
- let duplicate = new core_1.PotentialDuplicate();
324
+ let duplicate = new PotentialDuplicate();
311
325
  duplicate.LoadFromConcatenatedString(record.metadata.RecordID);
312
326
  duplicate.ProbabilityScore = record.score;
313
327
  response.Duplicates.push(duplicate);
@@ -315,5 +329,4 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
315
329
  return response;
316
330
  }
317
331
  }
318
- exports.DuplicateRecordDetector = DuplicateRecordDetector;
319
332
  //# sourceMappingURL=duplicateRecordDetector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"duplicateRecordDetector.js","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":";;;AAAA,2CAAiE;AACjE,+CAA4O;AAC5O,+CAAiD;AACjD,6DAAyE;AACzE,mDAAkD;AAElD,2DAAwD;AACxD,mEAAyH;AAEzH,MAAa,uBAAwB,SAAQ,uBAAU;IAEnD,SAAS,CAAe;IACxB,UAAU,CAAiB;IAE3B;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAO,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,MAAiC,EAAE,WAAsB;QACtF,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QAMhC,IAAI,UAAU,GAAG,IAAI,mCAAkB,EAAE,CAAC;QAC1C,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAE3C,IAAI,cAAc,GAAgC,MAAM,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9G,IAAG,CAAC,cAAc,EAAC,CAAC;YAChB,MAAM,KAAK,CAAC,oCAAoC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAO/E,CAAC;QAED,IAAI,QAAQ,GAA+B,IAAI,iCAA0B,EAAE,CAAC;QAC5E,QAAQ,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAEvC,IAAG,CAAC,cAAc,EAAC,CAAC;YAChB,QAAQ,CAAC,YAAY,GAAG,8CAA8C,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxF,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC;YAC1B,OAAO,QAAQ,CAAC;QACpB,CAAC;QAGD,MAAM,OAAO,GAA0B;YACnC,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,gBAAgB,EAAE,cAAc,CAAC,EAAE;YACnC,cAAc,EAAE,EAAE;YAClB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,WAAW;SAC3B,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,6CAA4B,CAAC,cAAc,EAAE,CAAC;QACrE,MAAM,UAAU,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAe,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,YAAY,GAAuB,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7L,MAAM,mBAAmB,GAA+B,MAAM,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QAGrI,IAAA,gBAAS,EAAC,yBAAyB,cAAc,CAAC,gBAAgB,iBAAiB,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;QAE/G,MAAM,QAAQ,GAAyB,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAChG,MAAM,OAAO,GAAkB,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAE1E,IAAA,gBAAS,EAAC,yBAAyB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,IAAA,gBAAS,EAAC,uBAAuB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtD,MAAM,eAAe,GAAW,IAAA,gBAAW,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,cAAc,GAAW,IAAA,gBAAW,EAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE9D,IAAG,CAAC,eAAe,EAAC,CAAC;YACjB,MAAM,KAAK,CAAC,iCAAiC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAG,CAAC,cAAc,EAAC,CAAC;YAChB,MAAM,KAAK,CAAC,wCAAwC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;QAGD,IAAI,CAAC,UAAU,GAAG,iBAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAiB,mBAAc,EAAE,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;QACrI,IAAI,CAAC,SAAS,GAAG,iBAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAe,0BAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE9H,IAAG,CAAC,IAAI,CAAC,UAAU,EAAC,CAAC;YACjB,MAAM,KAAK,CAAC,qDAAqD,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAG,CAAC,IAAI,CAAC,SAAS,EAAC,CAAC;YAChB,MAAM,KAAK,CAAC,iDAAiD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9E,IAAG,OAAO,CAAC,MAAM,KAAK,CAAC,EAAC,CAAC;YACrB,IAAA,eAAQ,EAAC,4BAA4B,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,EAAE,iBAAiB,cAAc,CAAC,QAAQ,gBAAgB,CAAC,CAAC;YAChI,QAAQ,CAAC,YAAY,GAAG,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC;YAChE,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAEpB,CAAC;QAED,IAAA,gBAAS,EAAC,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QAExD,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,IAAI,cAAc,GAAY,cAAsB,CAAC,QAAQ,CAAC;QAE9D,KAAI,MAAM,MAAM,IAAI,OAAO,EAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1G,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjG,MAAM,IAAI,GAAW,CAAC,CAAC;QACvB,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAC,CAAC;YAC9D,MAAM,YAAY,GAAiB,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YAC7D,IAAI,YAAY,GAAiB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9I,IAAG,CAAC,YAAY,CAAC,OAAO,EAAC,CAAC;gBACtB,IAAA,eAAQ,EAAC,oCAAoC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxE,SAAS;YACb,CAAC;YAED,IAAI,WAAW,GAA6B,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACzF,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC5D,OAAO,IAAI,CAAC,gBAAgB,IAAI,cAAc,CAAC,uBAAuB,CAAC;YAC3E,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;YAC/C,WAAW,CAAC,kBAAkB,GAAG,YAAY,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAG1B,IAAI,aAAa,GAA6B,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAgC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YACxJ,IAAG,aAAa,EAAC,CAAC;gBACd,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,wCAAwC,CAAC,aAAa,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBACxG,WAAW,CAAC,gCAAgC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrF,aAAa,CAAC,WAAW,GAAG,UAAU,CAAC;gBACvC,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;gBACpD,IAAG,CAAC,OAAO,EAAC,CAAC;oBACT,IAAA,gBAAS,EAAC,gDAAgD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClF,CAAC;YACL,CAAC;iBACG,CAAC;gBACD,IAAA,eAAQ,EAAC,kDAAkD,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1F,CAAC;QACL,CAAC;QAGD,YAAY,CAAC,gBAAgB,GAAG,UAAU,CAAC;QAC3C,YAAY,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACnD,IAAG,CAAC,OAAO,EAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,yCAAyC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAElD,QAAQ,CAAC,wBAAwB,GAAG,OAAO,CAAC;QAC5C,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;QAE5B,IAAA,gBAAS,EAAC,8BAA8B,CAAC,CAAC;QAC1C,IAAA,gBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,QAAgB;QAC7D,MAAM,UAAU,GAAe,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAG,CAAC,UAAU,EAAC,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAa;YACrD,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,WAAW,EAAE,kEAAkE,MAAM,IAAI;YACzF,UAAU,EAAE,eAAe;SAC9B,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAEtB,IAAG,CAAC,QAAQ,CAAC,OAAO,EAAC,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,cAAoC,EAAE,MAAc;QACvF,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,IAAI,YAAY,GAAuB,MAAM,EAAE,CAAC,eAAe,CAAqB,gBAAgB,CAAC,CAAC;QACtG,YAAY,CAAC,SAAS,EAAE,CAAC;QACzB,YAAY,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;QAChD,YAAY,CAAC,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACpD,YAAY,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QACpC,YAAY,CAAC,gBAAgB,GAAG,aAAa,CAAC;QAC9C,YAAY,CAAC,cAAc,GAAG,SAAS,CAAC;QACxC,YAAY,CAAC,YAAY,GAAG,MAAM,CAAC;QAEnC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACxD,IAAG,CAAC,UAAU,EAAC,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,+BAA+B,CAAC,SAAyB,EAAE,cAAsB;QAC3F,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,KAAI,MAAM,QAAQ,IAAI,SAAS,EAAC,CAAC;YAC7B,IAAI,SAAS,GAA6B,MAAM,EAAE,CAAC,eAAe,CAA2B,uBAAuB,CAAC,CAAC;YACtH,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,cAAc,GAAG,cAAc,CAAC;YAC1C,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAClD,IAAG,OAAO,EAAC,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,uCAAuC,CAAC,MAAc,EAAE,cAAsB;QACxF,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5C,UAAU,EAAE,cAAc;YAC1B,WAAW,EAAE,aAAa,MAAM,GAAG;YACnC,UAAU,EAAE,eAAe;SAAC,EAC5B,KAAK,CAAC,WAAW,CAAC,CAAC;QAEvB,IAAG,CAAC,WAAW,CAAC,OAAO,EAAC,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QAGD,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,MAAM,WAAW,GAAuB,WAAW,CAAC,OAA6B,CAAC;QAClF,KAAI,MAAM,UAAU,IAAI,WAAW,EAAC,CAAC;YACjC,IAAI,SAAS,GAA6B,MAAM,EAAE,CAAC,eAAe,CAA2B,uBAAuB,CAAC,CAAC;YACtH,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,cAAc,GAAG,cAAc,CAAC;YAC1C,SAAS,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;YACzC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAClD,IAAG,OAAO,EAAC,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;iBACG,CAAC;gBACD,IAAA,eAAQ,EAAC,yCAAyC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;YAC3F,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc;QACtC,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,IAAI,IAAI,GAAe,MAAM,EAAE,CAAC,eAAe,CAAa,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAG,CAAC,OAAO,EAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QACjD,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,IAAI,OAAO,GAAuB,MAAM,EAAE,CAAC,eAAe,CAAqB,gBAAgB,CAAC,CAAC;QACjG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAG,CAAC,OAAO,EAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,6BAA6B,CAAC,MAAc;QACtD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAqB,gBAAgB,EAAE,mBAAmB,MAAM,GAAG,CAAC,CAAC;QACrH,IAAG,CAAC,MAAM,EAAC,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,cAAoC;QACnE,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,GAAe,MAAM,EAAE,CAAC,eAAe,CAAa,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,+BAA+B,cAAc,CAAC,MAAM,SAAS,CAAC;QACjF,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAEnC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,IAAG,CAAC,UAAU,EAAC,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,wCAAwC,CAAC,oBAA4B,EAAE,eAAyC;QAC1H,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,IAAI,YAAY,GAAoC,EAAE,CAAC;QACvD,KAAI,MAAM,IAAI,IAAI,eAAe,CAAC,UAAU,EAAC,CAAC;YAC1C,MAAM,KAAK,GAAkC,MAAM,EAAE,CAAC,eAAe,CAAgC,8BAA8B,CAAC,CAAC;YACrI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;YAClD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC/C,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;YACjC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YAC9B,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAG,OAAO,EAAC,CAAC;gBACR,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,YAAwC,EAAE,cAAoC;QACrG,MAAM,EAAE,GAAa,IAAI,eAAQ,EAAE,CAAC;QACpC,KAAI,MAAM,UAAU,IAAI,YAAY,CAAC,wBAAwB,EAAC,CAAC;YAC3D,KAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,EAAC,CAAC;gBACxD,IAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAC,CAAC;oBAE7D,SAAS;gBACb,CAAC;gBAED,IAAG,IAAI,CAAC,gBAAgB,IAAI,cAAc,CAAC,sBAAsB,EAAC,CAAC;oBAE/D,IAAI,WAAW,GAAuB,IAAI,yBAAkB,EAAE,CAAC;oBAC/D,WAAW,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;oBAC/C,WAAW,CAAC,2BAA2B,GAAG,UAAU,CAAC,kBAAkB,CAAC;oBACxE,WAAW,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;oBACnE,IAAG,MAAM,CAAC,OAAO,EAAC,CAAC;wBACf,IAAI,kBAAkB,GAAkC,MAAM,EAAE,CAAC,eAAe,CAAgC,8BAA8B,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;wBACnK,IAAI,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC,CAAC;wBACnG,IAAG,CAAC,UAAU,EAAC,CAAC;4BACZ,IAAA,eAAQ,EAAC,6CAA6C,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;4BAC5G,SAAS;wBACb,CAAC;wBAED,kBAAkB,CAAC,WAAW,GAAG,UAAU,CAAC;wBAC5C,kBAAkB,CAAC,MAAM,GAAG,QAAQ,CAAC;wBACrC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;wBAEzC,IAAI,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;wBACjD,IAAG,CAAC,UAAU,EAAC,CAAC;4BACZ,IAAA,eAAQ,EAAC,+CAA+C,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;wBACrF,CAAC;oBACL,CAAC;yBACG,CAAC;wBACD,IAAA,eAAQ,EAAC,2BAA2B,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC3G,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,aAA2B;QACxD,IAAI,QAAQ,GAA6B,IAAI,+BAAwB,EAAE,CAAC;QAExE,KAAI,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAC,CAAC;YAC3C,MAAM,MAAM,GAAmG,KAAK,CAAC;YACrH,IAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAC,CAAC;gBACtB,SAAS;YACb,CAAC;YAED,IAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAC,CAAC;gBAC9C,IAAA,eAAQ,EAAC,4BAA4B,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,SAAS;YACb,CAAC;YAED,IAAI,SAAS,GAAuB,IAAI,yBAAkB,EAAE,CAAC;YAC7D,SAAS,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/D,SAAS,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1C,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAxYD,0DAwYC"}
1
+ {"version":3,"file":"duplicateRecordDetector.js","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAA6B,0BAA0B,EAAgB,OAAO,EAAwB,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAc,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC5O,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAgB,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,kBAAkB,EAAyB,MAAM,gCAAgC,CAAC;AAEzH,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IAKnD;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,MAAiC,EAAE,WAAsB;QACtF,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QAEhC,aAAa;QACb,6BAA6B;QAC7B,+BAA+B;QAE/B,IAAI,UAAU,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC1C,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAE3C,IAAI,cAAc,GAAgC,MAAM,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9G,IAAG,CAAC,cAAc,EAAC,CAAC;YAChB,MAAM,KAAK,CAAC,oCAAoC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC3E,oEAAoE;YACpE,qEAAqE;YACrE,0DAA0D;YAC1D,0EAA0E;YAC1E,2DAA2D;YAC3D,8GAA8G;QAClH,CAAC;QAED,IAAI,QAAQ,GAA+B,IAAI,0BAA0B,EAAE,CAAC;QAC5E,QAAQ,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAEvC,IAAG,CAAC,cAAc,EAAC,CAAC;YAChB,QAAQ,CAAC,YAAY,GAAG,8CAA8C,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxF,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC;YAC1B,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,aAAa;QACb,MAAM,OAAO,GAA0B;YACnC,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,gBAAgB,EAAE,cAAc,CAAC,EAAE;YACnC,cAAc,EAAE,EAAE;YAClB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,WAAW;SAC3B,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,4BAA4B,CAAC,cAAc,EAAE,CAAC;QACrE,MAAM,UAAU,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAe,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,YAAY,GAAuB,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7L,sGAAsG;QACtG,MAAM,mBAAmB,GAA+B,MAAM,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QACrI,oEAAoE;QAEpE,SAAS,CAAC,yBAAyB,cAAc,CAAC,gBAAgB,iBAAiB,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;QAE/G,MAAM,QAAQ,GAAyB,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAChG,MAAM,OAAO,GAAkB,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAE1E,SAAS,CAAC,yBAAyB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,SAAS,CAAC,uBAAuB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtD,MAAM,eAAe,GAAW,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,cAAc,GAAW,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE9D,IAAG,CAAC,eAAe,EAAC,CAAC;YACjB,MAAM,KAAK,CAAC,iCAAiC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAG,CAAC,cAAc,EAAC,CAAC;YAChB,MAAM,KAAK,CAAC,wCAAwC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,yFAAyF;QACzF,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAiB,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;QACrI,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAe,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE9H,IAAG,CAAC,IAAI,CAAC,UAAU,EAAC,CAAC;YACjB,MAAM,KAAK,CAAC,qDAAqD,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAG,CAAC,IAAI,CAAC,SAAS,EAAC,CAAC;YAChB,MAAM,KAAK,CAAC,iDAAiD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9E,IAAG,OAAO,CAAC,MAAM,KAAK,CAAC,EAAC,CAAC;YACrB,QAAQ,CAAC,4BAA4B,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,EAAE,iBAAiB,cAAc,CAAC,QAAQ,gBAAgB,CAAC,CAAC;YAChI,QAAQ,CAAC,YAAY,GAAG,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC;YAChE,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAEpB,CAAC;QAED,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QAExD,MAAM,eAAe,GAAa,EAAE,CAAC;QACrC,0HAA0H;QAC1H,IAAI,cAAc,GAAY,cAAsB,CAAC,QAAQ,CAAC;QAC9D,gMAAgM;QAChM,KAAI,MAAM,MAAM,IAAI,OAAO,EAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1G,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjG,MAAM,IAAI,GAAW,CAAC,CAAC;QACvB,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAC,CAAC;YAC9D,MAAM,YAAY,GAAiB,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YAC7D,IAAI,YAAY,GAAiB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9I,IAAG,CAAC,YAAY,CAAC,OAAO,EAAC,CAAC;gBACtB,QAAQ,CAAC,oCAAoC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxE,SAAS;YACb,CAAC;YAED,IAAI,WAAW,GAA6B,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACzF,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC5D,OAAO,IAAI,CAAC,gBAAgB,IAAI,cAAc,CAAC,uBAAuB,CAAC;YAC3E,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;YAC/C,WAAW,CAAC,kBAAkB,GAAG,YAAY,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE1B,+CAA+C;YAC/C,IAAI,aAAa,GAA6B,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAgC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YACxJ,IAAG,aAAa,EAAC,CAAC;gBACd,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,wCAAwC,CAAC,aAAa,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBACxG,WAAW,CAAC,gCAAgC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrF,aAAa,CAAC,WAAW,GAAG,UAAU,CAAC;gBACvC,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;gBACpD,IAAG,CAAC,OAAO,EAAC,CAAC;oBACT,SAAS,CAAC,gDAAgD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClF,CAAC;YACL,CAAC;iBACG,CAAC;gBACD,QAAQ,CAAC,kDAAkD,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1F,CAAC;QACL,CAAC;QAED,aAAa;QACb,YAAY,CAAC,gBAAgB,GAAG,UAAU,CAAC;QAC3C,YAAY,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACnD,IAAG,CAAC,OAAO,EAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,yCAAyC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAElD,QAAQ,CAAC,wBAAwB,GAAG,OAAO,CAAC;QAC5C,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;QAE5B,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,QAAgB;QAC7D,MAAM,UAAU,GAAe,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAG,CAAC,UAAU,EAAC,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAa;YACrD,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,WAAW,EAAE,kEAAkE,MAAM,IAAI;YACzF,UAAU,EAAE,eAAe;SAC9B,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAEtB,IAAG,CAAC,QAAQ,CAAC,OAAO,EAAC,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,cAAoC,EAAE,MAAc;QACvF,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,YAAY,GAAuB,MAAM,EAAE,CAAC,eAAe,CAAqB,gBAAgB,CAAC,CAAC;QACtG,YAAY,CAAC,SAAS,EAAE,CAAC;QACzB,YAAY,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;QAChD,YAAY,CAAC,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACpD,YAAY,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QACpC,YAAY,CAAC,gBAAgB,GAAG,aAAa,CAAC;QAC9C,YAAY,CAAC,cAAc,GAAG,SAAS,CAAC;QACxC,YAAY,CAAC,YAAY,GAAG,MAAM,CAAC;QAEnC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACxD,IAAG,CAAC,UAAU,EAAC,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,+BAA+B,CAAC,SAAyB,EAAE,cAAsB;QAC3F,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,KAAI,MAAM,QAAQ,IAAI,SAAS,EAAC,CAAC;YAC7B,IAAI,SAAS,GAA6B,MAAM,EAAE,CAAC,eAAe,CAA2B,uBAAuB,CAAC,CAAC;YACtH,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,cAAc,GAAG,cAAc,CAAC;YAC1C,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAClD,IAAG,OAAO,EAAC,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,uCAAuC,CAAC,MAAc,EAAE,cAAsB;QACxF,IAAI,OAAO,GAA+B,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5C,UAAU,EAAE,cAAc;YAC1B,WAAW,EAAE,aAAa,MAAM,GAAG;YACnC,UAAU,EAAE,eAAe;SAAC,EAC5B,KAAK,CAAC,WAAW,CAAC,CAAC;QAEvB,IAAG,CAAC,WAAW,CAAC,OAAO,EAAC,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QAGD,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,MAAM,WAAW,GAAuB,WAAW,CAAC,OAA6B,CAAC;QAClF,KAAI,MAAM,UAAU,IAAI,WAAW,EAAC,CAAC;YACjC,IAAI,SAAS,GAA6B,MAAM,EAAE,CAAC,eAAe,CAA2B,uBAAuB,CAAC,CAAC;YACtH,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,cAAc,GAAG,cAAc,CAAC;YAC1C,SAAS,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;YACzC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAClD,IAAG,OAAO,EAAC,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;iBACG,CAAC;gBACD,QAAQ,CAAC,yCAAyC,EAAE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;YAC3F,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc;QACtC,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,IAAI,GAAe,MAAM,EAAE,CAAC,eAAe,CAAa,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAG,CAAC,OAAO,EAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QACjD,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,OAAO,GAAuB,MAAM,EAAE,CAAC,eAAe,CAAqB,gBAAgB,CAAC,CAAC;QACjG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAG,CAAC,OAAO,EAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,6BAA6B,CAAC,MAAc;QACtD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAqB,gBAAgB,EAAE,mBAAmB,MAAM,GAAG,CAAC,CAAC;QACrH,IAAG,CAAC,MAAM,EAAC,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,cAAoC;QACnE,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,GAAe,MAAM,EAAE,CAAC,eAAe,CAAa,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,+BAA+B,cAAc,CAAC,MAAM,SAAS,CAAC;QACjF,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAEnC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChD,IAAG,CAAC,UAAU,EAAC,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,wCAAwC,CAAC,oBAA4B,EAAE,eAAyC;QAC1H,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,YAAY,GAAoC,EAAE,CAAC;QACvD,KAAI,MAAM,IAAI,IAAI,eAAe,CAAC,UAAU,EAAC,CAAC;YAC1C,MAAM,KAAK,GAAkC,MAAM,EAAE,CAAC,eAAe,CAAgC,8BAA8B,CAAC,CAAC;YACrI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;YAClD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC/C,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;YACjC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YAC9B,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAG,OAAO,EAAC,CAAC;gBACR,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,YAAwC,EAAE,cAAoC;QACrG,MAAM,EAAE,GAAa,IAAI,QAAQ,EAAE,CAAC;QACpC,KAAI,MAAM,UAAU,IAAI,YAAY,CAAC,wBAAwB,EAAC,CAAC;YAC3D,KAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,EAAC,CAAC;gBACxD,IAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAC,CAAC;oBAC7D,mBAAmB;oBACnB,SAAS;gBACb,CAAC;gBAED,IAAG,IAAI,CAAC,gBAAgB,IAAI,cAAc,CAAC,sBAAsB,EAAC,CAAC;oBAC/D,OAAO;oBACP,IAAI,WAAW,GAAuB,IAAI,kBAAkB,EAAE,CAAC;oBAC/D,WAAW,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;oBAC/C,WAAW,CAAC,2BAA2B,GAAG,UAAU,CAAC,kBAAkB,CAAC;oBACxE,WAAW,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;oBACnE,IAAG,MAAM,CAAC,OAAO,EAAC,CAAC;wBACf,IAAI,kBAAkB,GAAkC,MAAM,EAAE,CAAC,eAAe,CAAgC,8BAA8B,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;wBACnK,IAAI,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC,CAAC;wBACnG,IAAG,CAAC,UAAU,EAAC,CAAC;4BACZ,QAAQ,CAAC,6CAA6C,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;4BAC5G,SAAS;wBACb,CAAC;wBAED,kBAAkB,CAAC,WAAW,GAAG,UAAU,CAAC;wBAC5C,kBAAkB,CAAC,MAAM,GAAG,QAAQ,CAAC;wBACrC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;wBAEzC,IAAI,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;wBACjD,IAAG,CAAC,UAAU,EAAC,CAAC;4BACZ,QAAQ,CAAC,+CAA+C,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;wBACrF,CAAC;oBACL,CAAC;yBACG,CAAC;wBACD,QAAQ,CAAC,2BAA2B,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC3G,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,aAA2B;QACxD,IAAI,QAAQ,GAA6B,IAAI,wBAAwB,EAAE,CAAC;QAExE,KAAI,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAC,CAAC;YAC3C,MAAM,MAAM,GAAmG,KAAK,CAAC;YACrH,IAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAC,CAAC;gBACtB,SAAS;YACb,CAAC;YAED,IAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAC,CAAC;gBAC9C,QAAQ,CAAC,4BAA4B,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,SAAS;YACb,CAAC;YAED,IAAI,SAAS,GAAuB,IAAI,kBAAkB,EAAE,CAAC;YAC7D,SAAS,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/D,SAAS,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1C,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
@@ -1,44 +1,15 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.VectorSyncBase = void 0;
27
- const fs = __importStar(require("fs"));
28
- class VectorSyncBase {
29
- _contextUser;
30
- _runView;
31
- _startTime;
32
- _endTime;
33
- _pineconeDB;
34
- _embedding;
35
- _languageModel;
1
+ import * as fs from 'fs';
2
+ export class VectorSyncBase {
36
3
  async timer(ms) {
37
4
  return new Promise(res => setTimeout(res, ms));
38
5
  }
39
6
  parseStringTemplate(str, obj) {
7
+ //Split string into non-argument textual parts
40
8
  let parts = str.split(/\$\{(?!\d)[\wæøåÆØÅ]*\}/);
9
+ //Split string into property names. Empty array if match fails.
41
10
  let args = str.match(/[^{\}]+(?=})/g) || [];
11
+ //Map parameters from obj by property name. Solution is limited by shallow one level mapping.
12
+ //Undefined values are substituted with an empty string, but other falsy values are accepted.
42
13
  let parameters = args.map(argument => obj[argument] || (obj[argument] === undefined ? "" : obj[argument]));
43
14
  return String.raw({ raw: parts }, ...parameters);
44
15
  }
@@ -49,8 +20,10 @@ class VectorSyncBase {
49
20
  this._endTime = new Date();
50
21
  }
51
22
  timeDiff() {
52
- let timeDiff = this._endTime.valueOf() - this._startTime.valueOf();
23
+ let timeDiff = this._endTime.valueOf() - this._startTime.valueOf(); //in ms
24
+ // strip the ms
53
25
  timeDiff /= 1000;
26
+ // get seconds
54
27
  var seconds = Math.round(timeDiff);
55
28
  return seconds;
56
29
  }
@@ -66,5 +39,4 @@ class VectorSyncBase {
66
39
  return true;
67
40
  }
68
41
  }
69
- exports.VectorSyncBase = VectorSyncBase;
70
42
  //# sourceMappingURL=vectorSyncBase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vectorSyncBase.js","sourceRoot":"","sources":["../../src/generic/vectorSyncBase.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AAKzB,MAAa,cAAc;IACvB,YAAY,CAAW;IACvB,QAAQ,CAAU;IAElB,UAAU,CAAO;IACjB,QAAQ,CAAO;IAEf,WAAW,CAAmB;IAC9B,UAAU,CAAU;IACpB,cAAc,CAAU;IAEd,KAAK,CAAC,KAAK,CAAC,EAAU;QAC5B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAES,mBAAmB,CAAC,GAAW,EAAE,GAAQ;QAE/C,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAGjD,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAI5C,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3G,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;IACrD,CAAC;IAES,KAAK;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IACjC,CAAC;IAES,GAAG;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;IAES,QAAQ;QACd,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAEnE,QAAQ,IAAI,IAAI,CAAC;QAGjB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACnB,CAAC;IAES,YAAY,CAAC,IAAS,EAAE,IAAY;QAC1C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAES,OAAO,CAAC,GAAG;QACjB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA3DD,wCA2DC"}
1
+ {"version":3,"file":"vectorSyncBase.js","sourceRoot":"","sources":["../../src/generic/vectorSyncBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,MAAM,OAAO,cAAc;IAWb,KAAK,CAAC,KAAK,CAAC,EAAU;QAC5B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAES,mBAAmB,CAAC,GAAW,EAAE,GAAQ;QAC/C,8CAA8C;QAC9C,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAEjD,+DAA+D;QAC/D,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAE5C,8FAA8F;QAC9F,6FAA6F;QAC7F,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3G,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;IACrD,CAAC;IAES,KAAK;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IACjC,CAAC;IAES,GAAG;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;IAES,QAAQ;QACd,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;QAC3E,eAAe;QACf,QAAQ,IAAI,IAAI,CAAC;QAEjB,eAAe;QACf,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACnB,CAAC;IAES,YAAY,CAAC,IAAS,EAAE,IAAY;QAC1C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAES,OAAO,CAAC,GAAG;QACjB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './generic/vectorSyncBase';
2
- export * from './models/entitySyncConfig';
3
- export * from './duplicateRecordDetector';
1
+ export * from './generic/vectorSyncBase.js';
2
+ export * from './models/entitySyncConfig.js';
3
+ export * from './duplicateRecordDetector.js';
4
4
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,20 +1,4 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./generic/vectorSyncBase"), exports);
18
- __exportStar(require("./models/entitySyncConfig"), exports);
19
- __exportStar(require("./duplicateRecordDetector"), exports);
1
+ export * from './generic/vectorSyncBase.js';
2
+ export * from './models/entitySyncConfig.js';
3
+ export * from './duplicateRecordDetector.js';
20
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,4DAA0C;AAC1C,4DAA0C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
@@ -1,11 +1,36 @@
1
1
  import { RunViewParams } from "@memberjunction/core";
2
2
  export type EntitySyncConfig = {
3
+ /**
4
+ * The ID of the entity document to use
5
+ */
3
6
  EntityDocumentID: string;
7
+ /**
8
+ * The time, in seconds, inbetween each run
9
+ */
4
10
  Interval: number;
11
+ /**
12
+ * The parameters to use when running the dynamic view.
13
+ * Note that the EntityName property will be overriden
14
+ * and set to the value of the Entity Document's Type field
15
+ * */
5
16
  RunViewParams: RunViewParams;
17
+ /**
18
+ * If the given entity should be included in the sync
19
+ */
6
20
  IncludeInSync: boolean;
21
+ /**
22
+ * The last time the sync was run for this entitiy
23
+ * format is Month day, year hour:minute:second
24
+ * e.g. August 19, 1975 23:15:30
25
+ */
7
26
  LastRunDate: string;
27
+ /**
28
+ * The ID of the vector index to use
29
+ */
8
30
  VectorIndexID: number;
31
+ /**
32
+ * The ID of the vector database to use
33
+ */
9
34
  VectorID: number;
10
35
  };
11
36
  //# sourceMappingURL=entitySyncConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entitySyncConfig.d.ts","sourceRoot":"","sources":["../../src/models/entitySyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG;IAI3B,gBAAgB,EAAE,MAAM,CAAC;IAIzB,QAAQ,EAAE,MAAM,CAAC;IAMjB,aAAa,EAAE,aAAa,CAAC;IAI7B,aAAa,EAAE,OAAO,CAAC;IAMvB,WAAW,EAAE,MAAM,CAAC;IAIpB,aAAa,EAAE,MAAM,CAAC;IAItB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA"}
1
+ {"version":3,"file":"entitySyncConfig.d.ts","sourceRoot":"","sources":["../../src/models/entitySyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;SAIK;IACL,aAAa,EAAE,aAAa,CAAC;IAC7B;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA"}
@@ -1,3 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
3
2
  //# sourceMappingURL=entitySyncConfig.js.map
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-vector-dupe",
3
- "version": "3.4.0",
3
+ "type": "module",
4
+ "version": "4.1.0",
4
5
  "description": "MemberJunction: AI Vector/Entity Sync Package - Handles synchronization between Vector DB and MJ CDP Data",
5
6
  "main": "dist/index.js",
6
7
  "types": "dist/index.d.ts",
@@ -9,28 +10,28 @@
9
10
  ],
10
11
  "scripts": {
11
12
  "start": "ts-node-dev src/index.ts",
12
- "build": "tsc",
13
+ "build": "tsc && tsc-alias -f",
13
14
  "test": "echo \"Error: no test specified\" && exit 1"
14
15
  },
15
16
  "author": "MemberJunction.com",
16
17
  "license": "ISC",
17
18
  "dependencies": {
18
- "@memberjunction/ai": "3.4.0",
19
- "@memberjunction/ai-vectordb": "3.4.0",
20
- "@memberjunction/ai-vectors": "3.4.0",
21
- "@memberjunction/ai-vectors-pinecone": "3.4.0",
22
- "@memberjunction/ai-vector-sync": "3.4.0",
23
- "@memberjunction/aiengine": "3.4.0",
24
- "@memberjunction/core": "3.4.0",
25
- "@memberjunction/global": "3.4.0",
26
- "@memberjunction/core-entities": "3.4.0",
27
- "dotenv": "^16.4.1"
19
+ "@memberjunction/ai": "4.1.0",
20
+ "@memberjunction/ai-vectordb": "4.1.0",
21
+ "@memberjunction/ai-vectors": "4.1.0",
22
+ "@memberjunction/ai-vectors-pinecone": "4.1.0",
23
+ "@memberjunction/ai-vector-sync": "4.1.0",
24
+ "@memberjunction/aiengine": "4.1.0",
25
+ "@memberjunction/core": "4.1.0",
26
+ "@memberjunction/global": "4.1.0",
27
+ "@memberjunction/core-entities": "4.1.0",
28
+ "dotenv": "^17.2.4"
28
29
  },
29
30
  "devDependencies": {
30
- "@types/mssql": "^9.1.5",
31
- "@types/node": "20.14.2",
31
+ "@types/mssql": "^9.1.9",
32
+ "@types/node": "24.10.11",
32
33
  "ts-node-dev": "^2.0.0",
33
- "typescript": "^5.4.5"
34
+ "typescript": "^5.9.3"
34
35
  },
35
36
  "repository": {
36
37
  "type": "git",