@memberjunction/server 2.112.0 → 2.113.1

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 +951 -808
  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 +43 -53
  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 +3 -1
  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 +2 -3
  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 +6 -3
  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 +10 -22
  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 +7 -9
  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 +788 -658
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2050 -3054
  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 +10 -15
  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 +13 -18
  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 +30 -28
  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 +50 -60
  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 +38 -36
  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 +40 -43
  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 +6 -8
  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 +28 -27
  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 +14 -15
  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 +44 -48
  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 +16 -14
  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 +25 -23
  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 +21 -17
  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 +6 -4
  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 +1 -0
  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 +39 -36
  194. package/src/agents/skip-agent.ts +1200 -1067
  195. package/src/agents/skip-sdk.ts +851 -877
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +14 -8
  198. package/src/auth/BaseAuthProvider.ts +4 -5
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +2 -9
  201. package/src/auth/index.ts +26 -31
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +134 -166
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +10 -7
  206. package/src/auth/providers/GoogleProvider.ts +5 -4
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +7 -6
  209. package/src/config.ts +54 -63
  210. package/src/context.ts +30 -42
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +40442 -48106
  213. package/src/generic/KeyInputOutputTypes.ts +6 -3
  214. package/src/generic/ResolverBase.ts +78 -119
  215. package/src/generic/RunViewResolver.ts +23 -27
  216. package/src/index.ts +48 -66
  217. package/src/resolvers/ActionResolver.ts +57 -46
  218. package/src/resolvers/AskSkipResolver.ts +533 -607
  219. package/src/resolvers/ComponentRegistryResolver.ts +562 -547
  220. package/src/resolvers/CreateQueryResolver.ts +655 -683
  221. package/src/resolvers/DatasetResolver.ts +6 -5
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +5 -9
  224. package/src/resolvers/EntityResolver.ts +7 -9
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +118 -106
  228. package/src/resolvers/GetDataResolver.ts +205 -194
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +78 -95
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +828 -818
  234. package/src/resolvers/RunAIPromptResolver.ts +709 -693
  235. package/src/resolvers/RunTemplateResolver.ts +103 -105
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
  237. package/src/resolvers/SyncDataResolver.ts +352 -386
  238. package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
  239. package/src/resolvers/TaskResolver.ts +115 -110
  240. package/src/resolvers/TransactionGroupResolver.ts +138 -143
  241. package/src/resolvers/UserFavoriteResolver.ts +8 -17
  242. package/src/resolvers/UserViewResolver.ts +12 -17
  243. package/src/rest/EntityCRUDHandler.ts +268 -291
  244. package/src/rest/RESTEndpointHandler.ts +776 -782
  245. package/src/rest/ViewOperationsHandler.ts +195 -191
  246. package/src/scheduler/LearningCycleScheduler.ts +52 -8
  247. package/src/services/ScheduledJobsService.ts +132 -129
  248. package/src/services/TaskOrchestrator.ts +776 -792
  249. package/src/types.ts +9 -15
  250. package/src/util.ts +109 -112
@@ -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/global';
3
+ import { LogError, LogStatus } from '@memberjunction/core';
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,101 +38,106 @@ 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(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}`);
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
+ };
101
141
  }
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
- };
136
142
  }
137
- }
138
143
  }
@@ -1,183 +1,178 @@
1
1
  import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, registerEnumType } from 'type-graphql';
2
2
  import { AppContext } from '../types.js';
3
- import {
4
- CompositeKey,
5
- KeyValuePair,
6
- LogError,
7
- Metadata,
8
- TransactionVariable,
9
- BaseEntity,
10
- EntityDeleteOptions,
11
- EntitySaveOptions,
12
- } from '@memberjunction/global';
3
+ import { CompositeKey, KeyValuePair, LogError, Metadata, TransactionVariable, BaseEntity, EntityDeleteOptions, EntitySaveOptions } from '@memberjunction/core';
13
4
  import { SafeJSONParse } from '@memberjunction/global';
14
5
 
15
6
  export enum TransactionVariableType {
16
- Define = 'Define',
17
- Use = 'Use',
7
+ Define = "Define",
8
+ Use = "Use",
18
9
  }
19
10
 
20
11
  registerEnumType(TransactionVariableType, {
21
- name: 'TransactionVariableType',
22
- description: 'Specifies the type of variable: Define or Use',
12
+ name: "TransactionVariableType",
13
+ description: "Specifies the type of variable: Define or Use",
23
14
  });
24
15
 
25
16
  export enum TransactionOperationType {
26
- Create = 'Create',
27
- Update = 'Update',
28
- Delete = 'Delete',
17
+ Create = "Create",
18
+ Update = "Update",
19
+ Delete = "Delete"
29
20
  }
30
21
 
31
22
  registerEnumType(TransactionOperationType, {
32
- name: 'TransactionOperationType',
33
- description: 'Specifies the type of operation: Create, Update, or Delete',
23
+ name: "TransactionOperationType",
24
+ description: "Specifies the type of operation: Create, Update, or Delete",
34
25
  });
35
26
 
36
- @InputType()
37
- export class TransactionVariableInputType {
38
- @Field(() => String)
39
- Name!: string;
40
27
 
41
- @Field(() => Int)
42
- ItemIndex!: number;
28
+ @InputType()
29
+ export class TransactionVariableInputType {
30
+ @Field(() => String)
31
+ Name!: string;
43
32
 
44
- @Field(() => String)
45
- FieldName!: string;
33
+ @Field(() => Int)
34
+ ItemIndex!: number;
46
35
 
47
- @Field(() => TransactionVariableType)
48
- Type!: TransactionVariableType;
36
+ @Field(() => String)
37
+ FieldName!: string;
38
+
39
+ @Field(() => TransactionVariableType)
40
+ Type!: TransactionVariableType;
49
41
  }
50
-
51
- @InputType()
42
+
43
+ @InputType()
52
44
  export class TransactionItemInputType {
53
- @Field(() => String)
54
- EntityName: string;
45
+ @Field(() => String)
46
+ EntityName: string;
55
47
 
56
- @Field(() => String)
57
- EntityObjectJSON: string;
48
+ @Field(() => String)
49
+ EntityObjectJSON: string;
58
50
 
59
- @Field(() => TransactionOperationType)
60
- OperationType: TransactionOperationType;
51
+ @Field(() => TransactionOperationType)
52
+ OperationType: TransactionOperationType;
61
53
  }
62
-
63
- @InputType()
54
+
55
+ @InputType()
64
56
  export class TransactionInputType {
65
- @Field(() => [TransactionItemInputType])
66
- Items: TransactionItemInputType[];
57
+ @Field(() => [TransactionItemInputType])
58
+ Items: TransactionItemInputType[];
67
59
 
68
- @Field(() => [TransactionVariableInputType], { nullable: true })
69
- Variables?: TransactionVariableInputType[] | null;
60
+ @Field(() => [TransactionVariableInputType], {nullable: true})
61
+ Variables?: TransactionVariableInputType[] | null;
70
62
  }
71
63
 
64
+
72
65
  @ObjectType()
73
66
  export class TransactionOutputType {
74
- @Field(() => Boolean)
75
- Success: boolean;
67
+ @Field(() => Boolean)
68
+ Success: boolean;
76
69
 
77
- @Field(() => [String])
78
- ErrorMessages: string[];
70
+ @Field(() => [String])
71
+ ErrorMessages: string[];
79
72
 
80
- @Field(() => [String])
81
- ResultsJSON: string[];
73
+ @Field(() => [String])
74
+ ResultsJSON: string[];
82
75
  }
83
76
 
77
+
78
+
84
79
  export class TransactionResolver {
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);
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
+ }
115
124
  }
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;
127
- }
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
- }
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);
143
154
  }
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);
157
- }
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
155
  }
176
156
 
177
- return {
178
- Success: success,
179
- ErrorMessages: entityObjects.map((e) => JSON.stringify(e.LatestResult)),
180
- ResultsJSON: jsonResults,
181
- };
182
- }
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());
167
+ }
168
+ }
169
+
170
+ return {
171
+ Success: success,
172
+ ErrorMessages: entityObjects.map(e => JSON.stringify(e.LatestResult)),
173
+ ResultsJSON: jsonResults
174
+ }
175
+ }
176
+
183
177
  }
178
+
@@ -1,4 +1,4 @@
1
- import { Metadata, KeyValuePair, CompositeKey, UserInfo } from '@memberjunction/global';
1
+ import { Metadata, KeyValuePair, CompositeKey, UserInfo } from '@memberjunction/core';
2
2
  import {
3
3
  AppContext,
4
4
  Arg,
@@ -70,25 +70,19 @@ 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
- @Arg('params', () => Int) params: UserFavoriteSearchParams,
80
- @Ctx() { providers, userPayload }: AppContext
81
- ) {
82
- const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
78
+ async UserFavoriteSearchByParams(@Arg('params', () => Int) params: UserFavoriteSearchParams, @Ctx() { providers, userPayload }: AppContext) {
79
+ const provider = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true})
83
80
  return await this.findBy(provider, 'User Favorites', params, userPayload.userRecord);
84
81
  }
85
82
 
86
83
  @Query(() => UserFavoriteResult)
87
- async GetRecordFavoriteStatus(
88
- @Arg('params', () => UserFavoriteSearchParams) params: UserFavoriteSearchParams,
89
- @Ctx() { providers, userPayload }: AppContext
90
- ) {
91
- const p = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
84
+ async GetRecordFavoriteStatus(@Arg('params', () => UserFavoriteSearchParams) params: UserFavoriteSearchParams, @Ctx() {providers, userPayload}: AppContext) {
85
+ const p = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
92
86
  const pk = new CompositeKey(params.CompositeKey.KeyValuePairs);
93
87
 
94
88
  const e = p.Entities.find((e) => e.ID === params.EntityID);
@@ -104,11 +98,8 @@ export class UserFavoriteResolver extends MJUserFavoriteResolverBase {
104
98
  }
105
99
 
106
100
  @Mutation(() => UserFavoriteResult)
107
- async SetRecordFavoriteStatus(
108
- @Arg('params', () => UserFavoriteSetParams) params: UserFavoriteSetParams,
109
- @Ctx() { userPayload, providers }: AppContext
110
- ) {
111
- const p = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
101
+ async SetRecordFavoriteStatus(@Arg('params', () => UserFavoriteSetParams) params: UserFavoriteSetParams, @Ctx() { userPayload, providers }: AppContext) {
102
+ const p = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
112
103
  const pk = new CompositeKey(params.CompositeKey.KeyValuePairs);
113
104
  const e = p.Entities.find((e) => e.ID === params.EntityID);
114
105
  const u = UserCache.Users.find((u) => u.ID === userPayload.userRecord.ID);