@memberjunction/server 1.8.1 → 2.0.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 (191) hide show
  1. package/CHANGELOG.json +1 -1
  2. package/CHANGELOG.md +2 -2
  3. package/package.json +30 -39
  4. package/src/apolloServer/index.ts +0 -1
  5. package/src/auth/newUsers.ts +4 -3
  6. package/src/context.ts +19 -27
  7. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  8. package/src/generated/generated.ts +9030 -8051
  9. package/src/generic/ResolverBase.ts +297 -172
  10. package/src/generic/RunViewResolver.ts +204 -14
  11. package/src/index.ts +18 -19
  12. package/src/resolvers/AskSkipResolver.ts +35 -35
  13. package/src/resolvers/ColorResolver.ts +3 -14
  14. package/src/resolvers/DatasetResolver.ts +4 -4
  15. package/src/resolvers/EntityCommunicationsResolver.ts +37 -15
  16. package/src/resolvers/FileCategoryResolver.ts +2 -2
  17. package/src/resolvers/FileResolver.ts +6 -4
  18. package/src/resolvers/MergeRecordsResolver.ts +3 -2
  19. package/src/resolvers/PotentialDuplicateRecordResolver.ts +48 -40
  20. package/src/resolvers/QueryResolver.ts +2 -2
  21. package/src/resolvers/ReportResolver.ts +6 -6
  22. package/src/resolvers/UserFavoriteResolver.ts +8 -8
  23. package/src/resolvers/UserResolver.ts +3 -1
  24. package/src/resolvers/UserViewResolver.ts +1 -1
  25. package/src/types.ts +21 -0
  26. package/tsconfig.json +3 -4
  27. package/dist/apolloServer/TransactionPlugin.d.ts +0 -4
  28. package/dist/apolloServer/TransactionPlugin.d.ts.map +0 -1
  29. package/dist/apolloServer/TransactionPlugin.js +0 -49
  30. package/dist/apolloServer/TransactionPlugin.js.map +0 -1
  31. package/dist/apolloServer/index.d.ts +0 -11
  32. package/dist/apolloServer/index.d.ts.map +0 -1
  33. package/dist/apolloServer/index.js +0 -27
  34. package/dist/apolloServer/index.js.map +0 -1
  35. package/dist/auth/exampleNewUserSubClass.d.ts +0 -6
  36. package/dist/auth/exampleNewUserSubClass.d.ts.map +0 -1
  37. package/dist/auth/exampleNewUserSubClass.js +0 -54
  38. package/dist/auth/exampleNewUserSubClass.js.map +0 -1
  39. package/dist/auth/index.d.ts +0 -30
  40. package/dist/auth/index.d.ts.map +0 -1
  41. package/dist/auth/index.js +0 -129
  42. package/dist/auth/index.js.map +0 -1
  43. package/dist/auth/newUsers.d.ts +0 -5
  44. package/dist/auth/newUsers.d.ts.map +0 -1
  45. package/dist/auth/newUsers.js +0 -66
  46. package/dist/auth/newUsers.js.map +0 -1
  47. package/dist/auth/tokenExpiredError.d.ts +0 -5
  48. package/dist/auth/tokenExpiredError.d.ts.map +0 -1
  49. package/dist/auth/tokenExpiredError.js +0 -16
  50. package/dist/auth/tokenExpiredError.js.map +0 -1
  51. package/dist/cache.d.ts +0 -3
  52. package/dist/cache.d.ts.map +0 -1
  53. package/dist/cache.js +0 -11
  54. package/dist/cache.js.map +0 -1
  55. package/dist/config.d.ts +0 -196
  56. package/dist/config.d.ts.map +0 -1
  57. package/dist/config.js +0 -72
  58. package/dist/config.js.map +0 -1
  59. package/dist/context.d.ts +0 -17
  60. package/dist/context.d.ts.map +0 -1
  61. package/dist/context.js +0 -114
  62. package/dist/context.js.map +0 -1
  63. package/dist/directives/Public.d.ts +0 -4
  64. package/dist/directives/Public.d.ts.map +0 -1
  65. package/dist/directives/Public.js +0 -34
  66. package/dist/directives/Public.js.map +0 -1
  67. package/dist/directives/index.d.ts +0 -2
  68. package/dist/directives/index.d.ts.map +0 -1
  69. package/dist/directives/index.js +0 -18
  70. package/dist/directives/index.js.map +0 -1
  71. package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts +0 -6
  72. package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts.map +0 -1
  73. package/dist/entitySubclasses/DuplicateRunEntity.server.js +0 -37
  74. package/dist/entitySubclasses/DuplicateRunEntity.server.js.map +0 -1
  75. package/dist/entitySubclasses/EntityBehavior.server.d.ts +0 -29
  76. package/dist/entitySubclasses/EntityBehavior.server.d.ts.map +0 -1
  77. package/dist/entitySubclasses/EntityBehavior.server.js +0 -213
  78. package/dist/entitySubclasses/EntityBehavior.server.js.map +0 -1
  79. package/dist/entitySubclasses/entityPermissions.server.d.ts +0 -23
  80. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +0 -1
  81. package/dist/entitySubclasses/entityPermissions.server.js +0 -99
  82. package/dist/entitySubclasses/entityPermissions.server.js.map +0 -1
  83. package/dist/entitySubclasses/userViewEntity.server.d.ts +0 -13
  84. package/dist/entitySubclasses/userViewEntity.server.d.ts.map +0 -1
  85. package/dist/entitySubclasses/userViewEntity.server.js +0 -164
  86. package/dist/entitySubclasses/userViewEntity.server.js.map +0 -1
  87. package/dist/generated/generated.d.ts +0 -6482
  88. package/dist/generated/generated.d.ts.map +0 -1
  89. package/dist/generated/generated.js +0 -35073
  90. package/dist/generated/generated.js.map +0 -1
  91. package/dist/generic/DeleteOptionsInput.d.ts +0 -5
  92. package/dist/generic/DeleteOptionsInput.d.ts.map +0 -1
  93. package/dist/generic/DeleteOptionsInput.js +0 -28
  94. package/dist/generic/DeleteOptionsInput.js.map +0 -1
  95. package/dist/generic/KeyInputOutputTypes.d.ts +0 -16
  96. package/dist/generic/KeyInputOutputTypes.d.ts.map +0 -1
  97. package/dist/generic/KeyInputOutputTypes.js +0 -62
  98. package/dist/generic/KeyInputOutputTypes.js.map +0 -1
  99. package/dist/generic/KeyValuePairInput.d.ts +0 -5
  100. package/dist/generic/KeyValuePairInput.d.ts.map +0 -1
  101. package/dist/generic/KeyValuePairInput.js +0 -28
  102. package/dist/generic/KeyValuePairInput.js.map +0 -1
  103. package/dist/generic/PushStatusResolver.d.ts +0 -14
  104. package/dist/generic/PushStatusResolver.d.ts.map +0 -1
  105. package/dist/generic/PushStatusResolver.js +0 -58
  106. package/dist/generic/PushStatusResolver.js.map +0 -1
  107. package/dist/generic/ResolverBase.d.ts +0 -37
  108. package/dist/generic/ResolverBase.d.ts.map +0 -1
  109. package/dist/generic/ResolverBase.js +0 -468
  110. package/dist/generic/ResolverBase.js.map +0 -1
  111. package/dist/generic/RunViewResolver.d.ts +0 -88
  112. package/dist/generic/RunViewResolver.d.ts.map +0 -1
  113. package/dist/generic/RunViewResolver.js +0 -443
  114. package/dist/generic/RunViewResolver.js.map +0 -1
  115. package/dist/index.d.ts +0 -28
  116. package/dist/index.d.ts.map +0 -1
  117. package/dist/index.js +0 -145
  118. package/dist/index.js.map +0 -1
  119. package/dist/orm.d.ts +0 -4
  120. package/dist/orm.d.ts.map +0 -1
  121. package/dist/orm.js +0 -34
  122. package/dist/orm.js.map +0 -1
  123. package/dist/resolvers/AskSkipResolver.d.ts +0 -54
  124. package/dist/resolvers/AskSkipResolver.d.ts.map +0 -1
  125. package/dist/resolvers/AskSkipResolver.js +0 -800
  126. package/dist/resolvers/AskSkipResolver.js.map +0 -1
  127. package/dist/resolvers/ColorResolver.d.ts +0 -22
  128. package/dist/resolvers/ColorResolver.d.ts.map +0 -1
  129. package/dist/resolvers/ColorResolver.js +0 -94
  130. package/dist/resolvers/ColorResolver.js.map +0 -1
  131. package/dist/resolvers/DatasetResolver.d.ts +0 -42
  132. package/dist/resolvers/DatasetResolver.d.ts.map +0 -1
  133. package/dist/resolvers/DatasetResolver.js +0 -168
  134. package/dist/resolvers/DatasetResolver.js.map +0 -1
  135. package/dist/resolvers/EntityCommunicationsResolver.d.ts +0 -49
  136. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +0 -1
  137. package/dist/resolvers/EntityCommunicationsResolver.js +0 -228
  138. package/dist/resolvers/EntityCommunicationsResolver.js.map +0 -1
  139. package/dist/resolvers/EntityRecordNameResolver.d.ts +0 -21
  140. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +0 -1
  141. package/dist/resolvers/EntityRecordNameResolver.js +0 -113
  142. package/dist/resolvers/EntityRecordNameResolver.js.map +0 -1
  143. package/dist/resolvers/EntityResolver.d.ts +0 -6
  144. package/dist/resolvers/EntityResolver.d.ts.map +0 -1
  145. package/dist/resolvers/EntityResolver.js +0 -60
  146. package/dist/resolvers/EntityResolver.js.map +0 -1
  147. package/dist/resolvers/FileCategoryResolver.d.ts +0 -6
  148. package/dist/resolvers/FileCategoryResolver.d.ts.map +0 -1
  149. package/dist/resolvers/FileCategoryResolver.js +0 -65
  150. package/dist/resolvers/FileCategoryResolver.js.map +0 -1
  151. package/dist/resolvers/FileResolver.d.ts +0 -24
  152. package/dist/resolvers/FileResolver.d.ts.map +0 -1
  153. package/dist/resolvers/FileResolver.js +0 -162
  154. package/dist/resolvers/FileResolver.js.map +0 -1
  155. package/dist/resolvers/MergeRecordsResolver.d.ts +0 -59
  156. package/dist/resolvers/MergeRecordsResolver.d.ts.map +0 -1
  157. package/dist/resolvers/MergeRecordsResolver.js +0 -256
  158. package/dist/resolvers/MergeRecordsResolver.js.map +0 -1
  159. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +0 -29
  160. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +0 -1
  161. package/dist/resolvers/PotentialDuplicateRecordResolver.js +0 -127
  162. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +0 -1
  163. package/dist/resolvers/QueryResolver.d.ts +0 -13
  164. package/dist/resolvers/QueryResolver.d.ts.map +0 -1
  165. package/dist/resolvers/QueryResolver.js +0 -74
  166. package/dist/resolvers/QueryResolver.js.map +0 -1
  167. package/dist/resolvers/ReportResolver.d.ts +0 -20
  168. package/dist/resolvers/ReportResolver.d.ts.map +0 -1
  169. package/dist/resolvers/ReportResolver.js +0 -175
  170. package/dist/resolvers/ReportResolver.js.map +0 -1
  171. package/dist/resolvers/UserFavoriteResolver.d.ts +0 -42
  172. package/dist/resolvers/UserFavoriteResolver.d.ts.map +0 -1
  173. package/dist/resolvers/UserFavoriteResolver.js +0 -221
  174. package/dist/resolvers/UserFavoriteResolver.js.map +0 -1
  175. package/dist/resolvers/UserResolver.d.ts +0 -10
  176. package/dist/resolvers/UserResolver.d.ts.map +0 -1
  177. package/dist/resolvers/UserResolver.js +0 -72
  178. package/dist/resolvers/UserResolver.js.map +0 -1
  179. package/dist/resolvers/UserViewResolver.d.ts +0 -13
  180. package/dist/resolvers/UserViewResolver.d.ts.map +0 -1
  181. package/dist/resolvers/UserViewResolver.js +0 -102
  182. package/dist/resolvers/UserViewResolver.js.map +0 -1
  183. package/dist/types.d.ts +0 -17
  184. package/dist/types.d.ts.map +0 -1
  185. package/dist/types.js +0 -3
  186. package/dist/types.js.map +0 -1
  187. package/dist/util.d.ts +0 -4
  188. package/dist/util.d.ts.map +0 -1
  189. package/dist/util.js +0 -89
  190. package/dist/util.js.map +0 -1
  191. package/src/entitySubclasses/EntityBehavior.server.ts +0 -241
@@ -1,800 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- var AskSkipResolver_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.AskSkipResolver = exports.AskSkipResultType = void 0;
17
- const type_graphql_1 = require("type-graphql");
18
- const core_1 = require("@memberjunction/core");
19
- const sqlserver_dataprovider_1 = require("@memberjunction/sqlserver-dataprovider");
20
- const data_context_1 = require("@memberjunction/data-context");
21
- const data_context_server_1 = require("@memberjunction/data-context-server");
22
- (0, data_context_server_1.LoadDataContextItemsServer)();
23
- const PushStatusResolver_1 = require("../generic/PushStatusResolver");
24
- const config_1 = require("../config");
25
- const type_graphql_2 = require("type-graphql");
26
- const global_1 = require("@memberjunction/global");
27
- const util_1 = require("../util");
28
- const ai_1 = require("@memberjunction/ai");
29
- const KeyInputOutputTypes_1 = require("../generic/KeyInputOutputTypes");
30
- var SkipResponsePhase;
31
- (function (SkipResponsePhase) {
32
- SkipResponsePhase["ClarifyingQuestion"] = "clarifying_question";
33
- SkipResponsePhase["DataRequest"] = "data_request";
34
- SkipResponsePhase["AnalysisComplete"] = "analysis_complete";
35
- })(SkipResponsePhase || (SkipResponsePhase = {}));
36
- (0, type_graphql_2.registerEnumType)(SkipResponsePhase, {
37
- name: "SkipResponsePhase",
38
- description: "The phase of the respons: clarifying_question, data_request, or analysis_complete",
39
- });
40
- let AskSkipResultType = class AskSkipResultType {
41
- };
42
- exports.AskSkipResultType = AskSkipResultType;
43
- __decorate([
44
- (0, type_graphql_1.Field)(() => Boolean),
45
- __metadata("design:type", Boolean)
46
- ], AskSkipResultType.prototype, "Success", void 0);
47
- __decorate([
48
- (0, type_graphql_1.Field)(() => String),
49
- __metadata("design:type", String)
50
- ], AskSkipResultType.prototype, "Status", void 0);
51
- __decorate([
52
- (0, type_graphql_1.Field)(() => SkipResponsePhase),
53
- __metadata("design:type", String)
54
- ], AskSkipResultType.prototype, "ResponsePhase", void 0);
55
- __decorate([
56
- (0, type_graphql_1.Field)(() => String),
57
- __metadata("design:type", String)
58
- ], AskSkipResultType.prototype, "Result", void 0);
59
- __decorate([
60
- (0, type_graphql_1.Field)(() => type_graphql_1.Int),
61
- __metadata("design:type", Number)
62
- ], AskSkipResultType.prototype, "ConversationId", void 0);
63
- __decorate([
64
- (0, type_graphql_1.Field)(() => type_graphql_1.Int),
65
- __metadata("design:type", Number)
66
- ], AskSkipResultType.prototype, "UserMessageConversationDetailId", void 0);
67
- __decorate([
68
- (0, type_graphql_1.Field)(() => type_graphql_1.Int),
69
- __metadata("design:type", Number)
70
- ], AskSkipResultType.prototype, "AIMessageConversationDetailId", void 0);
71
- exports.AskSkipResultType = AskSkipResultType = __decorate([
72
- (0, type_graphql_1.ObjectType)()
73
- ], AskSkipResultType);
74
- let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
75
- async ExecuteAskSkipRecordChat(UserQuestion, ConversationId, EntityName, compositeKey, { dataSource, userPayload }, pubSub) {
76
- const user = sqlserver_dataprovider_1.UserCache.Instance.Users.find((u) => u.Email.trim().toLowerCase() === userPayload.email.trim().toLowerCase());
77
- if (!user)
78
- throw new Error(`User ${userPayload.email} not found in UserCache`);
79
- const messages = await this.LoadConversationDetailsIntoSkipMessages(dataSource, ConversationId, AskSkipResolver_1._maxHistoricalMessages);
80
- const md = new core_1.Metadata();
81
- const { convoEntity, dataContextEntity, convoDetailEntity, dataContext } = await this.HandleSkipInitialObjectLoading(dataSource, ConversationId, UserQuestion, user, userPayload, md, null);
82
- if (!ConversationId || ConversationId <= 0) {
83
- const dci = await md.GetEntityObject('Data Context Items', user);
84
- dci.DataContextID = dataContext.ID;
85
- dci.Type = 'single_record';
86
- dci.EntityID = md.Entities.find((e) => e.Name === EntityName)?.ID;
87
- const ck = new core_1.CompositeKey();
88
- ck.KeyValuePairs = compositeKey.KeyValuePairs;
89
- dci.RecordID = ck.Values();
90
- let dciSaveResult = await dci.Save();
91
- if (!dciSaveResult) {
92
- (0, core_1.LogError)(`Error saving DataContextItemEntity for record chat: ${EntityName} ${ck.Values()}`, undefined, dci.LatestResult);
93
- }
94
- await dataContext.Load(dataContext.ID, dataSource, false, true, 10, user);
95
- await dataContext.SaveItems(user, true);
96
- convoEntity.LinkedEntityID = dci.EntityID;
97
- convoEntity.LinkedRecordID = ck.Values();
98
- convoEntity.DataContextID = dataContext.ID;
99
- const convoEntitySaveResult = await convoEntity.Save();
100
- if (!convoEntitySaveResult) {
101
- (0, core_1.LogError)(`Error saving ConversationEntity for record chat: ${EntityName} ${ck.Values()}`, undefined, convoEntity.LatestResult);
102
- }
103
- }
104
- const input = this.buildSkipAPIRequest(messages, ConversationId, dataContext, 'chat_with_a_record', false, false);
105
- messages.push({
106
- content: UserQuestion,
107
- role: 'user'
108
- });
109
- return this.handleSimpleSkipPostRequest(input, convoEntity.ID, convoDetailEntity.ID, true, user);
110
- }
111
- async handleSimpleSkipPostRequest(input, conversationID = 0, UserMessageConversationDetailId = 0, createAIMessageConversationDetail = false, user = null) {
112
- (0, core_1.LogStatus)(` >>> HandleSimpleSkipPostRequest Sending request to Skip API: ${config_1.___skipAPIurl}`);
113
- const response = await (0, util_1.sendPostRequest)(config_1.___skipAPIurl, input, true, null);
114
- if (response && response.length > 0) {
115
- const apiResponse = response[response.length - 1].value;
116
- const AIMessageConversationDetailID = createAIMessageConversationDetail ? await this.CreateAIMessageConversationDetail(apiResponse, conversationID, user) : 0;
117
- (0, core_1.LogStatus)(` Skip API response: ${apiResponse.responsePhase}`);
118
- return {
119
- Success: true,
120
- Status: 'OK',
121
- ResponsePhase: SkipResponsePhase.AnalysisComplete,
122
- ConversationId: conversationID,
123
- UserMessageConversationDetailId: UserMessageConversationDetailId,
124
- AIMessageConversationDetailId: AIMessageConversationDetailID,
125
- Result: JSON.stringify(apiResponse)
126
- };
127
- }
128
- else {
129
- return {
130
- Success: false,
131
- Status: 'Error',
132
- Result: `Request failed`,
133
- ResponsePhase: SkipResponsePhase.AnalysisComplete,
134
- ConversationId: conversationID,
135
- UserMessageConversationDetailId: UserMessageConversationDetailId,
136
- AIMessageConversationDetailId: 0,
137
- };
138
- }
139
- }
140
- async CreateAIMessageConversationDetail(apiResponse, conversationID, user) {
141
- const md = new core_1.Metadata();
142
- const convoDetailEntityAI = await md.GetEntityObject('Conversation Details', user);
143
- convoDetailEntityAI.NewRecord();
144
- convoDetailEntityAI.HiddenToUser = false;
145
- convoDetailEntityAI.ConversationID = conversationID;
146
- const systemMessages = apiResponse.messages.filter((m) => m.role === 'system');
147
- const lastSystemMessage = systemMessages[systemMessages.length - 1];
148
- convoDetailEntityAI.Message = lastSystemMessage?.content;
149
- convoDetailEntityAI.Role = 'AI';
150
- if (await convoDetailEntityAI.Save()) {
151
- return convoDetailEntityAI.ID;
152
- }
153
- else {
154
- (0, core_1.LogError)(`Error saving conversation detail entity for AI message: ${lastSystemMessage?.content}`, undefined, convoDetailEntityAI.LatestResult);
155
- return 0;
156
- }
157
- }
158
- buildSkipAPIRequest(messages, conversationId, dataContext, requestPhase, includeEntities, includeQueries) {
159
- const entities = includeEntities ? this.BuildSkipEntities() : [];
160
- const queries = includeQueries ? this.BuildSkipQueries() : [];
161
- const input = {
162
- apiKeys: this.buildSkipAPIKeys(),
163
- organizationInfo: config_1.configInfo?.askSkip?.organizationInfo,
164
- messages: messages,
165
- conversationID: conversationId.toString(),
166
- dataContext: (0, global_1.CopyScalarsAndArrays)(dataContext),
167
- organizationID: !isNaN(parseInt(config_1.___skipAPIOrgId)) ? parseInt(config_1.___skipAPIOrgId) : 0,
168
- requestPhase: requestPhase,
169
- entities: entities,
170
- queries: queries
171
- };
172
- return input;
173
- }
174
- async ExecuteAskSkipRunScript({ dataSource, userPayload }, pubSub, DataContextId, ScriptText) {
175
- const user = sqlserver_dataprovider_1.UserCache.Instance.Users.find((u) => u.Email.trim().toLowerCase() === userPayload.email.trim().toLowerCase());
176
- if (!user)
177
- throw new Error(`User ${userPayload.email} not found in UserCache`);
178
- const dataContext = new data_context_1.DataContext();
179
- await dataContext.Load(DataContextId, dataSource, true, false, 0, user);
180
- const input = this.buildSkipAPIRequest([], 0, dataContext, 'run_existing_script', false, false);
181
- return this.handleSimpleSkipPostRequest(input);
182
- }
183
- buildSkipAPIKeys() {
184
- return [
185
- {
186
- vendorDriverName: 'OpenAILLM',
187
- apiKey: (0, ai_1.GetAIAPIKey)('OpenAILLM')
188
- },
189
- {
190
- vendorDriverName: 'AnthropicLLM',
191
- apiKey: (0, ai_1.GetAIAPIKey)('AnthropicLLM')
192
- },
193
- {
194
- vendorDriverName: 'GeminiLLM',
195
- apiKey: (0, ai_1.GetAIAPIKey)('GeminiLLM')
196
- },
197
- {
198
- vendorDriverName: 'GroqLLM',
199
- apiKey: (0, ai_1.GetAIAPIKey)('GroqLLM')
200
- },
201
- {
202
- vendorDriverName: 'MistralLLM',
203
- apiKey: (0, ai_1.GetAIAPIKey)('MistralLLM')
204
- },
205
- ];
206
- }
207
- async ExecuteAskSkipAnalysisQuery(UserQuestion, ConversationId, { dataSource, userPayload }, pubSub, DataContextId) {
208
- const md = new core_1.Metadata();
209
- const user = sqlserver_dataprovider_1.UserCache.Instance.Users.find((u) => u.Email.trim().toLowerCase() === userPayload.email.trim().toLowerCase());
210
- if (!user)
211
- throw new Error(`User ${userPayload.email} not found in UserCache`);
212
- const { convoEntity, dataContextEntity, convoDetailEntity, dataContext } = await this.HandleSkipInitialObjectLoading(dataSource, ConversationId, UserQuestion, user, userPayload, md, DataContextId);
213
- const messages = await this.LoadConversationDetailsIntoSkipMessages(dataSource, convoEntity.ID, AskSkipResolver_1._maxHistoricalMessages);
214
- const input = this.buildSkipAPIRequest(messages, ConversationId, dataContext, 'initial_request', true, true);
215
- return this.HandleSkipRequest(input, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, convoEntity, convoDetailEntity, dataContext, dataContextEntity);
216
- }
217
- BuildSkipQueries() {
218
- const md = new core_1.Metadata();
219
- return md.Queries.map((q) => {
220
- return {
221
- id: q.ID,
222
- name: q.Name,
223
- description: q.Description,
224
- category: q.Category,
225
- sql: q.SQL,
226
- originalSQL: q.OriginalSQL,
227
- feedback: q.Feedback,
228
- status: q.Status,
229
- qualityRank: q.QualityRank,
230
- createdAt: q.__mj_CreatedAt,
231
- updatedAt: q.__mj_UpdatedAt,
232
- categoryID: q.CategoryID,
233
- fields: q.Fields.map((f) => {
234
- return {
235
- id: f.ID,
236
- queryID: f.QueryID,
237
- sequence: f.Sequence,
238
- name: f.Name,
239
- description: f.Description,
240
- sqlBaseType: f.SQLBaseType,
241
- sqlFullType: f.SQLFullType,
242
- sourceEntityID: f.SourceEntityID,
243
- sourceEntity: f.SourceEntity,
244
- sourceFieldName: f.SourceFieldName,
245
- isComputed: f.IsComputed,
246
- computationDescription: f.ComputationDescription,
247
- isSummary: f.IsSummary,
248
- summaryDescription: f.SummaryDescription,
249
- createdAt: f.__mj_CreatedAt,
250
- updatedAt: f.__mj_UpdatedAt,
251
- };
252
- })
253
- };
254
- });
255
- }
256
- BuildSkipEntities() {
257
- const md = new core_1.Metadata();
258
- return md.Entities.filter(e => e.SchemaName !== config_1.mj_core_schema).map((e) => {
259
- const ret = {
260
- id: e.ID,
261
- name: e.Name,
262
- schemaName: e.SchemaName,
263
- baseView: e.BaseView,
264
- description: e.Description,
265
- fields: e.Fields.map((f) => {
266
- return {
267
- id: f.ID,
268
- entityID: f.EntityID,
269
- sequence: f.Sequence,
270
- name: f.Name,
271
- displayName: f.DisplayName,
272
- category: f.Category,
273
- type: f.Type,
274
- description: f.Description,
275
- isPrimaryKey: f.IsPrimaryKey,
276
- allowsNull: f.AllowsNull,
277
- isUnique: f.IsUnique,
278
- length: f.Length,
279
- precision: f.Precision,
280
- scale: f.Scale,
281
- sqlFullType: f.SQLFullType,
282
- defaultValue: f.DefaultValue,
283
- autoIncrement: f.AutoIncrement,
284
- valueListType: f.ValueListType,
285
- extendedType: f.ExtendedType,
286
- defaultInView: f.DefaultInView,
287
- defaultColumnWidth: f.DefaultColumnWidth,
288
- isVirtual: f.IsVirtual,
289
- isNameField: f.IsNameField,
290
- relatedEntityID: f.RelatedEntityID,
291
- relatedEntityFieldName: f.RelatedEntityFieldName,
292
- relatedEntity: f.RelatedEntity,
293
- relatedEntitySchemaName: f.RelatedEntitySchemaName,
294
- relatedEntityBaseView: f.RelatedEntityBaseView,
295
- };
296
- }),
297
- relatedEntities: e.RelatedEntities.map((r) => {
298
- return {
299
- entityID: r.EntityID,
300
- relatedEntityID: r.RelatedEntityID,
301
- type: r.Type,
302
- entityKeyField: r.EntityKeyField,
303
- relatedEntityJoinField: r.RelatedEntityJoinField,
304
- joinView: r.JoinView,
305
- joinEntityJoinField: r.JoinEntityJoinField,
306
- joinEntityInverseJoinField: r.JoinEntityInverseJoinField,
307
- entity: r.Entity,
308
- entityBaseView: r.EntityBaseView,
309
- relatedEntity: r.RelatedEntity,
310
- relatedEntityBaseView: r.RelatedEntityBaseView,
311
- };
312
- })
313
- };
314
- return ret;
315
- });
316
- }
317
- async HandleSkipInitialObjectLoading(dataSource, ConversationId, UserQuestion, user, userPayload, md, DataContextId) {
318
- const convoEntity = await md.GetEntityObject('Conversations', user);
319
- let dataContextEntity;
320
- if (!ConversationId || ConversationId <= 0) {
321
- convoEntity.NewRecord();
322
- if (user) {
323
- convoEntity.UserID = user.ID;
324
- convoEntity.Name = AskSkipResolver_1._defaultNewChatName;
325
- dataContextEntity = await md.GetEntityObject('Data Contexts', user);
326
- if (!DataContextId || DataContextId <= 0) {
327
- dataContextEntity.NewRecord();
328
- dataContextEntity.UserID = user.ID;
329
- dataContextEntity.Name = 'Data Context for Skip Conversation';
330
- if (!await dataContextEntity.Save()) {
331
- (0, core_1.LogError)(`Creating a new data context failed`, undefined, dataContextEntity.LatestResult);
332
- throw new Error(`Creating a new data context failed`);
333
- }
334
- }
335
- else {
336
- const dcLoadResult = await dataContextEntity.Load(DataContextId);
337
- if (!dcLoadResult) {
338
- throw new Error(`Loading DataContextEntity for DataContextId ${DataContextId} failed`);
339
- }
340
- }
341
- convoEntity.DataContextID = dataContextEntity.ID;
342
- if (await convoEntity.Save()) {
343
- ConversationId = convoEntity.ID;
344
- if (!DataContextId || dataContextEntity.ID <= 0) {
345
- dataContextEntity.Name += ` ${ConversationId}`;
346
- const dciSaveResult = await dataContextEntity.Save();
347
- if (!dciSaveResult) {
348
- (0, core_1.LogError)(`Error saving DataContextEntity for conversation: ${ConversationId}`, undefined, dataContextEntity.LatestResult);
349
- }
350
- }
351
- }
352
- else {
353
- (0, core_1.LogError)(`Creating a new conversation failed`, undefined, convoEntity.LatestResult);
354
- throw new Error(`Creating a new conversation failed`);
355
- }
356
- }
357
- else {
358
- throw new Error(`User ${userPayload.email} not found in UserCache`);
359
- }
360
- }
361
- else {
362
- await convoEntity.Load(ConversationId);
363
- dataContextEntity = await md.GetEntityObject('Data Contexts', user);
364
- if (DataContextId && DataContextId > 0 && DataContextId !== convoEntity.DataContextID) {
365
- if (convoEntity.DataContextID === null) {
366
- convoEntity.DataContextID = DataContextId;
367
- const convoEntitySaveResult = await convoEntity.Save();
368
- if (!convoEntitySaveResult) {
369
- (0, core_1.LogError)(`Error saving conversation entity for conversation: ${ConversationId}`, undefined, convoEntity.LatestResult);
370
- }
371
- }
372
- else
373
- console.warn(`AskSkipResolver: DataContextId ${DataContextId} was passed in but it was ignored because it was different than the DataContextID in the conversation ${convoEntity.DataContextID}`);
374
- }
375
- await dataContextEntity.Load(convoEntity.DataContextID);
376
- }
377
- const convoDetailEntity = await md.GetEntityObject('Conversation Details', user);
378
- convoDetailEntity.NewRecord();
379
- convoDetailEntity.ConversationID = ConversationId;
380
- convoDetailEntity.Message = UserQuestion;
381
- convoDetailEntity.Role = 'User';
382
- convoDetailEntity.HiddenToUser = false;
383
- convoDetailEntity.Set('Sequence', 1);
384
- let convoDetailSaveResult = await convoDetailEntity.Save();
385
- if (!convoDetailSaveResult) {
386
- (0, core_1.LogError)(`Error saving conversation detail entity for user message: ${UserQuestion}`, undefined, convoDetailEntity.LatestResult);
387
- }
388
- const dataContext = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(data_context_1.DataContext);
389
- await dataContext.Load(dataContextEntity.ID, dataSource, false, false, 0, user);
390
- return { dataContext, convoEntity, dataContextEntity, convoDetailEntity };
391
- }
392
- async LoadConversationDetailsIntoSkipMessages(dataSource, ConversationId, maxHistoricalMessages) {
393
- try {
394
- const md = new core_1.Metadata();
395
- const e = md.Entities.find((e) => e.Name === 'Conversation Details');
396
- const sql = `SELECT
397
- ${maxHistoricalMessages ? 'TOP ' + maxHistoricalMessages : ''} ID, Message, Role, __mj_CreatedAt
398
- FROM
399
- ${e.SchemaName}.${e.BaseView}
400
- WHERE
401
- ConversationID = ${ConversationId}
402
- ORDER
403
- BY __mj_CreatedAt DESC`;
404
- const result = await dataSource.query(sql);
405
- if (!result)
406
- throw new Error(`Error running SQL: ${sql}`);
407
- else {
408
- const returnData = result.sort((a, b) => {
409
- const aDate = new Date(a.__mj_CreatedAt);
410
- const bDate = new Date(b.__mj_CreatedAt);
411
- return aDate.getTime() - bDate.getTime();
412
- });
413
- return returnData.map((r) => {
414
- const skipRole = this.MapDBRoleToSkipRole(r.Role);
415
- let outputMessage;
416
- if (skipRole === 'system') {
417
- let detail;
418
- try {
419
- detail = JSON.parse(r.Message);
420
- }
421
- catch (e) {
422
- detail = null;
423
- outputMessage = r.Message;
424
- }
425
- if (detail?.responsePhase === SkipResponsePhase.AnalysisComplete) {
426
- const analysisDetail = detail;
427
- outputMessage = JSON.stringify({
428
- responsePhase: SkipResponsePhase.AnalysisComplete,
429
- techExplanation: analysisDetail.techExplanation,
430
- userExplanation: analysisDetail.userExplanation,
431
- scriptText: analysisDetail.scriptText,
432
- tableDataColumns: analysisDetail.tableDataColumns
433
- });
434
- }
435
- else if (detail?.responsePhase === SkipResponsePhase.ClarifyingQuestion) {
436
- const clarifyingQuestionDetail = detail;
437
- outputMessage = JSON.stringify({
438
- responsePhase: SkipResponsePhase.ClarifyingQuestion,
439
- clarifyingQuestion: clarifyingQuestionDetail.clarifyingQuestion
440
- });
441
- }
442
- else if (detail) {
443
- (0, core_1.LogError)(`Unknown response phase: ${detail.responsePhase}`);
444
- }
445
- }
446
- const m = {
447
- content: skipRole === 'system' ? outputMessage : r.Message,
448
- role: skipRole,
449
- };
450
- return m;
451
- });
452
- }
453
- }
454
- catch (e) {
455
- (0, core_1.LogError)(e);
456
- throw e;
457
- }
458
- }
459
- MapDBRoleToSkipRole(role) {
460
- switch (role.trim().toLowerCase()) {
461
- case 'ai':
462
- case 'system':
463
- case 'assistant':
464
- return 'system';
465
- default:
466
- return 'user';
467
- }
468
- }
469
- async HandleSkipRequest(input, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, convoEntity, convoDetailEntity, dataContext, dataContextEntity) {
470
- (0, core_1.LogStatus)(` >>> HandleSkipRequest: Sending request to Skip API: ${config_1.___skipAPIurl}`);
471
- const response = await (0, util_1.sendPostRequest)(config_1.___skipAPIurl, input, true, null, (message) => {
472
- (0, core_1.LogStatus)(JSON.stringify(message, null, 4));
473
- if (message.type === 'status_update') {
474
- pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
475
- message: JSON.stringify({
476
- type: 'AskSkip',
477
- status: 'OK',
478
- conversationID: ConversationId,
479
- ResponsePhase: message.value.responsePhase,
480
- message: message.value.messages[0].content
481
- }),
482
- sessionId: userPayload.sessionId
483
- });
484
- }
485
- });
486
- if (response && response.length > 0) {
487
- const apiResponse = response[response.length - 1].value;
488
- (0, core_1.LogStatus)(` Skip API response: ${apiResponse.responsePhase}`);
489
- this.PublishApiResponseUserUpdateMessage(apiResponse, userPayload, ConversationId, pubSub);
490
- if (apiResponse.responsePhase === 'data_request') {
491
- return await this.HandleDataRequestPhase(input, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, convoEntity, convoDetailEntity, dataContext, dataContextEntity);
492
- }
493
- else if (apiResponse.responsePhase === 'clarifying_question') {
494
- return await this.HandleClarifyingQuestionPhase(input, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, convoEntity, convoDetailEntity);
495
- }
496
- else if (apiResponse.responsePhase === 'analysis_complete') {
497
- return await this.HandleAnalysisComplete(input, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, convoEntity, convoDetailEntity, dataContext, dataContextEntity);
498
- }
499
- else {
500
- throw new Error(`Unknown Skip API response phase: ${apiResponse.responsePhase}`);
501
- }
502
- }
503
- else {
504
- pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
505
- message: JSON.stringify({
506
- type: 'AskSkip',
507
- status: 'Error',
508
- conversationID: ConversationId,
509
- message: 'Analysis failed to run, please try again later and if this continues, contact your support desk.',
510
- }),
511
- sessionId: userPayload.sessionId
512
- });
513
- return {
514
- Success: false,
515
- Status: 'Error',
516
- Result: `User Question ${UserQuestion} didn't work!`,
517
- ResponsePhase: SkipResponsePhase.AnalysisComplete,
518
- ConversationId: ConversationId,
519
- UserMessageConversationDetailId: 0,
520
- AIMessageConversationDetailId: 0,
521
- };
522
- }
523
- }
524
- async PublishApiResponseUserUpdateMessage(apiResponse, userPayload, conversationID, pubSub) {
525
- let sUserMessage = '';
526
- switch (apiResponse.responsePhase) {
527
- case 'data_request':
528
- sUserMessage = 'We need to gather some more data, I will do that next and update you soon.';
529
- break;
530
- case 'analysis_complete':
531
- sUserMessage = 'I have completed the analysis, the results will be available momentarily.';
532
- break;
533
- case 'clarifying_question':
534
- break;
535
- }
536
- pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
537
- message: JSON.stringify({
538
- type: 'AskSkip',
539
- status: 'OK',
540
- conversationID,
541
- message: sUserMessage,
542
- }),
543
- sessionId: userPayload.sessionId
544
- });
545
- }
546
- async HandleAnalysisComplete(apiRequest, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, convoEntity, convoDetailEntity, dataContext, dataContextEntity) {
547
- const md = new core_1.Metadata();
548
- const { AIMessageConversationDetailID } = await this.FinishConversationAndNotifyUser(apiResponse, dataContext, dataContextEntity, md, user, convoEntity, pubSub, userPayload);
549
- const response = {
550
- Success: true,
551
- Status: 'OK',
552
- ResponsePhase: SkipResponsePhase.AnalysisComplete,
553
- ConversationId: ConversationId,
554
- UserMessageConversationDetailId: convoDetailEntity.ID,
555
- AIMessageConversationDetailId: AIMessageConversationDetailID,
556
- Result: JSON.stringify(apiResponse)
557
- };
558
- return response;
559
- }
560
- async HandleClarifyingQuestionPhase(apiRequest, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, convoEntity, convoDetailEntity) {
561
- const md = new core_1.Metadata();
562
- const convoDetailEntityAI = await md.GetEntityObject('Conversation Details', user);
563
- convoDetailEntityAI.NewRecord();
564
- convoDetailEntityAI.ConversationID = ConversationId;
565
- convoDetailEntityAI.Message = JSON.stringify(apiResponse);
566
- convoDetailEntityAI.Role = 'AI';
567
- convoDetailEntityAI.HiddenToUser = false;
568
- if (await convoDetailEntityAI.Save()) {
569
- return {
570
- Success: true,
571
- Status: 'OK',
572
- ResponsePhase: SkipResponsePhase.ClarifyingQuestion,
573
- ConversationId: ConversationId,
574
- UserMessageConversationDetailId: convoDetailEntity.ID,
575
- AIMessageConversationDetailId: convoDetailEntityAI.ID,
576
- Result: JSON.stringify(apiResponse)
577
- };
578
- }
579
- else {
580
- (0, core_1.LogError)(`Error saving conversation detail entity for AI message: ${apiResponse.clarifyingQuestion}`, undefined, convoDetailEntityAI.LatestResult);
581
- return {
582
- Success: false,
583
- Status: 'Error',
584
- ResponsePhase: SkipResponsePhase.ClarifyingQuestion,
585
- ConversationId: ConversationId,
586
- UserMessageConversationDetailId: convoDetailEntity.ID,
587
- AIMessageConversationDetailId: convoDetailEntityAI.ID,
588
- Result: JSON.stringify(apiResponse)
589
- };
590
- }
591
- }
592
- async HandleDataRequestPhase(apiRequest, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, convoEntity, convoDetailEntity, dataContext, dataContextEntity) {
593
- try {
594
- if (!apiResponse.success) {
595
- (0, core_1.LogError)(`Data request/gathering from Skip API failed: ${apiResponse.error}`);
596
- return {
597
- Success: false,
598
- Status: `The Skip API Server data gathering phase returned a non-recoverable error. Try again later and Skip might be able to handle this request.\n${apiResponse.error}`,
599
- ResponsePhase: SkipResponsePhase.DataRequest,
600
- ConversationId: ConversationId,
601
- UserMessageConversationDetailId: convoDetailEntity.ID,
602
- AIMessageConversationDetailId: 0,
603
- Result: JSON.stringify(apiResponse)
604
- };
605
- }
606
- const _maxDataGatheringRetries = 5;
607
- const _dataGatheringFailureHeaderMessage = '***DATA GATHERING FAILURE***';
608
- const md = new core_1.Metadata();
609
- const executionErrors = [];
610
- let dataRequest = apiResponse.dataRequest;
611
- apiRequest.messages.push({
612
- content: `Skip API Requested Data as shown below
613
- ${JSON.stringify(apiResponse.dataRequest)}`,
614
- role: 'system'
615
- });
616
- if (!Array.isArray(dataRequest)) {
617
- if (dataRequest) {
618
- dataRequest = [dataRequest];
619
- }
620
- else {
621
- const errorMessage = `Data request from Skip API is not an array and not a single item.`;
622
- (0, core_1.LogError)(errorMessage);
623
- executionErrors.push({ dataRequest: apiResponse.dataRequest, errorMessage: errorMessage });
624
- dataRequest = [];
625
- }
626
- }
627
- for (const dr of dataRequest) {
628
- try {
629
- const item = dataContext.AddDataContextItem();
630
- switch (dr.type) {
631
- case "sql":
632
- item.Type = 'sql';
633
- item.SQL = dr.text;
634
- item.AdditionalDescription = dr.description;
635
- if (!await item.LoadData(dataSource, false, false, 0, user))
636
- throw new Error(`SQL data request failed: ${item.DataLoadingError}`);
637
- break;
638
- case "stored_query":
639
- const queryName = dr.text;
640
- const query = md.Queries.find((q) => q.Name === queryName);
641
- if (query) {
642
- item.Type = 'query';
643
- item.QueryID = query.ID;
644
- item.RecordName = query.Name;
645
- item.AdditionalDescription = dr.description;
646
- if (!await item.LoadData(dataSource, false, false, 0, user))
647
- throw new Error(`SQL data request failed: ${item.DataLoadingError}`);
648
- }
649
- else
650
- throw new Error(`Query ${queryName} not found.`);
651
- break;
652
- default:
653
- throw new Error(`Unknown data request type: ${dr.type}`);
654
- break;
655
- }
656
- }
657
- catch (e) {
658
- (0, core_1.LogError)(e);
659
- executionErrors.push({ dataRequest: dr, errorMessage: e && e.message ? e.message : e.toString() });
660
- }
661
- }
662
- if (executionErrors.length > 0) {
663
- const dataGatheringFailedAttemptCount = apiRequest.messages.filter((m) => m.content.includes(_dataGatheringFailureHeaderMessage)).length + 1;
664
- if (dataGatheringFailedAttemptCount > _maxDataGatheringRetries) {
665
- (0, core_1.LogStatus)(`Execution errors for Skip data request occured, and we have exceeded the max retries${_maxDataGatheringRetries}, sending errors back to the user.`);
666
- return {
667
- Success: false,
668
- Status: 'Error gathering data and we have exceedded the max retries. Try again later and Skip might be able to handle this request.',
669
- ResponsePhase: SkipResponsePhase.DataRequest,
670
- ConversationId: ConversationId,
671
- UserMessageConversationDetailId: convoDetailEntity.ID,
672
- AIMessageConversationDetailId: 0,
673
- Result: JSON.stringify(apiResponse)
674
- };
675
- }
676
- else {
677
- (0, core_1.LogStatus)(`Execution errors for Skip data request occured, sending those errors back to the Skip API to get new instructions.`);
678
- apiRequest.requestPhase = 'data_gathering_failure';
679
- apiRequest.messages.push({
680
- content: `${_dataGatheringFailureHeaderMessage} #${dataGatheringFailedAttemptCount} of ${_maxDataGatheringRetries} attempts to gather data failed. Errors:
681
- ${JSON.stringify(executionErrors)}
682
- `,
683
- role: 'user'
684
- });
685
- }
686
- }
687
- else {
688
- await dataContext.SaveItems(user, false);
689
- apiRequest.dataContext = (0, global_1.CopyScalarsAndArrays)(dataContext);
690
- apiRequest.requestPhase = 'data_gathering_response';
691
- }
692
- return this.HandleSkipRequest(apiRequest, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, convoEntity, convoDetailEntity, dataContext, dataContextEntity);
693
- }
694
- catch (e) {
695
- (0, core_1.LogError)(e);
696
- throw e;
697
- }
698
- }
699
- async FinishConversationAndNotifyUser(apiResponse, dataContext, dataContextEntity, md, user, convoEntity, pubSub, userPayload) {
700
- const sTitle = apiResponse.reportTitle;
701
- const sResult = JSON.stringify(apiResponse);
702
- const convoDetailEntityAI = await md.GetEntityObject('Conversation Details', user);
703
- convoDetailEntityAI.NewRecord();
704
- convoDetailEntityAI.ConversationID = convoEntity.ID;
705
- convoDetailEntityAI.Message = sResult;
706
- convoDetailEntityAI.Role = 'AI';
707
- convoDetailEntityAI.HiddenToUser = false;
708
- convoDetailEntityAI.Set('Sequence', 2);
709
- const convoDetailSaveResult = await convoDetailEntityAI.Save();
710
- if (!convoDetailSaveResult) {
711
- (0, core_1.LogError)(`Error saving conversation detail entity for AI message: ${sResult}`, undefined, convoDetailEntityAI.LatestResult);
712
- }
713
- if (convoEntity.Name === AskSkipResolver_1._defaultNewChatName && sTitle && sTitle !== AskSkipResolver_1._defaultNewChatName) {
714
- convoEntity.Name = sTitle;
715
- const convoEntitySaveResult = await convoEntity.Save();
716
- if (!convoEntitySaveResult) {
717
- (0, core_1.LogError)(`Error saving conversation entity for AI message: ${sResult}`, undefined, convoEntity.LatestResult);
718
- }
719
- }
720
- const userNotification = await md.GetEntityObject('User Notifications', user);
721
- userNotification.NewRecord();
722
- userNotification.UserID = user.ID;
723
- userNotification.Title = 'Report Created: ' + sTitle;
724
- userNotification.Message = `Good news! Skip finished creating a report for you, click on this notification to jump back into the conversation.`;
725
- userNotification.Unread = true;
726
- userNotification.ResourceConfiguration = JSON.stringify({
727
- type: 'askskip',
728
- conversationId: convoEntity.ID,
729
- });
730
- const userNotificationSaveResult = await userNotification.Save();
731
- if (!userNotificationSaveResult) {
732
- (0, core_1.LogError)(`Error saving user notification entity for AI message: ${sResult}`, undefined, userNotification.LatestResult);
733
- }
734
- dataContext.SaveItems(user, false);
735
- pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
736
- message: JSON.stringify({
737
- type: 'UserNotifications',
738
- status: 'OK',
739
- conversationID: convoEntity.ID,
740
- details: {
741
- action: 'create',
742
- recordId: userNotification.ID,
743
- }
744
- }),
745
- sessionId: userPayload.sessionId,
746
- });
747
- return {
748
- AIMessageConversationDetailID: convoDetailEntityAI.ID
749
- };
750
- }
751
- async getViewData(ViewId, user) {
752
- const rv = new core_1.RunView();
753
- const result = await rv.RunView({ ViewID: ViewId, IgnoreMaxRows: true }, user);
754
- if (result && result.Success)
755
- return result.Results;
756
- else
757
- throw new Error(`Error running view ${ViewId}`);
758
- }
759
- };
760
- exports.AskSkipResolver = AskSkipResolver;
761
- AskSkipResolver._defaultNewChatName = 'New Chat';
762
- AskSkipResolver._maxHistoricalMessages = 20;
763
- __decorate([
764
- (0, type_graphql_1.Query)(() => AskSkipResultType),
765
- __param(0, (0, type_graphql_1.Arg)('UserQuestion', () => String)),
766
- __param(1, (0, type_graphql_1.Arg)('ConversationId', () => type_graphql_1.Int)),
767
- __param(2, (0, type_graphql_1.Arg)('EntityName', () => String)),
768
- __param(3, (0, type_graphql_1.Arg)('CompositeKey', () => KeyInputOutputTypes_1.CompositeKeyInputType)),
769
- __param(4, (0, type_graphql_1.Ctx)()),
770
- __param(5, (0, type_graphql_1.PubSub)()),
771
- __metadata("design:type", Function),
772
- __metadata("design:paramtypes", [String, Number, String, KeyInputOutputTypes_1.CompositeKeyInputType, Object, type_graphql_1.PubSubEngine]),
773
- __metadata("design:returntype", Promise)
774
- ], AskSkipResolver.prototype, "ExecuteAskSkipRecordChat", null);
775
- __decorate([
776
- (0, type_graphql_1.Query)(() => AskSkipResultType),
777
- __param(0, (0, type_graphql_1.Ctx)()),
778
- __param(1, (0, type_graphql_1.PubSub)()),
779
- __param(2, (0, type_graphql_1.Arg)('DataContextId', () => type_graphql_1.Int)),
780
- __param(3, (0, type_graphql_1.Arg)('ScriptText', () => String)),
781
- __metadata("design:type", Function),
782
- __metadata("design:paramtypes", [Object, type_graphql_1.PubSubEngine, Number, String]),
783
- __metadata("design:returntype", Promise)
784
- ], AskSkipResolver.prototype, "ExecuteAskSkipRunScript", null);
785
- __decorate([
786
- (0, type_graphql_1.Query)(() => AskSkipResultType),
787
- __param(0, (0, type_graphql_1.Arg)('UserQuestion', () => String)),
788
- __param(1, (0, type_graphql_1.Arg)('ConversationId', () => type_graphql_1.Int)),
789
- __param(2, (0, type_graphql_1.Ctx)()),
790
- __param(3, (0, type_graphql_1.PubSub)()),
791
- __param(4, (0, type_graphql_1.Arg)('DataContextId', () => type_graphql_1.Int, { nullable: true })),
792
- __metadata("design:type", Function),
793
- __metadata("design:paramtypes", [String, Number, Object, type_graphql_1.PubSubEngine, Number]),
794
- __metadata("design:returntype", Promise)
795
- ], AskSkipResolver.prototype, "ExecuteAskSkipAnalysisQuery", null);
796
- exports.AskSkipResolver = AskSkipResolver = AskSkipResolver_1 = __decorate([
797
- (0, type_graphql_1.Resolver)(AskSkipResultType)
798
- ], AskSkipResolver);
799
- exports.default = AskSkipResolver;
800
- //# sourceMappingURL=AskSkipResolver.js.map