@memberjunction/core-actions 2.106.0 → 2.108.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 +112 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -2
- package/dist/config.js.map +1 -1
- 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 +194 -0
- package/dist/custom/ai/find-best-agent.action.js.map +1 -0
- package/dist/custom/ai/summarize-content.action.d.ts +72 -0
- package/dist/custom/ai/summarize-content.action.d.ts.map +1 -0
- package/dist/custom/ai/summarize-content.action.js +296 -0
- package/dist/custom/ai/summarize-content.action.js.map +1 -0
- package/dist/custom/code-execution/execute-code.action.d.ts +61 -0
- package/dist/custom/code-execution/execute-code.action.d.ts.map +1 -0
- package/dist/custom/code-execution/execute-code.action.js +172 -0
- package/dist/custom/code-execution/execute-code.action.js.map +1 -0
- package/dist/custom/data/csv-parser.action.js +1 -1
- package/dist/custom/data/csv-parser.action.js.map +1 -1
- package/dist/custom/data/execute-research-query.action.d.ts +114 -0
- package/dist/custom/data/execute-research-query.action.d.ts.map +1 -0
- package/dist/custom/data/execute-research-query.action.js +520 -0
- package/dist/custom/data/execute-research-query.action.js.map +1 -0
- package/dist/custom/data/explore-database-schema.action.d.ts +95 -0
- package/dist/custom/data/explore-database-schema.action.d.ts.map +1 -0
- package/dist/custom/data/explore-database-schema.action.js +499 -0
- package/dist/custom/data/explore-database-schema.action.js.map +1 -0
- package/dist/custom/data/get-entity-details.action.d.ts +63 -0
- package/dist/custom/data/get-entity-details.action.d.ts.map +1 -0
- package/dist/custom/data/get-entity-details.action.js +284 -0
- package/dist/custom/data/get-entity-details.action.js.map +1 -0
- package/dist/custom/data/get-entity-list.action.d.ts +57 -0
- package/dist/custom/data/get-entity-list.action.d.ts.map +1 -0
- package/dist/custom/data/get-entity-list.action.js +177 -0
- package/dist/custom/data/get-entity-list.action.js.map +1 -0
- package/dist/custom/files/index.d.ts +2 -0
- package/dist/custom/files/index.d.ts.map +1 -1
- package/dist/custom/files/index.js +5 -1
- package/dist/custom/files/index.js.map +1 -1
- package/dist/custom/files/list-storage-providers.action.d.ts +52 -0
- package/dist/custom/files/list-storage-providers.action.d.ts.map +1 -0
- package/dist/custom/files/list-storage-providers.action.js +175 -0
- package/dist/custom/files/list-storage-providers.action.js.map +1 -0
- package/dist/custom/files/search-storage-files.action.d.ts +61 -0
- package/dist/custom/files/search-storage-files.action.d.ts.map +1 -0
- package/dist/custom/files/search-storage-files.action.js +183 -0
- package/dist/custom/files/search-storage-files.action.js.map +1 -0
- package/dist/custom/visualization/create-svg-chart.action.d.ts +97 -0
- package/dist/custom/visualization/create-svg-chart.action.d.ts.map +1 -0
- package/dist/custom/visualization/create-svg-chart.action.js +290 -0
- package/dist/custom/visualization/create-svg-chart.action.js.map +1 -0
- package/dist/custom/visualization/create-svg-diagram.action.d.ts +151 -0
- package/dist/custom/visualization/create-svg-diagram.action.d.ts.map +1 -0
- package/dist/custom/visualization/create-svg-diagram.action.js +764 -0
- package/dist/custom/visualization/create-svg-diagram.action.js.map +1 -0
- package/dist/custom/visualization/create-svg-infographic.action.d.ts +72 -0
- package/dist/custom/visualization/create-svg-infographic.action.d.ts.map +1 -0
- package/dist/custom/visualization/create-svg-infographic.action.js +343 -0
- package/dist/custom/visualization/create-svg-infographic.action.js.map +1 -0
- package/dist/custom/visualization/create-svg-network.action.d.ts +106 -0
- package/dist/custom/visualization/create-svg-network.action.d.ts.map +1 -0
- package/dist/custom/visualization/create-svg-network.action.js +651 -0
- package/dist/custom/visualization/create-svg-network.action.js.map +1 -0
- package/dist/custom/visualization/create-svg-word-cloud.action.d.ts +94 -0
- package/dist/custom/visualization/create-svg-word-cloud.action.d.ts.map +1 -0
- package/dist/custom/visualization/create-svg-word-cloud.action.js +422 -0
- package/dist/custom/visualization/create-svg-word-cloud.action.js.map +1 -0
- package/dist/custom/visualization/shared/svg-theming.d.ts +91 -0
- package/dist/custom/visualization/shared/svg-theming.d.ts.map +1 -0
- package/dist/custom/visualization/shared/svg-theming.js +235 -0
- package/dist/custom/visualization/shared/svg-theming.js.map +1 -0
- package/dist/custom/visualization/shared/svg-types.d.ts +338 -0
- package/dist/custom/visualization/shared/svg-types.d.ts.map +1 -0
- package/dist/custom/visualization/shared/svg-types.js +11 -0
- package/dist/custom/visualization/shared/svg-types.js.map +1 -0
- package/dist/custom/visualization/shared/svg-utils.d.ts +129 -0
- package/dist/custom/visualization/shared/svg-utils.d.ts.map +1 -0
- package/dist/custom/visualization/shared/svg-utils.js +287 -0
- package/dist/custom/visualization/shared/svg-utils.js.map +1 -0
- package/dist/custom/web/google-custom-search.action.d.ts +60 -0
- package/dist/custom/web/google-custom-search.action.d.ts.map +1 -0
- package/dist/custom/web/google-custom-search.action.js +378 -0
- package/dist/custom/web/google-custom-search.action.js.map +1 -0
- package/dist/custom/web/web-page-content.action.d.ts +24 -0
- package/dist/custom/web/web-page-content.action.d.ts.map +1 -1
- package/dist/custom/web/web-page-content.action.js +90 -9
- package/dist/custom/web/web-page-content.action.js.map +1 -1
- package/dist/generated/action_subclasses.d.ts +51 -3
- package/dist/generated/action_subclasses.d.ts.map +1 -1
- package/dist/generated/action_subclasses.js +174 -90
- package/dist/generated/action_subclasses.js.map +1 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -1
- package/package.json +30 -11
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Action that executes read-only SQL SELECT queries for research purposes with
|
|
5
|
+
* security validation.
|
|
6
|
+
*
|
|
7
|
+
* Security Features:
|
|
8
|
+
* - SELECT-only enforcement (rejects INSERT, UPDATE, DELETE, DROP, etc.)
|
|
9
|
+
* - Dangerous operation detection (EXEC, xp_, sp_, dynamic SQL, etc.)
|
|
10
|
+
* - Query timeout protection
|
|
11
|
+
* - Audit logging of all queries
|
|
12
|
+
* - Result size limiting
|
|
13
|
+
*
|
|
14
|
+
* Performance Features:
|
|
15
|
+
* - Configurable row limits to prevent overwhelming results
|
|
16
|
+
* - Execution time tracking
|
|
17
|
+
* - Validation warnings for potentially slow queries
|
|
18
|
+
*
|
|
19
|
+
* Note: SQL syntax validation is handled by SQL Server during execution.
|
|
20
|
+
* This provides more accurate error messages than a JavaScript parser.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Simple SELECT query
|
|
25
|
+
* await runAction({
|
|
26
|
+
* ActionName: 'Execute Research Query',
|
|
27
|
+
* Params: [{
|
|
28
|
+
* Name: 'Query',
|
|
29
|
+
* Value: 'SELECT TOP 100 * FROM Customers WHERE Country = ''USA'''
|
|
30
|
+
* }]
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Query with timeout
|
|
34
|
+
* await runAction({
|
|
35
|
+
* ActionName: 'Execute Research Query',
|
|
36
|
+
* Params: [{
|
|
37
|
+
* Name: 'Query',
|
|
38
|
+
* Value: 'SELECT COUNT(*) FROM Orders GROUP BY CustomerID'
|
|
39
|
+
* }, {
|
|
40
|
+
* Name: 'Timeout',
|
|
41
|
+
* Value: 60
|
|
42
|
+
* }]
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class ExecuteResearchQueryAction extends BaseAction {
|
|
47
|
+
/**
|
|
48
|
+
* List of dangerous SQL keywords and patterns that should be blocked
|
|
49
|
+
*/
|
|
50
|
+
private readonly DANGEROUS_PATTERNS;
|
|
51
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
52
|
+
/**
|
|
53
|
+
* Validates query for security concerns
|
|
54
|
+
*/
|
|
55
|
+
private validateQuerySecurity;
|
|
56
|
+
/**
|
|
57
|
+
* Ensures query has a row limit to prevent overwhelming results
|
|
58
|
+
*/
|
|
59
|
+
private ensureRowLimit;
|
|
60
|
+
/**
|
|
61
|
+
* Generates validation warnings for potentially problematic queries
|
|
62
|
+
*/
|
|
63
|
+
private generateValidationWarnings;
|
|
64
|
+
/**
|
|
65
|
+
* Formats results as CSV string with proper escaping
|
|
66
|
+
* @param results Array of result objects
|
|
67
|
+
* @param columnMaxLength Optional maximum length for column values (0 = no limit)
|
|
68
|
+
*/
|
|
69
|
+
private formatAsCSV;
|
|
70
|
+
/**
|
|
71
|
+
* Formats a single CSV row (for headers)
|
|
72
|
+
*/
|
|
73
|
+
private formatCSVRow;
|
|
74
|
+
/**
|
|
75
|
+
* Formats a single CSV value with proper escaping
|
|
76
|
+
* - Null/undefined values become empty strings
|
|
77
|
+
* - All string values are quoted and escaped
|
|
78
|
+
* - Numbers and booleans are converted to strings and quoted
|
|
79
|
+
*/
|
|
80
|
+
private formatCSVValue;
|
|
81
|
+
/**
|
|
82
|
+
* Trims columns in result set to maximum length
|
|
83
|
+
* Used for JSON format results to prevent verbose fields from overwhelming context
|
|
84
|
+
* @param results Array of result objects
|
|
85
|
+
* @param maxLength Maximum length for string values
|
|
86
|
+
* @returns New array with trimmed values
|
|
87
|
+
*/
|
|
88
|
+
private trimResultColumns;
|
|
89
|
+
/**
|
|
90
|
+
* Analyze query data using AI prompt
|
|
91
|
+
*/
|
|
92
|
+
private analyzeQueryData;
|
|
93
|
+
/**
|
|
94
|
+
* Get prompt by name and category from AIEngine
|
|
95
|
+
*/
|
|
96
|
+
private getPromptByNameAndCategory;
|
|
97
|
+
/**
|
|
98
|
+
* Helper to get string parameter value
|
|
99
|
+
*/
|
|
100
|
+
private getStringParam;
|
|
101
|
+
/**
|
|
102
|
+
* Helper to get numeric parameter value
|
|
103
|
+
*/
|
|
104
|
+
private getNumericParam;
|
|
105
|
+
/**
|
|
106
|
+
* Build detailed message with query results for agent consumption
|
|
107
|
+
*/
|
|
108
|
+
private buildDetailedMessage;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Load function to ensure the class is registered and not tree-shaken
|
|
112
|
+
*/
|
|
113
|
+
export declare function LoadExecuteResearchQueryAction(): void;
|
|
114
|
+
//# sourceMappingURL=execute-research-query.action.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,520 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LoadExecuteResearchQueryAction = exports.ExecuteResearchQueryAction = void 0;
|
|
10
|
+
const global_1 = require("@memberjunction/global");
|
|
11
|
+
const actions_1 = require("@memberjunction/actions");
|
|
12
|
+
const global_2 = require("@memberjunction/global");
|
|
13
|
+
const core_1 = require("@memberjunction/core");
|
|
14
|
+
const ai_prompts_1 = require("@memberjunction/ai-prompts");
|
|
15
|
+
const ai_core_plus_1 = require("@memberjunction/ai-core-plus");
|
|
16
|
+
const aiengine_1 = require("@memberjunction/aiengine");
|
|
17
|
+
/**
|
|
18
|
+
* Action that executes read-only SQL SELECT queries for research purposes with
|
|
19
|
+
* security validation.
|
|
20
|
+
*
|
|
21
|
+
* Security Features:
|
|
22
|
+
* - SELECT-only enforcement (rejects INSERT, UPDATE, DELETE, DROP, etc.)
|
|
23
|
+
* - Dangerous operation detection (EXEC, xp_, sp_, dynamic SQL, etc.)
|
|
24
|
+
* - Query timeout protection
|
|
25
|
+
* - Audit logging of all queries
|
|
26
|
+
* - Result size limiting
|
|
27
|
+
*
|
|
28
|
+
* Performance Features:
|
|
29
|
+
* - Configurable row limits to prevent overwhelming results
|
|
30
|
+
* - Execution time tracking
|
|
31
|
+
* - Validation warnings for potentially slow queries
|
|
32
|
+
*
|
|
33
|
+
* Note: SQL syntax validation is handled by SQL Server during execution.
|
|
34
|
+
* This provides more accurate error messages than a JavaScript parser.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // Simple SELECT query
|
|
39
|
+
* await runAction({
|
|
40
|
+
* ActionName: 'Execute Research Query',
|
|
41
|
+
* Params: [{
|
|
42
|
+
* Name: 'Query',
|
|
43
|
+
* Value: 'SELECT TOP 100 * FROM Customers WHERE Country = ''USA'''
|
|
44
|
+
* }]
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // Query with timeout
|
|
48
|
+
* await runAction({
|
|
49
|
+
* ActionName: 'Execute Research Query',
|
|
50
|
+
* Params: [{
|
|
51
|
+
* Name: 'Query',
|
|
52
|
+
* Value: 'SELECT COUNT(*) FROM Orders GROUP BY CustomerID'
|
|
53
|
+
* }, {
|
|
54
|
+
* Name: 'Timeout',
|
|
55
|
+
* Value: 60
|
|
56
|
+
* }]
|
|
57
|
+
* });
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
let ExecuteResearchQueryAction = class ExecuteResearchQueryAction extends actions_1.BaseAction {
|
|
61
|
+
/**
|
|
62
|
+
* List of dangerous SQL keywords and patterns that should be blocked
|
|
63
|
+
*/
|
|
64
|
+
DANGEROUS_PATTERNS = [
|
|
65
|
+
/\bEXEC\b/i,
|
|
66
|
+
/\bEXECUTE\b/i,
|
|
67
|
+
/\bsp_/i,
|
|
68
|
+
/\bxp_/i,
|
|
69
|
+
/\bOPENROWSET\b/i,
|
|
70
|
+
/\bOPENQUERY\b/i,
|
|
71
|
+
/\bOPENDATASOURCE\b/i,
|
|
72
|
+
/\bINSERT\b/i,
|
|
73
|
+
/\bUPDATE\b/i,
|
|
74
|
+
/\bDELETE\b/i,
|
|
75
|
+
/\bDROP\b/i,
|
|
76
|
+
/\bCREATE\b/i,
|
|
77
|
+
/\bALTER\b/i,
|
|
78
|
+
/\bTRUNCATE\b/i,
|
|
79
|
+
/\bGRANT\b/i,
|
|
80
|
+
/\bREVOKE\b/i,
|
|
81
|
+
/\bDENY\b/i,
|
|
82
|
+
/\bBACKUP\b/i,
|
|
83
|
+
/\bRESTORE\b/i,
|
|
84
|
+
/\bSHUTDOWN\b/i,
|
|
85
|
+
/\bDBCC\b/i,
|
|
86
|
+
/--\+/, // SQL hints
|
|
87
|
+
/\/\*\+/ // Oracle-style hints
|
|
88
|
+
];
|
|
89
|
+
async InternalRunAction(params) {
|
|
90
|
+
const startTime = Date.now();
|
|
91
|
+
try {
|
|
92
|
+
// Extract parameters
|
|
93
|
+
const query = this.getStringParam(params, "query");
|
|
94
|
+
if (!query) {
|
|
95
|
+
return {
|
|
96
|
+
Success: false,
|
|
97
|
+
ResultCode: "MISSING_QUERY",
|
|
98
|
+
Message: "Query parameter is required"
|
|
99
|
+
};
|
|
100
|
+
}
|
|
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
|
|
108
|
+
// Validate query security
|
|
109
|
+
const securityValidation = this.validateQuerySecurity(query);
|
|
110
|
+
if (!securityValidation.isValid) {
|
|
111
|
+
return {
|
|
112
|
+
Success: false,
|
|
113
|
+
ResultCode: securityValidation.resultCode,
|
|
114
|
+
Message: securityValidation.message
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Ensure query returns limited results
|
|
118
|
+
const limitedQuery = this.ensureRowLimit(query, maxRows);
|
|
119
|
+
const dataProvider = core_1.BaseEntity.Provider;
|
|
120
|
+
try {
|
|
121
|
+
// Execute the query with timeout
|
|
122
|
+
const queryStartTime = Date.now();
|
|
123
|
+
const results = await Promise.race([
|
|
124
|
+
dataProvider.ExecuteSQL(limitedQuery, null, {
|
|
125
|
+
description: 'Execute Research Query',
|
|
126
|
+
ignoreLogging: false,
|
|
127
|
+
isMutation: false
|
|
128
|
+
}, params.ContextUser),
|
|
129
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Query timeout exceeded')), timeout * 1000))
|
|
130
|
+
]);
|
|
131
|
+
const executionTimeMs = Date.now() - queryStartTime;
|
|
132
|
+
// Get column metadata
|
|
133
|
+
const columns = results && results.columns
|
|
134
|
+
? Object.entries(results.columns).map(([name, col]) => ({
|
|
135
|
+
ColumnName: name,
|
|
136
|
+
DataType: col.type?.name || 'unknown',
|
|
137
|
+
IsNullable: col.nullable !== false
|
|
138
|
+
}))
|
|
139
|
+
: [];
|
|
140
|
+
const wasTruncated = results.length >= maxRows;
|
|
141
|
+
// Generate validation warnings
|
|
142
|
+
const warnings = this.generateValidationWarnings(query, results.length, executionTimeMs);
|
|
143
|
+
// Format data based on requested format
|
|
144
|
+
let formattedData;
|
|
145
|
+
if (dataFormat === 'csv') {
|
|
146
|
+
formattedData = this.formatAsCSV(results, columnMaxLength);
|
|
147
|
+
}
|
|
148
|
+
else if (dataFormat === 'json') {
|
|
149
|
+
const trimmedResults = columnMaxLength > 0
|
|
150
|
+
? this.trimResultColumns(results, columnMaxLength)
|
|
151
|
+
: results;
|
|
152
|
+
formattedData = JSON.stringify(trimmedResults, null, 2);
|
|
153
|
+
}
|
|
154
|
+
// Perform analysis if requested
|
|
155
|
+
let analysis;
|
|
156
|
+
if (analysisRequest && (returnType === 'analysis only' || returnType === 'data and analysis')) {
|
|
157
|
+
if (results.length === 0) {
|
|
158
|
+
// Don't call LLM for empty results - generate immediate response
|
|
159
|
+
analysis = 'Query returned no results. No data available to analyze.';
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const analysisResult = await this.analyzeQueryData(results, columns, analysisRequest, params, columnMaxLength);
|
|
163
|
+
if (analysisResult.success) {
|
|
164
|
+
analysis = analysisResult.analysis;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
(0, core_1.LogError)(`Failed to analyze query data: ${analysisResult.error}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const totalExecutionTime = Date.now() - startTime;
|
|
172
|
+
// Build detailed message based on return type
|
|
173
|
+
const message = this.buildDetailedMessage(results, columns, executionTimeMs, totalExecutionTime, wasTruncated, warnings, returnType, formattedData, analysis);
|
|
174
|
+
// Build result object based on return type
|
|
175
|
+
const resultData = {
|
|
176
|
+
Success: true,
|
|
177
|
+
ResultCode: "SUCCESS",
|
|
178
|
+
Message: message,
|
|
179
|
+
Columns: columns,
|
|
180
|
+
RowCount: results.length,
|
|
181
|
+
ExecutionTimeMs: executionTimeMs,
|
|
182
|
+
TotalTimeMs: totalExecutionTime,
|
|
183
|
+
WasTruncated: wasTruncated,
|
|
184
|
+
ValidationWarnings: warnings,
|
|
185
|
+
Query: limitedQuery
|
|
186
|
+
};
|
|
187
|
+
// Add data and/or analysis to results based on returnType
|
|
188
|
+
if (returnType === 'data only' || returnType === 'data and analysis') {
|
|
189
|
+
resultData.Results = formattedData || results;
|
|
190
|
+
}
|
|
191
|
+
if (returnType === 'analysis only' || returnType === 'data and analysis') {
|
|
192
|
+
resultData.Analysis = analysis;
|
|
193
|
+
}
|
|
194
|
+
return resultData;
|
|
195
|
+
}
|
|
196
|
+
catch (queryError) {
|
|
197
|
+
// Handle query timeout
|
|
198
|
+
if (queryError.message && queryError.message.includes('timeout')) {
|
|
199
|
+
return {
|
|
200
|
+
Success: false,
|
|
201
|
+
ResultCode: "QUERY_TIMEOUT",
|
|
202
|
+
Message: `Query execution exceeded ${timeout} second timeout. Consider optimizing query or increasing timeout parameter.`
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Handle permission errors
|
|
206
|
+
if (queryError.message &&
|
|
207
|
+
(queryError.message.toLowerCase().includes('permission') ||
|
|
208
|
+
queryError.message.toLowerCase().includes('denied'))) {
|
|
209
|
+
return {
|
|
210
|
+
Success: false,
|
|
211
|
+
ResultCode: "PERMISSION_DENIED",
|
|
212
|
+
Message: `Insufficient permissions to execute query: ${queryError.message}`
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Handle other database errors
|
|
216
|
+
return {
|
|
217
|
+
Success: false,
|
|
218
|
+
ResultCode: "DATABASE_ERROR",
|
|
219
|
+
Message: `Database error occurred: ${queryError.message || String(queryError)}`
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
225
|
+
return {
|
|
226
|
+
Success: false,
|
|
227
|
+
ResultCode: "QUERY_EXECUTION_FAILED",
|
|
228
|
+
Message: `Query execution failed: ${errorMessage}`
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Validates query for security concerns
|
|
234
|
+
*/
|
|
235
|
+
validateQuerySecurity(query) {
|
|
236
|
+
// Check for dangerous patterns
|
|
237
|
+
for (const pattern of this.DANGEROUS_PATTERNS) {
|
|
238
|
+
if (pattern.test(query)) {
|
|
239
|
+
return {
|
|
240
|
+
isValid: false,
|
|
241
|
+
message: `Query contains potentially dangerous operation: ${pattern.source}. Only SELECT queries are allowed.`,
|
|
242
|
+
resultCode: 'DANGEROUS_QUERY'
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Check if query starts with SELECT (allowing for whitespace and comments)
|
|
247
|
+
const trimmedQuery = query.trim();
|
|
248
|
+
const cleanQuery = trimmedQuery.replace(/^\/\*[\s\S]*?\*\//, '').replace(/^--.*$/gm, '').trim();
|
|
249
|
+
if (!cleanQuery.toUpperCase().startsWith('SELECT') &&
|
|
250
|
+
!cleanQuery.toUpperCase().startsWith('WITH')) { // Allow CTEs
|
|
251
|
+
return {
|
|
252
|
+
isValid: false,
|
|
253
|
+
message: 'Only SELECT queries are allowed. Query must start with SELECT or WITH (for Common Table Expressions).',
|
|
254
|
+
resultCode: 'NOT_SELECT_STATEMENT'
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return { isValid: true };
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Ensures query has a row limit to prevent overwhelming results
|
|
261
|
+
*/
|
|
262
|
+
ensureRowLimit(query, maxRows) {
|
|
263
|
+
// Check if query already has TOP clause
|
|
264
|
+
const hasTop = /SELECT\s+TOP\s+\d+/i.test(query);
|
|
265
|
+
if (hasTop) {
|
|
266
|
+
return query;
|
|
267
|
+
}
|
|
268
|
+
// Check if query has OFFSET-FETCH (SQL Server 2012+)
|
|
269
|
+
const hasOffsetFetch = /OFFSET\s+\d+\s+ROWS\s+FETCH/i.test(query);
|
|
270
|
+
if (hasOffsetFetch) {
|
|
271
|
+
return query;
|
|
272
|
+
}
|
|
273
|
+
// Add TOP clause
|
|
274
|
+
return query.replace(/^(\s*SELECT\s+)/i, `$1TOP ${maxRows} `);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Generates validation warnings for potentially problematic queries
|
|
278
|
+
*/
|
|
279
|
+
generateValidationWarnings(query, rowCount, executionTimeMs) {
|
|
280
|
+
const warnings = [];
|
|
281
|
+
// Warn about slow queries
|
|
282
|
+
if (executionTimeMs > 5000) {
|
|
283
|
+
warnings.push(`Query took ${executionTimeMs}ms to execute. Consider adding indexes or optimizing query.`);
|
|
284
|
+
}
|
|
285
|
+
// Warn about SELECT *
|
|
286
|
+
if (/SELECT\s+\*/i.test(query)) {
|
|
287
|
+
warnings.push('Query uses SELECT *. Specifying explicit columns improves performance and clarity.');
|
|
288
|
+
}
|
|
289
|
+
// Warn about missing WHERE clause on large result sets
|
|
290
|
+
if (rowCount > 100 && !/WHERE/i.test(query)) {
|
|
291
|
+
warnings.push('Query returned many rows without WHERE clause. Consider adding filters for better performance.');
|
|
292
|
+
}
|
|
293
|
+
// Warn about potential Cartesian products
|
|
294
|
+
const fromCount = (query.match(/FROM/gi) || []).length;
|
|
295
|
+
const joinCount = (query.match(/JOIN/gi) || []).length;
|
|
296
|
+
const whereCount = (query.match(/WHERE/gi) || []).length;
|
|
297
|
+
if (fromCount > 1 && joinCount === 0 && whereCount === 0) {
|
|
298
|
+
warnings.push('Query may contain Cartesian product (multiple tables without JOIN or WHERE). This can be very slow.');
|
|
299
|
+
}
|
|
300
|
+
return warnings;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Formats results as CSV string with proper escaping
|
|
304
|
+
* @param results Array of result objects
|
|
305
|
+
* @param columnMaxLength Optional maximum length for column values (0 = no limit)
|
|
306
|
+
*/
|
|
307
|
+
formatAsCSV(results, columnMaxLength = 0) {
|
|
308
|
+
if (results.length === 0)
|
|
309
|
+
return '';
|
|
310
|
+
const headers = Object.keys(results[0]);
|
|
311
|
+
const csvRows = [this.formatCSVRow(headers)];
|
|
312
|
+
for (const row of results) {
|
|
313
|
+
const values = headers.map(header => {
|
|
314
|
+
let value = row[header];
|
|
315
|
+
// Apply column length limit if specified
|
|
316
|
+
if (columnMaxLength > 0 && value != null) {
|
|
317
|
+
const stringValue = String(value);
|
|
318
|
+
if (stringValue.length > columnMaxLength) {
|
|
319
|
+
value = stringValue.substring(0, columnMaxLength) + '...';
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return this.formatCSVValue(value);
|
|
323
|
+
});
|
|
324
|
+
csvRows.push(values.join(','));
|
|
325
|
+
}
|
|
326
|
+
return csvRows.join('\n');
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Formats a single CSV row (for headers)
|
|
330
|
+
*/
|
|
331
|
+
formatCSVRow(values) {
|
|
332
|
+
return values.map(value => this.formatCSVValue(value)).join(',');
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Formats a single CSV value with proper escaping
|
|
336
|
+
* - Null/undefined values become empty strings
|
|
337
|
+
* - All string values are quoted and escaped
|
|
338
|
+
* - Numbers and booleans are converted to strings and quoted
|
|
339
|
+
*/
|
|
340
|
+
formatCSVValue(value) {
|
|
341
|
+
if (value == null) {
|
|
342
|
+
return '""';
|
|
343
|
+
}
|
|
344
|
+
// Convert to string
|
|
345
|
+
const stringValue = String(value);
|
|
346
|
+
// Always quote and escape for maximum compatibility
|
|
347
|
+
// Escape existing double quotes by doubling them
|
|
348
|
+
const escaped = stringValue.replace(/"/g, '""');
|
|
349
|
+
return `"${escaped}"`;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Trims columns in result set to maximum length
|
|
353
|
+
* Used for JSON format results to prevent verbose fields from overwhelming context
|
|
354
|
+
* @param results Array of result objects
|
|
355
|
+
* @param maxLength Maximum length for string values
|
|
356
|
+
* @returns New array with trimmed values
|
|
357
|
+
*/
|
|
358
|
+
trimResultColumns(results, maxLength) {
|
|
359
|
+
return results.map(row => {
|
|
360
|
+
const trimmedRow = {};
|
|
361
|
+
for (const [key, value] of Object.entries(row)) {
|
|
362
|
+
if (value != null && typeof value === 'string' && value.length > maxLength) {
|
|
363
|
+
trimmedRow[key] = value.substring(0, maxLength) + '...';
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
trimmedRow[key] = value;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return trimmedRow;
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Analyze query data using AI prompt
|
|
374
|
+
*/
|
|
375
|
+
async analyzeQueryData(results, columns, analysisRequest, params, columnMaxLength = 0) {
|
|
376
|
+
try {
|
|
377
|
+
// Ensure AIEngine is initialized
|
|
378
|
+
await aiengine_1.AIEngine.Instance.Config(false, params.ContextUser);
|
|
379
|
+
// Get the analysis prompt from AIEngine
|
|
380
|
+
const prompt = this.getPromptByNameAndCategory('Analyze Query Data', 'MJ: System');
|
|
381
|
+
if (!prompt) {
|
|
382
|
+
return {
|
|
383
|
+
success: false,
|
|
384
|
+
error: "Prompt 'Analyze Query Data' not found. Ensure metadata has been synced."
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// Format data as CSV for more efficient token usage
|
|
388
|
+
// Apply column max length to trim verbose fields
|
|
389
|
+
const dataCSV = this.formatAsCSV(results, columnMaxLength);
|
|
390
|
+
// Build prompt parameters with data context
|
|
391
|
+
const promptParams = new ai_core_plus_1.AIPromptParams();
|
|
392
|
+
promptParams.prompt = prompt;
|
|
393
|
+
promptParams.data = {
|
|
394
|
+
data: dataCSV,
|
|
395
|
+
columns: columns,
|
|
396
|
+
rowCount: results.length,
|
|
397
|
+
analysisRequest: analysisRequest
|
|
398
|
+
};
|
|
399
|
+
promptParams.contextUser = params.ContextUser;
|
|
400
|
+
// Execute the prompt
|
|
401
|
+
const runner = new ai_prompts_1.AIPromptRunner();
|
|
402
|
+
const result = await runner.ExecutePrompt(promptParams);
|
|
403
|
+
if (!result.success) {
|
|
404
|
+
return {
|
|
405
|
+
success: false,
|
|
406
|
+
error: result.errorMessage || "Prompt execution failed"
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
success: true,
|
|
411
|
+
analysis: result.result?.analysis || String(result.result)
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
return {
|
|
416
|
+
success: false,
|
|
417
|
+
error: error instanceof Error ? error.message : String(error)
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get prompt by name and category from AIEngine
|
|
423
|
+
*/
|
|
424
|
+
getPromptByNameAndCategory(name, category) {
|
|
425
|
+
return aiengine_1.AIEngine.Instance.Prompts.find(p => p.Name.trim().toLowerCase() === name.trim().toLowerCase() &&
|
|
426
|
+
p.Category?.trim().toLowerCase() === category?.trim().toLowerCase());
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Helper to get string parameter value
|
|
430
|
+
*/
|
|
431
|
+
getStringParam(params, paramName) {
|
|
432
|
+
const param = params.Params.find(p => p.Name.toLowerCase() === paramName.toLowerCase() &&
|
|
433
|
+
p.Type === 'Input');
|
|
434
|
+
return param?.Value ? String(param.Value) : undefined;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Helper to get numeric parameter value
|
|
438
|
+
*/
|
|
439
|
+
getNumericParam(params, paramName, defaultValue) {
|
|
440
|
+
const param = params.Params.find(p => p.Name.toLowerCase() === paramName.toLowerCase() &&
|
|
441
|
+
p.Type === 'Input');
|
|
442
|
+
if (param?.Value != null) {
|
|
443
|
+
const num = Number(param.Value);
|
|
444
|
+
return isNaN(num) ? defaultValue : num;
|
|
445
|
+
}
|
|
446
|
+
return defaultValue;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Build detailed message with query results for agent consumption
|
|
450
|
+
*/
|
|
451
|
+
buildDetailedMessage(results, columns, executionTimeMs, totalTimeMs, wasTruncated, warnings, returnType, formattedData, analysis) {
|
|
452
|
+
const lines = [];
|
|
453
|
+
// Header
|
|
454
|
+
lines.push(`# Query Results`);
|
|
455
|
+
lines.push(`\n**Rows Returned:** ${results.length.toLocaleString()}`);
|
|
456
|
+
lines.push(`**Execution Time:** ${executionTimeMs}ms`);
|
|
457
|
+
lines.push(`**Total Time:** ${totalTimeMs}ms`);
|
|
458
|
+
if (wasTruncated) {
|
|
459
|
+
lines.push(`**Note:** Results were truncated to maximum row limit`);
|
|
460
|
+
}
|
|
461
|
+
lines.push(`\n---\n`);
|
|
462
|
+
// Columns
|
|
463
|
+
if (columns.length > 0) {
|
|
464
|
+
lines.push(`## Columns (${columns.length})\n`);
|
|
465
|
+
for (const col of columns) {
|
|
466
|
+
const nullable = col.IsNullable ? 'NULL' : 'NOT NULL';
|
|
467
|
+
lines.push(`- **${col.ColumnName}** \`${col.DataType}\` [${nullable}]`);
|
|
468
|
+
}
|
|
469
|
+
lines.push('');
|
|
470
|
+
}
|
|
471
|
+
// Warnings
|
|
472
|
+
if (warnings.length > 0) {
|
|
473
|
+
lines.push(`## Warnings\n`);
|
|
474
|
+
for (const warning of warnings) {
|
|
475
|
+
lines.push(`⚠️ ${warning}`);
|
|
476
|
+
}
|
|
477
|
+
lines.push('');
|
|
478
|
+
}
|
|
479
|
+
// Analysis section (if applicable)
|
|
480
|
+
if (analysis && (returnType === 'analysis only' || returnType === 'data and analysis')) {
|
|
481
|
+
lines.push(`## Analysis\n`);
|
|
482
|
+
lines.push(analysis);
|
|
483
|
+
lines.push('');
|
|
484
|
+
}
|
|
485
|
+
// Results Data (if applicable)
|
|
486
|
+
if (returnType === 'data only' || returnType === 'data and analysis') {
|
|
487
|
+
if (results.length > 0) {
|
|
488
|
+
lines.push(`## Data (${results.length} row${results.length !== 1 ? 's' : ''})\n`);
|
|
489
|
+
if (formattedData) {
|
|
490
|
+
lines.push('```');
|
|
491
|
+
lines.push(formattedData);
|
|
492
|
+
lines.push('```');
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
lines.push('```json');
|
|
496
|
+
lines.push(JSON.stringify(results, null, 2));
|
|
497
|
+
lines.push('```');
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
lines.push(`## Data\n*No rows returned*`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
lines.push(`\n---`);
|
|
505
|
+
lines.push(`\n**The full result set is available in the Results output parameter for further processing.**`);
|
|
506
|
+
return lines.join('\n');
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
exports.ExecuteResearchQueryAction = ExecuteResearchQueryAction;
|
|
510
|
+
exports.ExecuteResearchQueryAction = ExecuteResearchQueryAction = __decorate([
|
|
511
|
+
(0, global_1.RegisterClass)(actions_1.BaseAction, "Execute Research Query")
|
|
512
|
+
], ExecuteResearchQueryAction);
|
|
513
|
+
/**
|
|
514
|
+
* Load function to ensure the class is registered and not tree-shaken
|
|
515
|
+
*/
|
|
516
|
+
function LoadExecuteResearchQueryAction() {
|
|
517
|
+
global_2.MJGlobal.Instance.ClassFactory.GetRegistration(actions_1.BaseAction, "Execute Research Query");
|
|
518
|
+
}
|
|
519
|
+
exports.LoadExecuteResearchQueryAction = LoadExecuteResearchQueryAction;
|
|
520
|
+
//# sourceMappingURL=execute-research-query.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-research-query.action.js","sourceRoot":"","sources":["../../../src/custom/data/execute-research-query.action.ts"],"names":[],"mappings":"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"}
|