@memberjunction/server 6.1.0-edge.0 → 6.1.0-edge.2
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/auth/exampleNewUserSubClass.js +1 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +9 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +1 -1
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/newUsers.js +1 -1
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/context.js +2 -2
- package/dist/context.js.map +1 -1
- package/dist/generated/generated.d.ts +208 -646
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +1123 -3773
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +19 -3
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +51 -17
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -42
- package/dist/index.js.map +1 -1
- package/dist/logging/secretRedactor.d.ts +9 -0
- package/dist/logging/secretRedactor.d.ts.map +1 -1
- package/dist/logging/secretRedactor.js +39 -0
- package/dist/logging/secretRedactor.js.map +1 -1
- package/dist/middleware/BaseServerMiddleware.d.ts +5 -0
- package/dist/middleware/BaseServerMiddleware.d.ts.map +1 -1
- package/dist/middleware/BaseServerMiddleware.js +5 -0
- package/dist/middleware/BaseServerMiddleware.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +12 -0
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/EntityPermissionResolver.js +1 -1
- package/dist/resolvers/EntityPermissionResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +9 -0
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +3 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +10 -0
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +5 -0
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/SearchEntitiesResolver.js +1 -1
- package/dist/resolvers/SearchEntitiesResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +2 -2
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +85 -0
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -0
- package/dist/resolvers/TaskGraphFrameResolver.js +163 -0
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -0
- package/dist/resolvers/UserFavoriteResolver.js +1 -1
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +1 -1
- package/dist/rest/OAuthCallbackHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts +0 -4
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +1 -15
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/SignatureWebhookHandler.js +1 -1
- package/dist/rest/SignatureWebhookHandler.js.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.d.ts +26 -0
- package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -0
- package/dist/services/DurableEntityActionTaskSubmitter.js +55 -0
- package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -0
- package/dist/services/ScheduledJobsService.js +1 -1
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.d.ts +33 -0
- package/dist/services/StartTaskGraphDispatcher.d.ts.map +1 -0
- package/dist/services/StartTaskGraphDispatcher.js +46 -0
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -0
- package/dist/services/TaskGraphActionRunner.d.ts +34 -0
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -0
- package/dist/services/TaskGraphActionRunner.js +95 -0
- package/dist/services/TaskGraphActionRunner.js.map +1 -0
- package/dist/services/TaskGraphAgentRunner.d.ts +28 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -0
- package/dist/services/TaskGraphAgentRunner.js +104 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +70 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -0
- package/dist/services/TaskGraphContinuationDeliverer.js +162 -0
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -0
- package/dist/services/TaskGraphPromptRunner.d.ts +31 -0
- package/dist/services/TaskGraphPromptRunner.d.ts.map +1 -0
- package/dist/services/TaskGraphPromptRunner.js +134 -0
- package/dist/services/TaskGraphPromptRunner.js.map +1 -0
- package/dist/services/TaskGraphProviderFactory.d.ts +39 -0
- package/dist/services/TaskGraphProviderFactory.d.ts.map +1 -0
- package/dist/services/TaskGraphProviderFactory.js +28 -0
- package/dist/services/TaskGraphProviderFactory.js.map +1 -0
- package/dist/telephony/RingCentralTelephonyService.js +1 -1
- package/dist/telephony/RingCentralTelephonyService.js.map +1 -1
- package/dist/telephony/TwilioTelephonyRouter.js +1 -1
- package/dist/telephony/TwilioTelephonyRouter.js.map +1 -1
- package/dist/telephony/VonageTelephonyRouter.js +1 -1
- package/dist/telephony/VonageTelephonyRouter.js.map +1 -1
- package/package.json +92 -89
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +1 -1
- package/src/__tests__/ResolverBase.frozenRecordMapping.test.ts +133 -0
- package/src/__tests__/ResolverBase.transportMapping.test.ts +289 -0
- package/src/__tests__/SessionManager.test.ts +1 -1
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +249 -0
- package/src/__tests__/TaskGraphFrameResolver.test.ts +136 -0
- package/src/__tests__/WidgetSessionService.test.ts +1 -1
- package/src/__tests__/databaseAbstraction.test.ts +1 -1
- package/src/__tests__/magicLinkService.provisionLog.test.ts +1 -1
- package/src/__tests__/resolverBase.rls.test.ts +3 -0
- package/src/__tests__/secretRedactor.failOpen.test.ts +135 -0
- package/src/__tests__/widgetGuestElevation.test.ts +1 -1
- package/src/auth/exampleNewUserSubClass.ts +1 -1
- package/src/auth/index.ts +10 -6
- package/src/auth/magicLink/MagicLinkService.ts +1 -1
- package/src/auth/newUsers.ts +1 -1
- package/src/context.ts +2 -2
- package/src/generated/generated.ts +955 -2735
- package/src/generic/ResolverBase.ts +52 -17
- package/src/index.ts +108 -43
- package/src/logging/secretRedactor.ts +43 -0
- package/src/middleware/BaseServerMiddleware.ts +5 -0
- package/src/realtimeWidget/WidgetSessionService.ts +1 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +1 -1
- package/src/resolvers/ActionResolver.ts +13 -0
- package/src/resolvers/ComponentRegistryResolver.ts +1 -1
- package/src/resolvers/EntityPermissionResolver.ts +1 -1
- package/src/resolvers/IntegrationDiscoveryResolver.ts +12 -2
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/RealtimeClientSessionResolver.ts +13 -0
- package/src/resolvers/SearchEntitiesResolver.ts +1 -1
- package/src/resolvers/SqlLoggingConfigResolver.ts +1 -2
- package/src/resolvers/SyncRolesUsersResolver.ts +2 -2
- package/src/resolvers/TaskGraphFrameResolver.ts +160 -0
- package/src/resolvers/UserFavoriteResolver.ts +1 -1
- package/src/rest/OAuthCallbackHandler.ts +1 -1
- package/src/rest/RESTEndpointHandler.ts +1 -15
- package/src/rest/SignatureWebhookHandler.ts +1 -1
- package/src/services/DurableEntityActionTaskSubmitter.ts +78 -0
- package/src/services/ScheduledJobsService.ts +1 -1
- package/src/services/StartTaskGraphDispatcher.ts +78 -0
- package/src/services/TaskGraphActionRunner.ts +99 -0
- package/src/services/TaskGraphAgentRunner.ts +115 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +181 -0
- package/src/services/TaskGraphPromptRunner.ts +144 -0
- package/src/services/TaskGraphProviderFactory.ts +53 -0
- package/src/telephony/RingCentralTelephonyService.ts +1 -1
- package/src/telephony/TwilioTelephonyRouter.ts +1 -1
- package/src/telephony/VonageTelephonyRouter.ts +1 -1
- package/dist/resolvers/ReportResolver.d.ts +0 -24
- package/dist/resolvers/ReportResolver.d.ts.map +0 -1
- package/dist/resolvers/ReportResolver.js +0 -198
- package/dist/resolvers/ReportResolver.js.map +0 -1
- package/dist/resolvers/TaskResolver.d.ts +0 -31
- package/dist/resolvers/TaskResolver.d.ts.map +0 -1
- package/dist/resolvers/TaskResolver.js +0 -157
- package/dist/resolvers/TaskResolver.js.map +0 -1
- package/dist/services/TaskOrchestrator.d.ts +0 -130
- package/dist/services/TaskOrchestrator.d.ts.map +0 -1
- package/dist/services/TaskOrchestrator.js +0 -692
- package/dist/services/TaskOrchestrator.js.map +0 -1
- package/src/resolvers/ReportResolver.ts +0 -165
- package/src/resolvers/TaskResolver.ts +0 -148
- package/src/resolvers/__tests__/ReportResolver.test.ts +0 -279
- package/src/services/TaskOrchestrator.ts +0 -873
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskOrchestrator.js","sourceRoot":"","sources":["../../src/services/TaskOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { EntitySaveOptions, IRunReportProvider, Metadata, RunReport } from '@memberjunction/core';
|
|
2
|
-
import { Arg, Ctx, Field, Int, Mutation, ObjectType, Query, Resolver } from 'type-graphql';
|
|
3
|
-
import { AppContext } from '../types.js';
|
|
4
|
-
import { MJConversationDetailEntity, MJReportEntity } from '@memberjunction/core-entities';
|
|
5
|
-
import { DataContext } from '@memberjunction/data-context';
|
|
6
|
-
import { z } from 'zod';
|
|
7
|
-
import mssql from 'mssql';
|
|
8
|
-
import { GetReadOnlyProvider, GetReadWriteProvider } from '../util.js';
|
|
9
|
-
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
10
|
-
|
|
11
|
-
@ObjectType()
|
|
12
|
-
export class RunReportResultType {
|
|
13
|
-
@Field()
|
|
14
|
-
ReportID: string;
|
|
15
|
-
|
|
16
|
-
@Field()
|
|
17
|
-
Success: boolean;
|
|
18
|
-
|
|
19
|
-
@Field()
|
|
20
|
-
Results: string;
|
|
21
|
-
|
|
22
|
-
@Field()
|
|
23
|
-
RowCount: number;
|
|
24
|
-
|
|
25
|
-
@Field()
|
|
26
|
-
ExecutionTime: number;
|
|
27
|
-
|
|
28
|
-
@Field()
|
|
29
|
-
ErrorMessage: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@ObjectType()
|
|
33
|
-
export class CreateReportResultType {
|
|
34
|
-
@Field()
|
|
35
|
-
ReportID: string;
|
|
36
|
-
|
|
37
|
-
@Field()
|
|
38
|
-
ReportName: string;
|
|
39
|
-
|
|
40
|
-
@Field()
|
|
41
|
-
Success: boolean;
|
|
42
|
-
|
|
43
|
-
@Field()
|
|
44
|
-
ErrorMessage: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
@Resolver(RunReportResultType)
|
|
48
|
-
export class ReportResolverExtended extends ResolverBase {
|
|
49
|
-
@Query(() => RunReportResultType)
|
|
50
|
-
async GetReportData(@Arg('ReportID', () => String) ReportID: string, @Ctx() context: AppContext): Promise<RunReportResultType> {
|
|
51
|
-
// Check API key scope authorization for report run
|
|
52
|
-
await this.CheckAPIKeyScopeAuthorization('report:run', ReportID, context.userPayload);
|
|
53
|
-
|
|
54
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true});
|
|
55
|
-
const rp = new RunReport(provider as unknown as IRunReportProvider);
|
|
56
|
-
|
|
57
|
-
const result = await rp.RunReport({ ReportID: ReportID });
|
|
58
|
-
return {
|
|
59
|
-
ReportID: ReportID,
|
|
60
|
-
Success: result.Success,
|
|
61
|
-
Results: JSON.stringify(result.Results),
|
|
62
|
-
RowCount: result.RowCount,
|
|
63
|
-
ExecutionTime: result.ExecutionTime,
|
|
64
|
-
ErrorMessage: result.ErrorMessage,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* This mutation will create a new report from a conversation detail ID
|
|
70
|
-
*/
|
|
71
|
-
@Mutation(() => CreateReportResultType)
|
|
72
|
-
async CreateReportFromConversationDetailID(
|
|
73
|
-
@Arg('ConversationDetailID', () => String) ConversationDetailID: string,
|
|
74
|
-
@Ctx() { dataSource, userPayload, providers }: AppContext
|
|
75
|
-
): Promise<CreateReportResultType> {
|
|
76
|
-
// Check API key scope authorization for report creation (uses entity:create for Reports entity)
|
|
77
|
-
await this.CheckAPIKeyScopeAuthorization('entity:create', 'Reports', userPayload);
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
const md = GetReadWriteProvider(providers);
|
|
81
|
-
|
|
82
|
-
// Resolve via the stamped payload user (GetUserFromPayload), NOT a fresh UserCache
|
|
83
|
-
// lookup by email. UserCache.Users returns the shared, unstamped instance — re-fetching
|
|
84
|
-
// by email here would silently drop any per-request API-key row-filter binding
|
|
85
|
-
// (APIKeyRowFilters / APIKeyActingContext) already stamped onto userPayload.userRecord,
|
|
86
|
-
// so a filtered key's report-creation work would run unfiltered. GetUserFromPayload
|
|
87
|
-
// prefers userPayload.userRecord and only falls back to a UserCache email lookup when
|
|
88
|
-
// no payload user is present (e.g. non-request-scoped callers), matching every other
|
|
89
|
-
// resolver's contextUser resolution.
|
|
90
|
-
const u = this.GetUserFromPayload(userPayload);
|
|
91
|
-
if (!u) throw new Error('Unable to find user');
|
|
92
|
-
|
|
93
|
-
const cde = md.Entities.find((e) => e.Name === 'MJ: Conversation Details');
|
|
94
|
-
if (!cde) throw new Error('Unable to find Conversation Details Entity metadata');
|
|
95
|
-
|
|
96
|
-
const cd = md.Entities.find((e) => e.Name === 'MJ: Conversations');
|
|
97
|
-
if (!cd) throw new Error('Unable to find Conversations Entity metadata');
|
|
98
|
-
|
|
99
|
-
const sql = `SELECT
|
|
100
|
-
cd.Message, cd.ConversationID, c.DataContextID
|
|
101
|
-
FROM
|
|
102
|
-
${cde.SchemaName}.${cde.BaseView} cd
|
|
103
|
-
INNER JOIN
|
|
104
|
-
${cd.SchemaName}.${cd.BaseView} c
|
|
105
|
-
ON
|
|
106
|
-
cd.ConversationID = c.ID
|
|
107
|
-
WHERE
|
|
108
|
-
cd.ID=@ConversationDetailID`;
|
|
109
|
-
|
|
110
|
-
const request = new mssql.Request(dataSource);
|
|
111
|
-
request.input('ConversationDetailID', mssql.UniqueIdentifier, ConversationDetailID);
|
|
112
|
-
const result = await request.query(sql);
|
|
113
|
-
if (!result || !result.recordset || result.recordset.length === 0) throw new Error('Unable to retrieve converation details');
|
|
114
|
-
const skipData: { title?: string; reportTitle?: string; userExplanation?: string; messages?: unknown[] } = JSON.parse(result.recordset[0].Message);
|
|
115
|
-
|
|
116
|
-
const report = await md.GetEntityObject<MJReportEntity>('MJ: Reports', u);
|
|
117
|
-
report.NewRecord();
|
|
118
|
-
// support the legacy report title as old conversation details had a reportTitle property
|
|
119
|
-
// but the new SkipData object has a title property, so favor the title property
|
|
120
|
-
const title = skipData.title ? skipData.title : skipData.reportTitle ? skipData.reportTitle : 'Untitled Report';
|
|
121
|
-
report.Name = title;
|
|
122
|
-
report.Description = skipData.userExplanation ? skipData.userExplanation : '';
|
|
123
|
-
report.ConversationID = result.recordset[0].ConversationID;
|
|
124
|
-
report.ConversationDetailID = ConversationDetailID;
|
|
125
|
-
|
|
126
|
-
const dc: DataContext = new DataContext();
|
|
127
|
-
await dc.LoadMetadata(result.recordset[0].DataContextID, u);
|
|
128
|
-
const newDataContext = await DataContext.Clone(dc, false, u);
|
|
129
|
-
if (!newDataContext) throw new Error('Error cloning data context');
|
|
130
|
-
report.DataContextID = newDataContext.ID;
|
|
131
|
-
|
|
132
|
-
// next, strip out the messags from the SkipData object to put them into our Report Configuration as we dont need to store that information as we have a
|
|
133
|
-
// link back to the conversation and conversation detail, skipData can be modified as it is a copy of the data doesn't affect the original source
|
|
134
|
-
skipData.messages = [];
|
|
135
|
-
report.Configuration = JSON.stringify(skipData);
|
|
136
|
-
|
|
137
|
-
report.SharingScope = 'None';
|
|
138
|
-
report.UserID = u.ID;
|
|
139
|
-
|
|
140
|
-
if (await report.Save()) {
|
|
141
|
-
return {
|
|
142
|
-
ReportID: report.ID,
|
|
143
|
-
ReportName: report.Name,
|
|
144
|
-
Success: true,
|
|
145
|
-
ErrorMessage: '',
|
|
146
|
-
};
|
|
147
|
-
} else {
|
|
148
|
-
return {
|
|
149
|
-
ReportID: '',
|
|
150
|
-
ReportName: '',
|
|
151
|
-
Success: false,
|
|
152
|
-
ErrorMessage: 'Unable to save new report',
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
} catch (ex) {
|
|
156
|
-
const err = z.object({ message: z.string() }).safeParse(ex);
|
|
157
|
-
return {
|
|
158
|
-
ReportID: '',
|
|
159
|
-
ReportName: '',
|
|
160
|
-
Success: false,
|
|
161
|
-
ErrorMessage: 'Unable to create new report: ' + err.success ? err.data.message : String(ex),
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { Resolver, Mutation, Arg, Ctx, ObjectType, Field, PubSub, PubSubEngine } from 'type-graphql';
|
|
2
|
-
import { AppContext } from '../types.js';
|
|
3
|
-
import { IMetadataProvider, LogError, LogStatus } from '@memberjunction/core';
|
|
4
|
-
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
5
|
-
import { TaskOrchestrator, TaskGraphResponse, TaskExecutionResult } from '../services/TaskOrchestrator.js';
|
|
6
|
-
import { GetReadWriteProvider } from '../util.js';
|
|
7
|
-
|
|
8
|
-
@ObjectType()
|
|
9
|
-
export class TaskExecutionResultType {
|
|
10
|
-
@Field()
|
|
11
|
-
taskId: string;
|
|
12
|
-
|
|
13
|
-
@Field()
|
|
14
|
-
success: boolean;
|
|
15
|
-
|
|
16
|
-
@Field({ nullable: true })
|
|
17
|
-
output?: string;
|
|
18
|
-
|
|
19
|
-
@Field({ nullable: true })
|
|
20
|
-
error?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@ObjectType()
|
|
24
|
-
export class ExecuteTaskGraphResult {
|
|
25
|
-
@Field()
|
|
26
|
-
success: boolean;
|
|
27
|
-
|
|
28
|
-
@Field({ nullable: true })
|
|
29
|
-
errorMessage?: string;
|
|
30
|
-
|
|
31
|
-
@Field(() => [TaskExecutionResultType])
|
|
32
|
-
results: TaskExecutionResultType[];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* TaskOrchestrationResolver handles multi-step task orchestration.
|
|
37
|
-
* This resolver is called when the Conversation Manager returns a task graph
|
|
38
|
-
* for complex workflows that require multiple agents working in sequence or parallel.
|
|
39
|
-
*/
|
|
40
|
-
@Resolver()
|
|
41
|
-
export class TaskOrchestrationResolver extends ResolverBase {
|
|
42
|
-
/**
|
|
43
|
-
* Execute a task graph from the Conversation Manager.
|
|
44
|
-
* This creates tasks in the database, manages dependencies, and executes them in proper order.
|
|
45
|
-
*
|
|
46
|
-
* @param taskGraphJson - JSON string containing the task graph from Conversation Manager
|
|
47
|
-
* @param conversationDetailId - ID of the conversation detail that triggered this workflow
|
|
48
|
-
* @param environmentId - Environment ID for the tasks
|
|
49
|
-
*/
|
|
50
|
-
@Mutation(() => ExecuteTaskGraphResult)
|
|
51
|
-
async ExecuteTaskGraph(
|
|
52
|
-
@Arg('taskGraphJson') taskGraphJson: string,
|
|
53
|
-
@Arg('conversationDetailId') conversationDetailId: string,
|
|
54
|
-
@Arg('environmentId') environmentId: string,
|
|
55
|
-
@Arg('sessionId') sessionId: string,
|
|
56
|
-
@PubSub() pubSub: PubSubEngine,
|
|
57
|
-
@Ctx() { userPayload, providers }: AppContext,
|
|
58
|
-
@Arg('createNotifications', { nullable: true }) createNotifications?: boolean
|
|
59
|
-
): Promise<ExecuteTaskGraphResult> {
|
|
60
|
-
// Check API key scope authorization for task execution
|
|
61
|
-
await this.CheckAPIKeyScopeAuthorization('task:execute', '*', userPayload);
|
|
62
|
-
|
|
63
|
-
try {
|
|
64
|
-
LogStatus(`=== EXECUTING TASK GRAPH FOR CONVERSATION: ${conversationDetailId} ===`);
|
|
65
|
-
|
|
66
|
-
// Parse task graph
|
|
67
|
-
const taskGraph: TaskGraphResponse = JSON.parse(taskGraphJson);
|
|
68
|
-
|
|
69
|
-
// Validate task graph
|
|
70
|
-
if (!taskGraph.workflowName || !taskGraph.tasks || taskGraph.tasks.length === 0) {
|
|
71
|
-
throw new Error('Invalid task graph: must have workflowName and at least one task');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Get current user
|
|
75
|
-
const currentUser = this.GetUserFromPayload(userPayload);
|
|
76
|
-
if (!currentUser) {
|
|
77
|
-
throw new Error('Unable to determine current user');
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
LogStatus(`Workflow: ${taskGraph.workflowName} (${taskGraph.tasks.length} tasks)`);
|
|
81
|
-
if (taskGraph.reasoning) {
|
|
82
|
-
LogStatus(`Reasoning: ${taskGraph.reasoning}`);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Create task orchestrator with PubSub for progress updates
|
|
86
|
-
const provider = GetReadWriteProvider(providers, { allowFallbackToReadOnly: true }) as unknown as IMetadataProvider;
|
|
87
|
-
const orchestrator = new TaskOrchestrator(currentUser, pubSub, sessionId, userPayload, createNotifications || false, conversationDetailId, provider);
|
|
88
|
-
|
|
89
|
-
// Create parent task and child tasks with dependencies
|
|
90
|
-
const { parentTaskId, taskIdMap } = await orchestrator.createTasksFromGraph(
|
|
91
|
-
taskGraph,
|
|
92
|
-
conversationDetailId,
|
|
93
|
-
environmentId
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
LogStatus(`Created parent task ${parentTaskId} with ${taskIdMap.size} child tasks`);
|
|
97
|
-
|
|
98
|
-
// Execute tasks in proper order
|
|
99
|
-
const results = await orchestrator.executeTasksForParent(
|
|
100
|
-
parentTaskId
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
// Log results
|
|
104
|
-
const successCount = results.filter(r => r.success).length;
|
|
105
|
-
LogStatus(`Completed ${successCount} of ${results.length} tasks successfully`);
|
|
106
|
-
|
|
107
|
-
for (const result of results) {
|
|
108
|
-
if (result.success) {
|
|
109
|
-
LogStatus(`✅ Task ${result.taskId} completed successfully`);
|
|
110
|
-
} else {
|
|
111
|
-
LogError(`❌ Task ${result.taskId} failed: ${result.error}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Convert results to GraphQL types
|
|
116
|
-
const graphqlResults: TaskExecutionResultType[] = results.map(r => ({
|
|
117
|
-
taskId: r.taskId,
|
|
118
|
-
success: r.success,
|
|
119
|
-
output: r.output ? JSON.stringify(r.output) : undefined,
|
|
120
|
-
error: r.error
|
|
121
|
-
}));
|
|
122
|
-
|
|
123
|
-
LogStatus(`=== TASK GRAPH EXECUTION COMPLETE ===`);
|
|
124
|
-
|
|
125
|
-
const result = {
|
|
126
|
-
success: true,
|
|
127
|
-
results: graphqlResults
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
LogStatus(`Returning ExecuteTaskGraph result: ${JSON.stringify({
|
|
131
|
-
success: result.success,
|
|
132
|
-
resultsCount: result.results.length,
|
|
133
|
-
firstResult: result.results[0]
|
|
134
|
-
})}`);
|
|
135
|
-
|
|
136
|
-
return result;
|
|
137
|
-
|
|
138
|
-
} catch (error) {
|
|
139
|
-
LogError(`Task graph execution failed:`, undefined, error);
|
|
140
|
-
|
|
141
|
-
return {
|
|
142
|
-
success: false,
|
|
143
|
-
errorMessage: (error as Error).message || 'Unknown error occurred',
|
|
144
|
-
results: []
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for ReportResolverExtended.CreateReportFromConversationDetailID.
|
|
3
|
-
*
|
|
4
|
-
* Regression coverage for a SQL injection fix: ConversationDetailID (a plain GraphQL
|
|
5
|
-
* String arg) used to be interpolated directly into the WHERE clause. It is now bound
|
|
6
|
-
* via mssql's parameterized `request.input(...)`, so a hostile value must never appear
|
|
7
|
-
* spliced into the executed SQL text, and query structure must stay identical regardless
|
|
8
|
-
* of what the value contains.
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
11
|
-
|
|
12
|
-
// ─── Hoisted mocks ────────────────────────────────────────────────────────
|
|
13
|
-
const { mockUserCacheUsers, mssqlState } = vi.hoisted(() => ({
|
|
14
|
-
mockUserCacheUsers: [] as Array<{ Email: string; ID: string }>,
|
|
15
|
-
mssqlState: {
|
|
16
|
-
inputCalls: [] as Array<{ name: string; type: unknown; value: unknown }>,
|
|
17
|
-
queryCalls: [] as string[],
|
|
18
|
-
poolArgs: [] as unknown[],
|
|
19
|
-
recordset: [] as Array<Record<string, unknown>>,
|
|
20
|
-
},
|
|
21
|
-
}));
|
|
22
|
-
|
|
23
|
-
// Stub external deps before imports (mirrors resolverBase.rls.test.ts)
|
|
24
|
-
vi.mock('@memberjunction/sqlserver-dataprovider', () => ({
|
|
25
|
-
SQLServerDataProvider: class {},
|
|
26
|
-
UserCache: {
|
|
27
|
-
get Users() { return mockUserCacheUsers; },
|
|
28
|
-
},
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
|
-
vi.mock('cloudevents', () => ({
|
|
32
|
-
CloudEvent: class {},
|
|
33
|
-
httpTransport: () => () => undefined,
|
|
34
|
-
emitterFor: () => () => undefined,
|
|
35
|
-
}));
|
|
36
|
-
|
|
37
|
-
vi.mock('type-graphql', () => ({
|
|
38
|
-
Resolver: () => () => undefined,
|
|
39
|
-
Mutation: () => () => undefined,
|
|
40
|
-
Query: () => () => undefined,
|
|
41
|
-
Subscription: () => () => undefined,
|
|
42
|
-
Ctx: () => () => undefined,
|
|
43
|
-
Arg: () => () => undefined,
|
|
44
|
-
PubSub: () => () => undefined,
|
|
45
|
-
Root: () => () => undefined,
|
|
46
|
-
ObjectType: () => () => undefined,
|
|
47
|
-
InputType: () => () => undefined,
|
|
48
|
-
Field: () => () => undefined,
|
|
49
|
-
FieldResolver: () => () => undefined,
|
|
50
|
-
Int: () => undefined,
|
|
51
|
-
Float: () => undefined,
|
|
52
|
-
registerEnumType: () => undefined,
|
|
53
|
-
}));
|
|
54
|
-
|
|
55
|
-
vi.mock('graphql', () => ({
|
|
56
|
-
GraphQLError: class extends Error {
|
|
57
|
-
constructor(msg: string) { super(msg); }
|
|
58
|
-
},
|
|
59
|
-
}));
|
|
60
|
-
|
|
61
|
-
vi.mock('mssql', () => {
|
|
62
|
-
const UniqueIdentifier = { __marker: 'UniqueIdentifier' };
|
|
63
|
-
class Request {
|
|
64
|
-
constructor(pool: unknown) {
|
|
65
|
-
mssqlState.poolArgs.push(pool);
|
|
66
|
-
}
|
|
67
|
-
input(name: string, type: unknown, value: unknown) {
|
|
68
|
-
mssqlState.inputCalls.push({ name, type, value });
|
|
69
|
-
}
|
|
70
|
-
async query(sql: string) {
|
|
71
|
-
mssqlState.queryCalls.push(sql);
|
|
72
|
-
return { recordset: mssqlState.recordset };
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return { default: { Request, UniqueIdentifier }, Request, UniqueIdentifier };
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
vi.mock('@memberjunction/data-context', () => {
|
|
79
|
-
class DataContext {
|
|
80
|
-
LoadMetadata = vi.fn(async () => true);
|
|
81
|
-
}
|
|
82
|
-
(DataContext as unknown as { Clone: unknown }).Clone = vi.fn(async () => ({ ID: 'dctx-clone-1' }));
|
|
83
|
-
return { DataContext };
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
vi.mock('@memberjunction/api-keys', () => ({
|
|
87
|
-
GetAPIKeyEngine: vi.fn(),
|
|
88
|
-
}));
|
|
89
|
-
|
|
90
|
-
vi.mock('@memberjunction/encryption', () => ({
|
|
91
|
-
EncryptionEngine: { Instance: {} },
|
|
92
|
-
}));
|
|
93
|
-
|
|
94
|
-
vi.mock('@memberjunction/graphql-dataprovider', () => ({
|
|
95
|
-
FieldMapper: class { static Instance = { MapFieldsFromCodeNamesToDBNames: vi.fn() }; },
|
|
96
|
-
}));
|
|
97
|
-
|
|
98
|
-
vi.mock('../../generic/PubSubManager.js', () => ({
|
|
99
|
-
PubSubManager: class { static Instance = { publish: vi.fn() }; },
|
|
100
|
-
}));
|
|
101
|
-
|
|
102
|
-
vi.mock('../../generic/PushStatusResolver.js', () => ({
|
|
103
|
-
PUSH_STATUS_UPDATES_TOPIC: 'test-push-topic',
|
|
104
|
-
PushStatusNotification: class {},
|
|
105
|
-
PushStatusResolver: class {},
|
|
106
|
-
}));
|
|
107
|
-
|
|
108
|
-
vi.mock('../../generic/CacheInvalidationResolver.js', () => ({
|
|
109
|
-
CACHE_INVALIDATION_TOPIC: 'test-cache-topic',
|
|
110
|
-
}));
|
|
111
|
-
|
|
112
|
-
vi.mock('../../generic/RunViewResolver.js', () => ({
|
|
113
|
-
RunViewByIDInput: class {},
|
|
114
|
-
RunViewByNameInput: class {},
|
|
115
|
-
RunDynamicViewInput: class {},
|
|
116
|
-
}));
|
|
117
|
-
|
|
118
|
-
vi.mock('../../generic/DeleteOptionsInput.js', () => ({
|
|
119
|
-
DeleteOptionsInput: class {},
|
|
120
|
-
}));
|
|
121
|
-
|
|
122
|
-
vi.mock('../../types.js', () => ({
|
|
123
|
-
RunViewGenericParams: class {},
|
|
124
|
-
}));
|
|
125
|
-
|
|
126
|
-
vi.mock('@memberjunction/core', async () => {
|
|
127
|
-
const actual = await vi.importActual<typeof import('@memberjunction/core')>('@memberjunction/core');
|
|
128
|
-
return {
|
|
129
|
-
...actual,
|
|
130
|
-
LogError: vi.fn(),
|
|
131
|
-
LogStatus: vi.fn(),
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
vi.mock('@memberjunction/core-entities', () => ({}));
|
|
136
|
-
|
|
137
|
-
// ─── Import after mocks ──────────────────────────────────────────────────
|
|
138
|
-
import { ReportResolverExtended } from '../ReportResolver';
|
|
139
|
-
|
|
140
|
-
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
141
|
-
|
|
142
|
-
function makeReportEntity() {
|
|
143
|
-
return {
|
|
144
|
-
ID: 'report-1',
|
|
145
|
-
Name: '',
|
|
146
|
-
Description: '',
|
|
147
|
-
ConversationID: '',
|
|
148
|
-
ConversationDetailID: '',
|
|
149
|
-
DataContextID: '',
|
|
150
|
-
Configuration: '',
|
|
151
|
-
SharingScope: '',
|
|
152
|
-
UserID: '',
|
|
153
|
-
NewRecord: vi.fn(),
|
|
154
|
-
Save: vi.fn(async () => true),
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function makeContext(
|
|
159
|
-
getEntityObject: () => ReturnType<typeof makeReportEntity>,
|
|
160
|
-
userPayload: Record<string, unknown> = { email: 'test@example.com' } // no apiKeyHash -> scope check no-ops
|
|
161
|
-
) {
|
|
162
|
-
const getEntityObjectSpy = vi.fn(async (_name: string, _contextUser: unknown) => getEntityObject());
|
|
163
|
-
const md = {
|
|
164
|
-
Entities: [
|
|
165
|
-
{ Name: 'MJ: Conversation Details', SchemaName: 'dbo', BaseView: 'vwConversationDetails' },
|
|
166
|
-
{ Name: 'MJ: Conversations', SchemaName: 'dbo', BaseView: 'vwConversations' },
|
|
167
|
-
],
|
|
168
|
-
GetEntityObject: getEntityObjectSpy,
|
|
169
|
-
};
|
|
170
|
-
return {
|
|
171
|
-
context: {
|
|
172
|
-
dataSource: { __fakePool: true },
|
|
173
|
-
userPayload,
|
|
174
|
-
providers: [{ type: 'Read-Write', provider: md }],
|
|
175
|
-
} as unknown as Parameters<ReportResolverExtended['CreateReportFromConversationDetailID']>[1],
|
|
176
|
-
getEntityObjectSpy,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
describe('ReportResolverExtended.CreateReportFromConversationDetailID', () => {
|
|
181
|
-
let resolver: ReportResolverExtended;
|
|
182
|
-
|
|
183
|
-
beforeEach(() => {
|
|
184
|
-
resolver = new ReportResolverExtended();
|
|
185
|
-
mssqlState.inputCalls.length = 0;
|
|
186
|
-
mssqlState.queryCalls.length = 0;
|
|
187
|
-
mssqlState.poolArgs.length = 0;
|
|
188
|
-
mssqlState.recordset.length = 0;
|
|
189
|
-
mssqlState.recordset.push({
|
|
190
|
-
Message: JSON.stringify({ title: 'Test Report', userExplanation: 'exp' }),
|
|
191
|
-
ConversationID: 'conv-1',
|
|
192
|
-
DataContextID: 'dctx-1',
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
mockUserCacheUsers.length = 0;
|
|
196
|
-
mockUserCacheUsers.push({ Email: 'test@example.com', ID: 'user-1' });
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('binds ConversationDetailID as a query parameter rather than splicing it into the SQL text', async () => {
|
|
200
|
-
const maliciousID = "1'; DROP TABLE MJ_Reports; --";
|
|
201
|
-
const { context } = makeContext(makeReportEntity);
|
|
202
|
-
|
|
203
|
-
const result = await resolver.CreateReportFromConversationDetailID(maliciousID, context);
|
|
204
|
-
|
|
205
|
-
expect(result.Success).toBe(true);
|
|
206
|
-
|
|
207
|
-
// The query text must use a bound parameter, never the raw value.
|
|
208
|
-
expect(mssqlState.queryCalls).toHaveLength(1);
|
|
209
|
-
expect(mssqlState.queryCalls[0]).toContain('@ConversationDetailID');
|
|
210
|
-
expect(mssqlState.queryCalls[0]).not.toContain(maliciousID);
|
|
211
|
-
expect(mssqlState.queryCalls[0]).not.toContain('DROP TABLE');
|
|
212
|
-
|
|
213
|
-
// The value must be bound through request.input, not string concatenation.
|
|
214
|
-
expect(mssqlState.inputCalls).toHaveLength(1);
|
|
215
|
-
expect(mssqlState.inputCalls[0].name).toBe('ConversationDetailID');
|
|
216
|
-
expect(mssqlState.inputCalls[0].value).toBe(maliciousID);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it('does not alter query structure for values containing quotes, --, or OR 1=1', async () => {
|
|
220
|
-
const hostileID = "abc' OR '1'='1' --";
|
|
221
|
-
const { context } = makeContext(makeReportEntity);
|
|
222
|
-
|
|
223
|
-
await resolver.CreateReportFromConversationDetailID(hostileID, context);
|
|
224
|
-
|
|
225
|
-
expect(mssqlState.queryCalls[0]).toMatch(/WHERE\s+cd\.ID=@ConversationDetailID\s*$/);
|
|
226
|
-
expect(mssqlState.inputCalls[0].value).toBe(hostileID);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it('still succeeds end to end for a normal GUID-shaped value', async () => {
|
|
230
|
-
const normalID = '12345678-1234-1234-1234-123456789012';
|
|
231
|
-
const { context } = makeContext(makeReportEntity);
|
|
232
|
-
|
|
233
|
-
const result = await resolver.CreateReportFromConversationDetailID(normalID, context);
|
|
234
|
-
|
|
235
|
-
expect(result.Success).toBe(true);
|
|
236
|
-
expect(result.ReportName).toBe('Test Report');
|
|
237
|
-
expect(mssqlState.inputCalls[0].value).toBe(normalID);
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
// §5.6 row 11 — the operating user must come from the stamped payload user
|
|
241
|
-
// (GetUserFromPayload), never a fresh UserCache lookup by email. A fresh lookup would
|
|
242
|
-
// silently drop any per-request API-key row-filter binding (APIKeyRowFilters /
|
|
243
|
-
// APIKeyActingContext) already stamped onto userPayload.userRecord, so a filtered key's
|
|
244
|
-
// report-creation work would run unfiltered.
|
|
245
|
-
describe('operating user resolution (§5.6 row 11)', () => {
|
|
246
|
-
it('uses userPayload.userRecord (with its stamped bindings) when present, not a fresh UserCache lookup', async () => {
|
|
247
|
-
const stampedUser = {
|
|
248
|
-
ID: 'user-1',
|
|
249
|
-
Email: 'test@example.com',
|
|
250
|
-
APIKeyRowFilters: [{ EntityID: 'e1', PermissionType: 'Create', FilterID: 'f1' }],
|
|
251
|
-
};
|
|
252
|
-
// A DIFFERENT UserCache entry for the same email — if the resolver fell back to a
|
|
253
|
-
// UserCache lookup, it would get THIS unstamped object instead.
|
|
254
|
-
mockUserCacheUsers.length = 0;
|
|
255
|
-
mockUserCacheUsers.push({ Email: 'test@example.com', ID: 'user-1' });
|
|
256
|
-
|
|
257
|
-
const { context, getEntityObjectSpy } = makeContext(makeReportEntity, {
|
|
258
|
-
email: 'test@example.com',
|
|
259
|
-
userRecord: stampedUser,
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
const result = await resolver.CreateReportFromConversationDetailID('12345678-1234-1234-1234-123456789012', context);
|
|
263
|
-
|
|
264
|
-
expect(result.Success).toBe(true);
|
|
265
|
-
// GetEntityObject's contextUser must be the SAME stamped object reference — proving
|
|
266
|
-
// the row-filter binding flows through to the entity work, not a fresh, unstamped one.
|
|
267
|
-
expect(getEntityObjectSpy.mock.calls[0][1]).toBe(stampedUser);
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
it('falls back to a UserCache lookup by email when no payload user is present', async () => {
|
|
271
|
-
const { context, getEntityObjectSpy } = makeContext(makeReportEntity, { email: 'test@example.com' });
|
|
272
|
-
|
|
273
|
-
const result = await resolver.CreateReportFromConversationDetailID('12345678-1234-1234-1234-123456789012', context);
|
|
274
|
-
|
|
275
|
-
expect(result.Success).toBe(true);
|
|
276
|
-
expect((getEntityObjectSpy.mock.calls[0][1] as { ID: string }).ID).toBe('user-1');
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
});
|