@memberjunction/server 2.1.1 → 2.1.3
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/dist/apolloServer/TransactionPlugin.d.ts +4 -0
- package/dist/apolloServer/TransactionPlugin.d.ts.map +1 -0
- package/dist/apolloServer/TransactionPlugin.js +46 -0
- package/dist/apolloServer/TransactionPlugin.js.map +1 -0
- package/dist/apolloServer/index.d.ts +11 -0
- package/dist/apolloServer/index.d.ts.map +1 -0
- package/dist/apolloServer/index.js +25 -0
- package/dist/apolloServer/index.js.map +1 -0
- package/dist/auth/exampleNewUserSubClass.d.ts +6 -0
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -0
- package/dist/auth/exampleNewUserSubClass.js +49 -0
- package/dist/auth/exampleNewUserSubClass.js.map +1 -0
- package/dist/auth/index.d.ts +30 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +121 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/newUsers.d.ts +5 -0
- package/dist/auth/newUsers.d.ts.map +1 -0
- package/{src/auth/newUsers.ts → dist/auth/newUsers.js} +20 -14
- package/dist/auth/newUsers.js.map +1 -0
- package/dist/auth/tokenExpiredError.d.ts +5 -0
- package/dist/auth/tokenExpiredError.d.ts.map +1 -0
- package/dist/auth/tokenExpiredError.js +12 -0
- package/dist/auth/tokenExpiredError.js.map +1 -0
- package/dist/cache.d.ts +3 -0
- package/dist/cache.d.ts.map +1 -0
- package/{src/cache.ts → dist/cache.js} +4 -6
- package/dist/cache.js.map +1 -0
- package/dist/config.d.ts +196 -0
- package/dist/config.d.ts.map +1 -0
- package/{src/config.ts → dist/config.js} +25 -49
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +84 -0
- package/dist/context.js.map +1 -0
- package/dist/directives/Public.d.ts +4 -0
- package/dist/directives/Public.d.ts.map +1 -0
- package/dist/directives/Public.js +30 -0
- package/dist/directives/Public.js.map +1 -0
- package/dist/directives/index.d.ts +2 -0
- package/dist/directives/index.d.ts.map +1 -0
- package/dist/directives/index.js +2 -0
- package/dist/directives/index.js.map +1 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts +6 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.d.ts.map +1 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.js +33 -0
- package/dist/entitySubclasses/DuplicateRunEntity.server.js.map +1 -0
- package/dist/entitySubclasses/entityPermissions.server.d.ts +23 -0
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -0
- package/dist/entitySubclasses/entityPermissions.server.js +93 -0
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -0
- package/dist/entitySubclasses/userViewEntity.server.d.ts +13 -0
- package/dist/entitySubclasses/userViewEntity.server.d.ts.map +1 -0
- package/dist/entitySubclasses/userViewEntity.server.js +161 -0
- package/dist/entitySubclasses/userViewEntity.server.js.map +1 -0
- package/dist/generated/generated.d.ts +6679 -0
- package/dist/generated/generated.d.ts.map +1 -0
- package/dist/generated/generated.js +40786 -0
- package/dist/generated/generated.js.map +1 -0
- package/dist/generic/DeleteOptionsInput.d.ts +5 -0
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -0
- package/dist/generic/DeleteOptionsInput.js +27 -0
- package/dist/generic/DeleteOptionsInput.js.map +1 -0
- package/dist/generic/KeyInputOutputTypes.d.ts +16 -0
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -0
- package/dist/generic/KeyInputOutputTypes.js +65 -0
- package/dist/generic/KeyInputOutputTypes.js.map +1 -0
- package/dist/generic/KeyValuePairInput.d.ts +5 -0
- package/dist/generic/KeyValuePairInput.d.ts.map +1 -0
- package/dist/generic/KeyValuePairInput.js +27 -0
- package/dist/generic/KeyValuePairInput.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +14 -0
- package/dist/generic/PushStatusResolver.d.ts.map +1 -0
- package/dist/generic/PushStatusResolver.js +58 -0
- package/dist/generic/PushStatusResolver.js.map +1 -0
- package/dist/generic/ResolverBase.d.ts +39 -0
- package/dist/generic/ResolverBase.d.ts.map +1 -0
- package/dist/generic/ResolverBase.js +573 -0
- package/dist/generic/ResolverBase.js.map +1 -0
- package/dist/generic/RunViewResolver.d.ts +123 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -0
- package/dist/generic/RunViewResolver.js +728 -0
- package/dist/generic/RunViewResolver.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/orm.d.ts +4 -0
- package/dist/orm.d.ts.map +1 -0
- package/dist/orm.js +32 -0
- package/dist/orm.js.map +1 -0
- package/dist/resolvers/AskSkipResolver.d.ts +54 -0
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -0
- package/dist/resolvers/AskSkipResolver.js +805 -0
- package/dist/resolvers/AskSkipResolver.js.map +1 -0
- package/dist/resolvers/ColorResolver.d.ts +23 -0
- package/dist/resolvers/ColorResolver.d.ts.map +1 -0
- package/dist/resolvers/ColorResolver.js +97 -0
- package/dist/resolvers/ColorResolver.js.map +1 -0
- package/dist/resolvers/DatasetResolver.d.ts +42 -0
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -0
- package/dist/resolvers/DatasetResolver.js +179 -0
- package/dist/resolvers/DatasetResolver.js.map +1 -0
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +50 -0
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -0
- package/dist/resolvers/EntityCommunicationsResolver.js +280 -0
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -0
- package/dist/resolvers/EntityRecordNameResolver.d.ts +21 -0
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -0
- package/dist/resolvers/EntityRecordNameResolver.js +117 -0
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -0
- package/dist/resolvers/EntityResolver.d.ts +6 -0
- package/dist/resolvers/EntityResolver.d.ts.map +1 -0
- package/dist/resolvers/EntityResolver.js +57 -0
- package/dist/resolvers/EntityResolver.js.map +1 -0
- package/dist/resolvers/FileCategoryResolver.d.ts +6 -0
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -0
- package/dist/resolvers/FileCategoryResolver.js +61 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -0
- package/dist/resolvers/FileResolver.d.ts +24 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -0
- package/dist/resolvers/FileResolver.js +166 -0
- package/dist/resolvers/FileResolver.js.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts +59 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.js +282 -0
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +29 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +125 -0
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -0
- package/dist/resolvers/QueryResolver.d.ts +13 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -0
- package/dist/resolvers/QueryResolver.js +77 -0
- package/dist/resolvers/QueryResolver.js.map +1 -0
- package/dist/resolvers/ReportResolver.d.ts +20 -0
- package/dist/resolvers/ReportResolver.d.ts.map +1 -0
- package/dist/resolvers/ReportResolver.js +182 -0
- package/dist/resolvers/ReportResolver.js.map +1 -0
- package/dist/resolvers/UserFavoriteResolver.d.ts +42 -0
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -0
- package/dist/resolvers/UserFavoriteResolver.js +230 -0
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -0
- package/dist/resolvers/UserResolver.d.ts +10 -0
- package/dist/resolvers/UserResolver.d.ts.map +1 -0
- package/dist/resolvers/UserResolver.js +71 -0
- package/dist/resolvers/UserResolver.js.map +1 -0
- package/dist/resolvers/UserViewResolver.d.ts +13 -0
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -0
- package/dist/resolvers/UserViewResolver.js +99 -0
- package/dist/resolvers/UserViewResolver.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +4 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +85 -0
- package/dist/util.js.map +1 -0
- package/package.json +25 -21
- package/CHANGELOG.json +0 -3248
- package/CHANGELOG.md +0 -710
- package/src/apolloServer/TransactionPlugin.ts +0 -57
- package/src/apolloServer/index.ts +0 -33
- package/src/auth/exampleNewUserSubClass.ts +0 -74
- package/src/auth/index.ts +0 -151
- package/src/auth/tokenExpiredError.ts +0 -12
- package/src/context.ts +0 -111
- package/src/directives/Public.ts +0 -42
- package/src/directives/index.ts +0 -1
- package/src/entitySubclasses/DuplicateRunEntity.server.ts +0 -29
- package/src/entitySubclasses/entityPermissions.server.ts +0 -111
- package/src/entitySubclasses/userViewEntity.server.ts +0 -187
- package/src/generated/generated.ts +0 -25369
- package/src/generic/DeleteOptionsInput.ts +0 -13
- package/src/generic/KeyInputOutputTypes.ts +0 -35
- package/src/generic/KeyValuePairInput.ts +0 -14
- package/src/generic/PushStatusResolver.ts +0 -40
- package/src/generic/ResolverBase.ts +0 -767
- package/src/generic/RunViewResolver.ts +0 -582
- package/src/index.ts +0 -161
- package/src/orm.ts +0 -36
- package/src/resolvers/AskSkipResolver.ts +0 -926
- package/src/resolvers/ColorResolver.ts +0 -61
- package/src/resolvers/DatasetResolver.ts +0 -115
- package/src/resolvers/EntityCommunicationsResolver.ts +0 -216
- package/src/resolvers/EntityRecordNameResolver.ts +0 -78
- package/src/resolvers/EntityResolver.ts +0 -37
- package/src/resolvers/FileCategoryResolver.ts +0 -62
- package/src/resolvers/FileResolver.ts +0 -147
- package/src/resolvers/MergeRecordsResolver.ts +0 -182
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +0 -91
- package/src/resolvers/QueryResolver.ts +0 -42
- package/src/resolvers/ReportResolver.ts +0 -147
- package/src/resolvers/UserFavoriteResolver.ts +0 -166
- package/src/resolvers/UserResolver.ts +0 -33
- package/src/resolvers/UserViewResolver.ts +0 -64
- package/src/types.ts +0 -40
- package/src/util.ts +0 -106
- package/tsconfig.json +0 -30
- package/typedoc.json +0 -4
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var EntityPermissionsEntity_Server_1;
|
|
8
|
+
import { RegisterClass } from "@memberjunction/global";
|
|
9
|
+
import { BaseEntity } from "@memberjunction/core";
|
|
10
|
+
import { EntityPermissionEntity } from '@memberjunction/core-entities';
|
|
11
|
+
import axios from 'axios';
|
|
12
|
+
import { ___codeGenAPIPort, ___codeGenAPISubmissionDelay, ___codeGenAPIURL } from "../config";
|
|
13
|
+
let EntityPermissionsEntity_Server = class EntityPermissionsEntity_Server extends EntityPermissionEntity {
|
|
14
|
+
static { EntityPermissionsEntity_Server_1 = this; }
|
|
15
|
+
static _entityIDQueue = [];
|
|
16
|
+
static _lastModifiedTime = null;
|
|
17
|
+
static _submissionTimer = null;
|
|
18
|
+
static _submissionDelay = ___codeGenAPISubmissionDelay;
|
|
19
|
+
static _baseURL = ___codeGenAPIURL;
|
|
20
|
+
static _port = ___codeGenAPIPort;
|
|
21
|
+
static _apiEndpoint = '/api/entity-permissions';
|
|
22
|
+
static getSubmissionURL() {
|
|
23
|
+
return `${this._baseURL}:${this._port}${this._apiEndpoint}`;
|
|
24
|
+
}
|
|
25
|
+
static get EntityIDQueue() {
|
|
26
|
+
return this._entityIDQueue;
|
|
27
|
+
}
|
|
28
|
+
static ClearQueue() {
|
|
29
|
+
this._entityIDQueue = [];
|
|
30
|
+
this._submissionTimer = null;
|
|
31
|
+
}
|
|
32
|
+
static AddToQueue(entityID) {
|
|
33
|
+
if (this._entityIDQueue.indexOf(entityID) === -1)
|
|
34
|
+
this._entityIDQueue.push(entityID);
|
|
35
|
+
this._lastModifiedTime = new Date();
|
|
36
|
+
this.CheckStartSubmissionTimer();
|
|
37
|
+
}
|
|
38
|
+
static CheckStartSubmissionTimer() {
|
|
39
|
+
if (this._submissionTimer === null) {
|
|
40
|
+
this.StartSubmissionTimer();
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
clearTimeout(this._submissionTimer);
|
|
44
|
+
this.StartSubmissionTimer();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static StartSubmissionTimer() {
|
|
48
|
+
this._submissionTimer = setTimeout(() => {
|
|
49
|
+
this.SubmitQueue();
|
|
50
|
+
}, this._submissionDelay);
|
|
51
|
+
}
|
|
52
|
+
static async SubmitQueue() {
|
|
53
|
+
this._lastModifiedTime = null;
|
|
54
|
+
if (this._entityIDQueue.length > 0) {
|
|
55
|
+
try {
|
|
56
|
+
const response = await axios.post(this.getSubmissionURL(), {
|
|
57
|
+
entityIDArray: this._entityIDQueue
|
|
58
|
+
});
|
|
59
|
+
if (response.status === 200 && response.data.status === 'ok') {
|
|
60
|
+
console.log('Queue submitted successfully.');
|
|
61
|
+
this.ClearQueue();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.error('Failed to submit queue:', response.data.errorMessage || 'Unknown error');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error('Failed to submit queue:', error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log('No entities to submit.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
Save(options) {
|
|
76
|
+
if (this.Dirty || options?.IgnoreDirtyState)
|
|
77
|
+
EntityPermissionsEntity_Server_1.AddToQueue(this.EntityID);
|
|
78
|
+
return super.Save(options);
|
|
79
|
+
}
|
|
80
|
+
async Delete() {
|
|
81
|
+
const success = await super.Delete();
|
|
82
|
+
if (success)
|
|
83
|
+
EntityPermissionsEntity_Server_1.AddToQueue(this.EntityID);
|
|
84
|
+
return success;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
EntityPermissionsEntity_Server = EntityPermissionsEntity_Server_1 = __decorate([
|
|
88
|
+
RegisterClass(BaseEntity, 'Entity Permissions', 3)
|
|
89
|
+
], EntityPermissionsEntity_Server);
|
|
90
|
+
export { EntityPermissionsEntity_Server };
|
|
91
|
+
export function LoadEntityPermissionsServerSubClass() {
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=entityPermissions.server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entityPermissions.server.js","sourceRoot":"","sources":["../../src/entitySubclasses/entityPermissions.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EntityInfo } from "@memberjunction/core";
|
|
2
|
+
import { AIModelEntityExtended, UserViewEntityExtended } from '@memberjunction/core-entities';
|
|
3
|
+
export declare class UserViewEntity_Server extends UserViewEntityExtended {
|
|
4
|
+
protected get SmartFilterImplemented(): boolean;
|
|
5
|
+
protected get AIVendorName(): string;
|
|
6
|
+
protected GetAIModel(): Promise<AIModelEntityExtended>;
|
|
7
|
+
GenerateSmartFilterWhereClause(prompt: string, entityInfo: EntityInfo): Promise<{
|
|
8
|
+
whereClause: string;
|
|
9
|
+
userExplanation: string;
|
|
10
|
+
}>;
|
|
11
|
+
GenerateSysPrompt(entityInfo: EntityInfo): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=userViewEntity.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userViewEntity.server.d.ts","sourceRoot":"","sources":["../../src/entitySubclasses/userViewEntity.server.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,UAAU,EAAsB,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAiB,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAM5G,qBACa,qBAAsB,SAAQ,sBAAsB;IAI7D,cAAuB,sBAAsB,IAAI,OAAO,CAEvD;IAMD,SAAS,KAAK,YAAY,IAAI,MAAM,CAEnC;cAMe,UAAU,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAc/C,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAC,CAAC;IAuErI,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;CAwE3D"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { CleanJSON, MJGlobal, RegisterClass } from "@memberjunction/global";
|
|
8
|
+
import { BaseEntity, LogError, Metadata } from "@memberjunction/core";
|
|
9
|
+
import { UserViewEntityExtended } from '@memberjunction/core-entities';
|
|
10
|
+
import { BaseLLM, GetAIAPIKey } from "@memberjunction/ai";
|
|
11
|
+
import { AIEngine } from "@memberjunction/aiengine";
|
|
12
|
+
import { LoadOpenAILLM } from "@memberjunction/ai-openai";
|
|
13
|
+
LoadOpenAILLM();
|
|
14
|
+
let UserViewEntity_Server = class UserViewEntity_Server extends UserViewEntityExtended {
|
|
15
|
+
get SmartFilterImplemented() {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
get AIVendorName() {
|
|
19
|
+
return 'OpenAI';
|
|
20
|
+
}
|
|
21
|
+
async GetAIModel() {
|
|
22
|
+
await AIEngine.Instance.Config(false, this.ContextCurrentUser);
|
|
23
|
+
const models = AIEngine.Instance.Models.filter(m => m.AIModelType.trim().toLowerCase() === 'llm' &&
|
|
24
|
+
m.Vendor.trim().toLowerCase() === this.AIVendorName.trim().toLowerCase());
|
|
25
|
+
models.sort((a, b) => b.PowerRank - a.PowerRank);
|
|
26
|
+
return models[0];
|
|
27
|
+
}
|
|
28
|
+
async GenerateSmartFilterWhereClause(prompt, entityInfo) {
|
|
29
|
+
try {
|
|
30
|
+
const model = await this.GetAIModel();
|
|
31
|
+
const llm = MJGlobal.Instance.ClassFactory.CreateInstance(BaseLLM, model.DriverClass, GetAIAPIKey(model.DriverClass));
|
|
32
|
+
const chatParams = {
|
|
33
|
+
model: model.APINameOrName,
|
|
34
|
+
messages: [
|
|
35
|
+
{
|
|
36
|
+
role: 'system',
|
|
37
|
+
content: this.GenerateSysPrompt(entityInfo)
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
role: 'user',
|
|
41
|
+
content: `${prompt}`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
const result = await llm.ChatCompletion(chatParams);
|
|
46
|
+
if (result && result.data) {
|
|
47
|
+
const llmResponse = result.data.choices[0].message.content;
|
|
48
|
+
if (llmResponse) {
|
|
49
|
+
try {
|
|
50
|
+
const cleansed = CleanJSON(llmResponse);
|
|
51
|
+
if (!cleansed)
|
|
52
|
+
throw new Error('Invalid JSON response from AI: ' + llmResponse);
|
|
53
|
+
const parsed = JSON.parse(cleansed);
|
|
54
|
+
if (parsed.whereClause && parsed.whereClause.length > 0) {
|
|
55
|
+
const trimmed = parsed.whereClause.trim();
|
|
56
|
+
let ret = '';
|
|
57
|
+
if (trimmed.toLowerCase().startsWith('where '))
|
|
58
|
+
ret = trimmed.substring(6);
|
|
59
|
+
else
|
|
60
|
+
ret = parsed.whereClause;
|
|
61
|
+
return {
|
|
62
|
+
whereClause: ret,
|
|
63
|
+
userExplanation: parsed.userExplanationMessage
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else if (parsed.whereClause !== undefined && parsed.whereClause !== null) {
|
|
67
|
+
return {
|
|
68
|
+
whereClause: '',
|
|
69
|
+
userExplanation: parsed.userExplanationMessage
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
throw new Error('Invalid response from AI, no whereClause property found in response: ' + llmResponse);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
LogError(e);
|
|
78
|
+
throw new Error('Error parsing JSON response from AI: ' + llmResponse);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
throw new Error('Null response from AI');
|
|
83
|
+
}
|
|
84
|
+
else
|
|
85
|
+
throw new Error('No result returned from AI');
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
LogError(e);
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
GenerateSysPrompt(entityInfo) {
|
|
93
|
+
const processedViews = [entityInfo.BaseView];
|
|
94
|
+
const md = new Metadata();
|
|
95
|
+
const gptSysPrompt = `You are an expert in SQL and Microsoft SQL Server.
|
|
96
|
+
You will be provided a user prompt representing how they want to filter the data.
|
|
97
|
+
You may *NOT* use JOINS, only sub-queries for related tables.
|
|
98
|
+
|
|
99
|
+
I am a bot and can only understand JSON. Your response must be parsable into this type:
|
|
100
|
+
const returnType = {
|
|
101
|
+
whereClause: string,
|
|
102
|
+
orderByClause: string
|
|
103
|
+
userExplanationMessage: string
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
The view that the user is querying is called ${entityInfo.BaseView} and has these fields:
|
|
107
|
+
${entityInfo.Fields.map(f => {
|
|
108
|
+
let ret = `${f.Name} (${f.Type})`;
|
|
109
|
+
if (f.RelatedEntity) {
|
|
110
|
+
ret += ` (fkey to ${f.RelatedEntityBaseView})`;
|
|
111
|
+
}
|
|
112
|
+
return ret;
|
|
113
|
+
}).join(',')}`;
|
|
114
|
+
const fkeyFields = entityInfo.Fields.filter(f => f.RelatedEntity && f.RelatedEntity.length > 0);
|
|
115
|
+
const fkeyBaseViewsDistinct = fkeyFields.map(f => f.RelatedEntityBaseView).filter((v, i, a) => a.indexOf(v) === i);
|
|
116
|
+
const relationships = `
|
|
117
|
+
In addition, ${entityInfo.BaseView} has links to other views, as shown here, you can use these views in sub-queries to achieve the request from the user.
|
|
118
|
+
If there are multiple filters related to a single related view, attempt to combine them into a single sub-query for efficiency.
|
|
119
|
+
${fkeyBaseViewsDistinct.map(v => {
|
|
120
|
+
if (processedViews.indexOf(v) === -1) {
|
|
121
|
+
const e = md.Entities.find(e => e.BaseView === v);
|
|
122
|
+
if (e) {
|
|
123
|
+
processedViews.push(v);
|
|
124
|
+
return `* ${e.SchemaName}.${e.BaseView}: ${e.Fields.map(ef => {
|
|
125
|
+
return ef.Name + ' (' + ef.Type + ')';
|
|
126
|
+
}).join(',')}`;
|
|
127
|
+
}
|
|
128
|
+
else
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
else
|
|
132
|
+
return '';
|
|
133
|
+
}).join('\n')}
|
|
134
|
+
${entityInfo.RelatedEntities.map(r => {
|
|
135
|
+
const e = md.Entities.find(e => e.Name === r.RelatedEntity);
|
|
136
|
+
if (e) {
|
|
137
|
+
if (processedViews.indexOf(e.BaseView) === -1) {
|
|
138
|
+
processedViews.push(e.BaseView);
|
|
139
|
+
return `* ${e.SchemaName}.${e.BaseView}: ${e.Fields.map(ef => {
|
|
140
|
+
let ret = `${ef.Name} (${ef.Type})`;
|
|
141
|
+
if (ef.RelatedEntity) {
|
|
142
|
+
ret += ` (fkey to ${ef.RelatedEntityBaseView})`;
|
|
143
|
+
}
|
|
144
|
+
return ret;
|
|
145
|
+
}).join(',')}`;
|
|
146
|
+
}
|
|
147
|
+
else
|
|
148
|
+
return '';
|
|
149
|
+
}
|
|
150
|
+
else
|
|
151
|
+
return '';
|
|
152
|
+
}).join('\n')}`;
|
|
153
|
+
return gptSysPrompt + (processedViews.length > 1 ? relationships : '') + `
|
|
154
|
+
**** REMEMBER **** I am a BOT, do not return anything other than JSON to me or I will choke on your response!`;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
UserViewEntity_Server = __decorate([
|
|
158
|
+
RegisterClass(BaseEntity, 'User Views')
|
|
159
|
+
], UserViewEntity_Server);
|
|
160
|
+
export { UserViewEntity_Server };
|
|
161
|
+
//# sourceMappingURL=userViewEntity.server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userViewEntity.server.js","sourceRoot":"","sources":["../../src/entitySubclasses/userViewEntity.server.ts"],"names":[],"mappings":"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"}
|