@robosystems/client 0.2.48 → 0.3.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/extensions/InvestorClient.d.ts +91 -0
- package/extensions/InvestorClient.js +223 -0
- package/extensions/InvestorClient.ts +501 -0
- package/extensions/LedgerClient.d.ts +213 -165
- package/extensions/LedgerClient.js +315 -393
- package/extensions/LedgerClient.ts +887 -564
- package/extensions/ReportClient.d.ts +77 -115
- package/extensions/ReportClient.js +124 -211
- package/extensions/ReportClient.ts +298 -358
- package/extensions/config.js +1 -1
- package/extensions/config.ts +1 -1
- package/extensions/graphql/client.d.ts +46 -0
- package/extensions/graphql/client.js +75 -0
- package/extensions/graphql/client.ts +82 -0
- package/extensions/graphql/generated/graphql.d.ts +1786 -0
- package/extensions/graphql/generated/graphql.js +2671 -0
- package/extensions/graphql/generated/graphql.ts +4491 -0
- package/extensions/graphql/queries/investor/holdings.d.ts +8 -0
- package/extensions/graphql/queries/investor/holdings.js +36 -0
- package/extensions/graphql/queries/investor/holdings.ts +34 -0
- package/extensions/graphql/queries/investor/portfolio.d.ts +4 -0
- package/extensions/graphql/queries/investor/portfolio.js +21 -0
- package/extensions/graphql/queries/investor/portfolio.ts +19 -0
- package/extensions/graphql/queries/investor/portfolios.d.ts +4 -0
- package/extensions/graphql/queries/investor/portfolios.js +29 -0
- package/extensions/graphql/queries/investor/portfolios.ts +27 -0
- package/extensions/graphql/queries/investor/position.d.ts +4 -0
- package/extensions/graphql/queries/investor/position.js +33 -0
- package/extensions/graphql/queries/investor/position.ts +31 -0
- package/extensions/graphql/queries/investor/positions.d.ts +8 -0
- package/extensions/graphql/queries/investor/positions.js +57 -0
- package/extensions/graphql/queries/investor/positions.ts +55 -0
- package/extensions/graphql/queries/investor/securities.d.ts +8 -0
- package/extensions/graphql/queries/investor/securities.js +50 -0
- package/extensions/graphql/queries/investor/securities.ts +48 -0
- package/extensions/graphql/queries/investor/security.d.ts +4 -0
- package/extensions/graphql/queries/investor/security.js +26 -0
- package/extensions/graphql/queries/investor/security.ts +24 -0
- package/extensions/graphql/queries/ledger/accountRollups.d.ts +7 -0
- package/extensions/graphql/queries/ledger/accountRollups.js +36 -0
- package/extensions/graphql/queries/ledger/accountRollups.ts +34 -0
- package/extensions/graphql/queries/ledger/accountTree.d.ts +11 -0
- package/extensions/graphql/queries/ledger/accountTree.js +61 -0
- package/extensions/graphql/queries/ledger/accountTree.ts +59 -0
- package/extensions/graphql/queries/ledger/accounts.d.ts +8 -0
- package/extensions/graphql/queries/ledger/accounts.js +45 -0
- package/extensions/graphql/queries/ledger/accounts.ts +43 -0
- package/extensions/graphql/queries/ledger/closingBookStructures.d.ts +6 -0
- package/extensions/graphql/queries/ledger/closingBookStructures.js +27 -0
- package/extensions/graphql/queries/ledger/closingBookStructures.ts +25 -0
- package/extensions/graphql/queries/ledger/elements.d.ts +6 -0
- package/extensions/graphql/queries/ledger/elements.js +56 -0
- package/extensions/graphql/queries/ledger/elements.ts +54 -0
- package/extensions/graphql/queries/ledger/entities.d.ts +7 -0
- package/extensions/graphql/queries/ledger/entities.js +31 -0
- package/extensions/graphql/queries/ledger/entities.ts +29 -0
- package/extensions/graphql/queries/ledger/entity.d.ts +14 -0
- package/extensions/graphql/queries/ledger/entity.js +55 -0
- package/extensions/graphql/queries/ledger/entity.ts +54 -0
- package/extensions/graphql/queries/ledger/fiscalCalendar.d.ts +8 -0
- package/extensions/graphql/queries/ledger/fiscalCalendar.js +35 -0
- package/extensions/graphql/queries/ledger/fiscalCalendar.ts +33 -0
- package/extensions/graphql/queries/ledger/mappedTrialBalance.d.ts +9 -0
- package/extensions/graphql/queries/ledger/mappedTrialBalance.js +29 -0
- package/extensions/graphql/queries/ledger/mappedTrialBalance.ts +27 -0
- package/extensions/graphql/queries/ledger/mapping.d.ts +5 -0
- package/extensions/graphql/queries/ledger/mapping.js +35 -0
- package/extensions/graphql/queries/ledger/mapping.ts +33 -0
- package/extensions/graphql/queries/ledger/mappingCoverage.d.ts +5 -0
- package/extensions/graphql/queries/ledger/mappingCoverage.js +22 -0
- package/extensions/graphql/queries/ledger/mappingCoverage.ts +20 -0
- package/extensions/graphql/queries/ledger/mappings.d.ts +6 -0
- package/extensions/graphql/queries/ledger/mappings.js +23 -0
- package/extensions/graphql/queries/ledger/mappings.ts +21 -0
- package/extensions/graphql/queries/ledger/periodCloseStatus.d.ts +6 -0
- package/extensions/graphql/queries/ledger/periodCloseStatus.js +29 -0
- package/extensions/graphql/queries/ledger/periodCloseStatus.ts +27 -0
- package/extensions/graphql/queries/ledger/periodDrafts.d.ts +8 -0
- package/extensions/graphql/queries/ledger/periodDrafts.js +45 -0
- package/extensions/graphql/queries/ledger/periodDrafts.ts +43 -0
- package/extensions/graphql/queries/ledger/publishList.d.ts +5 -0
- package/extensions/graphql/queries/ledger/publishList.js +29 -0
- package/extensions/graphql/queries/ledger/publishList.ts +27 -0
- package/extensions/graphql/queries/ledger/publishLists.d.ts +5 -0
- package/extensions/graphql/queries/ledger/publishLists.js +29 -0
- package/extensions/graphql/queries/ledger/publishLists.ts +27 -0
- package/extensions/graphql/queries/ledger/report.d.ts +5 -0
- package/extensions/graphql/queries/ledger/report.js +40 -0
- package/extensions/graphql/queries/ledger/report.ts +38 -0
- package/extensions/graphql/queries/ledger/reportingTaxonomy.d.ts +6 -0
- package/extensions/graphql/queries/ledger/reportingTaxonomy.js +27 -0
- package/extensions/graphql/queries/ledger/reportingTaxonomy.ts +25 -0
- package/extensions/graphql/queries/ledger/reports.d.ts +8 -0
- package/extensions/graphql/queries/ledger/reports.js +45 -0
- package/extensions/graphql/queries/ledger/reports.ts +43 -0
- package/extensions/graphql/queries/ledger/scheduleFacts.d.ts +7 -0
- package/extensions/graphql/queries/ledger/scheduleFacts.js +24 -0
- package/extensions/graphql/queries/ledger/scheduleFacts.ts +22 -0
- package/extensions/graphql/queries/ledger/schedules.d.ts +6 -0
- package/extensions/graphql/queries/ledger/schedules.js +24 -0
- package/extensions/graphql/queries/ledger/schedules.ts +22 -0
- package/extensions/graphql/queries/ledger/statement.d.ts +9 -0
- package/extensions/graphql/queries/ledger/statement.js +43 -0
- package/extensions/graphql/queries/ledger/statement.ts +41 -0
- package/extensions/graphql/queries/ledger/structures.d.ts +5 -0
- package/extensions/graphql/queries/ledger/structures.js +22 -0
- package/extensions/graphql/queries/ledger/structures.ts +20 -0
- package/extensions/graphql/queries/ledger/summary.d.ts +7 -0
- package/extensions/graphql/queries/ledger/summary.js +25 -0
- package/extensions/graphql/queries/ledger/summary.ts +23 -0
- package/extensions/graphql/queries/ledger/taxonomies.d.ts +5 -0
- package/extensions/graphql/queries/ledger/taxonomies.js +28 -0
- package/extensions/graphql/queries/ledger/taxonomies.ts +26 -0
- package/extensions/graphql/queries/ledger/transaction.d.ts +6 -0
- package/extensions/graphql/queries/ledger/transaction.js +49 -0
- package/extensions/graphql/queries/ledger/transaction.ts +47 -0
- package/extensions/graphql/queries/ledger/transactions.d.ts +7 -0
- package/extensions/graphql/queries/ledger/transactions.js +49 -0
- package/extensions/graphql/queries/ledger/transactions.ts +47 -0
- package/extensions/graphql/queries/ledger/trialBalance.d.ts +7 -0
- package/extensions/graphql/queries/ledger/trialBalance.js +28 -0
- package/extensions/graphql/queries/ledger/trialBalance.ts +26 -0
- package/extensions/graphql/queries/ledger/unmappedElements.d.ts +8 -0
- package/extensions/graphql/queries/ledger/unmappedElements.js +29 -0
- package/extensions/graphql/queries/ledger/unmappedElements.ts +27 -0
- package/extensions/hooks.d.ts +1 -1
- package/extensions/index.d.ts +5 -1
- package/extensions/index.js +13 -1
- package/extensions/index.ts +14 -0
- package/index.ts +2 -2
- package/package.json +14 -5
- package/sdk/index.d.ts +2 -2
- package/sdk/index.js +38 -65
- package/sdk/index.ts +2 -2
- package/sdk/sdk.gen.d.ts +101 -220
- package/sdk/sdk.gen.js +251 -445
- package/sdk/sdk.gen.ts +216 -409
- package/sdk/types.gen.d.ts +4586 -7045
- package/sdk/types.gen.ts +4702 -7334
- package/sdk.gen.d.ts +101 -220
- package/sdk.gen.js +251 -445
- package/sdk.gen.ts +216 -409
- package/types.gen.d.ts +4586 -7045
- package/types.gen.ts +4702 -7334
- package/extensions/AgentClient.test.ts +0 -403
- package/extensions/LedgerClient.test.ts +0 -1138
- package/extensions/OperationClient.test.ts +0 -365
- package/extensions/QueryClient.test.ts +0 -432
- package/extensions/ReportClient.test.ts +0 -828
- package/extensions/SSEClient.test.ts +0 -375
- package/extensions/config.test.ts +0 -199
- package/extensions/hooks.test.ts +0 -373
- package/extensions/index.test.ts +0 -420
- package/sdk-extensions/AgentClient.d.ts +0 -82
- package/sdk-extensions/AgentClient.js +0 -218
- package/sdk-extensions/AgentClient.test.ts +0 -403
- package/sdk-extensions/AgentClient.ts +0 -321
- package/sdk-extensions/LedgerClient.d.ts +0 -242
- package/sdk-extensions/LedgerClient.js +0 -496
- package/sdk-extensions/LedgerClient.test.ts +0 -1138
- package/sdk-extensions/LedgerClient.ts +0 -800
- package/sdk-extensions/OperationClient.d.ts +0 -65
- package/sdk-extensions/OperationClient.js +0 -251
- package/sdk-extensions/OperationClient.test.ts +0 -365
- package/sdk-extensions/OperationClient.ts +0 -324
- package/sdk-extensions/QueryClient.d.ts +0 -52
- package/sdk-extensions/QueryClient.js +0 -313
- package/sdk-extensions/QueryClient.test.ts +0 -432
- package/sdk-extensions/QueryClient.ts +0 -420
- package/sdk-extensions/README.md +0 -901
- package/sdk-extensions/ReportClient.d.ts +0 -151
- package/sdk-extensions/ReportClient.js +0 -278
- package/sdk-extensions/ReportClient.test.ts +0 -828
- package/sdk-extensions/ReportClient.ts +0 -486
- package/sdk-extensions/SSEClient.d.ts +0 -62
- package/sdk-extensions/SSEClient.js +0 -154
- package/sdk-extensions/SSEClient.test.ts +0 -375
- package/sdk-extensions/SSEClient.ts +0 -210
- package/sdk-extensions/config.d.ts +0 -57
- package/sdk-extensions/config.js +0 -152
- package/sdk-extensions/config.test.ts +0 -199
- package/sdk-extensions/config.ts +0 -175
- package/sdk-extensions/hooks.d.ts +0 -110
- package/sdk-extensions/hooks.js +0 -384
- package/sdk-extensions/hooks.test.ts +0 -373
- package/sdk-extensions/hooks.ts +0 -459
- package/sdk-extensions/index.d.ts +0 -63
- package/sdk-extensions/index.js +0 -164
- package/sdk-extensions/index.test.ts +0 -420
- package/sdk-extensions/index.ts +0 -203
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
"use strict";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.QueuedAgentError = exports.AgentClient = void 0;
|
|
5
|
-
/**
|
|
6
|
-
* Enhanced Agent Client with SSE support
|
|
7
|
-
* Provides intelligent agent execution with automatic strategy selection
|
|
8
|
-
*/
|
|
9
|
-
const sdk_gen_1 = require("../sdk/sdk.gen");
|
|
10
|
-
const SSEClient_1 = require("./SSEClient");
|
|
11
|
-
class AgentClient {
|
|
12
|
-
constructor(config) {
|
|
13
|
-
this.config = config;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Execute agent query with automatic agent selection
|
|
17
|
-
*/
|
|
18
|
-
async executeQuery(graphId, request, options = {}) {
|
|
19
|
-
const data = {
|
|
20
|
-
url: '/v1/graphs/{graph_id}/agent',
|
|
21
|
-
path: { graph_id: graphId },
|
|
22
|
-
body: {
|
|
23
|
-
message: request.message,
|
|
24
|
-
history: request.history,
|
|
25
|
-
context: request.context,
|
|
26
|
-
mode: request.mode,
|
|
27
|
-
enable_rag: request.enableRag,
|
|
28
|
-
force_extended_analysis: request.forceExtendedAnalysis,
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
const response = await (0, sdk_gen_1.autoSelectAgent)(data);
|
|
32
|
-
const responseData = response.data;
|
|
33
|
-
// Check if this is an immediate response (sync execution)
|
|
34
|
-
if (responseData?.content !== undefined && responseData?.agent_used) {
|
|
35
|
-
return {
|
|
36
|
-
content: responseData.content,
|
|
37
|
-
agent_used: responseData.agent_used,
|
|
38
|
-
mode_used: responseData.mode_used,
|
|
39
|
-
metadata: responseData.metadata,
|
|
40
|
-
tokens_used: responseData.tokens_used,
|
|
41
|
-
confidence_score: responseData.confidence_score,
|
|
42
|
-
execution_time: responseData.execution_time,
|
|
43
|
-
timestamp: new Date().toISOString(),
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
// Check if this is a queued response (async background task execution)
|
|
47
|
-
if (responseData?.operation_id) {
|
|
48
|
-
const queuedResponse = responseData;
|
|
49
|
-
// If user doesn't want to wait, throw with queue info
|
|
50
|
-
if (options.maxWait === 0) {
|
|
51
|
-
throw new QueuedAgentError(queuedResponse);
|
|
52
|
-
}
|
|
53
|
-
// Use SSE to monitor the operation
|
|
54
|
-
return this.waitForAgentCompletion(queuedResponse.operation_id, options);
|
|
55
|
-
}
|
|
56
|
-
// Unexpected response format
|
|
57
|
-
throw new Error('Unexpected response format from agent endpoint');
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Execute specific agent type
|
|
61
|
-
*/
|
|
62
|
-
async executeAgent(graphId, agentType, request, options = {}) {
|
|
63
|
-
const data = {
|
|
64
|
-
url: '/v1/graphs/{graph_id}/agent/{agent_type}',
|
|
65
|
-
path: { graph_id: graphId, agent_type: agentType },
|
|
66
|
-
body: {
|
|
67
|
-
message: request.message,
|
|
68
|
-
history: request.history,
|
|
69
|
-
context: request.context,
|
|
70
|
-
mode: request.mode,
|
|
71
|
-
enable_rag: request.enableRag,
|
|
72
|
-
force_extended_analysis: request.forceExtendedAnalysis,
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
const response = await (0, sdk_gen_1.executeSpecificAgent)(data);
|
|
76
|
-
const responseData = response.data;
|
|
77
|
-
// Check if this is an immediate response (sync execution)
|
|
78
|
-
if (responseData?.content !== undefined && responseData?.agent_used) {
|
|
79
|
-
return {
|
|
80
|
-
content: responseData.content,
|
|
81
|
-
agent_used: responseData.agent_used,
|
|
82
|
-
mode_used: responseData.mode_used,
|
|
83
|
-
metadata: responseData.metadata,
|
|
84
|
-
tokens_used: responseData.tokens_used,
|
|
85
|
-
confidence_score: responseData.confidence_score,
|
|
86
|
-
execution_time: responseData.execution_time,
|
|
87
|
-
timestamp: new Date().toISOString(),
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
// Check if this is a queued response (async background task execution)
|
|
91
|
-
if (responseData?.operation_id) {
|
|
92
|
-
const queuedResponse = responseData;
|
|
93
|
-
// If user doesn't want to wait, throw with queue info
|
|
94
|
-
if (options.maxWait === 0) {
|
|
95
|
-
throw new QueuedAgentError(queuedResponse);
|
|
96
|
-
}
|
|
97
|
-
// Use SSE to monitor the operation
|
|
98
|
-
return this.waitForAgentCompletion(queuedResponse.operation_id, options);
|
|
99
|
-
}
|
|
100
|
-
// Unexpected response format
|
|
101
|
-
throw new Error('Unexpected response format from agent endpoint');
|
|
102
|
-
}
|
|
103
|
-
async waitForAgentCompletion(operationId, options) {
|
|
104
|
-
return new Promise((resolve, reject) => {
|
|
105
|
-
const sseClient = new SSEClient_1.SSEClient(this.config);
|
|
106
|
-
sseClient
|
|
107
|
-
.connect(operationId)
|
|
108
|
-
.then(() => {
|
|
109
|
-
let result = null;
|
|
110
|
-
// Listen for progress events
|
|
111
|
-
sseClient.on(SSEClient_1.EventType.OPERATION_PROGRESS, (data) => {
|
|
112
|
-
options.onProgress?.(data.message, data.progress_percentage);
|
|
113
|
-
});
|
|
114
|
-
// Listen for agent-specific events
|
|
115
|
-
sseClient.on('agent_started', (data) => {
|
|
116
|
-
options.onProgress?.(`Agent ${data.agent_type} started`, 0);
|
|
117
|
-
});
|
|
118
|
-
sseClient.on('agent_initialized', (data) => {
|
|
119
|
-
options.onProgress?.(`${data.agent_name} initialized`, 10);
|
|
120
|
-
});
|
|
121
|
-
sseClient.on('progress', (data) => {
|
|
122
|
-
options.onProgress?.(data.message, data.percentage);
|
|
123
|
-
});
|
|
124
|
-
sseClient.on('agent_completed', (data) => {
|
|
125
|
-
result = {
|
|
126
|
-
content: data.content,
|
|
127
|
-
agent_used: data.agent_used,
|
|
128
|
-
mode_used: data.mode_used,
|
|
129
|
-
metadata: data.metadata,
|
|
130
|
-
tokens_used: data.tokens_used,
|
|
131
|
-
confidence_score: data.confidence_score,
|
|
132
|
-
execution_time: data.execution_time,
|
|
133
|
-
timestamp: data.timestamp || new Date().toISOString(),
|
|
134
|
-
};
|
|
135
|
-
sseClient.close();
|
|
136
|
-
resolve(result);
|
|
137
|
-
});
|
|
138
|
-
// Fallback to generic completion event
|
|
139
|
-
sseClient.on(SSEClient_1.EventType.OPERATION_COMPLETED, (data) => {
|
|
140
|
-
if (!result) {
|
|
141
|
-
const agentResult = data.result || data;
|
|
142
|
-
result = {
|
|
143
|
-
content: agentResult.content || '',
|
|
144
|
-
agent_used: agentResult.agent_used || 'unknown',
|
|
145
|
-
mode_used: agentResult.mode_used || 'standard',
|
|
146
|
-
metadata: agentResult.metadata,
|
|
147
|
-
tokens_used: agentResult.tokens_used,
|
|
148
|
-
confidence_score: agentResult.confidence_score,
|
|
149
|
-
execution_time: agentResult.execution_time,
|
|
150
|
-
timestamp: agentResult.timestamp || new Date().toISOString(),
|
|
151
|
-
};
|
|
152
|
-
sseClient.close();
|
|
153
|
-
resolve(result);
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
sseClient.on(SSEClient_1.EventType.OPERATION_ERROR, (error) => {
|
|
157
|
-
sseClient.close();
|
|
158
|
-
reject(new Error(error.message || error.error));
|
|
159
|
-
});
|
|
160
|
-
sseClient.on(SSEClient_1.EventType.OPERATION_CANCELLED, () => {
|
|
161
|
-
sseClient.close();
|
|
162
|
-
reject(new Error('Agent execution cancelled'));
|
|
163
|
-
});
|
|
164
|
-
// Handle generic error event
|
|
165
|
-
sseClient.on('error', (error) => {
|
|
166
|
-
sseClient.close();
|
|
167
|
-
reject(new Error(error.error || error.message || 'Agent execution failed'));
|
|
168
|
-
});
|
|
169
|
-
})
|
|
170
|
-
.catch(reject);
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Convenience method for simple agent queries with auto-selection
|
|
175
|
-
*/
|
|
176
|
-
async query(graphId, message, context) {
|
|
177
|
-
return this.executeQuery(graphId, { message, context }, { mode: 'auto' });
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Execute financial agent for financial analysis
|
|
181
|
-
*/
|
|
182
|
-
async analyzeFinancials(graphId, message, options = {}) {
|
|
183
|
-
return this.executeAgent(graphId, 'financial', { message }, options);
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Execute research agent for deep research
|
|
187
|
-
*/
|
|
188
|
-
async research(graphId, message, options = {}) {
|
|
189
|
-
return this.executeAgent(graphId, 'research', { message }, options);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Execute RAG agent for fast retrieval
|
|
193
|
-
*/
|
|
194
|
-
async rag(graphId, message, options = {}) {
|
|
195
|
-
return this.executeAgent(graphId, 'rag', { message }, options);
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Cancel any active SSE connections
|
|
199
|
-
*/
|
|
200
|
-
close() {
|
|
201
|
-
if (this.sseClient) {
|
|
202
|
-
this.sseClient.close();
|
|
203
|
-
this.sseClient = undefined;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
exports.AgentClient = AgentClient;
|
|
208
|
-
/**
|
|
209
|
-
* Error thrown when agent execution is queued and maxWait is 0
|
|
210
|
-
*/
|
|
211
|
-
class QueuedAgentError extends Error {
|
|
212
|
-
constructor(queueInfo) {
|
|
213
|
-
super('Agent execution was queued');
|
|
214
|
-
this.queueInfo = queueInfo;
|
|
215
|
-
this.name = 'QueuedAgentError';
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
exports.QueuedAgentError = QueuedAgentError;
|
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
-
import { AgentClient, QueuedAgentError } from './AgentClient'
|
|
3
|
-
|
|
4
|
-
// Mock EventSource for SSE tests
|
|
5
|
-
class MockEventSource {
|
|
6
|
-
url: string
|
|
7
|
-
withCredentials: boolean
|
|
8
|
-
readyState: number = 0
|
|
9
|
-
onopen: ((event: any) => void) | null = null
|
|
10
|
-
onerror: ((event: any) => void) | null = null
|
|
11
|
-
onmessage: ((event: any) => void) | null = null
|
|
12
|
-
private eventListeners: Map<string, Set<(event: any) => void>> = new Map()
|
|
13
|
-
|
|
14
|
-
static CONNECTING = 0
|
|
15
|
-
static OPEN = 1
|
|
16
|
-
static CLOSED = 2
|
|
17
|
-
|
|
18
|
-
constructor(url: string, options?: { withCredentials?: boolean }) {
|
|
19
|
-
this.url = url
|
|
20
|
-
this.withCredentials = options?.withCredentials ?? false
|
|
21
|
-
|
|
22
|
-
setTimeout(() => {
|
|
23
|
-
this.readyState = MockEventSource.OPEN
|
|
24
|
-
if (this.onopen) {
|
|
25
|
-
this.onopen({ type: 'open' })
|
|
26
|
-
}
|
|
27
|
-
}, 0)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
addEventListener(event: string, listener: (event: any) => void) {
|
|
31
|
-
if (!this.eventListeners.has(event)) {
|
|
32
|
-
this.eventListeners.set(event, new Set())
|
|
33
|
-
}
|
|
34
|
-
this.eventListeners.get(event)!.add(listener)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
removeEventListener(event: string, listener: (event: any) => void) {
|
|
38
|
-
const listeners = this.eventListeners.get(event)
|
|
39
|
-
if (listeners) {
|
|
40
|
-
listeners.delete(listener)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
dispatchEvent(event: any) {
|
|
45
|
-
const listeners = this.eventListeners.get(event.type)
|
|
46
|
-
if (listeners) {
|
|
47
|
-
listeners.forEach((listener) => listener(event))
|
|
48
|
-
}
|
|
49
|
-
return true
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
close() {
|
|
53
|
-
this.readyState = MockEventSource.CLOSED
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
simulateMessage(eventType: string, data: any) {
|
|
57
|
-
const event = {
|
|
58
|
-
type: eventType,
|
|
59
|
-
data: JSON.stringify(data),
|
|
60
|
-
lastEventId: '',
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const listeners = this.eventListeners.get(eventType)
|
|
64
|
-
if (listeners) {
|
|
65
|
-
listeners.forEach((listener) => listener(event))
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Helper to create proper mock Response objects
|
|
71
|
-
function createMockResponse(data: any, options: { ok?: boolean; status?: number } = {}) {
|
|
72
|
-
return {
|
|
73
|
-
ok: options.ok ?? true,
|
|
74
|
-
status: options.status ?? 200,
|
|
75
|
-
statusText: options.status === 200 ? 'OK' : 'Error',
|
|
76
|
-
headers: new Headers({ 'content-type': 'application/json' }),
|
|
77
|
-
json: async () => data,
|
|
78
|
-
text: async () => JSON.stringify(data),
|
|
79
|
-
blob: async () => new Blob([JSON.stringify(data)]),
|
|
80
|
-
arrayBuffer: async () => new TextEncoder().encode(JSON.stringify(data)).buffer,
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
describe('AgentClient', () => {
|
|
85
|
-
let client: AgentClient
|
|
86
|
-
let mockFetch: any
|
|
87
|
-
|
|
88
|
-
beforeEach(() => {
|
|
89
|
-
client = new AgentClient({
|
|
90
|
-
baseUrl: 'http://localhost:8000',
|
|
91
|
-
token: 'test-token',
|
|
92
|
-
headers: { 'X-API-Key': 'test-key' },
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
mockFetch = vi.fn()
|
|
96
|
-
global.fetch = mockFetch
|
|
97
|
-
globalThis.fetch = mockFetch
|
|
98
|
-
global.EventSource = MockEventSource as any
|
|
99
|
-
vi.clearAllMocks()
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
// ── executeQuery ──────────────────────────────────────────────────────
|
|
103
|
-
|
|
104
|
-
describe('executeQuery', () => {
|
|
105
|
-
it('should handle immediate sync response', async () => {
|
|
106
|
-
mockFetch.mockResolvedValueOnce(
|
|
107
|
-
createMockResponse({
|
|
108
|
-
content: 'Revenue increased 15% year-over-year.',
|
|
109
|
-
agent_used: 'financial',
|
|
110
|
-
mode_used: 'standard',
|
|
111
|
-
metadata: { sources: ['10-K'] },
|
|
112
|
-
tokens_used: { prompt_tokens: 500, completion_tokens: 100, total_tokens: 600 },
|
|
113
|
-
confidence_score: 0.92,
|
|
114
|
-
execution_time: 1.5,
|
|
115
|
-
})
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
const result = await client.executeQuery('graph_1', {
|
|
119
|
-
message: 'What was revenue growth?',
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
expect(result.content).toBe('Revenue increased 15% year-over-year.')
|
|
123
|
-
expect(result.agent_used).toBe('financial')
|
|
124
|
-
expect(result.mode_used).toBe('standard')
|
|
125
|
-
expect(result.metadata).toEqual({ sources: ['10-K'] })
|
|
126
|
-
expect(result.tokens_used).toEqual({
|
|
127
|
-
prompt_tokens: 500,
|
|
128
|
-
completion_tokens: 100,
|
|
129
|
-
total_tokens: 600,
|
|
130
|
-
})
|
|
131
|
-
expect(result.confidence_score).toBe(0.92)
|
|
132
|
-
expect(result.execution_time).toBe(1.5)
|
|
133
|
-
expect(result.timestamp).toBeDefined()
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
it('should accept full request options', async () => {
|
|
137
|
-
mockFetch.mockResolvedValueOnce(
|
|
138
|
-
createMockResponse({
|
|
139
|
-
content: 'Answer',
|
|
140
|
-
agent_used: 'rag',
|
|
141
|
-
mode_used: 'quick',
|
|
142
|
-
})
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
const result = await client.executeQuery('graph_1', {
|
|
146
|
-
message: 'test query',
|
|
147
|
-
history: [{ role: 'user', content: 'prior question' }],
|
|
148
|
-
context: { fiscal_year: 2024 },
|
|
149
|
-
mode: 'extended',
|
|
150
|
-
enableRag: true,
|
|
151
|
-
forceExtendedAnalysis: true,
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
expect(result.content).toBe('Answer')
|
|
155
|
-
expect(mockFetch).toHaveBeenCalledTimes(1)
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
it('should throw QueuedAgentError when maxWait is 0', async () => {
|
|
159
|
-
mockFetch.mockResolvedValueOnce(
|
|
160
|
-
createMockResponse({
|
|
161
|
-
status: 'queued',
|
|
162
|
-
operation_id: 'op_123',
|
|
163
|
-
message: 'Agent execution queued',
|
|
164
|
-
})
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
await client.executeQuery('graph_1', { message: 'complex query' }, { maxWait: 0 })
|
|
169
|
-
expect.fail('Should have thrown')
|
|
170
|
-
} catch (error) {
|
|
171
|
-
expect(error).toBeInstanceOf(QueuedAgentError)
|
|
172
|
-
const queuedError = error as QueuedAgentError
|
|
173
|
-
expect(queuedError.queueInfo.operation_id).toBe('op_123')
|
|
174
|
-
expect(queuedError.message).toBe('Agent execution was queued')
|
|
175
|
-
}
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
it('should throw on unexpected response format', async () => {
|
|
179
|
-
mockFetch.mockResolvedValueOnce(
|
|
180
|
-
createMockResponse({
|
|
181
|
-
unexpected: 'data',
|
|
182
|
-
})
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
await expect(client.executeQuery('graph_1', { message: 'test' })).rejects.toThrow(
|
|
186
|
-
'Unexpected response format from agent endpoint'
|
|
187
|
-
)
|
|
188
|
-
})
|
|
189
|
-
|
|
190
|
-
it('should wait for SSE completion when queued', async () => {
|
|
191
|
-
// Return a queued response
|
|
192
|
-
mockFetch.mockResolvedValueOnce(
|
|
193
|
-
createMockResponse({
|
|
194
|
-
operation_id: 'op_456',
|
|
195
|
-
message: 'Queued',
|
|
196
|
-
})
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
const resultPromise = client.executeQuery('graph_1', { message: 'test' })
|
|
200
|
-
|
|
201
|
-
// Wait for SSE client to connect
|
|
202
|
-
await new Promise((r) => setTimeout(r, 10))
|
|
203
|
-
|
|
204
|
-
// Find the SSEClient's EventSource and simulate agent_completed
|
|
205
|
-
// The SSEClient creates a new EventSource internally
|
|
206
|
-
// We need to find the last created MockEventSource
|
|
207
|
-
// Since we mocked EventSource globally, the last constructed instance will get the events
|
|
208
|
-
|
|
209
|
-
// Simulate the agent_completed event through the mock EventSource
|
|
210
|
-
// The SSEClient connects and registers listeners
|
|
211
|
-
await new Promise((r) => setTimeout(r, 50))
|
|
212
|
-
|
|
213
|
-
// Since we can't easily access the internal EventSource in this test pattern,
|
|
214
|
-
// and the SSE test infrastructure is complex, let's verify the error path instead
|
|
215
|
-
// The promise will reject since no SSE events come
|
|
216
|
-
})
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
// ── executeAgent ──────────────────────────────────────────────────────
|
|
220
|
-
|
|
221
|
-
describe('executeAgent', () => {
|
|
222
|
-
it('should handle immediate sync response for specific agent', async () => {
|
|
223
|
-
mockFetch.mockResolvedValueOnce(
|
|
224
|
-
createMockResponse({
|
|
225
|
-
content: 'Financial analysis complete.',
|
|
226
|
-
agent_used: 'financial',
|
|
227
|
-
mode_used: 'extended',
|
|
228
|
-
confidence_score: 0.95,
|
|
229
|
-
execution_time: 3.2,
|
|
230
|
-
})
|
|
231
|
-
)
|
|
232
|
-
|
|
233
|
-
const result = await client.executeAgent('graph_1', 'financial', {
|
|
234
|
-
message: 'Analyze Q3 earnings',
|
|
235
|
-
})
|
|
236
|
-
|
|
237
|
-
expect(result.content).toBe('Financial analysis complete.')
|
|
238
|
-
expect(result.agent_used).toBe('financial')
|
|
239
|
-
expect(result.mode_used).toBe('extended')
|
|
240
|
-
expect(result.confidence_score).toBe(0.95)
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
it('should throw QueuedAgentError when maxWait is 0', async () => {
|
|
244
|
-
mockFetch.mockResolvedValueOnce(
|
|
245
|
-
createMockResponse({
|
|
246
|
-
operation_id: 'op_789',
|
|
247
|
-
message: 'Queued for financial agent',
|
|
248
|
-
})
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
await expect(
|
|
252
|
-
client.executeAgent('graph_1', 'financial', { message: 'test' }, { maxWait: 0 })
|
|
253
|
-
).rejects.toThrow(QueuedAgentError)
|
|
254
|
-
})
|
|
255
|
-
|
|
256
|
-
it('should throw on unexpected response format', async () => {
|
|
257
|
-
mockFetch.mockResolvedValueOnce(createMockResponse({ weird: true }))
|
|
258
|
-
|
|
259
|
-
await expect(client.executeAgent('graph_1', 'research', { message: 'test' })).rejects.toThrow(
|
|
260
|
-
'Unexpected response format from agent endpoint'
|
|
261
|
-
)
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
it('should execute specific agent type', async () => {
|
|
265
|
-
mockFetch.mockResolvedValueOnce(
|
|
266
|
-
createMockResponse({
|
|
267
|
-
content: 'RAG result',
|
|
268
|
-
agent_used: 'rag',
|
|
269
|
-
mode_used: 'quick',
|
|
270
|
-
})
|
|
271
|
-
)
|
|
272
|
-
|
|
273
|
-
const result = await client.executeAgent('graph_1', 'rag', { message: 'search docs' })
|
|
274
|
-
|
|
275
|
-
expect(result.content).toBe('RAG result')
|
|
276
|
-
expect(result.agent_used).toBe('rag')
|
|
277
|
-
expect(mockFetch).toHaveBeenCalledTimes(1)
|
|
278
|
-
})
|
|
279
|
-
})
|
|
280
|
-
|
|
281
|
-
// ── Convenience methods ───────────────────────────────────────────────
|
|
282
|
-
|
|
283
|
-
describe('query', () => {
|
|
284
|
-
it('should execute auto-select query', async () => {
|
|
285
|
-
mockFetch.mockResolvedValueOnce(
|
|
286
|
-
createMockResponse({
|
|
287
|
-
content: 'Auto-selected answer',
|
|
288
|
-
agent_used: 'rag',
|
|
289
|
-
mode_used: 'quick',
|
|
290
|
-
})
|
|
291
|
-
)
|
|
292
|
-
|
|
293
|
-
const result = await client.query('graph_1', 'What is revenue?', { year: 2024 })
|
|
294
|
-
|
|
295
|
-
expect(result.content).toBe('Auto-selected answer')
|
|
296
|
-
expect(result.agent_used).toBe('rag')
|
|
297
|
-
expect(mockFetch).toHaveBeenCalledTimes(1)
|
|
298
|
-
})
|
|
299
|
-
})
|
|
300
|
-
|
|
301
|
-
describe('analyzeFinancials', () => {
|
|
302
|
-
it('should execute financial agent', async () => {
|
|
303
|
-
mockFetch.mockResolvedValueOnce(
|
|
304
|
-
createMockResponse({
|
|
305
|
-
content: 'Financial analysis',
|
|
306
|
-
agent_used: 'financial',
|
|
307
|
-
mode_used: 'extended',
|
|
308
|
-
})
|
|
309
|
-
)
|
|
310
|
-
|
|
311
|
-
const result = await client.analyzeFinancials('graph_1', 'Analyze margins')
|
|
312
|
-
|
|
313
|
-
expect(result.content).toBe('Financial analysis')
|
|
314
|
-
expect(result.agent_used).toBe('financial')
|
|
315
|
-
})
|
|
316
|
-
})
|
|
317
|
-
|
|
318
|
-
describe('research', () => {
|
|
319
|
-
it('should execute research agent', async () => {
|
|
320
|
-
mockFetch.mockResolvedValueOnce(
|
|
321
|
-
createMockResponse({
|
|
322
|
-
content: 'Research findings',
|
|
323
|
-
agent_used: 'research',
|
|
324
|
-
mode_used: 'extended',
|
|
325
|
-
})
|
|
326
|
-
)
|
|
327
|
-
|
|
328
|
-
const result = await client.research('graph_1', 'Industry trends')
|
|
329
|
-
|
|
330
|
-
expect(result.content).toBe('Research findings')
|
|
331
|
-
expect(result.agent_used).toBe('research')
|
|
332
|
-
})
|
|
333
|
-
})
|
|
334
|
-
|
|
335
|
-
describe('rag', () => {
|
|
336
|
-
it('should execute RAG agent', async () => {
|
|
337
|
-
mockFetch.mockResolvedValueOnce(
|
|
338
|
-
createMockResponse({
|
|
339
|
-
content: 'Retrieved document excerpt',
|
|
340
|
-
agent_used: 'rag',
|
|
341
|
-
mode_used: 'quick',
|
|
342
|
-
})
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
const result = await client.rag('graph_1', 'Find disclosure about goodwill')
|
|
346
|
-
|
|
347
|
-
expect(result.content).toBe('Retrieved document excerpt')
|
|
348
|
-
expect(result.agent_used).toBe('rag')
|
|
349
|
-
})
|
|
350
|
-
})
|
|
351
|
-
|
|
352
|
-
// ── close ─────────────────────────────────────────────────────────────
|
|
353
|
-
|
|
354
|
-
describe('close', () => {
|
|
355
|
-
it('should close without error when no SSE client exists', () => {
|
|
356
|
-
expect(() => client.close()).not.toThrow()
|
|
357
|
-
})
|
|
358
|
-
|
|
359
|
-
it('should be safe to call close multiple times', () => {
|
|
360
|
-
client.close()
|
|
361
|
-
expect(() => client.close()).not.toThrow()
|
|
362
|
-
})
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
// ── QueuedAgentError ──────────────────────────────────────────────────
|
|
366
|
-
|
|
367
|
-
describe('QueuedAgentError', () => {
|
|
368
|
-
it('should create error with queue info', () => {
|
|
369
|
-
const queueInfo = {
|
|
370
|
-
status: 'queued' as const,
|
|
371
|
-
operation_id: 'op_test',
|
|
372
|
-
message: 'Queued for processing',
|
|
373
|
-
sse_endpoint: '/v1/operations/op_test/stream',
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
const error = new QueuedAgentError(queueInfo)
|
|
377
|
-
|
|
378
|
-
expect(error.message).toBe('Agent execution was queued')
|
|
379
|
-
expect(error.name).toBe('QueuedAgentError')
|
|
380
|
-
expect(error.queueInfo).toEqual(queueInfo)
|
|
381
|
-
expect(error).toBeInstanceOf(Error)
|
|
382
|
-
})
|
|
383
|
-
})
|
|
384
|
-
|
|
385
|
-
// ── Constructor ───────────────────────────────────────────────────────
|
|
386
|
-
|
|
387
|
-
describe('constructor', () => {
|
|
388
|
-
it('should create with minimal config', () => {
|
|
389
|
-
const c = new AgentClient({ baseUrl: 'http://localhost:8000' })
|
|
390
|
-
expect(c).toBeInstanceOf(AgentClient)
|
|
391
|
-
})
|
|
392
|
-
|
|
393
|
-
it('should accept all config options', () => {
|
|
394
|
-
const c = new AgentClient({
|
|
395
|
-
baseUrl: 'http://localhost:8000',
|
|
396
|
-
credentials: 'include',
|
|
397
|
-
headers: { Authorization: 'Bearer token' },
|
|
398
|
-
token: 'jwt-token',
|
|
399
|
-
})
|
|
400
|
-
expect(c).toBeInstanceOf(AgentClient)
|
|
401
|
-
})
|
|
402
|
-
})
|
|
403
|
-
})
|