@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,52 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseFileStorageAction } from "./base-file-storage.action";
|
|
3
|
+
/**
|
|
4
|
+
* Action that retrieves a list of active and available file storage providers.
|
|
5
|
+
*
|
|
6
|
+
* This action returns storage providers that are:
|
|
7
|
+
* 1. Marked as IsActive=true in the database
|
|
8
|
+
* 2. Actually available/configured in the running environment
|
|
9
|
+
*
|
|
10
|
+
* This is useful for AI agents (particularly Research Agent) to discover
|
|
11
|
+
* what storage providers are available before attempting to search or access files.
|
|
12
|
+
*
|
|
13
|
+
* Providers are configured in the File Storage Providers entity and can include:
|
|
14
|
+
* - Google Drive
|
|
15
|
+
* - SharePoint
|
|
16
|
+
* - Dropbox
|
|
17
|
+
* - Box
|
|
18
|
+
* - AWS S3
|
|
19
|
+
* - Azure Blob Storage
|
|
20
|
+
* - Google Cloud Storage
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Get all available storage providers
|
|
25
|
+
* await runAction({
|
|
26
|
+
* ActionName: 'List Storage Providers',
|
|
27
|
+
* Params: []
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Get only providers that support search
|
|
31
|
+
* await runAction({
|
|
32
|
+
* ActionName: 'List Storage Providers',
|
|
33
|
+
* Params: [{
|
|
34
|
+
* Name: 'SearchSupportedOnly',
|
|
35
|
+
* Value: true
|
|
36
|
+
* }]
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class ListStorageProvidersAction extends BaseFileStorageAction {
|
|
41
|
+
/**
|
|
42
|
+
* List of storage provider driver keys that support native file search.
|
|
43
|
+
* Used to populate the SupportsSearch field in results.
|
|
44
|
+
*/
|
|
45
|
+
private readonly SEARCH_SUPPORTED_PROVIDERS;
|
|
46
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load function to ensure the class is registered and not tree-shaken
|
|
50
|
+
*/
|
|
51
|
+
export declare function LoadListStorageProvidersAction(): void;
|
|
52
|
+
//# sourceMappingURL=list-storage-providers.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-storage-providers.action.d.ts","sourceRoot":"","sources":["../../../src/custom/files/list-storage-providers.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAMnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBACa,0BAA2B,SAAQ,qBAAqB;IAEjE;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAKzC;cAEc,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA0H1F;AAED;;GAEG;AACH,wBAAgB,8BAA8B,SAG7C"}
|
|
@@ -0,0 +1,175 @@
|
|
|
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.LoadListStorageProvidersAction = exports.ListStorageProvidersAction = void 0;
|
|
10
|
+
const global_1 = require("@memberjunction/global");
|
|
11
|
+
const global_2 = require("@memberjunction/global");
|
|
12
|
+
const core_1 = require("@memberjunction/core");
|
|
13
|
+
const storage_1 = require("@memberjunction/storage");
|
|
14
|
+
const base_file_storage_action_1 = require("./base-file-storage.action");
|
|
15
|
+
/**
|
|
16
|
+
* Action that retrieves a list of active and available file storage providers.
|
|
17
|
+
*
|
|
18
|
+
* This action returns storage providers that are:
|
|
19
|
+
* 1. Marked as IsActive=true in the database
|
|
20
|
+
* 2. Actually available/configured in the running environment
|
|
21
|
+
*
|
|
22
|
+
* This is useful for AI agents (particularly Research Agent) to discover
|
|
23
|
+
* what storage providers are available before attempting to search or access files.
|
|
24
|
+
*
|
|
25
|
+
* Providers are configured in the File Storage Providers entity and can include:
|
|
26
|
+
* - Google Drive
|
|
27
|
+
* - SharePoint
|
|
28
|
+
* - Dropbox
|
|
29
|
+
* - Box
|
|
30
|
+
* - AWS S3
|
|
31
|
+
* - Azure Blob Storage
|
|
32
|
+
* - Google Cloud Storage
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* // Get all available storage providers
|
|
37
|
+
* await runAction({
|
|
38
|
+
* ActionName: 'List Storage Providers',
|
|
39
|
+
* Params: []
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* // Get only providers that support search
|
|
43
|
+
* await runAction({
|
|
44
|
+
* ActionName: 'List Storage Providers',
|
|
45
|
+
* Params: [{
|
|
46
|
+
* Name: 'SearchSupportedOnly',
|
|
47
|
+
* Value: true
|
|
48
|
+
* }]
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
let ListStorageProvidersAction = class ListStorageProvidersAction extends base_file_storage_action_1.BaseFileStorageAction {
|
|
53
|
+
/**
|
|
54
|
+
* List of storage provider driver keys that support native file search.
|
|
55
|
+
* Used to populate the SupportsSearch field in results.
|
|
56
|
+
*/
|
|
57
|
+
SEARCH_SUPPORTED_PROVIDERS = [
|
|
58
|
+
'Google Drive Storage',
|
|
59
|
+
'SharePoint Storage',
|
|
60
|
+
'Dropbox Storage',
|
|
61
|
+
'Box Storage'
|
|
62
|
+
];
|
|
63
|
+
async InternalRunAction(params) {
|
|
64
|
+
// Optional parameter to filter only providers that support search
|
|
65
|
+
const searchSupportedOnly = this.getBooleanParam(params, "searchsupportedonly", false);
|
|
66
|
+
try {
|
|
67
|
+
// Query for active file storage providers from database
|
|
68
|
+
const rv = new core_1.RunView();
|
|
69
|
+
const result = await rv.RunView({
|
|
70
|
+
EntityName: 'File Storage Providers',
|
|
71
|
+
ExtraFilter: "IsActive=1",
|
|
72
|
+
OrderBy: 'Priority, Name',
|
|
73
|
+
ResultType: 'entity_object'
|
|
74
|
+
}, params.ContextUser);
|
|
75
|
+
if (!result.Success) {
|
|
76
|
+
return this.createErrorResult(`Failed to retrieve storage providers: ${result.ErrorMessage}`, "QUERY_FAILED");
|
|
77
|
+
}
|
|
78
|
+
const dbProviders = result.Results || [];
|
|
79
|
+
const availableProviders = [];
|
|
80
|
+
// Check which providers are actually available in the running environment
|
|
81
|
+
for (const provider of dbProviders) {
|
|
82
|
+
const supportsSearch = this.SEARCH_SUPPORTED_PROVIDERS.includes(provider.ServerDriverKey);
|
|
83
|
+
// Skip if filtering for search-only and this provider doesn't support it
|
|
84
|
+
if (searchSupportedOnly && !supportsSearch) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
// Instantiate the provider and check if it's properly configured
|
|
89
|
+
const driver = global_2.MJGlobal.Instance.ClassFactory.CreateInstance(storage_1.FileStorageBase, provider.ServerDriverKey);
|
|
90
|
+
if (driver) {
|
|
91
|
+
// Provider is registered - check if it has required configuration
|
|
92
|
+
const isConfigured = driver.IsConfigured;
|
|
93
|
+
availableProviders.push({
|
|
94
|
+
Name: provider.Name,
|
|
95
|
+
Description: provider.Description || '',
|
|
96
|
+
ServerDriverKey: provider.ServerDriverKey,
|
|
97
|
+
SupportsSearch: supportsSearch,
|
|
98
|
+
IsConfigured: isConfigured,
|
|
99
|
+
ConfigurationError: isConfigured ? undefined : 'Missing required configuration (API keys, credentials, etc.)'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Provider exists in DB but not registered in class factory
|
|
104
|
+
availableProviders.push({
|
|
105
|
+
Name: provider.Name,
|
|
106
|
+
Description: provider.Description || '',
|
|
107
|
+
ServerDriverKey: provider.ServerDriverKey,
|
|
108
|
+
SupportsSearch: supportsSearch,
|
|
109
|
+
IsConfigured: false,
|
|
110
|
+
ConfigurationError: 'Provider not registered in class factory'
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
// Provider exists in DB but failed to instantiate
|
|
116
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
117
|
+
availableProviders.push({
|
|
118
|
+
Name: provider.Name,
|
|
119
|
+
Description: provider.Description || '',
|
|
120
|
+
ServerDriverKey: provider.ServerDriverKey,
|
|
121
|
+
SupportsSearch: supportsSearch,
|
|
122
|
+
IsConfigured: false,
|
|
123
|
+
ConfigurationError: `Instantiation failed: ${errorMessage}`
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Calculate counts
|
|
128
|
+
const configuredProviders = availableProviders.filter(p => p.IsConfigured);
|
|
129
|
+
const searchSupportedCount = configuredProviders.filter(p => p.SupportsSearch).length;
|
|
130
|
+
const totalCount = availableProviders.length;
|
|
131
|
+
const configuredCount = configuredProviders.length;
|
|
132
|
+
// Create detailed result message
|
|
133
|
+
let message = `Found ${totalCount} active storage provider(s) in database`;
|
|
134
|
+
if (configuredCount < totalCount) {
|
|
135
|
+
message += `, ${configuredCount} configured and available`;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
message += `, all configured and available`;
|
|
139
|
+
}
|
|
140
|
+
if (searchSupportedOnly) {
|
|
141
|
+
message += ` with search support`;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
message += ` (${searchSupportedCount} support search)`;
|
|
145
|
+
}
|
|
146
|
+
// Return results
|
|
147
|
+
return {
|
|
148
|
+
Success: true,
|
|
149
|
+
ResultCode: "SUCCESS",
|
|
150
|
+
Message: message,
|
|
151
|
+
Providers: availableProviders,
|
|
152
|
+
TotalCount: totalCount,
|
|
153
|
+
ConfiguredCount: configuredCount,
|
|
154
|
+
SearchSupportedCount: searchSupportedCount
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
159
|
+
return this.createErrorResult(`Failed to list storage providers: ${errorMessage}`, "LIST_FAILED");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
exports.ListStorageProvidersAction = ListStorageProvidersAction;
|
|
164
|
+
exports.ListStorageProvidersAction = ListStorageProvidersAction = __decorate([
|
|
165
|
+
(0, global_1.RegisterClass)(base_file_storage_action_1.BaseFileStorageAction, "List Storage Providers")
|
|
166
|
+
], ListStorageProvidersAction);
|
|
167
|
+
/**
|
|
168
|
+
* Load function to ensure the class is registered and not tree-shaken
|
|
169
|
+
*/
|
|
170
|
+
function LoadListStorageProvidersAction() {
|
|
171
|
+
// This function call ensures the class decorator executes
|
|
172
|
+
global_2.MJGlobal.Instance.ClassFactory.GetRegistration(base_file_storage_action_1.BaseFileStorageAction, "List Storage Providers");
|
|
173
|
+
}
|
|
174
|
+
exports.LoadListStorageProvidersAction = LoadListStorageProvidersAction;
|
|
175
|
+
//# sourceMappingURL=list-storage-providers.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-storage-providers.action.js","sourceRoot":"","sources":["../../../src/custom/files/list-storage-providers.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseFileStorageAction } from "./base-file-storage.action";
|
|
3
|
+
/**
|
|
4
|
+
* Action that searches for files across configured storage providers
|
|
5
|
+
* using each provider's native search capabilities.
|
|
6
|
+
*
|
|
7
|
+
* This action leverages MJStorage's SearchFiles method which uses:
|
|
8
|
+
* - Google Drive: Drive API search with content indexing
|
|
9
|
+
* - SharePoint: Microsoft Graph Search with KQL queries
|
|
10
|
+
* - Dropbox: Search API v2 with filename and content search
|
|
11
|
+
* - Box: Box Search API with Boolean operators
|
|
12
|
+
*
|
|
13
|
+
* Providers without native search (AWS S3, Azure Blob, GCS) will return errors.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Basic file search
|
|
18
|
+
* await runAction({
|
|
19
|
+
* ActionName: 'Search Storage Files',
|
|
20
|
+
* Params: [{
|
|
21
|
+
* Name: 'Query',
|
|
22
|
+
* Value: 'quarterly report'
|
|
23
|
+
* }, {
|
|
24
|
+
* Name: 'StorageProvider',
|
|
25
|
+
* Value: 'Google Drive - Marketing'
|
|
26
|
+
* }]
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Advanced search with filters
|
|
30
|
+
* await runAction({
|
|
31
|
+
* ActionName: 'Search Storage Files',
|
|
32
|
+
* Params: [{
|
|
33
|
+
* Name: 'Query',
|
|
34
|
+
* Value: 'budget 2024'
|
|
35
|
+
* }, {
|
|
36
|
+
* Name: 'StorageProvider',
|
|
37
|
+
* Value: 'SharePoint - Finance'
|
|
38
|
+
* }, {
|
|
39
|
+
* Name: 'FileTypes',
|
|
40
|
+
* Value: 'pdf,xlsx'
|
|
41
|
+
* }, {
|
|
42
|
+
* Name: 'PathPrefix',
|
|
43
|
+
* Value: 'documents/finance'
|
|
44
|
+
* }, {
|
|
45
|
+
* Name: 'SearchContent',
|
|
46
|
+
* Value: true
|
|
47
|
+
* }, {
|
|
48
|
+
* Name: 'MaxResults',
|
|
49
|
+
* Value: 50
|
|
50
|
+
* }]
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare class SearchStorageFilesAction extends BaseFileStorageAction {
|
|
55
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Load function to ensure the class is registered and not tree-shaken
|
|
59
|
+
*/
|
|
60
|
+
export declare function LoadSearchStorageFilesAction(): void;
|
|
61
|
+
//# sourceMappingURL=search-storage-files.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-storage-files.action.d.ts","sourceRoot":"","sources":["../../../src/custom/files/search-storage-files.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBACa,wBAAyB,SAAQ,qBAAqB;cAE/C,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAkI1F;AAED;;GAEG;AACH,wBAAgB,4BAA4B,SAG3C"}
|
|
@@ -0,0 +1,183 @@
|
|
|
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.LoadSearchStorageFilesAction = exports.SearchStorageFilesAction = void 0;
|
|
10
|
+
const global_1 = require("@memberjunction/global");
|
|
11
|
+
const global_2 = require("@memberjunction/global");
|
|
12
|
+
const storage_1 = require("@memberjunction/storage");
|
|
13
|
+
const base_file_storage_action_1 = require("./base-file-storage.action");
|
|
14
|
+
/**
|
|
15
|
+
* Action that searches for files across configured storage providers
|
|
16
|
+
* using each provider's native search capabilities.
|
|
17
|
+
*
|
|
18
|
+
* This action leverages MJStorage's SearchFiles method which uses:
|
|
19
|
+
* - Google Drive: Drive API search with content indexing
|
|
20
|
+
* - SharePoint: Microsoft Graph Search with KQL queries
|
|
21
|
+
* - Dropbox: Search API v2 with filename and content search
|
|
22
|
+
* - Box: Box Search API with Boolean operators
|
|
23
|
+
*
|
|
24
|
+
* Providers without native search (AWS S3, Azure Blob, GCS) will return errors.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Basic file search
|
|
29
|
+
* await runAction({
|
|
30
|
+
* ActionName: 'Search Storage Files',
|
|
31
|
+
* Params: [{
|
|
32
|
+
* Name: 'Query',
|
|
33
|
+
* Value: 'quarterly report'
|
|
34
|
+
* }, {
|
|
35
|
+
* Name: 'StorageProvider',
|
|
36
|
+
* Value: 'Google Drive - Marketing'
|
|
37
|
+
* }]
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Advanced search with filters
|
|
41
|
+
* await runAction({
|
|
42
|
+
* ActionName: 'Search Storage Files',
|
|
43
|
+
* Params: [{
|
|
44
|
+
* Name: 'Query',
|
|
45
|
+
* Value: 'budget 2024'
|
|
46
|
+
* }, {
|
|
47
|
+
* Name: 'StorageProvider',
|
|
48
|
+
* Value: 'SharePoint - Finance'
|
|
49
|
+
* }, {
|
|
50
|
+
* Name: 'FileTypes',
|
|
51
|
+
* Value: 'pdf,xlsx'
|
|
52
|
+
* }, {
|
|
53
|
+
* Name: 'PathPrefix',
|
|
54
|
+
* Value: 'documents/finance'
|
|
55
|
+
* }, {
|
|
56
|
+
* Name: 'SearchContent',
|
|
57
|
+
* Value: true
|
|
58
|
+
* }, {
|
|
59
|
+
* Name: 'MaxResults',
|
|
60
|
+
* Value: 50
|
|
61
|
+
* }]
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
let SearchStorageFilesAction = class SearchStorageFilesAction extends base_file_storage_action_1.BaseFileStorageAction {
|
|
66
|
+
async InternalRunAction(params) {
|
|
67
|
+
// Required parameters
|
|
68
|
+
const query = this.getStringParam(params, "query");
|
|
69
|
+
if (!query) {
|
|
70
|
+
return this.createErrorResult("Query parameter is required", "MISSING_QUERY");
|
|
71
|
+
}
|
|
72
|
+
// Get storage driver (uses StorageProvider parameter via base class)
|
|
73
|
+
const { driver, error } = await this.getDriverFromParams(params);
|
|
74
|
+
if (error) {
|
|
75
|
+
return error;
|
|
76
|
+
}
|
|
77
|
+
// Optional parameters
|
|
78
|
+
const maxResults = this.getNumericParam(params, "maxresults", 100);
|
|
79
|
+
const pathPrefix = this.getStringParam(params, "pathprefix");
|
|
80
|
+
const searchContent = this.getBooleanParam(params, "searchcontent", false);
|
|
81
|
+
const modifiedAfterStr = this.getStringParam(params, "modifiedafter");
|
|
82
|
+
const modifiedBeforeStr = this.getStringParam(params, "modifiedbefore");
|
|
83
|
+
// Parse file types (comma-separated)
|
|
84
|
+
const fileTypesParam = this.getStringParam(params, "filetypes");
|
|
85
|
+
const fileTypes = fileTypesParam
|
|
86
|
+
? fileTypesParam.split(',').map(ft => ft.trim()).filter(ft => ft.length > 0)
|
|
87
|
+
: undefined;
|
|
88
|
+
// Parse dates
|
|
89
|
+
let modifiedAfter;
|
|
90
|
+
let modifiedBefore;
|
|
91
|
+
if (modifiedAfterStr) {
|
|
92
|
+
const date = new Date(modifiedAfterStr);
|
|
93
|
+
if (!isNaN(date.getTime())) {
|
|
94
|
+
modifiedAfter = date;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
return this.createErrorResult(`Invalid ModifiedAfter date format: ${modifiedAfterStr}. Use ISO 8601 format (e.g., '2024-01-01')`, "INVALID_DATE_FORMAT");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (modifiedBeforeStr) {
|
|
101
|
+
const date = new Date(modifiedBeforeStr);
|
|
102
|
+
if (!isNaN(date.getTime())) {
|
|
103
|
+
modifiedBefore = date;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return this.createErrorResult(`Invalid ModifiedBefore date format: ${modifiedBeforeStr}. Use ISO 8601 format (e.g., '2024-12-31')`, "INVALID_DATE_FORMAT");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
// Build search options
|
|
111
|
+
const searchOptions = {
|
|
112
|
+
maxResults,
|
|
113
|
+
searchContent
|
|
114
|
+
};
|
|
115
|
+
if (fileTypes) {
|
|
116
|
+
searchOptions.fileTypes = fileTypes;
|
|
117
|
+
}
|
|
118
|
+
if (pathPrefix) {
|
|
119
|
+
searchOptions.pathPrefix = pathPrefix;
|
|
120
|
+
}
|
|
121
|
+
if (modifiedAfter) {
|
|
122
|
+
searchOptions.modifiedAfter = modifiedAfter;
|
|
123
|
+
}
|
|
124
|
+
if (modifiedBefore) {
|
|
125
|
+
searchOptions.modifiedBefore = modifiedBefore;
|
|
126
|
+
}
|
|
127
|
+
// Perform the search
|
|
128
|
+
const searchResults = await driver.SearchFiles(query, searchOptions);
|
|
129
|
+
// Format results for output
|
|
130
|
+
const formattedResults = searchResults.results.map((file) => ({
|
|
131
|
+
Path: file.path,
|
|
132
|
+
Name: file.name,
|
|
133
|
+
Size: file.size,
|
|
134
|
+
ContentType: file.contentType,
|
|
135
|
+
LastModified: file.lastModified.toISOString(),
|
|
136
|
+
Relevance: file.relevance,
|
|
137
|
+
Excerpt: file.excerpt,
|
|
138
|
+
MatchInFilename: file.matchInFilename,
|
|
139
|
+
CustomMetadata: file.customMetadata,
|
|
140
|
+
ProviderData: file.providerData
|
|
141
|
+
}));
|
|
142
|
+
// Create success result with detailed information
|
|
143
|
+
const resultData = {
|
|
144
|
+
SearchResults: formattedResults,
|
|
145
|
+
ResultCount: searchResults.results.length,
|
|
146
|
+
TotalMatches: searchResults.totalMatches,
|
|
147
|
+
HasMore: searchResults.hasMore,
|
|
148
|
+
NextPageToken: searchResults.nextPageToken,
|
|
149
|
+
Query: query,
|
|
150
|
+
SearchOptions: searchOptions
|
|
151
|
+
};
|
|
152
|
+
return {
|
|
153
|
+
Success: true,
|
|
154
|
+
ResultCode: "SUCCESS",
|
|
155
|
+
Message: `Found ${searchResults.results.length} file(s) matching query '${query}'`,
|
|
156
|
+
// Store detailed results in message as JSON for now (ActionResultSimple doesn't have Results property)
|
|
157
|
+
...resultData
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
// Handle specific error types
|
|
162
|
+
if (error instanceof storage_1.UnsupportedOperationError) {
|
|
163
|
+
return this.createErrorResult(`Storage provider does not support file search. Providers with search support: Google Drive, SharePoint, Dropbox, Box. Consider using a different provider or List Objects action with filtering.`, "SEARCH_NOT_SUPPORTED");
|
|
164
|
+
}
|
|
165
|
+
// Handle other errors
|
|
166
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
167
|
+
return this.createErrorResult(`Search failed: ${errorMessage}`, "SEARCH_FAILED");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
exports.SearchStorageFilesAction = SearchStorageFilesAction;
|
|
172
|
+
exports.SearchStorageFilesAction = SearchStorageFilesAction = __decorate([
|
|
173
|
+
(0, global_1.RegisterClass)(base_file_storage_action_1.BaseFileStorageAction, "Search Storage Files")
|
|
174
|
+
], SearchStorageFilesAction);
|
|
175
|
+
/**
|
|
176
|
+
* Load function to ensure the class is registered and not tree-shaken
|
|
177
|
+
*/
|
|
178
|
+
function LoadSearchStorageFilesAction() {
|
|
179
|
+
// This function call ensures the class decorator executes
|
|
180
|
+
global_2.MJGlobal.Instance.ClassFactory.GetRegistration(base_file_storage_action_1.BaseFileStorageAction, "Search Storage Files");
|
|
181
|
+
}
|
|
182
|
+
exports.LoadSearchStorageFilesAction = LoadSearchStorageFilesAction;
|
|
183
|
+
//# sourceMappingURL=search-storage-files.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-storage-files.action.js","sourceRoot":"","sources":["../../../src/custom/files/search-storage-files.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Action that generates SVG charts from data using Vega-Lite.
|
|
5
|
+
* Supports various chart types including bar, line, pie, scatter, area, and more.
|
|
6
|
+
*
|
|
7
|
+
* This action is designed for AI agents and workflows to create publication-quality
|
|
8
|
+
* visualizations from structured data without writing visualization code.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Simple bar chart
|
|
13
|
+
* await runAction({
|
|
14
|
+
* ActionName: 'Create SVG Chart',
|
|
15
|
+
* Params: [
|
|
16
|
+
* { Name: 'ChartType', Value: 'bar' },
|
|
17
|
+
* { Name: 'Data', Value: JSON.stringify([
|
|
18
|
+
* { category: 'A', value: 28 },
|
|
19
|
+
* { category: 'B', value: 55 },
|
|
20
|
+
* { category: 'C', value: 43 }
|
|
21
|
+
* ]) },
|
|
22
|
+
* { Name: 'XField', Value: 'category' },
|
|
23
|
+
* { Name: 'YField', Value: 'value' },
|
|
24
|
+
* { Name: 'Title', Value: 'Sample Bar Chart' }
|
|
25
|
+
* ]
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Pie chart
|
|
29
|
+
* await runAction({
|
|
30
|
+
* ActionName: 'Create SVG Chart',
|
|
31
|
+
* Params: [
|
|
32
|
+
* { Name: 'ChartType', Value: 'pie' },
|
|
33
|
+
* { Name: 'Data', Value: JSON.stringify([
|
|
34
|
+
* { category: 'LLM', count: 67 },
|
|
35
|
+
* { category: 'Embeddings', count: 10 }
|
|
36
|
+
* ]) },
|
|
37
|
+
* { Name: 'ThetaField', Value: 'count' },
|
|
38
|
+
* { Name: 'ColorField', Value: 'category' },
|
|
39
|
+
* { Name: 'Width', Value: '400' },
|
|
40
|
+
* { Name: 'Height', Value: '300' }
|
|
41
|
+
* ]
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare class CreateSVGChartAction extends BaseAction {
|
|
46
|
+
/**
|
|
47
|
+
* Generates an SVG chart from the provided data and configuration
|
|
48
|
+
*
|
|
49
|
+
* @param params - The action parameters containing:
|
|
50
|
+
* - ChartType: Type of chart (bar, line, pie, scatter, area, etc.)
|
|
51
|
+
* - Data: JSON array of data objects
|
|
52
|
+
* - XField: Field name for X axis (for bar, line, scatter, area)
|
|
53
|
+
* - YField: Field name for Y axis (for bar, line, scatter, area)
|
|
54
|
+
* - ThetaField: Field name for pie slice size (for pie charts)
|
|
55
|
+
* - ColorField: Field name for color encoding (optional)
|
|
56
|
+
* - Title: Chart title (optional)
|
|
57
|
+
* - Width: Chart width in pixels (optional, default: 400)
|
|
58
|
+
* - Height: Chart height in pixels (optional, default: 300)
|
|
59
|
+
* - VegaLiteSpec: Full Vega-Lite JSON spec (optional, overrides other params)
|
|
60
|
+
*
|
|
61
|
+
* @returns A promise resolving to an ActionResultSimple with:
|
|
62
|
+
* - Success: true if chart was generated successfully
|
|
63
|
+
* - ResultCode: "SUCCESS" or error code
|
|
64
|
+
* - Message: The SVG string or error message
|
|
65
|
+
*/
|
|
66
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
67
|
+
/**
|
|
68
|
+
* Builds a Vega-Lite specification from action parameters
|
|
69
|
+
*/
|
|
70
|
+
private buildVegaLiteSpec;
|
|
71
|
+
/**
|
|
72
|
+
* Builds encoding for Cartesian charts (bar, line, scatter, area)
|
|
73
|
+
*/
|
|
74
|
+
private buildCartesianEncoding;
|
|
75
|
+
/**
|
|
76
|
+
* Builds encoding for pie/arc charts
|
|
77
|
+
*/
|
|
78
|
+
private buildPieEncoding;
|
|
79
|
+
/**
|
|
80
|
+
* Infers the Vega-Lite field type from field name
|
|
81
|
+
*/
|
|
82
|
+
private inferFieldType;
|
|
83
|
+
/**
|
|
84
|
+
* Helper to safely parse JSON that might already be an object
|
|
85
|
+
*/
|
|
86
|
+
private parseJSON;
|
|
87
|
+
/**
|
|
88
|
+
* Helper to get parameter value by name (case-insensitive)
|
|
89
|
+
*/
|
|
90
|
+
private getParamValue;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Loader function to ensure the CreateSVGChartAction class is included in the bundle.
|
|
94
|
+
* This prevents tree-shaking from removing the class during the build process.
|
|
95
|
+
*/
|
|
96
|
+
export declare function LoadCreateSVGChartAction(): void;
|
|
97
|
+
//# sourceMappingURL=create-svg-chart.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-svg-chart.action.d.ts","sourceRoot":"","sources":["../../../src/custom/visualization/create-svg-chart.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBACa,oBAAqB,SAAQ,UAAU;IAChD;;;;;;;;;;;;;;;;;;;OAmBG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmEvF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAuBjB;;OAEG;IACH,OAAO,CAAC,aAAa;CASxB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,SAEvC"}
|