@memberjunction/server 0.9.128 → 0.9.141
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 +27 -0
- package/dist/apolloServer/TransactionPlugin.js +45 -45
- package/dist/apolloServer/TransactionPlugin.js.map +1 -1
- package/dist/apolloServer/index.js +26 -26
- package/dist/auth/exampleNewUserSubClass.js +53 -63
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.js +110 -104
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/newUsers.js +65 -66
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/cache.js +10 -10
- package/dist/config.js +62 -61
- package/dist/config.js.map +1 -1
- package/dist/context.js +101 -101
- package/dist/context.js.map +1 -1
- package/dist/directives/Public.js +33 -33
- package/dist/directives/Public.js.map +1 -1
- package/dist/directives/index.js +17 -17
- package/dist/entitySubclasses/userViewEntity.server.js +127 -127
- package/dist/entitySubclasses/userViewEntity.server.js.map +1 -1
- package/dist/generated/generated.js +20205 -19004
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/PushStatusResolver.js +58 -58
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.js +231 -231
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.js +400 -400
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.js +131 -131
- package/dist/index.js.map +1 -1
- package/dist/orm.js +33 -33
- package/dist/orm.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +246 -246
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ColorResolver.js +93 -93
- package/dist/resolvers/ColorResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.js +167 -167
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +111 -111
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.js +59 -59
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +282 -282
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.js +74 -0
- package/dist/resolvers/QueryResolver.js.map +1 -0
- package/dist/resolvers/ReportResolver.js +73 -73
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +161 -161
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserResolver.js +69 -69
- package/dist/resolvers/UserResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.js +101 -101
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/types.js +2 -2
- package/package.json +11 -11
- package/src/apolloServer/TransactionPlugin.ts +1 -1
- package/src/auth/exampleNewUserSubClass.ts +3 -1
- package/src/auth/index.ts +13 -4
- package/src/config.ts +1 -0
- package/src/generated/generated.ts +921 -2
- package/src/resolvers/AskSkipResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +42 -0
- package/src/resolvers/ReportResolver.ts +0 -15
- package/tsconfig.json +2 -2
|
@@ -1,247 +1,247 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
-
};
|
|
17
|
-
var AskSkipResolver_1;
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.AskSkipResolver = exports.AskSkipResultType = void 0;
|
|
20
|
-
const type_graphql_1 = require("type-graphql");
|
|
21
|
-
const
|
|
22
|
-
const core_1 = require("@memberjunction/core");
|
|
23
|
-
const sqlserver_dataprovider_1 = require("@memberjunction/sqlserver-dataprovider");
|
|
24
|
-
const axios_1 = __importDefault(require("axios"));
|
|
25
|
-
const PushStatusResolver_1 = require("../generic/PushStatusResolver");
|
|
26
|
-
let AskSkipResultType = class AskSkipResultType {
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
AskSkipResultType
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
57
|
-
async ExecuteAskSkipQuery(UserQuestion, ConversationId, { dataSource, userPayload }, pubSub) {
|
|
58
|
-
try {
|
|
59
|
-
const md = new core_1.Metadata();
|
|
60
|
-
const user = sqlserver_dataprovider_1.UserCache.Instance.Users.find((u) => u.Email === userPayload.email);
|
|
61
|
-
if (!user)
|
|
62
|
-
throw new Error(`User ${userPayload.email} not found in UserCache`);
|
|
63
|
-
const convoEntity = await md.GetEntityObject('Conversations', user);
|
|
64
|
-
if (!ConversationId || ConversationId <= 0) {
|
|
65
|
-
convoEntity.NewRecord();
|
|
66
|
-
if (user) {
|
|
67
|
-
convoEntity.UserID = user.ID;
|
|
68
|
-
convoEntity.Name = AskSkipResolver_1._defaultNewChatName;
|
|
69
|
-
if (await convoEntity.Save())
|
|
70
|
-
ConversationId = convoEntity.ID;
|
|
71
|
-
else
|
|
72
|
-
throw new Error(`Creating a new conversation failed`);
|
|
73
|
-
}
|
|
74
|
-
else
|
|
75
|
-
throw new Error(`User ${userPayload.email} not found in UserCache`);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
await convoEntity.Load(ConversationId);
|
|
79
|
-
}
|
|
80
|
-
const convoDetailEntity = await md.GetEntityObject('Conversation Details', user);
|
|
81
|
-
convoDetailEntity.NewRecord();
|
|
82
|
-
convoDetailEntity.ConversationID = ConversationId;
|
|
83
|
-
convoDetailEntity.Message = UserQuestion;
|
|
84
|
-
convoDetailEntity.Role = 'User';
|
|
85
|
-
convoDetailEntity.Set('Sequence', 1);
|
|
86
|
-
await convoDetailEntity.Save();
|
|
87
|
-
const OrganizationId = process.env.BOT_SCHEMA_ORGANIZATION_ID;
|
|
88
|
-
const input = { userInput: UserQuestion, conversationID: ConversationId, organizationID: OrganizationId };
|
|
89
|
-
const url = process.env.BOT_EXTERNAL_API_URL;
|
|
90
|
-
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
91
|
-
message: JSON.stringify({
|
|
92
|
-
type: 'AskSkip',
|
|
93
|
-
status: 'OK',
|
|
94
|
-
message: 'Sure, I can help with that, just give me a second and I will think about the best way to complete your request.',
|
|
95
|
-
}),
|
|
96
|
-
sessionId: userPayload.sessionId,
|
|
97
|
-
});
|
|
98
|
-
const response = await (0, axios_1.default)({
|
|
99
|
-
method: 'post',
|
|
100
|
-
url: process.env.BOT_EXTERNAL_API_URL,
|
|
101
|
-
data: input,
|
|
102
|
-
});
|
|
103
|
-
if (response.status === 200) {
|
|
104
|
-
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
105
|
-
message: JSON.stringify({
|
|
106
|
-
type: 'AskSkip',
|
|
107
|
-
status: 'OK',
|
|
108
|
-
message: 'I created the report structure, now I will get the data for you and analyze the results... Back to ya soon!',
|
|
109
|
-
}),
|
|
110
|
-
sessionId: userPayload.sessionId,
|
|
111
|
-
});
|
|
112
|
-
const sql = response.data.params.sql;
|
|
113
|
-
const [{ result, analysis }, explanation] = await Promise.all([
|
|
114
|
-
this.getSkipDataAndAnalysis(dataSource, UserQuestion, sql),
|
|
115
|
-
this.getReportExplanation(UserQuestion, sql),
|
|
116
|
-
]);
|
|
117
|
-
const sTitle = response.data.params.reportTitle || response.data.params.chartTitle;
|
|
118
|
-
const sResult = JSON.stringify({
|
|
119
|
-
SQLResults: {
|
|
120
|
-
results: result,
|
|
121
|
-
sql: sql,
|
|
122
|
-
columns: response.data.params.columns,
|
|
123
|
-
},
|
|
124
|
-
UserMessage: '',
|
|
125
|
-
ReportExplanation: explanation,
|
|
126
|
-
Analysis: analysis,
|
|
127
|
-
ReportTitle: sTitle,
|
|
128
|
-
DisplayType: response.data.type,
|
|
129
|
-
DrillDownView: response.data.params.drillDownView,
|
|
130
|
-
DrillDownBaseViewField: response.data.params.drillDownBaseViewField,
|
|
131
|
-
DrillDownReportValueField: response.data.params.drillDownReportValueField,
|
|
132
|
-
ChartOptions: {
|
|
133
|
-
xAxis: response.data.params.xAxis,
|
|
134
|
-
xLabel: response.data.params.xLabel,
|
|
135
|
-
yAxis: response.data.params.yAxis,
|
|
136
|
-
yLabel: response.data.params.yLabel,
|
|
137
|
-
color: response.data.params.color,
|
|
138
|
-
yFormat: response.data.params.yFormat,
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
const convoDetailEntityAI = await md.GetEntityObject('Conversation Details', user);
|
|
142
|
-
convoDetailEntityAI.NewRecord();
|
|
143
|
-
convoDetailEntityAI.ConversationID = ConversationId;
|
|
144
|
-
convoDetailEntityAI.Message = sResult;
|
|
145
|
-
convoDetailEntityAI.Role = 'AI';
|
|
146
|
-
convoDetailEntityAI.Set('Sequence', 2);
|
|
147
|
-
await convoDetailEntityAI.Save();
|
|
148
|
-
if (convoEntity.Name === AskSkipResolver_1._defaultNewChatName) {
|
|
149
|
-
convoEntity.Name = response.data.params.reportTitle || response.data.params.chartTitle || AskSkipResolver_1._defaultNewChatName;
|
|
150
|
-
await convoEntity.Save();
|
|
151
|
-
}
|
|
152
|
-
const userNotification = await md.GetEntityObject('User Notifications', user);
|
|
153
|
-
userNotification.NewRecord();
|
|
154
|
-
userNotification.UserID = user.ID;
|
|
155
|
-
userNotification.Title = 'Report Created: ' + sTitle;
|
|
156
|
-
userNotification.Message = `Good news! Skip finished creating a report for you, click on this notification to jump back into the conversation.`;
|
|
157
|
-
userNotification.Unread = true;
|
|
158
|
-
userNotification.ResourceConfiguration = JSON.stringify({
|
|
159
|
-
type: 'askskip',
|
|
160
|
-
conversationId: ConversationId,
|
|
161
|
-
});
|
|
162
|
-
await userNotification.Save();
|
|
163
|
-
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
164
|
-
message: JSON.stringify({
|
|
165
|
-
type: 'UserNotifications',
|
|
166
|
-
status: 'OK',
|
|
167
|
-
details: {
|
|
168
|
-
action: 'create',
|
|
169
|
-
recordId: userNotification.ID,
|
|
170
|
-
},
|
|
171
|
-
}),
|
|
172
|
-
sessionId: userPayload.sessionId,
|
|
173
|
-
});
|
|
174
|
-
return {
|
|
175
|
-
Success: true,
|
|
176
|
-
Status: 'OK',
|
|
177
|
-
ConversationId: ConversationId,
|
|
178
|
-
UserMessageConversationDetailId: convoDetailEntity.ID,
|
|
179
|
-
AIMessageConversationDetailId: convoDetailEntityAI.ID,
|
|
180
|
-
Result: sResult,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
else
|
|
184
|
-
return { Success: false, Status: 'Error', Result: `User Question ${UserQuestion} didn't work!` };
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
console.error(`Error occurred: ${error}`);
|
|
188
|
-
if (error.response) {
|
|
189
|
-
console.log(error.response.data);
|
|
190
|
-
console.log(error.response.status);
|
|
191
|
-
console.log(error.response.headers);
|
|
192
|
-
}
|
|
193
|
-
else if (error.request) {
|
|
194
|
-
console.log(error.request);
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
console.log('Error', error.message);
|
|
198
|
-
}
|
|
199
|
-
console.log(error.config);
|
|
200
|
-
return {
|
|
201
|
-
Success: false,
|
|
202
|
-
Status: 'Error',
|
|
203
|
-
Result: `User Question ${UserQuestion} didn't work!`,
|
|
204
|
-
ConversationId: ConversationId,
|
|
205
|
-
UserMessageConversationDetailId: 0,
|
|
206
|
-
AIMessageConversationDetailId: 0,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
async getSkipDataAndAnalysis(dataSource, userQuestion, sql) {
|
|
211
|
-
const result = await dataSource.query(sql);
|
|
212
|
-
const stringResult = JSON.stringify(result);
|
|
213
|
-
const maxStringLength = 2000;
|
|
214
|
-
const avgRowStringLength = stringResult.length / result.length;
|
|
215
|
-
let sampleDataJSON = stringResult;
|
|
216
|
-
if (stringResult.length > maxStringLength) {
|
|
217
|
-
const rowsToUse = result.length / (maxStringLength / avgRowStringLength);
|
|
218
|
-
const subsetResult = result.slice(0, rowsToUse);
|
|
219
|
-
sampleDataJSON = JSON.stringify(subsetResult);
|
|
220
|
-
}
|
|
221
|
-
const analysis = await this.getAnalysis(userQuestion, sql, sampleDataJSON);
|
|
222
|
-
return { result, analysis };
|
|
223
|
-
}
|
|
224
|
-
async getAnalysis(userQuestion, sql, sampleDataJSON) {
|
|
225
|
-
return await (0,
|
|
226
|
-
}
|
|
227
|
-
async getReportExplanation(userQuestion, sql) {
|
|
228
|
-
return await (0,
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
AskSkipResolver
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
__param(
|
|
236
|
-
__param(
|
|
237
|
-
__param(
|
|
238
|
-
|
|
239
|
-
__metadata("design:
|
|
240
|
-
__metadata("design:
|
|
241
|
-
|
|
242
|
-
AskSkipResolver
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
exports.default = AskSkipResolver;
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
var AskSkipResolver_1;
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.AskSkipResolver = exports.AskSkipResultType = void 0;
|
|
20
|
+
const type_graphql_1 = require("type-graphql");
|
|
21
|
+
const aiengine_1 = require("@memberjunction/aiengine");
|
|
22
|
+
const core_1 = require("@memberjunction/core");
|
|
23
|
+
const sqlserver_dataprovider_1 = require("@memberjunction/sqlserver-dataprovider");
|
|
24
|
+
const axios_1 = __importDefault(require("axios"));
|
|
25
|
+
const PushStatusResolver_1 = require("../generic/PushStatusResolver");
|
|
26
|
+
let AskSkipResultType = class AskSkipResultType {
|
|
27
|
+
};
|
|
28
|
+
exports.AskSkipResultType = AskSkipResultType;
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, type_graphql_1.Field)(() => Boolean),
|
|
31
|
+
__metadata("design:type", Boolean)
|
|
32
|
+
], AskSkipResultType.prototype, "Success", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
(0, type_graphql_1.Field)(() => String),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], AskSkipResultType.prototype, "Status", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
(0, type_graphql_1.Field)(() => String),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], AskSkipResultType.prototype, "Result", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, type_graphql_1.Field)(() => type_graphql_1.Int),
|
|
43
|
+
__metadata("design:type", Number)
|
|
44
|
+
], AskSkipResultType.prototype, "ConversationId", void 0);
|
|
45
|
+
__decorate([
|
|
46
|
+
(0, type_graphql_1.Field)(() => type_graphql_1.Int),
|
|
47
|
+
__metadata("design:type", Number)
|
|
48
|
+
], AskSkipResultType.prototype, "UserMessageConversationDetailId", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, type_graphql_1.Field)(() => type_graphql_1.Int),
|
|
51
|
+
__metadata("design:type", Number)
|
|
52
|
+
], AskSkipResultType.prototype, "AIMessageConversationDetailId", void 0);
|
|
53
|
+
exports.AskSkipResultType = AskSkipResultType = __decorate([
|
|
54
|
+
(0, type_graphql_1.ObjectType)()
|
|
55
|
+
], AskSkipResultType);
|
|
56
|
+
let AskSkipResolver = AskSkipResolver_1 = class AskSkipResolver {
|
|
57
|
+
async ExecuteAskSkipQuery(UserQuestion, ConversationId, { dataSource, userPayload }, pubSub) {
|
|
58
|
+
try {
|
|
59
|
+
const md = new core_1.Metadata();
|
|
60
|
+
const user = sqlserver_dataprovider_1.UserCache.Instance.Users.find((u) => u.Email === userPayload.email);
|
|
61
|
+
if (!user)
|
|
62
|
+
throw new Error(`User ${userPayload.email} not found in UserCache`);
|
|
63
|
+
const convoEntity = await md.GetEntityObject('Conversations', user);
|
|
64
|
+
if (!ConversationId || ConversationId <= 0) {
|
|
65
|
+
convoEntity.NewRecord();
|
|
66
|
+
if (user) {
|
|
67
|
+
convoEntity.UserID = user.ID;
|
|
68
|
+
convoEntity.Name = AskSkipResolver_1._defaultNewChatName;
|
|
69
|
+
if (await convoEntity.Save())
|
|
70
|
+
ConversationId = convoEntity.ID;
|
|
71
|
+
else
|
|
72
|
+
throw new Error(`Creating a new conversation failed`);
|
|
73
|
+
}
|
|
74
|
+
else
|
|
75
|
+
throw new Error(`User ${userPayload.email} not found in UserCache`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
await convoEntity.Load(ConversationId);
|
|
79
|
+
}
|
|
80
|
+
const convoDetailEntity = await md.GetEntityObject('Conversation Details', user);
|
|
81
|
+
convoDetailEntity.NewRecord();
|
|
82
|
+
convoDetailEntity.ConversationID = ConversationId;
|
|
83
|
+
convoDetailEntity.Message = UserQuestion;
|
|
84
|
+
convoDetailEntity.Role = 'User';
|
|
85
|
+
convoDetailEntity.Set('Sequence', 1);
|
|
86
|
+
await convoDetailEntity.Save();
|
|
87
|
+
const OrganizationId = process.env.BOT_SCHEMA_ORGANIZATION_ID;
|
|
88
|
+
const input = { userInput: UserQuestion, conversationID: ConversationId, organizationID: OrganizationId };
|
|
89
|
+
const url = process.env.BOT_EXTERNAL_API_URL;
|
|
90
|
+
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
91
|
+
message: JSON.stringify({
|
|
92
|
+
type: 'AskSkip',
|
|
93
|
+
status: 'OK',
|
|
94
|
+
message: 'Sure, I can help with that, just give me a second and I will think about the best way to complete your request.',
|
|
95
|
+
}),
|
|
96
|
+
sessionId: userPayload.sessionId,
|
|
97
|
+
});
|
|
98
|
+
const response = await (0, axios_1.default)({
|
|
99
|
+
method: 'post',
|
|
100
|
+
url: process.env.BOT_EXTERNAL_API_URL,
|
|
101
|
+
data: input,
|
|
102
|
+
});
|
|
103
|
+
if (response.status === 200) {
|
|
104
|
+
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
105
|
+
message: JSON.stringify({
|
|
106
|
+
type: 'AskSkip',
|
|
107
|
+
status: 'OK',
|
|
108
|
+
message: 'I created the report structure, now I will get the data for you and analyze the results... Back to ya soon!',
|
|
109
|
+
}),
|
|
110
|
+
sessionId: userPayload.sessionId,
|
|
111
|
+
});
|
|
112
|
+
const sql = response.data.params.sql;
|
|
113
|
+
const [{ result, analysis }, explanation] = await Promise.all([
|
|
114
|
+
this.getSkipDataAndAnalysis(dataSource, UserQuestion, sql),
|
|
115
|
+
this.getReportExplanation(UserQuestion, sql),
|
|
116
|
+
]);
|
|
117
|
+
const sTitle = response.data.params.reportTitle || response.data.params.chartTitle;
|
|
118
|
+
const sResult = JSON.stringify({
|
|
119
|
+
SQLResults: {
|
|
120
|
+
results: result,
|
|
121
|
+
sql: sql,
|
|
122
|
+
columns: response.data.params.columns,
|
|
123
|
+
},
|
|
124
|
+
UserMessage: '',
|
|
125
|
+
ReportExplanation: explanation,
|
|
126
|
+
Analysis: analysis,
|
|
127
|
+
ReportTitle: sTitle,
|
|
128
|
+
DisplayType: response.data.type,
|
|
129
|
+
DrillDownView: response.data.params.drillDownView,
|
|
130
|
+
DrillDownBaseViewField: response.data.params.drillDownBaseViewField,
|
|
131
|
+
DrillDownReportValueField: response.data.params.drillDownReportValueField,
|
|
132
|
+
ChartOptions: {
|
|
133
|
+
xAxis: response.data.params.xAxis,
|
|
134
|
+
xLabel: response.data.params.xLabel,
|
|
135
|
+
yAxis: response.data.params.yAxis,
|
|
136
|
+
yLabel: response.data.params.yLabel,
|
|
137
|
+
color: response.data.params.color,
|
|
138
|
+
yFormat: response.data.params.yFormat,
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
const convoDetailEntityAI = await md.GetEntityObject('Conversation Details', user);
|
|
142
|
+
convoDetailEntityAI.NewRecord();
|
|
143
|
+
convoDetailEntityAI.ConversationID = ConversationId;
|
|
144
|
+
convoDetailEntityAI.Message = sResult;
|
|
145
|
+
convoDetailEntityAI.Role = 'AI';
|
|
146
|
+
convoDetailEntityAI.Set('Sequence', 2);
|
|
147
|
+
await convoDetailEntityAI.Save();
|
|
148
|
+
if (convoEntity.Name === AskSkipResolver_1._defaultNewChatName) {
|
|
149
|
+
convoEntity.Name = response.data.params.reportTitle || response.data.params.chartTitle || AskSkipResolver_1._defaultNewChatName;
|
|
150
|
+
await convoEntity.Save();
|
|
151
|
+
}
|
|
152
|
+
const userNotification = await md.GetEntityObject('User Notifications', user);
|
|
153
|
+
userNotification.NewRecord();
|
|
154
|
+
userNotification.UserID = user.ID;
|
|
155
|
+
userNotification.Title = 'Report Created: ' + sTitle;
|
|
156
|
+
userNotification.Message = `Good news! Skip finished creating a report for you, click on this notification to jump back into the conversation.`;
|
|
157
|
+
userNotification.Unread = true;
|
|
158
|
+
userNotification.ResourceConfiguration = JSON.stringify({
|
|
159
|
+
type: 'askskip',
|
|
160
|
+
conversationId: ConversationId,
|
|
161
|
+
});
|
|
162
|
+
await userNotification.Save();
|
|
163
|
+
pubSub.publish(PushStatusResolver_1.PUSH_STATUS_UPDATES_TOPIC, {
|
|
164
|
+
message: JSON.stringify({
|
|
165
|
+
type: 'UserNotifications',
|
|
166
|
+
status: 'OK',
|
|
167
|
+
details: {
|
|
168
|
+
action: 'create',
|
|
169
|
+
recordId: userNotification.ID,
|
|
170
|
+
},
|
|
171
|
+
}),
|
|
172
|
+
sessionId: userPayload.sessionId,
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
Success: true,
|
|
176
|
+
Status: 'OK',
|
|
177
|
+
ConversationId: ConversationId,
|
|
178
|
+
UserMessageConversationDetailId: convoDetailEntity.ID,
|
|
179
|
+
AIMessageConversationDetailId: convoDetailEntityAI.ID,
|
|
180
|
+
Result: sResult,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
else
|
|
184
|
+
return { Success: false, Status: 'Error', Result: `User Question ${UserQuestion} didn't work!` };
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error(`Error occurred: ${error}`);
|
|
188
|
+
if (error.response) {
|
|
189
|
+
console.log(error.response.data);
|
|
190
|
+
console.log(error.response.status);
|
|
191
|
+
console.log(error.response.headers);
|
|
192
|
+
}
|
|
193
|
+
else if (error.request) {
|
|
194
|
+
console.log(error.request);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.log('Error', error.message);
|
|
198
|
+
}
|
|
199
|
+
console.log(error.config);
|
|
200
|
+
return {
|
|
201
|
+
Success: false,
|
|
202
|
+
Status: 'Error',
|
|
203
|
+
Result: `User Question ${UserQuestion} didn't work!`,
|
|
204
|
+
ConversationId: ConversationId,
|
|
205
|
+
UserMessageConversationDetailId: 0,
|
|
206
|
+
AIMessageConversationDetailId: 0,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async getSkipDataAndAnalysis(dataSource, userQuestion, sql) {
|
|
211
|
+
const result = await dataSource.query(sql);
|
|
212
|
+
const stringResult = JSON.stringify(result);
|
|
213
|
+
const maxStringLength = 2000;
|
|
214
|
+
const avgRowStringLength = stringResult.length / result.length;
|
|
215
|
+
let sampleDataJSON = stringResult;
|
|
216
|
+
if (stringResult.length > maxStringLength) {
|
|
217
|
+
const rowsToUse = result.length / (maxStringLength / avgRowStringLength);
|
|
218
|
+
const subsetResult = result.slice(0, rowsToUse);
|
|
219
|
+
sampleDataJSON = JSON.stringify(subsetResult);
|
|
220
|
+
}
|
|
221
|
+
const analysis = await this.getAnalysis(userQuestion, sql, sampleDataJSON);
|
|
222
|
+
return { result, analysis };
|
|
223
|
+
}
|
|
224
|
+
async getAnalysis(userQuestion, sql, sampleDataJSON) {
|
|
225
|
+
return await (0, aiengine_1.SkipAnalyzeData)(userQuestion, sql, sampleDataJSON);
|
|
226
|
+
}
|
|
227
|
+
async getReportExplanation(userQuestion, sql) {
|
|
228
|
+
return await (0, aiengine_1.SkipExplainQuery)(userQuestion, sql);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
exports.AskSkipResolver = AskSkipResolver;
|
|
232
|
+
AskSkipResolver._defaultNewChatName = 'New Chat';
|
|
233
|
+
__decorate([
|
|
234
|
+
(0, type_graphql_1.Query)(() => AskSkipResultType),
|
|
235
|
+
__param(0, (0, type_graphql_1.Arg)('UserQuestion', () => String)),
|
|
236
|
+
__param(1, (0, type_graphql_1.Arg)('ConversationId', () => type_graphql_1.Int)),
|
|
237
|
+
__param(2, (0, type_graphql_1.Ctx)()),
|
|
238
|
+
__param(3, (0, type_graphql_1.PubSub)()),
|
|
239
|
+
__metadata("design:type", Function),
|
|
240
|
+
__metadata("design:paramtypes", [String, Number, Object, type_graphql_1.PubSubEngine]),
|
|
241
|
+
__metadata("design:returntype", Promise)
|
|
242
|
+
], AskSkipResolver.prototype, "ExecuteAskSkipQuery", null);
|
|
243
|
+
exports.AskSkipResolver = AskSkipResolver = AskSkipResolver_1 = __decorate([
|
|
244
|
+
(0, type_graphql_1.Resolver)(AskSkipResultType)
|
|
245
|
+
], AskSkipResolver);
|
|
246
|
+
exports.default = AskSkipResolver;
|
|
247
247
|
//# sourceMappingURL=AskSkipResolver.js.map
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;AAAA,+CAAuG;AACvG,uDAA6E;AAC7E,+CAAgD;AAEhD,mFAAmE;AACnE,kDAA0B;AAE1B,sEAA0E;AAInE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAkB7B,CAAA;AAlBY,8CAAiB;AAE5B;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC;;kDACJ;AAGjB;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;iDACL;AAGf;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;iDACL;AAGf;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,kBAAG,CAAC;;yDACM;AAGvB;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,kBAAG,CAAC;;0EACuB;AAGxC;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,kBAAG,CAAC;;wEACqB;4BAjB3B,iBAAiB;IAD7B,IAAA,yBAAU,GAAE;GACA,iBAAiB,CAkB7B;AAEM,IAAM,eAAe,uBAArB,MAAM,eAAe;IAIpB,AAAN,KAAK,CAAC,mBAAmB,CACY,YAAoB,EACrB,cAAsB,EACjD,EAAE,UAAU,EAAE,WAAW,EAAc,EACpC,MAAoB;QAE9B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,eAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,kCAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,WAAW,CAAC,KAAK,yBAAyB,CAAC,CAAC;YAE/E,MAAM,WAAW,GAAuB,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACxF,IAAI,CAAC,cAAc,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBAE3C,WAAW,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAI,IAAI,EAAE,CAAC;oBACT,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,IAAI,GAAG,iBAAe,CAAC,mBAAmB,CAAC;oBACvD,IAAI,MAAM,WAAW,CAAC,IAAI,EAAE;wBAAE,cAAc,GAAG,WAAW,CAAC,EAAE,CAAC;;wBACzD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC7D,CAAC;;oBAAM,MAAM,IAAI,KAAK,CAAC,QAAQ,WAAW,CAAC,KAAK,yBAAyB,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC;YAGD,MAAM,iBAAiB,GAA6B,MAAM,EAAE,CAAC,eAAe,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YAC3G,iBAAiB,CAAC,SAAS,EAAE,CAAC;YAC9B,iBAAiB,CAAC,cAAc,GAAG,cAAc,CAAC;YAClD,iBAAiB,CAAC,OAAO,GAAG,YAAY,CAAC;YACzC,iBAAiB,CAAC,IAAI,GAAG,MAAM,CAAC;YAChC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAG/B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAE9D,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;YAE1G,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;YAE7C,MAAM,CAAC,OAAO,CAAC,8CAAyB,EAAE;gBACxC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;oBACtB,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,iHAAiH;iBAC3H,CAAC;gBACF,SAAS,EAAE,WAAW,CAAC,SAAS;aACjC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC;gBAC3B,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBACrC,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,CAAC,OAAO,CAAC,8CAAyB,EAAE;oBACxC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,6GAA6G;qBACvH,CAAC;oBACF,SAAS,EAAE,WAAW,CAAC,SAAS;iBACjC,CAAC,CAAC;gBAGH,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACrC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC5D,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,CAAC;oBAC1D,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,GAAG,CAAC;iBAC7C,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;gBACnF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC7B,UAAU,EAAE;wBACV,OAAO,EAAE,MAAM;wBACf,GAAG,EAAE,GAAG;wBACR,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;qBACtC;oBACD,WAAW,EAAE,EAAE;oBACf,iBAAiB,EAAE,WAAW;oBAC9B,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,MAAM;oBACnB,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;oBAC/B,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa;oBACjD,sBAAsB,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB;oBACnE,yBAAyB,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB;oBACzE,YAAY,EAAE;wBACZ,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;wBACjC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;wBACnC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;wBACjC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;wBACnC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;wBACjC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;qBACtC;iBACF,CAAC,CAAC;gBAGH,MAAM,mBAAmB,GAA6B,MAAM,EAAE,CAAC,eAAe,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;gBAC7G,mBAAmB,CAAC,SAAS,EAAE,CAAC;gBAChC,mBAAmB,CAAC,cAAc,GAAG,cAAc,CAAC;gBACpD,mBAAmB,CAAC,OAAO,GAAG,OAAO,CAAC;gBACtC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC;gBAChC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACvC,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAGjC,IAAI,WAAW,CAAC,IAAI,KAAK,iBAAe,CAAC,mBAAmB,EAAE,CAAC;oBAC7D,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,iBAAe,CAAC,mBAAmB,CAAC;oBAC9H,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBAGD,MAAM,gBAAgB,GAA2B,MAAM,EAAE,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;gBACtG,gBAAgB,CAAC,SAAS,EAAE,CAAC;gBAC7B,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;gBAClC,gBAAgB,CAAC,KAAK,GAAG,kBAAkB,GAAG,MAAM,CAAC;gBACrD,gBAAgB,CAAC,OAAO,GAAG,oHAAoH,CAAC;gBAChJ,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC;gBAC/B,gBAAgB,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC;oBACtD,IAAI,EAAE,SAAS;oBACf,cAAc,EAAE,cAAc;iBAC/B,CAAC,CAAC;gBACH,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,CAAC,OAAO,CAAC,8CAAyB,EAAE;oBACxC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACtB,IAAI,EAAE,mBAAmB;wBACzB,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE;4BACP,MAAM,EAAE,QAAQ;4BAChB,QAAQ,EAAE,gBAAgB,CAAC,EAAE;yBAC9B;qBACF,CAAC;oBACF,SAAS,EAAE,WAAW,CAAC,SAAS;iBACjC,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,IAAI;oBACZ,cAAc,EAAE,cAAc;oBAC9B,+BAA+B,EAAE,iBAAiB,CAAC,EAAE;oBACrD,6BAA6B,EAAE,mBAAmB,CAAC,EAAE;oBACrD,MAAM,EAAE,OAAO;iBAChB,CAAC;YACJ,CAAC;;gBAAM,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,YAAY,eAAe,EAAE,CAAC;QAC1G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAGnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAIzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBAEN,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,iBAAiB,YAAY,eAAe;gBACpD,cAAc,EAAE,cAAc;gBAC9B,+BAA+B,EAAE,CAAC;gBAClC,6BAA6B,EAAE,CAAC;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAES,KAAK,CAAC,sBAAsB,CAAC,UAAe,EAAE,YAAoB,EAAE,GAAW;QACvF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAG/D,IAAI,cAAc,GAAG,YAAY,CAAC;QAClC,IAAI,YAAY,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,eAAe,GAAG,kBAAkB,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAChD,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,GAAW,EAAE,cAAsB;QACnF,OAAO,MAAM,IAAA,0BAAe,EAAC,YAAY,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;IAClE,CAAC;IAES,KAAK,CAAC,oBAAoB,CAAC,YAAoB,EAAE,GAAW;QACpE,OAAO,MAAM,IAAA,2BAAgB,EAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;;AA3MU,0CAAe;AACX,mCAAmB,GAAG,UAAU,AAAb,CAAc;AAG1C;IADL,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;IAE5B,WAAA,IAAA,kBAAG,EAAC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IACjC,WAAA,IAAA,kBAAG,EAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,kBAAG,CAAC,CAAA;IAChC,WAAA,IAAA,kBAAG,GAAE,CAAA;IACL,WAAA,IAAA,qBAAM,GAAE,CAAA;;6DAAS,2BAAY;;0DAwK/B;0BAhLU,eAAe;IAD3B,IAAA,uBAAQ,EAAC,iBAAiB,CAAC;GACf,eAAe,CA4M3B;AAED,kBAAe,eAAe,CAAC"}
|