@memberjunction/core-actions 2.112.0 → 2.113.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.
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -11
- package/dist/config.js.map +1 -1
- package/dist/custom/ai/execute-ai-prompt.action.d.ts +2 -2
- package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -1
- package/dist/custom/ai/execute-ai-prompt.action.js +22 -22
- package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -1
- package/dist/custom/ai/find-best-action.action.d.ts +53 -0
- package/dist/custom/ai/find-best-action.action.d.ts.map +1 -0
- package/dist/custom/ai/find-best-action.action.js +211 -0
- package/dist/custom/ai/find-best-action.action.js.map +1 -0
- package/dist/custom/ai/find-best-agent.action.d.ts +53 -0
- package/dist/custom/ai/find-best-agent.action.d.ts.map +1 -0
- package/dist/custom/ai/find-best-agent.action.js +195 -0
- package/dist/custom/ai/find-best-agent.action.js.map +1 -0
- package/dist/custom/ai/find-candidate-actions.action.d.ts +2 -2
- package/dist/custom/ai/find-candidate-actions.action.d.ts.map +1 -1
- package/dist/custom/ai/find-candidate-actions.action.js +21 -21
- package/dist/custom/ai/find-candidate-actions.action.js.map +1 -1
- package/dist/custom/ai/summarize-content.action.d.ts +2 -2
- package/dist/custom/ai/summarize-content.action.d.ts.map +1 -1
- package/dist/custom/ai/summarize-content.action.js +50 -51
- package/dist/custom/ai/summarize-content.action.js.map +1 -1
- package/dist/custom/code-execution/execute-code.action.d.ts.map +1 -1
- package/dist/custom/code-execution/execute-code.action.js +27 -27
- package/dist/custom/code-execution/execute-code.action.js.map +1 -1
- package/dist/custom/communication/send-single-message.action.d.ts.map +1 -1
- package/dist/custom/communication/send-single-message.action.js +21 -10
- package/dist/custom/communication/send-single-message.action.js.map +1 -1
- package/dist/custom/crud/base-record-mutation.action.d.ts +3 -3
- package/dist/custom/crud/base-record-mutation.action.d.ts.map +1 -1
- package/dist/custom/crud/base-record-mutation.action.js +32 -28
- package/dist/custom/crud/base-record-mutation.action.js.map +1 -1
- package/dist/custom/crud/update-record.action.d.ts +2 -2
- package/dist/custom/crud/update-record.action.d.ts.map +1 -1
- package/dist/custom/crud/update-record.action.js +7 -7
- package/dist/custom/crud/update-record.action.js.map +1 -1
- package/dist/custom/data/execute-research-query.action.d.ts +2 -2
- package/dist/custom/data/execute-research-query.action.d.ts.map +1 -1
- package/dist/custom/data/execute-research-query.action.js +56 -52
- package/dist/custom/data/execute-research-query.action.js.map +1 -1
- package/dist/custom/data/explore-database-schema.action.d.ts +2 -2
- package/dist/custom/data/explore-database-schema.action.d.ts.map +1 -1
- package/dist/custom/data/explore-database-schema.action.js +51 -50
- package/dist/custom/data/explore-database-schema.action.js.map +1 -1
- package/dist/custom/data/get-entity-details.action.d.ts +2 -2
- package/dist/custom/data/get-entity-details.action.d.ts.map +1 -1
- package/dist/custom/data/get-entity-details.action.js +39 -30
- package/dist/custom/data/get-entity-details.action.js.map +1 -1
- package/dist/custom/data/get-entity-list.action.d.ts +2 -2
- package/dist/custom/data/get-entity-list.action.d.ts.map +1 -1
- package/dist/custom/data/get-entity-list.action.js +25 -25
- package/dist/custom/data/get-entity-list.action.js.map +1 -1
- package/dist/custom/files/base-file-storage.action.d.ts +5 -5
- package/dist/custom/files/base-file-storage.action.d.ts.map +1 -1
- package/dist/custom/files/base-file-storage.action.js +12 -12
- package/dist/custom/files/base-file-storage.action.js.map +1 -1
- package/dist/custom/files/list-storage-providers.action.d.ts +2 -2
- package/dist/custom/files/list-storage-providers.action.d.ts.map +1 -1
- package/dist/custom/files/list-storage-providers.action.js +22 -22
- package/dist/custom/files/list-storage-providers.action.js.map +1 -1
- package/dist/custom/user-management/assign-user-roles.action.d.ts +1 -1
- package/dist/custom/user-management/assign-user-roles.action.d.ts.map +1 -1
- package/dist/custom/user-management/assign-user-roles.action.js +27 -29
- package/dist/custom/user-management/assign-user-roles.action.js.map +1 -1
- package/dist/custom/user-management/check-user-permission.action.d.ts +1 -1
- package/dist/custom/user-management/check-user-permission.action.d.ts.map +1 -1
- package/dist/custom/user-management/check-user-permission.action.js +26 -25
- package/dist/custom/user-management/check-user-permission.action.js.map +1 -1
- package/dist/custom/user-management/create-employee.action.d.ts +2 -2
- package/dist/custom/user-management/create-employee.action.d.ts.map +1 -1
- package/dist/custom/user-management/create-employee.action.js +25 -25
- package/dist/custom/user-management/create-employee.action.js.map +1 -1
- package/dist/custom/user-management/create-user.action.d.ts +2 -2
- package/dist/custom/user-management/create-user.action.d.ts.map +1 -1
- package/dist/custom/user-management/create-user.action.js +23 -23
- package/dist/custom/user-management/create-user.action.js.map +1 -1
- package/dist/custom/utilities/base-file-handler.d.ts +2 -2
- package/dist/custom/utilities/base-file-handler.d.ts.map +1 -1
- package/dist/custom/utilities/base-file-handler.js +11 -11
- package/dist/custom/utilities/base-file-handler.js.map +1 -1
- package/dist/custom/utilities/external-change-detection.action.d.ts +2 -2
- package/dist/custom/utilities/external-change-detection.action.d.ts.map +1 -1
- package/dist/custom/utilities/external-change-detection.action.js +11 -11
- package/dist/custom/utilities/external-change-detection.action.js.map +1 -1
- package/dist/custom/utilities/vectorize-entity.action.d.ts +2 -2
- package/dist/custom/utilities/vectorize-entity.action.d.ts.map +1 -1
- package/dist/custom/utilities/vectorize-entity.action.js +9 -9
- package/dist/custom/utilities/vectorize-entity.action.js.map +1 -1
- package/dist/generated/action_subclasses.d.ts +5 -5
- package/dist/generated/action_subclasses.d.ts.map +1 -1
- package/dist/generated/action_subclasses.js +64 -64
- package/dist/generated/action_subclasses.js.map +1 -1
- package/package.json +17 -16
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseRecordMutationAction = void 0;
|
|
4
4
|
const actions_1 = require("@memberjunction/actions");
|
|
5
|
-
const
|
|
5
|
+
const core_1 = require("@memberjunction/core");
|
|
6
6
|
/**
|
|
7
7
|
* Abstract base class for record mutation actions (Create, Update, Delete).
|
|
8
8
|
* This class provides common functionality for validating parameters,
|
|
@@ -15,14 +15,14 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
15
15
|
* Extract and validate the EntityName parameter
|
|
16
16
|
*/
|
|
17
17
|
getEntityNameParam(params) {
|
|
18
|
-
const entityNameParam = params.Params.find(
|
|
18
|
+
const entityNameParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'entityname');
|
|
19
19
|
if (!entityNameParam || !entityNameParam.Value) {
|
|
20
20
|
return {
|
|
21
21
|
error: {
|
|
22
22
|
Success: false,
|
|
23
23
|
ResultCode: 'VALIDATION_ERROR',
|
|
24
|
-
Message: 'EntityName parameter is required'
|
|
25
|
-
}
|
|
24
|
+
Message: 'EntityName parameter is required'
|
|
25
|
+
}
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
return { value: entityNameParam.Value };
|
|
@@ -31,14 +31,14 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
31
31
|
* Extract and validate the PrimaryKey parameter
|
|
32
32
|
*/
|
|
33
33
|
getPrimaryKeyParam(params) {
|
|
34
|
-
const primaryKeyParam = params.Params.find(
|
|
34
|
+
const primaryKeyParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'primarykey');
|
|
35
35
|
if (!primaryKeyParam || !primaryKeyParam.Value) {
|
|
36
36
|
return {
|
|
37
37
|
error: {
|
|
38
38
|
Success: false,
|
|
39
39
|
ResultCode: 'VALIDATION_ERROR',
|
|
40
|
-
Message: 'PrimaryKey parameter is required'
|
|
41
|
-
}
|
|
40
|
+
Message: 'PrimaryKey parameter is required'
|
|
41
|
+
}
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
return { value: primaryKeyParam.Value };
|
|
@@ -47,14 +47,14 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
47
47
|
* Extract and validate the Fields parameter
|
|
48
48
|
*/
|
|
49
49
|
getFieldsParam(params) {
|
|
50
|
-
const fieldsParam = params.Params.find(
|
|
50
|
+
const fieldsParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'fields');
|
|
51
51
|
if (!fieldsParam || !fieldsParam.Value) {
|
|
52
52
|
return {
|
|
53
53
|
error: {
|
|
54
54
|
Success: false,
|
|
55
55
|
ResultCode: 'VALIDATION_ERROR',
|
|
56
|
-
Message: 'Fields parameter is required'
|
|
57
|
-
}
|
|
56
|
+
Message: 'Fields parameter is required'
|
|
57
|
+
}
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
60
|
return { value: fieldsParam.Value };
|
|
@@ -63,15 +63,15 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
63
63
|
* Get entity metadata and create entity object
|
|
64
64
|
*/
|
|
65
65
|
async getEntityObject(entityName, contextUser) {
|
|
66
|
-
const md = new
|
|
66
|
+
const md = new core_1.Metadata();
|
|
67
67
|
const entityInfo = md.EntityByName(entityName);
|
|
68
68
|
if (!entityInfo) {
|
|
69
69
|
return {
|
|
70
70
|
error: {
|
|
71
71
|
Success: false,
|
|
72
72
|
ResultCode: 'ENTITY_NOT_FOUND',
|
|
73
|
-
Message: `Entity '${entityName}' not found in metadata
|
|
74
|
-
}
|
|
73
|
+
Message: `Entity '${entityName}' not found in metadata`
|
|
74
|
+
}
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
const entity = await md.GetEntityObject(entityName, contextUser);
|
|
@@ -80,8 +80,8 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
80
80
|
error: {
|
|
81
81
|
Success: false,
|
|
82
82
|
ResultCode: 'FAILED',
|
|
83
|
-
Message: `Failed to create entity object for '${entityName}'
|
|
84
|
-
}
|
|
83
|
+
Message: `Failed to create entity object for '${entityName}'`
|
|
84
|
+
}
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
return { entity, entityInfo };
|
|
@@ -99,21 +99,22 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
99
99
|
error: {
|
|
100
100
|
Success: false,
|
|
101
101
|
ResultCode: 'VALIDATION_ERROR',
|
|
102
|
-
Message: `Primary key field '${pk.Name}' not provided
|
|
103
|
-
}
|
|
102
|
+
Message: `Primary key field '${pk.Name}' not provided`
|
|
103
|
+
}
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
keyData[pk.Name] = primaryKey[pk.Name];
|
|
107
107
|
}
|
|
108
108
|
// Load the record using LoadFromData which works for both single and composite keys
|
|
109
|
-
const pkey =
|
|
109
|
+
const pkey = core_1.CompositeKey.FromObject(keyData);
|
|
110
110
|
const loadResult = await entity.InnerLoad(pkey);
|
|
111
111
|
if (!loadResult) {
|
|
112
112
|
// Check if it's a permission issue or record not found
|
|
113
113
|
const latestResult = entity.LatestResult;
|
|
114
114
|
let resultCode = 'RECORD_NOT_FOUND';
|
|
115
115
|
let message = `${entityName} record not found`;
|
|
116
|
-
if (latestResult?.Message?.toLowerCase().includes('permission') ||
|
|
116
|
+
if (latestResult?.Message?.toLowerCase().includes('permission') ||
|
|
117
|
+
latestResult?.Message?.toLowerCase().includes('denied')) {
|
|
117
118
|
resultCode = 'PERMISSION_DENIED';
|
|
118
119
|
message = `Permission denied accessing ${entityName} record`;
|
|
119
120
|
}
|
|
@@ -122,8 +123,8 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
122
123
|
error: {
|
|
123
124
|
Success: false,
|
|
124
125
|
ResultCode: resultCode,
|
|
125
|
-
Message: message
|
|
126
|
-
}
|
|
126
|
+
Message: message
|
|
127
|
+
}
|
|
127
128
|
};
|
|
128
129
|
}
|
|
129
130
|
return { success: true };
|
|
@@ -137,7 +138,7 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
137
138
|
entity.Set(fieldName, fieldValue);
|
|
138
139
|
}
|
|
139
140
|
else {
|
|
140
|
-
(0,
|
|
141
|
+
(0, core_1.LogError)(`Field '${fieldName}' does not exist on entity '${entityName}'`);
|
|
141
142
|
}
|
|
142
143
|
}
|
|
143
144
|
}
|
|
@@ -153,14 +154,17 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
153
154
|
message += `: ${latestResult.Message}`;
|
|
154
155
|
}
|
|
155
156
|
// Check for specific error types
|
|
156
|
-
if (latestResult.Message?.toLowerCase().includes('permission') ||
|
|
157
|
+
if (latestResult.Message?.toLowerCase().includes('permission') ||
|
|
158
|
+
latestResult.Message?.toLowerCase().includes('denied')) {
|
|
157
159
|
resultCode = 'PERMISSION_DENIED';
|
|
158
160
|
}
|
|
159
|
-
else if (latestResult.Message?.toLowerCase().includes('validation') ||
|
|
161
|
+
else if (latestResult.Message?.toLowerCase().includes('validation') ||
|
|
162
|
+
latestResult.Message?.toLowerCase().includes('required')) {
|
|
160
163
|
resultCode = 'VALIDATION_ERROR';
|
|
161
164
|
}
|
|
162
165
|
else if (operation === 'update' &&
|
|
163
|
-
(latestResult.Message?.toLowerCase().includes('concurrent') ||
|
|
166
|
+
(latestResult.Message?.toLowerCase().includes('concurrent') ||
|
|
167
|
+
latestResult.Message?.toLowerCase().includes('modified'))) {
|
|
164
168
|
resultCode = 'CONCURRENT_UPDATE';
|
|
165
169
|
}
|
|
166
170
|
else if (operation === 'delete') {
|
|
@@ -179,18 +183,18 @@ class BaseRecordMutationAction extends actions_1.BaseAction {
|
|
|
179
183
|
return {
|
|
180
184
|
Success: false,
|
|
181
185
|
ResultCode: resultCode,
|
|
182
|
-
Message: message
|
|
186
|
+
Message: message
|
|
183
187
|
};
|
|
184
188
|
}
|
|
185
189
|
/**
|
|
186
190
|
* Handle generic errors with consistent formatting
|
|
187
191
|
*/
|
|
188
192
|
handleError(e, operation) {
|
|
189
|
-
(0,
|
|
193
|
+
(0, core_1.LogError)(e);
|
|
190
194
|
return {
|
|
191
195
|
Success: false,
|
|
192
196
|
ResultCode: 'FAILED',
|
|
193
|
-
Message: `Error ${operation} record: ${e.message}
|
|
197
|
+
Message: `Error ${operation} record: ${e.message}`
|
|
194
198
|
};
|
|
195
199
|
}
|
|
196
200
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-record-mutation.action.js","sourceRoot":"","sources":["../../../src/custom/crud/base-record-mutation.action.ts"],"names":[],"mappings":";;;AACA,qDAAqD;AACrD
|
|
1
|
+
{"version":3,"file":"base-record-mutation.action.js","sourceRoot":"","sources":["../../../src/custom/crud/base-record-mutation.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ActionResultSimple, RunActionParams } from
|
|
2
|
-
import { BaseRecordMutationAction } from
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseRecordMutationAction } from "./base-record-mutation.action";
|
|
3
3
|
/**
|
|
4
4
|
* Generic action for updating existing entity records in the database.
|
|
5
5
|
* This action provides a flexible way to update records for any entity type
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-record.action.d.ts","sourceRoot":"","sources":["../../../src/custom/crud/update-record.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBACa,kBAAmB,SAAQ,wBAAwB;
|
|
1
|
+
{"version":3,"file":"update-record.action.d.ts","sourceRoot":"","sources":["../../../src/custom/crud/update-record.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBACa,kBAAmB,SAAQ,wBAAwB;IAC5D;;;;;;;;;;;;;;OAcG;IACG,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA+EhF;AAED,wBAAgB,sBAAsB,SAGrC"}
|
|
@@ -8,7 +8,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.LoadUpdateRecordAction = exports.UpdateRecordAction = void 0;
|
|
10
10
|
const global_1 = require("@memberjunction/global");
|
|
11
|
-
const
|
|
11
|
+
const core_1 = require("@memberjunction/core");
|
|
12
12
|
const base_record_mutation_action_1 = require("./base-record-mutation.action");
|
|
13
13
|
const actions_1 = require("@memberjunction/actions");
|
|
14
14
|
/**
|
|
@@ -93,13 +93,13 @@ let UpdateRecordAction = class UpdateRecordAction extends base_record_mutation_a
|
|
|
93
93
|
entity.Set(fieldName, fieldValue);
|
|
94
94
|
updatedFields[fieldName] = {
|
|
95
95
|
oldValue: currentValue,
|
|
96
|
-
newValue: fieldValue
|
|
96
|
+
newValue: fieldValue
|
|
97
97
|
};
|
|
98
98
|
hasChanges = true;
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
|
-
(0,
|
|
102
|
+
(0, core_1.LogError)(`Field '${fieldName}' does not exist on entity '${entityName}'`);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
// Check if there are any changes to save
|
|
@@ -107,7 +107,7 @@ let UpdateRecordAction = class UpdateRecordAction extends base_record_mutation_a
|
|
|
107
107
|
return {
|
|
108
108
|
Success: true,
|
|
109
109
|
ResultCode: 'NO_CHANGES',
|
|
110
|
-
Message: 'No fields were modified'
|
|
110
|
+
Message: 'No fields were modified'
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
// Save the record
|
|
@@ -117,13 +117,13 @@ let UpdateRecordAction = class UpdateRecordAction extends base_record_mutation_a
|
|
|
117
117
|
params.Params.push({
|
|
118
118
|
Name: 'UpdatedFields',
|
|
119
119
|
Value: updatedFields,
|
|
120
|
-
Type: 'Output'
|
|
120
|
+
Type: 'Output'
|
|
121
121
|
});
|
|
122
122
|
return {
|
|
123
123
|
Success: true,
|
|
124
124
|
ResultCode: 'SUCCESS',
|
|
125
125
|
Message: `Successfully updated ${entityName} record`,
|
|
126
|
-
Params: params.Params
|
|
126
|
+
Params: params.Params
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
129
|
else {
|
|
@@ -137,7 +137,7 @@ let UpdateRecordAction = class UpdateRecordAction extends base_record_mutation_a
|
|
|
137
137
|
};
|
|
138
138
|
exports.UpdateRecordAction = UpdateRecordAction;
|
|
139
139
|
exports.UpdateRecordAction = UpdateRecordAction = __decorate([
|
|
140
|
-
(0, global_1.RegisterClass)(actions_1.BaseAction,
|
|
140
|
+
(0, global_1.RegisterClass)(actions_1.BaseAction, "UpdateRecordAction")
|
|
141
141
|
], UpdateRecordAction);
|
|
142
142
|
function LoadUpdateRecordAction() {
|
|
143
143
|
// This function exists to prevent tree shaking from removing the action class
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-record.action.js","sourceRoot":"","sources":["../../../src/custom/crud/update-record.action.ts"],"names":[],"mappings":";;;;;;;;;AACA,mDAAuD;AACvD
|
|
1
|
+
{"version":3,"file":"update-record.action.js","sourceRoot":"","sources":["../../../src/custom/crud/update-record.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ActionResultSimple, RunActionParams } from
|
|
2
|
-
import { BaseAction } from
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
3
|
/**
|
|
4
4
|
* Action that executes read-only SQL SELECT queries for research purposes with
|
|
5
5
|
* security validation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-research-query.action.d.ts","sourceRoot":"","sources":["../../../src/custom/data/execute-research-query.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AASrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBACa,0BAA2B,SAAQ,UAAU;
|
|
1
|
+
{"version":3,"file":"execute-research-query.action.d.ts","sourceRoot":"","sources":["../../../src/custom/data/execute-research-query.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AASrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBACa,0BAA2B,SAAQ,UAAU;IAEtD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAwBjC;cAEc,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoLvF;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4B7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA8BlC;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;YACW,gBAAgB;IA2D9B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAOlC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CA2E/B;AAED;;GAEG;AACH,wBAAgB,8BAA8B,SAE7C"}
|
|
@@ -10,7 +10,7 @@ exports.LoadExecuteResearchQueryAction = exports.ExecuteResearchQueryAction = vo
|
|
|
10
10
|
const global_1 = require("@memberjunction/global");
|
|
11
11
|
const actions_1 = require("@memberjunction/actions");
|
|
12
12
|
const global_2 = require("@memberjunction/global");
|
|
13
|
-
const
|
|
13
|
+
const core_1 = require("@memberjunction/core");
|
|
14
14
|
const ai_prompts_1 = require("@memberjunction/ai-prompts");
|
|
15
15
|
const ai_core_plus_1 = require("@memberjunction/ai-core-plus");
|
|
16
16
|
const aiengine_1 = require("@memberjunction/aiengine");
|
|
@@ -84,56 +84,57 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
84
84
|
/\bSHUTDOWN\b/i,
|
|
85
85
|
/\bDBCC\b/i,
|
|
86
86
|
/--\+/, // SQL hints
|
|
87
|
-
|
|
87
|
+
/\/\*\+/ // Oracle-style hints
|
|
88
88
|
];
|
|
89
89
|
async InternalRunAction(params) {
|
|
90
90
|
const startTime = Date.now();
|
|
91
91
|
try {
|
|
92
92
|
// Extract parameters
|
|
93
|
-
const query = this.getStringParam(params,
|
|
93
|
+
const query = this.getStringParam(params, "query");
|
|
94
94
|
if (!query) {
|
|
95
95
|
return {
|
|
96
96
|
Success: false,
|
|
97
|
-
ResultCode:
|
|
98
|
-
Message:
|
|
97
|
+
ResultCode: "MISSING_QUERY",
|
|
98
|
+
Message: "Query parameter is required"
|
|
99
99
|
};
|
|
100
100
|
}
|
|
101
|
-
const maxRows = this.getNumericParam(params,
|
|
102
|
-
const timeout = this.getNumericParam(params,
|
|
103
|
-
const dataFormat = this.getStringParam(params,
|
|
104
|
-
const analysisRequest = this.getStringParam(params,
|
|
105
|
-
const returnType = this.getStringParam(params,
|
|
106
|
-
|
|
101
|
+
const maxRows = this.getNumericParam(params, "maxrows", 1000);
|
|
102
|
+
const timeout = this.getNumericParam(params, "timeout", 30);
|
|
103
|
+
const dataFormat = this.getStringParam(params, "dataformat") || 'csv';
|
|
104
|
+
const analysisRequest = this.getStringParam(params, "analysisrequest");
|
|
105
|
+
const returnType = this.getStringParam(params, "returntype") ||
|
|
106
|
+
(analysisRequest ? 'data and analysis' : 'data only');
|
|
107
|
+
const columnMaxLength = this.getNumericParam(params, "columnmaxlength", 50); // Default: 50 chars, 0 = no limit
|
|
107
108
|
// Validate query security
|
|
108
109
|
const securityValidation = this.validateQuerySecurity(query);
|
|
109
110
|
if (!securityValidation.isValid) {
|
|
110
111
|
return {
|
|
111
112
|
Success: false,
|
|
112
113
|
ResultCode: securityValidation.resultCode,
|
|
113
|
-
Message: securityValidation.message
|
|
114
|
+
Message: securityValidation.message
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
117
|
// Ensure query returns limited results
|
|
117
118
|
const limitedQuery = this.ensureRowLimit(query, maxRows);
|
|
118
|
-
const dataProvider =
|
|
119
|
+
const dataProvider = core_1.BaseEntity.Provider;
|
|
119
120
|
try {
|
|
120
121
|
// Execute the query with timeout
|
|
121
122
|
const queryStartTime = Date.now();
|
|
122
|
-
const results =
|
|
123
|
+
const results = await Promise.race([
|
|
123
124
|
dataProvider.ExecuteSQL(limitedQuery, null, {
|
|
124
125
|
description: 'Execute Research Query',
|
|
125
126
|
ignoreLogging: false,
|
|
126
|
-
isMutation: false
|
|
127
|
+
isMutation: false
|
|
127
128
|
}, params.ContextUser),
|
|
128
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Query timeout exceeded')), timeout * 1000))
|
|
129
|
-
])
|
|
129
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Query timeout exceeded')), timeout * 1000))
|
|
130
|
+
]);
|
|
130
131
|
const executionTimeMs = Date.now() - queryStartTime;
|
|
131
132
|
// Get column metadata
|
|
132
133
|
const columns = results && results.columns
|
|
133
134
|
? Object.entries(results.columns).map(([name, col]) => ({
|
|
134
135
|
ColumnName: name,
|
|
135
136
|
DataType: col.type?.name || 'unknown',
|
|
136
|
-
IsNullable: col.nullable !== false
|
|
137
|
+
IsNullable: col.nullable !== false
|
|
137
138
|
}))
|
|
138
139
|
: [];
|
|
139
140
|
const wasTruncated = results.length >= maxRows;
|
|
@@ -145,7 +146,9 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
145
146
|
formattedData = this.formatAsCSV(results, columnMaxLength);
|
|
146
147
|
}
|
|
147
148
|
else if (dataFormat === 'json') {
|
|
148
|
-
const trimmedResults = columnMaxLength > 0
|
|
149
|
+
const trimmedResults = columnMaxLength > 0
|
|
150
|
+
? this.trimResultColumns(results, columnMaxLength)
|
|
151
|
+
: results;
|
|
149
152
|
formattedData = JSON.stringify(trimmedResults, null, 2);
|
|
150
153
|
}
|
|
151
154
|
// Perform analysis if requested
|
|
@@ -161,7 +164,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
161
164
|
analysis = analysisResult.analysis;
|
|
162
165
|
}
|
|
163
166
|
else {
|
|
164
|
-
(0,
|
|
167
|
+
(0, core_1.LogError)(`Failed to analyze query data: ${analysisResult.error}`);
|
|
165
168
|
}
|
|
166
169
|
}
|
|
167
170
|
}
|
|
@@ -171,7 +174,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
171
174
|
// Build result object based on return type
|
|
172
175
|
const resultData = {
|
|
173
176
|
Success: true,
|
|
174
|
-
ResultCode:
|
|
177
|
+
ResultCode: "SUCCESS",
|
|
175
178
|
Message: message,
|
|
176
179
|
Columns: columns,
|
|
177
180
|
RowCount: results.length,
|
|
@@ -179,7 +182,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
179
182
|
TotalTimeMs: totalExecutionTime,
|
|
180
183
|
WasTruncated: wasTruncated,
|
|
181
184
|
ValidationWarnings: warnings,
|
|
182
|
-
Query: limitedQuery
|
|
185
|
+
Query: limitedQuery
|
|
183
186
|
};
|
|
184
187
|
// Add data and/or analysis to results based on returnType
|
|
185
188
|
if (returnType === 'data only' || returnType === 'data and analysis') {
|
|
@@ -195,24 +198,25 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
195
198
|
if (queryError.message && queryError.message.includes('timeout')) {
|
|
196
199
|
return {
|
|
197
200
|
Success: false,
|
|
198
|
-
ResultCode:
|
|
199
|
-
Message: `Query execution exceeded ${timeout} second timeout. Consider optimizing query or increasing timeout parameter
|
|
201
|
+
ResultCode: "QUERY_TIMEOUT",
|
|
202
|
+
Message: `Query execution exceeded ${timeout} second timeout. Consider optimizing query or increasing timeout parameter.`
|
|
200
203
|
};
|
|
201
204
|
}
|
|
202
205
|
// Handle permission errors
|
|
203
206
|
if (queryError.message &&
|
|
204
|
-
(queryError.message.toLowerCase().includes('permission') ||
|
|
207
|
+
(queryError.message.toLowerCase().includes('permission') ||
|
|
208
|
+
queryError.message.toLowerCase().includes('denied'))) {
|
|
205
209
|
return {
|
|
206
210
|
Success: false,
|
|
207
|
-
ResultCode:
|
|
208
|
-
Message: `Insufficient permissions to execute query: ${queryError.message}
|
|
211
|
+
ResultCode: "PERMISSION_DENIED",
|
|
212
|
+
Message: `Insufficient permissions to execute query: ${queryError.message}`
|
|
209
213
|
};
|
|
210
214
|
}
|
|
211
215
|
// Handle other database errors
|
|
212
216
|
return {
|
|
213
217
|
Success: false,
|
|
214
|
-
ResultCode:
|
|
215
|
-
Message: `Database error occurred: ${queryError.message || String(queryError)}
|
|
218
|
+
ResultCode: "DATABASE_ERROR",
|
|
219
|
+
Message: `Database error occurred: ${queryError.message || String(queryError)}`
|
|
216
220
|
};
|
|
217
221
|
}
|
|
218
222
|
}
|
|
@@ -220,8 +224,8 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
220
224
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
221
225
|
return {
|
|
222
226
|
Success: false,
|
|
223
|
-
ResultCode:
|
|
224
|
-
Message: `Query execution failed: ${errorMessage}
|
|
227
|
+
ResultCode: "QUERY_EXECUTION_FAILED",
|
|
228
|
+
Message: `Query execution failed: ${errorMessage}`
|
|
225
229
|
};
|
|
226
230
|
}
|
|
227
231
|
}
|
|
@@ -235,22 +239,19 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
235
239
|
return {
|
|
236
240
|
isValid: false,
|
|
237
241
|
message: `Query contains potentially dangerous operation: ${pattern.source}. Only SELECT queries are allowed.`,
|
|
238
|
-
resultCode: 'DANGEROUS_QUERY'
|
|
242
|
+
resultCode: 'DANGEROUS_QUERY'
|
|
239
243
|
};
|
|
240
244
|
}
|
|
241
245
|
}
|
|
242
246
|
// Check if query starts with SELECT (allowing for whitespace and comments)
|
|
243
247
|
const trimmedQuery = query.trim();
|
|
244
|
-
const cleanQuery = trimmedQuery
|
|
245
|
-
|
|
246
|
-
.
|
|
247
|
-
.trim();
|
|
248
|
-
if (!cleanQuery.toUpperCase().startsWith('SELECT') && !cleanQuery.toUpperCase().startsWith('WITH')) {
|
|
249
|
-
// Allow CTEs
|
|
248
|
+
const cleanQuery = trimmedQuery.replace(/^\/\*[\s\S]*?\*\//, '').replace(/^--.*$/gm, '').trim();
|
|
249
|
+
if (!cleanQuery.toUpperCase().startsWith('SELECT') &&
|
|
250
|
+
!cleanQuery.toUpperCase().startsWith('WITH')) { // Allow CTEs
|
|
250
251
|
return {
|
|
251
252
|
isValid: false,
|
|
252
253
|
message: 'Only SELECT queries are allowed. Query must start with SELECT or WITH (for Common Table Expressions).',
|
|
253
|
-
resultCode: 'NOT_SELECT_STATEMENT'
|
|
254
|
+
resultCode: 'NOT_SELECT_STATEMENT'
|
|
254
255
|
};
|
|
255
256
|
}
|
|
256
257
|
return { isValid: true };
|
|
@@ -309,7 +310,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
309
310
|
const headers = Object.keys(results[0]);
|
|
310
311
|
const csvRows = [this.formatCSVRow(headers)];
|
|
311
312
|
for (const row of results) {
|
|
312
|
-
const values = headers.map(
|
|
313
|
+
const values = headers.map(header => {
|
|
313
314
|
let value = row[header];
|
|
314
315
|
// Apply column length limit if specified
|
|
315
316
|
if (columnMaxLength > 0 && value != null) {
|
|
@@ -328,7 +329,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
328
329
|
* Formats a single CSV row (for headers)
|
|
329
330
|
*/
|
|
330
331
|
formatCSVRow(values) {
|
|
331
|
-
return values.map(
|
|
332
|
+
return values.map(value => this.formatCSVValue(value)).join(',');
|
|
332
333
|
}
|
|
333
334
|
/**
|
|
334
335
|
* Formats a single CSV value with proper escaping
|
|
@@ -355,7 +356,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
355
356
|
* @returns New array with trimmed values
|
|
356
357
|
*/
|
|
357
358
|
trimResultColumns(results, maxLength) {
|
|
358
|
-
return results.map(
|
|
359
|
+
return results.map(row => {
|
|
359
360
|
const trimmedRow = {};
|
|
360
361
|
for (const [key, value] of Object.entries(row)) {
|
|
361
362
|
if (value != null && typeof value === 'string' && value.length > maxLength) {
|
|
@@ -380,7 +381,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
380
381
|
if (!prompt) {
|
|
381
382
|
return {
|
|
382
383
|
success: false,
|
|
383
|
-
error: "Prompt 'Analyze Query Data' not found. Ensure metadata has been synced."
|
|
384
|
+
error: "Prompt 'Analyze Query Data' not found. Ensure metadata has been synced."
|
|
384
385
|
};
|
|
385
386
|
}
|
|
386
387
|
// Format data as CSV for more efficient token usage
|
|
@@ -393,7 +394,7 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
393
394
|
data: dataCSV,
|
|
394
395
|
columns: columns,
|
|
395
396
|
rowCount: results.length,
|
|
396
|
-
analysisRequest: analysisRequest
|
|
397
|
+
analysisRequest: analysisRequest
|
|
397
398
|
};
|
|
398
399
|
promptParams.contextUser = params.ContextUser;
|
|
399
400
|
// Execute the prompt
|
|
@@ -402,18 +403,18 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
402
403
|
if (!result.success) {
|
|
403
404
|
return {
|
|
404
405
|
success: false,
|
|
405
|
-
error: result.errorMessage ||
|
|
406
|
+
error: result.errorMessage || "Prompt execution failed"
|
|
406
407
|
};
|
|
407
408
|
}
|
|
408
409
|
return {
|
|
409
410
|
success: true,
|
|
410
|
-
analysis: result.result?.analysis || String(result.result)
|
|
411
|
+
analysis: result.result?.analysis || String(result.result)
|
|
411
412
|
};
|
|
412
413
|
}
|
|
413
414
|
catch (error) {
|
|
414
415
|
return {
|
|
415
416
|
success: false,
|
|
416
|
-
error: error instanceof Error ? error.message : String(error)
|
|
417
|
+
error: error instanceof Error ? error.message : String(error)
|
|
417
418
|
};
|
|
418
419
|
}
|
|
419
420
|
}
|
|
@@ -421,20 +422,23 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
421
422
|
* Get prompt by name and category from AIEngine
|
|
422
423
|
*/
|
|
423
424
|
getPromptByNameAndCategory(name, category) {
|
|
424
|
-
return aiengine_1.AIEngine.Instance.Prompts.find(
|
|
425
|
+
return aiengine_1.AIEngine.Instance.Prompts.find(p => p.Name.trim().toLowerCase() === name.trim().toLowerCase() &&
|
|
426
|
+
p.Category?.trim().toLowerCase() === category?.trim().toLowerCase());
|
|
425
427
|
}
|
|
426
428
|
/**
|
|
427
429
|
* Helper to get string parameter value
|
|
428
430
|
*/
|
|
429
431
|
getStringParam(params, paramName) {
|
|
430
|
-
const param = params.Params.find(
|
|
432
|
+
const param = params.Params.find(p => p.Name.toLowerCase() === paramName.toLowerCase() &&
|
|
433
|
+
p.Type === 'Input');
|
|
431
434
|
return param?.Value ? String(param.Value) : undefined;
|
|
432
435
|
}
|
|
433
436
|
/**
|
|
434
437
|
* Helper to get numeric parameter value
|
|
435
438
|
*/
|
|
436
439
|
getNumericParam(params, paramName, defaultValue) {
|
|
437
|
-
const param = params.Params.find(
|
|
440
|
+
const param = params.Params.find(p => p.Name.toLowerCase() === paramName.toLowerCase() &&
|
|
441
|
+
p.Type === 'Input');
|
|
438
442
|
if (param?.Value != null) {
|
|
439
443
|
const num = Number(param.Value);
|
|
440
444
|
return isNaN(num) ? defaultValue : num;
|
|
@@ -504,13 +508,13 @@ let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends action
|
|
|
504
508
|
};
|
|
505
509
|
exports.ExecuteResearchQueryAction = ExecuteResearchQueryAction;
|
|
506
510
|
exports.ExecuteResearchQueryAction = ExecuteResearchQueryAction = __decorate([
|
|
507
|
-
(0, global_1.RegisterClass)(actions_1.BaseAction,
|
|
511
|
+
(0, global_1.RegisterClass)(actions_1.BaseAction, "Execute Research Query")
|
|
508
512
|
], ExecuteResearchQueryAction);
|
|
509
513
|
/**
|
|
510
514
|
* Load function to ensure the class is registered and not tree-shaken
|
|
511
515
|
*/
|
|
512
516
|
function LoadExecuteResearchQueryAction() {
|
|
513
|
-
global_2.MJGlobal.Instance.ClassFactory.GetRegistration(actions_1.BaseAction,
|
|
517
|
+
global_2.MJGlobal.Instance.ClassFactory.GetRegistration(actions_1.BaseAction, "Execute Research Query");
|
|
514
518
|
}
|
|
515
519
|
exports.LoadExecuteResearchQueryAction = LoadExecuteResearchQueryAction;
|
|
516
520
|
//# sourceMappingURL=execute-research-query.action.js.map
|