@memberjunction/server 2.111.1 → 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.
Files changed (250) hide show
  1. package/dist/agents/skip-agent.d.ts +4 -4
  2. package/dist/agents/skip-agent.d.ts.map +1 -1
  3. package/dist/agents/skip-agent.js +808 -951
  4. package/dist/agents/skip-agent.js.map +1 -1
  5. package/dist/agents/skip-sdk.d.ts +1 -1
  6. package/dist/agents/skip-sdk.d.ts.map +1 -1
  7. package/dist/agents/skip-sdk.js +53 -43
  8. package/dist/agents/skip-sdk.js.map +1 -1
  9. package/dist/apolloServer/index.js +1 -1
  10. package/dist/auth/AuthProviderFactory.d.ts +1 -1
  11. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  12. package/dist/auth/AuthProviderFactory.js +1 -3
  13. package/dist/auth/AuthProviderFactory.js.map +1 -1
  14. package/dist/auth/BaseAuthProvider.d.ts +1 -1
  15. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  16. package/dist/auth/BaseAuthProvider.js +3 -2
  17. package/dist/auth/BaseAuthProvider.js.map +1 -1
  18. package/dist/auth/IAuthProvider.d.ts +1 -1
  19. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  20. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  21. package/dist/auth/exampleNewUserSubClass.js +1 -1
  22. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  23. package/dist/auth/index.d.ts +1 -1
  24. package/dist/auth/index.d.ts.map +1 -1
  25. package/dist/auth/index.js +6 -6
  26. package/dist/auth/index.js.map +1 -1
  27. package/dist/auth/initializeProviders.js +1 -1
  28. package/dist/auth/initializeProviders.js.map +1 -1
  29. package/dist/auth/newUsers.d.ts +1 -1
  30. package/dist/auth/newUsers.d.ts.map +1 -1
  31. package/dist/auth/newUsers.js +7 -7
  32. package/dist/auth/newUsers.js.map +1 -1
  33. package/dist/auth/providers/Auth0Provider.d.ts +1 -1
  34. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  35. package/dist/auth/providers/Auth0Provider.js +1 -1
  36. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  37. package/dist/auth/providers/CognitoProvider.d.ts +1 -1
  38. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  39. package/dist/auth/providers/CognitoProvider.js +3 -6
  40. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  41. package/dist/auth/providers/GoogleProvider.d.ts +1 -1
  42. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  43. package/dist/auth/providers/GoogleProvider.js +1 -1
  44. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  45. package/dist/auth/providers/MSALProvider.d.ts +1 -1
  46. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  47. package/dist/auth/providers/MSALProvider.js +1 -1
  48. package/dist/auth/providers/MSALProvider.js.map +1 -1
  49. package/dist/auth/providers/OktaProvider.d.ts +1 -1
  50. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  51. package/dist/auth/providers/OktaProvider.js +1 -1
  52. package/dist/auth/providers/OktaProvider.js.map +1 -1
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +22 -10
  55. package/dist/config.js.map +1 -1
  56. package/dist/context.d.ts +1 -1
  57. package/dist/context.d.ts.map +1 -1
  58. package/dist/context.js +9 -7
  59. package/dist/context.js.map +1 -1
  60. package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
  61. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  62. package/dist/entitySubclasses/entityPermissions.server.js +1 -1
  63. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  64. package/dist/generated/generated.d.ts +648 -648
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2986 -1133
  67. package/dist/generated/generated.js.map +1 -1
  68. package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
  69. package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
  70. package/dist/generic/KeyInputOutputTypes.js +1 -1
  71. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  72. package/dist/generic/ResolverBase.d.ts +1 -1
  73. package/dist/generic/ResolverBase.d.ts.map +1 -1
  74. package/dist/generic/ResolverBase.js +15 -10
  75. package/dist/generic/ResolverBase.js.map +1 -1
  76. package/dist/generic/RunViewResolver.d.ts +1 -1
  77. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  78. package/dist/generic/RunViewResolver.js +15 -15
  79. package/dist/generic/RunViewResolver.js.map +1 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +18 -9
  82. package/dist/index.js.map +1 -1
  83. package/dist/resolvers/ActionResolver.d.ts +2 -2
  84. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  85. package/dist/resolvers/ActionResolver.js +28 -30
  86. package/dist/resolvers/ActionResolver.js.map +1 -1
  87. package/dist/resolvers/AskSkipResolver.d.ts +2 -2
  88. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
  89. package/dist/resolvers/AskSkipResolver.js +60 -50
  90. package/dist/resolvers/AskSkipResolver.js.map +1 -1
  91. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  92. package/dist/resolvers/ComponentRegistryResolver.js +36 -38
  93. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  94. package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
  95. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  96. package/dist/resolvers/CreateQueryResolver.js +43 -40
  97. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  98. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  99. package/dist/resolvers/DatasetResolver.js +1 -1
  100. package/dist/resolvers/DatasetResolver.js.map +1 -1
  101. package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
  102. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  103. package/dist/resolvers/EntityRecordNameResolver.js +1 -1
  104. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  105. package/dist/resolvers/EntityResolver.d.ts.map +1 -1
  106. package/dist/resolvers/EntityResolver.js +1 -1
  107. package/dist/resolvers/EntityResolver.js.map +1 -1
  108. package/dist/resolvers/FileCategoryResolver.js +1 -1
  109. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  110. package/dist/resolvers/FileResolver.js +1 -1
  111. package/dist/resolvers/FileResolver.js.map +1 -1
  112. package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
  113. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  114. package/dist/resolvers/GetDataContextDataResolver.js +5 -5
  115. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  116. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  117. package/dist/resolvers/GetDataResolver.js +8 -6
  118. package/dist/resolvers/GetDataResolver.js.map +1 -1
  119. package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
  120. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  121. package/dist/resolvers/MergeRecordsResolver.js +3 -3
  122. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  123. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
  124. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  125. package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
  126. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  127. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  128. package/dist/resolvers/QueryResolver.js +11 -11
  129. package/dist/resolvers/QueryResolver.js.map +1 -1
  130. package/dist/resolvers/ReportResolver.js +1 -1
  131. package/dist/resolvers/ReportResolver.js.map +1 -1
  132. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  133. package/dist/resolvers/RunAIAgentResolver.js +27 -28
  134. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  135. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  136. package/dist/resolvers/RunAIPromptResolver.js +31 -31
  137. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  138. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  139. package/dist/resolvers/RunTemplateResolver.js +9 -9
  140. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  141. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  142. package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
  143. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  144. package/dist/resolvers/SyncDataResolver.d.ts +1 -1
  145. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  146. package/dist/resolvers/SyncDataResolver.js +15 -14
  147. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  148. package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
  149. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  150. package/dist/resolvers/SyncRolesUsersResolver.js +48 -44
  151. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  152. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  153. package/dist/resolvers/TaskResolver.js +7 -7
  154. package/dist/resolvers/TaskResolver.js.map +1 -1
  155. package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
  156. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  157. package/dist/resolvers/TransactionGroupResolver.js +12 -12
  158. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  159. package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
  160. package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
  161. package/dist/resolvers/UserFavoriteResolver.js +1 -1
  162. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  163. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  164. package/dist/resolvers/UserViewResolver.js.map +1 -1
  165. package/dist/rest/EntityCRUDHandler.d.ts +1 -1
  166. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  167. package/dist/rest/EntityCRUDHandler.js +14 -16
  168. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  169. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  170. package/dist/rest/RESTEndpointHandler.js +23 -25
  171. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  172. package/dist/rest/ViewOperationsHandler.d.ts +1 -1
  173. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  174. package/dist/rest/ViewOperationsHandler.js +17 -21
  175. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  176. package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
  177. package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
  178. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  179. package/dist/services/ScheduledJobsService.js +4 -6
  180. package/dist/services/ScheduledJobsService.js.map +1 -1
  181. package/dist/services/TaskOrchestrator.d.ts +1 -1
  182. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  183. package/dist/services/TaskOrchestrator.js +30 -30
  184. package/dist/services/TaskOrchestrator.js.map +1 -1
  185. package/dist/types.d.ts +3 -3
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js +0 -1
  188. package/dist/types.js.map +1 -1
  189. package/dist/util.d.ts +1 -1
  190. package/dist/util.d.ts.map +1 -1
  191. package/dist/util.js +2 -2
  192. package/dist/util.js.map +1 -1
  193. package/package.json +36 -37
  194. package/src/agents/skip-agent.ts +1067 -1200
  195. package/src/agents/skip-sdk.ts +877 -851
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +8 -14
  198. package/src/auth/BaseAuthProvider.ts +5 -4
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +9 -2
  201. package/src/auth/index.ts +31 -26
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +166 -134
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +7 -10
  206. package/src/auth/providers/GoogleProvider.ts +4 -5
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +6 -7
  209. package/src/config.ts +63 -54
  210. package/src/context.ts +42 -30
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +48130 -39930
  213. package/src/generic/KeyInputOutputTypes.ts +3 -6
  214. package/src/generic/ResolverBase.ts +119 -78
  215. package/src/generic/RunViewResolver.ts +27 -23
  216. package/src/index.ts +66 -42
  217. package/src/resolvers/ActionResolver.ts +46 -57
  218. package/src/resolvers/AskSkipResolver.ts +607 -533
  219. package/src/resolvers/ComponentRegistryResolver.ts +547 -562
  220. package/src/resolvers/CreateQueryResolver.ts +683 -655
  221. package/src/resolvers/DatasetResolver.ts +5 -6
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +9 -5
  224. package/src/resolvers/EntityResolver.ts +9 -7
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +106 -118
  228. package/src/resolvers/GetDataResolver.ts +194 -205
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +95 -78
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +818 -828
  234. package/src/resolvers/RunAIPromptResolver.ts +693 -709
  235. package/src/resolvers/RunTemplateResolver.ts +105 -103
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
  237. package/src/resolvers/SyncDataResolver.ts +386 -352
  238. package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
  239. package/src/resolvers/TaskResolver.ts +110 -115
  240. package/src/resolvers/TransactionGroupResolver.ts +143 -138
  241. package/src/resolvers/UserFavoriteResolver.ts +17 -8
  242. package/src/resolvers/UserViewResolver.ts +17 -12
  243. package/src/rest/EntityCRUDHandler.ts +291 -268
  244. package/src/rest/RESTEndpointHandler.ts +782 -776
  245. package/src/rest/ViewOperationsHandler.ts +191 -195
  246. package/src/scheduler/LearningCycleScheduler.ts +8 -52
  247. package/src/services/ScheduledJobsService.ts +129 -132
  248. package/src/services/TaskOrchestrator.ts +792 -776
  249. package/src/types.ts +15 -9
  250. 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/core';
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
- @Field()
10
- taskId: string;
9
+ @Field()
10
+ taskId: string;
11
11
 
12
- @Field()
13
- success: boolean;
12
+ @Field()
13
+ success: boolean;
14
14
 
15
- @Field({ nullable: true })
16
- output?: string;
15
+ @Field({ nullable: true })
16
+ output?: string;
17
17
 
18
- @Field({ nullable: true })
19
- error?: string;
18
+ @Field({ nullable: true })
19
+ error?: string;
20
20
  }
21
21
 
22
22
  @ObjectType()
23
23
  export class ExecuteTaskGraphResult {
24
- @Field()
25
- success: boolean;
24
+ @Field()
25
+ success: boolean;
26
26
 
27
- @Field({ nullable: true })
28
- errorMessage?: string;
27
+ @Field({ nullable: true })
28
+ errorMessage?: string;
29
29
 
30
- @Field(() => [TaskExecutionResultType])
31
- results: TaskExecutionResultType[];
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
- * 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(
86
- taskGraph,
87
- conversationDetailId,
88
- environmentId
89
- );
90
-
91
- LogStatus(`Created parent task ${parentTaskId} with ${taskIdMap.size} child tasks`);
92
-
93
- // Execute tasks in proper order
94
- const results = await orchestrator.executeTasksForParent(
95
- parentTaskId
96
- );
97
-
98
- // Log results
99
- const successCount = results.filter(r => r.success).length;
100
- LogStatus(`Completed ${successCount} of ${results.length} tasks successfully`);
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 { CompositeKey, KeyValuePair, LogError, Metadata, TransactionVariable, BaseEntity, EntityDeleteOptions, EntitySaveOptions } from '@memberjunction/core';
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
- Define = "Define",
8
- Use = "Use",
16
+ Define = 'Define',
17
+ Use = 'Use',
9
18
  }
10
19
 
11
20
  registerEnumType(TransactionVariableType, {
12
- name: "TransactionVariableType",
13
- description: "Specifies the type of variable: Define or Use",
21
+ name: 'TransactionVariableType',
22
+ description: 'Specifies the type of variable: Define or Use',
14
23
  });
15
24
 
16
25
  export enum TransactionOperationType {
17
- Create = "Create",
18
- Update = "Update",
19
- Delete = "Delete"
26
+ Create = 'Create',
27
+ Update = 'Update',
28
+ Delete = 'Delete',
20
29
  }
21
30
 
22
31
  registerEnumType(TransactionOperationType, {
23
- name: "TransactionOperationType",
24
- description: "Specifies the type of operation: Create, Update, or Delete",
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
- @Field(() => String)
31
- Name!: string;
38
+ @Field(() => String)
39
+ Name!: string;
40
+
41
+ @Field(() => Int)
42
+ ItemIndex!: number;
32
43
 
33
- @Field(() => Int)
34
- ItemIndex!: number;
44
+ @Field(() => String)
45
+ FieldName!: string;
35
46
 
36
- @Field(() => String)
37
- FieldName!: string;
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
- @Field(() => String)
46
- EntityName: string;
53
+ @Field(() => String)
54
+ EntityName: string;
47
55
 
48
- @Field(() => String)
49
- EntityObjectJSON: string;
56
+ @Field(() => String)
57
+ EntityObjectJSON: string;
50
58
 
51
- @Field(() => TransactionOperationType)
52
- OperationType: TransactionOperationType;
59
+ @Field(() => TransactionOperationType)
60
+ OperationType: TransactionOperationType;
53
61
  }
54
-
55
- @InputType()
62
+
63
+ @InputType()
56
64
  export class TransactionInputType {
57
- @Field(() => [TransactionItemInputType])
58
- Items: TransactionItemInputType[];
65
+ @Field(() => [TransactionItemInputType])
66
+ Items: TransactionItemInputType[];
59
67
 
60
- @Field(() => [TransactionVariableInputType], {nullable: true})
61
- Variables?: TransactionVariableInputType[] | null;
68
+ @Field(() => [TransactionVariableInputType], { nullable: true })
69
+ Variables?: TransactionVariableInputType[] | null;
62
70
  }
63
71
 
64
-
65
72
  @ObjectType()
66
73
  export class TransactionOutputType {
67
- @Field(() => Boolean)
68
- Success: boolean;
74
+ @Field(() => Boolean)
75
+ Success: boolean;
69
76
 
70
- @Field(() => [String])
71
- ErrorMessages: string[];
77
+ @Field(() => [String])
78
+ ErrorMessages: string[];
72
79
 
73
- @Field(() => [String])
74
- ResultsJSON: string[];
80
+ @Field(() => [String])
81
+ ResultsJSON: string[];
75
82
  }
76
83
 
77
-
78
-
79
84
  export class TransactionResolver {
80
- @Mutation(() => TransactionOutputType)
81
- async ExecuteTransactionGroup(
82
- @Arg('group', () => TransactionInputType ) group: TransactionInputType,
83
- @Ctx() context: AppContext
84
- ) {
85
- try {
86
- // we have received the transaction group information via the network, now we need to reconstruct our TransactionGroup object and run it
87
- const md = new Metadata();
88
- const tg = await md.CreateTransactionGroup();
89
- const entityObjects: BaseEntity[] = [];
90
- const objectValues: any[] = [];
91
-
92
- for (const item of group.Items) {
93
- // instantiate a new entity object for the item
94
- const entity = await md.GetEntityObject(item.EntityName, context.userPayload.userRecord);
95
- entityObjects.push(entity); // save for later for mapping variables if needed
96
-
97
- // get the values from the payload
98
- const itemValues = SafeJSONParse(item.EntityObjectJSON);
99
- // build a primary key for the item
100
- const pkey = new CompositeKey(entity.PrimaryKeys.map(pk => {
101
- const kv = new KeyValuePair();
102
- kv.FieldName = pk.Name;
103
- kv.Value = itemValues[pk.Name];
104
- return kv;
105
- }));
106
- switch (item.OperationType) {
107
- case "Update":
108
- case "Create":
109
- if (item.OperationType === "Update") {
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
- return {
171
- Success: success,
172
- ErrorMessages: entityObjects.map(e => JSON.stringify(e.LatestResult)),
173
- ResultsJSON: jsonResults
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/core';
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(@Arg('params', () => Int) params: UserFavoriteSearchParams, @Ctx() { providers, userPayload }: AppContext) {
79
- const provider = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true})
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(@Arg('params', () => UserFavoriteSearchParams) params: UserFavoriteSearchParams, @Ctx() {providers, userPayload}: AppContext) {
85
- const p = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
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(@Arg('params', () => UserFavoriteSetParams) params: UserFavoriteSetParams, @Ctx() { userPayload, providers }: AppContext) {
102
- const p = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
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);