@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.
Files changed (95) hide show
  1. package/dist/config.d.ts +112 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +34 -2
  4. package/dist/config.js.map +1 -1
  5. package/dist/custom/ai/find-best-agent.action.d.ts +53 -0
  6. package/dist/custom/ai/find-best-agent.action.d.ts.map +1 -0
  7. package/dist/custom/ai/find-best-agent.action.js +194 -0
  8. package/dist/custom/ai/find-best-agent.action.js.map +1 -0
  9. package/dist/custom/ai/summarize-content.action.d.ts +72 -0
  10. package/dist/custom/ai/summarize-content.action.d.ts.map +1 -0
  11. package/dist/custom/ai/summarize-content.action.js +296 -0
  12. package/dist/custom/ai/summarize-content.action.js.map +1 -0
  13. package/dist/custom/code-execution/execute-code.action.d.ts +61 -0
  14. package/dist/custom/code-execution/execute-code.action.d.ts.map +1 -0
  15. package/dist/custom/code-execution/execute-code.action.js +172 -0
  16. package/dist/custom/code-execution/execute-code.action.js.map +1 -0
  17. package/dist/custom/data/csv-parser.action.js +1 -1
  18. package/dist/custom/data/csv-parser.action.js.map +1 -1
  19. package/dist/custom/data/execute-research-query.action.d.ts +114 -0
  20. package/dist/custom/data/execute-research-query.action.d.ts.map +1 -0
  21. package/dist/custom/data/execute-research-query.action.js +520 -0
  22. package/dist/custom/data/execute-research-query.action.js.map +1 -0
  23. package/dist/custom/data/explore-database-schema.action.d.ts +95 -0
  24. package/dist/custom/data/explore-database-schema.action.d.ts.map +1 -0
  25. package/dist/custom/data/explore-database-schema.action.js +499 -0
  26. package/dist/custom/data/explore-database-schema.action.js.map +1 -0
  27. package/dist/custom/data/get-entity-details.action.d.ts +63 -0
  28. package/dist/custom/data/get-entity-details.action.d.ts.map +1 -0
  29. package/dist/custom/data/get-entity-details.action.js +284 -0
  30. package/dist/custom/data/get-entity-details.action.js.map +1 -0
  31. package/dist/custom/data/get-entity-list.action.d.ts +57 -0
  32. package/dist/custom/data/get-entity-list.action.d.ts.map +1 -0
  33. package/dist/custom/data/get-entity-list.action.js +177 -0
  34. package/dist/custom/data/get-entity-list.action.js.map +1 -0
  35. package/dist/custom/files/index.d.ts +2 -0
  36. package/dist/custom/files/index.d.ts.map +1 -1
  37. package/dist/custom/files/index.js +5 -1
  38. package/dist/custom/files/index.js.map +1 -1
  39. package/dist/custom/files/list-storage-providers.action.d.ts +52 -0
  40. package/dist/custom/files/list-storage-providers.action.d.ts.map +1 -0
  41. package/dist/custom/files/list-storage-providers.action.js +175 -0
  42. package/dist/custom/files/list-storage-providers.action.js.map +1 -0
  43. package/dist/custom/files/search-storage-files.action.d.ts +61 -0
  44. package/dist/custom/files/search-storage-files.action.d.ts.map +1 -0
  45. package/dist/custom/files/search-storage-files.action.js +183 -0
  46. package/dist/custom/files/search-storage-files.action.js.map +1 -0
  47. package/dist/custom/visualization/create-svg-chart.action.d.ts +97 -0
  48. package/dist/custom/visualization/create-svg-chart.action.d.ts.map +1 -0
  49. package/dist/custom/visualization/create-svg-chart.action.js +290 -0
  50. package/dist/custom/visualization/create-svg-chart.action.js.map +1 -0
  51. package/dist/custom/visualization/create-svg-diagram.action.d.ts +151 -0
  52. package/dist/custom/visualization/create-svg-diagram.action.d.ts.map +1 -0
  53. package/dist/custom/visualization/create-svg-diagram.action.js +764 -0
  54. package/dist/custom/visualization/create-svg-diagram.action.js.map +1 -0
  55. package/dist/custom/visualization/create-svg-infographic.action.d.ts +72 -0
  56. package/dist/custom/visualization/create-svg-infographic.action.d.ts.map +1 -0
  57. package/dist/custom/visualization/create-svg-infographic.action.js +343 -0
  58. package/dist/custom/visualization/create-svg-infographic.action.js.map +1 -0
  59. package/dist/custom/visualization/create-svg-network.action.d.ts +106 -0
  60. package/dist/custom/visualization/create-svg-network.action.d.ts.map +1 -0
  61. package/dist/custom/visualization/create-svg-network.action.js +651 -0
  62. package/dist/custom/visualization/create-svg-network.action.js.map +1 -0
  63. package/dist/custom/visualization/create-svg-word-cloud.action.d.ts +94 -0
  64. package/dist/custom/visualization/create-svg-word-cloud.action.d.ts.map +1 -0
  65. package/dist/custom/visualization/create-svg-word-cloud.action.js +422 -0
  66. package/dist/custom/visualization/create-svg-word-cloud.action.js.map +1 -0
  67. package/dist/custom/visualization/shared/svg-theming.d.ts +91 -0
  68. package/dist/custom/visualization/shared/svg-theming.d.ts.map +1 -0
  69. package/dist/custom/visualization/shared/svg-theming.js +235 -0
  70. package/dist/custom/visualization/shared/svg-theming.js.map +1 -0
  71. package/dist/custom/visualization/shared/svg-types.d.ts +338 -0
  72. package/dist/custom/visualization/shared/svg-types.d.ts.map +1 -0
  73. package/dist/custom/visualization/shared/svg-types.js +11 -0
  74. package/dist/custom/visualization/shared/svg-types.js.map +1 -0
  75. package/dist/custom/visualization/shared/svg-utils.d.ts +129 -0
  76. package/dist/custom/visualization/shared/svg-utils.d.ts.map +1 -0
  77. package/dist/custom/visualization/shared/svg-utils.js +287 -0
  78. package/dist/custom/visualization/shared/svg-utils.js.map +1 -0
  79. package/dist/custom/web/google-custom-search.action.d.ts +60 -0
  80. package/dist/custom/web/google-custom-search.action.d.ts.map +1 -0
  81. package/dist/custom/web/google-custom-search.action.js +378 -0
  82. package/dist/custom/web/google-custom-search.action.js.map +1 -0
  83. package/dist/custom/web/web-page-content.action.d.ts +24 -0
  84. package/dist/custom/web/web-page-content.action.d.ts.map +1 -1
  85. package/dist/custom/web/web-page-content.action.js +90 -9
  86. package/dist/custom/web/web-page-content.action.js.map +1 -1
  87. package/dist/generated/action_subclasses.d.ts +51 -3
  88. package/dist/generated/action_subclasses.d.ts.map +1 -1
  89. package/dist/generated/action_subclasses.js +174 -90
  90. package/dist/generated/action_subclasses.js.map +1 -1
  91. package/dist/index.d.ts +14 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +44 -0
  94. package/dist/index.js.map +1 -1
  95. 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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"}