@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,486 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Report Client for RoboSystems API
|
|
5
|
-
*
|
|
6
|
-
* High-level client for report lifecycle: create, list, view statements,
|
|
7
|
-
* regenerate, share, and delete. Reports consume ledger data (mappings,
|
|
8
|
-
* trial balance) as inputs — use LedgerClient for those concerns.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
addPublishListMembers,
|
|
13
|
-
createPublishList,
|
|
14
|
-
createReport,
|
|
15
|
-
deletePublishList,
|
|
16
|
-
deleteReport,
|
|
17
|
-
getPublishList,
|
|
18
|
-
getReport,
|
|
19
|
-
getStatement,
|
|
20
|
-
listPublishLists,
|
|
21
|
-
listReports,
|
|
22
|
-
regenerateReport,
|
|
23
|
-
removePublishListMember,
|
|
24
|
-
shareReport,
|
|
25
|
-
updatePublishList,
|
|
26
|
-
} from '../sdk/sdk.gen'
|
|
27
|
-
import type {
|
|
28
|
-
CreateReportRequest,
|
|
29
|
-
FactRowResponse,
|
|
30
|
-
PublishListDetailResponse,
|
|
31
|
-
PublishListListResponse,
|
|
32
|
-
PublishListMemberResponse,
|
|
33
|
-
PublishListResponse,
|
|
34
|
-
RegenerateReportRequest,
|
|
35
|
-
ReportListResponse,
|
|
36
|
-
ReportResponse,
|
|
37
|
-
ShareReportResponse,
|
|
38
|
-
StatementResponse,
|
|
39
|
-
StructureSummary,
|
|
40
|
-
ValidationCheckResponse,
|
|
41
|
-
} from '../sdk/types.gen'
|
|
42
|
-
|
|
43
|
-
// ── Friendly types ──────────────────────────────────────────────────────
|
|
44
|
-
|
|
45
|
-
export interface Report {
|
|
46
|
-
id: string
|
|
47
|
-
name: string
|
|
48
|
-
taxonomyId: string
|
|
49
|
-
generationStatus: string
|
|
50
|
-
periodType: string
|
|
51
|
-
periodStart: string | null
|
|
52
|
-
periodEnd: string | null
|
|
53
|
-
comparative: boolean
|
|
54
|
-
mappingId: string | null
|
|
55
|
-
aiGenerated: boolean
|
|
56
|
-
createdAt: string
|
|
57
|
-
lastGenerated: string | null
|
|
58
|
-
structures: Structure[]
|
|
59
|
-
/** Entity name (source company for shared reports, own entity for native) */
|
|
60
|
-
entityName: string | null
|
|
61
|
-
/** Non-null when this report was shared from another graph */
|
|
62
|
-
sourceGraphId: string | null
|
|
63
|
-
sourceReportId: string | null
|
|
64
|
-
sharedAt: string | null
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Structure type re-exported from LedgerClient
|
|
68
|
-
import type { Structure } from './LedgerClient'
|
|
69
|
-
export type { Structure } from './LedgerClient'
|
|
70
|
-
|
|
71
|
-
export interface StatementPeriod {
|
|
72
|
-
start: string
|
|
73
|
-
end: string
|
|
74
|
-
label: string
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface StatementRow {
|
|
78
|
-
elementId: string
|
|
79
|
-
elementQname: string
|
|
80
|
-
elementName: string
|
|
81
|
-
classification: string
|
|
82
|
-
values: (number | null)[]
|
|
83
|
-
isSubtotal: boolean
|
|
84
|
-
depth: number
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export interface StatementData {
|
|
88
|
-
reportId: string
|
|
89
|
-
structureId: string
|
|
90
|
-
structureName: string
|
|
91
|
-
structureType: string
|
|
92
|
-
periods: StatementPeriod[]
|
|
93
|
-
rows: StatementRow[]
|
|
94
|
-
validation: {
|
|
95
|
-
passed: boolean
|
|
96
|
-
checks: string[]
|
|
97
|
-
failures: string[]
|
|
98
|
-
warnings: string[]
|
|
99
|
-
} | null
|
|
100
|
-
unmappedCount: number
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export interface ShareResult {
|
|
104
|
-
reportId: string
|
|
105
|
-
results: Array<{
|
|
106
|
-
targetGraphId: string
|
|
107
|
-
status: 'shared' | 'error'
|
|
108
|
-
error: string | null
|
|
109
|
-
factCount: number
|
|
110
|
-
}>
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export interface PublishList {
|
|
114
|
-
id: string
|
|
115
|
-
name: string
|
|
116
|
-
description: string | null
|
|
117
|
-
memberCount: number
|
|
118
|
-
createdBy: string
|
|
119
|
-
createdAt: string
|
|
120
|
-
updatedAt: string
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export interface PublishListDetail extends PublishList {
|
|
124
|
-
members: PublishListMember[]
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export interface PublishListMember {
|
|
128
|
-
id: string
|
|
129
|
-
targetGraphId: string
|
|
130
|
-
targetGraphName: string | null
|
|
131
|
-
targetOrgName: string | null
|
|
132
|
-
addedBy: string
|
|
133
|
-
addedAt: string
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export interface PeriodSpecInput {
|
|
137
|
-
start: string
|
|
138
|
-
end: string
|
|
139
|
-
label: string
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export interface CreateReportOptions {
|
|
143
|
-
name: string
|
|
144
|
-
mappingId: string
|
|
145
|
-
periodStart: string
|
|
146
|
-
periodEnd: string
|
|
147
|
-
taxonomyId?: string
|
|
148
|
-
periodType?: string
|
|
149
|
-
comparative?: boolean
|
|
150
|
-
/** When set, overrides periodStart/periodEnd/comparative with N explicit periods. */
|
|
151
|
-
periods?: PeriodSpecInput[]
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// ── Client ──────────────────────────────────────────────────────────────
|
|
155
|
-
|
|
156
|
-
export class ReportClient {
|
|
157
|
-
private config: {
|
|
158
|
-
baseUrl: string
|
|
159
|
-
credentials?: 'include' | 'same-origin' | 'omit'
|
|
160
|
-
headers?: Record<string, string>
|
|
161
|
-
token?: string
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
constructor(config: {
|
|
165
|
-
baseUrl: string
|
|
166
|
-
credentials?: 'include' | 'same-origin' | 'omit'
|
|
167
|
-
headers?: Record<string, string>
|
|
168
|
-
token?: string
|
|
169
|
-
}) {
|
|
170
|
-
this.config = config
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Create a report — generates facts for all structures in the taxonomy.
|
|
175
|
-
*/
|
|
176
|
-
async create(graphId: string, options: CreateReportOptions): Promise<Report> {
|
|
177
|
-
const body: CreateReportRequest = {
|
|
178
|
-
name: options.name,
|
|
179
|
-
mapping_id: options.mappingId,
|
|
180
|
-
period_start: options.periodStart,
|
|
181
|
-
period_end: options.periodEnd,
|
|
182
|
-
taxonomy_id: options.taxonomyId ?? 'tax_usgaap_reporting',
|
|
183
|
-
period_type: options.periodType ?? 'quarterly',
|
|
184
|
-
comparative: options.comparative ?? true,
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (options.periods && options.periods.length > 0) {
|
|
188
|
-
body.periods = options.periods
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const response = await createReport({
|
|
192
|
-
path: { graph_id: graphId },
|
|
193
|
-
body,
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
if (response.error) {
|
|
197
|
-
throw new Error(`Create report failed: ${JSON.stringify(response.error)}`)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return this._toReport(response.data as ReportResponse)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* List all reports for a graph (includes received shared reports).
|
|
205
|
-
*/
|
|
206
|
-
async list(graphId: string): Promise<Report[]> {
|
|
207
|
-
const response = await listReports({
|
|
208
|
-
path: { graph_id: graphId },
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
if (response.error) {
|
|
212
|
-
throw new Error(`List reports failed: ${JSON.stringify(response.error)}`)
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const data = response.data as ReportListResponse
|
|
216
|
-
return (data.reports ?? []).map((r) => this._toReport(r))
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Get a report with its available structures.
|
|
221
|
-
*/
|
|
222
|
-
async get(graphId: string, reportId: string): Promise<Report> {
|
|
223
|
-
const response = await getReport({
|
|
224
|
-
path: { graph_id: graphId, report_id: reportId },
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
if (response.error) {
|
|
228
|
-
throw new Error(`Get report failed: ${JSON.stringify(response.error)}`)
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
return this._toReport(response.data as ReportResponse)
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Render a financial statement — facts viewed through a structure.
|
|
236
|
-
*
|
|
237
|
-
* @param structureType - income_statement, balance_sheet, cash_flow_statement
|
|
238
|
-
*/
|
|
239
|
-
async statement(
|
|
240
|
-
graphId: string,
|
|
241
|
-
reportId: string,
|
|
242
|
-
structureType: string
|
|
243
|
-
): Promise<StatementData> {
|
|
244
|
-
const response = await getStatement({
|
|
245
|
-
path: { graph_id: graphId, report_id: reportId, structure_type: structureType },
|
|
246
|
-
})
|
|
247
|
-
|
|
248
|
-
if (response.error) {
|
|
249
|
-
throw new Error(`Get statement failed: ${JSON.stringify(response.error)}`)
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
const data = response.data as StatementResponse
|
|
253
|
-
return {
|
|
254
|
-
reportId: data.report_id,
|
|
255
|
-
structureId: data.structure_id,
|
|
256
|
-
structureName: data.structure_name,
|
|
257
|
-
structureType: data.structure_type,
|
|
258
|
-
periods: (data.periods ?? []).map((p) => ({
|
|
259
|
-
start: p.start,
|
|
260
|
-
end: p.end,
|
|
261
|
-
label: p.label,
|
|
262
|
-
})),
|
|
263
|
-
rows: (data.rows ?? []).map((r: FactRowResponse) => ({
|
|
264
|
-
elementId: r.element_id,
|
|
265
|
-
elementQname: r.element_qname,
|
|
266
|
-
elementName: r.element_name,
|
|
267
|
-
classification: r.classification,
|
|
268
|
-
values: r.values ?? [],
|
|
269
|
-
isSubtotal: r.is_subtotal ?? false,
|
|
270
|
-
depth: r.depth ?? 0,
|
|
271
|
-
})),
|
|
272
|
-
validation: data.validation
|
|
273
|
-
? {
|
|
274
|
-
passed: (data.validation as ValidationCheckResponse).passed,
|
|
275
|
-
checks: (data.validation as ValidationCheckResponse).checks,
|
|
276
|
-
failures: (data.validation as ValidationCheckResponse).failures,
|
|
277
|
-
warnings: (data.validation as ValidationCheckResponse).warnings,
|
|
278
|
-
}
|
|
279
|
-
: null,
|
|
280
|
-
unmappedCount: data.unmapped_count ?? 0,
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Regenerate a report with new period dates.
|
|
286
|
-
*/
|
|
287
|
-
async regenerate(
|
|
288
|
-
graphId: string,
|
|
289
|
-
reportId: string,
|
|
290
|
-
periodStart: string,
|
|
291
|
-
periodEnd: string
|
|
292
|
-
): Promise<Report> {
|
|
293
|
-
const response = await regenerateReport({
|
|
294
|
-
path: { graph_id: graphId, report_id: reportId },
|
|
295
|
-
body: { period_start: periodStart, period_end: periodEnd } as RegenerateReportRequest,
|
|
296
|
-
})
|
|
297
|
-
|
|
298
|
-
if (response.error) {
|
|
299
|
-
throw new Error(`Regenerate report failed: ${JSON.stringify(response.error)}`)
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
return this._toReport(response.data as ReportResponse)
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Delete a report and its generated facts.
|
|
307
|
-
*/
|
|
308
|
-
async delete(graphId: string, reportId: string): Promise<void> {
|
|
309
|
-
const response = await deleteReport({
|
|
310
|
-
path: { graph_id: graphId, report_id: reportId },
|
|
311
|
-
})
|
|
312
|
-
|
|
313
|
-
if (response.error) {
|
|
314
|
-
throw new Error(`Delete report failed: ${JSON.stringify(response.error)}`)
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Share a published report to all members of a publish list (snapshot copy).
|
|
320
|
-
*/
|
|
321
|
-
async share(graphId: string, reportId: string, publishListId: string): Promise<ShareResult> {
|
|
322
|
-
const response = await shareReport({
|
|
323
|
-
path: { graph_id: graphId, report_id: reportId },
|
|
324
|
-
body: { publish_list_id: publishListId },
|
|
325
|
-
})
|
|
326
|
-
|
|
327
|
-
if (response.error) {
|
|
328
|
-
throw new Error(`Share report failed: ${JSON.stringify(response.error)}`)
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const data = response.data as ShareReportResponse
|
|
332
|
-
return {
|
|
333
|
-
reportId: data.report_id,
|
|
334
|
-
results: (data.results ?? []).map((r) => ({
|
|
335
|
-
targetGraphId: r.target_graph_id,
|
|
336
|
-
status: r.status as 'shared' | 'error',
|
|
337
|
-
error: r.error ?? null,
|
|
338
|
-
factCount: r.fact_count ?? 0,
|
|
339
|
-
})),
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/** Check if a report was received via sharing (vs locally created). */
|
|
344
|
-
isSharedReport(report: Report): boolean {
|
|
345
|
-
return report.sourceGraphId !== null
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// ── Publish Lists ────────────────────────────────────────────────────
|
|
349
|
-
|
|
350
|
-
async listPublishLists(graphId: string): Promise<PublishList[]> {
|
|
351
|
-
const response = await listPublishLists({
|
|
352
|
-
path: { graph_id: graphId },
|
|
353
|
-
})
|
|
354
|
-
if (response.error) {
|
|
355
|
-
throw new Error(`List publish lists failed: ${JSON.stringify(response.error)}`)
|
|
356
|
-
}
|
|
357
|
-
const data = response.data as PublishListListResponse
|
|
358
|
-
return (data.publish_lists ?? []).map((pl) => this._toPublishList(pl))
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
async createPublishList(
|
|
362
|
-
graphId: string,
|
|
363
|
-
name: string,
|
|
364
|
-
description?: string
|
|
365
|
-
): Promise<PublishList> {
|
|
366
|
-
const response = await createPublishList({
|
|
367
|
-
path: { graph_id: graphId },
|
|
368
|
-
body: { name, description: description ?? null },
|
|
369
|
-
})
|
|
370
|
-
if (response.error) {
|
|
371
|
-
throw new Error(`Create publish list failed: ${JSON.stringify(response.error)}`)
|
|
372
|
-
}
|
|
373
|
-
return this._toPublishList(response.data as PublishListResponse)
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
async getPublishList(graphId: string, listId: string): Promise<PublishListDetail> {
|
|
377
|
-
const response = await getPublishList({
|
|
378
|
-
path: { graph_id: graphId, list_id: listId },
|
|
379
|
-
})
|
|
380
|
-
if (response.error) {
|
|
381
|
-
throw new Error(`Get publish list failed: ${JSON.stringify(response.error)}`)
|
|
382
|
-
}
|
|
383
|
-
const data = response.data as PublishListDetailResponse
|
|
384
|
-
return {
|
|
385
|
-
...this._toPublishList(data),
|
|
386
|
-
members: (data.members ?? []).map((m) => this._toMember(m)),
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
async updatePublishList(
|
|
391
|
-
graphId: string,
|
|
392
|
-
listId: string,
|
|
393
|
-
updates: { name?: string; description?: string }
|
|
394
|
-
): Promise<PublishList> {
|
|
395
|
-
const response = await updatePublishList({
|
|
396
|
-
path: { graph_id: graphId, list_id: listId },
|
|
397
|
-
body: updates,
|
|
398
|
-
})
|
|
399
|
-
if (response.error) {
|
|
400
|
-
throw new Error(`Update publish list failed: ${JSON.stringify(response.error)}`)
|
|
401
|
-
}
|
|
402
|
-
return this._toPublishList(response.data as PublishListResponse)
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
async deletePublishList(graphId: string, listId: string): Promise<void> {
|
|
406
|
-
const response = await deletePublishList({
|
|
407
|
-
path: { graph_id: graphId, list_id: listId },
|
|
408
|
-
})
|
|
409
|
-
if (response.error) {
|
|
410
|
-
throw new Error(`Delete publish list failed: ${JSON.stringify(response.error)}`)
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
async addMembers(
|
|
415
|
-
graphId: string,
|
|
416
|
-
listId: string,
|
|
417
|
-
targetGraphIds: string[]
|
|
418
|
-
): Promise<PublishListMember[]> {
|
|
419
|
-
const response = await addPublishListMembers({
|
|
420
|
-
path: { graph_id: graphId, list_id: listId },
|
|
421
|
-
body: { target_graph_ids: targetGraphIds },
|
|
422
|
-
})
|
|
423
|
-
if (response.error) {
|
|
424
|
-
throw new Error(`Add members failed: ${JSON.stringify(response.error)}`)
|
|
425
|
-
}
|
|
426
|
-
return ((response.data as PublishListMemberResponse[]) ?? []).map((m) => this._toMember(m))
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
async removeMember(graphId: string, listId: string, memberId: string): Promise<void> {
|
|
430
|
-
const response = await removePublishListMember({
|
|
431
|
-
path: { graph_id: graphId, list_id: listId, member_id: memberId },
|
|
432
|
-
})
|
|
433
|
-
if (response.error) {
|
|
434
|
-
throw new Error(`Remove member failed: ${JSON.stringify(response.error)}`)
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
private _toPublishList(pl: PublishListResponse): PublishList {
|
|
439
|
-
return {
|
|
440
|
-
id: pl.id,
|
|
441
|
-
name: pl.name,
|
|
442
|
-
description: pl.description ?? null,
|
|
443
|
-
memberCount: pl.member_count ?? 0,
|
|
444
|
-
createdBy: pl.created_by,
|
|
445
|
-
createdAt: pl.created_at,
|
|
446
|
-
updatedAt: pl.updated_at,
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
private _toMember(m: PublishListMemberResponse): PublishListMember {
|
|
451
|
-
return {
|
|
452
|
-
id: m.id,
|
|
453
|
-
targetGraphId: m.target_graph_id,
|
|
454
|
-
targetGraphName: m.target_graph_name ?? null,
|
|
455
|
-
targetOrgName: m.target_org_name ?? null,
|
|
456
|
-
addedBy: m.added_by,
|
|
457
|
-
addedAt: m.added_at,
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
private _toReport(r: ReportResponse): Report {
|
|
462
|
-
return {
|
|
463
|
-
id: r.id,
|
|
464
|
-
name: r.name,
|
|
465
|
-
taxonomyId: r.taxonomy_id,
|
|
466
|
-
generationStatus: r.generation_status,
|
|
467
|
-
periodType: r.period_type,
|
|
468
|
-
periodStart: r.period_start ?? null,
|
|
469
|
-
periodEnd: r.period_end ?? null,
|
|
470
|
-
comparative: r.comparative,
|
|
471
|
-
mappingId: r.mapping_id ?? null,
|
|
472
|
-
aiGenerated: r.ai_generated ?? false,
|
|
473
|
-
createdAt: r.created_at,
|
|
474
|
-
lastGenerated: r.last_generated ?? null,
|
|
475
|
-
structures: (r.structures ?? []).map((s: StructureSummary) => ({
|
|
476
|
-
id: s.id,
|
|
477
|
-
name: s.name,
|
|
478
|
-
structureType: s.structure_type,
|
|
479
|
-
})),
|
|
480
|
-
entityName: r.entity_name ?? null,
|
|
481
|
-
sourceGraphId: r.source_graph_id ?? null,
|
|
482
|
-
sourceReportId: r.source_report_id ?? null,
|
|
483
|
-
sharedAt: r.shared_at ?? null,
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core SSE (Server-Sent Events) client for RoboSystems API
|
|
3
|
-
* Provides automatic reconnection, event replay, and type-safe event handling
|
|
4
|
-
*
|
|
5
|
-
* SECURITY NOTE: When using JWT authentication, tokens are passed as query parameters
|
|
6
|
-
* due to EventSource API limitations. This means tokens may appear in:
|
|
7
|
-
* - Server access logs
|
|
8
|
-
* - Proxy logs
|
|
9
|
-
* - Browser history
|
|
10
|
-
* - Referer headers
|
|
11
|
-
*
|
|
12
|
-
* For production environments with sensitive data, consider:
|
|
13
|
-
* - Using cookie-based authentication instead
|
|
14
|
-
* - Implementing a WebSocket-based alternative
|
|
15
|
-
* - Using short-lived tokens that expire quickly
|
|
16
|
-
* - Ensuring all connections use HTTPS
|
|
17
|
-
*/
|
|
18
|
-
export interface SSEConfig {
|
|
19
|
-
baseUrl: string;
|
|
20
|
-
credentials?: 'include' | 'same-origin' | 'omit';
|
|
21
|
-
headers?: Record<string, string>;
|
|
22
|
-
token?: string;
|
|
23
|
-
maxRetries?: number;
|
|
24
|
-
retryDelay?: number;
|
|
25
|
-
heartbeatInterval?: number;
|
|
26
|
-
}
|
|
27
|
-
export interface SSEEvent {
|
|
28
|
-
event: string;
|
|
29
|
-
data: any;
|
|
30
|
-
id?: string;
|
|
31
|
-
retry?: number;
|
|
32
|
-
timestamp: Date;
|
|
33
|
-
}
|
|
34
|
-
export declare enum EventType {
|
|
35
|
-
OPERATION_STARTED = "operation_started",
|
|
36
|
-
OPERATION_PROGRESS = "operation_progress",
|
|
37
|
-
OPERATION_COMPLETED = "operation_completed",
|
|
38
|
-
OPERATION_ERROR = "operation_error",
|
|
39
|
-
OPERATION_CANCELLED = "operation_cancelled",
|
|
40
|
-
DATA_CHUNK = "data_chunk",
|
|
41
|
-
METADATA = "metadata",
|
|
42
|
-
HEARTBEAT = "heartbeat",
|
|
43
|
-
QUEUE_UPDATE = "queue_update"
|
|
44
|
-
}
|
|
45
|
-
export declare class SSEClient {
|
|
46
|
-
private config;
|
|
47
|
-
private eventSource?;
|
|
48
|
-
private reconnectAttempts;
|
|
49
|
-
private lastEventId?;
|
|
50
|
-
private closed;
|
|
51
|
-
private listeners;
|
|
52
|
-
constructor(config: SSEConfig);
|
|
53
|
-
connect(operationId: string, fromSequence?: number): Promise<void>;
|
|
54
|
-
private handleMessage;
|
|
55
|
-
private handleTypedEvent;
|
|
56
|
-
private handleError;
|
|
57
|
-
on(event: string, listener: (data: any) => void): void;
|
|
58
|
-
off(event: string, listener: (data: any) => void): void;
|
|
59
|
-
private emit;
|
|
60
|
-
close(): void;
|
|
61
|
-
isConnected(): boolean;
|
|
62
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
"use strict";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.SSEClient = exports.EventType = void 0;
|
|
5
|
-
var EventType;
|
|
6
|
-
(function (EventType) {
|
|
7
|
-
EventType["OPERATION_STARTED"] = "operation_started";
|
|
8
|
-
EventType["OPERATION_PROGRESS"] = "operation_progress";
|
|
9
|
-
EventType["OPERATION_COMPLETED"] = "operation_completed";
|
|
10
|
-
EventType["OPERATION_ERROR"] = "operation_error";
|
|
11
|
-
EventType["OPERATION_CANCELLED"] = "operation_cancelled";
|
|
12
|
-
EventType["DATA_CHUNK"] = "data_chunk";
|
|
13
|
-
EventType["METADATA"] = "metadata";
|
|
14
|
-
EventType["HEARTBEAT"] = "heartbeat";
|
|
15
|
-
EventType["QUEUE_UPDATE"] = "queue_update";
|
|
16
|
-
})(EventType || (exports.EventType = EventType = {}));
|
|
17
|
-
class SSEClient {
|
|
18
|
-
constructor(config) {
|
|
19
|
-
this.reconnectAttempts = 0;
|
|
20
|
-
this.closed = false;
|
|
21
|
-
this.listeners = new Map();
|
|
22
|
-
this.config = {
|
|
23
|
-
maxRetries: 5,
|
|
24
|
-
retryDelay: 1000,
|
|
25
|
-
heartbeatInterval: 30000,
|
|
26
|
-
...config,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
async connect(operationId, fromSequence = 0) {
|
|
30
|
-
return new Promise((resolve, reject) => {
|
|
31
|
-
let url = `${this.config.baseUrl}/v1/operations/${operationId}/stream?from_sequence=${fromSequence}`;
|
|
32
|
-
// Add JWT token as query parameter if provided
|
|
33
|
-
// WARNING: EventSource API doesn't support custom headers, so tokens are passed via query param
|
|
34
|
-
// This has security implications - see class documentation
|
|
35
|
-
if (this.config.token) {
|
|
36
|
-
url += `&token=${encodeURIComponent(this.config.token)}`;
|
|
37
|
-
}
|
|
38
|
-
this.eventSource = new EventSource(url, {
|
|
39
|
-
withCredentials: this.config.credentials === 'include',
|
|
40
|
-
});
|
|
41
|
-
const connectionTimeout = setTimeout(() => {
|
|
42
|
-
reject(new Error('Connection timeout'));
|
|
43
|
-
this.close();
|
|
44
|
-
}, 10000);
|
|
45
|
-
this.eventSource.onopen = () => {
|
|
46
|
-
clearTimeout(connectionTimeout);
|
|
47
|
-
this.reconnectAttempts = 0;
|
|
48
|
-
this.emit('connected', null);
|
|
49
|
-
resolve();
|
|
50
|
-
};
|
|
51
|
-
this.eventSource.onerror = (error) => {
|
|
52
|
-
clearTimeout(connectionTimeout);
|
|
53
|
-
if (!this.closed) {
|
|
54
|
-
this.handleError(error, operationId, fromSequence);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
this.eventSource.onmessage = (event) => {
|
|
58
|
-
this.handleMessage(event);
|
|
59
|
-
};
|
|
60
|
-
// Set up specific event listeners
|
|
61
|
-
Object.values(EventType).forEach((eventType) => {
|
|
62
|
-
this.eventSource.addEventListener(eventType, (event) => {
|
|
63
|
-
this.handleTypedEvent(eventType, event);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
handleMessage(event) {
|
|
69
|
-
try {
|
|
70
|
-
const data = JSON.parse(event.data);
|
|
71
|
-
const sseEvent = {
|
|
72
|
-
event: event.type || 'message',
|
|
73
|
-
data,
|
|
74
|
-
id: event.lastEventId,
|
|
75
|
-
timestamp: new Date(),
|
|
76
|
-
};
|
|
77
|
-
this.lastEventId = event.lastEventId;
|
|
78
|
-
this.emit('event', sseEvent);
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
this.emit('parse_error', { error, rawData: event.data });
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
handleTypedEvent(eventType, event) {
|
|
85
|
-
try {
|
|
86
|
-
const data = JSON.parse(event.data);
|
|
87
|
-
this.lastEventId = event.lastEventId;
|
|
88
|
-
this.emit(eventType, data);
|
|
89
|
-
// Check for completion events
|
|
90
|
-
if (eventType === EventType.OPERATION_COMPLETED ||
|
|
91
|
-
eventType === EventType.OPERATION_ERROR ||
|
|
92
|
-
eventType === EventType.OPERATION_CANCELLED) {
|
|
93
|
-
this.close();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
this.emit('parse_error', { error, rawData: event.data });
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
async handleError(error, operationId, fromSequence) {
|
|
101
|
-
if (this.closed)
|
|
102
|
-
return;
|
|
103
|
-
if (this.reconnectAttempts < this.config.maxRetries) {
|
|
104
|
-
this.reconnectAttempts++;
|
|
105
|
-
const delay = this.config.retryDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
106
|
-
this.emit('reconnecting', {
|
|
107
|
-
attempt: this.reconnectAttempts,
|
|
108
|
-
delay,
|
|
109
|
-
lastEventId: this.lastEventId,
|
|
110
|
-
});
|
|
111
|
-
setTimeout(() => {
|
|
112
|
-
const resumeFrom = this.lastEventId ? parseInt(this.lastEventId) + 1 : fromSequence;
|
|
113
|
-
this.connect(operationId, resumeFrom).catch(() => {
|
|
114
|
-
// Error handled in connect
|
|
115
|
-
});
|
|
116
|
-
}, delay);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
this.emit('max_retries_exceeded', error);
|
|
120
|
-
this.close();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
on(event, listener) {
|
|
124
|
-
if (!this.listeners.has(event)) {
|
|
125
|
-
this.listeners.set(event, new Set());
|
|
126
|
-
}
|
|
127
|
-
this.listeners.get(event).add(listener);
|
|
128
|
-
}
|
|
129
|
-
off(event, listener) {
|
|
130
|
-
const listeners = this.listeners.get(event);
|
|
131
|
-
if (listeners) {
|
|
132
|
-
listeners.delete(listener);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
emit(event, data) {
|
|
136
|
-
const listeners = this.listeners.get(event);
|
|
137
|
-
if (listeners) {
|
|
138
|
-
listeners.forEach((listener) => listener(data));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
close() {
|
|
142
|
-
this.closed = true;
|
|
143
|
-
if (this.eventSource) {
|
|
144
|
-
this.eventSource.close();
|
|
145
|
-
this.eventSource = undefined;
|
|
146
|
-
}
|
|
147
|
-
this.emit('closed', null);
|
|
148
|
-
this.listeners.clear();
|
|
149
|
-
}
|
|
150
|
-
isConnected() {
|
|
151
|
-
return this.eventSource !== undefined && this.eventSource.readyState === EventSource.OPEN;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
exports.SSEClient = SSEClient;
|