@robosystems/client 0.2.49 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/extensions/InvestorClient.d.ts +98 -0
  2. package/extensions/InvestorClient.js +223 -0
  3. package/extensions/InvestorClient.ts +508 -0
  4. package/extensions/LedgerClient.d.ts +190 -309
  5. package/extensions/LedgerClient.js +268 -587
  6. package/extensions/LedgerClient.ts +784 -903
  7. package/extensions/ReportClient.d.ts +82 -113
  8. package/extensions/ReportClient.js +124 -211
  9. package/extensions/ReportClient.ts +305 -358
  10. package/extensions/config.d.ts +19 -0
  11. package/extensions/config.js +1 -1
  12. package/extensions/config.ts +22 -2
  13. package/extensions/graphql/client.d.ts +82 -0
  14. package/extensions/graphql/client.js +149 -0
  15. package/extensions/graphql/client.ts +189 -0
  16. package/extensions/graphql/generated/graphql.d.ts +1786 -0
  17. package/extensions/graphql/generated/graphql.js +2671 -0
  18. package/extensions/graphql/generated/graphql.ts +4491 -0
  19. package/extensions/graphql/queries/investor/holdings.d.ts +8 -0
  20. package/extensions/graphql/queries/investor/holdings.js +36 -0
  21. package/extensions/graphql/queries/investor/holdings.ts +34 -0
  22. package/extensions/graphql/queries/investor/portfolio.d.ts +4 -0
  23. package/extensions/graphql/queries/investor/portfolio.js +21 -0
  24. package/extensions/graphql/queries/investor/portfolio.ts +19 -0
  25. package/extensions/graphql/queries/investor/portfolios.d.ts +4 -0
  26. package/extensions/graphql/queries/investor/portfolios.js +29 -0
  27. package/extensions/graphql/queries/investor/portfolios.ts +27 -0
  28. package/extensions/graphql/queries/investor/position.d.ts +4 -0
  29. package/extensions/graphql/queries/investor/position.js +33 -0
  30. package/extensions/graphql/queries/investor/position.ts +31 -0
  31. package/extensions/graphql/queries/investor/positions.d.ts +8 -0
  32. package/extensions/graphql/queries/investor/positions.js +57 -0
  33. package/extensions/graphql/queries/investor/positions.ts +55 -0
  34. package/extensions/graphql/queries/investor/securities.d.ts +8 -0
  35. package/extensions/graphql/queries/investor/securities.js +50 -0
  36. package/extensions/graphql/queries/investor/securities.ts +48 -0
  37. package/extensions/graphql/queries/investor/security.d.ts +4 -0
  38. package/extensions/graphql/queries/investor/security.js +26 -0
  39. package/extensions/graphql/queries/investor/security.ts +24 -0
  40. package/extensions/graphql/queries/ledger/accountRollups.d.ts +7 -0
  41. package/extensions/graphql/queries/ledger/accountRollups.js +36 -0
  42. package/extensions/graphql/queries/ledger/accountRollups.ts +34 -0
  43. package/extensions/graphql/queries/ledger/accountTree.d.ts +11 -0
  44. package/extensions/graphql/queries/ledger/accountTree.js +61 -0
  45. package/extensions/graphql/queries/ledger/accountTree.ts +59 -0
  46. package/extensions/graphql/queries/ledger/accounts.d.ts +8 -0
  47. package/extensions/graphql/queries/ledger/accounts.js +45 -0
  48. package/extensions/graphql/queries/ledger/accounts.ts +43 -0
  49. package/extensions/graphql/queries/ledger/closingBookStructures.d.ts +6 -0
  50. package/extensions/graphql/queries/ledger/closingBookStructures.js +27 -0
  51. package/extensions/graphql/queries/ledger/closingBookStructures.ts +25 -0
  52. package/extensions/graphql/queries/ledger/elements.d.ts +6 -0
  53. package/extensions/graphql/queries/ledger/elements.js +56 -0
  54. package/extensions/graphql/queries/ledger/elements.ts +54 -0
  55. package/extensions/graphql/queries/ledger/entities.d.ts +7 -0
  56. package/extensions/graphql/queries/ledger/entities.js +31 -0
  57. package/extensions/graphql/queries/ledger/entities.ts +29 -0
  58. package/extensions/graphql/queries/ledger/entity.d.ts +14 -0
  59. package/extensions/graphql/queries/ledger/entity.js +55 -0
  60. package/extensions/graphql/queries/ledger/entity.ts +54 -0
  61. package/extensions/graphql/queries/ledger/fiscalCalendar.d.ts +8 -0
  62. package/extensions/graphql/queries/ledger/fiscalCalendar.js +35 -0
  63. package/extensions/graphql/queries/ledger/fiscalCalendar.ts +33 -0
  64. package/extensions/graphql/queries/ledger/mappedTrialBalance.d.ts +9 -0
  65. package/extensions/graphql/queries/ledger/mappedTrialBalance.js +29 -0
  66. package/extensions/graphql/queries/ledger/mappedTrialBalance.ts +27 -0
  67. package/extensions/graphql/queries/ledger/mapping.d.ts +5 -0
  68. package/extensions/graphql/queries/ledger/mapping.js +35 -0
  69. package/extensions/graphql/queries/ledger/mapping.ts +33 -0
  70. package/extensions/graphql/queries/ledger/mappingCoverage.d.ts +5 -0
  71. package/extensions/graphql/queries/ledger/mappingCoverage.js +22 -0
  72. package/extensions/graphql/queries/ledger/mappingCoverage.ts +20 -0
  73. package/extensions/graphql/queries/ledger/mappings.d.ts +6 -0
  74. package/extensions/graphql/queries/ledger/mappings.js +23 -0
  75. package/extensions/graphql/queries/ledger/mappings.ts +21 -0
  76. package/extensions/graphql/queries/ledger/periodCloseStatus.d.ts +6 -0
  77. package/extensions/graphql/queries/ledger/periodCloseStatus.js +29 -0
  78. package/extensions/graphql/queries/ledger/periodCloseStatus.ts +27 -0
  79. package/extensions/graphql/queries/ledger/periodDrafts.d.ts +8 -0
  80. package/extensions/graphql/queries/ledger/periodDrafts.js +45 -0
  81. package/extensions/graphql/queries/ledger/periodDrafts.ts +43 -0
  82. package/extensions/graphql/queries/ledger/publishList.d.ts +5 -0
  83. package/extensions/graphql/queries/ledger/publishList.js +29 -0
  84. package/extensions/graphql/queries/ledger/publishList.ts +27 -0
  85. package/extensions/graphql/queries/ledger/publishLists.d.ts +5 -0
  86. package/extensions/graphql/queries/ledger/publishLists.js +29 -0
  87. package/extensions/graphql/queries/ledger/publishLists.ts +27 -0
  88. package/extensions/graphql/queries/ledger/report.d.ts +5 -0
  89. package/extensions/graphql/queries/ledger/report.js +40 -0
  90. package/extensions/graphql/queries/ledger/report.ts +38 -0
  91. package/extensions/graphql/queries/ledger/reportingTaxonomy.d.ts +6 -0
  92. package/extensions/graphql/queries/ledger/reportingTaxonomy.js +27 -0
  93. package/extensions/graphql/queries/ledger/reportingTaxonomy.ts +25 -0
  94. package/extensions/graphql/queries/ledger/reports.d.ts +8 -0
  95. package/extensions/graphql/queries/ledger/reports.js +45 -0
  96. package/extensions/graphql/queries/ledger/reports.ts +43 -0
  97. package/extensions/graphql/queries/ledger/scheduleFacts.d.ts +7 -0
  98. package/extensions/graphql/queries/ledger/scheduleFacts.js +24 -0
  99. package/extensions/graphql/queries/ledger/scheduleFacts.ts +22 -0
  100. package/extensions/graphql/queries/ledger/schedules.d.ts +6 -0
  101. package/extensions/graphql/queries/ledger/schedules.js +24 -0
  102. package/extensions/graphql/queries/ledger/schedules.ts +22 -0
  103. package/extensions/graphql/queries/ledger/statement.d.ts +9 -0
  104. package/extensions/graphql/queries/ledger/statement.js +43 -0
  105. package/extensions/graphql/queries/ledger/statement.ts +41 -0
  106. package/extensions/graphql/queries/ledger/structures.d.ts +5 -0
  107. package/extensions/graphql/queries/ledger/structures.js +22 -0
  108. package/extensions/graphql/queries/ledger/structures.ts +20 -0
  109. package/extensions/graphql/queries/ledger/summary.d.ts +7 -0
  110. package/extensions/graphql/queries/ledger/summary.js +25 -0
  111. package/extensions/graphql/queries/ledger/summary.ts +23 -0
  112. package/extensions/graphql/queries/ledger/taxonomies.d.ts +5 -0
  113. package/extensions/graphql/queries/ledger/taxonomies.js +28 -0
  114. package/extensions/graphql/queries/ledger/taxonomies.ts +26 -0
  115. package/extensions/graphql/queries/ledger/transaction.d.ts +6 -0
  116. package/extensions/graphql/queries/ledger/transaction.js +49 -0
  117. package/extensions/graphql/queries/ledger/transaction.ts +47 -0
  118. package/extensions/graphql/queries/ledger/transactions.d.ts +7 -0
  119. package/extensions/graphql/queries/ledger/transactions.js +49 -0
  120. package/extensions/graphql/queries/ledger/transactions.ts +47 -0
  121. package/extensions/graphql/queries/ledger/trialBalance.d.ts +7 -0
  122. package/extensions/graphql/queries/ledger/trialBalance.js +28 -0
  123. package/extensions/graphql/queries/ledger/trialBalance.ts +26 -0
  124. package/extensions/graphql/queries/ledger/unmappedElements.d.ts +8 -0
  125. package/extensions/graphql/queries/ledger/unmappedElements.js +29 -0
  126. package/extensions/graphql/queries/ledger/unmappedElements.ts +27 -0
  127. package/extensions/hooks.d.ts +1 -1
  128. package/extensions/index.d.ts +18 -1
  129. package/extensions/index.js +26 -1
  130. package/extensions/index.ts +49 -2
  131. package/index.ts +2 -2
  132. package/package.json +14 -5
  133. package/sdk/index.d.ts +2 -2
  134. package/sdk/index.js +38 -73
  135. package/sdk/index.ts +2 -2
  136. package/sdk/sdk.gen.d.ts +100 -325
  137. package/sdk/sdk.gen.js +228 -592
  138. package/sdk/sdk.gen.ts +193 -556
  139. package/sdk/types.gen.d.ts +4522 -7708
  140. package/sdk/types.gen.ts +4569 -7983
  141. package/sdk.gen.d.ts +100 -325
  142. package/sdk.gen.js +228 -592
  143. package/sdk.gen.ts +193 -556
  144. package/types.gen.d.ts +4522 -7708
  145. package/types.gen.ts +4569 -7983
  146. package/extensions/AgentClient.test.ts +0 -403
  147. package/extensions/LedgerClient.test.ts +0 -1655
  148. package/extensions/OperationClient.test.ts +0 -365
  149. package/extensions/QueryClient.test.ts +0 -432
  150. package/extensions/ReportClient.test.ts +0 -828
  151. package/extensions/SSEClient.test.ts +0 -375
  152. package/extensions/config.test.ts +0 -199
  153. package/extensions/hooks.test.ts +0 -373
  154. package/extensions/index.test.ts +0 -420
  155. package/sdk-extensions/AgentClient.d.ts +0 -82
  156. package/sdk-extensions/AgentClient.js +0 -218
  157. package/sdk-extensions/AgentClient.test.ts +0 -403
  158. package/sdk-extensions/AgentClient.ts +0 -321
  159. package/sdk-extensions/LedgerClient.d.ts +0 -416
  160. package/sdk-extensions/LedgerClient.js +0 -737
  161. package/sdk-extensions/LedgerClient.test.ts +0 -1655
  162. package/sdk-extensions/LedgerClient.ts +0 -1249
  163. package/sdk-extensions/OperationClient.d.ts +0 -65
  164. package/sdk-extensions/OperationClient.js +0 -251
  165. package/sdk-extensions/OperationClient.test.ts +0 -365
  166. package/sdk-extensions/OperationClient.ts +0 -324
  167. package/sdk-extensions/QueryClient.d.ts +0 -52
  168. package/sdk-extensions/QueryClient.js +0 -313
  169. package/sdk-extensions/QueryClient.test.ts +0 -432
  170. package/sdk-extensions/QueryClient.ts +0 -420
  171. package/sdk-extensions/README.md +0 -901
  172. package/sdk-extensions/ReportClient.d.ts +0 -151
  173. package/sdk-extensions/ReportClient.js +0 -278
  174. package/sdk-extensions/ReportClient.test.ts +0 -828
  175. package/sdk-extensions/ReportClient.ts +0 -486
  176. package/sdk-extensions/SSEClient.d.ts +0 -62
  177. package/sdk-extensions/SSEClient.js +0 -154
  178. package/sdk-extensions/SSEClient.test.ts +0 -375
  179. package/sdk-extensions/SSEClient.ts +0 -210
  180. package/sdk-extensions/config.d.ts +0 -57
  181. package/sdk-extensions/config.js +0 -152
  182. package/sdk-extensions/config.test.ts +0 -199
  183. package/sdk-extensions/config.ts +0 -175
  184. package/sdk-extensions/hooks.d.ts +0 -110
  185. package/sdk-extensions/hooks.js +0 -384
  186. package/sdk-extensions/hooks.test.ts +0 -373
  187. package/sdk-extensions/hooks.ts +0 -459
  188. package/sdk-extensions/index.d.ts +0 -63
  189. package/sdk-extensions/index.js +0 -164
  190. package/sdk-extensions/index.test.ts +0 -420
  191. package/sdk-extensions/index.ts +0 -203
@@ -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
- })