@memberjunction/server 2.111.0 → 2.112.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skip-agent.d.ts +4 -4
- package/dist/agents/skip-agent.d.ts.map +1 -1
- package/dist/agents/skip-agent.js +808 -951
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/agents/skip-sdk.d.ts +1 -1
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +53 -43
- package/dist/agents/skip-sdk.js.map +1 -1
- package/dist/apolloServer/index.js +1 -1
- package/dist/auth/AuthProviderFactory.d.ts +1 -1
- package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
- package/dist/auth/AuthProviderFactory.js +1 -3
- package/dist/auth/AuthProviderFactory.js.map +1 -1
- package/dist/auth/BaseAuthProvider.d.ts +1 -1
- package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/BaseAuthProvider.js +3 -2
- package/dist/auth/BaseAuthProvider.js.map +1 -1
- package/dist/auth/IAuthProvider.d.ts +1 -1
- package/dist/auth/IAuthProvider.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.js +1 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +6 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.js +1 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/newUsers.d.ts +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +7 -7
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/auth/providers/Auth0Provider.js +1 -1
- package/dist/auth/providers/Auth0Provider.js.map +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/auth/providers/CognitoProvider.js +3 -6
- package/dist/auth/providers/CognitoProvider.js.map +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
- package/dist/auth/providers/GoogleProvider.js +1 -1
- package/dist/auth/providers/GoogleProvider.js.map +1 -1
- package/dist/auth/providers/MSALProvider.d.ts +1 -1
- package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
- package/dist/auth/providers/MSALProvider.js +1 -1
- package/dist/auth/providers/MSALProvider.js.map +1 -1
- package/dist/auth/providers/OktaProvider.d.ts +1 -1
- package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
- package/dist/auth/providers/OktaProvider.js +1 -1
- package/dist/auth/providers/OktaProvider.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -10
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +9 -7
- package/dist/context.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +648 -648
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2986 -1133
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
- package/dist/generic/KeyInputOutputTypes.js +1 -1
- package/dist/generic/KeyInputOutputTypes.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +15 -10
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +15 -15
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +2 -2
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +28 -30
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +2 -2
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +60 -50
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +36 -38
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +43 -40
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +1 -1
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityResolver.js +1 -1
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -1
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +1 -1
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +5 -5
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +8 -6
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +3 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +11 -11
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.js +1 -1
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +27 -28
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +31 -31
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +9 -9
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +15 -14
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +48 -44
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskResolver.js +7 -7
- package/dist/resolvers/TaskResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +12 -12
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +1 -1
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +14 -16
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +23 -25
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +17 -21
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
- package/dist/services/ScheduledJobsService.d.ts.map +1 -1
- package/dist/services/ScheduledJobsService.js +4 -6
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/TaskOrchestrator.d.ts +1 -1
- package/dist/services/TaskOrchestrator.d.ts.map +1 -1
- package/dist/services/TaskOrchestrator.js +30 -30
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/package.json +36 -37
- package/src/agents/skip-agent.ts +1067 -1200
- package/src/agents/skip-sdk.ts +877 -851
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +8 -14
- package/src/auth/BaseAuthProvider.ts +5 -4
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +9 -2
- package/src/auth/index.ts +31 -26
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +166 -134
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +7 -10
- package/src/auth/providers/GoogleProvider.ts +4 -5
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +6 -7
- package/src/config.ts +63 -54
- package/src/context.ts +42 -30
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +48130 -39930
- package/src/generic/KeyInputOutputTypes.ts +3 -6
- package/src/generic/ResolverBase.ts +119 -78
- package/src/generic/RunViewResolver.ts +27 -23
- package/src/index.ts +66 -42
- package/src/resolvers/ActionResolver.ts +46 -57
- package/src/resolvers/AskSkipResolver.ts +607 -533
- package/src/resolvers/ComponentRegistryResolver.ts +547 -562
- package/src/resolvers/CreateQueryResolver.ts +683 -655
- package/src/resolvers/DatasetResolver.ts +5 -6
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +9 -5
- package/src/resolvers/EntityResolver.ts +9 -7
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +106 -118
- package/src/resolvers/GetDataResolver.ts +194 -205
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +95 -78
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +818 -828
- package/src/resolvers/RunAIPromptResolver.ts +693 -709
- package/src/resolvers/RunTemplateResolver.ts +105 -103
- package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
- package/src/resolvers/SyncDataResolver.ts +386 -352
- package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
- package/src/resolvers/TaskResolver.ts +110 -115
- package/src/resolvers/TransactionGroupResolver.ts +143 -138
- package/src/resolvers/UserFavoriteResolver.ts +17 -8
- package/src/resolvers/UserViewResolver.ts +17 -12
- package/src/rest/EntityCRUDHandler.ts +291 -268
- package/src/rest/RESTEndpointHandler.ts +782 -776
- package/src/rest/ViewOperationsHandler.ts +191 -195
- package/src/scheduler/LearningCycleScheduler.ts +8 -52
- package/src/services/ScheduledJobsService.ts +129 -132
- package/src/services/TaskOrchestrator.ts +792 -776
- package/src/types.ts +15 -9
- package/src/util.ts +112 -109
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import { Resolver, Mutation, Arg, Ctx, ObjectType, Field, PubSub, PubSubEngine } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { LogError, LogStatus } from '@memberjunction/
|
|
3
|
+
import { LogError, LogStatus } from '@memberjunction/global';
|
|
4
4
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
5
5
|
import { TaskOrchestrator, TaskGraphResponse, TaskExecutionResult } from '../services/TaskOrchestrator.js';
|
|
6
6
|
|
|
7
7
|
@ObjectType()
|
|
8
8
|
export class TaskExecutionResultType {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
@Field()
|
|
10
|
+
taskId: string;
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
@Field()
|
|
13
|
+
success: boolean;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
@Field({ nullable: true })
|
|
16
|
+
output?: string;
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
@Field({ nullable: true })
|
|
19
|
+
error?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
@ObjectType()
|
|
23
23
|
export class ExecuteTaskGraphResult {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
@Field()
|
|
25
|
+
success: boolean;
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
@Field({ nullable: true })
|
|
28
|
+
errorMessage?: string;
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
@Field(() => [TaskExecutionResultType])
|
|
31
|
+
results: TaskExecutionResultType[];
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -38,106 +38,101 @@ export class ExecuteTaskGraphResult {
|
|
|
38
38
|
*/
|
|
39
39
|
@Resolver()
|
|
40
40
|
export class TaskOrchestrationResolver extends ResolverBase {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
for (const result of results) {
|
|
103
|
-
if (result.success) {
|
|
104
|
-
LogStatus(`✅ Task ${result.taskId} completed successfully`);
|
|
105
|
-
} else {
|
|
106
|
-
LogError(`❌ Task ${result.taskId} failed: ${result.error}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Convert results to GraphQL types
|
|
111
|
-
const graphqlResults: TaskExecutionResultType[] = results.map(r => ({
|
|
112
|
-
taskId: r.taskId,
|
|
113
|
-
success: r.success,
|
|
114
|
-
output: r.output ? JSON.stringify(r.output) : undefined,
|
|
115
|
-
error: r.error
|
|
116
|
-
}));
|
|
117
|
-
|
|
118
|
-
LogStatus(`=== TASK GRAPH EXECUTION COMPLETE ===`);
|
|
119
|
-
|
|
120
|
-
const result = {
|
|
121
|
-
success: true,
|
|
122
|
-
results: graphqlResults
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
LogStatus(`Returning ExecuteTaskGraph result: ${JSON.stringify({
|
|
126
|
-
success: result.success,
|
|
127
|
-
resultsCount: result.results.length,
|
|
128
|
-
firstResult: result.results[0]
|
|
129
|
-
})}`);
|
|
130
|
-
|
|
131
|
-
return result;
|
|
132
|
-
|
|
133
|
-
} catch (error) {
|
|
134
|
-
LogError(`Task graph execution failed:`, undefined, error);
|
|
135
|
-
|
|
136
|
-
return {
|
|
137
|
-
success: false,
|
|
138
|
-
errorMessage: (error as Error).message || 'Unknown error occurred',
|
|
139
|
-
results: []
|
|
140
|
-
};
|
|
41
|
+
/**
|
|
42
|
+
* Execute a task graph from the Conversation Manager.
|
|
43
|
+
* This creates tasks in the database, manages dependencies, and executes them in proper order.
|
|
44
|
+
*
|
|
45
|
+
* @param taskGraphJson - JSON string containing the task graph from Conversation Manager
|
|
46
|
+
* @param conversationDetailId - ID of the conversation detail that triggered this workflow
|
|
47
|
+
* @param environmentId - Environment ID for the tasks
|
|
48
|
+
*/
|
|
49
|
+
@Mutation(() => ExecuteTaskGraphResult)
|
|
50
|
+
async ExecuteTaskGraph(
|
|
51
|
+
@Arg('taskGraphJson') taskGraphJson: string,
|
|
52
|
+
@Arg('conversationDetailId') conversationDetailId: string,
|
|
53
|
+
@Arg('environmentId') environmentId: string,
|
|
54
|
+
@Arg('sessionId') sessionId: string,
|
|
55
|
+
@PubSub() pubSub: PubSubEngine,
|
|
56
|
+
@Ctx() { userPayload }: AppContext,
|
|
57
|
+
@Arg('createNotifications', { nullable: true }) createNotifications?: boolean
|
|
58
|
+
): Promise<ExecuteTaskGraphResult> {
|
|
59
|
+
try {
|
|
60
|
+
LogStatus(`=== EXECUTING TASK GRAPH FOR CONVERSATION: ${conversationDetailId} ===`);
|
|
61
|
+
|
|
62
|
+
// Parse task graph
|
|
63
|
+
const taskGraph: TaskGraphResponse = JSON.parse(taskGraphJson);
|
|
64
|
+
|
|
65
|
+
// Validate task graph
|
|
66
|
+
if (!taskGraph.workflowName || !taskGraph.tasks || taskGraph.tasks.length === 0) {
|
|
67
|
+
throw new Error('Invalid task graph: must have workflowName and at least one task');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Get current user
|
|
71
|
+
const currentUser = this.GetUserFromPayload(userPayload);
|
|
72
|
+
if (!currentUser) {
|
|
73
|
+
throw new Error('Unable to determine current user');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
LogStatus(`Workflow: ${taskGraph.workflowName} (${taskGraph.tasks.length} tasks)`);
|
|
77
|
+
if (taskGraph.reasoning) {
|
|
78
|
+
LogStatus(`Reasoning: ${taskGraph.reasoning}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Create task orchestrator with PubSub for progress updates
|
|
82
|
+
const orchestrator = new TaskOrchestrator(currentUser, pubSub, sessionId, userPayload, createNotifications || false);
|
|
83
|
+
|
|
84
|
+
// Create parent task and child tasks with dependencies
|
|
85
|
+
const { parentTaskId, taskIdMap } = await orchestrator.createTasksFromGraph(taskGraph, conversationDetailId, environmentId);
|
|
86
|
+
|
|
87
|
+
LogStatus(`Created parent task ${parentTaskId} with ${taskIdMap.size} child tasks`);
|
|
88
|
+
|
|
89
|
+
// Execute tasks in proper order
|
|
90
|
+
const results = await orchestrator.executeTasksForParent(parentTaskId);
|
|
91
|
+
|
|
92
|
+
// Log results
|
|
93
|
+
const successCount = results.filter((r) => r.success).length;
|
|
94
|
+
LogStatus(`Completed ${successCount} of ${results.length} tasks successfully`);
|
|
95
|
+
|
|
96
|
+
for (const result of results) {
|
|
97
|
+
if (result.success) {
|
|
98
|
+
LogStatus(`✅ Task ${result.taskId} completed successfully`);
|
|
99
|
+
} else {
|
|
100
|
+
LogError(`❌ Task ${result.taskId} failed: ${result.error}`);
|
|
141
101
|
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Convert results to GraphQL types
|
|
105
|
+
const graphqlResults: TaskExecutionResultType[] = results.map((r) => ({
|
|
106
|
+
taskId: r.taskId,
|
|
107
|
+
success: r.success,
|
|
108
|
+
output: r.output ? JSON.stringify(r.output) : undefined,
|
|
109
|
+
error: r.error,
|
|
110
|
+
}));
|
|
111
|
+
|
|
112
|
+
LogStatus(`=== TASK GRAPH EXECUTION COMPLETE ===`);
|
|
113
|
+
|
|
114
|
+
const result = {
|
|
115
|
+
success: true,
|
|
116
|
+
results: graphqlResults,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
LogStatus(
|
|
120
|
+
`Returning ExecuteTaskGraph result: ${JSON.stringify({
|
|
121
|
+
success: result.success,
|
|
122
|
+
resultsCount: result.results.length,
|
|
123
|
+
firstResult: result.results[0],
|
|
124
|
+
})}`
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
return result;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
LogError(`Task graph execution failed:`, undefined, error);
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
errorMessage: (error as Error).message || 'Unknown error occurred',
|
|
134
|
+
results: [],
|
|
135
|
+
};
|
|
142
136
|
}
|
|
137
|
+
}
|
|
143
138
|
}
|
|
@@ -1,178 +1,183 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, registerEnumType } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
CompositeKey,
|
|
5
|
+
KeyValuePair,
|
|
6
|
+
LogError,
|
|
7
|
+
Metadata,
|
|
8
|
+
TransactionVariable,
|
|
9
|
+
BaseEntity,
|
|
10
|
+
EntityDeleteOptions,
|
|
11
|
+
EntitySaveOptions,
|
|
12
|
+
} from '@memberjunction/global';
|
|
4
13
|
import { SafeJSONParse } from '@memberjunction/global';
|
|
5
14
|
|
|
6
15
|
export enum TransactionVariableType {
|
|
7
|
-
|
|
8
|
-
|
|
16
|
+
Define = 'Define',
|
|
17
|
+
Use = 'Use',
|
|
9
18
|
}
|
|
10
19
|
|
|
11
20
|
registerEnumType(TransactionVariableType, {
|
|
12
|
-
|
|
13
|
-
|
|
21
|
+
name: 'TransactionVariableType',
|
|
22
|
+
description: 'Specifies the type of variable: Define or Use',
|
|
14
23
|
});
|
|
15
24
|
|
|
16
25
|
export enum TransactionOperationType {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
Create = 'Create',
|
|
27
|
+
Update = 'Update',
|
|
28
|
+
Delete = 'Delete',
|
|
20
29
|
}
|
|
21
30
|
|
|
22
31
|
registerEnumType(TransactionOperationType, {
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
name: 'TransactionOperationType',
|
|
33
|
+
description: 'Specifies the type of operation: Create, Update, or Delete',
|
|
25
34
|
});
|
|
26
35
|
|
|
27
|
-
|
|
28
|
-
@InputType()
|
|
36
|
+
@InputType()
|
|
29
37
|
export class TransactionVariableInputType {
|
|
30
|
-
|
|
31
|
-
|
|
38
|
+
@Field(() => String)
|
|
39
|
+
Name!: string;
|
|
40
|
+
|
|
41
|
+
@Field(() => Int)
|
|
42
|
+
ItemIndex!: number;
|
|
32
43
|
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
@Field(() => String)
|
|
45
|
+
FieldName!: string;
|
|
35
46
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@Field(() => TransactionVariableType)
|
|
40
|
-
Type!: TransactionVariableType;
|
|
47
|
+
@Field(() => TransactionVariableType)
|
|
48
|
+
Type!: TransactionVariableType;
|
|
41
49
|
}
|
|
42
|
-
|
|
43
|
-
@InputType()
|
|
50
|
+
|
|
51
|
+
@InputType()
|
|
44
52
|
export class TransactionItemInputType {
|
|
45
|
-
|
|
46
|
-
|
|
53
|
+
@Field(() => String)
|
|
54
|
+
EntityName: string;
|
|
47
55
|
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
@Field(() => String)
|
|
57
|
+
EntityObjectJSON: string;
|
|
50
58
|
|
|
51
|
-
|
|
52
|
-
|
|
59
|
+
@Field(() => TransactionOperationType)
|
|
60
|
+
OperationType: TransactionOperationType;
|
|
53
61
|
}
|
|
54
|
-
|
|
55
|
-
@InputType()
|
|
62
|
+
|
|
63
|
+
@InputType()
|
|
56
64
|
export class TransactionInputType {
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
@Field(() => [TransactionItemInputType])
|
|
66
|
+
Items: TransactionItemInputType[];
|
|
59
67
|
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
@Field(() => [TransactionVariableInputType], { nullable: true })
|
|
69
|
+
Variables?: TransactionVariableInputType[] | null;
|
|
62
70
|
}
|
|
63
71
|
|
|
64
|
-
|
|
65
72
|
@ObjectType()
|
|
66
73
|
export class TransactionOutputType {
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
@Field(() => Boolean)
|
|
75
|
+
Success: boolean;
|
|
69
76
|
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
@Field(() => [String])
|
|
78
|
+
ErrorMessages: string[];
|
|
72
79
|
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
@Field(() => [String])
|
|
81
|
+
ResultsJSON: string[];
|
|
75
82
|
}
|
|
76
83
|
|
|
77
|
-
|
|
78
|
-
|
|
79
84
|
export class TransactionResolver {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
await entity.InnerLoad(pkey);
|
|
111
|
-
}
|
|
112
|
-
objectValues.push(itemValues);
|
|
113
|
-
entity.SetMany(itemValues, true);
|
|
114
|
-
entity.TransactionGroup = tg;
|
|
115
|
-
await entity.Save();
|
|
116
|
-
break;
|
|
117
|
-
case "Delete":
|
|
118
|
-
await entity.InnerLoad(pkey);
|
|
119
|
-
objectValues.push(entity.GetDataObject());
|
|
120
|
-
entity.TransactionGroup = tg;
|
|
121
|
-
await entity.Delete();
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// now, we need to set the variables
|
|
127
|
-
if (group.Variables && group.Variables.length > 0) {
|
|
128
|
-
for (const networkVar of group.Variables) {
|
|
129
|
-
// 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
|
|
130
|
-
if (networkVar.ItemIndex >= 0 && networkVar.ItemIndex < entityObjects.length) {
|
|
131
|
-
const entityObject = entityObjects[networkVar.ItemIndex];
|
|
132
|
-
const newVar = new TransactionVariable(networkVar.Name, entityObject, networkVar.FieldName, networkVar.Type);
|
|
133
|
-
tg.AddVariable(newVar);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
throw new Error(`TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + 'Invalid ItemIndex ${networkVar.ItemIndex} in TransactionVariable "${JSON.stringify(networkVar)}"`);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// after all that, we are ready to roll, so let's run the TG
|
|
142
|
-
if (await tg.Submit()) {
|
|
143
|
-
// success!
|
|
144
|
-
return await this.PrepareReturnValue(true, entityObjects, objectValues, group);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
// failure, send back the results
|
|
148
|
-
return await this.PrepareReturnValue(false, entityObjects, objectValues, group);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
LogError(err);
|
|
153
|
-
throw new Error('TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + err);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
protected async PrepareReturnValue(success: boolean, entityObjects: BaseEntity[], objectValues: any[], group: TransactionInputType): Promise<TransactionOutputType> {
|
|
158
|
-
const jsonResults = [];
|
|
159
|
-
for (let i = 0; i < group.Items.length; i++) {
|
|
160
|
-
const item = group.Items[i];
|
|
161
|
-
if (item.OperationType==='Delete') {
|
|
162
|
-
jsonResults.push(JSON.stringify(objectValues[i]));
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
// create or update, return what is in the database
|
|
166
|
-
jsonResults.push(await entityObjects[i].GetDataObjectJSON());
|
|
85
|
+
@Mutation(() => TransactionOutputType)
|
|
86
|
+
async ExecuteTransactionGroup(@Arg('group', () => TransactionInputType) group: TransactionInputType, @Ctx() context: AppContext) {
|
|
87
|
+
try {
|
|
88
|
+
// we have received the transaction group information via the network, now we need to reconstruct our TransactionGroup object and run it
|
|
89
|
+
const md = new Metadata();
|
|
90
|
+
const tg = await md.CreateTransactionGroup();
|
|
91
|
+
const entityObjects: BaseEntity[] = [];
|
|
92
|
+
const objectValues: any[] = [];
|
|
93
|
+
|
|
94
|
+
for (const item of group.Items) {
|
|
95
|
+
// instantiate a new entity object for the item
|
|
96
|
+
const entity = await md.GetEntityObject(item.EntityName, context.userPayload.userRecord);
|
|
97
|
+
entityObjects.push(entity); // save for later for mapping variables if needed
|
|
98
|
+
|
|
99
|
+
// get the values from the payload
|
|
100
|
+
const itemValues = SafeJSONParse(item.EntityObjectJSON);
|
|
101
|
+
// build a primary key for the item
|
|
102
|
+
const pkey = new CompositeKey(
|
|
103
|
+
entity.PrimaryKeys.map((pk) => {
|
|
104
|
+
const kv = new KeyValuePair();
|
|
105
|
+
kv.FieldName = pk.Name;
|
|
106
|
+
kv.Value = itemValues[pk.Name];
|
|
107
|
+
return kv;
|
|
108
|
+
})
|
|
109
|
+
);
|
|
110
|
+
switch (item.OperationType) {
|
|
111
|
+
case 'Update':
|
|
112
|
+
case 'Create':
|
|
113
|
+
if (item.OperationType === 'Update') {
|
|
114
|
+
await entity.InnerLoad(pkey);
|
|
167
115
|
}
|
|
116
|
+
objectValues.push(itemValues);
|
|
117
|
+
entity.SetMany(itemValues, true);
|
|
118
|
+
entity.TransactionGroup = tg;
|
|
119
|
+
await entity.Save();
|
|
120
|
+
break;
|
|
121
|
+
case 'Delete':
|
|
122
|
+
await entity.InnerLoad(pkey);
|
|
123
|
+
objectValues.push(entity.GetDataObject());
|
|
124
|
+
entity.TransactionGroup = tg;
|
|
125
|
+
await entity.Delete();
|
|
126
|
+
break;
|
|
168
127
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// now, we need to set the variables
|
|
131
|
+
if (group.Variables && group.Variables.length > 0) {
|
|
132
|
+
for (const networkVar of group.Variables) {
|
|
133
|
+
// 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
|
|
134
|
+
if (networkVar.ItemIndex >= 0 && networkVar.ItemIndex < entityObjects.length) {
|
|
135
|
+
const entityObject = entityObjects[networkVar.ItemIndex];
|
|
136
|
+
const newVar = new TransactionVariable(networkVar.Name, entityObject, networkVar.FieldName, networkVar.Type);
|
|
137
|
+
tg.AddVariable(newVar);
|
|
138
|
+
} else {
|
|
139
|
+
throw new Error(
|
|
140
|
+
`TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + 'Invalid ItemIndex ${networkVar.ItemIndex} in TransactionVariable "${JSON.stringify(networkVar)}"`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
174
143
|
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// after all that, we are ready to roll, so let's run the TG
|
|
147
|
+
if (await tg.Submit()) {
|
|
148
|
+
// success!
|
|
149
|
+
return await this.PrepareReturnValue(true, entityObjects, objectValues, group);
|
|
150
|
+
} else {
|
|
151
|
+
// failure, send back the results
|
|
152
|
+
return await this.PrepareReturnValue(false, entityObjects, objectValues, group);
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
LogError(err);
|
|
156
|
+
throw new Error('TransactionResolver::ExecuteTransactionGroup --- Error\n\n' + err);
|
|
175
157
|
}
|
|
176
|
-
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
protected async PrepareReturnValue(
|
|
161
|
+
success: boolean,
|
|
162
|
+
entityObjects: BaseEntity[],
|
|
163
|
+
objectValues: any[],
|
|
164
|
+
group: TransactionInputType
|
|
165
|
+
): Promise<TransactionOutputType> {
|
|
166
|
+
const jsonResults = [];
|
|
167
|
+
for (let i = 0; i < group.Items.length; i++) {
|
|
168
|
+
const item = group.Items[i];
|
|
169
|
+
if (item.OperationType === 'Delete') {
|
|
170
|
+
jsonResults.push(JSON.stringify(objectValues[i]));
|
|
171
|
+
} else {
|
|
172
|
+
// create or update, return what is in the database
|
|
173
|
+
jsonResults.push(await entityObjects[i].GetDataObjectJSON());
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
Success: success,
|
|
179
|
+
ErrorMessages: entityObjects.map((e) => JSON.stringify(e.LatestResult)),
|
|
180
|
+
ResultsJSON: jsonResults,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
177
183
|
}
|
|
178
|
-
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Metadata, KeyValuePair, CompositeKey, UserInfo } from '@memberjunction/
|
|
1
|
+
import { Metadata, KeyValuePair, CompositeKey, UserInfo } from '@memberjunction/global';
|
|
2
2
|
import {
|
|
3
3
|
AppContext,
|
|
4
4
|
Arg,
|
|
@@ -70,19 +70,25 @@ export class UserFavoriteResult {
|
|
|
70
70
|
export class UserFavoriteResolver extends MJUserFavoriteResolverBase {
|
|
71
71
|
@Query(() => [MJUserFavorite_])
|
|
72
72
|
async UserFavoritesByUserID(@Arg('UserID', () => Int) UserID: number, @Ctx() { providers, userPayload }: AppContext) {
|
|
73
|
-
const provider = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true})
|
|
73
|
+
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
74
74
|
return await this.findBy(provider, 'User Favorites', { UserID }, userPayload.userRecord);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
@Query(() => [MJUserFavorite_])
|
|
78
|
-
async UserFavoriteSearchByParams(
|
|
79
|
-
|
|
78
|
+
async UserFavoriteSearchByParams(
|
|
79
|
+
@Arg('params', () => Int) params: UserFavoriteSearchParams,
|
|
80
|
+
@Ctx() { providers, userPayload }: AppContext
|
|
81
|
+
) {
|
|
82
|
+
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
80
83
|
return await this.findBy(provider, 'User Favorites', params, userPayload.userRecord);
|
|
81
84
|
}
|
|
82
85
|
|
|
83
86
|
@Query(() => UserFavoriteResult)
|
|
84
|
-
async GetRecordFavoriteStatus(
|
|
85
|
-
|
|
87
|
+
async GetRecordFavoriteStatus(
|
|
88
|
+
@Arg('params', () => UserFavoriteSearchParams) params: UserFavoriteSearchParams,
|
|
89
|
+
@Ctx() { providers, userPayload }: AppContext
|
|
90
|
+
) {
|
|
91
|
+
const p = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
86
92
|
const pk = new CompositeKey(params.CompositeKey.KeyValuePairs);
|
|
87
93
|
|
|
88
94
|
const e = p.Entities.find((e) => e.ID === params.EntityID);
|
|
@@ -98,8 +104,11 @@ export class UserFavoriteResolver extends MJUserFavoriteResolverBase {
|
|
|
98
104
|
}
|
|
99
105
|
|
|
100
106
|
@Mutation(() => UserFavoriteResult)
|
|
101
|
-
async SetRecordFavoriteStatus(
|
|
102
|
-
|
|
107
|
+
async SetRecordFavoriteStatus(
|
|
108
|
+
@Arg('params', () => UserFavoriteSetParams) params: UserFavoriteSetParams,
|
|
109
|
+
@Ctx() { userPayload, providers }: AppContext
|
|
110
|
+
) {
|
|
111
|
+
const p = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
103
112
|
const pk = new CompositeKey(params.CompositeKey.KeyValuePairs);
|
|
104
113
|
const e = p.Entities.find((e) => e.ID === params.EntityID);
|
|
105
114
|
const u = UserCache.Users.find((u) => u.ID === userPayload.userRecord.ID);
|