@memberjunction/ai-vector-sync 5.21.0 → 5.22.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.
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Configuration interface for EntityDocument.Configuration JSON column.
3
+ *
4
+ * Controls how the vectorization pipeline processes records for a given
5
+ * entity document — which fields get into vector metadata, how they're
6
+ * truncated, how records are filtered, and pipeline tuning knobs.
7
+ *
8
+ * All fields are optional. NULL / missing means "use system defaults."
9
+ */
10
+ export interface EntityDocumentConfiguration {
11
+ /** Controls which entity fields appear in vector metadata and how they're stored */
12
+ metadata?: EntityDocumentMetadataConfig;
13
+ /** Scheduling settings for automated incremental sync */
14
+ scheduling?: EntityDocumentSchedulingConfig;
15
+ /** Pipeline tuning — batch sizes, concurrency, rate limiting */
16
+ pipeline?: EntityDocumentPipelineConfig;
17
+ /** Record filtering — limit which records get vectorized */
18
+ recordFilter?: EntityDocumentRecordFilterConfig;
19
+ /** Content chunking for long-form text fields */
20
+ chunking?: EntityDocumentChunkingConfig;
21
+ }
22
+ export interface EntityDocumentMetadataConfig {
23
+ /**
24
+ * Strategy for selecting which fields go into vector metadata:
25
+ * - "all": include every non-PK, non-FK, non-binary, non-system field
26
+ * (current default behavior)
27
+ * - "include": only include fields listed in `fields`
28
+ * - "exclude": include all fields EXCEPT those listed in `fields`
29
+ */
30
+ fieldStrategy?: 'all' | 'include' | 'exclude';
31
+ /**
32
+ * Per-field overrides. The key is the entity field name.
33
+ * Only relevant when fieldStrategy is "include" or "exclude",
34
+ * or when you need to override truncation for specific fields
35
+ * under "all" mode.
36
+ */
37
+ fields?: Record<string, EntityDocumentFieldConfig>;
38
+ /**
39
+ * Global default truncation limit in characters for fields with
40
+ * MaxLength > 5000 or nvarchar(MAX). Default: 1000.
41
+ * Individual field overrides in `fields` take precedence.
42
+ */
43
+ defaultTruncationLimit?: number;
44
+ /**
45
+ * Whether to include the entity icon in vector metadata.
46
+ * Default: true.
47
+ */
48
+ includeEntityIcon?: boolean;
49
+ /**
50
+ * Whether to include __mj_UpdatedAt in vector metadata for
51
+ * freshness display in search results. Default: true.
52
+ */
53
+ includeUpdatedAt?: boolean;
54
+ }
55
+ export interface EntityDocumentFieldConfig {
56
+ /**
57
+ * Whether this field is included in vector metadata.
58
+ * Used with "include" strategy to explicitly list fields,
59
+ * or with "exclude" strategy to mark specific fields for exclusion.
60
+ * Under "all" strategy, set to false to exclude a specific field.
61
+ */
62
+ included?: boolean;
63
+ /**
64
+ * Override the truncation limit for this specific field (in characters).
65
+ * Only applies to large text fields. NULL means use the global
66
+ * defaultTruncationLimit.
67
+ */
68
+ truncationLimit?: number;
69
+ /**
70
+ * Whether this field should be used as the primary display title
71
+ * in search result cards. At most one field should be marked.
72
+ * If none are marked, the system uses IsNameField from entity metadata.
73
+ */
74
+ isDisplayTitle?: boolean;
75
+ /**
76
+ * Whether this field should be used as the snippet/preview text
77
+ * in search result cards. At most one field should be marked.
78
+ */
79
+ isSnippetField?: boolean;
80
+ }
81
+ export interface EntityDocumentSchedulingConfig {
82
+ /**
83
+ * Whether automated sync is enabled for this entity document.
84
+ * Default: false (manual sync only).
85
+ */
86
+ enabled?: boolean;
87
+ /**
88
+ * Cron expression for scheduled sync (e.g. "0 2 * * *" for daily at 2 AM).
89
+ * Mutually exclusive with `intervalSeconds`.
90
+ */
91
+ cronExpression?: string;
92
+ /**
93
+ * Interval in seconds between sync runs. Only used if cronExpression
94
+ * is not set. Minimum: 300 (5 minutes).
95
+ */
96
+ intervalSeconds?: number;
97
+ /**
98
+ * Whether to run a full sync or only incremental (records changed
99
+ * since last sync). Default: "incremental".
100
+ */
101
+ syncMode?: 'full' | 'incremental';
102
+ /**
103
+ * For incremental mode, the timestamp column used to detect changes.
104
+ * Default: "__mj_UpdatedAt".
105
+ */
106
+ changeTrackingColumn?: string;
107
+ }
108
+ export interface EntityDocumentPipelineConfig {
109
+ /**
110
+ * Number of records to fetch from the database per page.
111
+ * Default: 100.
112
+ */
113
+ fetchBatchSize?: number;
114
+ /**
115
+ * Number of records to render templates and embed in parallel.
116
+ * Default: 50.
117
+ */
118
+ vectorizeBatchSize?: number;
119
+ /**
120
+ * Number of vectors to upsert to the vector DB in a single call.
121
+ * Default: 50. Capped by VectorDatabaseConfiguration.throughput.maxUpsertBatchSize.
122
+ */
123
+ upsertBatchSize?: number;
124
+ /**
125
+ * Maximum number of concurrent embedding API calls.
126
+ * Controls parallelism in the AsyncBatchTransform pipeline.
127
+ * Default: 3.
128
+ */
129
+ maxConcurrentEmbeddings?: number;
130
+ /**
131
+ * Delay in milliseconds between API calls to avoid rate limiting.
132
+ * Default: 0 (no delay).
133
+ */
134
+ delayBetweenCallsMs?: number;
135
+ /**
136
+ * Whether to force re-vectorization of records that have already
137
+ * been vectorized (by their deterministic SHA-1 ID). Default: false.
138
+ */
139
+ forceRevectorize?: boolean;
140
+ }
141
+ export interface EntityDocumentRecordFilterConfig {
142
+ /**
143
+ * Additional SQL filter predicate appended to the WHERE clause when
144
+ * fetching records to vectorize. Uses the same syntax as RunView's
145
+ * ExtraFilter (e.g. "Status = 'Active' AND IsDeleted = 0").
146
+ */
147
+ extraFilter?: string;
148
+ /**
149
+ * Maximum number of records to vectorize in a single run.
150
+ * 0 or undefined means no limit.
151
+ */
152
+ maxRecords?: number;
153
+ /**
154
+ * Starting offset — skip this many records before vectorizing.
155
+ * Useful for resuming after a partial failure.
156
+ */
157
+ startingOffset?: number;
158
+ }
159
+ export interface EntityDocumentChunkingConfig {
160
+ /**
161
+ * Whether to enable chunking for long-form text content.
162
+ * When enabled, records with text exceeding `maxChunkTokens` are
163
+ * split into multiple vectors with shared metadata.
164
+ * Default: false (entire rendered template = one vector).
165
+ */
166
+ enabled?: boolean;
167
+ /**
168
+ * Maximum tokens per chunk. The embedding model's context window
169
+ * is the hard ceiling. Default: 512.
170
+ */
171
+ maxChunkTokens?: number;
172
+ /**
173
+ * Number of tokens to overlap between consecutive chunks.
174
+ * Ensures context continuity at chunk boundaries. Default: 50.
175
+ */
176
+ overlapTokens?: number;
177
+ /**
178
+ * Chunking strategy:
179
+ * - "token": split on token boundaries (most precise)
180
+ * - "sentence": split on sentence boundaries (more readable)
181
+ * - "paragraph": split on paragraph/double-newline boundaries
182
+ */
183
+ strategy?: 'token' | 'sentence' | 'paragraph';
184
+ }
185
+ //# sourceMappingURL=entityDocumentConfig.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityDocumentConfig.types.d.ts","sourceRoot":"","sources":["../../src/generic/entityDocumentConfig.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,2BAA2B;IACxC,oFAAoF;IACpF,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IAExC,yDAAyD;IACzD,UAAU,CAAC,EAAE,8BAA8B,CAAC;IAE5C,gEAAgE;IAChE,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IAExC,4DAA4D;IAC5D,YAAY,CAAC,EAAE,gCAAgC,CAAC;IAEhD,iDAAiD;IACjD,QAAQ,CAAC,EAAE,4BAA4B,CAAC;CAC3C;AAMD,MAAM,WAAW,4BAA4B;IACzC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAE9C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAEnD;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAMD,MAAM,WAAW,8BAA8B;IAC3C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAElC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC;AAMD,MAAM,WAAW,4BAA4B;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAMD,MAAM,WAAW,gCAAgC;IAC7C;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,MAAM,WAAW,4BAA4B;IACzC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;CACjD"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Configuration interface for EntityDocument.Configuration JSON column.
3
+ *
4
+ * Controls how the vectorization pipeline processes records for a given
5
+ * entity document — which fields get into vector metadata, how they're
6
+ * truncated, how records are filtered, and pipeline tuning knobs.
7
+ *
8
+ * All fields are optional. NULL / missing means "use system defaults."
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=entityDocumentConfig.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityDocumentConfig.types.js","sourceRoot":"","sources":["../../src/generic/entityDocumentConfig.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -31,7 +31,34 @@ export type VectorizeEntityParams = {
31
31
  * The number of records to skip before starting to fetch records from the list.
32
32
  */
33
33
  StartingOffset?: number;
34
- options?: any;
34
+ options?: VectorizeEntityOptions;
35
+ /**
36
+ * Optional callback invoked during vectorization with progress updates.
37
+ * Called after each batch is upserted to the vector database.
38
+ */
39
+ OnProgress?: (update: VectorizeProgressUpdate) => void;
40
+ };
41
+ export type VectorizeEntityOptions = {
42
+ /** Delay in ms between API calls to avoid rate limiting */
43
+ delayTimeMS?: number;
44
+ /** Whether to force re-vectorization of already-vectorized records */
45
+ forceRevectorize?: boolean;
46
+ };
47
+ /**
48
+ * Progress update emitted during vectorization.
49
+ * Pass a callback via VectorizeEntityParams.OnProgress to receive updates.
50
+ */
51
+ export type VectorizeProgressUpdate = {
52
+ /** Total records to process (may increase as pages are fetched) */
53
+ TotalRecords: number;
54
+ /** Number of records processed so far */
55
+ ProcessedRecords: number;
56
+ /** Current pipeline stage */
57
+ Stage: 'embedding' | 'upserting' | 'complete' | 'error';
58
+ /** Percent complete (0-100) */
59
+ PercentComplete: number;
60
+ /** Elapsed time in ms since pipeline start */
61
+ ElapsedMs: number;
35
62
  };
36
63
  export type VectorizeEntityResponse = {
37
64
  success: boolean;
@@ -41,13 +68,14 @@ export type VectorizeEntityResponse = {
41
68
  export type EmbeddingData = {
42
69
  ID: number;
43
70
  Vector: number[];
44
- VectorID?: unknown;
45
- EntityData: Record<string, any>;
46
- __mj_recordID: unknown;
47
- __mj_compositeKey?: unknown;
71
+ VectorID?: string;
72
+ EntityData: Record<string, unknown>;
73
+ __mj_recordID: string | number;
74
+ __mj_compositeKey?: string;
75
+ /** Plain object representation of the entity document */
48
76
  EntityDocument?: Record<string, unknown>;
49
77
  TemplateContent?: string;
50
- VectorIndexID?: unknown;
78
+ VectorIndexID?: string;
51
79
  };
52
80
  export type VectorEmeddingData = {
53
81
  embedding: BaseEmbeddings;
@@ -57,6 +85,10 @@ export type VectorEmeddingData = {
57
85
  embeddingDriverClass: string;
58
86
  embeddingAPIKey: string;
59
87
  };
88
+ /**
89
+ * @deprecated Worker contexts are no longer used since worker_threads were replaced
90
+ * with main-thread async processing. Kept for backward compatibility.
91
+ */
60
92
  export type AnnotateWorkerContext = {
61
93
  executionId: number;
62
94
  entity: BaseEntity;
@@ -67,6 +99,10 @@ export type AnnotateWorkerContext = {
67
99
  embeddingAPIKey: string;
68
100
  delayTimeMS: number;
69
101
  };
102
+ /**
103
+ * @deprecated Worker contexts are no longer used since worker_threads were replaced
104
+ * with main-thread async processing. Kept for backward compatibility.
105
+ */
70
106
  export type ArchiveWorkerContext = {
71
107
  executionId: number;
72
108
  entity: BaseEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"vectorSync.types.d.ts","sourceRoot":"","sources":["../../src/generic/vectorSync.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE1H,MAAM,MAAM,qBAAqB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;MAIE;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,CAAC;CACjB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACxB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAA;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,eAAe,EAAE,uBAAuB,CAAC;IACzC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,sBAAsB,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,uBAAuB,CAAC;IACzC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,CAAC"}
1
+ {"version":3,"file":"vectorSync.types.d.ts","sourceRoot":"","sources":["../../src/generic/vectorSync.types.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './generic/vectorSync.types.js';
2
2
  export * from './generic/entitySyncConfig.types.js';
3
+ export * from './generic/entityDocumentConfig.types.js';
3
4
  export * from './models/entityVectorSync.js';
5
+ export * from './models/EntityDocumentSuggester.js';
4
6
  export * from './generic/EntityDocumentTemplateParser.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './generic/vectorSync.types.js';
2
2
  export * from './generic/entitySyncConfig.types.js';
3
+ export * from './generic/entityDocumentConfig.types.js';
3
4
  export * from './models/entityVectorSync.js';
5
+ export * from './models/EntityDocumentSuggester.js';
4
6
  export * from './generic/EntityDocumentTemplateParser.js';
5
7
  //# 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,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { Transform } from 'node:stream';
2
+ export type TransformCallback = Parameters<Transform['_flush']>[0];
3
+ /**
4
+ * Options for the AsyncBatchTransform
5
+ */
6
+ export type AsyncBatchTransformOptions<TRecord, TContext, TResult> = {
7
+ /** Number of records to accumulate before processing a batch. Default: 10 */
8
+ batchSize?: number;
9
+ /** Max concurrent batch processing tasks. Default: 4 */
10
+ concurrencyLimit?: number;
11
+ /** Arbitrary context passed to the processing function */
12
+ context?: TContext;
13
+ /** The async function that processes a batch of records and returns results */
14
+ processBatch: (batch: TRecord[], context: TContext) => Promise<TResult[]>;
15
+ };
16
+ /**
17
+ * A Transform stream that batches records and processes them asynchronously
18
+ * in the main thread using a concurrency-limited queue.
19
+ *
20
+ * This replaces the worker_threads-based BatchWorker to solve the ClassFactory
21
+ * registration issue: worker threads run in separate V8 isolates and don't
22
+ * share the main thread's class registrations, causing CreateInstance() to
23
+ * return null. Since the bottleneck is I/O (embedding API calls, vector DB
24
+ * upserts), not CPU, worker threads provide no benefit here.
25
+ */
26
+ export declare class AsyncBatchTransform<TRecord = Record<string, unknown>, TContext = Record<string, unknown>, TResult = TRecord> extends Transform {
27
+ private readonly _batchSize;
28
+ private readonly _concurrencyLimit;
29
+ private readonly _context;
30
+ private readonly _processBatch;
31
+ private _buffer;
32
+ private _queue;
33
+ private _running;
34
+ private _drainResolve;
35
+ constructor(options: AsyncBatchTransformOptions<TRecord, TContext, TResult>);
36
+ private _next;
37
+ private _enqueue;
38
+ /** Returns a Promise that resolves when all queued tasks have completed */
39
+ private _waitForDrain;
40
+ _transform(chunk: TRecord, _encoding: BufferEncoding, callback: TransformCallback): void;
41
+ _flush(callback: TransformCallback): void;
42
+ private _processBatchAsync;
43
+ }
44
+ //# sourceMappingURL=AsyncBatchTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncBatchTransform.d.ts","sourceRoot":"","sources":["../../src/models/AsyncBatchTransform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,0BAA0B,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI;IACnE,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,+EAA+E;IAC/E,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC3E,CAAC;AAEF;;;;;;;;;GASG;AACH,qBAAa,mBAAmB,CAC9B,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,GAAG,OAAO,CACjB,SAAQ,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8D;IAE5F,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,aAAa,CAA6B;gBAEtC,OAAO,EAAE,0BAA0B,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;IAQ3E,OAAO,CAAC,KAAK;IAiBb,OAAO,CAAC,QAAQ;IAKhB,2EAA2E;IAC3E,OAAO,CAAC,aAAa;IASZ,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IASxF,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;YASpC,kBAAkB;CAUjC"}
@@ -0,0 +1,80 @@
1
+ import { Transform } from 'node:stream';
2
+ /**
3
+ * A Transform stream that batches records and processes them asynchronously
4
+ * in the main thread using a concurrency-limited queue.
5
+ *
6
+ * This replaces the worker_threads-based BatchWorker to solve the ClassFactory
7
+ * registration issue: worker threads run in separate V8 isolates and don't
8
+ * share the main thread's class registrations, causing CreateInstance() to
9
+ * return null. Since the bottleneck is I/O (embedding API calls, vector DB
10
+ * upserts), not CPU, worker threads provide no benefit here.
11
+ */
12
+ export class AsyncBatchTransform extends Transform {
13
+ constructor(options) {
14
+ super({ objectMode: true });
15
+ this._buffer = [];
16
+ this._queue = [];
17
+ this._running = 0;
18
+ this._drainResolve = null;
19
+ this._batchSize = options.batchSize ?? 10;
20
+ this._concurrencyLimit = options.concurrencyLimit ?? 4;
21
+ this._context = options.context;
22
+ this._processBatch = options.processBatch;
23
+ }
24
+ _next() {
25
+ while (this._queue.length > 0 && this._running < this._concurrencyLimit) {
26
+ const task = this._queue.shift();
27
+ if (task) {
28
+ this._running++;
29
+ task().finally(() => {
30
+ this._running--;
31
+ this._next();
32
+ if (this._running === 0 && this._queue.length === 0 && this._drainResolve) {
33
+ this._drainResolve();
34
+ this._drainResolve = null;
35
+ }
36
+ });
37
+ }
38
+ }
39
+ }
40
+ _enqueue(task) {
41
+ this._queue.push(task);
42
+ this._next();
43
+ }
44
+ /** Returns a Promise that resolves when all queued tasks have completed */
45
+ _waitForDrain() {
46
+ if (this._running === 0 && this._queue.length === 0) {
47
+ return Promise.resolve();
48
+ }
49
+ return new Promise((resolve) => {
50
+ this._drainResolve = resolve;
51
+ });
52
+ }
53
+ _transform(chunk, _encoding, callback) {
54
+ this._buffer.push(chunk);
55
+ if (this._buffer.length >= this._batchSize) {
56
+ const batch = this._buffer.splice(0, this._batchSize);
57
+ this._enqueue(() => this._processBatchAsync(batch));
58
+ }
59
+ callback();
60
+ }
61
+ _flush(callback) {
62
+ if (this._buffer.length > 0) {
63
+ const remaining = this._buffer.splice(0);
64
+ this._enqueue(() => this._processBatchAsync(remaining));
65
+ }
66
+ this._waitForDrain().then(() => callback()).catch(callback);
67
+ }
68
+ async _processBatchAsync(batch) {
69
+ try {
70
+ const results = await this._processBatch(batch, this._context);
71
+ for (const result of results) {
72
+ this.push(result);
73
+ }
74
+ }
75
+ catch (error) {
76
+ this.emit('error', error);
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=AsyncBatchTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncBatchTransform.js","sourceRoot":"","sources":["../../src/models/AsyncBatchTransform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @fileoverview AI-powered Entity Document template suggestion engine.
3
+ *
4
+ * Uses the "Entity Document Suggestion" AI prompt to analyze entity schemas
5
+ * and suggest optimal Nunjucks templates for duplicate detection, search,
6
+ * or classification use cases.
7
+ *
8
+ * @module @memberjunction/ai-vector-sync
9
+ */
10
+ import { UserInfo } from '@memberjunction/core';
11
+ /** Supported use cases for document suggestion */
12
+ export type DocumentSuggestionUseCase = 'duplicate detection' | 'search' | 'classification';
13
+ /** A relationship descriptor passed to the AI prompt */
14
+ export interface RelationshipDescriptor {
15
+ Name: string;
16
+ RelatedEntity: string;
17
+ Fields: string[];
18
+ ForeignKeyField: string;
19
+ }
20
+ /** A field descriptor passed to the AI prompt */
21
+ export interface FieldDescriptor {
22
+ Name: string;
23
+ Type: string;
24
+ IsPrimaryKey: boolean;
25
+ IsUnique: boolean;
26
+ MaxLength: number | null;
27
+ AllowsNull: boolean;
28
+ Description: string;
29
+ }
30
+ /** The structured JSON response from the AI prompt */
31
+ export interface DocumentSuggestionResult {
32
+ template: string;
33
+ selectedFields: string[];
34
+ selectedRelationships: {
35
+ name: string;
36
+ fields: string[];
37
+ }[];
38
+ potentialMatchThreshold: number;
39
+ absoluteMatchThreshold: number;
40
+ reasoning: string;
41
+ }
42
+ /** Full response from the suggestion engine */
43
+ export interface SuggestDocumentResponse {
44
+ Success: boolean;
45
+ ErrorMessage: string;
46
+ Suggestion: DocumentSuggestionResult | null;
47
+ }
48
+ /**
49
+ * Suggests Entity Document templates by analyzing entity schemas with AI.
50
+ *
51
+ * Uses the `AIPromptRunner` directly (not via Actions) per CLAUDE.md design philosophy.
52
+ */
53
+ export declare class EntityDocumentSuggester {
54
+ /**
55
+ * Analyze an entity's schema and suggest an Entity Document template.
56
+ *
57
+ * @param entityName - The name of the entity to analyze
58
+ * @param useCase - The intended use case (defaults to 'duplicate detection')
59
+ * @param contextUser - The authenticated user context
60
+ * @returns A suggestion with template, selected fields, and threshold recommendations
61
+ */
62
+ SuggestDocument(entityName: string, useCase: DocumentSuggestionUseCase, contextUser: UserInfo): Promise<SuggestDocumentResponse>;
63
+ /** Resolve entity metadata by name */
64
+ private resolveEntity;
65
+ /** Build field descriptors from entity metadata */
66
+ private buildFieldDescriptors;
67
+ /** Build relationship descriptors from entity metadata */
68
+ private buildRelationshipDescriptors;
69
+ /** Find the suggestion prompt from AIEngine */
70
+ private findSuggestionPrompt;
71
+ /** Execute the AI prompt and parse the response */
72
+ private executeSuggestionPrompt;
73
+ }
74
+ //# sourceMappingURL=EntityDocumentSuggester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityDocumentSuggester.d.ts","sourceRoot":"","sources":["../../src/models/EntityDocumentSuggester.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA6C,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQ3F,kDAAkD;AAClD,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAE5F,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,sDAAsD;AACtD,MAAM,WAAW,wBAAwB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC5D,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAC;CAC/C;AAED;;;;GAIG;AACH,qBAAa,uBAAuB;IAEhC;;;;;;;OAOG;IACU,eAAe,CACxB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,yBAAyB,EAClC,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,uBAAuB,CAAC;IAiBnC,sCAAsC;IACtC,OAAO,CAAC,aAAa;IASrB,mDAAmD;IACnD,OAAO,CAAC,qBAAqB;IAY7B,0DAA0D;IAC1D,OAAO,CAAC,4BAA4B;IAqBpC,+CAA+C;IAC/C,OAAO,CAAC,oBAAoB;IAa5B,mDAAmD;YACrC,uBAAuB;CAmDxC"}