@memberjunction/content-autotagging 5.23.0 → 5.25.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/dist/CloudStorage/generic/CloudStorageBase.d.ts +1 -1
- package/dist/CloudStorage/generic/CloudStorageBase.d.ts.map +1 -1
- package/dist/CloudStorage/generic/CloudStorageBase.js +2 -1
- package/dist/CloudStorage/generic/CloudStorageBase.js.map +1 -1
- package/dist/CloudStorage/index.d.ts +5 -0
- package/dist/CloudStorage/index.d.ts.map +1 -1
- package/dist/CloudStorage/index.js +5 -0
- package/dist/CloudStorage/index.js.map +1 -1
- package/dist/CloudStorage/providers/AutotagCloudStorage.d.ts +61 -0
- package/dist/CloudStorage/providers/AutotagCloudStorage.d.ts.map +1 -0
- package/dist/CloudStorage/providers/AutotagCloudStorage.js +257 -0
- package/dist/CloudStorage/providers/AutotagCloudStorage.js.map +1 -0
- package/dist/Core/generic/AutotagBase.d.ts +10 -1
- package/dist/Core/generic/AutotagBase.d.ts.map +1 -1
- package/dist/Core/generic/AutotagBase.js.map +1 -1
- package/dist/Engine/generic/AutotagBaseEngine.d.ts +324 -18
- package/dist/Engine/generic/AutotagBaseEngine.d.ts.map +1 -1
- package/dist/Engine/generic/AutotagBaseEngine.js +1036 -178
- package/dist/Engine/generic/AutotagBaseEngine.js.map +1 -1
- package/dist/Engine/generic/RateLimiter.d.ts +49 -0
- package/dist/Engine/generic/RateLimiter.d.ts.map +1 -0
- package/dist/Engine/generic/RateLimiter.js +98 -0
- package/dist/Engine/generic/RateLimiter.js.map +1 -0
- package/dist/Engine/index.d.ts +1 -0
- package/dist/Engine/index.d.ts.map +1 -1
- package/dist/Engine/index.js +1 -0
- package/dist/Engine/index.js.map +1 -1
- package/dist/Entity/generic/AutotagEntity.d.ts +68 -14
- package/dist/Entity/generic/AutotagEntity.d.ts.map +1 -1
- package/dist/Entity/generic/AutotagEntity.js +396 -83
- package/dist/Entity/generic/AutotagEntity.js.map +1 -1
- package/dist/LocalFileSystem/generic/AutotagLocalFileSystem.d.ts +1 -1
- package/dist/LocalFileSystem/generic/AutotagLocalFileSystem.d.ts.map +1 -1
- package/dist/LocalFileSystem/generic/AutotagLocalFileSystem.js +2 -1
- package/dist/LocalFileSystem/generic/AutotagLocalFileSystem.js.map +1 -1
- package/dist/RSSFeed/generic/AutotagRSSFeed.d.ts +47 -16
- package/dist/RSSFeed/generic/AutotagRSSFeed.d.ts.map +1 -1
- package/dist/RSSFeed/generic/AutotagRSSFeed.js +239 -120
- package/dist/RSSFeed/generic/AutotagRSSFeed.js.map +1 -1
- package/dist/Websites/generic/AutotagWebsite.d.ts +1 -1
- package/dist/Websites/generic/AutotagWebsite.d.ts.map +1 -1
- package/dist/Websites/generic/AutotagWebsite.js +2 -1
- package/dist/Websites/generic/AutotagWebsite.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +16 -11
|
@@ -4,127 +4,440 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import { RegisterClass } from "@memberjunction/global";
|
|
7
|
+
import { RegisterClass, UUIDsEqual, NormalizeUUID } from "@memberjunction/global";
|
|
11
8
|
import { AutotagBase } from "../../Core/index.js";
|
|
12
9
|
import { AutotagBaseEngine } from "../../Engine/index.js";
|
|
13
|
-
import { Metadata, RunView, LogStatus } from "@memberjunction/core";
|
|
10
|
+
import { Metadata, RunView, LogStatus, LogError } from "@memberjunction/core";
|
|
11
|
+
import { EntityDocumentTemplateParser } from "@memberjunction/ai-vector-sync";
|
|
12
|
+
import { TemplateEngineServer } from "@memberjunction/templates";
|
|
13
|
+
import { TagEngine } from "@memberjunction/tag-engine";
|
|
14
|
+
/**
|
|
15
|
+
* Autotag provider for MJ entity records. Uses the EntityDocument template pipeline
|
|
16
|
+
* to render records into text, creates EntityRecordDocument snapshots, links them
|
|
17
|
+
* to ContentItems, and feeds the text through the LLM autotagging pipeline.
|
|
18
|
+
*
|
|
19
|
+
* Configuration is driven by ContentSource.EntityID and ContentSource.EntityDocumentID
|
|
20
|
+
* rather than the legacy ContentSourceParam key/value approach.
|
|
21
|
+
*/
|
|
14
22
|
let AutotagEntity = class AutotagEntity extends AutotagBase {
|
|
15
23
|
constructor() {
|
|
16
|
-
super();
|
|
17
|
-
|
|
24
|
+
super(...arguments);
|
|
25
|
+
/** Cached content source configs keyed by normalized source ID for bridge callback */
|
|
26
|
+
this.sourceConfigMap = new Map();
|
|
27
|
+
/** Cached content source entities keyed by normalized source ID for ERD lookups */
|
|
28
|
+
this.contentSourceMap = new Map();
|
|
18
29
|
}
|
|
19
|
-
async Autotag(contextUser, onProgress) {
|
|
30
|
+
async Autotag(contextUser, onProgress, contentSourceIDs) {
|
|
20
31
|
this.contextUser = contextUser;
|
|
32
|
+
this.engine = AutotagBaseEngine.Instance;
|
|
21
33
|
this.contentSourceTypeID = this.engine.SetSubclassContentSourceType('Entity');
|
|
22
|
-
|
|
34
|
+
let contentSources = await this.engine.getAllContentSources(contextUser, this.contentSourceTypeID);
|
|
35
|
+
// Apply source ID filter if specified
|
|
36
|
+
if (contentSourceIDs && contentSourceIDs.length > 0) {
|
|
37
|
+
contentSources = contentSources.filter(s => contentSourceIDs.some(id => UUIDsEqual(id, s.ID)));
|
|
38
|
+
}
|
|
39
|
+
// Cache content source configs and set up taxonomy
|
|
40
|
+
await this.SetupTaxonomyAndBridge(contentSources, contextUser);
|
|
23
41
|
const contentItemsToProcess = await this.SetContentItemsToProcess(contentSources);
|
|
24
|
-
|
|
42
|
+
// Also pick up previously failed items — ContentItems that exist but have
|
|
43
|
+
// no tags (LLM call failed due to rate limits, network errors, etc.)
|
|
44
|
+
const retryItems = await this.GetUntaggedContentItems(contentSources);
|
|
45
|
+
if (retryItems.length > 0) {
|
|
46
|
+
LogStatus(`AutotagEntity: found ${retryItems.length} previously failed items to retry`);
|
|
47
|
+
}
|
|
48
|
+
// Merge new + retry items, deduplicating by ID
|
|
49
|
+
const seen = new Set(contentItemsToProcess.map(ci => ci.ID));
|
|
50
|
+
for (const item of retryItems) {
|
|
51
|
+
if (!seen.has(item.ID)) {
|
|
52
|
+
contentItemsToProcess.push(item);
|
|
53
|
+
seen.add(item.ID);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (contentItemsToProcess.length > 0) {
|
|
57
|
+
await this.engine.ExtractTextAndProcessWithLLM(contentItemsToProcess, contextUser, undefined, undefined, onProgress);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
LogStatus('AutotagEntity: no new, modified, or failed entity records to process');
|
|
61
|
+
}
|
|
62
|
+
// Clean up engine state
|
|
63
|
+
this.engine.TaxonomyContext = null;
|
|
64
|
+
this.engine.OnContentItemTagSaved = null;
|
|
65
|
+
return contentItemsToProcess.length;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Initialize the TagEngine, inject taxonomy into the prompt, and set up the
|
|
69
|
+
* bridge callback that links ContentItemTags to formal Tag + TaggedItem records.
|
|
70
|
+
*/
|
|
71
|
+
async SetupTaxonomyAndBridge(contentSources, contextUser) {
|
|
72
|
+
// Cache source configs for bridge callback — use CodeGen-generated typed accessor
|
|
73
|
+
for (const source of contentSources) {
|
|
74
|
+
const normalizedID = NormalizeUUID(source.ID);
|
|
75
|
+
this.contentSourceMap.set(normalizedID, source);
|
|
76
|
+
const config = source.ConfigurationObject;
|
|
77
|
+
if (config) {
|
|
78
|
+
this.sourceConfigMap.set(normalizedID, config);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Initialize TagEngine (loads tags + generates embeddings)
|
|
82
|
+
try {
|
|
83
|
+
await TagEngine.Instance.Config(false, contextUser);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
87
|
+
LogError(`AutotagEntity: TagEngine initialization failed, taxonomy features disabled: ${msg}`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Inject taxonomy context into the prompt (if any source has ShareTaxonomyWithLLM enabled)
|
|
91
|
+
const shouldShareTaxonomy = Array.from(this.sourceConfigMap.values()).some(c => c.ShareTaxonomyWithLLM !== false // default true
|
|
92
|
+
);
|
|
93
|
+
if (shouldShareTaxonomy && TagEngine.Instance.Tags.length > 0) {
|
|
94
|
+
// Determine the narrowest taxonomy root across all sources
|
|
95
|
+
const rootIDs = Array.from(this.sourceConfigMap.values())
|
|
96
|
+
.map(c => c.TagRootID)
|
|
97
|
+
.filter((id) => id != null);
|
|
98
|
+
const taxonomyRoot = rootIDs.length === 1 ? rootIDs[0] : undefined;
|
|
99
|
+
const tree = TagEngine.Instance.GetTaxonomyTree(taxonomyRoot);
|
|
100
|
+
this.engine.TaxonomyContext = JSON.stringify(tree, null, 2);
|
|
101
|
+
}
|
|
102
|
+
// Set up the bridge callback for tag taxonomy linking
|
|
103
|
+
this.engine.OnContentItemTagSaved = async (contentItemTag, parentTagName, ctxUser) => {
|
|
104
|
+
await this.BridgeContentItemTagToTaxonomy(contentItemTag, parentTagName, ctxUser);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Bridge a ContentItemTag to the formal MJ Tag taxonomy.
|
|
109
|
+
* Uses TagEngine.ResolveTag() for semantic matching with mode/threshold from source config.
|
|
110
|
+
* Creates a TaggedItem linking the resolved Tag to the source entity record.
|
|
111
|
+
*/
|
|
112
|
+
async BridgeContentItemTagToTaxonomy(contentItemTag, parentTagName, contextUser) {
|
|
113
|
+
// Find the source config for this content item
|
|
114
|
+
const rv = new RunView();
|
|
115
|
+
const ciResult = await rv.RunView({
|
|
116
|
+
EntityName: 'MJ: Content Items',
|
|
117
|
+
ExtraFilter: `ID='${contentItemTag.ItemID}'`,
|
|
118
|
+
Fields: ['ID', 'ContentSourceID', 'EntityRecordDocumentID'],
|
|
119
|
+
ResultType: 'simple',
|
|
120
|
+
MaxRows: 1
|
|
121
|
+
}, contextUser);
|
|
122
|
+
if (!ciResult.Success || ciResult.Results.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
const ci = ciResult.Results[0];
|
|
125
|
+
const erdID = ci.EntityRecordDocumentID;
|
|
126
|
+
if (!erdID)
|
|
127
|
+
return; // not entity-sourced
|
|
128
|
+
const sourceID = ci.ContentSourceID;
|
|
129
|
+
const config = this.sourceConfigMap.get(NormalizeUUID(sourceID));
|
|
130
|
+
const mode = config?.TagTaxonomyMode ?? 'auto-grow';
|
|
131
|
+
const rootID = config?.TagRootID ?? null;
|
|
132
|
+
const threshold = config?.TagMatchThreshold ?? 0.9;
|
|
133
|
+
// If parent tag is suggested by LLM, resolve it through the mutex too
|
|
134
|
+
// to prevent duplicate parent tags from concurrent batch processing.
|
|
135
|
+
// ResolveTag handles find-or-create atomically.
|
|
136
|
+
if (parentTagName && mode !== 'constrained') {
|
|
137
|
+
await TagEngine.Instance.ResolveTag(parentTagName, 0, mode, rootID, threshold, contextUser);
|
|
138
|
+
}
|
|
139
|
+
// Resolve the tag to a formal Tag record
|
|
140
|
+
const formalTag = await TagEngine.Instance.ResolveTag(contentItemTag.Tag, contentItemTag.Weight, mode, rootID, threshold, contextUser);
|
|
141
|
+
if (!formalTag)
|
|
142
|
+
return; // constrained mode, no match
|
|
143
|
+
// Link ContentItemTag to formal Tag
|
|
144
|
+
contentItemTag.TagID = formalTag.ID;
|
|
145
|
+
await contentItemTag.Save();
|
|
146
|
+
// Load ERD to get source entity info
|
|
147
|
+
const erdResult = await rv.RunView({
|
|
148
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
149
|
+
ExtraFilter: `ID='${erdID}'`,
|
|
150
|
+
Fields: ['ID', 'EntityID', 'RecordID'],
|
|
151
|
+
ResultType: 'simple',
|
|
152
|
+
MaxRows: 1
|
|
153
|
+
}, contextUser);
|
|
154
|
+
if (!erdResult.Success || erdResult.Results.length === 0)
|
|
155
|
+
return;
|
|
156
|
+
const erd = erdResult.Results[0];
|
|
157
|
+
// Create TaggedItem linking formal Tag to source entity record
|
|
158
|
+
await TagEngine.Instance.CreateTaggedItem(formalTag.ID, erd.EntityID, erd.RecordID, contentItemTag.Weight, contextUser);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Find ContentItems that exist for these sources but have no ContentItemTag records.
|
|
162
|
+
* These are items where the LLM tagging failed on a previous run (rate limits, network errors, etc.).
|
|
163
|
+
*/
|
|
164
|
+
async GetUntaggedContentItems(contentSources) {
|
|
165
|
+
if (contentSources.length === 0)
|
|
166
|
+
return [];
|
|
167
|
+
const sourceIDs = contentSources.map(s => `'${s.ID}'`).join(',');
|
|
168
|
+
const rv = new RunView();
|
|
169
|
+
const result = await rv.RunView({
|
|
170
|
+
EntityName: 'MJ: Content Items',
|
|
171
|
+
ExtraFilter: `ContentSourceID IN (${sourceIDs}) AND NOT EXISTS (SELECT 1 FROM [__mj].vwContentItemTags cit WHERE cit.ItemID = [__mj].vwContentItems.ID)`,
|
|
172
|
+
ResultType: 'entity_object'
|
|
173
|
+
}, this.contextUser);
|
|
174
|
+
if (result.Success) {
|
|
175
|
+
return result.Results;
|
|
176
|
+
}
|
|
177
|
+
return [];
|
|
25
178
|
}
|
|
26
179
|
async SetContentItemsToProcess(contentSources) {
|
|
27
180
|
const contentItemsToProcess = [];
|
|
28
181
|
for (const contentSource of contentSources) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
const contentSourceParams = {
|
|
34
|
-
contentSourceID: contentSource.ID,
|
|
35
|
-
name: contentSource.Name,
|
|
36
|
-
ContentTypeID: contentSource.ContentTypeID,
|
|
37
|
-
ContentFileTypeID: contentSource.ContentFileTypeID,
|
|
38
|
-
ContentSourceTypeID: contentSource.ContentSourceTypeID,
|
|
39
|
-
URL: contentSource.URL
|
|
40
|
-
};
|
|
41
|
-
const contentItems = await this.getNewOrModifiedContentItems(contentSourceParams, this.contextUser);
|
|
42
|
-
if (contentItems && contentItems.length > 0) {
|
|
43
|
-
contentItemsToProcess.push(...contentItems);
|
|
182
|
+
try {
|
|
183
|
+
const items = await this.ProcessContentSource(contentSource);
|
|
184
|
+
contentItemsToProcess.push(...items);
|
|
44
185
|
}
|
|
45
|
-
|
|
46
|
-
|
|
186
|
+
catch (e) {
|
|
187
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
188
|
+
LogError(`AutotagEntity: failed to process content source "${contentSource.Name}": ${msg}`);
|
|
47
189
|
}
|
|
48
190
|
}
|
|
49
191
|
return contentItemsToProcess;
|
|
50
192
|
}
|
|
51
193
|
/**
|
|
52
|
-
*
|
|
194
|
+
* Process a single entity-type ContentSource: load entity records modified since last run,
|
|
195
|
+
* render via EntityDocument template, create/update ERD and ContentItem records.
|
|
53
196
|
*/
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
197
|
+
async ProcessContentSource(contentSource) {
|
|
198
|
+
const entityID = contentSource.EntityID;
|
|
199
|
+
const entityDocumentID = contentSource.EntityDocumentID;
|
|
200
|
+
if (!entityID || !entityDocumentID) {
|
|
201
|
+
LogError(`AutotagEntity: content source "${contentSource.Name}" is missing EntityID or EntityDocumentID`);
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
// Load the EntityDocument
|
|
205
|
+
const entityDocument = await this.LoadEntityDocument(entityDocumentID);
|
|
206
|
+
if (!entityDocument) {
|
|
207
|
+
LogError(`AutotagEntity: EntityDocument ${entityDocumentID} not found for source "${contentSource.Name}"`);
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
const templateText = await this.GetTemplateText(entityDocument);
|
|
211
|
+
if (!templateText) {
|
|
212
|
+
LogError(`AutotagEntity: no template content found for EntityDocument "${entityDocument.Name}"`);
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
// Resolve the entity name from metadata
|
|
216
|
+
const md = new Metadata();
|
|
217
|
+
const entityInfo = md.Entities.find(e => UUIDsEqual(e.ID, entityID));
|
|
218
|
+
if (!entityInfo) {
|
|
219
|
+
LogError(`AutotagEntity: entity with ID ${entityID} not found in metadata`);
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
// Get records modified since last run
|
|
223
|
+
const lastRunDate = await this.engine.getContentSourceLastRunDate(contentSource.ID, this.contextUser);
|
|
224
|
+
const modifiedRecords = await this.GetModifiedRecords(entityInfo.Name, lastRunDate);
|
|
225
|
+
if (modifiedRecords.length === 0) {
|
|
226
|
+
LogStatus(`AutotagEntity: no modified records for entity "${entityInfo.Name}" since ${lastRunDate.toISOString()}`);
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
LogStatus(`AutotagEntity: processing ${modifiedRecords.length} modified records for entity "${entityInfo.Name}"`);
|
|
230
|
+
// Load existing ERD records for this entity document to enable upsert
|
|
231
|
+
const existingERDs = await this.LoadExistingERDs(entityDocumentID, entityID);
|
|
232
|
+
// Load existing ContentItems for this source to enable upsert
|
|
233
|
+
const existingContentItems = await this.LoadExistingContentItems(contentSource.ID);
|
|
234
|
+
// Process each record: render template → create/update ERD → create/update ContentItem
|
|
235
|
+
const contentItems = [];
|
|
236
|
+
const parser = EntityDocumentTemplateParser.CreateInstance();
|
|
237
|
+
const pkFieldName = entityInfo.FirstPrimaryKey.Name;
|
|
238
|
+
for (const record of modifiedRecords) {
|
|
239
|
+
const recordID = String(record[pkFieldName] ?? '');
|
|
240
|
+
try {
|
|
241
|
+
const contentItem = await this.ProcessSingleRecord(record, recordID, contentSource, entityDocument, templateText, parser, existingERDs, existingContentItems);
|
|
242
|
+
if (contentItem) {
|
|
243
|
+
contentItems.push(contentItem);
|
|
63
244
|
}
|
|
64
245
|
}
|
|
65
|
-
|
|
246
|
+
catch (e) {
|
|
247
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
248
|
+
LogError(`AutotagEntity: failed to process record ${recordID} for entity "${entityInfo.Name}": ${msg}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return contentItems;
|
|
66
252
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Load an EntityDocument by ID using RunView.
|
|
255
|
+
*/
|
|
256
|
+
async LoadEntityDocument(entityDocumentID) {
|
|
70
257
|
const rv = new RunView();
|
|
71
|
-
const
|
|
72
|
-
EntityName:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}, contextUser);
|
|
77
|
-
if (
|
|
78
|
-
return
|
|
258
|
+
const result = await rv.RunView({
|
|
259
|
+
EntityName: 'MJ: Entity Documents',
|
|
260
|
+
ExtraFilter: `ID='${entityDocumentID}'`,
|
|
261
|
+
ResultType: 'entity_object',
|
|
262
|
+
MaxRows: 1
|
|
263
|
+
}, this.contextUser);
|
|
264
|
+
if (result.Success && result.Results.length > 0) {
|
|
265
|
+
return result.Results[0];
|
|
266
|
+
}
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Retrieves the template text from the EntityDocument's linked Template.
|
|
271
|
+
* Ensures TemplateEngineServer is configured before accessing Templates.
|
|
272
|
+
*/
|
|
273
|
+
async GetTemplateText(entityDocument) {
|
|
274
|
+
if (!entityDocument.TemplateID)
|
|
275
|
+
return null;
|
|
276
|
+
// Ensure engine is loaded (no-op if already configured)
|
|
277
|
+
await TemplateEngineServer.Instance.Config(false, this.contextUser);
|
|
278
|
+
const template = TemplateEngineServer.Instance.Templates.find((t) => UUIDsEqual(t.ID, entityDocument.TemplateID));
|
|
279
|
+
if (!template || template.Content.length === 0) {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
return template.Content[0].TemplateText;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Query entity records modified since lastRunDate using __mj_UpdatedAt.
|
|
286
|
+
*/
|
|
287
|
+
async GetModifiedRecords(entityName, lastRunDate) {
|
|
288
|
+
const rv = new RunView();
|
|
289
|
+
const result = await rv.RunView({
|
|
290
|
+
EntityName: entityName,
|
|
291
|
+
ExtraFilter: `__mj_UpdatedAt > '${lastRunDate.toISOString()}'`,
|
|
292
|
+
ResultType: 'simple'
|
|
293
|
+
}, this.contextUser);
|
|
294
|
+
if (result.Success) {
|
|
295
|
+
return result.Results;
|
|
79
296
|
}
|
|
80
297
|
return [];
|
|
81
298
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
299
|
+
/**
|
|
300
|
+
* Load existing EntityRecordDocument records for this entity document,
|
|
301
|
+
* keyed by normalized RecordID for fast lookup.
|
|
302
|
+
*/
|
|
303
|
+
async LoadExistingERDs(entityDocumentID, entityID) {
|
|
304
|
+
const rv = new RunView();
|
|
305
|
+
const result = await rv.RunView({
|
|
306
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
307
|
+
ExtraFilter: `EntityDocumentID='${entityDocumentID}' AND EntityID='${entityID}'`,
|
|
308
|
+
ResultType: 'entity_object'
|
|
309
|
+
}, this.contextUser);
|
|
310
|
+
const map = new Map();
|
|
311
|
+
if (result.Success) {
|
|
312
|
+
for (const erd of result.Results) {
|
|
313
|
+
map.set(erd.RecordID, erd);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return map;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Load existing ContentItems for this content source, keyed by normalized
|
|
320
|
+
* EntityRecordDocumentID for fast lookup during upsert.
|
|
321
|
+
*/
|
|
322
|
+
async LoadExistingContentItems(contentSourceID) {
|
|
323
|
+
const rv = new RunView();
|
|
324
|
+
const result = await rv.RunView({
|
|
325
|
+
EntityName: 'MJ: Content Items',
|
|
326
|
+
ExtraFilter: `ContentSourceID='${contentSourceID}'`,
|
|
327
|
+
ResultType: 'entity_object'
|
|
328
|
+
}, this.contextUser);
|
|
329
|
+
const map = new Map();
|
|
330
|
+
if (result.Success) {
|
|
331
|
+
for (const ci of result.Results) {
|
|
332
|
+
if (ci.EntityRecordDocumentID) {
|
|
333
|
+
map.set(NormalizeUUID(ci.EntityRecordDocumentID), ci);
|
|
90
334
|
}
|
|
91
335
|
}
|
|
92
336
|
}
|
|
93
|
-
return
|
|
337
|
+
return map;
|
|
94
338
|
}
|
|
95
|
-
|
|
339
|
+
/**
|
|
340
|
+
* Process a single entity record: render template, create/update ERD, create/update ContentItem.
|
|
341
|
+
*/
|
|
342
|
+
async ProcessSingleRecord(record, recordID, contentSource, entityDocument, templateText, parser, existingERDs, existingContentItems) {
|
|
343
|
+
const entityID = contentSource.EntityID;
|
|
344
|
+
// 1. Render the template for this record
|
|
345
|
+
const renderedText = await parser.Parse(templateText, entityID, record, this.contextUser);
|
|
346
|
+
if (!renderedText || renderedText.trim().length === 0) {
|
|
347
|
+
LogStatus(`AutotagEntity: empty rendered text for record ${recordID}, skipping`);
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
// 2. Create or update EntityRecordDocument
|
|
351
|
+
const erd = await this.UpsertEntityRecordDocument(entityID, recordID, entityDocument, renderedText, existingERDs);
|
|
352
|
+
// 3. Compute checksum to detect content changes
|
|
353
|
+
const checksum = await this.engine.getChecksumFromText(renderedText);
|
|
354
|
+
// 4. Create or update ContentItem linked to ERD
|
|
355
|
+
const contentItem = await this.UpsertContentItem(contentSource, erd, renderedText, checksum, record, existingContentItems);
|
|
356
|
+
return contentItem;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Create or update an EntityRecordDocument snapshot.
|
|
360
|
+
*/
|
|
361
|
+
async UpsertEntityRecordDocument(entityID, recordID, entityDocument, documentText, existingERDs) {
|
|
96
362
|
const md = new Metadata();
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
363
|
+
let erd = existingERDs.get(recordID);
|
|
364
|
+
if (erd) {
|
|
365
|
+
// Update existing
|
|
366
|
+
erd.DocumentText = documentText;
|
|
367
|
+
erd.EntityRecordUpdatedAt = new Date();
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
// Create new
|
|
371
|
+
erd = await md.GetEntityObject('MJ: Entity Record Documents', this.contextUser);
|
|
372
|
+
erd.NewRecord();
|
|
373
|
+
erd.EntityID = entityID;
|
|
374
|
+
erd.RecordID = recordID;
|
|
375
|
+
erd.EntityDocumentID = entityDocument.ID;
|
|
376
|
+
erd.DocumentText = documentText;
|
|
377
|
+
erd.VectorIndexID = entityDocument.VectorIndexID;
|
|
378
|
+
erd.EntityRecordUpdatedAt = new Date();
|
|
111
379
|
}
|
|
112
|
-
|
|
380
|
+
const saved = await erd.Save();
|
|
381
|
+
if (!saved) {
|
|
382
|
+
throw new Error(`Failed to save EntityRecordDocument for record ${recordID}`);
|
|
383
|
+
}
|
|
384
|
+
// Update cache for subsequent lookups in this batch
|
|
385
|
+
existingERDs.set(recordID, erd);
|
|
386
|
+
return erd;
|
|
113
387
|
}
|
|
114
388
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
389
|
+
* Create or update a ContentItem linked to the EntityRecordDocument.
|
|
390
|
+
* Only creates a new ContentItem if the checksum changed (content actually changed)
|
|
391
|
+
* or if no ContentItem exists yet for this ERD.
|
|
117
392
|
*/
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
393
|
+
async UpsertContentItem(contentSource, erd, text, checksum, record, existingContentItems) {
|
|
394
|
+
const md = new Metadata();
|
|
395
|
+
const erdNormalizedID = NormalizeUUID(erd.ID);
|
|
396
|
+
const existing = existingContentItems.get(erdNormalizedID);
|
|
397
|
+
// If content hasn't changed, skip
|
|
398
|
+
if (existing && existing.Checksum === checksum) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
const contentSourceParams = {
|
|
402
|
+
contentSourceID: contentSource.ID,
|
|
403
|
+
name: contentSource.Name ?? '',
|
|
404
|
+
ContentTypeID: contentSource.ContentTypeID,
|
|
405
|
+
ContentFileTypeID: contentSource.ContentFileTypeID,
|
|
406
|
+
ContentSourceTypeID: contentSource.ContentSourceTypeID,
|
|
407
|
+
URL: contentSource.URL
|
|
408
|
+
};
|
|
409
|
+
let contentItem;
|
|
410
|
+
if (existing) {
|
|
411
|
+
// Update existing content item
|
|
412
|
+
contentItem = existing;
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
// Create new content item
|
|
416
|
+
contentItem = await md.GetEntityObject('MJ: Content Items', this.contextUser);
|
|
417
|
+
contentItem.NewRecord();
|
|
418
|
+
contentItem.ContentSourceID = contentSourceParams.contentSourceID;
|
|
419
|
+
contentItem.ContentTypeID = contentSourceParams.ContentTypeID;
|
|
420
|
+
contentItem.ContentFileTypeID = contentSourceParams.ContentFileTypeID;
|
|
421
|
+
contentItem.ContentSourceTypeID = contentSourceParams.ContentSourceTypeID;
|
|
422
|
+
contentItem.URL = contentSourceParams.URL;
|
|
423
|
+
}
|
|
424
|
+
// Set/update fields
|
|
425
|
+
contentItem.Name = record['Name'] ?? contentSourceParams.name;
|
|
426
|
+
contentItem.Description = this.engine.GetContentItemDescription(contentSourceParams);
|
|
427
|
+
contentItem.Text = text;
|
|
428
|
+
contentItem.Checksum = checksum;
|
|
429
|
+
contentItem.EntityRecordDocumentID = erd.ID;
|
|
430
|
+
const saved = await contentItem.Save();
|
|
431
|
+
if (!saved) {
|
|
432
|
+
throw new Error(`Failed to save ContentItem for ERD ${erd.ID}`);
|
|
433
|
+
}
|
|
434
|
+
// Update cache
|
|
435
|
+
existingContentItems.set(erdNormalizedID, contentItem);
|
|
436
|
+
return contentItem;
|
|
123
437
|
}
|
|
124
438
|
};
|
|
125
439
|
AutotagEntity = __decorate([
|
|
126
|
-
RegisterClass(AutotagBase, 'AutotagEntity')
|
|
127
|
-
__metadata("design:paramtypes", [])
|
|
440
|
+
RegisterClass(AutotagBase, 'AutotagEntity')
|
|
128
441
|
], AutotagEntity);
|
|
129
442
|
export { AutotagEntity };
|
|
130
443
|
//# sourceMappingURL=AutotagEntity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutotagEntity.js","sourceRoot":"","sources":["../../../src/Entity/generic/AutotagEntity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AutotagEntity.js","sourceRoot":"","sources":["../../../src/Entity/generic/AutotagEntity.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ export declare class AutotagLocalFileSystem extends AutotagBase {
|
|
|
15
15
|
* It initializes the connection, retrieves the content sources corresponding to the content source type, sets the content items that we want to process,
|
|
16
16
|
* extracts and processes the text, and sets the results in the database.
|
|
17
17
|
*/
|
|
18
|
-
Autotag(contextUser: UserInfo, onProgress?: AutotagProgressCallback): Promise<
|
|
18
|
+
Autotag(contextUser: UserInfo, onProgress?: AutotagProgressCallback): Promise<number>;
|
|
19
19
|
/**
|
|
20
20
|
* Implemented abstract method from the AutotagBase class. Given a list of content sources, this method should return a list
|
|
21
21
|
* of content source items that have been modified or added after the most recent process run for that content source.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutotagLocalFileSystem.d.ts","sourceRoot":"","sources":["../../../src/LocalFileSystem/generic/AutotagLocalFileSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAqB,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,qBACa,sBAAuB,SAAQ,WAAW;IACnD,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,MAAM,CAAoB;IAClC,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACrC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;;IAOhB,cAAc,IAAI,QAAQ,GAAG,IAAI;IAIxC;;;;OAIG;IACU,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"AutotagLocalFileSystem.d.ts","sourceRoot":"","sources":["../../../src/LocalFileSystem/generic/AutotagLocalFileSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAqB,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,qBACa,sBAAuB,SAAQ,WAAW;IACnD,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,MAAM,CAAoB;IAClC,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACrC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;;IAOhB,cAAc,IAAI,QAAQ,GAAG,IAAI;IAIxC;;;;OAIG;IACU,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IASlG;;;;;MAKE;IACW,wBAAwB,CAAC,cAAc,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA+BjG,sBAAsB,CAAC,aAAa,EAAE,qBAAqB;IAwBxE;;;;;;;OAOG;IACU,6BAA6B,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA+BjJ,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuB7G,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAgBhI"}
|
|
@@ -33,7 +33,8 @@ let AutotagLocalFileSystem = class AutotagLocalFileSystem extends AutotagBase {
|
|
|
33
33
|
this.contentSourceTypeID = this.engine.SetSubclassContentSourceType('Local File System');
|
|
34
34
|
const contentSources = await this.engine.getAllContentSources(this.contextUser, this.contentSourceTypeID) || [];
|
|
35
35
|
const contentItemsToProcess = await this.SetContentItemsToProcess(contentSources);
|
|
36
|
-
await this.engine.ExtractTextAndProcessWithLLM(contentItemsToProcess, this.contextUser, undefined, onProgress);
|
|
36
|
+
await this.engine.ExtractTextAndProcessWithLLM(contentItemsToProcess, this.contextUser, undefined, undefined, onProgress);
|
|
37
|
+
return contentItemsToProcess.length;
|
|
37
38
|
}
|
|
38
39
|
/**
|
|
39
40
|
* Implemented abstract method from the AutotagBase class. Given a list of content sources, this method should return a list
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutotagLocalFileSystem.js","sourceRoot":"","sources":["../../../src/LocalFileSystem/generic/AutotagLocalFileSystem.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAuB,MAAM,cAAc,CAAC;AACtE,OAAO,EAAY,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AAGnE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAGvB,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,WAAW;IAMnD;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC;IAC7C,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO,CAAC,WAAqB,EAAE,UAAoC;QAC5E,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,mBAAmB,CAAC,CAAC;QACzF,MAAM,cAAc,GAA4B,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QACzI,MAAM,qBAAqB,GAA0B,MAAM,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAA;QACxG,MAAM,IAAI,CAAC,MAAM,CAAC,4BAA4B,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"AutotagLocalFileSystem.js","sourceRoot":"","sources":["../../../src/LocalFileSystem/generic/AutotagLocalFileSystem.ts"],"names":[],"mappings":"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"}
|