@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
|
@@ -13,8 +13,10 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
13
13
|
import { Arg, Ctx, Field, InputType, Int, ObjectType, Query, Resolver } from 'type-graphql';
|
|
14
14
|
import { GraphQLJSONObject } from 'graphql-type-json';
|
|
15
15
|
import { RunQuery, LogError, LogStatus } from '@memberjunction/core';
|
|
16
|
+
import { RenderPipeline } from '@memberjunction/generic-database-provider';
|
|
16
17
|
import { GetReadOnlyProvider } from '../util.js';
|
|
17
18
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
19
|
+
import { IsScopeLimitedPrincipal } from '../auth/scopeLimitedPrincipal.js';
|
|
18
20
|
/**
|
|
19
21
|
* GraphQL input type for inline dependency queries.
|
|
20
22
|
* Self-referencing to support recursive dependency trees.
|
|
@@ -125,6 +127,14 @@ export { TestQuerySQLResult };
|
|
|
125
127
|
*
|
|
126
128
|
* Security:
|
|
127
129
|
* - Requires `query:test` scope for API key users (no-op for JWT auth)
|
|
130
|
+
* - Refuses scope-limited principals (see {@link IsScopeLimitedPrincipal}). Raw SQL bypasses
|
|
131
|
+
* RunView, entity permissions and row-level security, so the RLS scope tokens that confine a
|
|
132
|
+
* magic-link session are never applied on this path — there is no narrower filter to fall back
|
|
133
|
+
* to, only refusal.
|
|
134
|
+
* - Authorizes the RENDERED SQL: every table reference must be an entity base view the caller
|
|
135
|
+
* reads unscoped (CanRead, no row-level filter, no denied fields). Entities with row/field
|
|
136
|
+
* policy for this user are refused — raw SQL cannot apply that policy, so those reads belong
|
|
137
|
+
* on RunView. Same screen as {@link AdhocQueryResolver.ExecuteAdhocQuery}.
|
|
128
138
|
* - Uses read-only database connection (no mutation possible)
|
|
129
139
|
* - Enforces MaxRows limit (default 100) to prevent unbounded queries
|
|
130
140
|
*
|
|
@@ -134,15 +144,23 @@ let TestQuerySQLResolver = class TestQuerySQLResolver extends ResolverBase {
|
|
|
134
144
|
async TestQuerySQL(input, context) {
|
|
135
145
|
try {
|
|
136
146
|
await this.CheckAPIKeyScopeAuthorization('query:test', '*', context.userPayload);
|
|
147
|
+
// SECURITY: refuse principals whose read authority is narrower than their role grant.
|
|
148
|
+
// Transient test SQL does not go through RunView, entity permissions or row-level
|
|
149
|
+
// security, so the RLS scope tokens that confine a magic-link session are never
|
|
150
|
+
// substituted. There is no filter to narrow, so the only correct answer for such a
|
|
151
|
+
// principal is no — the same refusal ExecuteAdhocQuery applies.
|
|
152
|
+
if (IsScopeLimitedPrincipal(context.userPayload?.userRecord)) {
|
|
153
|
+
return this.buildErrorResult('Ad-hoc SQL execution is not permitted for scope-limited sessions.');
|
|
154
|
+
}
|
|
137
155
|
// Use read-only provider for security — no mutation possible
|
|
138
156
|
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: false });
|
|
139
157
|
if (!provider) {
|
|
140
|
-
return
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
158
|
+
return this.buildErrorResult('Read-only data source is not available. TestQuerySQL requires a read-only connection for security.');
|
|
159
|
+
}
|
|
160
|
+
const contextUser = context.userPayload?.userRecord;
|
|
161
|
+
const refusal = this.AuthorizeRenderedTestSQL(input, provider, contextUser);
|
|
162
|
+
if (refusal) {
|
|
163
|
+
return this.buildErrorResult(refusal);
|
|
146
164
|
}
|
|
147
165
|
const rq = new RunQuery(provider);
|
|
148
166
|
const spec = {
|
|
@@ -153,7 +171,7 @@ let TestQuerySQLResolver = class TestQuerySQLResolver extends ResolverBase {
|
|
|
153
171
|
MaxRows: input.MaxRows ?? 100,
|
|
154
172
|
};
|
|
155
173
|
LogStatus(`TestQuerySQL: Executing transient query (MaxRows=${spec.MaxRows}, UsesTemplate=${spec.UsesTemplate ?? false}, Dependencies=${spec.Dependencies?.length ?? 0})`);
|
|
156
|
-
const result = await rq.ExecuteFromSpec(spec,
|
|
174
|
+
const result = await rq.ExecuteFromSpec(spec, contextUser);
|
|
157
175
|
return {
|
|
158
176
|
Success: result.Success,
|
|
159
177
|
Results: result.Results ? JSON.stringify(result.Results) : undefined,
|
|
@@ -167,14 +185,48 @@ let TestQuerySQLResolver = class TestQuerySQLResolver extends ResolverBase {
|
|
|
167
185
|
catch (err) {
|
|
168
186
|
LogError(err);
|
|
169
187
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
170
|
-
return {
|
|
171
|
-
Success: false,
|
|
172
|
-
RowCount: 0,
|
|
173
|
-
ExecutionTime: 0,
|
|
174
|
-
ErrorMessage: `TestQuerySQL failed: ${errorMessage}`,
|
|
175
|
-
};
|
|
188
|
+
return this.buildErrorResult(`TestQuerySQL failed: ${errorMessage}`);
|
|
176
189
|
}
|
|
177
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* SECURITY: authorizes the READ itself, against the SQL that will actually run — the same
|
|
193
|
+
* screen `AdhocQueryResolver.AuthorizeRenderedSQL` applies to ad-hoc SQL. Rendering comes
|
|
194
|
+
* first because composition (`{{query:"..."}}`), inline dependencies and Nunjucks templates
|
|
195
|
+
* can introduce table references the raw input never named, so the render here uses the same
|
|
196
|
+
* Parameters / UsesTemplate / Dependencies the execution spec will. Every table reference in
|
|
197
|
+
* the rendered SQL must be an entity base view the caller can read UNSCOPED — CanRead with no
|
|
198
|
+
* row-level filter and no denied fields — because raw SQL applies neither (see
|
|
199
|
+
* `assertFullQueryUsesReadableEntityViews`). The provider renders the same input the same way
|
|
200
|
+
* and only wraps it in server-built MaxRows capping, so the rendered SQL is the full set of
|
|
201
|
+
* reads. Returns the refusal message, or null.
|
|
202
|
+
*/
|
|
203
|
+
AuthorizeRenderedTestSQL(input, provider, contextUser) {
|
|
204
|
+
try {
|
|
205
|
+
const rendered = RenderPipeline.Run(input.SQL, {
|
|
206
|
+
Platform: provider.PlatformKey,
|
|
207
|
+
ContextUser: contextUser,
|
|
208
|
+
Parameters: input.Parameters,
|
|
209
|
+
UsesTemplate: input.UsesTemplate,
|
|
210
|
+
Dependencies: input.Dependencies,
|
|
211
|
+
OriginalSQL: input.SQL,
|
|
212
|
+
RequireReadStatement: true,
|
|
213
|
+
});
|
|
214
|
+
this.assertFullQueryUsesReadableEntityViews(rendered.Trace.AfterTemplates, provider, contextUser, 'transient test SQL');
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
return err instanceof Error ? err.message : String(err);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Builds a failed TestQuerySQLResult carrying the given message. */
|
|
222
|
+
buildErrorResult(errorMessage) {
|
|
223
|
+
return {
|
|
224
|
+
Success: false,
|
|
225
|
+
RowCount: 0,
|
|
226
|
+
ExecutionTime: 0,
|
|
227
|
+
ErrorMessage: errorMessage,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
178
230
|
};
|
|
179
231
|
__decorate([
|
|
180
232
|
Query(() => TestQuerySQLResult, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestQuerySQLResolver.js","sourceRoot":"","sources":["../../src/resolvers/TestQuerySQLResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAqB,QAAQ,EAAE,SAAS,EAAsB,MAAM,sBAAsB,CAAC;AAE5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"TestQuerySQLResolver.js","sourceRoot":"","sources":["../../src/resolvers/TestQuerySQLResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AppContext } from '../types.js';
|
|
2
|
-
import { BaseEntity } from '@memberjunction/core';
|
|
2
|
+
import { TransactionGroupBase, BaseEntity } from '@memberjunction/core';
|
|
3
3
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
4
4
|
export declare enum TransactionVariableType {
|
|
5
5
|
Define = "Define",
|
|
@@ -38,6 +38,23 @@ export declare class TransactionResolver extends ResolverBase {
|
|
|
38
38
|
*/
|
|
39
39
|
protected GetScopePathForOperation(operationType: TransactionOperationType): string;
|
|
40
40
|
ExecuteTransactionGroup(group: TransactionInputType, context: AppContext): Promise<TransactionOutputType>;
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Adds the network payload's variables to the group, mapping each one's item index to the entity
|
|
43
|
+
* object built for that item.
|
|
44
|
+
*/
|
|
45
|
+
protected AddNetworkVariables(group: TransactionInputType, entityObjects: BaseEntity[], tg: TransactionGroupBase): void;
|
|
46
|
+
protected PrepareReturnValue(success: boolean, entityObjects: BaseEntity[], objectValues: unknown[], group: TransactionInputType, preUpdateValues?: Map<number, Record<string, unknown>>): Promise<TransactionOutputType>;
|
|
47
|
+
/**
|
|
48
|
+
* Serializes a delta return payload for an `Update` transaction group item containing:
|
|
49
|
+
* - Primary key fields
|
|
50
|
+
* - All keys sent by the client in `sentValues` (`objectValues[i]`)
|
|
51
|
+
* - Any `TransactionVariable` fields targeting this item
|
|
52
|
+
* - `__mj_CreatedAt` and `__mj_UpdatedAt`
|
|
53
|
+
* - Virtual fields when any foreign key field was in `sentValues`
|
|
54
|
+
* - Any field whose post-save value differs from its pre-update DB snapshot (`preSaveValues`),
|
|
55
|
+
* capturing virtual fields, triggers, or server-side `BeforeSave()` mutations automatically
|
|
56
|
+
* while omitting unchanged columns.
|
|
57
|
+
*/
|
|
58
|
+
private serializeUpdateReturnValue;
|
|
42
59
|
}
|
|
43
60
|
//# sourceMappingURL=TransactionGroupResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionGroupResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/TransactionGroupResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"TransactionGroupResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/TransactionGroupResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAsG,oBAAoB,EAAE,UAAU,EAA0C,MAAM,sBAAsB,CAAC;AAGpN,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,oBAAY,uBAAuB;IAC/B,MAAM,WAAW;IACjB,GAAG,QAAQ;CACd;AAOD,oBAAY,wBAAwB;IAChC,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CACpB;AAQD,qBACa,4BAA4B;IAErC,IAAI,EAAG,MAAM,CAAC;IAGd,SAAS,EAAG,MAAM,CAAC;IAGnB,SAAS,EAAG,MAAM,CAAC;IAGnB,IAAI,EAAG,uBAAuB,CAAC;CAClC;AAED,qBACa,wBAAwB;IAEjC,UAAU,EAAE,MAAM,CAAC;IAGnB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,aAAa,EAAE,wBAAwB,CAAC;CAC3C;AAED,qBACa,oBAAoB;IAE7B,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAGlC,SAAS,CAAC,EAAE,4BAA4B,EAAE,GAAG,IAAI,CAAC;CACrD;AAGD,qBACa,qBAAqB;IAE9B,OAAO,EAAE,OAAO,CAAC;IAGjB,aAAa,EAAE,MAAM,EAAE,CAAC;IAGxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAiBD,qBAAa,mBAAoB,SAAQ,YAAY;IACjD;;;;OAIG;IACH,SAAS,CAAC,wBAAwB,CAAC,aAAa,EAAE,wBAAwB,GAAG,MAAM;IAY7E,uBAAuB,CACc,KAAK,EAAE,oBAAoB,EAC/D,OAAO,EAAE,UAAU;IAiI1B;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,oBAAoB,GAAG,IAAI;cAYvG,kBAAkB,CAC9B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,UAAU,EAAE,EAC3B,YAAY,EAAE,OAAO,EAAE,EACvB,KAAK,EAAE,oBAAoB,EAC3B,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvD,OAAO,CAAC,qBAAqB,CAAC;IA+BjC;;;;;;;;;;OAUG;YACW,0BAA0B;CA8D3C"}
|
|
@@ -11,8 +11,8 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, registerEnumType } from 'type-graphql';
|
|
14
|
-
import { CompositeKey, KeyValuePair, LogError, Metadata, TransactionVariable } from '@memberjunction/core';
|
|
15
|
-
import { SafeJSONParse } from '@memberjunction/global';
|
|
14
|
+
import { CompositeKey, EntityInfo, KeyValuePair, LogError, Metadata, TransactionVariable } from '@memberjunction/core';
|
|
15
|
+
import { SafeJSONParse, ValuesEqual } from '@memberjunction/global';
|
|
16
16
|
import { GetReadWriteProvider } from '../util.js';
|
|
17
17
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
18
18
|
export var TransactionVariableType;
|
|
@@ -159,10 +159,17 @@ export class TransactionResolver extends ResolverBase {
|
|
|
159
159
|
// rows were all refused arrive at Submit() empty, take its legitimate "nothing to do"
|
|
160
160
|
// branch, and report success for writes that never happened.
|
|
161
161
|
const refusals = [];
|
|
162
|
+
const preUpdateValues = new Map();
|
|
163
|
+
// instantiate an entity object for every item first, so the group's variables are known
|
|
164
|
+
// BEFORE any Save()/Delete() runs below: a 'Use' variable sets its field at Submit(), after
|
|
165
|
+
// every server-side write check has passed, so an entity whose check depends on a field's
|
|
166
|
+
// final value must be able to see that a variable will set it.
|
|
167
|
+
for (const item of group.Items) {
|
|
168
|
+
entityObjects.push(await md.GetEntityObject(item.EntityName, context.userPayload.userRecord));
|
|
169
|
+
}
|
|
170
|
+
this.AddNetworkVariables(group, entityObjects, tg);
|
|
162
171
|
for (const [index, item] of group.Items.entries()) {
|
|
163
|
-
|
|
164
|
-
const entity = await md.GetEntityObject(item.EntityName, context.userPayload.userRecord);
|
|
165
|
-
entityObjects.push(entity); // save for later for mapping variables if needed
|
|
172
|
+
const entity = entityObjects[index];
|
|
166
173
|
// get the values from the payload
|
|
167
174
|
const itemValues = SafeJSONParse(item.EntityObjectJSON);
|
|
168
175
|
// build a primary key for the item
|
|
@@ -177,6 +184,12 @@ export class TransactionResolver extends ResolverBase {
|
|
|
177
184
|
case "Create":
|
|
178
185
|
if (item.OperationType === "Update") {
|
|
179
186
|
await entity.InnerLoad(pkey);
|
|
187
|
+
if (typeof entity.GetDataObject === 'function') {
|
|
188
|
+
preUpdateValues.set(index, await entity.GetDataObject());
|
|
189
|
+
}
|
|
190
|
+
else if (typeof entity.GetAll === 'function') {
|
|
191
|
+
preUpdateValues.set(index, { ...entity.GetAll() });
|
|
192
|
+
}
|
|
180
193
|
}
|
|
181
194
|
objectValues.push(itemValues);
|
|
182
195
|
entity.SetMany(itemValues, true);
|
|
@@ -220,30 +233,16 @@ export class TransactionResolver extends ResolverBase {
|
|
|
220
233
|
if (refusals.length > 0) {
|
|
221
234
|
LogError(`TransactionResolver::ExecuteTransactionGroup --- ${refusals.length} of ${group.Items.length} ` +
|
|
222
235
|
`item(s) were refused, so the group was not submitted:\n${refusals.join('\n')}`);
|
|
223
|
-
return await this.PrepareReturnValue(false, entityObjects, objectValues, group);
|
|
224
|
-
}
|
|
225
|
-
// now, we need to set the variables
|
|
226
|
-
if (group.Variables && group.Variables.length > 0) {
|
|
227
|
-
for (const networkVar of group.Variables) {
|
|
228
|
-
// for each variable, add it to the transaction group and map the index from the network payload to the specific entity object loaded up above
|
|
229
|
-
if (networkVar.ItemIndex >= 0 && networkVar.ItemIndex < entityObjects.length) {
|
|
230
|
-
const entityObject = entityObjects[networkVar.ItemIndex];
|
|
231
|
-
const newVar = new TransactionVariable(networkVar.Name, entityObject, networkVar.FieldName, networkVar.Type);
|
|
232
|
-
tg.AddVariable(newVar);
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
throw new Error(`TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + 'Invalid ItemIndex ${networkVar.ItemIndex} in TransactionVariable "${JSON.stringify(networkVar)}"`);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
236
|
+
return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues);
|
|
238
237
|
}
|
|
239
238
|
// after all that, we are ready to roll, so let's run the TG
|
|
240
239
|
if (await tg.Submit()) {
|
|
241
240
|
// success!
|
|
242
|
-
return await this.PrepareReturnValue(true, entityObjects, objectValues, group);
|
|
241
|
+
return await this.PrepareReturnValue(true, entityObjects, objectValues, group, preUpdateValues);
|
|
243
242
|
}
|
|
244
243
|
else {
|
|
245
244
|
// failure, send back the results
|
|
246
|
-
return await this.PrepareReturnValue(false, entityObjects, objectValues, group);
|
|
245
|
+
return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues);
|
|
247
246
|
}
|
|
248
247
|
}
|
|
249
248
|
catch (err) {
|
|
@@ -251,15 +250,33 @@ export class TransactionResolver extends ResolverBase {
|
|
|
251
250
|
throw new Error('TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + err);
|
|
252
251
|
}
|
|
253
252
|
}
|
|
254
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Adds the network payload's variables to the group, mapping each one's item index to the entity
|
|
255
|
+
* object built for that item.
|
|
256
|
+
*/
|
|
257
|
+
AddNetworkVariables(group, entityObjects, tg) {
|
|
258
|
+
for (const networkVar of group.Variables ?? []) {
|
|
259
|
+
if (networkVar.ItemIndex >= 0 && networkVar.ItemIndex < entityObjects.length) {
|
|
260
|
+
const entityObject = entityObjects[networkVar.ItemIndex];
|
|
261
|
+
tg.AddVariable(new TransactionVariable(networkVar.Name, entityObject, networkVar.FieldName, networkVar.Type));
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
throw new Error(`TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + 'Invalid ItemIndex ${networkVar.ItemIndex} in TransactionVariable "${JSON.stringify(networkVar)}"`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async PrepareReturnValue(success, entityObjects, objectValues, group, preUpdateValues) {
|
|
255
269
|
const jsonResults = [];
|
|
256
270
|
for (let i = 0; i < group.Items.length; i++) {
|
|
257
271
|
const item = group.Items[i];
|
|
258
272
|
if (item.OperationType === 'Delete') {
|
|
259
273
|
jsonResults.push(JSON.stringify(objectValues[i]));
|
|
260
274
|
}
|
|
275
|
+
else if (item.OperationType === 'Update') {
|
|
276
|
+
jsonResults.push(await this.serializeUpdateReturnValue(entityObjects[i], objectValues[i], preUpdateValues?.get(i), group, i));
|
|
277
|
+
}
|
|
261
278
|
else {
|
|
262
|
-
// create
|
|
279
|
+
// create, return what is in the database
|
|
263
280
|
jsonResults.push(await entityObjects[i].GetDataObjectJSON());
|
|
264
281
|
}
|
|
265
282
|
}
|
|
@@ -269,6 +286,67 @@ export class TransactionResolver extends ResolverBase {
|
|
|
269
286
|
ResultsJSON: jsonResults
|
|
270
287
|
};
|
|
271
288
|
}
|
|
289
|
+
/**
|
|
290
|
+
* Serializes a delta return payload for an `Update` transaction group item containing:
|
|
291
|
+
* - Primary key fields
|
|
292
|
+
* - All keys sent by the client in `sentValues` (`objectValues[i]`)
|
|
293
|
+
* - Any `TransactionVariable` fields targeting this item
|
|
294
|
+
* - `__mj_CreatedAt` and `__mj_UpdatedAt`
|
|
295
|
+
* - Virtual fields when any foreign key field was in `sentValues`
|
|
296
|
+
* - Any field whose post-save value differs from its pre-update DB snapshot (`preSaveValues`),
|
|
297
|
+
* capturing virtual fields, triggers, or server-side `BeforeSave()` mutations automatically
|
|
298
|
+
* while omitting unchanged columns.
|
|
299
|
+
*/
|
|
300
|
+
async serializeUpdateReturnValue(entity, sentValues, preSaveValues, group, itemIndex) {
|
|
301
|
+
const fullDataObj = typeof entity.GetDataObject === 'function'
|
|
302
|
+
? await entity.GetDataObject()
|
|
303
|
+
: SafeJSONParse(await entity.GetDataObjectJSON());
|
|
304
|
+
if (!fullDataObj || typeof fullDataObj !== 'object' || !sentValues || typeof sentValues !== 'object') {
|
|
305
|
+
return await entity.GetDataObjectJSON();
|
|
306
|
+
}
|
|
307
|
+
const sentRecord = sentValues;
|
|
308
|
+
const includeKeys = new Set([
|
|
309
|
+
EntityInfo.CreatedAtFieldName,
|
|
310
|
+
EntityInfo.UpdatedAtFieldName,
|
|
311
|
+
]);
|
|
312
|
+
for (const pk of entity.PrimaryKeys ?? []) {
|
|
313
|
+
if (pk?.Name) {
|
|
314
|
+
includeKeys.add(pk.Name);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
for (const key of Object.keys(sentRecord)) {
|
|
318
|
+
includeKeys.add(key);
|
|
319
|
+
}
|
|
320
|
+
for (const v of group.Variables ?? []) {
|
|
321
|
+
if (v.ItemIndex === itemIndex && v.FieldName) {
|
|
322
|
+
includeKeys.add(v.FieldName);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (Array.isArray(entity.Fields)) {
|
|
326
|
+
for (const f of entity.Fields) {
|
|
327
|
+
if (f.EntityFieldInfo?.IsSpecialDateField ||
|
|
328
|
+
Boolean(f.EntityFieldInfo?.IsVirtual) ||
|
|
329
|
+
Boolean(f.EntityFieldInfo?.IsComputed) ||
|
|
330
|
+
f.ReadOnly) {
|
|
331
|
+
includeKeys.add(f.Name);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (preSaveValues) {
|
|
336
|
+
for (const key of Object.keys(fullDataObj)) {
|
|
337
|
+
if (!ValuesEqual(fullDataObj[key], preSaveValues[key])) {
|
|
338
|
+
includeKeys.add(key);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
const deltaObj = {};
|
|
343
|
+
for (const key of Object.keys(fullDataObj)) {
|
|
344
|
+
if (includeKeys.has(key)) {
|
|
345
|
+
deltaObj[key] = fullDataObj[key];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return JSON.stringify(deltaObj);
|
|
349
|
+
}
|
|
272
350
|
}
|
|
273
351
|
__decorate([
|
|
274
352
|
Mutation(() => TransactionOutputType),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionGroupResolver.js","sourceRoot":"","sources":["../../src/resolvers/TransactionGroupResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEvG,OAAO,EAAE,YAAY,EAAqB,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"TransactionGroupResolver.js","sourceRoot":"","sources":["../../src/resolvers/TransactionGroupResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { UserPayload } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The API-key scope (`MJ: API Scopes.FullPath`) that makes an `mj_sk_*` key a trusted integration for reserved run
|
|
4
|
+
* data. Checked against the agent being run, so a key can be trusted for some agents only. `full_access` does not
|
|
5
|
+
* imply it: the key must hold this scope itself.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TRUSTED_RUN_DATA_SCOPE = "agent:trusted";
|
|
8
|
+
/** Who sent a run's `data`, as far as {@link IsTrustedAgentRunCaller} needs to know. */
|
|
9
|
+
export interface ClientAgentRunCaller {
|
|
10
|
+
/**
|
|
11
|
+
* The request's authenticated payload, BEFORE any widget-guest elevation. `isSystemUser` is set only by
|
|
12
|
+
* the system API key (and by widget elevation, which {@link IsWidgetGuestRun} overrides); `apiKeyHash`
|
|
13
|
+
* only by an `mj_sk_*` user API key.
|
|
14
|
+
*/
|
|
15
|
+
UserPayload: Pick<UserPayload, 'email' | 'isSystemUser' | 'apiKeyHash'>;
|
|
16
|
+
/** True when the run executes under the widget-guest elevated principal. Such a run is never trusted. */
|
|
17
|
+
IsWidgetGuestRun: boolean;
|
|
18
|
+
/** The agent the caller asked to run: the resource the {@link TRUSTED_RUN_DATA_SCOPE} check is made against. */
|
|
19
|
+
AgentID: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Whether a caller may set the reserved run-data keys — the value the agent-run resolvers pass as
|
|
23
|
+
* `ExecuteAgentParams.TrustReservedRunData`: the system user, or an API key that holds
|
|
24
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} for this agent, and never a widget-guest run, whatever principal it was elevated to.
|
|
25
|
+
* A key without the scope is treated like the browser session of the user it belongs to.
|
|
26
|
+
*
|
|
27
|
+
* @param caller - Who sent the run's `data`.
|
|
28
|
+
* @returns `true` when the run may read the reserved keys from `data`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function IsTrustedAgentRunCaller(caller: ClientAgentRunCaller): Promise<boolean>;
|
|
31
|
+
//# sourceMappingURL=agent-run-data-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-run-data-guard.d.ts","sourceRoot":"","sources":["../../src/resolvers/agent-run-data-guard.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,wFAAwF;AACxF,MAAM,WAAW,oBAAoB;IACjC;;;;OAIG;IACH,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC,CAAC;IACxE,yGAAyG;IACzG,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gHAAgH;IAChH,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAS5F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Decides which callers of the agent-run resolvers may set a run's scope or agent-type parameters
|
|
3
|
+
* through the free-form `data` argument.
|
|
4
|
+
*
|
|
5
|
+
* `BaseAgent` and `AgentRunner` read a few `ExecuteAgentParams.data` keys (`RESERVED_AGENT_RUN_DATA_KEYS` in
|
|
6
|
+
* `@memberjunction/ai-core-plus`) as fallbacks that change what a run is, not just what its prompt says:
|
|
7
|
+
* - `PrimaryScopeEntityName`, `PrimaryScopeRecordID`, `SecondaryScopes` decide the run's scope: which
|
|
8
|
+
* notes and examples memory is injected, the pre-execution RAG search context, the scoped prompt parts
|
|
9
|
+
* and run settings, the scope columns written on the `MJ: AI Agent Runs` row, and what sub-agents
|
|
10
|
+
* inherit. On a widget-guest run an explicit scope also beats the returning-visitor scope.
|
|
11
|
+
* - `__agentTypePromptParams` is the highest-precedence agent-type parameter layer. It can turn on the
|
|
12
|
+
* Loop type's `enableTaskGraphs` capability, and switch decisions on or off.
|
|
13
|
+
*
|
|
14
|
+
* The rule lives with the run, not here: `BaseAgent.Execute` drops those keys from every run's `data` unless the
|
|
15
|
+
* params set `ExecuteAgentParams.TrustReservedRunData`. The resolvers set that marker for the callers
|
|
16
|
+
* {@link IsTrustedAgentRunCaller} accepts — the system user, and an `mj_sk_*` API key that holds the
|
|
17
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} scope — and never for a browser or a widget guest. Any user who may create API
|
|
18
|
+
* keys can mint one for themselves, so a key alone is not enough: an administrator grants the scope. Explorer never
|
|
19
|
+
* sends these keys. Everything else in `data` (template data, `conversationId`, `appContext`, `clientTools`, ...)
|
|
20
|
+
* reaches the run unchanged either way.
|
|
21
|
+
*
|
|
22
|
+
* @module @memberjunction/server/resolvers
|
|
23
|
+
*/
|
|
24
|
+
import { LogError } from '@memberjunction/core';
|
|
25
|
+
import { GetAPIKeyEngine } from '@memberjunction/api-keys';
|
|
26
|
+
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
27
|
+
/**
|
|
28
|
+
* The API-key scope (`MJ: API Scopes.FullPath`) that makes an `mj_sk_*` key a trusted integration for reserved run
|
|
29
|
+
* data. Checked against the agent being run, so a key can be trusted for some agents only. `full_access` does not
|
|
30
|
+
* imply it: the key must hold this scope itself.
|
|
31
|
+
*/
|
|
32
|
+
export const TRUSTED_RUN_DATA_SCOPE = 'agent:trusted';
|
|
33
|
+
/**
|
|
34
|
+
* Whether a caller may set the reserved run-data keys — the value the agent-run resolvers pass as
|
|
35
|
+
* `ExecuteAgentParams.TrustReservedRunData`: the system user, or an API key that holds
|
|
36
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} for this agent, and never a widget-guest run, whatever principal it was elevated to.
|
|
37
|
+
* A key without the scope is treated like the browser session of the user it belongs to.
|
|
38
|
+
*
|
|
39
|
+
* @param caller - Who sent the run's `data`.
|
|
40
|
+
* @returns `true` when the run may read the reserved keys from `data`.
|
|
41
|
+
*/
|
|
42
|
+
export async function IsTrustedAgentRunCaller(caller) {
|
|
43
|
+
if (caller.IsWidgetGuestRun) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (caller.UserPayload.isSystemUser === true) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
const apiKeyHash = caller.UserPayload.apiKeyHash;
|
|
50
|
+
return apiKeyHash ? keyHoldsTrustedRunDataScope(apiKeyHash, caller.AgentID) : false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether the key explicitly holds {@link TRUSTED_RUN_DATA_SCOPE} for the agent. A key-level rule must match: an
|
|
54
|
+
* allow that comes from scope enforcement being switched off, or from `defaultBehaviorNoScopes: 'allow'`, matches
|
|
55
|
+
* no rule and does not count. Any failure counts as not held.
|
|
56
|
+
*/
|
|
57
|
+
async function keyHoldsTrustedRunDataScope(apiKeyHash, agentID) {
|
|
58
|
+
try {
|
|
59
|
+
const systemUser = UserCache.Instance.GetSystemUser();
|
|
60
|
+
if (!systemUser) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// A probe, not an access decision (the run goes ahead either way), so it is not written to the usage log.
|
|
64
|
+
const result = await GetAPIKeyEngine().Authorize(apiKeyHash, 'MJAPI', TRUSTED_RUN_DATA_SCOPE, agentID, systemUser, { endpoint: '/graphql', method: 'POST' }, { skipLogging: true });
|
|
65
|
+
return result.Allowed && result.MatchedKeyRule != null;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
LogError(`IsTrustedAgentRunCaller: the ${TRUSTED_RUN_DATA_SCOPE} check failed; the run is not trusted: ${e}`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=agent-run-data-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-run-data-guard.js","sourceRoot":"","sources":["../../src/resolvers/agent-run-data-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAGtE;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAgBtD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAA4B;IACtE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IACjD,OAAO,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,2BAA2B,CAAC,UAAkB,EAAE,OAAe;IAC1E,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,0GAA0G;QAC1G,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAC7G,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,QAAQ,CAAC,gCAAgC,sBAAsB,0CAA0C,CAAC,EAAE,CAAC,CAAC;QAC9G,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Request, type Router } from 'express';
|
|
2
|
+
import { DatabaseProviderBase, UserInfo } from '@memberjunction/core';
|
|
3
|
+
import { type IRealtimeRecordingLedger } from '@memberjunction/ai-agents';
|
|
4
|
+
import { LoadOwnedRealtimeSession } from '../realtimeSessions/ownedRealtimeSession.js';
|
|
5
|
+
import type { IRecordingAssemblyScheduler } from '../realtimeSessions/RecordingAssemblyScheduler.js';
|
|
6
|
+
import { LoadSessionConversationExternalID } from '../realtimeSessions/sessionAccess.js';
|
|
7
|
+
/** Where {@link CreateRealtimeRecordingRouter} is mounted (under the reserved `/realtime` root). */
|
|
8
|
+
export declare const REALTIME_RECORDING_MOUNT_PATH = "/realtime/recording";
|
|
9
|
+
/**
|
|
10
|
+
* How soon a final terminal that found shards missing looks again. The browser sends the terminal first
|
|
11
|
+
* and re-sends its unacknowledged shards right after it (all `keepalive`), so they normally land within a
|
|
12
|
+
* second or two; when the tab closed right after End, no close follows to trigger assembly. A re-check
|
|
13
|
+
* that is still incomplete comes back `Deferred`, and the scheduler then arms the forced-`Partial` grace.
|
|
14
|
+
*/
|
|
15
|
+
export declare const FINAL_TERMINAL_RECHECK_MS = 5000;
|
|
16
|
+
/** The authenticated caller of a recording request. */
|
|
17
|
+
export interface RealtimeRecordingCaller {
|
|
18
|
+
ContextUser: UserInfo;
|
|
19
|
+
/** The read-write provider the ledger writes through (the ledger needs a SQL-capable provider). */
|
|
20
|
+
Provider: DatabaseProviderBase;
|
|
21
|
+
}
|
|
22
|
+
/** Dependencies of {@link CreateRealtimeRecordingRouter}; injectable so the routes can be tested without a database. */
|
|
23
|
+
export interface RealtimeRecordingRouterDeps {
|
|
24
|
+
/** The authenticated caller, or null (answered 401). */
|
|
25
|
+
ResolveCaller(req: Request): RealtimeRecordingCaller | null;
|
|
26
|
+
LoadOwnedSession: typeof LoadOwnedRealtimeSession;
|
|
27
|
+
/** The session conversation's per-session scope id, for the anonymous-guest half of the access decision. */
|
|
28
|
+
LoadConversationExternalID: typeof LoadSessionConversationExternalID;
|
|
29
|
+
/** The ledger for one request; `contextUser` is the caller (used for logging by the procs). */
|
|
30
|
+
CreateLedger(provider: DatabaseProviderBase, contextUser: UserInfo): IRealtimeRecordingLedger;
|
|
31
|
+
Scheduler: IRecordingAssemblyScheduler;
|
|
32
|
+
/** Grace before an incomplete recording is assembled as `Partial`. */
|
|
33
|
+
GraceMs: () => number;
|
|
34
|
+
/**
|
|
35
|
+
* The server's system user, or null when it is not available. Deciding whether a recording is ready
|
|
36
|
+
* reads the shard entity, which callers (UI users, widget guests) deliberately cannot read; that read
|
|
37
|
+
* is the server's own scheduling decision, made after the caller was authorized, so it runs as this
|
|
38
|
+
* user. With none, nothing is scheduled and the session janitor assembles the recording.
|
|
39
|
+
*/
|
|
40
|
+
SystemUser: () => UserInfo | null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds the router for the shard and terminal routes (see the file overview). Status codes: 200 on
|
|
44
|
+
* success (`{ stored, duplicate }` / `{ accepted, ignored }`), 400 bad params or shard format, 401 no
|
|
45
|
+
* caller, 403 not the owner, 404 no such session, 409 same shard index with different bytes, 413 body
|
|
46
|
+
* over the cap, 500 unexpected (logged).
|
|
47
|
+
*/
|
|
48
|
+
export declare function CreateRealtimeRecordingRouter(deps: RealtimeRecordingRouterDeps): Router;
|
|
49
|
+
//# sourceMappingURL=RealtimeRecordingHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RealtimeRecordingHandler.d.ts","sourceRoot":"","sources":["../../src/rest/RealtimeRecordingHandler.ts"],"names":[],"mappings":"AAwBA,OAAgB,EAAqB,KAAK,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAM3F,OAAO,EAAuB,KAAK,wBAAwB,EAA0B,MAAM,2BAA2B,CAAC;AACvH,OAAO,EACH,wBAAwB,EAC3B,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AACrG,OAAO,EAA0B,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AAEjH,oGAAoG;AACpG,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;AAgBnE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAK9C,uDAAuD;AACvD,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,QAAQ,CAAC;IACtB,mGAAmG;IACnG,QAAQ,EAAE,oBAAoB,CAAC;CAClC;AAED,wHAAwH;AACxH,MAAM,WAAW,2BAA2B;IACxC,wDAAwD;IACxD,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI,CAAC;IAC5D,gBAAgB,EAAE,OAAO,wBAAwB,CAAC;IAClD,4GAA4G;IAC5G,0BAA0B,EAAE,OAAO,iCAAiC,CAAC;IACrE,+FAA+F;IAC/F,YAAY,CAAC,QAAQ,EAAE,oBAAoB,EAAE,WAAW,EAAE,QAAQ,GAAG,wBAAwB,CAAC;IAC9F,SAAS,EAAE,2BAA2B,CAAC;IACvC,sEAAsE;IACtE,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;CACrC;AAgBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,MAAM,CAiBvF"}
|