@memberjunction/ai-agents 3.4.0 → 4.1.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/README.md +232 -2584
- package/dist/AgentDataPreloader.d.ts +117 -1
- package/dist/AgentDataPreloader.d.ts.map +1 -1
- package/dist/AgentDataPreloader.js +156 -58
- package/dist/AgentDataPreloader.js.map +1 -1
- package/dist/AgentRunner.d.ts +212 -0
- package/dist/AgentRunner.d.ts.map +1 -1
- package/dist/AgentRunner.js +354 -103
- package/dist/AgentRunner.js.map +1 -1
- package/dist/PayloadChangeAnalyzer.d.ts +68 -0
- package/dist/PayloadChangeAnalyzer.d.ts.map +1 -1
- package/dist/PayloadChangeAnalyzer.js +68 -32
- package/dist/PayloadChangeAnalyzer.js.map +1 -1
- package/dist/PayloadFeedbackManager.d.ts +57 -1
- package/dist/PayloadFeedbackManager.d.ts.map +1 -1
- package/dist/PayloadFeedbackManager.js +66 -21
- package/dist/PayloadFeedbackManager.js.map +1 -1
- package/dist/PayloadManager.d.ts +286 -1
- package/dist/PayloadManager.d.ts.map +1 -1
- package/dist/PayloadManager.js +423 -50
- package/dist/PayloadManager.js.map +1 -1
- package/dist/__tests__/action-changes.test.d.ts +13 -0
- package/dist/__tests__/action-changes.test.d.ts.map +1 -1
- package/dist/__tests__/action-changes.test.js +57 -4
- package/dist/__tests__/action-changes.test.js.map +1 -1
- package/dist/__tests__/agent-memory-features.test.d.ts +52 -0
- package/dist/__tests__/agent-memory-features.test.d.ts.map +1 -1
- package/dist/__tests__/agent-memory-features.test.js +96 -13
- package/dist/__tests__/agent-memory-features.test.js.map +1 -1
- package/dist/__tests__/agent-type-prompt-params.test.d.ts +12 -0
- package/dist/__tests__/agent-type-prompt-params.test.d.ts.map +1 -1
- package/dist/__tests__/agent-type-prompt-params.test.js +112 -20
- package/dist/__tests__/agent-type-prompt-params.test.js.map +1 -1
- package/dist/__tests__/chat-handling-option.test.d.ts +26 -0
- package/dist/__tests__/chat-handling-option.test.d.ts.map +1 -1
- package/dist/__tests__/chat-handling-option.test.js +41 -2
- package/dist/__tests__/chat-handling-option.test.js.map +1 -1
- package/dist/agent-context-injector.d.ts +114 -0
- package/dist/agent-context-injector.d.ts.map +1 -1
- package/dist/agent-context-injector.js +138 -19
- package/dist/agent-context-injector.js.map +1 -1
- package/dist/agent-types/base-agent-type.d.ts +354 -0
- package/dist/agent-types/base-agent-type.d.ts.map +1 -1
- package/dist/agent-types/base-agent-type.js +288 -17
- package/dist/agent-types/base-agent-type.js.map +1 -1
- package/dist/agent-types/flow-agent-type.d.ts +328 -2
- package/dist/agent-types/flow-agent-type.d.ts.map +1 -1
- package/dist/agent-types/flow-agent-type.js +503 -63
- package/dist/agent-types/flow-agent-type.js.map +1 -1
- package/dist/agent-types/index.d.ts +14 -3
- package/dist/agent-types/index.d.ts.map +1 -1
- package/dist/agent-types/index.js +14 -23
- package/dist/agent-types/index.js.map +1 -1
- package/dist/agent-types/loop-agent-prompt-params.d.ts +190 -0
- package/dist/agent-types/loop-agent-prompt-params.d.ts.map +1 -1
- package/dist/agent-types/loop-agent-prompt-params.js +23 -6
- package/dist/agent-types/loop-agent-prompt-params.js.map +1 -1
- package/dist/agent-types/loop-agent-response-type.d.ts +62 -0
- package/dist/agent-types/loop-agent-response-type.d.ts.map +1 -1
- package/dist/agent-types/loop-agent-response-type.js +3 -2
- package/dist/agent-types/loop-agent-response-type.js.map +1 -1
- package/dist/agent-types/loop-agent-type.d.ts +139 -2
- package/dist/agent-types/loop-agent-type.d.ts.map +1 -1
- package/dist/agent-types/loop-agent-type.js +207 -35
- package/dist/agent-types/loop-agent-type.js.map +1 -1
- package/dist/base-agent.d.ts +1344 -1
- package/dist/base-agent.d.ts.map +1 -1
- package/dist/base-agent.js +2282 -211
- package/dist/base-agent.js.map +1 -1
- package/dist/index.d.ts +24 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -35
- package/dist/index.js.map +1 -1
- package/dist/memory-cleanup-agent.d.ts +53 -1
- package/dist/memory-cleanup-agent.d.ts.map +1 -1
- package/dist/memory-cleanup-agent.js +89 -21
- package/dist/memory-cleanup-agent.js.map +1 -1
- package/dist/memory-manager-agent.d.ts +61 -1
- package/dist/memory-manager-agent.d.ts.map +1 -1
- package/dist/memory-manager-agent.js +260 -116
- package/dist/memory-manager-agent.js.map +1 -1
- package/dist/types/payload-operations.d.ts +51 -0
- package/dist/types/payload-operations.d.ts.map +1 -1
- package/dist/types/payload-operations.js +54 -15
- package/dist/types/payload-operations.js.map +1 -1
- package/dist/utils/ConversationMessageResolver.d.ts +79 -1
- package/dist/utils/ConversationMessageResolver.d.ts.map +1 -1
- package/dist/utils/ConversationMessageResolver.js +99 -9
- package/dist/utils/ConversationMessageResolver.js.map +1 -1
- package/package.json +20 -19
|
@@ -1,25 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview AgentDataPreloader handles preloading of data sources for AI agents.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a singleton service that loads data from RunView or RunQuery
|
|
5
|
+
* sources as configured in AIAgentDataSource metadata. The preloaded data is injected
|
|
6
|
+
* into the agent's data parameter for use in Nunjucks templates without requiring
|
|
7
|
+
* custom application code or action calls.
|
|
8
|
+
*
|
|
9
|
+
* @module @memberjunction/ai-agents
|
|
10
|
+
* @author MemberJunction.com
|
|
11
|
+
* @since 2.109.0
|
|
12
|
+
*/
|
|
1
13
|
import { UserInfo } from '@memberjunction/core';
|
|
14
|
+
/**
|
|
15
|
+
* Result structure for preloaded data organized by destination
|
|
16
|
+
*/
|
|
2
17
|
export interface PreloadedDataResult {
|
|
3
18
|
data: Record<string, unknown>;
|
|
4
19
|
context: Record<string, unknown>;
|
|
5
20
|
payload: Record<string, unknown>;
|
|
6
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Singleton service for preloading agent data sources.
|
|
24
|
+
*
|
|
25
|
+
* This class handles loading data from RunView or RunQuery sources as configured
|
|
26
|
+
* in AIAgentDataSource metadata. Supports three cache policies:
|
|
27
|
+
* - None: No caching, data is loaded fresh every time
|
|
28
|
+
* - PerRun: Data is cached for the duration of a single agent run
|
|
29
|
+
* - PerAgent: Data is cached globally with a TTL, shared across all runs
|
|
30
|
+
*
|
|
31
|
+
* @class AgentDataPreloader
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const preloader = AgentDataPreloader.Instance;
|
|
35
|
+
* const data = await preloader.PreloadAgentData(agentId, contextUser);
|
|
36
|
+
* // data = { ALL_ENTITIES: [...], MODEL_LIST: [...] }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
7
39
|
export declare class AgentDataPreloader {
|
|
8
40
|
private static _instance;
|
|
41
|
+
/**
|
|
42
|
+
* Per-agent cache (global, TTL-based)
|
|
43
|
+
*/
|
|
9
44
|
private _perAgentCache;
|
|
45
|
+
/**
|
|
46
|
+
* Per-run cache (scoped to a single run ID)
|
|
47
|
+
*/
|
|
10
48
|
private _perRunCache;
|
|
49
|
+
/**
|
|
50
|
+
* Private constructor for singleton pattern
|
|
51
|
+
*/
|
|
11
52
|
private constructor();
|
|
53
|
+
/**
|
|
54
|
+
* Gets the singleton instance of AgentDataPreloader
|
|
55
|
+
*/
|
|
12
56
|
static get Instance(): AgentDataPreloader;
|
|
57
|
+
/**
|
|
58
|
+
* Preloads all active data sources for an agent.
|
|
59
|
+
*
|
|
60
|
+
* This method loads all active AIAgentDataSource records for the specified agent,
|
|
61
|
+
* executes them in order, and returns preloaded data organized by destination type.
|
|
62
|
+
*
|
|
63
|
+
* @param {string} agentId - The ID of the agent to preload data for
|
|
64
|
+
* @param {UserInfo} contextUser - The user context for data access permissions
|
|
65
|
+
* @param {string} [runId] - Optional run ID for PerRun cache scoping
|
|
66
|
+
*
|
|
67
|
+
* @returns {Promise<PreloadedDataResult>} Object with preloaded data separated by destination
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const result = await AgentDataPreloader.Instance.PreloadAgentData(
|
|
72
|
+
* 'agent-id-123',
|
|
73
|
+
* contextUser,
|
|
74
|
+
* 'run-id-456'
|
|
75
|
+
* );
|
|
76
|
+
* // Returns: {
|
|
77
|
+
* // data: { ALL_ENTITIES: [...] },
|
|
78
|
+
* // context: { API_CONFIG: {...} },
|
|
79
|
+
* // payload: { customer: {...} }
|
|
80
|
+
* // }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
13
83
|
PreloadAgentData(agentId: string, contextUser: UserInfo, runId?: string): Promise<PreloadedDataResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Clears per-run cache for a specific run ID.
|
|
86
|
+
* Should be called when an agent run completes.
|
|
87
|
+
*
|
|
88
|
+
* @param {string} runId - The run ID to clear cache for
|
|
89
|
+
*/
|
|
14
90
|
clearRunCache(runId: string): void;
|
|
91
|
+
/**
|
|
92
|
+
* Clears all per-agent cached data.
|
|
93
|
+
* Can be called to force refresh of global cached data.
|
|
94
|
+
*/
|
|
15
95
|
clearAgentCache(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Loads AIAgentDataSource entities for a specific agent.
|
|
98
|
+
*
|
|
99
|
+
* @private
|
|
100
|
+
*/
|
|
16
101
|
private loadDataSourcesForAgent;
|
|
102
|
+
/**
|
|
103
|
+
* Executes a single data source and returns the data.
|
|
104
|
+
* Handles caching based on the source's CachePolicy.
|
|
105
|
+
*
|
|
106
|
+
* @private
|
|
107
|
+
*/
|
|
17
108
|
private executeDataSource;
|
|
109
|
+
/**
|
|
110
|
+
* Executes a RunView data source.
|
|
111
|
+
*
|
|
112
|
+
* @private
|
|
113
|
+
*/
|
|
18
114
|
private executeRunView;
|
|
115
|
+
/**
|
|
116
|
+
* Executes a RunQuery data source.
|
|
117
|
+
*
|
|
118
|
+
* @private
|
|
119
|
+
*/
|
|
19
120
|
private executeRunQuery;
|
|
121
|
+
/**
|
|
122
|
+
* Gets cached data if available and not expired.
|
|
123
|
+
*
|
|
124
|
+
* @private
|
|
125
|
+
* @returns Cached data or null if not cached/expired
|
|
126
|
+
*/
|
|
20
127
|
private getCachedData;
|
|
128
|
+
/**
|
|
129
|
+
* Caches data based on the source's cache policy.
|
|
130
|
+
*
|
|
131
|
+
* @private
|
|
132
|
+
*/
|
|
21
133
|
private cacheData;
|
|
134
|
+
/**
|
|
135
|
+
* Generates a cache key for per-agent caching.
|
|
136
|
+
*
|
|
137
|
+
* @private
|
|
138
|
+
*/
|
|
22
139
|
private getPerAgentCacheKey;
|
|
23
140
|
}
|
|
24
|
-
export declare function LoadAgentDataPreloader(): AgentDataPreloader;
|
|
25
141
|
//# sourceMappingURL=AgentDataPreloader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDataPreloader.d.ts","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentDataPreloader.d.ts","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAqE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKnH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAWD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAmC;IAE3D;;OAEG;IACH,OAAO,CAAC,cAAc,CAAsC;IAE5D;;OAEG;IACH,OAAO,CAAC,YAAY,CAAgD;IAEpE;;OAEG;IACH,OAAO;IAIP;;OAEG;IACH,WAAkB,QAAQ,IAAI,kBAAkB,CAK/C;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACU,gBAAgB,CACzB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC;IAwE/B;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASzC;;;OAGG;IACI,eAAe,IAAI,IAAI;IAS9B;;;;OAIG;YACW,uBAAuB;IAiBrC;;;;;OAKG;YACW,iBAAiB;IAiC/B;;;;OAIG;YACW,cAAc;IAmC5B;;;;OAIG;YACW,eAAe;IAiC7B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAmCjB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAG9B"}
|
|
@@ -1,56 +1,100 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview AgentDataPreloader handles preloading of data sources for AI agents.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a singleton service that loads data from RunView or RunQuery
|
|
5
|
+
* sources as configured in AIAgentDataSource metadata. The preloaded data is injected
|
|
6
|
+
* into the agent's data parameter for use in Nunjucks templates without requiring
|
|
7
|
+
* custom application code or action calls.
|
|
8
|
+
*
|
|
9
|
+
* @module @memberjunction/ai-agents
|
|
10
|
+
* @author MemberJunction.com
|
|
11
|
+
* @since 2.109.0
|
|
12
|
+
*/
|
|
13
|
+
import { AIEngine } from '@memberjunction/aiengine';
|
|
14
|
+
import { LogError, LogStatusEx, IsVerboseLoggingEnabled, RunView, RunQuery } from '@memberjunction/core';
|
|
15
|
+
import _ from 'lodash';
|
|
16
|
+
/**
|
|
17
|
+
* Singleton service for preloading agent data sources.
|
|
18
|
+
*
|
|
19
|
+
* This class handles loading data from RunView or RunQuery sources as configured
|
|
20
|
+
* in AIAgentDataSource metadata. Supports three cache policies:
|
|
21
|
+
* - None: No caching, data is loaded fresh every time
|
|
22
|
+
* - PerRun: Data is cached for the duration of a single agent run
|
|
23
|
+
* - PerAgent: Data is cached globally with a TTL, shared across all runs
|
|
24
|
+
*
|
|
25
|
+
* @class AgentDataPreloader
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const preloader = AgentDataPreloader.Instance;
|
|
29
|
+
* const data = await preloader.PreloadAgentData(agentId, contextUser);
|
|
30
|
+
* // data = { ALL_ENTITIES: [...], MODEL_LIST: [...] }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class AgentDataPreloader {
|
|
34
|
+
static { this._instance = null; }
|
|
35
|
+
/**
|
|
36
|
+
* Private constructor for singleton pattern
|
|
37
|
+
*/
|
|
31
38
|
constructor() {
|
|
39
|
+
/**
|
|
40
|
+
* Per-agent cache (global, TTL-based)
|
|
41
|
+
*/
|
|
32
42
|
this._perAgentCache = new Map();
|
|
43
|
+
/**
|
|
44
|
+
* Per-run cache (scoped to a single run ID)
|
|
45
|
+
*/
|
|
33
46
|
this._perRunCache = new Map();
|
|
47
|
+
// Private to enforce singleton
|
|
34
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Gets the singleton instance of AgentDataPreloader
|
|
51
|
+
*/
|
|
35
52
|
static get Instance() {
|
|
36
53
|
if (!AgentDataPreloader._instance) {
|
|
37
54
|
AgentDataPreloader._instance = new AgentDataPreloader();
|
|
38
55
|
}
|
|
39
56
|
return AgentDataPreloader._instance;
|
|
40
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Preloads all active data sources for an agent.
|
|
60
|
+
*
|
|
61
|
+
* This method loads all active AIAgentDataSource records for the specified agent,
|
|
62
|
+
* executes them in order, and returns preloaded data organized by destination type.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} agentId - The ID of the agent to preload data for
|
|
65
|
+
* @param {UserInfo} contextUser - The user context for data access permissions
|
|
66
|
+
* @param {string} [runId] - Optional run ID for PerRun cache scoping
|
|
67
|
+
*
|
|
68
|
+
* @returns {Promise<PreloadedDataResult>} Object with preloaded data separated by destination
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const result = await AgentDataPreloader.Instance.PreloadAgentData(
|
|
73
|
+
* 'agent-id-123',
|
|
74
|
+
* contextUser,
|
|
75
|
+
* 'run-id-456'
|
|
76
|
+
* );
|
|
77
|
+
* // Returns: {
|
|
78
|
+
* // data: { ALL_ENTITIES: [...] },
|
|
79
|
+
* // context: { API_CONFIG: {...} },
|
|
80
|
+
* // payload: { customer: {...} }
|
|
81
|
+
* // }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
41
84
|
async PreloadAgentData(agentId, contextUser, runId) {
|
|
42
85
|
try {
|
|
43
|
-
|
|
86
|
+
LogStatusEx({
|
|
44
87
|
message: `AgentDataPreloader: Loading data sources for agent ${agentId}`,
|
|
45
88
|
verboseOnly: true,
|
|
46
|
-
isVerboseEnabled:
|
|
89
|
+
isVerboseEnabled: IsVerboseLoggingEnabled
|
|
47
90
|
});
|
|
91
|
+
// Load data source definitions
|
|
48
92
|
const dataSources = await this.loadDataSourcesForAgent(agentId, contextUser);
|
|
49
93
|
if (dataSources.length === 0) {
|
|
50
|
-
|
|
94
|
+
LogStatusEx({
|
|
51
95
|
message: `AgentDataPreloader: No data sources found for agent ${agentId}`,
|
|
52
96
|
verboseOnly: true,
|
|
53
|
-
isVerboseEnabled:
|
|
97
|
+
isVerboseEnabled: IsVerboseLoggingEnabled
|
|
54
98
|
});
|
|
55
99
|
return { data: {}, context: {}, payload: {} };
|
|
56
100
|
}
|
|
@@ -59,10 +103,13 @@ class AgentDataPreloader {
|
|
|
59
103
|
context: {},
|
|
60
104
|
payload: {}
|
|
61
105
|
};
|
|
106
|
+
// Execute data sources in order
|
|
62
107
|
for (const source of dataSources) {
|
|
63
108
|
try {
|
|
64
109
|
const sourceData = await this.executeDataSource(source, contextUser, runId);
|
|
110
|
+
// Determine the path (use DestinationPath if provided, otherwise Name)
|
|
65
111
|
const path = source.DestinationPath || source.Name;
|
|
112
|
+
// Set data in the appropriate destination
|
|
66
113
|
switch (source.DestinationType) {
|
|
67
114
|
case 'Data':
|
|
68
115
|
_.set(result.data, path, sourceData);
|
|
@@ -74,47 +121,65 @@ class AgentDataPreloader {
|
|
|
74
121
|
_.set(result.payload, path, sourceData);
|
|
75
122
|
break;
|
|
76
123
|
default:
|
|
77
|
-
|
|
124
|
+
LogError(`Unknown destination type '${source.DestinationType}' for data source '${source.Name}'`);
|
|
78
125
|
continue;
|
|
79
126
|
}
|
|
80
|
-
|
|
127
|
+
LogStatusEx({
|
|
81
128
|
message: `AgentDataPreloader: Loaded '${source.Name}' → ${source.DestinationType}${path !== source.Name ? `.${path}` : ''} for agent ${agentId}`,
|
|
82
129
|
verboseOnly: true,
|
|
83
|
-
isVerboseEnabled:
|
|
130
|
+
isVerboseEnabled: IsVerboseLoggingEnabled
|
|
84
131
|
});
|
|
85
132
|
}
|
|
86
133
|
catch (error) {
|
|
87
134
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
88
|
-
|
|
135
|
+
LogError(`Failed to preload data source '${source.Name}' for agent ${agentId}: ${errorMessage}`, undefined, error);
|
|
136
|
+
// Continue loading other sources even if one fails
|
|
89
137
|
}
|
|
90
138
|
}
|
|
91
139
|
return result;
|
|
92
140
|
}
|
|
93
141
|
catch (error) {
|
|
94
142
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
95
|
-
|
|
143
|
+
LogError(`Failed to preload agent data for ${agentId}: ${errorMessage}`, undefined, error);
|
|
144
|
+
// Return empty objects instead of throwing - agent can still run without preloaded data
|
|
96
145
|
return { data: {}, context: {}, payload: {} };
|
|
97
146
|
}
|
|
98
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Clears per-run cache for a specific run ID.
|
|
150
|
+
* Should be called when an agent run completes.
|
|
151
|
+
*
|
|
152
|
+
* @param {string} runId - The run ID to clear cache for
|
|
153
|
+
*/
|
|
99
154
|
clearRunCache(runId) {
|
|
100
155
|
this._perRunCache.delete(runId);
|
|
101
|
-
|
|
156
|
+
LogStatusEx({
|
|
102
157
|
message: `AgentDataPreloader: Cleared per-run cache for run ${runId}`,
|
|
103
158
|
verboseOnly: true,
|
|
104
|
-
isVerboseEnabled:
|
|
159
|
+
isVerboseEnabled: IsVerboseLoggingEnabled
|
|
105
160
|
});
|
|
106
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* Clears all per-agent cached data.
|
|
164
|
+
* Can be called to force refresh of global cached data.
|
|
165
|
+
*/
|
|
107
166
|
clearAgentCache() {
|
|
108
167
|
this._perAgentCache.clear();
|
|
109
|
-
|
|
168
|
+
LogStatusEx({
|
|
110
169
|
message: `AgentDataPreloader: Cleared all per-agent cache`,
|
|
111
170
|
verboseOnly: true,
|
|
112
|
-
isVerboseEnabled:
|
|
171
|
+
isVerboseEnabled: IsVerboseLoggingEnabled
|
|
113
172
|
});
|
|
114
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Loads AIAgentDataSource entities for a specific agent.
|
|
176
|
+
*
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
115
179
|
async loadDataSourcesForAgent(agentId, contextUser) {
|
|
116
|
-
|
|
117
|
-
|
|
180
|
+
// Ensure AIEngine is configured
|
|
181
|
+
await AIEngine.Instance.Config(false, contextUser);
|
|
182
|
+
const data = AIEngine.Instance.AgentDataSources.filter(ads => ads.AgentID === agentId);
|
|
118
183
|
const sortedData = data.sort((a, b) => {
|
|
119
184
|
if (a.ExecutionOrder === b.ExecutionOrder) {
|
|
120
185
|
return a.Name.localeCompare(b.Name);
|
|
@@ -123,16 +188,24 @@ class AgentDataPreloader {
|
|
|
123
188
|
});
|
|
124
189
|
return sortedData;
|
|
125
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Executes a single data source and returns the data.
|
|
193
|
+
* Handles caching based on the source's CachePolicy.
|
|
194
|
+
*
|
|
195
|
+
* @private
|
|
196
|
+
*/
|
|
126
197
|
async executeDataSource(source, contextUser, runId) {
|
|
198
|
+
// Check cache first
|
|
127
199
|
const cachedData = this.getCachedData(source, runId);
|
|
128
200
|
if (cachedData !== null) {
|
|
129
|
-
|
|
201
|
+
LogStatusEx({
|
|
130
202
|
message: `AgentDataPreloader: Using cached data for '${source.Name}'`,
|
|
131
203
|
verboseOnly: true,
|
|
132
|
-
isVerboseEnabled:
|
|
204
|
+
isVerboseEnabled: IsVerboseLoggingEnabled
|
|
133
205
|
});
|
|
134
206
|
return cachedData;
|
|
135
207
|
}
|
|
208
|
+
// Load data based on source type
|
|
136
209
|
let data;
|
|
137
210
|
if (source.SourceType === 'RunView') {
|
|
138
211
|
data = await this.executeRunView(source, contextUser);
|
|
@@ -143,9 +216,15 @@ class AgentDataPreloader {
|
|
|
143
216
|
else {
|
|
144
217
|
throw new Error(`Unknown source type: ${source.SourceType}`);
|
|
145
218
|
}
|
|
219
|
+
// Cache the data if policy dictates
|
|
146
220
|
this.cacheData(source, data, runId);
|
|
147
221
|
return data;
|
|
148
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Executes a RunView data source.
|
|
225
|
+
*
|
|
226
|
+
* @private
|
|
227
|
+
*/
|
|
149
228
|
async executeRunView(source, contextUser) {
|
|
150
229
|
if (!source.EntityName) {
|
|
151
230
|
throw new Error(`RunView data source '${source.Name}' missing EntityName`);
|
|
@@ -157,21 +236,27 @@ class AgentDataPreloader {
|
|
|
157
236
|
MaxRows: source.MaxRows || undefined,
|
|
158
237
|
ResultType: source.ResultType || 'simple'
|
|
159
238
|
};
|
|
239
|
+
// Parse FieldsToRetrieve if provided
|
|
160
240
|
if (source.FieldsToRetrieve) {
|
|
161
241
|
try {
|
|
162
242
|
params.Fields = JSON.parse(source.FieldsToRetrieve);
|
|
163
243
|
}
|
|
164
244
|
catch (error) {
|
|
165
|
-
|
|
245
|
+
LogError(`Failed to parse FieldsToRetrieve JSON for data source '${source.Name}': ${error.message}`);
|
|
166
246
|
}
|
|
167
247
|
}
|
|
168
|
-
const rv = new
|
|
248
|
+
const rv = new RunView();
|
|
169
249
|
const result = await rv.RunView(params, contextUser);
|
|
170
250
|
if (!result.Success) {
|
|
171
251
|
throw new Error(`RunView failed: ${result.ErrorMessage}`);
|
|
172
252
|
}
|
|
173
253
|
return result.Results || [];
|
|
174
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Executes a RunQuery data source.
|
|
257
|
+
*
|
|
258
|
+
* @private
|
|
259
|
+
*/
|
|
175
260
|
async executeRunQuery(source, contextUser) {
|
|
176
261
|
if (!source.QueryName) {
|
|
177
262
|
throw new Error(`RunQuery data source '${source.Name}' missing QueryName`);
|
|
@@ -181,21 +266,28 @@ class AgentDataPreloader {
|
|
|
181
266
|
CategoryPath: source.CategoryPath || undefined,
|
|
182
267
|
MaxRows: source.MaxRows || undefined
|
|
183
268
|
};
|
|
269
|
+
// Parse Parameters if provided
|
|
184
270
|
if (source.Parameters) {
|
|
185
271
|
try {
|
|
186
272
|
params.Parameters = JSON.parse(source.Parameters);
|
|
187
273
|
}
|
|
188
274
|
catch (error) {
|
|
189
|
-
|
|
275
|
+
LogError(`Failed to parse Parameters JSON for data source '${source.Name}': ${error.message}`);
|
|
190
276
|
}
|
|
191
277
|
}
|
|
192
|
-
const rq = new
|
|
278
|
+
const rq = new RunQuery();
|
|
193
279
|
const result = await rq.RunQuery(params, contextUser);
|
|
194
280
|
if (!result.Success) {
|
|
195
281
|
throw new Error(`RunQuery failed: ${result.ErrorMessage}`);
|
|
196
282
|
}
|
|
197
283
|
return result.Results || [];
|
|
198
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Gets cached data if available and not expired.
|
|
287
|
+
*
|
|
288
|
+
* @private
|
|
289
|
+
* @returns Cached data or null if not cached/expired
|
|
290
|
+
*/
|
|
199
291
|
getCachedData(source, runId) {
|
|
200
292
|
if (source.CachePolicy === 'None') {
|
|
201
293
|
return null;
|
|
@@ -211,12 +303,14 @@ class AgentDataPreloader {
|
|
|
211
303
|
const cacheKey = this.getPerAgentCacheKey(source);
|
|
212
304
|
const entry = this._perAgentCache.get(cacheKey);
|
|
213
305
|
if (entry) {
|
|
306
|
+
// Check if expired
|
|
214
307
|
const now = new Date();
|
|
215
308
|
const ageSeconds = (now.getTime() - entry.timestamp.getTime()) / 1000;
|
|
216
309
|
if (ageSeconds < entry.timeoutSeconds) {
|
|
217
310
|
return entry.data;
|
|
218
311
|
}
|
|
219
312
|
else {
|
|
313
|
+
// Expired, remove from cache
|
|
220
314
|
this._perAgentCache.delete(cacheKey);
|
|
221
315
|
}
|
|
222
316
|
}
|
|
@@ -224,6 +318,11 @@ class AgentDataPreloader {
|
|
|
224
318
|
}
|
|
225
319
|
return null;
|
|
226
320
|
}
|
|
321
|
+
/**
|
|
322
|
+
* Caches data based on the source's cache policy.
|
|
323
|
+
*
|
|
324
|
+
* @private
|
|
325
|
+
*/
|
|
227
326
|
cacheData(source, data, runId) {
|
|
228
327
|
if (source.CachePolicy === 'None') {
|
|
229
328
|
return;
|
|
@@ -239,7 +338,7 @@ class AgentDataPreloader {
|
|
|
239
338
|
}
|
|
240
339
|
if (source.CachePolicy === 'PerAgent') {
|
|
241
340
|
if (!source.CacheTimeoutSeconds || source.CacheTimeoutSeconds <= 0) {
|
|
242
|
-
|
|
341
|
+
LogError(`PerAgent cache policy requires CacheTimeoutSeconds > 0 for data source '${source.Name}'`);
|
|
243
342
|
return;
|
|
244
343
|
}
|
|
245
344
|
const cacheKey = this.getPerAgentCacheKey(source);
|
|
@@ -251,14 +350,13 @@ class AgentDataPreloader {
|
|
|
251
350
|
this._perAgentCache.set(cacheKey, entry);
|
|
252
351
|
}
|
|
253
352
|
}
|
|
353
|
+
/**
|
|
354
|
+
* Generates a cache key for per-agent caching.
|
|
355
|
+
*
|
|
356
|
+
* @private
|
|
357
|
+
*/
|
|
254
358
|
getPerAgentCacheKey(source) {
|
|
255
359
|
return `${source.AgentID}:${source.Name}`;
|
|
256
360
|
}
|
|
257
361
|
}
|
|
258
|
-
exports.AgentDataPreloader = AgentDataPreloader;
|
|
259
|
-
AgentDataPreloader._instance = null;
|
|
260
|
-
function LoadAgentDataPreloader() {
|
|
261
|
-
return AgentDataPreloader.Instance;
|
|
262
|
-
}
|
|
263
|
-
exports.LoadAgentDataPreloader = LoadAgentDataPreloader;
|
|
264
362
|
//# sourceMappingURL=AgentDataPreloader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDataPreloader.js","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentDataPreloader.js","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"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"}
|