@memberjunction/server 0.9.155 → 0.9.158
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build.log.json
CHANGED
|
@@ -23,6 +23,7 @@ const sqlserver_dataprovider_1 = require("@memberjunction/sqlserver-dataprovider
|
|
|
23
23
|
const skip_types_1 = require("@memberjunction/skip-types");
|
|
24
24
|
const axios_1 = __importDefault(require("axios"));
|
|
25
25
|
const PushStatusResolver_1 = require("../generic/PushStatusResolver");
|
|
26
|
+
const ___skipAPIurl = 'http://localhost:8000';
|
|
26
27
|
let AskSkipResultType = class AskSkipResultType {
|
|
27
28
|
};
|
|
28
29
|
exports.AskSkipResultType = AskSkipResultType;
|
|
@@ -88,10 +89,7 @@ let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
|
88
89
|
dataContext.Items.push({
|
|
89
90
|
Type: 'view',
|
|
90
91
|
RecordID: ViewId,
|
|
91
|
-
|
|
92
|
-
dataContext.Items.push({
|
|
93
|
-
Type: 'view',
|
|
94
|
-
RecordID: 123,
|
|
92
|
+
Data: await this.getViewData(ViewId, user),
|
|
95
93
|
});
|
|
96
94
|
const messages = [
|
|
97
95
|
{
|
|
@@ -106,18 +104,20 @@ let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
|
106
104
|
organizationID: !isNaN(parseInt(OrganizationId)) ? parseInt(OrganizationId) : 0,
|
|
107
105
|
requestPhase: 'initial_request'
|
|
108
106
|
};
|
|
109
|
-
const url = 'http://localhost:8000';
|
|
110
107
|
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
111
108
|
message: JSON.stringify({
|
|
112
109
|
type: 'AskSkip',
|
|
113
110
|
status: 'OK',
|
|
114
|
-
message: '
|
|
111
|
+
message: 'I will be happy to help and will start by analyzing your request...',
|
|
115
112
|
}),
|
|
116
113
|
sessionId: userPayload.sessionId,
|
|
117
114
|
});
|
|
115
|
+
return this.HandleSkipRequest(input, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, convoEntity, convoDetailEntity);
|
|
116
|
+
}
|
|
117
|
+
async HandleSkipRequest(input, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, convoEntity, convoDetailEntity) {
|
|
118
118
|
const response = await (0, axios_1.default)({
|
|
119
119
|
method: 'post',
|
|
120
|
-
url:
|
|
120
|
+
url: ___skipAPIurl,
|
|
121
121
|
data: input,
|
|
122
122
|
});
|
|
123
123
|
if (response.status === 200) {
|
|
@@ -142,14 +142,12 @@ let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
|
142
142
|
}),
|
|
143
143
|
sessionId: userPayload.sessionId,
|
|
144
144
|
});
|
|
145
|
-
let nextAPIResponse = null;
|
|
146
145
|
if (apiResponse.responsePhase === 'data_request') {
|
|
147
|
-
|
|
146
|
+
return await this.HandleDataRequestPhase(input, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub);
|
|
148
147
|
}
|
|
149
148
|
else if (apiResponse.responsePhase === 'clarifying_question') {
|
|
150
149
|
}
|
|
151
150
|
else if (apiResponse.responsePhase === 'analysis_complete') {
|
|
152
|
-
nextAPIResponse = apiResponse;
|
|
153
151
|
}
|
|
154
152
|
const { AIMessageConversationDetailID } = await this.FinishConversationAndNotifyUser(apiResponse, md, user, convoEntity, pubSub, userPayload);
|
|
155
153
|
return {
|
|
@@ -180,8 +178,61 @@ let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
|
180
178
|
};
|
|
181
179
|
}
|
|
182
180
|
}
|
|
183
|
-
async HandleDataRequestPhase(apiResponse, user, dataSource, ConversationId, userPayload, pubSub) {
|
|
184
|
-
|
|
181
|
+
async HandleDataRequestPhase(apiRequest, apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub) {
|
|
182
|
+
try {
|
|
183
|
+
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
184
|
+
message: JSON.stringify({
|
|
185
|
+
type: 'AskSkip',
|
|
186
|
+
status: 'OK',
|
|
187
|
+
message: 'I am gathering some data needed for your request, once that\'s done I\'ll analyze it for you...',
|
|
188
|
+
}),
|
|
189
|
+
sessionId: userPayload.sessionId,
|
|
190
|
+
});
|
|
191
|
+
const md = new core_1.Metadata();
|
|
192
|
+
for (const dr of apiResponse.dataRequest) {
|
|
193
|
+
switch (dr.type) {
|
|
194
|
+
case "sql":
|
|
195
|
+
const sql = dr.text;
|
|
196
|
+
const result = await dataSource.query(sql);
|
|
197
|
+
if (!result)
|
|
198
|
+
throw new Error(`Error running SQL: ${sql}`);
|
|
199
|
+
const item = new skip_types_1.SkipDataContextItem();
|
|
200
|
+
item.Type = 'sql';
|
|
201
|
+
item.Data = result;
|
|
202
|
+
item.RecordName = dr.text;
|
|
203
|
+
item.AdditionalDescription = dr.description;
|
|
204
|
+
apiRequest.dataContext.Items.push(item);
|
|
205
|
+
break;
|
|
206
|
+
case "stored_query":
|
|
207
|
+
const queryName = dr.text;
|
|
208
|
+
const query = md.Queries.find((q) => q.Name === queryName);
|
|
209
|
+
if (query) {
|
|
210
|
+
const rq = new core_1.RunQuery();
|
|
211
|
+
const result = await rq.RunQuery({ QueryID: query.ID }, user);
|
|
212
|
+
if (result && result.Success) {
|
|
213
|
+
const item = new skip_types_1.SkipDataContextItem();
|
|
214
|
+
item.Type = 'query';
|
|
215
|
+
item.Data = result.Results;
|
|
216
|
+
item.RecordID = query.ID;
|
|
217
|
+
item.RecordName = query.Name;
|
|
218
|
+
item.AdditionalDescription = dr.description;
|
|
219
|
+
apiRequest.dataContext.Items.push(item);
|
|
220
|
+
}
|
|
221
|
+
else
|
|
222
|
+
throw new Error(`Error running query ${queryName}`);
|
|
223
|
+
}
|
|
224
|
+
else
|
|
225
|
+
throw new Error(`Query ${queryName} not found.`);
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
apiRequest.requestPhase = 'data_gathering_response';
|
|
230
|
+
return this.HandleSkipRequest(apiRequest, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, null, null);
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
(0, core_1.LogError)(e);
|
|
234
|
+
throw e;
|
|
235
|
+
}
|
|
185
236
|
}
|
|
186
237
|
async FinishConversationAndNotifyUser(apiResponse, md, user, convoEntity, pubSub, userPayload) {
|
|
187
238
|
const sTitle = apiResponse.reportTitle;
|
|
@@ -223,6 +274,14 @@ let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
|
223
274
|
AIMessageConversationDetailID: convoDetailEntityAI.ID
|
|
224
275
|
};
|
|
225
276
|
}
|
|
277
|
+
async getViewData(ViewId, user) {
|
|
278
|
+
const rv = new core_1.RunView();
|
|
279
|
+
const result = await rv.RunView({ ViewID: ViewId }, user);
|
|
280
|
+
if (result && result.Success)
|
|
281
|
+
return result.Results;
|
|
282
|
+
else
|
|
283
|
+
throw new Error(`Error running view ${ViewId}`);
|
|
284
|
+
}
|
|
226
285
|
};
|
|
227
286
|
exports.AskSkipResolver = AskSkipResolver;
|
|
228
287
|
AskSkipResolver._defaultNewChatName = 'New Chat';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AskSkipResolver.js","sourceRoot":"","sources":["../../src/resolvers/AskSkipResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,+CAAuG;AACvG,+
|
|
1
|
+
{"version":3,"file":"AskSkipResolver.js","sourceRoot":"","sources":["../../src/resolvers/AskSkipResolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/server",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.158",
|
|
4
4
|
"description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "src/index.ts",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@memberjunction/global": "^0.9.132",
|
|
29
29
|
"@memberjunction/queue": "^0.9.139",
|
|
30
30
|
"@memberjunction/sqlserver-dataprovider": "^0.9.150",
|
|
31
|
-
"@memberjunction/skip-types": "^0.9.
|
|
31
|
+
"@memberjunction/skip-types": "^0.9.9",
|
|
32
32
|
"@types/cors": "^2.8.13",
|
|
33
33
|
"@types/jsonwebtoken": "^8.5.9",
|
|
34
34
|
"@types/node": "^18.11.14",
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, Int, ObjectType, PubSub, PubSubEngine, Query, Resolver } from 'type-graphql';
|
|
2
|
-
import { Metadata, UserInfo } from '@memberjunction/core';
|
|
2
|
+
import { LogError, Metadata, RunQuery, RunQueryParams, RunView, UserInfo } from '@memberjunction/core';
|
|
3
3
|
import { AppContext, UserPayload } from '../types';
|
|
4
4
|
import { UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
5
|
-
import { SkipDataContext, SkipDataContextItem, SkipAPIRequest, SkipAPIResponse, SkipMessage } from '@memberjunction/skip-types';
|
|
5
|
+
import { SkipDataContext, SkipDataContextItem, SkipAPIRequest, SkipAPIResponse, SkipMessage, SkipAPIAnalysisCompleteResponse, SkipAPIDataRequestResponse } from '@memberjunction/skip-types';
|
|
6
6
|
import axios from 'axios';
|
|
7
7
|
|
|
8
8
|
import { PUSH_STATUS_UPDATES_TOPIC } from '../generic/PushStatusResolver';
|
|
9
9
|
import { ConversationDetailEntity, ConversationEntity, UserNotificationEntity, UserViewEntityExtended } from '@memberjunction/core-entities';
|
|
10
10
|
import { DataSource } from 'typeorm';
|
|
11
11
|
|
|
12
|
+
|
|
13
|
+
const ___skipAPIurl = 'http://localhost:8000'
|
|
14
|
+
// const url = process.env.BOT_EXTERNAL_API_URL;
|
|
15
|
+
// TEMP - call the separate server, we'll move this to real skip server soon!!!!!
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
12
19
|
@ObjectType()
|
|
13
20
|
export class AskSkipResultType {
|
|
14
21
|
@Field(() => Boolean)
|
|
@@ -78,14 +85,9 @@ export class AskSkipResolver {
|
|
|
78
85
|
{
|
|
79
86
|
Type: 'view',
|
|
80
87
|
RecordID: ViewId,
|
|
88
|
+
Data: await this.getViewData(ViewId, user),
|
|
81
89
|
} as SkipDataContextItem
|
|
82
90
|
);
|
|
83
|
-
dataContext.Items.push(
|
|
84
|
-
{
|
|
85
|
-
Type: 'view',
|
|
86
|
-
RecordID: 123, //test adding an extra item to the data context
|
|
87
|
-
} as SkipDataContextItem
|
|
88
|
-
);
|
|
89
91
|
|
|
90
92
|
const messages: SkipMessage[] = [
|
|
91
93
|
{
|
|
@@ -93,7 +95,7 @@ export class AskSkipResolver {
|
|
|
93
95
|
role: 'user'
|
|
94
96
|
}
|
|
95
97
|
];
|
|
96
|
-
|
|
98
|
+
|
|
97
99
|
const input: SkipAPIRequest = {
|
|
98
100
|
messages: messages,
|
|
99
101
|
conversationID: ConversationId.toString(),
|
|
@@ -102,23 +104,23 @@ export class AskSkipResolver {
|
|
|
102
104
|
requestPhase: 'initial_request'
|
|
103
105
|
};
|
|
104
106
|
|
|
105
|
-
const url = 'http://localhost:8000'
|
|
106
|
-
// const url = process.env.BOT_EXTERNAL_API_URL;
|
|
107
|
-
// TEMP - call the separate server, we'll move this to real skip server soon!!!!!
|
|
108
|
-
|
|
109
|
-
|
|
110
107
|
pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
|
|
111
108
|
message: JSON.stringify({
|
|
112
109
|
type: 'AskSkip',
|
|
113
110
|
status: 'OK',
|
|
114
|
-
message: '
|
|
111
|
+
message: 'I will be happy to help and will start by analyzing your request...',
|
|
115
112
|
}),
|
|
116
113
|
sessionId: userPayload.sessionId,
|
|
117
114
|
});
|
|
118
115
|
|
|
116
|
+
return this.HandleSkipRequest(input, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, convoEntity, convoDetailEntity);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
protected async HandleSkipRequest(input: SkipAPIRequest, UserQuestion: string, user: UserInfo, dataSource: DataSource, ConversationId: number, userPayload: UserPayload, pubSub: PubSubEngine, md: Metadata, convoEntity: ConversationEntity, convoDetailEntity: ConversationDetailEntity): Promise<AskSkipResultType> {
|
|
119
121
|
const response = await axios({
|
|
120
122
|
method: 'post',
|
|
121
|
-
url:
|
|
123
|
+
url: ___skipAPIurl,
|
|
122
124
|
data: input,
|
|
123
125
|
});
|
|
124
126
|
|
|
@@ -148,16 +150,15 @@ export class AskSkipResolver {
|
|
|
148
150
|
});
|
|
149
151
|
|
|
150
152
|
// now, based on the result type, we will either wait for the next phase or we will process the results
|
|
151
|
-
let nextAPIResponse: SkipAPIResponse | null = null;
|
|
152
153
|
if (apiResponse.responsePhase === 'data_request') {
|
|
153
|
-
|
|
154
|
+
return await this.HandleDataRequestPhase(input, <SkipAPIDataRequestResponse>apiResponse, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub);
|
|
154
155
|
}
|
|
155
156
|
else if (apiResponse.responsePhase === 'clarifying_question') {
|
|
156
157
|
// need to send the request back to the user for a clarifying question
|
|
157
158
|
// TO-DO implement this
|
|
158
159
|
}
|
|
159
160
|
else if (apiResponse.responsePhase === 'analysis_complete') {
|
|
160
|
-
|
|
161
|
+
// nothing to do, we'll return below
|
|
161
162
|
}
|
|
162
163
|
|
|
163
164
|
const {AIMessageConversationDetailID} = await this.FinishConversationAndNotifyUser(apiResponse, md, user, convoEntity, pubSub, userPayload);
|
|
@@ -189,11 +190,69 @@ export class AskSkipResolver {
|
|
|
189
190
|
UserMessageConversationDetailId: 0,
|
|
190
191
|
AIMessageConversationDetailId: 0,
|
|
191
192
|
};
|
|
192
|
-
}
|
|
193
|
+
}
|
|
193
194
|
}
|
|
194
195
|
|
|
195
|
-
protected async HandleDataRequestPhase(apiResponse:
|
|
196
|
-
|
|
196
|
+
protected async HandleDataRequestPhase(apiRequest: SkipAPIRequest, apiResponse: SkipAPIDataRequestResponse, UserQuestion: string, user: UserInfo, dataSource: DataSource, ConversationId: number, userPayload: UserPayload, pubSub: PubSubEngine): Promise<AskSkipResultType> {
|
|
197
|
+
// our job in this method is to go through each of the data requests from the Skip API, get the data, and then go back to the Skip API again and to the next phase
|
|
198
|
+
try {
|
|
199
|
+
pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
|
|
200
|
+
message: JSON.stringify({
|
|
201
|
+
type: 'AskSkip',
|
|
202
|
+
status: 'OK',
|
|
203
|
+
message: 'I am gathering some data needed for your request, once that\'s done I\'ll analyze it for you...',
|
|
204
|
+
}),
|
|
205
|
+
sessionId: userPayload.sessionId,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const md = new Metadata();
|
|
209
|
+
for (const dr of apiResponse.dataRequest) {
|
|
210
|
+
switch (dr.type) {
|
|
211
|
+
case "sql":
|
|
212
|
+
const sql = dr.text;
|
|
213
|
+
const result = await dataSource.query(sql);
|
|
214
|
+
if (!result)
|
|
215
|
+
throw new Error(`Error running SQL: ${sql}`);
|
|
216
|
+
|
|
217
|
+
const item = new SkipDataContextItem();
|
|
218
|
+
item.Type = 'sql';
|
|
219
|
+
item.Data = result;
|
|
220
|
+
item.RecordName = dr.text;
|
|
221
|
+
item.AdditionalDescription = dr.description;
|
|
222
|
+
apiRequest.dataContext.Items.push(item);
|
|
223
|
+
break;
|
|
224
|
+
case "stored_query":
|
|
225
|
+
const queryName = dr.text;
|
|
226
|
+
const query = md.Queries.find((q) => q.Name === queryName);
|
|
227
|
+
if (query) {
|
|
228
|
+
const rq = new RunQuery();
|
|
229
|
+
const result = await rq.RunQuery({QueryID: query.ID}, user)
|
|
230
|
+
if (result && result.Success) {
|
|
231
|
+
const item = new SkipDataContextItem();
|
|
232
|
+
item.Type = 'query';
|
|
233
|
+
item.Data = result.Results;
|
|
234
|
+
item.RecordID = query.ID;
|
|
235
|
+
item.RecordName = query.Name;
|
|
236
|
+
item.AdditionalDescription = dr.description;
|
|
237
|
+
apiRequest.dataContext.Items.push(item);
|
|
238
|
+
}
|
|
239
|
+
else
|
|
240
|
+
throw new Error(`Error running query ${queryName}`);
|
|
241
|
+
}
|
|
242
|
+
else
|
|
243
|
+
throw new Error(`Query ${queryName} not found.`);
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// we have all of the data now, add it to the data context and then submit it back to the Skip API
|
|
249
|
+
apiRequest.requestPhase = 'data_gathering_response';
|
|
250
|
+
return this.HandleSkipRequest(apiRequest, UserQuestion, user, dataSource, ConversationId, userPayload, pubSub, md, null, null);
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
LogError(e);
|
|
254
|
+
throw e;
|
|
255
|
+
}
|
|
197
256
|
}
|
|
198
257
|
|
|
199
258
|
/**
|
|
@@ -206,7 +265,7 @@ export class AskSkipResolver {
|
|
|
206
265
|
* @param userPayload
|
|
207
266
|
* @returns
|
|
208
267
|
*/
|
|
209
|
-
protected async FinishConversationAndNotifyUser(apiResponse:
|
|
268
|
+
protected async FinishConversationAndNotifyUser(apiResponse: SkipAPIAnalysisCompleteResponse, md: Metadata, user: UserInfo, convoEntity: ConversationEntity, pubSub: PubSubEngine, userPayload: UserPayload): Promise<{AIMessageConversationDetailID: number}> {
|
|
210
269
|
const sTitle = apiResponse.reportTitle;
|
|
211
270
|
const sResult = JSON.stringify(apiResponse);
|
|
212
271
|
|
|
@@ -252,6 +311,15 @@ export class AskSkipResolver {
|
|
|
252
311
|
AIMessageConversationDetailID: convoDetailEntityAI.ID
|
|
253
312
|
};
|
|
254
313
|
}
|
|
314
|
+
|
|
315
|
+
protected async getViewData(ViewId: number, user: UserInfo): Promise<any> {
|
|
316
|
+
const rv = new RunView();
|
|
317
|
+
const result = await rv.RunView({ViewID: ViewId}, user);
|
|
318
|
+
if (result && result.Success)
|
|
319
|
+
return result.Results;
|
|
320
|
+
else
|
|
321
|
+
throw new Error(`Error running view ${ViewId}`);
|
|
322
|
+
}
|
|
255
323
|
}
|
|
256
324
|
|
|
257
325
|
export default AskSkipResolver;
|