@memberjunction/server 6.2.0-edge.4 → 6.2.0-edge.5
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 +20 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +91 -30
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +311 -81
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +5 -1
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +13 -1
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/apiRoot.d.ts +32 -0
- package/dist/apiRoot.d.ts.map +1 -0
- package/dist/apiRoot.js +67 -0
- package/dist/apiRoot.js.map +1 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +25 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/LoginScreenEngine.d.ts +22 -0
- package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
- package/dist/auth/LoginScreenEngine.js +57 -0
- package/dist/auth/LoginScreenEngine.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/config.d.ts +136 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -4
- package/dist/config.js.map +1 -1
- package/dist/coreRoutes.d.ts +29 -0
- package/dist/coreRoutes.d.ts.map +1 -0
- package/dist/coreRoutes.js +142 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +369 -3
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +1750 -7
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +59 -19
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/PushStatusResolver.js +1 -1
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +103 -44
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +264 -305
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +12 -0
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/globalCors.d.ts +33 -0
- package/dist/globalCors.d.ts.map +1 -0
- package/dist/globalCors.js +58 -0
- package/dist/globalCors.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -160
- package/dist/index.js.map +1 -1
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +22 -2
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
- package/dist/realtimeSessions/index.d.ts +2 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -1
- package/dist/realtimeSessions/index.js +2 -0
- package/dist/realtimeSessions/index.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +6 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +7 -3
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.js +9 -7
- package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +24 -3
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +57 -8
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +3 -2
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +18 -3
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +100 -35
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +82 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +279 -101
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +117 -38
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -3
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts +2 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +13 -0
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +2 -8
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +10 -26
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +35 -6
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
- package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +65 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +102 -24
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
- package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
- package/dist/resolvers/agent-run-data-guard.js +72 -0
- package/dist/resolvers/agent-run-data-guard.js.map +1 -0
- package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
- package/dist/rest/RealtimeRecordingHandler.js +383 -0
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +3 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +21 -12
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +6 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +6 -0
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +12 -10
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +14 -17
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/services/MJStorageBlobStore.d.ts +8 -1
- package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
- package/dist/services/MJStorageBlobStore.js +25 -19
- package/dist/services/MJStorageBlobStore.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.js +2 -2
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +5 -3
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -5
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +157 -9
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +54 -2
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +598 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts.map +1 -1
- package/dist/sharedCache.js +3 -0
- package/dist/sharedCache.js.map +1 -1
- package/package.json +99 -98
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +163 -15
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
- package/src/__tests__/LoginScreenEngine.test.ts +86 -0
- package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
- package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +209 -6
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +1 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +5 -3
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +365 -10
- package/src/__tests__/SessionManager.test.ts +27 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +356 -22
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
- package/src/__tests__/multiTenancy.security.test.ts +51 -0
- package/src/__tests__/multiTenancy.test.ts +1 -1
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
- package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
- package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
- package/src/__tests__/sharedCache.test.ts +5 -3
- package/src/agentSessions/SessionJanitor.ts +369 -93
- package/src/agentSessions/SessionManager.ts +13 -1
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +26 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/config.ts +46 -5
- package/src/coreRoutes.ts +166 -0
- package/src/generated/graphql-schemas/__mj.ts +1273 -10
- package/src/generic/CacheInvalidationResolver.ts +73 -18
- package/src/generic/PushStatusResolver.ts +1 -1
- package/src/generic/ResolverBase.ts +304 -325
- package/src/generic/RunViewResolver.ts +17 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +116 -174
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/index.ts +2 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
- package/src/realtimeSessions/sessionAccess.ts +7 -3
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +121 -39
- package/src/resolvers/FileResolver.ts +321 -106
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
- package/src/resolvers/QueryResolver.ts +11 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +10 -33
- package/src/resolvers/RunAIAgentResolver.ts +39 -4
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +68 -13
- package/src/resolvers/TransactionGroupResolver.ts +131 -27
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/rest/RealtimeRecordingHandler.ts +464 -0
- package/src/rest/ViewOperationsHandler.ts +29 -13
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- package/src/services/MJStorageBlobStore.ts +31 -30
- package/src/services/StartTaskGraphDispatcher.ts +2 -2
- package/src/services/TaskGraphActionRunner.ts +25 -5
- package/src/services/TaskGraphAgentRunner.ts +188 -11
- package/src/services/TaskGraphContinuationDeliverer.ts +704 -14
- package/src/sharedCache.ts +3 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Resolver, Query, Arg, Ctx, ObjectType, Field, Float, Int } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { CompositeKey, EntityInfo, IMetadataProvider, LogError, LogStatus, Metadata, RunView, UserInfo } from '@memberjunction/core';
|
|
3
|
+
import { CompositeKey, EntityInfo, IMetadataProvider, LogError, LogStatus, Metadata, RunView, RunViewParams, UserInfo } from '@memberjunction/core';
|
|
4
4
|
import { MJEntityDocumentEntity, MJVectorIndexEntity, MJVectorDatabaseEntity } from '@memberjunction/core-entities';
|
|
5
5
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
6
6
|
import { GetReadOnlyProvider } from '../util.js';
|
|
@@ -41,6 +41,15 @@ export class FetchEntityVectorsResult {
|
|
|
41
41
|
ErrorMessage?: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** A stored vector's listing row, as `fetchStoredVectors` reads it from `MJ: Entity Record Documents`. */
|
|
45
|
+
type StoredVectorRow = { ID: string; RecordID: string };
|
|
46
|
+
|
|
47
|
+
/** A stored vector chosen for the result, with the labels of the record it belongs to. */
|
|
48
|
+
type LabelledVector = { row: StoredVectorRow; labels: Record<string, string> };
|
|
49
|
+
|
|
50
|
+
/** Most Entity Record Document IDs named in one `ID IN (...)` filter when fetching VectorJSON. */
|
|
51
|
+
const VECTOR_FETCH_CHUNK_SIZE = 1000;
|
|
52
|
+
|
|
44
53
|
/* ───── Resolver ───── */
|
|
45
54
|
|
|
46
55
|
@Resolver()
|
|
@@ -88,8 +97,8 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
88
97
|
|
|
89
98
|
// Providers that keep their vectors in MJ, keyed by EntityDocumentID (the in-process
|
|
90
99
|
// SimpleVectorServiceProvider), can't be listed through QueryIndex: they key by the
|
|
91
|
-
// document ID rather than the index name,
|
|
92
|
-
//
|
|
100
|
+
// document ID rather than the index name, and return matches without vector values.
|
|
101
|
+
// Read the stored Entity Record Document rows instead.
|
|
93
102
|
if (vectorDBInstance.QueryKeyIsEntityDocumentID) {
|
|
94
103
|
const md = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? Metadata.Provider;
|
|
95
104
|
const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md);
|
|
@@ -255,63 +264,136 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
255
264
|
if (!entityInfo) {
|
|
256
265
|
throw new Error(`Entity "${entityDoc.Entity}" not found in metadata`);
|
|
257
266
|
}
|
|
258
|
-
const
|
|
267
|
+
const nameFields = this.labelFieldNames(entityInfo);
|
|
268
|
+
const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser);
|
|
269
|
+
const labelsByRecordID = this.mapRecordLabels(entityInfo, nameFields, records);
|
|
259
270
|
|
|
260
|
-
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
ExtraFilter: `EntityDocumentID='${EscapeSQLString(entityDoc.ID)}' AND VectorJSON IS NOT NULL`,
|
|
264
|
-
Fields: ['ID', 'RecordID', 'VectorJSON'],
|
|
265
|
-
IgnoreMaxRows: true,
|
|
266
|
-
ResultType: 'simple',
|
|
267
|
-
}, contextUser);
|
|
268
|
-
if (!docResult.Success) {
|
|
269
|
-
throw new Error(`Failed to load stored vectors: ${docResult.ErrorMessage}`);
|
|
270
|
-
}
|
|
271
|
+
// VectorJSON is the heavy column: list without it, then fetch it only for the items returned.
|
|
272
|
+
const chosen = this.selectLabelledVectors(vectors, labelsByRecordID, limit);
|
|
273
|
+
const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser);
|
|
271
274
|
|
|
272
275
|
const results: EntityVectorItem[] = [];
|
|
273
|
-
for (const row of
|
|
274
|
-
const
|
|
275
|
-
if (!
|
|
276
|
+
for (const { row, labels } of chosen) {
|
|
277
|
+
const vectorJSON = valuesByID.get(row.ID);
|
|
278
|
+
if (!vectorJSON) continue; // removed or cleared since the listing
|
|
276
279
|
results.push({
|
|
277
280
|
ID: row.ID,
|
|
278
|
-
Values: JSON.parse(
|
|
281
|
+
Values: JSON.parse(vectorJSON) as number[],
|
|
279
282
|
Metadata: JSON.stringify({ Entity: entityDoc.Entity, RecordID: row.RecordID, ...labels }),
|
|
280
283
|
});
|
|
281
|
-
if (results.length >= limit) break;
|
|
282
284
|
}
|
|
283
285
|
return results;
|
|
284
286
|
}
|
|
285
287
|
|
|
288
|
+
/** The first `limit` stored vectors whose record was loaded, in listing order. */
|
|
289
|
+
private selectLabelledVectors(
|
|
290
|
+
vectors: StoredVectorRow[],
|
|
291
|
+
labelsByRecordID: Map<string, Record<string, string>>,
|
|
292
|
+
limit: number
|
|
293
|
+
): LabelledVector[] {
|
|
294
|
+
const chosen: LabelledVector[] = [];
|
|
295
|
+
for (const row of vectors) {
|
|
296
|
+
if (chosen.length >= limit) break;
|
|
297
|
+
const labels = labelsByRecordID.get(row.RecordID.toLowerCase());
|
|
298
|
+
if (!labels) continue; // filtered out, not readable by this user, or the record no longer exists
|
|
299
|
+
chosen.push({ row, labels });
|
|
300
|
+
}
|
|
301
|
+
return chosen;
|
|
302
|
+
}
|
|
303
|
+
|
|
286
304
|
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
305
|
+
* Fetch `VectorJSON` for the given Entity Record Document IDs, keyed by ID. The ID lists are
|
|
306
|
+
* capped at {@link VECTOR_FETCH_CHUNK_SIZE} per view and all sent in one `RunViews` batch.
|
|
289
307
|
*/
|
|
290
|
-
private async
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
308
|
+
private async loadVectorValues(ids: string[], contextUser: UserInfo): Promise<Map<string, string>> {
|
|
309
|
+
const valuesByID = new Map<string, string>();
|
|
310
|
+
if (ids.length === 0) return valuesByID;
|
|
311
|
+
|
|
312
|
+
const views: RunViewParams[] = [];
|
|
313
|
+
for (let i = 0; i < ids.length; i += VECTOR_FETCH_CHUNK_SIZE) {
|
|
314
|
+
const idList = ids.slice(i, i + VECTOR_FETCH_CHUNK_SIZE).map(id => `'${EscapeSQLString(id)}'`).join(',');
|
|
315
|
+
views.push({
|
|
316
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
317
|
+
ExtraFilter: `ID IN (${idList})`,
|
|
318
|
+
Fields: ['ID', 'VectorJSON'],
|
|
319
|
+
IgnoreMaxRows: true,
|
|
320
|
+
BypassCache: true, // one-off ID lists: a cache slot per call would only hold memory
|
|
321
|
+
ResultType: 'simple',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
const results = await new RunView().RunViews<{ ID: string; VectorJSON: string | null }>(views, contextUser);
|
|
325
|
+
for (const result of results) {
|
|
326
|
+
if (!result.Success) {
|
|
327
|
+
throw new Error(`Failed to load vector values: ${result.ErrorMessage}`);
|
|
328
|
+
}
|
|
329
|
+
for (const row of result.Results) {
|
|
330
|
+
if (row.VectorJSON) valuesByID.set(row.ID, row.VectorJSON);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return valuesByID;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** The fields a stored vector is labelled with: the entity's name fields, else its NameField. */
|
|
337
|
+
private labelFieldNames(entityInfo: EntityInfo): string[] {
|
|
295
338
|
const nameFields = entityInfo.Fields.filter(f => f.IsNameField).map(f => f.Name);
|
|
296
339
|
if (nameFields.length === 0 && entityInfo.NameField) {
|
|
297
340
|
nameFields.push(entityInfo.NameField.Name);
|
|
298
341
|
}
|
|
299
|
-
|
|
342
|
+
return nameFields;
|
|
343
|
+
}
|
|
300
344
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
345
|
+
/**
|
|
346
|
+
* Load the records that pass `filter` (key and name fields only) and the list of the document's
|
|
347
|
+
* stored vectors (ID and RecordID, no VectorJSON). The two views don't depend on each other, so
|
|
348
|
+
* they go in one `RunViews` round trip.
|
|
349
|
+
*/
|
|
350
|
+
private async loadRecordsAndStoredVectors(
|
|
351
|
+
entityInfo: EntityInfo,
|
|
352
|
+
entityDoc: MJEntityDocumentEntity,
|
|
353
|
+
nameFields: string[],
|
|
354
|
+
filter: string | undefined,
|
|
355
|
+
contextUser: UserInfo
|
|
356
|
+
): Promise<{ records: Record<string, unknown>[]; vectors: StoredVectorRow[] }> {
|
|
357
|
+
const keyFields = entityInfo.PrimaryKeys.map(pk => pk.Name);
|
|
358
|
+
const [recordResult, docResult] = await new RunView().RunViews<Record<string, unknown>>([
|
|
359
|
+
{
|
|
360
|
+
EntityName: entityInfo.Name,
|
|
361
|
+
ExtraFilter: filter || undefined,
|
|
362
|
+
Fields: [...new Set([...keyFields, ...nameFields])],
|
|
363
|
+
IgnoreMaxRows: true,
|
|
364
|
+
ResultType: 'simple',
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
368
|
+
ExtraFilter: `EntityDocumentID='${EscapeSQLString(entityDoc.ID)}' AND VectorJSON IS NOT NULL`,
|
|
369
|
+
Fields: ['ID', 'RecordID'],
|
|
370
|
+
IgnoreMaxRows: true,
|
|
371
|
+
// A cached RunView fetches every column so its slot can serve any field set, which
|
|
372
|
+
// would pull each vector's VectorJSON here. Bypass the cache so Fields is honoured.
|
|
373
|
+
BypassCache: true,
|
|
374
|
+
ResultType: 'simple',
|
|
375
|
+
},
|
|
376
|
+
], contextUser);
|
|
377
|
+
if (!recordResult.Success) {
|
|
378
|
+
throw new Error(`Failed to load "${entityInfo.Name}" records: ${recordResult.ErrorMessage}`);
|
|
379
|
+
}
|
|
380
|
+
if (!docResult.Success) {
|
|
381
|
+
throw new Error(`Failed to load stored vectors: ${docResult.ErrorMessage}`);
|
|
311
382
|
}
|
|
383
|
+
return { records: recordResult.Results, vectors: docResult.Results as StoredVectorRow[] };
|
|
384
|
+
}
|
|
312
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Map each loaded record to its name-field values, keyed by the same compact record-ID form
|
|
388
|
+
* the vector sync writes to `MJ: Entity Record Documents.RecordID` (lower-cased).
|
|
389
|
+
*/
|
|
390
|
+
private mapRecordLabels(
|
|
391
|
+
entityInfo: EntityInfo,
|
|
392
|
+
nameFields: string[],
|
|
393
|
+
rows: Record<string, unknown>[]
|
|
394
|
+
): Map<string, Record<string, string>> {
|
|
313
395
|
const map = new Map<string, Record<string, string>>();
|
|
314
|
-
for (const row of
|
|
396
|
+
for (const row of rows) {
|
|
315
397
|
const key = CompositeKey.FromEntityRecord(entityInfo, row).ToCompactURLSegment().toLowerCase();
|
|
316
398
|
const labels: Record<string, string> = {};
|
|
317
399
|
for (const name of nameFields) {
|