@firela/api-types 0.0.0-canary.e1146c01 → 0.0.0-canary.e6edf4ac

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.
@@ -17,6 +17,8 @@ import type {
17
17
  AccountControllerCloseResponse,
18
18
  AccountControllerReopenData,
19
19
  AccountControllerReopenResponse,
20
+ AccountControllerAddOpeningBalanceData,
21
+ AccountControllerAddOpeningBalanceResponse,
20
22
  AccountStandardsControllerGetTemplatesData,
21
23
  AccountStandardsControllerGetTemplatesResponse,
22
24
  AccountStandardsControllerGetTemplateMetadataData,
@@ -97,6 +99,48 @@ import type {
97
99
  CommodityControllerGetOrCreateResponse,
98
100
  CommodityControllerBulkCreateData,
99
101
  CommodityControllerBulkCreateResponse,
102
+ ReportingControllerGetPortfolioTrendsData,
103
+ ReportingControllerGetPortfolioTrendsResponse,
104
+ ReportingControllerGetCashFlowTrendsData,
105
+ ReportingControllerGetCashFlowTrendsResponse,
106
+ ReportingControllerGenerateSnapshotData,
107
+ ReportingControllerGenerateSnapshotResponse,
108
+ ReportingControllerBackfillSnapshotsData,
109
+ ReportingControllerBackfillSnapshotsResponse,
110
+ PriceControllerCreateData,
111
+ PriceControllerCreateResponse,
112
+ PriceControllerFindAllData,
113
+ PriceControllerFindAllResponse,
114
+ PriceControllerFindOneData,
115
+ PriceControllerFindOneResponse,
116
+ PriceControllerUpdateData,
117
+ PriceControllerUpdateResponse,
118
+ PriceControllerDeleteData,
119
+ PriceControllerDeleteResponse,
120
+ PriceControllerBulkCreateData,
121
+ PriceControllerBulkCreateResponse,
122
+ UserControllerDeleteOwnUserData,
123
+ UserControllerDeleteOwnUserResponse,
124
+ UserControllerGetUserData,
125
+ UserControllerGetUserResponse,
126
+ UserControllerSignupUserData,
127
+ UserControllerSignupUserResponse,
128
+ UserControllerDeleteUserData,
129
+ UserControllerDeleteUserResponse,
130
+ UserControllerGetUserInfoData,
131
+ UserControllerGetUserInfoResponse,
132
+ UserControllerUpdateUserSettingData,
133
+ UserControllerUpdateUserSettingResponse,
134
+ UserControllerGetAllUserSettingsByPageData,
135
+ UserControllerGetAllUserSettingsByPageResponse,
136
+ UserControllerGetAssetLiabilitySummaryResponse,
137
+ PropertyControllerGetAllResponse,
138
+ PropertyControllerGetByKeyData,
139
+ PropertyControllerGetByKeyResponse,
140
+ PropertyControllerUpdateData,
141
+ PropertyControllerUpdateResponse,
142
+ PropertyControllerDeleteData,
143
+ PropertyControllerDeleteResponse,
100
144
  RecurringRuleControllerCreateData,
101
145
  RecurringRuleControllerCreateResponse,
102
146
  RecurringRuleControllerFindAllData,
@@ -149,28 +193,30 @@ import type {
149
193
  TransactionRuleControllerDeleteResponse,
150
194
  TransactionRuleControllerTestData,
151
195
  TransactionRuleControllerTestResponse,
152
- UserControllerDeleteOwnUserData,
153
- UserControllerDeleteOwnUserResponse,
154
- UserControllerGetUserData,
155
- UserControllerGetUserResponse,
156
- UserControllerSignupUserData,
157
- UserControllerSignupUserResponse,
158
- UserControllerDeleteUserData,
159
- UserControllerDeleteUserResponse,
160
- UserControllerGetUserInfoData,
161
- UserControllerGetUserInfoResponse,
162
- UserControllerUpdateUserSettingData,
163
- UserControllerUpdateUserSettingResponse,
164
- UserControllerGetAllUserSettingsByPageData,
165
- UserControllerGetAllUserSettingsByPageResponse,
166
- UserControllerGetAssetLiabilitySummaryResponse,
167
- PropertyControllerGetAllResponse,
168
- PropertyControllerGetByKeyData,
169
- PropertyControllerGetByKeyResponse,
170
- PropertyControllerUpdateData,
171
- PropertyControllerUpdateResponse,
172
- PropertyControllerDeleteData,
173
- PropertyControllerDeleteResponse,
196
+ CategoryCatalogControllerListData,
197
+ CategoryCatalogControllerListResponse,
198
+ EventControllerCreateData,
199
+ EventControllerCreateResponse,
200
+ EventControllerFindAllData,
201
+ EventControllerFindAllResponse,
202
+ EventControllerFindOneData,
203
+ EventControllerFindOneResponse,
204
+ EventControllerUpdateData,
205
+ EventControllerUpdateResponse,
206
+ EventControllerDeleteData,
207
+ EventControllerDeleteResponse,
208
+ EventControllerGetSliceData,
209
+ EventControllerGetSliceResponse,
210
+ OnboardingControllerBootstrapData,
211
+ OnboardingControllerBootstrapResponse,
212
+ ReconciliationControllerComputeData,
213
+ ReconciliationControllerComputeResponse,
214
+ ReconciliationControllerAssertData,
215
+ ReconciliationControllerAssertResponse,
216
+ ReconciliationControllerPadData,
217
+ ReconciliationControllerPadResponse,
218
+ ReconciliationControllerHistoryData,
219
+ ReconciliationControllerHistoryResponse,
174
220
  ExportControllerExportBeancountResponse,
175
221
  FileImportControllerImportFileData,
176
222
  FileImportControllerImportFileResponse,
@@ -184,45 +230,60 @@ import type {
184
230
  ImporterConfigControllerUpdateConfigResponse,
185
231
  ImporterConfigControllerResetConfigData,
186
232
  ImporterConfigControllerResetConfigResponse,
187
- PlatformControllerFindAllResponse,
188
- PlatformControllerCreateData,
189
- PlatformControllerCreateResponse,
190
- PlatformControllerGetPlatformListResponse,
191
- PlatformControllerMatchPlatformsData,
192
- PlatformControllerMatchPlatformsResponse,
193
- PlatformControllerUpdateData,
194
- PlatformControllerUpdateResponse,
195
- PlatformControllerDeleteData,
196
- PlatformControllerDeleteResponse,
197
233
  ProviderSyncControllerSyncData,
198
234
  ProviderSyncControllerSyncResponse,
199
235
  ProviderSyncControllerGetSupportedProvidersData,
200
236
  ProviderSyncControllerGetSupportedProvidersResponse,
201
237
  ProviderSyncControllerIsProviderSupportedData,
202
238
  ProviderSyncControllerIsProviderSupportedResponse,
239
+ ExternalAccountLinkControllerCreateData,
240
+ ExternalAccountLinkControllerCreateResponse,
241
+ ExternalAccountLinkControllerFindAllData,
242
+ ExternalAccountLinkControllerFindAllResponse,
243
+ ExternalAccountLinkControllerFindOneData,
244
+ ExternalAccountLinkControllerFindOneResponse,
245
+ ExternalAccountLinkControllerRemoveData,
246
+ ExternalAccountLinkControllerRemoveResponse,
203
247
  TelemetryControllerReportTelemetryData,
204
248
  TelemetryControllerReportTelemetryResponse,
249
+ TelemetryControllerReportCoverageMissData,
250
+ TelemetryControllerReportCoverageMissResponse,
251
+ TelemetryControllerGetCoverageMetricsData,
252
+ TelemetryControllerGetCoverageMetricsResponse,
205
253
  NlpControllerProcessNaturalLanguageData,
206
254
  NlpControllerProcessNaturalLanguageResponse,
207
255
  NlpControllerClearSessionData,
208
256
  NlpControllerClearSessionResponse,
209
257
  NlpControllerGetSessionData,
210
258
  NlpControllerGetSessionResponse,
259
+ PlatformControllerFindAllResponse,
260
+ PlatformControllerCreateData,
261
+ PlatformControllerCreateResponse,
262
+ PlatformControllerGetPlatformListData,
263
+ PlatformControllerGetPlatformListResponse,
264
+ PlatformControllerMatchPlatformsData,
265
+ PlatformControllerMatchPlatformsResponse,
266
+ PlatformControllerGetPlatformStandardsData,
267
+ PlatformControllerGetPlatformStandardsResponse,
268
+ PlatformControllerUpdateData,
269
+ PlatformControllerUpdateResponse,
270
+ PlatformControllerDeleteData,
271
+ PlatformControllerDeleteResponse,
211
272
  DashboardControllerGetNetWorthData,
212
273
  DashboardControllerGetNetWorthResponse,
213
274
  DashboardControllerGetAccountsData,
214
275
  DashboardControllerGetAccountsResponse,
215
276
  DashboardControllerGetCashFlowData,
216
277
  DashboardControllerGetCashFlowResponse,
217
- ReportingControllerGetPortfolioTrendsData,
218
- ReportingControllerGetPortfolioTrendsResponse,
219
- ReportingControllerGenerateSnapshotData,
220
- ReportingControllerGenerateSnapshotResponse,
221
- ReportingControllerBackfillSnapshotsData,
222
- ReportingControllerBackfillSnapshotsResponse,
278
+ DashboardControllerGetExpensesData,
279
+ DashboardControllerGetExpensesResponse,
280
+ HoldingPnlControllerGetHoldingPnlData,
281
+ HoldingPnlControllerGetHoldingPnlResponse,
223
282
  ApiKeysControllerCreateApiKeyResponse,
224
283
  AuthControllerAccessTokenLoginData,
225
284
  AuthControllerAccessTokenLoginResponse,
285
+ ParserContributionControllerCreateData,
286
+ ParserContributionControllerCreateResponse,
226
287
  CacheControllerFlushCacheResponse,
227
288
  ExchangeRateControllerGetExchangeRateData,
228
289
  ExchangeRateControllerGetExchangeRateResponse,
@@ -234,7 +295,11 @@ import type {
234
295
  HealthControllerResetCircuitBreakerData,
235
296
  HealthControllerResetCircuitBreakerResponse,
236
297
  HealthControllerGetMetricsResponse,
237
- InfoControllerGetInfoResponse
298
+ InfoControllerGetInfoResponse,
299
+ SymbolControllerSearchData,
300
+ SymbolControllerSearchResponse,
301
+ SymbolControllerGetQuoteData,
302
+ SymbolControllerGetQuoteResponse
238
303
  } from './types.gen';
239
304
 
240
305
  export class BeanAccountsService {
@@ -272,7 +337,7 @@ export class BeanAccountsService {
272
337
  * @param data.type Filter by account type
273
338
  * @param data.status Filter by status
274
339
  * @param data.isCustom Filter by custom (user-created) accounts only
275
- * @param data.search Search term for path or i18nKey
340
+ * @param data.search Search term for account path
276
341
  * @param data.limit Maximum number of results
277
342
  * @param data.offset Number of results to skip
278
343
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -353,7 +418,7 @@ export class BeanAccountsService {
353
418
 
354
419
  /**
355
420
  * Delete account
356
- * Deletes an account (only if no transactions)
421
+ * Deletes an account (only if no active transactions; voided/superseded residual postings are cleaned up)
357
422
  * @param data The data for the request.
358
423
  * @param data.id Account UUID
359
424
  * @param data.region Region code for tenant context
@@ -372,7 +437,7 @@ export class BeanAccountsService {
372
437
  },
373
438
  errors: {
374
439
  404: 'Account not found',
375
- 409: 'Account has transactions and cannot be deleted'
440
+ 409: 'Account has active transactions and cannot be deleted'
376
441
  }
377
442
  });
378
443
  }
@@ -434,6 +499,35 @@ export class BeanAccountsService {
434
499
  }
435
500
  });
436
501
  }
502
+
503
+ /**
504
+ * Post an opening-balance transaction
505
+ * Posts a double-entry opening-balance transaction against Equity:Opening-Balances for an existing Assets/Liabilities account. At most one active opening balance per account.
506
+ * @param data The data for the request.
507
+ * @param data.id Account UUID
508
+ * @param data.region Region code for tenant context
509
+ * @param data.requestBody
510
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
511
+ * @throws ApiError
512
+ */
513
+ public static accountControllerAddOpeningBalance(
514
+ data: AccountControllerAddOpeningBalanceData
515
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
516
+ return __request(OpenAPI, {
517
+ method: 'POST',
518
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
519
+ path: {
520
+ id: data.id,
521
+ region: data.region
522
+ },
523
+ body: data.requestBody,
524
+ mediaType: 'application/json',
525
+ errors: {
526
+ 404: 'Account not found',
527
+ 409: 'An opening balance already exists for this account'
528
+ }
529
+ });
530
+ }
437
531
  }
438
532
 
439
533
  export class BeanAccountStandardsService {
@@ -443,7 +537,7 @@ export class BeanAccountStandardsService {
443
537
  * @param data The data for the request.
444
538
  * @param data.region Region code (cn, us, de)
445
539
  * @param data.type Filter by account type
446
- * @param data.search Search term for path or description
540
+ * @param data.search Search term for path, description, aliases, or localized display name
447
541
  * @returns AccountStandardListResponseDto Account templates retrieved successfully
448
542
  * @throws ApiError
449
543
  */
@@ -465,7 +559,7 @@ export class BeanAccountStandardsService {
465
559
 
466
560
  /**
467
561
  * Get template metadata for an account path
468
- * Returns extendable status and root type for a template path.
562
+ * Returns root type for a template path.
469
563
  * @param data The data for the request.
470
564
  * @param data.region Region code for tenant context
471
565
  * @param data.path Account path to check
@@ -548,9 +642,11 @@ export class BeanTransactionsService {
548
642
  * @param data.offset Number of items to skip (default: 0)
549
643
  * @param data.dateFrom Filter by start date (inclusive), format: YYYY-MM-DD
550
644
  * @param data.dateTo Filter by end date (inclusive), format: YYYY-MM-DD
551
- * @param data.status Filter by transaction status
645
+ * @param data.status Filter by transaction status: single value, comma-separated multi-value (e.g. VOIDED,SUPERSEDED), or ALL to include audit rows. Defaults to ACTIVE-only (ADR-0128; previously unfiltered — breaking change).
552
646
  * @param data.search Search in narration and payee fields (max 200 chars)
553
647
  * @param data.accountId Filter by account ID (transactions with postings to this account)
648
+ * @param data.category Filter by ADR-0075 functional category (Group segment); matches any posting to an account whose derived Group segment equals this value. Must be accompanied by flow (ADR-0126).
649
+ * @param data.flow Required when category is present (400 otherwise) and vice versa (ADR-0126). Restricts the category account set to the flow root (income → Income:, expense → Expenses:) and drives the per-leg sign normalization of row viewpointAmount and the summary. OpenAPI cannot express conditional requiredness — the pairing is enforced at runtime.
554
650
  * @returns TransactionListResponseDto Transaction list
555
651
  * @throws ApiError
556
652
  */
@@ -570,7 +666,9 @@ export class BeanTransactionsService {
570
666
  dateTo: data.dateTo,
571
667
  status: data.status,
572
668
  search: data.search,
573
- accountId: data.accountId
669
+ accountId: data.accountId,
670
+ category: data.category,
671
+ flow: data.flow
574
672
  },
575
673
  errors: {
576
674
  400: 'Validation failed',
@@ -758,7 +856,7 @@ export class BeanBalancesService {
758
856
  * Query account balance
759
857
  * Calculate account balance at a specific date for a single currency
760
858
  * @param data The data for the request.
761
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
859
+ * @param data.account Account name (e.g., "Assets:Checking")
762
860
  * @param data.region Region code for tenant context
763
861
  * @param data.date Date to calculate balance at (ISO 8601 format)
764
862
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -1283,7 +1381,7 @@ export class AdminPayeeProfilesService {
1283
1381
  * Removes verification status by setting verifiedAt to null.
1284
1382
  * @param data The data for the request.
1285
1383
  * @param data.id Payee profile ID (UUID)
1286
- * @returns PayeeProfileResponseDto Payee profile unverified successfully
1384
+ * @returns void Payee profile unverified successfully
1287
1385
  * @throws ApiError
1288
1386
  */
1289
1387
  public static payeeProfileAdminControllerUnverify(
@@ -1479,159 +1577,738 @@ export class BeanCommoditiesService {
1479
1577
  }
1480
1578
  }
1481
1579
 
1482
- export class RecurringRulesService {
1580
+ export class ReportingService {
1483
1581
  /**
1484
- * Create a new recurring rule
1485
- * Creates a new recurring transaction rule for the authenticated user
1582
+ * Get portfolio value trends
1583
+ *
1584
+ * Returns time series data of portfolio net worth.
1585
+ *
1586
+ * **Multi-currency Support:**
1587
+ * - `series[].byCurrency` - Currency breakdown for each data point
1588
+ * - `byCurrency` - Separate time series grouped by currency
1589
+ * - `warnings` - Exchange rate warnings if conversion failed
1590
+ *
1591
+ * **Parameters:**
1592
+ * - `period`: Time period (1m, 3m, 6m, 1y)
1593
+ * - `granularity`: Data granularity (day, week, month)
1594
+ *
1486
1595
  * @param data The data for the request.
1487
1596
  * @param data.region Region code for tenant context
1488
- * @param data.requestBody
1489
- * @returns RecurringRuleResponseDto Rule created successfully
1597
+ * @param data.period Time period
1598
+ * @param data.granularity Data granularity
1599
+ * @returns PortfolioTrendsResponseDto Trends retrieved successfully
1490
1600
  * @throws ApiError
1491
1601
  */
1492
- public static recurringRuleControllerCreate(
1493
- data: RecurringRuleControllerCreateData
1494
- ): CancelablePromise<RecurringRuleControllerCreateResponse> {
1602
+ public static reportingControllerGetPortfolioTrends(
1603
+ data: ReportingControllerGetPortfolioTrendsData
1604
+ ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
1495
1605
  return __request(OpenAPI, {
1496
- method: 'POST',
1497
- url: '/api/v1/{region}/bean/recurring-rules',
1606
+ method: 'GET',
1607
+ url: '/api/v1/{region}/reporting/portfolio/trends',
1498
1608
  path: {
1499
1609
  region: data.region
1500
1610
  },
1501
- body: data.requestBody,
1502
- mediaType: 'application/json',
1611
+ query: {
1612
+ period: data.period,
1613
+ granularity: data.granularity
1614
+ },
1503
1615
  errors: {
1504
- 400: 'Invalid input data (e.g., autoCreate without accounts)',
1505
- 409: 'Rule with same name already exists'
1616
+ 401: 'User not authenticated'
1506
1617
  }
1507
1618
  });
1508
1619
  }
1509
1620
 
1510
1621
  /**
1511
- * List recurring rules
1512
- * Returns all recurring rules for the authenticated user with optional filtering
1622
+ * Get cash-flow trends
1623
+ *
1624
+ * Monthly income / expense / netSavings over a fixed N-month window
1625
+ * (current month + N−1 prior). Missing months are zero-filled (flow metric).
1626
+ *
1627
+ * **Parameters:**
1628
+ * - `period`: 1m | 3m | 6m | 1y (default 6m)
1629
+ * - `granularity`: accepted for API symmetry; v1 returns month buckets
1630
+ *
1513
1631
  * @param data The data for the request.
1514
1632
  * @param data.region Region code for tenant context
1515
- * @param data.isActive Filter by active status
1516
- * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
1517
- * @param data.hasAutoCreate Filter by autoCreate enabled
1518
- * @returns RecurringRuleResponseDto Rules retrieved successfully
1633
+ * @param data.period Time period
1634
+ * @param data.granularity Data granularity (accepted for API symmetry; v1 returns month buckets)
1635
+ * @returns CashFlowTrendsResponseDto Cash-flow trends retrieved successfully
1519
1636
  * @throws ApiError
1520
1637
  */
1521
- public static recurringRuleControllerFindAll(
1522
- data: RecurringRuleControllerFindAllData
1523
- ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
1638
+ public static reportingControllerGetCashFlowTrends(
1639
+ data: ReportingControllerGetCashFlowTrendsData
1640
+ ): CancelablePromise<ReportingControllerGetCashFlowTrendsResponse> {
1524
1641
  return __request(OpenAPI, {
1525
1642
  method: 'GET',
1526
- url: '/api/v1/{region}/bean/recurring-rules',
1643
+ url: '/api/v1/{region}/reporting/cash-flow/trends',
1527
1644
  path: {
1528
1645
  region: data.region
1529
1646
  },
1530
1647
  query: {
1531
- isActive: data.isActive,
1532
- frequency: data.frequency,
1533
- hasAutoCreate: data.hasAutoCreate
1648
+ period: data.period,
1649
+ granularity: data.granularity
1650
+ },
1651
+ errors: {
1652
+ 401: 'User not authenticated'
1534
1653
  }
1535
1654
  });
1536
1655
  }
1537
1656
 
1538
1657
  /**
1539
- * Create recurring rule from transaction
1540
- * Auto-creates a recurring rule using transaction data. User only confirms frequency.
1658
+ * Generate portfolio snapshot
1659
+ *
1660
+ * Manually generate a portfolio snapshot for a specific date.
1661
+ *
1662
+ * **Multi-currency Support:**
1663
+ * - Fetches balances grouped by currency
1664
+ * - Uses user's baseCurrency setting for conversion
1665
+ * - Stores exchange rates and warnings
1666
+ *
1667
+ * **Use Cases:**
1668
+ * - Testing snapshot generation
1669
+ * - Force regeneration after data correction
1670
+ * - Initial setup for new users
1671
+ *
1541
1672
  * @param data The data for the request.
1542
- * @param data.transactionId Source transaction ID
1543
1673
  * @param data.region Region code for tenant context
1544
- * @param data.requestBody
1545
- * @returns RecurringRuleResponseDto Rule created successfully
1674
+ * @param data.requestBody Optional date (defaults to today)
1675
+ * @returns GenerateSnapshotResponse Snapshot generated successfully
1546
1676
  * @throws ApiError
1547
1677
  */
1548
- public static recurringRuleControllerCreateFromTransaction(
1549
- data: RecurringRuleControllerCreateFromTransactionData
1550
- ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
1678
+ public static reportingControllerGenerateSnapshot(
1679
+ data: ReportingControllerGenerateSnapshotData
1680
+ ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
1551
1681
  return __request(OpenAPI, {
1552
1682
  method: 'POST',
1553
- url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
1683
+ url: '/api/v1/{region}/reporting/snapshots/generate',
1554
1684
  path: {
1555
- transactionId: data.transactionId,
1556
1685
  region: data.region
1557
1686
  },
1558
1687
  body: data.requestBody,
1559
1688
  mediaType: 'application/json',
1560
1689
  errors: {
1561
- 404: 'Transaction not found',
1562
- 409: 'Rule with same name already exists or transaction already linked'
1690
+ 400: 'Invalid date format',
1691
+ 401: 'User not authenticated'
1563
1692
  }
1564
1693
  });
1565
1694
  }
1566
1695
 
1567
1696
  /**
1568
- * Get recurring rule by ID
1569
- * Returns a specific recurring rule with its details
1697
+ * Backfill portfolio snapshots
1698
+ *
1699
+ * Generate snapshots for a date range (historical data backfill).
1700
+ *
1701
+ * **Multi-currency Support:**
1702
+ * - Each snapshot includes multi-currency data
1703
+ * - Uses exchange rates available at generation time
1704
+ * - Warnings stored for missing exchange rates
1705
+ *
1706
+ * **Best Practices:**
1707
+ * - Use for initial setup after account configuration
1708
+ * - Run during low-traffic periods for large date ranges
1709
+ * - Existing snapshots are skipped (not regenerated)
1710
+ *
1570
1711
  * @param data The data for the request.
1571
- * @param data.id Rule ID
1572
1712
  * @param data.region Region code for tenant context
1573
- * @returns RecurringRuleResponseDto Rule retrieved successfully
1713
+ * @param data.requestBody
1714
+ * @returns BackfillSnapshotsResponse Backfill completed successfully
1574
1715
  * @throws ApiError
1575
1716
  */
1576
- public static recurringRuleControllerFindOne(
1577
- data: RecurringRuleControllerFindOneData
1578
- ): CancelablePromise<RecurringRuleControllerFindOneResponse> {
1717
+ public static reportingControllerBackfillSnapshots(
1718
+ data: ReportingControllerBackfillSnapshotsData
1719
+ ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
1579
1720
  return __request(OpenAPI, {
1580
- method: 'GET',
1581
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
1721
+ method: 'POST',
1722
+ url: '/api/v1/{region}/reporting/snapshots/backfill',
1582
1723
  path: {
1583
- id: data.id,
1584
1724
  region: data.region
1585
1725
  },
1726
+ body: data.requestBody,
1727
+ mediaType: 'application/json',
1586
1728
  errors: {
1587
- 404: 'Rule not found'
1729
+ 400: 'Invalid date format or range',
1730
+ 401: 'User not authenticated',
1731
+ 409: 'Backfill already in progress for this user'
1588
1732
  }
1589
1733
  });
1590
1734
  }
1735
+ }
1591
1736
 
1737
+ export class BeanPricesService {
1592
1738
  /**
1593
- * Update recurring rule
1594
- * Updates an existing recurring rule
1739
+ * Create a new price
1740
+ * Creates a new price entry for the authenticated user
1595
1741
  * @param data The data for the request.
1596
- * @param data.id Rule ID
1597
1742
  * @param data.region Region code for tenant context
1598
1743
  * @param data.requestBody
1599
- * @returns RecurringRuleResponseDto Rule updated successfully
1744
+ * @returns PriceResponseDto Price created successfully
1600
1745
  * @throws ApiError
1601
1746
  */
1602
- public static recurringRuleControllerUpdate(
1603
- data: RecurringRuleControllerUpdateData
1604
- ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
1747
+ public static priceControllerCreate(
1748
+ data: PriceControllerCreateData
1749
+ ): CancelablePromise<PriceControllerCreateResponse> {
1605
1750
  return __request(OpenAPI, {
1606
- method: 'PATCH',
1607
- url: '/api/v1/{region}/bean/recurring-rules/{id}',
1751
+ method: 'POST',
1752
+ url: '/api/v1/{region}/bean/prices',
1608
1753
  path: {
1609
- id: data.id,
1610
1754
  region: data.region
1611
1755
  },
1612
1756
  body: data.requestBody,
1613
1757
  mediaType: 'application/json',
1614
1758
  errors: {
1615
- 400: 'Invalid input data',
1616
- 404: 'Rule not found'
1759
+ 404: 'Currency or quoteCurrency commodity not found',
1760
+ 409: 'Price already exists for this currency pair and date'
1617
1761
  }
1618
1762
  });
1619
1763
  }
1620
1764
 
1621
1765
  /**
1622
- * Delete recurring rule
1623
- * Soft deletes a recurring rule (sets isActive to false)
1766
+ * List user prices
1767
+ * Returns all price entries for the authenticated user with optional filtering
1624
1768
  * @param data The data for the request.
1625
- * @param data.id Rule ID
1626
1769
  * @param data.region Region code for tenant context
1627
- * @returns void Rule deleted successfully
1770
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
1771
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
1772
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
1773
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
1774
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
1775
+ * @param data.page Page number for pagination (default: 1)
1776
+ * @param data.limit Number of items per page (default: 20, max: 100)
1777
+ * @returns PriceListResponseDto Prices retrieved successfully
1628
1778
  * @throws ApiError
1629
1779
  */
1630
- public static recurringRuleControllerDelete(
1631
- data: RecurringRuleControllerDeleteData
1632
- ): CancelablePromise<RecurringRuleControllerDeleteResponse> {
1780
+ public static priceControllerFindAll(
1781
+ data: PriceControllerFindAllData
1782
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1633
1783
  return __request(OpenAPI, {
1634
- method: 'DELETE',
1784
+ method: 'GET',
1785
+ url: '/api/v1/{region}/bean/prices',
1786
+ path: {
1787
+ region: data.region
1788
+ },
1789
+ query: {
1790
+ currency: data.currency,
1791
+ quoteCurrency: data.quoteCurrency,
1792
+ dateFrom: data.dateFrom,
1793
+ dateTo: data.dateTo,
1794
+ search: data.search,
1795
+ page: data.page,
1796
+ limit: data.limit
1797
+ }
1798
+ });
1799
+ }
1800
+
1801
+ /**
1802
+ * Get price by ID
1803
+ * Returns a single price entry by its ID
1804
+ * @param data The data for the request.
1805
+ * @param data.id Price ID
1806
+ * @param data.region Region code for tenant context
1807
+ * @returns PriceResponseDto Price retrieved successfully
1808
+ * @throws ApiError
1809
+ */
1810
+ public static priceControllerFindOne(
1811
+ data: PriceControllerFindOneData
1812
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1813
+ return __request(OpenAPI, {
1814
+ method: 'GET',
1815
+ url: '/api/v1/{region}/bean/prices/{id}',
1816
+ path: {
1817
+ id: data.id,
1818
+ region: data.region
1819
+ },
1820
+ errors: {
1821
+ 404: 'Price not found'
1822
+ }
1823
+ });
1824
+ }
1825
+
1826
+ /**
1827
+ * Update a price
1828
+ * Updates an existing price entry
1829
+ * @param data The data for the request.
1830
+ * @param data.id Price ID
1831
+ * @param data.region Region code for tenant context
1832
+ * @param data.requestBody
1833
+ * @returns PriceResponseDto Price updated successfully
1834
+ * @throws ApiError
1835
+ */
1836
+ public static priceControllerUpdate(
1837
+ data: PriceControllerUpdateData
1838
+ ): CancelablePromise<PriceControllerUpdateResponse> {
1839
+ return __request(OpenAPI, {
1840
+ method: 'PUT',
1841
+ url: '/api/v1/{region}/bean/prices/{id}',
1842
+ path: {
1843
+ id: data.id,
1844
+ region: data.region
1845
+ },
1846
+ body: data.requestBody,
1847
+ mediaType: 'application/json',
1848
+ errors: {
1849
+ 404: 'Price not found',
1850
+ 409: 'Updated price conflicts with existing price'
1851
+ }
1852
+ });
1853
+ }
1854
+
1855
+ /**
1856
+ * Delete a price
1857
+ * Deletes a price entry (hard delete)
1858
+ * @param data The data for the request.
1859
+ * @param data.id Price ID
1860
+ * @param data.region Region code for tenant context
1861
+ * @returns void Price deleted successfully
1862
+ * @throws ApiError
1863
+ */
1864
+ public static priceControllerDelete(
1865
+ data: PriceControllerDeleteData
1866
+ ): CancelablePromise<PriceControllerDeleteResponse> {
1867
+ return __request(OpenAPI, {
1868
+ method: 'DELETE',
1869
+ url: '/api/v1/{region}/bean/prices/{id}',
1870
+ path: {
1871
+ id: data.id,
1872
+ region: data.region
1873
+ },
1874
+ errors: {
1875
+ 404: 'Price not found'
1876
+ }
1877
+ });
1878
+ }
1879
+
1880
+ /**
1881
+ * Bulk create prices
1882
+ * Creates multiple price entries at once (skips duplicates)
1883
+ * @param data The data for the request.
1884
+ * @param data.region Region code for tenant context
1885
+ * @param data.requestBody
1886
+ * @returns PriceResponseDto Prices created successfully
1887
+ * @throws ApiError
1888
+ */
1889
+ public static priceControllerBulkCreate(
1890
+ data: PriceControllerBulkCreateData
1891
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
1892
+ return __request(OpenAPI, {
1893
+ method: 'POST',
1894
+ url: '/api/v1/{region}/bean/prices/bulk',
1895
+ path: {
1896
+ region: data.region
1897
+ },
1898
+ body: data.requestBody,
1899
+ mediaType: 'application/json'
1900
+ });
1901
+ }
1902
+ }
1903
+
1904
+ export class UsersService {
1905
+ /**
1906
+ * Delete own user account
1907
+ * @param data The data for the request.
1908
+ * @param data.requestBody
1909
+ * @returns void User deleted successfully
1910
+ * @throws ApiError
1911
+ */
1912
+ public static userControllerDeleteOwnUser(
1913
+ data: UserControllerDeleteOwnUserData
1914
+ ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
1915
+ return __request(OpenAPI, {
1916
+ method: 'DELETE',
1917
+ url: '/api/v1/users',
1918
+ body: data.requestBody,
1919
+ mediaType: 'application/json',
1920
+ errors: {
1921
+ 403: 'Invalid access token'
1922
+ }
1923
+ });
1924
+ }
1925
+
1926
+ /**
1927
+ * Get current authenticated user
1928
+ * @param data The data for the request.
1929
+ * @param data.acceptLanguage
1930
+ * @returns UserResponseDto User retrieved successfully
1931
+ * @throws ApiError
1932
+ */
1933
+ public static userControllerGetUser(
1934
+ data: UserControllerGetUserData
1935
+ ): CancelablePromise<UserControllerGetUserResponse> {
1936
+ return __request(OpenAPI, {
1937
+ method: 'GET',
1938
+ url: '/api/v1/users',
1939
+ headers: {
1940
+ 'accept-language': data.acceptLanguage
1941
+ }
1942
+ });
1943
+ }
1944
+
1945
+ /**
1946
+ * Sign up new user
1947
+ * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
1948
+ * @param data The data for the request.
1949
+ * @param data.requestBody
1950
+ * @returns SignupResponseDto User created successfully
1951
+ * @throws ApiError
1952
+ */
1953
+ public static userControllerSignupUser(
1954
+ data: UserControllerSignupUserData
1955
+ ): CancelablePromise<UserControllerSignupUserResponse> {
1956
+ return __request(OpenAPI, {
1957
+ method: 'POST',
1958
+ url: '/api/v1/users',
1959
+ body: data.requestBody,
1960
+ mediaType: 'application/json',
1961
+ errors: {
1962
+ 400: 'Invalid Turnstile token (when Turnstile is enabled)',
1963
+ 403: 'User signup is disabled'
1964
+ }
1965
+ });
1966
+ }
1967
+
1968
+ /**
1969
+ * Delete user by ID (admin only)
1970
+ * @param data The data for the request.
1971
+ * @param data.id User ID to delete
1972
+ * @returns void User deleted successfully
1973
+ * @throws ApiError
1974
+ */
1975
+ public static userControllerDeleteUser(
1976
+ data: UserControllerDeleteUserData
1977
+ ): CancelablePromise<UserControllerDeleteUserResponse> {
1978
+ return __request(OpenAPI, {
1979
+ method: 'DELETE',
1980
+ url: '/api/v1/users/{id}',
1981
+ path: {
1982
+ id: data.id
1983
+ },
1984
+ errors: {
1985
+ 403: 'Cannot delete own account or insufficient permissions'
1986
+ }
1987
+ });
1988
+ }
1989
+
1990
+ /**
1991
+ * Get user info by user ID
1992
+ * @param data The data for the request.
1993
+ * @param data.id User ID
1994
+ * @returns unknown User info retrieved successfully
1995
+ * @throws ApiError
1996
+ */
1997
+ public static userControllerGetUserInfo(
1998
+ data: UserControllerGetUserInfoData
1999
+ ): CancelablePromise<UserControllerGetUserInfoResponse> {
2000
+ return __request(OpenAPI, {
2001
+ method: 'GET',
2002
+ url: '/api/v1/users/{id}/info',
2003
+ path: {
2004
+ id: data.id
2005
+ },
2006
+ errors: {
2007
+ 403: 'Cannot access other user info without admin permission'
2008
+ }
2009
+ });
2010
+ }
2011
+
2012
+ /**
2013
+ * Update user settings
2014
+ * @param data The data for the request.
2015
+ * @param data.requestBody
2016
+ * @returns unknown Settings updated successfully
2017
+ * @throws ApiError
2018
+ */
2019
+ public static userControllerUpdateUserSetting(
2020
+ data: UserControllerUpdateUserSettingData
2021
+ ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
2022
+ return __request(OpenAPI, {
2023
+ method: 'PUT',
2024
+ url: '/api/v1/users/setting',
2025
+ body: data.requestBody,
2026
+ mediaType: 'application/json',
2027
+ errors: {
2028
+ 403: 'Insufficient permissions'
2029
+ }
2030
+ });
2031
+ }
2032
+
2033
+ /**
2034
+ * Get all user settings paginated (admin only)
2035
+ * @param data The data for the request.
2036
+ * @param data.pageNo Page number
2037
+ * @param data.pageSize Page size
2038
+ * @returns unknown Settings list retrieved successfully
2039
+ * @throws ApiError
2040
+ */
2041
+ public static userControllerGetAllUserSettingsByPage(
2042
+ data: UserControllerGetAllUserSettingsByPageData
2043
+ ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
2044
+ return __request(OpenAPI, {
2045
+ method: 'GET',
2046
+ url: '/api/v1/users/settings-by-page',
2047
+ query: {
2048
+ pageNo: data.pageNo,
2049
+ pageSize: data.pageSize
2050
+ }
2051
+ });
2052
+ }
2053
+
2054
+ /**
2055
+ * Get asset and liability summary for current user
2056
+ * @returns unknown Summary retrieved successfully
2057
+ * @throws ApiError
2058
+ */
2059
+ public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
2060
+ return __request(OpenAPI, {
2061
+ method: 'GET',
2062
+ url: '/api/v1/users/asset-liability-summary'
2063
+ });
2064
+ }
2065
+ }
2066
+
2067
+ export class PropertiesService {
2068
+ /**
2069
+ * Get all system properties
2070
+ * @returns unknown Properties retrieved successfully
2071
+ * @throws ApiError
2072
+ */
2073
+ public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
2074
+ return __request(OpenAPI, {
2075
+ method: 'GET',
2076
+ url: '/api/v1/admin/properties',
2077
+ errors: {
2078
+ 401: 'Unauthorized',
2079
+ 403: 'Forbidden - insufficient permissions'
2080
+ }
2081
+ });
2082
+ }
2083
+
2084
+ /**
2085
+ * Get property by key
2086
+ * @param data The data for the request.
2087
+ * @param data.key Property key
2088
+ * @returns unknown Property retrieved successfully
2089
+ * @throws ApiError
2090
+ */
2091
+ public static propertyControllerGetByKey(
2092
+ data: PropertyControllerGetByKeyData
2093
+ ): CancelablePromise<PropertyControllerGetByKeyResponse> {
2094
+ return __request(OpenAPI, {
2095
+ method: 'GET',
2096
+ url: '/api/v1/admin/properties/{key}',
2097
+ path: {
2098
+ key: data.key
2099
+ },
2100
+ errors: {
2101
+ 401: 'Unauthorized',
2102
+ 403: 'Forbidden - insufficient permissions',
2103
+ 404: 'Property not found'
2104
+ }
2105
+ });
2106
+ }
2107
+
2108
+ /**
2109
+ * Update a system property
2110
+ * @param data The data for the request.
2111
+ * @param data.key Property key
2112
+ * @param data.requestBody
2113
+ * @returns unknown Property updated successfully
2114
+ * @throws ApiError
2115
+ */
2116
+ public static propertyControllerUpdate(
2117
+ data: PropertyControllerUpdateData
2118
+ ): CancelablePromise<PropertyControllerUpdateResponse> {
2119
+ return __request(OpenAPI, {
2120
+ method: 'PUT',
2121
+ url: '/api/v1/admin/properties/{key}',
2122
+ path: {
2123
+ key: data.key
2124
+ },
2125
+ body: data.requestBody,
2126
+ mediaType: 'application/json',
2127
+ errors: {
2128
+ 401: 'Unauthorized',
2129
+ 403: 'Forbidden - insufficient permissions'
2130
+ }
2131
+ });
2132
+ }
2133
+
2134
+ /**
2135
+ * Delete a system property
2136
+ * @param data The data for the request.
2137
+ * @param data.key Property key
2138
+ * @returns void Property deleted successfully
2139
+ * @throws ApiError
2140
+ */
2141
+ public static propertyControllerDelete(
2142
+ data: PropertyControllerDeleteData
2143
+ ): CancelablePromise<PropertyControllerDeleteResponse> {
2144
+ return __request(OpenAPI, {
2145
+ method: 'DELETE',
2146
+ url: '/api/v1/admin/properties/{key}',
2147
+ path: {
2148
+ key: data.key
2149
+ },
2150
+ errors: {
2151
+ 401: 'Unauthorized',
2152
+ 403: 'Forbidden - insufficient permissions',
2153
+ 404: 'Property not found'
2154
+ }
2155
+ });
2156
+ }
2157
+ }
2158
+
2159
+ export class RecurringRulesService {
2160
+ /**
2161
+ * Create a new recurring rule
2162
+ * Creates a new recurring transaction rule for the authenticated user
2163
+ * @param data The data for the request.
2164
+ * @param data.region Region code for tenant context
2165
+ * @param data.requestBody
2166
+ * @returns RecurringRuleResponseDto Rule created successfully
2167
+ * @throws ApiError
2168
+ */
2169
+ public static recurringRuleControllerCreate(
2170
+ data: RecurringRuleControllerCreateData
2171
+ ): CancelablePromise<RecurringRuleControllerCreateResponse> {
2172
+ return __request(OpenAPI, {
2173
+ method: 'POST',
2174
+ url: '/api/v1/{region}/bean/recurring-rules',
2175
+ path: {
2176
+ region: data.region
2177
+ },
2178
+ body: data.requestBody,
2179
+ mediaType: 'application/json',
2180
+ errors: {
2181
+ 400: 'Invalid input data (e.g., autoCreate without accounts)',
2182
+ 409: 'Rule with same name already exists'
2183
+ }
2184
+ });
2185
+ }
2186
+
2187
+ /**
2188
+ * List recurring rules
2189
+ * Returns all recurring rules for the authenticated user with optional filtering
2190
+ * @param data The data for the request.
2191
+ * @param data.region Region code for tenant context
2192
+ * @param data.isActive Filter by active status
2193
+ * @param data.frequency Filter by frequency (WEEKLY, MONTHLY, etc.)
2194
+ * @param data.hasAutoCreate Filter by autoCreate enabled
2195
+ * @returns RecurringRuleResponseDto Rules retrieved successfully
2196
+ * @throws ApiError
2197
+ */
2198
+ public static recurringRuleControllerFindAll(
2199
+ data: RecurringRuleControllerFindAllData
2200
+ ): CancelablePromise<RecurringRuleControllerFindAllResponse> {
2201
+ return __request(OpenAPI, {
2202
+ method: 'GET',
2203
+ url: '/api/v1/{region}/bean/recurring-rules',
2204
+ path: {
2205
+ region: data.region
2206
+ },
2207
+ query: {
2208
+ isActive: data.isActive,
2209
+ frequency: data.frequency,
2210
+ hasAutoCreate: data.hasAutoCreate
2211
+ }
2212
+ });
2213
+ }
2214
+
2215
+ /**
2216
+ * Create recurring rule from transaction
2217
+ * Auto-creates a recurring rule using transaction data. User only confirms frequency.
2218
+ * @param data The data for the request.
2219
+ * @param data.transactionId Source transaction ID
2220
+ * @param data.region Region code for tenant context
2221
+ * @param data.requestBody
2222
+ * @returns RecurringRuleResponseDto Rule created successfully
2223
+ * @throws ApiError
2224
+ */
2225
+ public static recurringRuleControllerCreateFromTransaction(
2226
+ data: RecurringRuleControllerCreateFromTransactionData
2227
+ ): CancelablePromise<RecurringRuleControllerCreateFromTransactionResponse> {
2228
+ return __request(OpenAPI, {
2229
+ method: 'POST',
2230
+ url: '/api/v1/{region}/bean/recurring-rules/from-transaction/{transactionId}',
2231
+ path: {
2232
+ transactionId: data.transactionId,
2233
+ region: data.region
2234
+ },
2235
+ body: data.requestBody,
2236
+ mediaType: 'application/json',
2237
+ errors: {
2238
+ 404: 'Transaction not found',
2239
+ 409: 'Rule with same name already exists or transaction already linked'
2240
+ }
2241
+ });
2242
+ }
2243
+
2244
+ /**
2245
+ * Get recurring rule by ID
2246
+ * Returns a specific recurring rule with its details
2247
+ * @param data The data for the request.
2248
+ * @param data.id Rule ID
2249
+ * @param data.region Region code for tenant context
2250
+ * @returns RecurringRuleResponseDto Rule retrieved successfully
2251
+ * @throws ApiError
2252
+ */
2253
+ public static recurringRuleControllerFindOne(
2254
+ data: RecurringRuleControllerFindOneData
2255
+ ): CancelablePromise<RecurringRuleControllerFindOneResponse> {
2256
+ return __request(OpenAPI, {
2257
+ method: 'GET',
2258
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
2259
+ path: {
2260
+ id: data.id,
2261
+ region: data.region
2262
+ },
2263
+ errors: {
2264
+ 404: 'Rule not found'
2265
+ }
2266
+ });
2267
+ }
2268
+
2269
+ /**
2270
+ * Update recurring rule
2271
+ * Updates an existing recurring rule
2272
+ * @param data The data for the request.
2273
+ * @param data.id Rule ID
2274
+ * @param data.region Region code for tenant context
2275
+ * @param data.requestBody
2276
+ * @returns RecurringRuleResponseDto Rule updated successfully
2277
+ * @throws ApiError
2278
+ */
2279
+ public static recurringRuleControllerUpdate(
2280
+ data: RecurringRuleControllerUpdateData
2281
+ ): CancelablePromise<RecurringRuleControllerUpdateResponse> {
2282
+ return __request(OpenAPI, {
2283
+ method: 'PATCH',
2284
+ url: '/api/v1/{region}/bean/recurring-rules/{id}',
2285
+ path: {
2286
+ id: data.id,
2287
+ region: data.region
2288
+ },
2289
+ body: data.requestBody,
2290
+ mediaType: 'application/json',
2291
+ errors: {
2292
+ 400: 'Invalid input data',
2293
+ 404: 'Rule not found'
2294
+ }
2295
+ });
2296
+ }
2297
+
2298
+ /**
2299
+ * Delete recurring rule
2300
+ * Soft deletes a recurring rule (sets isActive to false)
2301
+ * @param data The data for the request.
2302
+ * @param data.id Rule ID
2303
+ * @param data.region Region code for tenant context
2304
+ * @returns void Rule deleted successfully
2305
+ * @throws ApiError
2306
+ */
2307
+ public static recurringRuleControllerDelete(
2308
+ data: RecurringRuleControllerDeleteData
2309
+ ): CancelablePromise<RecurringRuleControllerDeleteResponse> {
2310
+ return __request(OpenAPI, {
2311
+ method: 'DELETE',
1635
2312
  url: '/api/v1/{region}/bean/recurring-rules/{id}',
1636
2313
  path: {
1637
2314
  id: data.id,
@@ -1777,7 +2454,7 @@ export class ExpectedTransactionsService {
1777
2454
  * @param data The data for the request.
1778
2455
  * @param data.id Expected transaction ID
1779
2456
  * @param data.region Region code for tenant context
1780
- * @returns ExpectedTransactionResponseDto Skip undone successfully
2457
+ * @returns void Skip undone successfully
1781
2458
  * @throws ApiError
1782
2459
  */
1783
2460
  public static expectedTransactionControllerUndoSkip(
@@ -1833,7 +2510,7 @@ export class ExpectedTransactionsService {
1833
2510
  * @param data The data for the request.
1834
2511
  * @param data.id Expected transaction ID
1835
2512
  * @param data.region Region code for tenant context
1836
- * @returns unknown Match removed successfully
2513
+ * @returns void Match removed successfully
1837
2514
  * @throws ApiError
1838
2515
  */
1839
2516
  public static expectedTransactionControllerUnmatch(
@@ -2187,256 +2864,337 @@ export class BeanTransactionRulesService {
2187
2864
  }
2188
2865
  }
2189
2866
 
2190
- export class UsersService {
2191
- /**
2192
- * Delete own user account
2193
- * @param data The data for the request.
2194
- * @param data.requestBody
2195
- * @returns void User deleted successfully
2196
- * @throws ApiError
2197
- */
2198
- public static userControllerDeleteOwnUser(
2199
- data: UserControllerDeleteOwnUserData
2200
- ): CancelablePromise<UserControllerDeleteOwnUserResponse> {
2201
- return __request(OpenAPI, {
2202
- method: 'DELETE',
2203
- url: '/api/v1/users',
2204
- body: data.requestBody,
2205
- mediaType: 'application/json',
2206
- errors: {
2207
- 403: 'Invalid access token'
2208
- }
2209
- });
2210
- }
2211
-
2867
+ export class BeanCategoryCatalogService {
2212
2868
  /**
2213
- * Get current authenticated user
2869
+ * List category catalog for a region
2870
+ * Returns the region-scoped category slugs (expense/income/investment/banking/transfer/payment) for the NLP result picker. CN-exclusive payment instruments (huabei/baitiao) appear only under /cn.
2214
2871
  * @param data The data for the request.
2215
- * @param data.acceptLanguage
2216
- * @returns unknown User retrieved successfully
2872
+ * @param data.region Region code for tenant context
2873
+ * @param data.scenario Filter by scenario
2874
+ * @param data.routeBearing Filter by routeBearing (entity-router route() consumes it)
2875
+ * @returns CategoryCatalogListResponseDto Category catalog retrieved successfully
2217
2876
  * @throws ApiError
2218
2877
  */
2219
- public static userControllerGetUser(
2220
- data: UserControllerGetUserData
2221
- ): CancelablePromise<UserControllerGetUserResponse> {
2878
+ public static categoryCatalogControllerList(
2879
+ data: CategoryCatalogControllerListData
2880
+ ): CancelablePromise<CategoryCatalogControllerListResponse> {
2222
2881
  return __request(OpenAPI, {
2223
2882
  method: 'GET',
2224
- url: '/api/v1/users',
2225
- headers: {
2226
- 'accept-language': data.acceptLanguage
2883
+ url: '/api/v1/{region}/bean/categories',
2884
+ path: {
2885
+ region: data.region
2886
+ },
2887
+ query: {
2888
+ scenario: data.scenario,
2889
+ routeBearing: data.routeBearing
2227
2890
  }
2228
2891
  });
2229
2892
  }
2893
+ }
2230
2894
 
2895
+ export class LifeEventsService {
2231
2896
  /**
2232
- * Sign up new user
2233
- * Create a new account with auto-generated access token. Protected by Cloudflare Turnstile to prevent automated signup (when enabled).
2897
+ * Create a new life event
2898
+ * Creates a new life event entry for the authenticated user. Returns ETag header carrying the row updatedAt.
2234
2899
  * @param data The data for the request.
2900
+ * @param data.region Region code for tenant context (decorative for life events)
2235
2901
  * @param data.requestBody
2236
- * @returns unknown User created successfully
2902
+ * @returns EventResponseDto Life event created successfully
2237
2903
  * @throws ApiError
2238
2904
  */
2239
- public static userControllerSignupUser(
2240
- data: UserControllerSignupUserData
2241
- ): CancelablePromise<UserControllerSignupUserResponse> {
2905
+ public static eventControllerCreate(
2906
+ data: EventControllerCreateData
2907
+ ): CancelablePromise<EventControllerCreateResponse> {
2242
2908
  return __request(OpenAPI, {
2243
2909
  method: 'POST',
2244
- url: '/api/v1/users',
2910
+ url: '/api/v1/{region}/bean/events',
2911
+ path: {
2912
+ region: data.region
2913
+ },
2245
2914
  body: data.requestBody,
2246
2915
  mediaType: 'application/json',
2247
2916
  errors: {
2248
- 400: 'Invalid Turnstile token (when Turnstile is enabled)',
2249
- 403: 'User signup is disabled'
2917
+ 409: 'Life event already exists for this (userId, type, date) combination'
2250
2918
  }
2251
2919
  });
2252
2920
  }
2253
2921
 
2254
2922
  /**
2255
- * Delete user by ID (admin only)
2923
+ * List user life events
2924
+ * Returns life events for the authenticated user with optional filtering by type, description search, and date range.
2256
2925
  * @param data The data for the request.
2257
- * @param data.id User ID to delete
2258
- * @returns void User deleted successfully
2926
+ * @param data.region Region code for tenant context (decorative for life events)
2927
+ * @param data.type Filter by life event type (exact match)
2928
+ * @param data.q Search term for description (case-insensitive partial match)
2929
+ * @param data.from Filter life events from this date (ISO 8601 format)
2930
+ * @param data.to Filter life events to this date (ISO 8601 format)
2931
+ * @param data.page Page number for pagination (default: 1)
2932
+ * @param data.limit Number of items per page (default: 20, max: 100)
2933
+ * @returns EventListResponseDto Life events retrieved successfully
2259
2934
  * @throws ApiError
2260
2935
  */
2261
- public static userControllerDeleteUser(
2262
- data: UserControllerDeleteUserData
2263
- ): CancelablePromise<UserControllerDeleteUserResponse> {
2936
+ public static eventControllerFindAll(
2937
+ data: EventControllerFindAllData
2938
+ ): CancelablePromise<EventControllerFindAllResponse> {
2264
2939
  return __request(OpenAPI, {
2265
- method: 'DELETE',
2266
- url: '/api/v1/users/{id}',
2940
+ method: 'GET',
2941
+ url: '/api/v1/{region}/bean/events',
2267
2942
  path: {
2268
- id: data.id
2943
+ region: data.region
2269
2944
  },
2270
- errors: {
2271
- 403: 'Cannot delete own account or insufficient permissions'
2945
+ query: {
2946
+ type: data.type,
2947
+ q: data.q,
2948
+ from: data.from,
2949
+ to: data.to,
2950
+ page: data.page,
2951
+ limit: data.limit
2272
2952
  }
2273
2953
  });
2274
2954
  }
2275
2955
 
2276
2956
  /**
2277
- * Get user info by user ID
2957
+ * Get life event by ID
2958
+ * Returns a single life event by its ID. Returns ETag header.
2278
2959
  * @param data The data for the request.
2279
- * @param data.id User ID
2280
- * @returns unknown User info retrieved successfully
2960
+ * @param data.id Life event ID
2961
+ * @param data.region Region code for tenant context (decorative for life events)
2962
+ * @returns EventResponseDto Life event retrieved successfully
2281
2963
  * @throws ApiError
2282
2964
  */
2283
- public static userControllerGetUserInfo(
2284
- data: UserControllerGetUserInfoData
2285
- ): CancelablePromise<UserControllerGetUserInfoResponse> {
2965
+ public static eventControllerFindOne(
2966
+ data: EventControllerFindOneData
2967
+ ): CancelablePromise<EventControllerFindOneResponse> {
2286
2968
  return __request(OpenAPI, {
2287
2969
  method: 'GET',
2288
- url: '/api/v1/users/{id}/info',
2970
+ url: '/api/v1/{region}/bean/events/{id}',
2289
2971
  path: {
2290
- id: data.id
2972
+ id: data.id,
2973
+ region: data.region
2291
2974
  },
2292
2975
  errors: {
2293
- 403: 'Cannot access other user info without admin permission'
2976
+ 404: 'Life event not found'
2294
2977
  }
2295
2978
  });
2296
2979
  }
2297
2980
 
2298
2981
  /**
2299
- * Update user settings
2982
+ * Update a life event
2983
+ * Updates an existing life event. If If-Match header is provided, performs optimistic concurrency check; mismatched updatedAt returns 412.
2300
2984
  * @param data The data for the request.
2985
+ * @param data.id Life event ID
2986
+ * @param data.region Region code for tenant context (decorative for life events)
2301
2987
  * @param data.requestBody
2302
- * @returns unknown Settings updated successfully
2988
+ * @returns EventResponseDto Life event updated successfully
2303
2989
  * @throws ApiError
2304
2990
  */
2305
- public static userControllerUpdateUserSetting(
2306
- data: UserControllerUpdateUserSettingData
2307
- ): CancelablePromise<UserControllerUpdateUserSettingResponse> {
2991
+ public static eventControllerUpdate(
2992
+ data: EventControllerUpdateData
2993
+ ): CancelablePromise<EventControllerUpdateResponse> {
2308
2994
  return __request(OpenAPI, {
2309
2995
  method: 'PUT',
2310
- url: '/api/v1/users/setting',
2996
+ url: '/api/v1/{region}/bean/events/{id}',
2997
+ path: {
2998
+ id: data.id,
2999
+ region: data.region
3000
+ },
2311
3001
  body: data.requestBody,
2312
3002
  mediaType: 'application/json',
2313
3003
  errors: {
2314
- 403: 'Insufficient permissions'
3004
+ 400: 'If-Match header is not a valid ISO 8601 date',
3005
+ 404: 'Life event not found',
3006
+ 409: 'Updated event conflicts with an existing (userId, type, date) combination',
3007
+ 412: 'If-Match precondition failed (updatedAt mismatch)'
2315
3008
  }
2316
3009
  });
2317
3010
  }
2318
3011
 
2319
3012
  /**
2320
- * Get all user settings paginated (admin only)
3013
+ * Delete a life event
3014
+ * Deletes a life event entry (hard delete). Returns 204.
2321
3015
  * @param data The data for the request.
2322
- * @param data.pageNo Page number
2323
- * @param data.pageSize Page size
2324
- * @returns unknown Settings list retrieved successfully
3016
+ * @param data.id Life event ID
3017
+ * @param data.region Region code for tenant context (decorative for life events)
3018
+ * @returns void Life event deleted successfully
2325
3019
  * @throws ApiError
2326
3020
  */
2327
- public static userControllerGetAllUserSettingsByPage(
2328
- data: UserControllerGetAllUserSettingsByPageData
2329
- ): CancelablePromise<UserControllerGetAllUserSettingsByPageResponse> {
3021
+ public static eventControllerDelete(
3022
+ data: EventControllerDeleteData
3023
+ ): CancelablePromise<EventControllerDeleteResponse> {
3024
+ return __request(OpenAPI, {
3025
+ method: 'DELETE',
3026
+ url: '/api/v1/{region}/bean/events/{id}',
3027
+ path: {
3028
+ id: data.id,
3029
+ region: data.region
3030
+ },
3031
+ errors: {
3032
+ 404: 'Life event not found'
3033
+ }
3034
+ });
3035
+ }
3036
+
3037
+ /**
3038
+ * Slice time-series by a life event (Phase 79)
3039
+ * Returns aggregated time-series for postings matching accountPattern within the half-open date range of the given life event.
3040
+ * @param data The data for the request.
3041
+ * @param data.id Life event ID
3042
+ * @param data.accountPattern
3043
+ * @param data.granularity
3044
+ * @param data.region Region code for tenant context (decorative for life events)
3045
+ * @returns unknown Time-series sliced by the life event range
3046
+ * @throws ApiError
3047
+ */
3048
+ public static eventControllerGetSlice(
3049
+ data: EventControllerGetSliceData
3050
+ ): CancelablePromise<EventControllerGetSliceResponse> {
2330
3051
  return __request(OpenAPI, {
2331
3052
  method: 'GET',
2332
- url: '/api/v1/users/settings-by-page',
3053
+ url: '/api/v1/{region}/bean/events/{id}/slice',
3054
+ path: {
3055
+ id: data.id,
3056
+ region: data.region
3057
+ },
2333
3058
  query: {
2334
- pageNo: data.pageNo,
2335
- pageSize: data.pageSize
3059
+ accountPattern: data.accountPattern,
3060
+ granularity: data.granularity
3061
+ },
3062
+ errors: {
3063
+ 400: 'accountPattern query param is empty',
3064
+ 404: 'Life event not found'
2336
3065
  }
2337
3066
  });
2338
3067
  }
3068
+ }
2339
3069
 
3070
+ export class OnboardingService {
2340
3071
  /**
2341
- * Get asset and liability summary for current user
2342
- * @returns unknown Summary retrieved successfully
3072
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
3073
+ * @param data The data for the request.
3074
+ * @param data.region Region code for tenant context
3075
+ * @param data.requestBody
3076
+ * @returns unknown Onboarding bootstrap result.
2343
3077
  * @throws ApiError
2344
3078
  */
2345
- public static userControllerGetAssetLiabilitySummary(): CancelablePromise<UserControllerGetAssetLiabilitySummaryResponse> {
3079
+ public static onboardingControllerBootstrap(
3080
+ data: OnboardingControllerBootstrapData
3081
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
2346
3082
  return __request(OpenAPI, {
2347
- method: 'GET',
2348
- url: '/api/v1/users/asset-liability-summary'
3083
+ method: 'POST',
3084
+ url: '/api/v1/{region}/bean/onboarding',
3085
+ path: {
3086
+ region: data.region
3087
+ },
3088
+ body: data.requestBody,
3089
+ mediaType: 'application/json',
3090
+ errors: {
3091
+ 422: 'Invalid region/account path/duplicate paths.'
3092
+ }
2349
3093
  });
2350
3094
  }
2351
3095
  }
2352
3096
 
2353
- export class PropertiesService {
3097
+ export class BalanceReconciliationService {
2354
3098
  /**
2355
- * Get all system properties
2356
- * @returns unknown Properties retrieved successfully
3099
+ * Preview reconciliation (book vs actual)
3100
+ * Computes book balance, diff, Beancount-inferred tolerance, and suggested action without persisting.
3101
+ * @param data The data for the request.
3102
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3103
+ * @param data.requestBody
3104
+ * @returns ReconciliationComputeResultDto Reconciliation preview
2357
3105
  * @throws ApiError
2358
3106
  */
2359
- public static propertyControllerGetAll(): CancelablePromise<PropertyControllerGetAllResponse> {
3107
+ public static reconciliationControllerCompute(
3108
+ data: ReconciliationControllerComputeData
3109
+ ): CancelablePromise<ReconciliationControllerComputeResponse> {
2360
3110
  return __request(OpenAPI, {
2361
- method: 'GET',
2362
- url: '/api/v1/admin/properties',
3111
+ method: 'POST',
3112
+ url: '/api/v1/{region}/bean/reconciliations',
3113
+ path: {
3114
+ region: data.region
3115
+ },
3116
+ body: data.requestBody,
3117
+ mediaType: 'application/json',
2363
3118
  errors: {
2364
- 401: 'Unauthorized',
2365
- 403: 'Forbidden - insufficient permissions'
3119
+ 404: 'Account not found'
2366
3120
  }
2367
3121
  });
2368
3122
  }
2369
3123
 
2370
3124
  /**
2371
- * Get property by key
3125
+ * Record a balance assertion
3126
+ * Persists the reconciliation as a BeanBalance assertion (amount = actual, diffAmount = book − actual). Re-reconciling the same day/currency upserts.
2372
3127
  * @param data The data for the request.
2373
- * @param data.key Property key
2374
- * @returns unknown Property retrieved successfully
3128
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3129
+ * @param data.requestBody
3130
+ * @returns ReconciliationRecordDto Balance assertion recorded
2375
3131
  * @throws ApiError
2376
3132
  */
2377
- public static propertyControllerGetByKey(
2378
- data: PropertyControllerGetByKeyData
2379
- ): CancelablePromise<PropertyControllerGetByKeyResponse> {
3133
+ public static reconciliationControllerAssert(
3134
+ data: ReconciliationControllerAssertData
3135
+ ): CancelablePromise<ReconciliationControllerAssertResponse> {
2380
3136
  return __request(OpenAPI, {
2381
- method: 'GET',
2382
- url: '/api/v1/admin/properties/{key}',
3137
+ method: 'POST',
3138
+ url: '/api/v1/{region}/bean/reconciliations/assert',
2383
3139
  path: {
2384
- key: data.key
3140
+ region: data.region
2385
3141
  },
3142
+ body: data.requestBody,
3143
+ mediaType: 'application/json',
2386
3144
  errors: {
2387
- 401: 'Unauthorized',
2388
- 403: 'Forbidden - insufficient permissions',
2389
- 404: 'Property not found'
3145
+ 404: 'Account not found'
2390
3146
  }
2391
3147
  });
2392
3148
  }
2393
3149
 
2394
3150
  /**
2395
- * Update a system property
3151
+ * Generate a pad adjusting entry
3152
+ * When book is outside tolerance, synthesizes a Beancount pad transaction (flag P) booking the diff from source_account and persists it. Source defaults to Equity:Opening-Balances.
2396
3153
  * @param data The data for the request.
2397
- * @param data.key Property key
3154
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2398
3155
  * @param data.requestBody
2399
- * @returns unknown Property updated successfully
3156
+ * @returns PadResultDto Pad adjusting entry generated
2400
3157
  * @throws ApiError
2401
3158
  */
2402
- public static propertyControllerUpdate(
2403
- data: PropertyControllerUpdateData
2404
- ): CancelablePromise<PropertyControllerUpdateResponse> {
3159
+ public static reconciliationControllerPad(
3160
+ data: ReconciliationControllerPadData
3161
+ ): CancelablePromise<ReconciliationControllerPadResponse> {
2405
3162
  return __request(OpenAPI, {
2406
- method: 'PUT',
2407
- url: '/api/v1/admin/properties/{key}',
3163
+ method: 'POST',
3164
+ url: '/api/v1/{region}/bean/reconciliations/pad',
2408
3165
  path: {
2409
- key: data.key
3166
+ region: data.region
2410
3167
  },
2411
3168
  body: data.requestBody,
2412
3169
  mediaType: 'application/json',
2413
3170
  errors: {
2414
- 401: 'Unauthorized',
2415
- 403: 'Forbidden - insufficient permissions'
3171
+ 400: 'Book already within tolerance — no pad needed',
3172
+ 404: 'Account not found'
2416
3173
  }
2417
3174
  });
2418
3175
  }
2419
3176
 
2420
3177
  /**
2421
- * Delete a system property
3178
+ * List reconciliation history for an account
3179
+ * Returns recorded balance assertions (most recent first). The latest drives the account-detail "Last <date>" badge.
2422
3180
  * @param data The data for the request.
2423
- * @param data.key Property key
2424
- * @returns void Property deleted successfully
3181
+ * @param data.accountId BeanAccount id
3182
+ * @param data.region Region code for tenant context (decorative for reconciliation)
3183
+ * @returns ReconciliationRecordDto Reconciliation history
2425
3184
  * @throws ApiError
2426
3185
  */
2427
- public static propertyControllerDelete(
2428
- data: PropertyControllerDeleteData
2429
- ): CancelablePromise<PropertyControllerDeleteResponse> {
3186
+ public static reconciliationControllerHistory(
3187
+ data: ReconciliationControllerHistoryData
3188
+ ): CancelablePromise<ReconciliationControllerHistoryResponse> {
2430
3189
  return __request(OpenAPI, {
2431
- method: 'DELETE',
2432
- url: '/api/v1/admin/properties/{key}',
3190
+ method: 'GET',
3191
+ url: '/api/v1/{region}/bean/accounts/{accountId}/reconciliations',
2433
3192
  path: {
2434
- key: data.key
3193
+ accountId: data.accountId,
3194
+ region: data.region
2435
3195
  },
2436
3196
  errors: {
2437
- 401: 'Unauthorized',
2438
- 403: 'Forbidden - insufficient permissions',
2439
- 404: 'Property not found'
3197
+ 404: 'Account not found'
2440
3198
  }
2441
3199
  });
2442
3200
  }
@@ -2446,7 +3204,7 @@ export class BeanExportService {
2446
3204
  /**
2447
3205
  * Export Beancount ledger as ZIP
2448
3206
  * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
2449
- * @returns unknown
3207
+ * @returns binary ZIP archive (application/zip) streamed as an attachment
2450
3208
  * @throws ApiError
2451
3209
  */
2452
3210
  public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
@@ -2534,412 +3292,587 @@ export class BeanImportService {
2534
3292
  formData: data.formData,
2535
3293
  mediaType: 'multipart/form-data',
2536
3294
  errors: {
2537
- 400: 'Bad request - invalid file or no file uploaded'
3295
+ 400: 'Bad request - invalid file or no file uploaded'
3296
+ }
3297
+ });
3298
+ }
3299
+
3300
+ /**
3301
+ * Get importer configuration
3302
+ * Returns the current configuration for the specified importer. Creates default configuration if none exists.
3303
+ * @param data The data for the request.
3304
+ * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
3305
+ * @param data.region Region code for tenant context
3306
+ * @returns ImporterConfigDto Configuration retrieved successfully
3307
+ * @throws ApiError
3308
+ */
3309
+ public static importerConfigControllerGetConfig(
3310
+ data: ImporterConfigControllerGetConfigData
3311
+ ): CancelablePromise<ImporterConfigControllerGetConfigResponse> {
3312
+ return __request(OpenAPI, {
3313
+ method: 'GET',
3314
+ url: '/api/v1/{region}/bean/import/config/{importerId}',
3315
+ path: {
3316
+ importerId: data.importerId,
3317
+ region: data.region
3318
+ },
3319
+ errors: {
3320
+ 400: 'Invalid input - Unsupported importer',
3321
+ 401: 'Unauthorized - Authentication required'
3322
+ }
3323
+ });
3324
+ }
3325
+
3326
+ /**
3327
+ * Update importer configuration
3328
+ * Updates the configuration for the specified importer. Partial updates are supported.
3329
+ * @param data The data for the request.
3330
+ * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
3331
+ * @param data.region Region code for tenant context
3332
+ * @param data.requestBody Partial configuration update. Only provided fields will be updated.
3333
+ * @returns ImporterConfigDto Configuration updated successfully
3334
+ * @throws ApiError
3335
+ */
3336
+ public static importerConfigControllerUpdateConfig(
3337
+ data: ImporterConfigControllerUpdateConfigData
3338
+ ): CancelablePromise<ImporterConfigControllerUpdateConfigResponse> {
3339
+ return __request(OpenAPI, {
3340
+ method: 'PUT',
3341
+ url: '/api/v1/{region}/bean/import/config/{importerId}',
3342
+ path: {
3343
+ importerId: data.importerId,
3344
+ region: data.region
3345
+ },
3346
+ body: data.requestBody,
3347
+ mediaType: 'application/json',
3348
+ errors: {
3349
+ 400: 'Invalid input - Validation failed',
3350
+ 404: 'Configuration not found'
3351
+ }
3352
+ });
3353
+ }
3354
+
3355
+ /**
3356
+ * Reset configuration to default
3357
+ * Resets the configuration for the specified importer to default values. This operation overwrites all existing configuration.
3358
+ * @param data The data for the request.
3359
+ * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
3360
+ * @param data.region Region code for tenant context
3361
+ * @returns ImporterConfigDto Configuration reset successfully
3362
+ * @throws ApiError
3363
+ */
3364
+ public static importerConfigControllerResetConfig(
3365
+ data: ImporterConfigControllerResetConfigData
3366
+ ): CancelablePromise<ImporterConfigControllerResetConfigResponse> {
3367
+ return __request(OpenAPI, {
3368
+ method: 'POST',
3369
+ url: '/api/v1/{region}/bean/import/config/{importerId}/reset',
3370
+ path: {
3371
+ importerId: data.importerId,
3372
+ region: data.region
3373
+ },
3374
+ errors: {
3375
+ 400: 'Invalid input - Unsupported importer'
3376
+ }
3377
+ });
3378
+ }
3379
+ }
3380
+
3381
+ export class ProviderSyncService {
3382
+ /**
3383
+ * Sync transactions from financial data provider
3384
+ *
3385
+ * Accepts raw transactions from external financial data providers, transforms them to Beancount format, and processes them through the ingestion pipeline.
3386
+ *
3387
+ * **Supported Providers:**
3388
+ * - **plaid**: Plaid API (US, Canada, Europe)
3389
+ * - **teller**: Teller API (US)
3390
+ * - **truelayer**: TrueLayer Open Banking (UK, Europe)
3391
+ * - **gocardless**: GoCardless Bank Account Data (Europe)
3392
+ * - **simplefin**: SimpleFIN (Self-hosted)
3393
+ * - **yodlee**: Yodlee (Global)
3394
+ * - **beancount-direct**: Beancount format transactions
3395
+ * - **parsed-bill**: Client-side parsed bill transactions
3396
+ *
3397
+ * **Processing Flow:**
3398
+ * 1. Transform raw data via provider adapter
3399
+ * 2. Validate transaction format
3400
+ * 3. Deduplicate using originalId
3401
+ * 4. Classify using rule engine
3402
+ * 5. Route low-confidence to Review Center
3403
+ * 6. Persist validated transactions
3404
+ *
3405
+ * @param data The data for the request.
3406
+ * @param data.providerName Provider name
3407
+ * @param data.region Region code for tenant context
3408
+ * @param data.requestBody
3409
+ * @returns ProviderSyncResponseDto Sync completed successfully
3410
+ * @throws ApiError
3411
+ */
3412
+ public static providerSyncControllerSync(
3413
+ data: ProviderSyncControllerSyncData
3414
+ ): CancelablePromise<ProviderSyncControllerSyncResponse> {
3415
+ return __request(OpenAPI, {
3416
+ method: 'POST',
3417
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/sync',
3418
+ path: {
3419
+ providerName: data.providerName,
3420
+ region: data.region
3421
+ },
3422
+ body: data.requestBody,
3423
+ mediaType: 'application/json',
3424
+ errors: {
3425
+ 400: 'Invalid request data',
3426
+ 401: 'Missing or invalid authentication',
3427
+ 404: 'Provider not supported'
3428
+ }
3429
+ });
3430
+ }
3431
+
3432
+ /**
3433
+ * Get supported providers
3434
+ * Returns a list of all providers supported by the sync endpoint.
3435
+ * @param data The data for the request.
3436
+ * @param data.region Region code for tenant context
3437
+ * @returns SupportedProvidersResponseDto List of supported providers
3438
+ * @throws ApiError
3439
+ */
3440
+ public static providerSyncControllerGetSupportedProviders(
3441
+ data: ProviderSyncControllerGetSupportedProvidersData
3442
+ ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
3443
+ return __request(OpenAPI, {
3444
+ method: 'GET',
3445
+ url: '/api/v1/{region}/bean/import/provider/supported',
3446
+ path: {
3447
+ region: data.region
3448
+ },
3449
+ errors: {
3450
+ 401: 'Missing or invalid authentication'
3451
+ }
3452
+ });
3453
+ }
3454
+
3455
+ /**
3456
+ * Check if provider is supported
3457
+ * Returns whether a specific provider is supported.
3458
+ * @param data The data for the request.
3459
+ * @param data.providerName Provider name to check
3460
+ * @param data.region Region code for tenant context
3461
+ * @returns unknown Provider support status
3462
+ * @throws ApiError
3463
+ */
3464
+ public static providerSyncControllerIsProviderSupported(
3465
+ data: ProviderSyncControllerIsProviderSupportedData
3466
+ ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3467
+ return __request(OpenAPI, {
3468
+ method: 'GET',
3469
+ url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
3470
+ path: {
3471
+ providerName: data.providerName,
3472
+ region: data.region
3473
+ },
3474
+ errors: {
3475
+ 401: 'Missing or invalid authentication'
2538
3476
  }
2539
3477
  });
2540
3478
  }
3479
+ }
2541
3480
 
3481
+ export class ExternalAccountLinksService {
2542
3482
  /**
2543
- * Get importer configuration
2544
- * Returns the current configuration for the specified importer. Creates default configuration if none exists.
3483
+ * Create an external account → BeanAccount mapping (ADR-0113)
2545
3484
  * @param data The data for the request.
2546
- * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
2547
3485
  * @param data.region Region code for tenant context
2548
- * @returns ImporterConfigDto Configuration retrieved successfully
3486
+ * @param data.requestBody
3487
+ * @returns ExternalAccountLinkResponseDto Link created.
2549
3488
  * @throws ApiError
2550
3489
  */
2551
- public static importerConfigControllerGetConfig(
2552
- data: ImporterConfigControllerGetConfigData
2553
- ): CancelablePromise<ImporterConfigControllerGetConfigResponse> {
3490
+ public static externalAccountLinkControllerCreate(
3491
+ data: ExternalAccountLinkControllerCreateData
3492
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
2554
3493
  return __request(OpenAPI, {
2555
- method: 'GET',
2556
- url: '/api/v1/{region}/bean/import/config/{importerId}',
3494
+ method: 'POST',
3495
+ url: '/api/v1/{region}/bean/external-account-links',
2557
3496
  path: {
2558
- importerId: data.importerId,
2559
3497
  region: data.region
2560
3498
  },
3499
+ body: data.requestBody,
3500
+ mediaType: 'application/json',
2561
3501
  errors: {
2562
- 400: 'Invalid input - Unsupported importer',
2563
- 401: 'Unauthorized - Authentication required'
3502
+ 422: 'beanAccountId not owned, or an active link already exists.'
2564
3503
  }
2565
3504
  });
2566
3505
  }
2567
3506
 
2568
3507
  /**
2569
- * Update importer configuration
2570
- * Updates the configuration for the specified importer. Partial updates are supported.
3508
+ * List the user's active external account links
2571
3509
  * @param data The data for the request.
2572
- * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
3510
+ * @param data.provider
2573
3511
  * @param data.region Region code for tenant context
2574
- * @param data.requestBody Partial configuration update. Only provided fields will be updated.
2575
- * @returns ImporterConfigDto Configuration updated successfully
3512
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
2576
3513
  * @throws ApiError
2577
3514
  */
2578
- public static importerConfigControllerUpdateConfig(
2579
- data: ImporterConfigControllerUpdateConfigData
2580
- ): CancelablePromise<ImporterConfigControllerUpdateConfigResponse> {
3515
+ public static externalAccountLinkControllerFindAll(
3516
+ data: ExternalAccountLinkControllerFindAllData
3517
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
2581
3518
  return __request(OpenAPI, {
2582
- method: 'PUT',
2583
- url: '/api/v1/{region}/bean/import/config/{importerId}',
3519
+ method: 'GET',
3520
+ url: '/api/v1/{region}/bean/external-account-links',
2584
3521
  path: {
2585
- importerId: data.importerId,
2586
3522
  region: data.region
2587
3523
  },
2588
- body: data.requestBody,
2589
- mediaType: 'application/json',
2590
- errors: {
2591
- 400: 'Invalid input - Validation failed',
2592
- 404: 'Configuration not found'
3524
+ query: {
3525
+ provider: data.provider
2593
3526
  }
2594
3527
  });
2595
3528
  }
2596
3529
 
2597
3530
  /**
2598
- * Reset configuration to default
2599
- * Resets the configuration for the specified importer to default values. This operation overwrites all existing configuration.
3531
+ * Get a single external account link
2600
3532
  * @param data The data for the request.
2601
- * @param data.importerId Importer identifier. Supported importers: alipay, alipay-web, wechat, boc, boc-credit, ccb, cmb, cmbc, cmbc-credit, icbc, icbc-credit, hsbc-hk-credit, hsbc-hk-debit
3533
+ * @param data.id
2602
3534
  * @param data.region Region code for tenant context
2603
- * @returns ImporterConfigDto Configuration reset successfully
3535
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
2604
3536
  * @throws ApiError
2605
3537
  */
2606
- public static importerConfigControllerResetConfig(
2607
- data: ImporterConfigControllerResetConfigData
2608
- ): CancelablePromise<ImporterConfigControllerResetConfigResponse> {
3538
+ public static externalAccountLinkControllerFindOne(
3539
+ data: ExternalAccountLinkControllerFindOneData
3540
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
2609
3541
  return __request(OpenAPI, {
2610
- method: 'POST',
2611
- url: '/api/v1/{region}/bean/import/config/{importerId}/reset',
3542
+ method: 'GET',
3543
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
2612
3544
  path: {
2613
- importerId: data.importerId,
3545
+ id: data.id,
2614
3546
  region: data.region
2615
3547
  },
2616
3548
  errors: {
2617
- 400: 'Invalid input - Unsupported importer'
3549
+ 422: 'Link not found or not owned by the user.'
2618
3550
  }
2619
3551
  });
2620
3552
  }
2621
- }
2622
3553
 
2623
- export class BeanPlatformsService {
2624
3554
  /**
2625
- * Get all platforms with statistics
2626
- * @returns unknown List of platforms with binding and account counts
3555
+ * Soft-delete (disconnect) an external account link
3556
+ * @param data The data for the request.
3557
+ * @param data.id
3558
+ * @param data.region Region code for tenant context
3559
+ * @returns void Link soft-deleted; historical transactions are unaffected.
2627
3560
  * @throws ApiError
2628
3561
  */
2629
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3562
+ public static externalAccountLinkControllerRemove(
3563
+ data: ExternalAccountLinkControllerRemoveData
3564
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
2630
3565
  return __request(OpenAPI, {
2631
- method: 'GET',
2632
- url: '/api/v1/bean/platforms'
3566
+ method: 'DELETE',
3567
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3568
+ path: {
3569
+ id: data.id,
3570
+ region: data.region
3571
+ }
2633
3572
  });
2634
3573
  }
3574
+ }
2635
3575
 
3576
+ export class ImportTelemetryService {
2636
3577
  /**
2637
- * Create a new platform
3578
+ * Receive anonymous parser failure telemetry
2638
3579
  * @param data The data for the request.
3580
+ * @param data.region Region code for tenant context
2639
3581
  * @param data.requestBody
2640
- * @returns unknown Platform created successfully
3582
+ * @returns unknown Telemetry report received
2641
3583
  * @throws ApiError
2642
3584
  */
2643
- public static platformControllerCreate(
2644
- data: PlatformControllerCreateData
2645
- ): CancelablePromise<PlatformControllerCreateResponse> {
3585
+ public static telemetryControllerReportTelemetry(
3586
+ data: TelemetryControllerReportTelemetryData
3587
+ ): CancelablePromise<TelemetryControllerReportTelemetryResponse> {
2646
3588
  return __request(OpenAPI, {
2647
3589
  method: 'POST',
2648
- url: '/api/v1/bean/platforms',
3590
+ url: '/api/v1/{region}/bean/import/parser-telemetry',
3591
+ path: {
3592
+ region: data.region
3593
+ },
2649
3594
  body: data.requestBody,
2650
3595
  mediaType: 'application/json',
2651
3596
  errors: {
2652
- 409: 'Platform already exists'
3597
+ 401: 'Unauthorized'
2653
3598
  }
2654
3599
  });
2655
3600
  }
2656
3601
 
2657
3602
  /**
2658
- * Get platform list for current user
2659
- * @returns unknown List of platforms with user binding status
3603
+ * Receive anonymous zero-hit coverage miss report
3604
+ * @param data The data for the request.
3605
+ * @param data.region Region code for tenant context
3606
+ * @param data.requestBody
3607
+ * @returns unknown Coverage miss report received
2660
3608
  * @throws ApiError
2661
3609
  */
2662
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3610
+ public static telemetryControllerReportCoverageMiss(
3611
+ data: TelemetryControllerReportCoverageMissData
3612
+ ): CancelablePromise<TelemetryControllerReportCoverageMissResponse> {
2663
3613
  return __request(OpenAPI, {
2664
- method: 'GET',
2665
- url: '/api/v1/bean/platforms/list'
3614
+ method: 'POST',
3615
+ url: '/api/v1/{region}/bean/import/parser-coverage-miss',
3616
+ path: {
3617
+ region: data.region
3618
+ },
3619
+ body: data.requestBody,
3620
+ mediaType: 'application/json',
3621
+ errors: {
3622
+ 401: 'Unauthorized'
3623
+ }
2666
3624
  });
2667
3625
  }
2668
3626
 
2669
3627
  /**
2670
- * Match platforms by name or alias
3628
+ * Coverage metrics (uncovered format aggregation)
2671
3629
  * @param data The data for the request.
2672
- * @param data.q Search query — Chinese name, English name, or abbreviation
2673
- * @param data.region Region code for category override lookup
2674
- * @returns unknown List of matching platforms with suggested segment names
3630
+ * @param data.region Region code for tenant context
3631
+ * @param data.topN Top-N uncovered formats (default 10)
3632
+ * @returns unknown Coverage metrics
2675
3633
  * @throws ApiError
2676
3634
  */
2677
- public static platformControllerMatchPlatforms(
2678
- data: PlatformControllerMatchPlatformsData
2679
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3635
+ public static telemetryControllerGetCoverageMetrics(
3636
+ data: TelemetryControllerGetCoverageMetricsData
3637
+ ): CancelablePromise<TelemetryControllerGetCoverageMetricsResponse> {
2680
3638
  return __request(OpenAPI, {
2681
3639
  method: 'GET',
2682
- url: '/api/v1/bean/platforms/match',
2683
- query: {
2684
- q: data.q,
3640
+ url: '/api/v1/{region}/bean/import/parser-coverage-metrics',
3641
+ path: {
2685
3642
  region: data.region
3643
+ },
3644
+ query: {
3645
+ topN: data.topN
2686
3646
  }
2687
3647
  });
2688
3648
  }
3649
+ }
2689
3650
 
3651
+ export class BeanNlpService {
2690
3652
  /**
2691
- * Update a platform
3653
+ * Process natural language input
3654
+ * Parse natural language text (Chinese/English) describing a transaction. Supports multi-turn dialogue for collecting missing information. When confidence < 0.75, returns "confirm" action requiring user verification. User can reply with confirmation words (确认/yes/ok) or provide corrections. Examples: "yesterday Starbucks spent 35 yuan", "today lunch 28 yuan", "spent $50 at Walmart"
2692
3655
  * @param data The data for the request.
2693
- * @param data.id Platform ID
2694
- * @param data.requestBody
2695
- * @returns unknown Platform updated successfully
3656
+ * @param data.region Region code for tenant context
3657
+ * @param data.requestBody Natural language transaction input with optional session ID
3658
+ * @returns NlpResponseDto NLP processing result - either created transaction or asking for more info
2696
3659
  * @throws ApiError
2697
3660
  */
2698
- public static platformControllerUpdate(
2699
- data: PlatformControllerUpdateData
2700
- ): CancelablePromise<PlatformControllerUpdateResponse> {
3661
+ public static nlpControllerProcessNaturalLanguage(
3662
+ data: NlpControllerProcessNaturalLanguageData
3663
+ ): CancelablePromise<NlpControllerProcessNaturalLanguageResponse> {
2701
3664
  return __request(OpenAPI, {
2702
- method: 'PUT',
2703
- url: '/api/v1/bean/platforms/{id}',
3665
+ method: 'POST',
3666
+ url: '/api/v1/{region}/bean/nlp/process',
2704
3667
  path: {
2705
- id: data.id
3668
+ region: data.region
2706
3669
  },
2707
3670
  body: data.requestBody,
2708
3671
  mediaType: 'application/json',
2709
3672
  errors: {
2710
- 404: 'Platform not found'
3673
+ 400: 'Invalid input',
3674
+ 401: 'Unauthorized'
2711
3675
  }
2712
3676
  });
2713
3677
  }
2714
3678
 
2715
3679
  /**
2716
- * Delete a platform
3680
+ * Clear dialogue session
3681
+ * Clear the current NLP dialogue session. Use this to cancel an ongoing multi-turn dialogue.
2717
3682
  * @param data The data for the request.
2718
- * @param data.id Platform ID
2719
- * @returns void Platform deleted successfully
3683
+ * @param data.region Region code for tenant context
3684
+ * @param data.sessionId Specific session ID to clear (defaults to user session)
3685
+ * @returns void Session cleared successfully
2720
3686
  * @throws ApiError
2721
3687
  */
2722
- public static platformControllerDelete(
2723
- data: PlatformControllerDeleteData
2724
- ): CancelablePromise<PlatformControllerDeleteResponse> {
3688
+ public static nlpControllerClearSession(
3689
+ data: NlpControllerClearSessionData
3690
+ ): CancelablePromise<NlpControllerClearSessionResponse> {
2725
3691
  return __request(OpenAPI, {
2726
3692
  method: 'DELETE',
2727
- url: '/api/v1/bean/platforms/{id}',
3693
+ url: '/api/v1/{region}/bean/nlp/session',
2728
3694
  path: {
2729
- id: data.id
3695
+ region: data.region
3696
+ },
3697
+ query: {
3698
+ sessionId: data.sessionId
2730
3699
  },
2731
3700
  errors: {
2732
- 404: 'Platform not found'
3701
+ 401: 'Unauthorized'
2733
3702
  }
2734
3703
  });
2735
3704
  }
2736
- }
2737
3705
 
2738
- export class ProviderSyncService {
2739
3706
  /**
2740
- * Sync transactions from financial data provider
2741
- *
2742
- * Accepts raw transactions from external financial data providers, transforms them to Beancount format, and processes them through the ingestion pipeline.
2743
- *
2744
- * **Supported Providers:**
2745
- * - **plaid**: Plaid API (US, Canada, Europe)
2746
- * - **teller**: Teller API (US)
2747
- * - **truelayer**: TrueLayer Open Banking (UK, Europe)
2748
- * - **gocardless**: GoCardless Bank Account Data (Europe)
2749
- * - **simplefin**: SimpleFIN (Self-hosted)
2750
- * - **yodlee**: Yodlee (Global)
2751
- * - **beancount-direct**: Beancount format transactions
2752
- * - **parsed-bill**: Client-side parsed bill transactions
2753
- *
2754
- * **Processing Flow:**
2755
- * 1. Transform raw data via provider adapter
2756
- * 2. Validate transaction format
2757
- * 3. Deduplicate using originalId
2758
- * 4. Classify using rule engine
2759
- * 5. Route low-confidence to Review Center
2760
- * 6. Persist validated transactions
2761
- *
3707
+ * Get current session state
3708
+ * Get the current NLP dialogue session state. Useful for debugging and displaying session context in UI.
2762
3709
  * @param data The data for the request.
2763
- * @param data.providerName Provider name
2764
- * @param data.region Region code
2765
- * @param data.requestBody
2766
- * @returns ProviderSyncResponseDto Sync completed successfully
3710
+ * @param data.region Region code for tenant context
3711
+ * @param data.sessionId Specific session ID to get (defaults to user session)
3712
+ * @returns unknown Current session state (or null if no active session)
2767
3713
  * @throws ApiError
2768
3714
  */
2769
- public static providerSyncControllerSync(
2770
- data: ProviderSyncControllerSyncData
2771
- ): CancelablePromise<ProviderSyncControllerSyncResponse> {
3715
+ public static nlpControllerGetSession(
3716
+ data: NlpControllerGetSessionData
3717
+ ): CancelablePromise<NlpControllerGetSessionResponse> {
2772
3718
  return __request(OpenAPI, {
2773
- method: 'POST',
2774
- url: '/api/v1/{region}/bean/import/provider/{providerName}/sync',
3719
+ method: 'GET',
3720
+ url: '/api/v1/{region}/bean/nlp/session',
2775
3721
  path: {
2776
- providerName: data.providerName,
2777
3722
  region: data.region
2778
3723
  },
2779
- body: data.requestBody,
2780
- mediaType: 'application/json',
3724
+ query: {
3725
+ sessionId: data.sessionId
3726
+ },
2781
3727
  errors: {
2782
- 400: 'Invalid request data',
2783
- 401: 'Missing or invalid authentication',
2784
- 404: 'Provider not supported'
3728
+ 401: 'Unauthorized'
2785
3729
  }
2786
3730
  });
2787
3731
  }
3732
+ }
2788
3733
 
3734
+ export class BeanPlatformsService {
2789
3735
  /**
2790
- * Get supported providers
2791
- * Returns a list of all providers supported by the sync endpoint.
2792
- * @param data The data for the request.
2793
- * @param data.region Region code for tenant context
2794
- * @returns SupportedProvidersResponseDto List of supported providers
3736
+ * Get all platforms with statistics
3737
+ * @returns unknown List of platforms with binding and account counts
2795
3738
  * @throws ApiError
2796
3739
  */
2797
- public static providerSyncControllerGetSupportedProviders(
2798
- data: ProviderSyncControllerGetSupportedProvidersData
2799
- ): CancelablePromise<ProviderSyncControllerGetSupportedProvidersResponse> {
3740
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
2800
3741
  return __request(OpenAPI, {
2801
3742
  method: 'GET',
2802
- url: '/api/v1/{region}/bean/import/provider/supported',
2803
- path: {
2804
- region: data.region
2805
- },
3743
+ url: '/api/v1/bean/platforms'
3744
+ });
3745
+ }
3746
+
3747
+ /**
3748
+ * Create a new platform
3749
+ * @param data The data for the request.
3750
+ * @param data.requestBody
3751
+ * @returns unknown Platform created successfully
3752
+ * @throws ApiError
3753
+ */
3754
+ public static platformControllerCreate(
3755
+ data: PlatformControllerCreateData
3756
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3757
+ return __request(OpenAPI, {
3758
+ method: 'POST',
3759
+ url: '/api/v1/bean/platforms',
3760
+ body: data.requestBody,
3761
+ mediaType: 'application/json',
2806
3762
  errors: {
2807
- 401: 'Missing or invalid authentication'
3763
+ 409: 'Platform already exists'
2808
3764
  }
2809
3765
  });
2810
3766
  }
2811
3767
 
2812
3768
  /**
2813
- * Check if provider is supported
2814
- * Returns whether a specific provider is supported.
3769
+ * Get platform list for current user
2815
3770
  * @param data The data for the request.
2816
- * @param data.providerName Provider name to check
2817
- * @param data.region Region code for tenant context
2818
- * @returns unknown Provider support status
3771
+ * @param data.region Region code (ISO 3166-1 alpha-2) that biases within-type-bucket ordering (local-region platforms first). Case-insensitive — stored/compared UPPERCASE ("cn" == "CN").
3772
+ * @returns PlatformListItemDto List of platforms with user binding status
2819
3773
  * @throws ApiError
2820
3774
  */
2821
- public static providerSyncControllerIsProviderSupported(
2822
- data: ProviderSyncControllerIsProviderSupportedData
2823
- ): CancelablePromise<ProviderSyncControllerIsProviderSupportedResponse> {
3775
+ public static platformControllerGetPlatformList(
3776
+ data: PlatformControllerGetPlatformListData = {}
3777
+ ): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2824
3778
  return __request(OpenAPI, {
2825
3779
  method: 'GET',
2826
- url: '/api/v1/{region}/bean/import/provider/{providerName}/supported',
2827
- path: {
2828
- providerName: data.providerName,
3780
+ url: '/api/v1/bean/platforms/list',
3781
+ query: {
2829
3782
  region: data.region
2830
- },
2831
- errors: {
2832
- 401: 'Missing or invalid authentication'
2833
3783
  }
2834
3784
  });
2835
3785
  }
2836
- }
2837
3786
 
2838
- export class ImportTelemetryService {
2839
3787
  /**
2840
- * Receive anonymous parser failure telemetry
3788
+ * Match platforms by name or alias
2841
3789
  * @param data The data for the request.
2842
- * @param data.region Region code for tenant context
2843
- * @param data.requestBody
2844
- * @returns unknown Telemetry report received
3790
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3791
+ * @param data.region Region code (ISO 3166-1 alpha-2) that biases within-tier ordering (local-region platforms first); also the intended categoryOverrides key. Case-insensitive — stored/compared UPPERCASE ("cn" == "CN").
3792
+ * @returns PlatformMatchResponseDto Matching platforms with overall match type and truncation flag
2845
3793
  * @throws ApiError
2846
3794
  */
2847
- public static telemetryControllerReportTelemetry(
2848
- data: TelemetryControllerReportTelemetryData
2849
- ): CancelablePromise<TelemetryControllerReportTelemetryResponse> {
3795
+ public static platformControllerMatchPlatforms(
3796
+ data: PlatformControllerMatchPlatformsData
3797
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
2850
3798
  return __request(OpenAPI, {
2851
- method: 'POST',
2852
- url: '/api/v1/{region}/bean/import/parser-telemetry',
2853
- path: {
3799
+ method: 'GET',
3800
+ url: '/api/v1/bean/platforms/match',
3801
+ query: {
3802
+ q: data.q,
2854
3803
  region: data.region
2855
- },
2856
- body: data.requestBody,
2857
- mediaType: 'application/json',
2858
- errors: {
2859
- 401: 'Unauthorized'
2860
3804
  }
2861
3805
  });
2862
3806
  }
2863
- }
2864
3807
 
2865
- export class BeanNlpService {
2866
3808
  /**
2867
- * Process natural language input
2868
- * Parse natural language text (Chinese/English) describing a transaction. Supports multi-turn dialogue for collecting missing information. When confidence < 0.75, returns "confirm" action requiring user verification. User can reply with confirmation words (确认/yes/ok) or provide corrections. Examples: "yesterday Starbucks spent 35 yuan", "today lunch 28 yuan", "spent $50 at Walmart"
3809
+ * Get the region and candidate account standards for a platform
2869
3810
  * @param data The data for the request.
2870
- * @param data.region Region code for tenant context
2871
- * @param data.requestBody Natural language transaction input with optional session ID
2872
- * @returns NlpResponseDto NLP processing result - either created transaction or asking for more info
3811
+ * @param data.id Platform ID (from a match result)
3812
+ * @param data.region Region code (ISO 3166-1 alpha-2, case-insensitive). Required for global platforms (countryCode null) — resolved as their template region; ignored when the platform has its own countryCode.
3813
+ * @param data.type Filter templates by account type (path first segment)
3814
+ * @returns PlatformStandardsResponseDto Resolved region plus the merged account-standard catalog of that region (groupable by productCategory client-side)
2873
3815
  * @throws ApiError
2874
3816
  */
2875
- public static nlpControllerProcessNaturalLanguage(
2876
- data: NlpControllerProcessNaturalLanguageData
2877
- ): CancelablePromise<NlpControllerProcessNaturalLanguageResponse> {
3817
+ public static platformControllerGetPlatformStandards(
3818
+ data: PlatformControllerGetPlatformStandardsData
3819
+ ): CancelablePromise<PlatformControllerGetPlatformStandardsResponse> {
2878
3820
  return __request(OpenAPI, {
2879
- method: 'POST',
2880
- url: '/api/v1/{region}/bean/nlp/process',
3821
+ method: 'GET',
3822
+ url: '/api/v1/bean/platforms/{id}/standards',
2881
3823
  path: {
2882
- region: data.region
3824
+ id: data.id
2883
3825
  },
2884
- body: data.requestBody,
2885
- mediaType: 'application/json',
2886
- errors: {
2887
- 400: 'Invalid input',
2888
- 401: 'Unauthorized'
3826
+ query: {
3827
+ region: data.region,
3828
+ type: data.type
2889
3829
  }
2890
3830
  });
2891
3831
  }
2892
3832
 
2893
3833
  /**
2894
- * Clear dialogue session
2895
- * Clear the current NLP dialogue session. Use this to cancel an ongoing multi-turn dialogue.
3834
+ * Update a platform
2896
3835
  * @param data The data for the request.
2897
- * @param data.region Region code for tenant context
2898
- * @param data.sessionId Specific session ID to clear (defaults to user session)
2899
- * @returns void Session cleared successfully
3836
+ * @param data.id Platform ID
3837
+ * @param data.requestBody
3838
+ * @returns unknown Platform updated successfully
2900
3839
  * @throws ApiError
2901
3840
  */
2902
- public static nlpControllerClearSession(
2903
- data: NlpControllerClearSessionData
2904
- ): CancelablePromise<NlpControllerClearSessionResponse> {
3841
+ public static platformControllerUpdate(
3842
+ data: PlatformControllerUpdateData
3843
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
2905
3844
  return __request(OpenAPI, {
2906
- method: 'DELETE',
2907
- url: '/api/v1/{region}/bean/nlp/session',
3845
+ method: 'PUT',
3846
+ url: '/api/v1/bean/platforms/{id}',
2908
3847
  path: {
2909
- region: data.region
2910
- },
2911
- query: {
2912
- sessionId: data.sessionId
3848
+ id: data.id
2913
3849
  },
3850
+ body: data.requestBody,
3851
+ mediaType: 'application/json',
2914
3852
  errors: {
2915
- 401: 'Unauthorized'
3853
+ 404: 'Platform not found'
2916
3854
  }
2917
3855
  });
2918
3856
  }
2919
3857
 
2920
3858
  /**
2921
- * Get current session state
2922
- * Get the current NLP dialogue session state. Useful for debugging and displaying session context in UI.
3859
+ * Delete a platform
2923
3860
  * @param data The data for the request.
2924
- * @param data.region Region code for tenant context
2925
- * @param data.sessionId Specific session ID to get (defaults to user session)
2926
- * @returns unknown Current session state (or null if no active session)
3861
+ * @param data.id Platform ID
3862
+ * @returns void Platform deleted successfully
2927
3863
  * @throws ApiError
2928
3864
  */
2929
- public static nlpControllerGetSession(
2930
- data: NlpControllerGetSessionData
2931
- ): CancelablePromise<NlpControllerGetSessionResponse> {
3865
+ public static platformControllerDelete(
3866
+ data: PlatformControllerDeleteData
3867
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
2932
3868
  return __request(OpenAPI, {
2933
- method: 'GET',
2934
- url: '/api/v1/{region}/bean/nlp/session',
3869
+ method: 'DELETE',
3870
+ url: '/api/v1/bean/platforms/{id}',
2935
3871
  path: {
2936
- region: data.region
2937
- },
2938
- query: {
2939
- sessionId: data.sessionId
3872
+ id: data.id
2940
3873
  },
2941
3874
  errors: {
2942
- 401: 'Unauthorized'
3875
+ 404: 'Platform not found'
2943
3876
  }
2944
3877
  });
2945
3878
  }
@@ -2980,6 +3913,7 @@ export class DashboardService {
2980
3913
  * @param data.region Region code for tenant context
2981
3914
  * @param data.groupBy Grouping strategy
2982
3915
  * @param data.date Date for balance calculation (ISO 8601 format)
3916
+ * @param data.accountId Scope to a single account (only valid with groupBy=holdingAssetClass, ADR-0105 §6)
2983
3917
  * @returns unknown Accounts retrieved successfully. Response type depends on groupBy parameter.
2984
3918
  * @throws ApiError
2985
3919
  */
@@ -2994,7 +3928,8 @@ export class DashboardService {
2994
3928
  },
2995
3929
  query: {
2996
3930
  groupBy: data.groupBy,
2997
- date: data.date
3931
+ date: data.date,
3932
+ accountId: data.accountId
2998
3933
  },
2999
3934
  errors: {
3000
3935
  401: 'User not authenticated'
@@ -3029,124 +3964,69 @@ export class DashboardService {
3029
3964
  }
3030
3965
  });
3031
3966
  }
3032
- }
3033
3967
 
3034
- export class ReportingService {
3035
3968
  /**
3036
- * Get portfolio value trends
3037
- *
3038
- * Returns time series data of portfolio net worth.
3039
- *
3040
- * **Multi-currency Support:**
3041
- * - `series[].byCurrency` - Currency breakdown for each data point
3042
- * - `byCurrency` - Separate time series grouped by currency
3043
- * - `warnings` - Exchange rate warnings if conversion failed
3044
- *
3045
- * **Parameters:**
3046
- * - `period`: Time period (1m, 3m, 6m, 1y)
3047
- * - `granularity`: Data granularity (day, week, month)
3048
- *
3969
+ * Get expenses/income grouped by functional category
3970
+ * Returns amounts pre-aggregated by functional category (account-path Group segment) with server-side multi-currency conversion. flow=expense (default) aggregates ^Expenses: accounts; flow=income aggregates ^Income: accounts (issue #518)
3049
3971
  * @param data The data for the request.
3050
3972
  * @param data.region Region code for tenant context
3051
- * @param data.period Time period
3052
- * @param data.granularity Data granularity
3053
- * @returns PortfolioTrendsResponseDto Trends retrieved successfully
3973
+ * @param data.groupBy Grouping strategy
3974
+ * @param data.period Time window (1m = current calendar month)
3975
+ * @param data.flow Account root to aggregate (expense → ^Expenses:, income → ^Income:)
3976
+ * @returns ExpensesByCategoryResponseDto Expenses retrieved successfully
3054
3977
  * @throws ApiError
3055
3978
  */
3056
- public static reportingControllerGetPortfolioTrends(
3057
- data: ReportingControllerGetPortfolioTrendsData
3058
- ): CancelablePromise<ReportingControllerGetPortfolioTrendsResponse> {
3979
+ public static dashboardControllerGetExpenses(
3980
+ data: DashboardControllerGetExpensesData
3981
+ ): CancelablePromise<DashboardControllerGetExpensesResponse> {
3059
3982
  return __request(OpenAPI, {
3060
3983
  method: 'GET',
3061
- url: '/api/v1/{region}/reporting/portfolio/trends',
3984
+ url: '/api/v1/{region}/dashboard/expenses',
3062
3985
  path: {
3063
3986
  region: data.region
3064
3987
  },
3065
3988
  query: {
3989
+ groupBy: data.groupBy,
3066
3990
  period: data.period,
3067
- granularity: data.granularity
3991
+ flow: data.flow
3068
3992
  },
3069
3993
  errors: {
3994
+ 400: 'Invalid groupBy or period',
3070
3995
  401: 'User not authenticated'
3071
3996
  }
3072
3997
  });
3073
3998
  }
3999
+ }
3074
4000
 
4001
+ export class InvestmentService {
3075
4002
  /**
3076
- * Generate portfolio snapshot
3077
- *
3078
- * Manually generate a portfolio snapshot for a specific date.
3079
- *
3080
- * **Multi-currency Support:**
3081
- * - Fetches balances grouped by currency
3082
- * - Uses user's baseCurrency setting for conversion
3083
- * - Stores exchange rates and warnings
3084
- *
3085
- * **Use Cases:**
3086
- * - Testing snapshot generation
3087
- * - Force regeneration after data correction
3088
- * - Initial setup for new users
3089
- *
4003
+ * Get per-holding unrealized + realized P&L
4004
+ * Average-cost unrealized P&L per account × commodity, plus cumulative realized P&L on sold lots (method = FIFO | average, default average).
3090
4005
  * @param data The data for the request.
3091
4006
  * @param data.region Region code for tenant context
3092
- * @param data.requestBody Optional date (defaults to today)
3093
- * @returns GenerateSnapshotResponse Snapshot generated successfully
4007
+ * @param data.asOf As-of date (ISO 8601), defaults to today
4008
+ * @param data.accountId Scope to a single account
4009
+ * @param data.method Realized-P&L lot-matching method (default average). Does not affect the average-cost unrealized basis.
4010
+ * @returns HoldingPnlResponseDto Holding P&L retrieved successfully
3094
4011
  * @throws ApiError
3095
4012
  */
3096
- public static reportingControllerGenerateSnapshot(
3097
- data: ReportingControllerGenerateSnapshotData
3098
- ): CancelablePromise<ReportingControllerGenerateSnapshotResponse> {
4013
+ public static holdingPnlControllerGetHoldingPnl(
4014
+ data: HoldingPnlControllerGetHoldingPnlData
4015
+ ): CancelablePromise<HoldingPnlControllerGetHoldingPnlResponse> {
3099
4016
  return __request(OpenAPI, {
3100
- method: 'POST',
3101
- url: '/api/v1/{region}/reporting/snapshots/generate',
4017
+ method: 'GET',
4018
+ url: '/api/v1/{region}/investment/holdings/pnl',
3102
4019
  path: {
3103
4020
  region: data.region
3104
4021
  },
3105
- body: data.requestBody,
3106
- mediaType: 'application/json',
3107
- errors: {
3108
- 400: 'Invalid date format',
3109
- 401: 'User not authenticated'
3110
- }
3111
- });
3112
- }
3113
-
3114
- /**
3115
- * Backfill portfolio snapshots
3116
- *
3117
- * Generate snapshots for a date range (historical data backfill).
3118
- *
3119
- * **Multi-currency Support:**
3120
- * - Each snapshot includes multi-currency data
3121
- * - Uses exchange rates available at generation time
3122
- * - Warnings stored for missing exchange rates
3123
- *
3124
- * **Best Practices:**
3125
- * - Use for initial setup after account configuration
3126
- * - Run during low-traffic periods for large date ranges
3127
- * - Existing snapshots are skipped (not regenerated)
3128
- *
3129
- * @param data The data for the request.
3130
- * @param data.region Region code for tenant context
3131
- * @param data.requestBody
3132
- * @returns BackfillSnapshotsResponse Backfill completed successfully
3133
- * @throws ApiError
3134
- */
3135
- public static reportingControllerBackfillSnapshots(
3136
- data: ReportingControllerBackfillSnapshotsData
3137
- ): CancelablePromise<ReportingControllerBackfillSnapshotsResponse> {
3138
- return __request(OpenAPI, {
3139
- method: 'POST',
3140
- url: '/api/v1/{region}/reporting/snapshots/backfill',
3141
- path: {
3142
- region: data.region
4022
+ query: {
4023
+ asOf: data.asOf,
4024
+ accountId: data.accountId,
4025
+ method: data.method
3143
4026
  },
3144
- body: data.requestBody,
3145
- mediaType: 'application/json',
3146
4027
  errors: {
3147
- 400: 'Invalid date format or range',
3148
- 401: 'User not authenticated',
3149
- 409: 'Backfill already in progress for this user'
4028
+ 400: 'Invalid asOf format/value/future date, invalid accountId format, or unsupported method',
4029
+ 401: 'User not authenticated'
3150
4030
  }
3151
4031
  });
3152
4032
  }
@@ -3175,7 +4055,7 @@ export class AuthService {
3175
4055
  * Anonymous login with access token
3176
4056
  * @param data The data for the request.
3177
4057
  * @param data.requestBody
3178
- * @returns unknown Login successful
4058
+ * @returns AnonymousLoginResponseDto Login successful
3179
4059
  * @throws ApiError
3180
4060
  */
3181
4061
  public static authControllerAccessTokenLogin(
@@ -3193,15 +4073,52 @@ export class AuthService {
3193
4073
  }
3194
4074
  }
3195
4075
 
3196
- export class DefaultService {
4076
+ export class CommunityService {
4077
+ /**
4078
+ * Relay a sanitized parser-contribution payload
4079
+ * A server-side bot re-sanitizes the payload and opens an issue on the target repository; the issue URL is returned. The payload is never persisted or logged (forward-and-drop).
4080
+ * @param data The data for the request.
4081
+ * @param data.region Region code for tenant context (routing only; the institution region rides in the payload meta)
4082
+ * @param data.requestBody
4083
+ * @returns ParserContributionRelayResponseDto Issue created by the bot
4084
+ * @throws ApiError
4085
+ */
4086
+ public static parserContributionControllerCreate(
4087
+ data: ParserContributionControllerCreateData
4088
+ ): CancelablePromise<ParserContributionControllerCreateResponse> {
4089
+ return __request(OpenAPI, {
4090
+ method: 'POST',
4091
+ url: '/api/v1/{region}/community/parser-contributions',
4092
+ path: {
4093
+ region: data.region
4094
+ },
4095
+ body: data.requestBody,
4096
+ mediaType: 'application/json',
4097
+ errors: {
4098
+ 401: 'Unauthorized',
4099
+ 422: 'Validation failed (institution slug, empty samples, row/cell size limits)',
4100
+ 429: 'Rate limited (5 submissions per user per hour)',
4101
+ 501: 'Relay not configured on this deployment — clients fall back to the clipboard flow',
4102
+ 502: 'GitHub bot failure (upstream), safe to retry'
4103
+ }
4104
+ });
4105
+ }
4106
+ }
4107
+
4108
+ export class AdminCacheService {
3197
4109
  /**
3198
- * @returns unknown
4110
+ * Flush entire cache (L1 + L2)
4111
+ * Clears ALL cache entries across ALL namespaces and users. Use only for emergency cache corruption recovery, maintenance-window refresh, or development resets.
4112
+ * @returns unknown Cache flushed successfully
3199
4113
  * @throws ApiError
3200
4114
  */
3201
4115
  public static cacheControllerFlushCache(): CancelablePromise<CacheControllerFlushCacheResponse> {
3202
4116
  return __request(OpenAPI, {
3203
4117
  method: 'POST',
3204
- url: '/api/v1/cache/flush'
4118
+ url: '/api/v1/cache/flush',
4119
+ errors: {
4120
+ 403: 'Admin access required'
4121
+ }
3205
4122
  });
3206
4123
  }
3207
4124
  }
@@ -3362,3 +4279,53 @@ export class InfoService {
3362
4279
  });
3363
4280
  }
3364
4281
  }
4282
+
4283
+ export class MarketDataService {
4284
+ /**
4285
+ * Search market symbols by name or code
4286
+ * Ranked search over the openbb catalog. Empty `q` returns [].
4287
+ * @param data The data for the request.
4288
+ * @param data.q Search term — matched against symbol and instrument name. Empty string returns [].
4289
+ * @param data.limit Maximum number of results (clamped 1..50)
4290
+ * @param data.exchange Filter by exchange code (e.g. US, HK, SS, SZ)
4291
+ * @param data.assetType Filter by OpenBB asset_type (e.g. stock, etf)
4292
+ * @returns SymbolSearchResultDto Ranked search results
4293
+ * @throws ApiError
4294
+ */
4295
+ public static symbolControllerSearch(
4296
+ data: SymbolControllerSearchData
4297
+ ): CancelablePromise<SymbolControllerSearchResponse> {
4298
+ return __request(OpenAPI, {
4299
+ method: 'GET',
4300
+ url: '/api/v1/market/symbols/search',
4301
+ query: {
4302
+ q: data.q,
4303
+ limit: data.limit,
4304
+ exchange: data.exchange,
4305
+ assetType: data.assetType
4306
+ }
4307
+ });
4308
+ }
4309
+
4310
+ /**
4311
+ * Get a market symbol quote
4312
+ * @param data The data for the request.
4313
+ * @param data.symbol
4314
+ * @returns SymbolQuoteDto Symbol quote
4315
+ * @throws ApiError
4316
+ */
4317
+ public static symbolControllerGetQuote(
4318
+ data: SymbolControllerGetQuoteData
4319
+ ): CancelablePromise<SymbolControllerGetQuoteResponse> {
4320
+ return __request(OpenAPI, {
4321
+ method: 'GET',
4322
+ url: '/api/v1/market/symbols/{symbol}/quote',
4323
+ path: {
4324
+ symbol: data.symbol
4325
+ },
4326
+ errors: {
4327
+ 404: 'Symbol not found in the openbb catalog'
4328
+ }
4329
+ });
4330
+ }
4331
+ }