@firela/api-types 0.0.0-canary.610daafc → 0.0.0-canary.63a53b7d

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,18 @@ import type {
97
99
  CommodityControllerGetOrCreateResponse,
98
100
  CommodityControllerBulkCreateData,
99
101
  CommodityControllerBulkCreateResponse,
102
+ PriceControllerCreateData,
103
+ PriceControllerCreateResponse,
104
+ PriceControllerFindAllData,
105
+ PriceControllerFindAllResponse,
106
+ PriceControllerFindOneData,
107
+ PriceControllerFindOneResponse,
108
+ PriceControllerUpdateData,
109
+ PriceControllerUpdateResponse,
110
+ PriceControllerDeleteData,
111
+ PriceControllerDeleteResponse,
112
+ PriceControllerBulkCreateData,
113
+ PriceControllerBulkCreateResponse,
100
114
  RecurringRuleControllerCreateData,
101
115
  RecurringRuleControllerCreateResponse,
102
116
  RecurringRuleControllerFindAllData,
@@ -183,6 +197,16 @@ import type {
183
197
  EventControllerDeleteResponse,
184
198
  EventControllerGetSliceData,
185
199
  EventControllerGetSliceResponse,
200
+ OnboardingControllerBootstrapData,
201
+ OnboardingControllerBootstrapResponse,
202
+ ReconciliationControllerComputeData,
203
+ ReconciliationControllerComputeResponse,
204
+ ReconciliationControllerAssertData,
205
+ ReconciliationControllerAssertResponse,
206
+ ReconciliationControllerPadData,
207
+ ReconciliationControllerPadResponse,
208
+ ReconciliationControllerHistoryData,
209
+ ReconciliationControllerHistoryResponse,
186
210
  ExportControllerExportBeancountResponse,
187
211
  FileImportControllerImportFileData,
188
212
  FileImportControllerImportFileResponse,
@@ -196,22 +220,20 @@ import type {
196
220
  ImporterConfigControllerUpdateConfigResponse,
197
221
  ImporterConfigControllerResetConfigData,
198
222
  ImporterConfigControllerResetConfigResponse,
199
- PlatformControllerFindAllResponse,
200
- PlatformControllerCreateData,
201
- PlatformControllerCreateResponse,
202
- PlatformControllerGetPlatformListResponse,
203
- PlatformControllerMatchPlatformsData,
204
- PlatformControllerMatchPlatformsResponse,
205
- PlatformControllerUpdateData,
206
- PlatformControllerUpdateResponse,
207
- PlatformControllerDeleteData,
208
- PlatformControllerDeleteResponse,
209
223
  ProviderSyncControllerSyncData,
210
224
  ProviderSyncControllerSyncResponse,
211
225
  ProviderSyncControllerGetSupportedProvidersData,
212
226
  ProviderSyncControllerGetSupportedProvidersResponse,
213
227
  ProviderSyncControllerIsProviderSupportedData,
214
228
  ProviderSyncControllerIsProviderSupportedResponse,
229
+ ExternalAccountLinkControllerCreateData,
230
+ ExternalAccountLinkControllerCreateResponse,
231
+ ExternalAccountLinkControllerFindAllData,
232
+ ExternalAccountLinkControllerFindAllResponse,
233
+ ExternalAccountLinkControllerFindOneData,
234
+ ExternalAccountLinkControllerFindOneResponse,
235
+ ExternalAccountLinkControllerRemoveData,
236
+ ExternalAccountLinkControllerRemoveResponse,
215
237
  TelemetryControllerReportTelemetryData,
216
238
  TelemetryControllerReportTelemetryResponse,
217
239
  TelemetryControllerReportCoverageMissData,
@@ -224,6 +246,16 @@ import type {
224
246
  NlpControllerClearSessionResponse,
225
247
  NlpControllerGetSessionData,
226
248
  NlpControllerGetSessionResponse,
249
+ PlatformControllerFindAllResponse,
250
+ PlatformControllerCreateData,
251
+ PlatformControllerCreateResponse,
252
+ PlatformControllerGetPlatformListResponse,
253
+ PlatformControllerMatchPlatformsData,
254
+ PlatformControllerMatchPlatformsResponse,
255
+ PlatformControllerUpdateData,
256
+ PlatformControllerUpdateResponse,
257
+ PlatformControllerDeleteData,
258
+ PlatformControllerDeleteResponse,
227
259
  DashboardControllerGetNetWorthData,
228
260
  DashboardControllerGetNetWorthResponse,
229
261
  DashboardControllerGetAccountsData,
@@ -234,18 +266,6 @@ import type {
234
266
  DashboardControllerGetExpensesResponse,
235
267
  HoldingPnlControllerGetHoldingPnlData,
236
268
  HoldingPnlControllerGetHoldingPnlResponse,
237
- PriceControllerCreateData,
238
- PriceControllerCreateResponse,
239
- PriceControllerFindAllData,
240
- PriceControllerFindAllResponse,
241
- PriceControllerFindOneData,
242
- PriceControllerFindOneResponse,
243
- PriceControllerUpdateData,
244
- PriceControllerUpdateResponse,
245
- PriceControllerDeleteData,
246
- PriceControllerDeleteResponse,
247
- PriceControllerBulkCreateData,
248
- PriceControllerBulkCreateResponse,
249
269
  ReportingControllerGetPortfolioTrendsData,
250
270
  ReportingControllerGetPortfolioTrendsResponse,
251
271
  ReportingControllerGetCashFlowTrendsData,
@@ -306,7 +326,7 @@ export class BeanAccountsService {
306
326
  * @param data.type Filter by account type
307
327
  * @param data.status Filter by status
308
328
  * @param data.isCustom Filter by custom (user-created) accounts only
309
- * @param data.search Search term for path or i18nKey
329
+ * @param data.search Search term for account path
310
330
  * @param data.limit Maximum number of results
311
331
  * @param data.offset Number of results to skip
312
332
  * @returns AccountListResponseDto Accounts retrieved successfully
@@ -468,6 +488,35 @@ export class BeanAccountsService {
468
488
  }
469
489
  });
470
490
  }
491
+
492
+ /**
493
+ * Post an opening-balance transaction
494
+ * 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.
495
+ * @param data The data for the request.
496
+ * @param data.id Account UUID
497
+ * @param data.region Region code for tenant context
498
+ * @param data.requestBody
499
+ * @returns OpeningBalanceResultDto Opening-balance transaction created
500
+ * @throws ApiError
501
+ */
502
+ public static accountControllerAddOpeningBalance(
503
+ data: AccountControllerAddOpeningBalanceData
504
+ ): CancelablePromise<AccountControllerAddOpeningBalanceResponse> {
505
+ return __request(OpenAPI, {
506
+ method: 'POST',
507
+ url: '/api/v1/{region}/bean/accounts/{id}/opening-balance',
508
+ path: {
509
+ id: data.id,
510
+ region: data.region
511
+ },
512
+ body: data.requestBody,
513
+ mediaType: 'application/json',
514
+ errors: {
515
+ 404: 'Account not found',
516
+ 409: 'An opening balance already exists for this account'
517
+ }
518
+ });
519
+ }
471
520
  }
472
521
 
473
522
  export class BeanAccountStandardsService {
@@ -499,7 +548,7 @@ export class BeanAccountStandardsService {
499
548
 
500
549
  /**
501
550
  * Get template metadata for an account path
502
- * Returns extendable status and root type for a template path.
551
+ * Returns root type for a template path.
503
552
  * @param data The data for the request.
504
553
  * @param data.region Region code for tenant context
505
554
  * @param data.path Account path to check
@@ -794,7 +843,7 @@ export class BeanBalancesService {
794
843
  * Query account balance
795
844
  * Calculate account balance at a specific date for a single currency
796
845
  * @param data The data for the request.
797
- * @param data.account Account name (e.g., "Assets:Bank:Checking")
846
+ * @param data.account Account name (e.g., "Assets:Checking")
798
847
  * @param data.region Region code for tenant context
799
848
  * @param data.date Date to calculate balance at (ISO 8601 format)
800
849
  * @param data.currency Currency to query (e.g., "USD", "CNY")
@@ -1515,6 +1564,173 @@ export class BeanCommoditiesService {
1515
1564
  }
1516
1565
  }
1517
1566
 
1567
+ export class BeanPricesService {
1568
+ /**
1569
+ * Create a new price
1570
+ * Creates a new price entry for the authenticated user
1571
+ * @param data The data for the request.
1572
+ * @param data.region Region code for tenant context
1573
+ * @param data.requestBody
1574
+ * @returns PriceResponseDto Price created successfully
1575
+ * @throws ApiError
1576
+ */
1577
+ public static priceControllerCreate(
1578
+ data: PriceControllerCreateData
1579
+ ): CancelablePromise<PriceControllerCreateResponse> {
1580
+ return __request(OpenAPI, {
1581
+ method: 'POST',
1582
+ url: '/api/v1/{region}/bean/prices',
1583
+ path: {
1584
+ region: data.region
1585
+ },
1586
+ body: data.requestBody,
1587
+ mediaType: 'application/json',
1588
+ errors: {
1589
+ 404: 'Currency or quoteCurrency commodity not found',
1590
+ 409: 'Price already exists for this currency pair and date'
1591
+ }
1592
+ });
1593
+ }
1594
+
1595
+ /**
1596
+ * List user prices
1597
+ * Returns all price entries for the authenticated user with optional filtering
1598
+ * @param data The data for the request.
1599
+ * @param data.region Region code for tenant context
1600
+ * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
1601
+ * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
1602
+ * @param data.dateFrom Filter prices from this date (ISO 8601 format)
1603
+ * @param data.dateTo Filter prices to this date (ISO 8601 format)
1604
+ * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
1605
+ * @param data.page Page number for pagination (default: 1)
1606
+ * @param data.limit Number of items per page (default: 20, max: 100)
1607
+ * @returns PriceListResponseDto Prices retrieved successfully
1608
+ * @throws ApiError
1609
+ */
1610
+ public static priceControllerFindAll(
1611
+ data: PriceControllerFindAllData
1612
+ ): CancelablePromise<PriceControllerFindAllResponse> {
1613
+ return __request(OpenAPI, {
1614
+ method: 'GET',
1615
+ url: '/api/v1/{region}/bean/prices',
1616
+ path: {
1617
+ region: data.region
1618
+ },
1619
+ query: {
1620
+ currency: data.currency,
1621
+ quoteCurrency: data.quoteCurrency,
1622
+ dateFrom: data.dateFrom,
1623
+ dateTo: data.dateTo,
1624
+ search: data.search,
1625
+ page: data.page,
1626
+ limit: data.limit
1627
+ }
1628
+ });
1629
+ }
1630
+
1631
+ /**
1632
+ * Get price by ID
1633
+ * Returns a single price entry by its ID
1634
+ * @param data The data for the request.
1635
+ * @param data.id Price ID
1636
+ * @param data.region Region code for tenant context
1637
+ * @returns PriceResponseDto Price retrieved successfully
1638
+ * @throws ApiError
1639
+ */
1640
+ public static priceControllerFindOne(
1641
+ data: PriceControllerFindOneData
1642
+ ): CancelablePromise<PriceControllerFindOneResponse> {
1643
+ return __request(OpenAPI, {
1644
+ method: 'GET',
1645
+ url: '/api/v1/{region}/bean/prices/{id}',
1646
+ path: {
1647
+ id: data.id,
1648
+ region: data.region
1649
+ },
1650
+ errors: {
1651
+ 404: 'Price not found'
1652
+ }
1653
+ });
1654
+ }
1655
+
1656
+ /**
1657
+ * Update a price
1658
+ * Updates an existing price entry
1659
+ * @param data The data for the request.
1660
+ * @param data.id Price ID
1661
+ * @param data.region Region code for tenant context
1662
+ * @param data.requestBody
1663
+ * @returns PriceResponseDto Price updated successfully
1664
+ * @throws ApiError
1665
+ */
1666
+ public static priceControllerUpdate(
1667
+ data: PriceControllerUpdateData
1668
+ ): CancelablePromise<PriceControllerUpdateResponse> {
1669
+ return __request(OpenAPI, {
1670
+ method: 'PUT',
1671
+ url: '/api/v1/{region}/bean/prices/{id}',
1672
+ path: {
1673
+ id: data.id,
1674
+ region: data.region
1675
+ },
1676
+ body: data.requestBody,
1677
+ mediaType: 'application/json',
1678
+ errors: {
1679
+ 404: 'Price not found',
1680
+ 409: 'Updated price conflicts with existing price'
1681
+ }
1682
+ });
1683
+ }
1684
+
1685
+ /**
1686
+ * Delete a price
1687
+ * Deletes a price entry (hard delete)
1688
+ * @param data The data for the request.
1689
+ * @param data.id Price ID
1690
+ * @param data.region Region code for tenant context
1691
+ * @returns void Price deleted successfully
1692
+ * @throws ApiError
1693
+ */
1694
+ public static priceControllerDelete(
1695
+ data: PriceControllerDeleteData
1696
+ ): CancelablePromise<PriceControllerDeleteResponse> {
1697
+ return __request(OpenAPI, {
1698
+ method: 'DELETE',
1699
+ url: '/api/v1/{region}/bean/prices/{id}',
1700
+ path: {
1701
+ id: data.id,
1702
+ region: data.region
1703
+ },
1704
+ errors: {
1705
+ 404: 'Price not found'
1706
+ }
1707
+ });
1708
+ }
1709
+
1710
+ /**
1711
+ * Bulk create prices
1712
+ * Creates multiple price entries at once (skips duplicates)
1713
+ * @param data The data for the request.
1714
+ * @param data.region Region code for tenant context
1715
+ * @param data.requestBody
1716
+ * @returns PriceResponseDto Prices created successfully
1717
+ * @throws ApiError
1718
+ */
1719
+ public static priceControllerBulkCreate(
1720
+ data: PriceControllerBulkCreateData
1721
+ ): CancelablePromise<PriceControllerBulkCreateResponse> {
1722
+ return __request(OpenAPI, {
1723
+ method: 'POST',
1724
+ url: '/api/v1/{region}/bean/prices/bulk',
1725
+ path: {
1726
+ region: data.region
1727
+ },
1728
+ body: data.requestBody,
1729
+ mediaType: 'application/json'
1730
+ });
1731
+ }
1732
+ }
1733
+
1518
1734
  export class RecurringRulesService {
1519
1735
  /**
1520
1736
  * Create a new recurring rule
@@ -2653,29 +2869,162 @@ export class LifeEventsService {
2653
2869
  }
2654
2870
  }
2655
2871
 
2656
- export class BeanExportService {
2872
+ export class OnboardingService {
2657
2873
  /**
2658
- * Export Beancount ledger as ZIP
2659
- * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
2660
- * @returns unknown
2874
+ * Bootstrap core accounts + register asset accounts with opening balances (ADR-0113)
2875
+ * @param data The data for the request.
2876
+ * @param data.region Region code for tenant context
2877
+ * @param data.requestBody
2878
+ * @returns unknown Onboarding bootstrap result.
2661
2879
  * @throws ApiError
2662
2880
  */
2663
- public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
2881
+ public static onboardingControllerBootstrap(
2882
+ data: OnboardingControllerBootstrapData
2883
+ ): CancelablePromise<OnboardingControllerBootstrapResponse> {
2664
2884
  return __request(OpenAPI, {
2665
- method: 'GET',
2666
- url: '/api/v1/{region}/bean/export/beancount'
2885
+ method: 'POST',
2886
+ url: '/api/v1/{region}/bean/onboarding',
2887
+ path: {
2888
+ region: data.region
2889
+ },
2890
+ body: data.requestBody,
2891
+ mediaType: 'application/json',
2892
+ errors: {
2893
+ 422: 'Invalid region/account path/duplicate paths.'
2894
+ }
2667
2895
  });
2668
2896
  }
2669
2897
  }
2670
2898
 
2671
- export class BeanImportService {
2899
+ export class BalanceReconciliationService {
2672
2900
  /**
2673
- * Import a bill file
2674
- * Upload and process a bill file (CSV, PDF, OFX, etc.). The system automatically identifies the file type, extracts transactions, validates them, and stores only validated transactions to the database. Maximum file size: 50MB. Only 1 import per user at a time (concurrent imports rejected with 429).
2901
+ * Preview reconciliation (book vs actual)
2902
+ * Computes book balance, diff, Beancount-inferred tolerance, and suggested action without persisting.
2675
2903
  * @param data The data for the request.
2676
- * @param data.region Region code for tenant context
2677
- * @param data.formData Bill file to import
2678
- * @returns ImportResultDto File imported successfully
2904
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2905
+ * @param data.requestBody
2906
+ * @returns ReconciliationComputeResultDto Reconciliation preview
2907
+ * @throws ApiError
2908
+ */
2909
+ public static reconciliationControllerCompute(
2910
+ data: ReconciliationControllerComputeData
2911
+ ): CancelablePromise<ReconciliationControllerComputeResponse> {
2912
+ return __request(OpenAPI, {
2913
+ method: 'POST',
2914
+ url: '/api/v1/{region}/bean/reconciliations',
2915
+ path: {
2916
+ region: data.region
2917
+ },
2918
+ body: data.requestBody,
2919
+ mediaType: 'application/json',
2920
+ errors: {
2921
+ 404: 'Account not found'
2922
+ }
2923
+ });
2924
+ }
2925
+
2926
+ /**
2927
+ * Record a balance assertion
2928
+ * Persists the reconciliation as a BeanBalance assertion (amount = actual, diffAmount = book − actual). Re-reconciling the same day/currency upserts.
2929
+ * @param data The data for the request.
2930
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2931
+ * @param data.requestBody
2932
+ * @returns ReconciliationRecordDto Balance assertion recorded
2933
+ * @throws ApiError
2934
+ */
2935
+ public static reconciliationControllerAssert(
2936
+ data: ReconciliationControllerAssertData
2937
+ ): CancelablePromise<ReconciliationControllerAssertResponse> {
2938
+ return __request(OpenAPI, {
2939
+ method: 'POST',
2940
+ url: '/api/v1/{region}/bean/reconciliations/assert',
2941
+ path: {
2942
+ region: data.region
2943
+ },
2944
+ body: data.requestBody,
2945
+ mediaType: 'application/json',
2946
+ errors: {
2947
+ 404: 'Account not found'
2948
+ }
2949
+ });
2950
+ }
2951
+
2952
+ /**
2953
+ * Generate a pad adjusting entry
2954
+ * 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.
2955
+ * @param data The data for the request.
2956
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2957
+ * @param data.requestBody
2958
+ * @returns PadResultDto Pad adjusting entry generated
2959
+ * @throws ApiError
2960
+ */
2961
+ public static reconciliationControllerPad(
2962
+ data: ReconciliationControllerPadData
2963
+ ): CancelablePromise<ReconciliationControllerPadResponse> {
2964
+ return __request(OpenAPI, {
2965
+ method: 'POST',
2966
+ url: '/api/v1/{region}/bean/reconciliations/pad',
2967
+ path: {
2968
+ region: data.region
2969
+ },
2970
+ body: data.requestBody,
2971
+ mediaType: 'application/json',
2972
+ errors: {
2973
+ 400: 'Book already within tolerance — no pad needed',
2974
+ 404: 'Account not found'
2975
+ }
2976
+ });
2977
+ }
2978
+
2979
+ /**
2980
+ * List reconciliation history for an account
2981
+ * Returns recorded balance assertions (most recent first). The latest drives the account-detail "Last <date>" badge.
2982
+ * @param data The data for the request.
2983
+ * @param data.accountId BeanAccount id
2984
+ * @param data.region Region code for tenant context (decorative for reconciliation)
2985
+ * @returns ReconciliationRecordDto Reconciliation history
2986
+ * @throws ApiError
2987
+ */
2988
+ public static reconciliationControllerHistory(
2989
+ data: ReconciliationControllerHistoryData
2990
+ ): CancelablePromise<ReconciliationControllerHistoryResponse> {
2991
+ return __request(OpenAPI, {
2992
+ method: 'GET',
2993
+ url: '/api/v1/{region}/bean/accounts/{accountId}/reconciliations',
2994
+ path: {
2995
+ accountId: data.accountId,
2996
+ region: data.region
2997
+ },
2998
+ errors: {
2999
+ 404: 'Account not found'
3000
+ }
3001
+ });
3002
+ }
3003
+ }
3004
+
3005
+ export class BeanExportService {
3006
+ /**
3007
+ * Export Beancount ledger as ZIP
3008
+ * Export all user Beancount data as a ZIP file containing ledger.beancount and yearly files in community format.
3009
+ * @returns unknown
3010
+ * @throws ApiError
3011
+ */
3012
+ public static exportControllerExportBeancount(): CancelablePromise<ExportControllerExportBeancountResponse> {
3013
+ return __request(OpenAPI, {
3014
+ method: 'GET',
3015
+ url: '/api/v1/{region}/bean/export/beancount'
3016
+ });
3017
+ }
3018
+ }
3019
+
3020
+ export class BeanImportService {
3021
+ /**
3022
+ * Import a bill file
3023
+ * Upload and process a bill file (CSV, PDF, OFX, etc.). The system automatically identifies the file type, extracts transactions, validates them, and stores only validated transactions to the database. Maximum file size: 50MB. Only 1 import per user at a time (concurrent imports rejected with 429).
3024
+ * @param data The data for the request.
3025
+ * @param data.region Region code for tenant context
3026
+ * @param data.formData Bill file to import
3027
+ * @returns ImportResultDto File imported successfully
2679
3028
  * @throws ApiError
2680
3029
  */
2681
3030
  public static fileImportControllerImportFile(
@@ -2831,121 +3180,6 @@ export class BeanImportService {
2831
3180
  }
2832
3181
  }
2833
3182
 
2834
- export class BeanPlatformsService {
2835
- /**
2836
- * Get all platforms with statistics
2837
- * @returns unknown List of platforms with binding and account counts
2838
- * @throws ApiError
2839
- */
2840
- public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
2841
- return __request(OpenAPI, {
2842
- method: 'GET',
2843
- url: '/api/v1/bean/platforms'
2844
- });
2845
- }
2846
-
2847
- /**
2848
- * Create a new platform
2849
- * @param data The data for the request.
2850
- * @param data.requestBody
2851
- * @returns unknown Platform created successfully
2852
- * @throws ApiError
2853
- */
2854
- public static platformControllerCreate(
2855
- data: PlatformControllerCreateData
2856
- ): CancelablePromise<PlatformControllerCreateResponse> {
2857
- return __request(OpenAPI, {
2858
- method: 'POST',
2859
- url: '/api/v1/bean/platforms',
2860
- body: data.requestBody,
2861
- mediaType: 'application/json',
2862
- errors: {
2863
- 409: 'Platform already exists'
2864
- }
2865
- });
2866
- }
2867
-
2868
- /**
2869
- * Get platform list for current user
2870
- * @returns unknown List of platforms with user binding status
2871
- * @throws ApiError
2872
- */
2873
- public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
2874
- return __request(OpenAPI, {
2875
- method: 'GET',
2876
- url: '/api/v1/bean/platforms/list'
2877
- });
2878
- }
2879
-
2880
- /**
2881
- * Match platforms by name or alias
2882
- * @param data The data for the request.
2883
- * @param data.q Search query — Chinese name, English name, or abbreviation
2884
- * @param data.region Region code for category override lookup
2885
- * @returns unknown List of matching platforms with suggested segment names
2886
- * @throws ApiError
2887
- */
2888
- public static platformControllerMatchPlatforms(
2889
- data: PlatformControllerMatchPlatformsData
2890
- ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
2891
- return __request(OpenAPI, {
2892
- method: 'GET',
2893
- url: '/api/v1/bean/platforms/match',
2894
- query: {
2895
- q: data.q,
2896
- region: data.region
2897
- }
2898
- });
2899
- }
2900
-
2901
- /**
2902
- * Update a platform
2903
- * @param data The data for the request.
2904
- * @param data.id Platform ID
2905
- * @param data.requestBody
2906
- * @returns unknown Platform updated successfully
2907
- * @throws ApiError
2908
- */
2909
- public static platformControllerUpdate(
2910
- data: PlatformControllerUpdateData
2911
- ): CancelablePromise<PlatformControllerUpdateResponse> {
2912
- return __request(OpenAPI, {
2913
- method: 'PUT',
2914
- url: '/api/v1/bean/platforms/{id}',
2915
- path: {
2916
- id: data.id
2917
- },
2918
- body: data.requestBody,
2919
- mediaType: 'application/json',
2920
- errors: {
2921
- 404: 'Platform not found'
2922
- }
2923
- });
2924
- }
2925
-
2926
- /**
2927
- * Delete a platform
2928
- * @param data The data for the request.
2929
- * @param data.id Platform ID
2930
- * @returns void Platform deleted successfully
2931
- * @throws ApiError
2932
- */
2933
- public static platformControllerDelete(
2934
- data: PlatformControllerDeleteData
2935
- ): CancelablePromise<PlatformControllerDeleteResponse> {
2936
- return __request(OpenAPI, {
2937
- method: 'DELETE',
2938
- url: '/api/v1/bean/platforms/{id}',
2939
- path: {
2940
- id: data.id
2941
- },
2942
- errors: {
2943
- 404: 'Platform not found'
2944
- }
2945
- });
2946
- }
2947
- }
2948
-
2949
3183
  export class ProviderSyncService {
2950
3184
  /**
2951
3185
  * Sync transactions from financial data provider
@@ -3046,102 +3280,197 @@ export class ProviderSyncService {
3046
3280
  }
3047
3281
  }
3048
3282
 
3049
- export class ImportTelemetryService {
3283
+ export class ExternalAccountLinksService {
3050
3284
  /**
3051
- * Receive anonymous parser failure telemetry
3285
+ * Create an external account → BeanAccount mapping (ADR-0113)
3052
3286
  * @param data The data for the request.
3053
3287
  * @param data.region Region code for tenant context
3054
3288
  * @param data.requestBody
3055
- * @returns unknown Telemetry report received
3289
+ * @returns ExternalAccountLinkResponseDto Link created.
3056
3290
  * @throws ApiError
3057
3291
  */
3058
- public static telemetryControllerReportTelemetry(
3059
- data: TelemetryControllerReportTelemetryData
3060
- ): CancelablePromise<TelemetryControllerReportTelemetryResponse> {
3292
+ public static externalAccountLinkControllerCreate(
3293
+ data: ExternalAccountLinkControllerCreateData
3294
+ ): CancelablePromise<ExternalAccountLinkControllerCreateResponse> {
3061
3295
  return __request(OpenAPI, {
3062
3296
  method: 'POST',
3063
- url: '/api/v1/{region}/bean/import/parser-telemetry',
3297
+ url: '/api/v1/{region}/bean/external-account-links',
3064
3298
  path: {
3065
3299
  region: data.region
3066
3300
  },
3067
3301
  body: data.requestBody,
3068
3302
  mediaType: 'application/json',
3069
3303
  errors: {
3070
- 401: 'Unauthorized'
3304
+ 422: 'beanAccountId not owned, or an active link already exists.'
3071
3305
  }
3072
3306
  });
3073
3307
  }
3074
3308
 
3075
3309
  /**
3076
- * Receive anonymous zero-hit coverage miss report
3310
+ * List the user's active external account links
3077
3311
  * @param data The data for the request.
3312
+ * @param data.provider
3078
3313
  * @param data.region Region code for tenant context
3079
- * @param data.requestBody
3080
- * @returns unknown Coverage miss report received
3314
+ * @returns ExternalAccountLinkListResponseDto Links retrieved.
3081
3315
  * @throws ApiError
3082
3316
  */
3083
- public static telemetryControllerReportCoverageMiss(
3084
- data: TelemetryControllerReportCoverageMissData
3085
- ): CancelablePromise<TelemetryControllerReportCoverageMissResponse> {
3317
+ public static externalAccountLinkControllerFindAll(
3318
+ data: ExternalAccountLinkControllerFindAllData
3319
+ ): CancelablePromise<ExternalAccountLinkControllerFindAllResponse> {
3086
3320
  return __request(OpenAPI, {
3087
- method: 'POST',
3088
- url: '/api/v1/{region}/bean/import/parser-coverage-miss',
3321
+ method: 'GET',
3322
+ url: '/api/v1/{region}/bean/external-account-links',
3089
3323
  path: {
3090
3324
  region: data.region
3091
3325
  },
3092
- body: data.requestBody,
3093
- mediaType: 'application/json',
3094
- errors: {
3095
- 401: 'Unauthorized'
3326
+ query: {
3327
+ provider: data.provider
3096
3328
  }
3097
3329
  });
3098
3330
  }
3099
3331
 
3100
3332
  /**
3101
- * Coverage metrics (uncovered format aggregation)
3333
+ * Get a single external account link
3102
3334
  * @param data The data for the request.
3335
+ * @param data.id
3103
3336
  * @param data.region Region code for tenant context
3104
- * @param data.topN Top-N uncovered formats (default 10)
3105
- * @returns unknown Coverage metrics
3337
+ * @returns ExternalAccountLinkResponseDto Link retrieved.
3106
3338
  * @throws ApiError
3107
3339
  */
3108
- public static telemetryControllerGetCoverageMetrics(
3109
- data: TelemetryControllerGetCoverageMetricsData
3110
- ): CancelablePromise<TelemetryControllerGetCoverageMetricsResponse> {
3340
+ public static externalAccountLinkControllerFindOne(
3341
+ data: ExternalAccountLinkControllerFindOneData
3342
+ ): CancelablePromise<ExternalAccountLinkControllerFindOneResponse> {
3111
3343
  return __request(OpenAPI, {
3112
3344
  method: 'GET',
3113
- url: '/api/v1/{region}/bean/import/parser-coverage-metrics',
3345
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3114
3346
  path: {
3347
+ id: data.id,
3115
3348
  region: data.region
3116
3349
  },
3117
- query: {
3118
- topN: data.topN
3350
+ errors: {
3351
+ 422: 'Link not found or not owned by the user.'
3119
3352
  }
3120
3353
  });
3121
3354
  }
3122
- }
3123
3355
 
3124
- export class BeanNlpService {
3125
3356
  /**
3126
- * Process natural language input
3127
- * 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"
3357
+ * Soft-delete (disconnect) an external account link
3128
3358
  * @param data The data for the request.
3359
+ * @param data.id
3129
3360
  * @param data.region Region code for tenant context
3130
- * @param data.requestBody Natural language transaction input with optional session ID
3131
- * @returns NlpResponseDto NLP processing result - either created transaction or asking for more info
3361
+ * @returns void Link soft-deleted; historical transactions are unaffected.
3132
3362
  * @throws ApiError
3133
3363
  */
3134
- public static nlpControllerProcessNaturalLanguage(
3135
- data: NlpControllerProcessNaturalLanguageData
3136
- ): CancelablePromise<NlpControllerProcessNaturalLanguageResponse> {
3364
+ public static externalAccountLinkControllerRemove(
3365
+ data: ExternalAccountLinkControllerRemoveData
3366
+ ): CancelablePromise<ExternalAccountLinkControllerRemoveResponse> {
3137
3367
  return __request(OpenAPI, {
3138
- method: 'POST',
3139
- url: '/api/v1/{region}/bean/nlp/process',
3368
+ method: 'DELETE',
3369
+ url: '/api/v1/{region}/bean/external-account-links/{id}',
3140
3370
  path: {
3371
+ id: data.id,
3141
3372
  region: data.region
3142
- },
3143
- body: data.requestBody,
3144
- mediaType: 'application/json',
3373
+ }
3374
+ });
3375
+ }
3376
+ }
3377
+
3378
+ export class ImportTelemetryService {
3379
+ /**
3380
+ * Receive anonymous parser failure telemetry
3381
+ * @param data The data for the request.
3382
+ * @param data.region Region code for tenant context
3383
+ * @param data.requestBody
3384
+ * @returns unknown Telemetry report received
3385
+ * @throws ApiError
3386
+ */
3387
+ public static telemetryControllerReportTelemetry(
3388
+ data: TelemetryControllerReportTelemetryData
3389
+ ): CancelablePromise<TelemetryControllerReportTelemetryResponse> {
3390
+ return __request(OpenAPI, {
3391
+ method: 'POST',
3392
+ url: '/api/v1/{region}/bean/import/parser-telemetry',
3393
+ path: {
3394
+ region: data.region
3395
+ },
3396
+ body: data.requestBody,
3397
+ mediaType: 'application/json',
3398
+ errors: {
3399
+ 401: 'Unauthorized'
3400
+ }
3401
+ });
3402
+ }
3403
+
3404
+ /**
3405
+ * Receive anonymous zero-hit coverage miss report
3406
+ * @param data The data for the request.
3407
+ * @param data.region Region code for tenant context
3408
+ * @param data.requestBody
3409
+ * @returns unknown Coverage miss report received
3410
+ * @throws ApiError
3411
+ */
3412
+ public static telemetryControllerReportCoverageMiss(
3413
+ data: TelemetryControllerReportCoverageMissData
3414
+ ): CancelablePromise<TelemetryControllerReportCoverageMissResponse> {
3415
+ return __request(OpenAPI, {
3416
+ method: 'POST',
3417
+ url: '/api/v1/{region}/bean/import/parser-coverage-miss',
3418
+ path: {
3419
+ region: data.region
3420
+ },
3421
+ body: data.requestBody,
3422
+ mediaType: 'application/json',
3423
+ errors: {
3424
+ 401: 'Unauthorized'
3425
+ }
3426
+ });
3427
+ }
3428
+
3429
+ /**
3430
+ * Coverage metrics (uncovered format aggregation)
3431
+ * @param data The data for the request.
3432
+ * @param data.region Region code for tenant context
3433
+ * @param data.topN Top-N uncovered formats (default 10)
3434
+ * @returns unknown Coverage metrics
3435
+ * @throws ApiError
3436
+ */
3437
+ public static telemetryControllerGetCoverageMetrics(
3438
+ data: TelemetryControllerGetCoverageMetricsData
3439
+ ): CancelablePromise<TelemetryControllerGetCoverageMetricsResponse> {
3440
+ return __request(OpenAPI, {
3441
+ method: 'GET',
3442
+ url: '/api/v1/{region}/bean/import/parser-coverage-metrics',
3443
+ path: {
3444
+ region: data.region
3445
+ },
3446
+ query: {
3447
+ topN: data.topN
3448
+ }
3449
+ });
3450
+ }
3451
+ }
3452
+
3453
+ export class BeanNlpService {
3454
+ /**
3455
+ * Process natural language input
3456
+ * 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"
3457
+ * @param data The data for the request.
3458
+ * @param data.region Region code for tenant context
3459
+ * @param data.requestBody Natural language transaction input with optional session ID
3460
+ * @returns NlpResponseDto NLP processing result - either created transaction or asking for more info
3461
+ * @throws ApiError
3462
+ */
3463
+ public static nlpControllerProcessNaturalLanguage(
3464
+ data: NlpControllerProcessNaturalLanguageData
3465
+ ): CancelablePromise<NlpControllerProcessNaturalLanguageResponse> {
3466
+ return __request(OpenAPI, {
3467
+ method: 'POST',
3468
+ url: '/api/v1/{region}/bean/nlp/process',
3469
+ path: {
3470
+ region: data.region
3471
+ },
3472
+ body: data.requestBody,
3473
+ mediaType: 'application/json',
3145
3474
  errors: {
3146
3475
  400: 'Invalid input',
3147
3476
  401: 'Unauthorized'
@@ -3204,6 +3533,121 @@ export class BeanNlpService {
3204
3533
  }
3205
3534
  }
3206
3535
 
3536
+ export class BeanPlatformsService {
3537
+ /**
3538
+ * Get all platforms with statistics
3539
+ * @returns unknown List of platforms with binding and account counts
3540
+ * @throws ApiError
3541
+ */
3542
+ public static platformControllerFindAll(): CancelablePromise<PlatformControllerFindAllResponse> {
3543
+ return __request(OpenAPI, {
3544
+ method: 'GET',
3545
+ url: '/api/v1/bean/platforms'
3546
+ });
3547
+ }
3548
+
3549
+ /**
3550
+ * Create a new platform
3551
+ * @param data The data for the request.
3552
+ * @param data.requestBody
3553
+ * @returns unknown Platform created successfully
3554
+ * @throws ApiError
3555
+ */
3556
+ public static platformControllerCreate(
3557
+ data: PlatformControllerCreateData
3558
+ ): CancelablePromise<PlatformControllerCreateResponse> {
3559
+ return __request(OpenAPI, {
3560
+ method: 'POST',
3561
+ url: '/api/v1/bean/platforms',
3562
+ body: data.requestBody,
3563
+ mediaType: 'application/json',
3564
+ errors: {
3565
+ 409: 'Platform already exists'
3566
+ }
3567
+ });
3568
+ }
3569
+
3570
+ /**
3571
+ * Get platform list for current user
3572
+ * @returns unknown List of platforms with user binding status
3573
+ * @throws ApiError
3574
+ */
3575
+ public static platformControllerGetPlatformList(): CancelablePromise<PlatformControllerGetPlatformListResponse> {
3576
+ return __request(OpenAPI, {
3577
+ method: 'GET',
3578
+ url: '/api/v1/bean/platforms/list'
3579
+ });
3580
+ }
3581
+
3582
+ /**
3583
+ * Match platforms by name or alias
3584
+ * @param data The data for the request.
3585
+ * @param data.q Search query — Chinese name, English name, or abbreviation
3586
+ * @param data.region Region code for category override lookup
3587
+ * @returns unknown List of matching platforms with suggested segment names
3588
+ * @throws ApiError
3589
+ */
3590
+ public static platformControllerMatchPlatforms(
3591
+ data: PlatformControllerMatchPlatformsData
3592
+ ): CancelablePromise<PlatformControllerMatchPlatformsResponse> {
3593
+ return __request(OpenAPI, {
3594
+ method: 'GET',
3595
+ url: '/api/v1/bean/platforms/match',
3596
+ query: {
3597
+ q: data.q,
3598
+ region: data.region
3599
+ }
3600
+ });
3601
+ }
3602
+
3603
+ /**
3604
+ * Update a platform
3605
+ * @param data The data for the request.
3606
+ * @param data.id Platform ID
3607
+ * @param data.requestBody
3608
+ * @returns unknown Platform updated successfully
3609
+ * @throws ApiError
3610
+ */
3611
+ public static platformControllerUpdate(
3612
+ data: PlatformControllerUpdateData
3613
+ ): CancelablePromise<PlatformControllerUpdateResponse> {
3614
+ return __request(OpenAPI, {
3615
+ method: 'PUT',
3616
+ url: '/api/v1/bean/platforms/{id}',
3617
+ path: {
3618
+ id: data.id
3619
+ },
3620
+ body: data.requestBody,
3621
+ mediaType: 'application/json',
3622
+ errors: {
3623
+ 404: 'Platform not found'
3624
+ }
3625
+ });
3626
+ }
3627
+
3628
+ /**
3629
+ * Delete a platform
3630
+ * @param data The data for the request.
3631
+ * @param data.id Platform ID
3632
+ * @returns void Platform deleted successfully
3633
+ * @throws ApiError
3634
+ */
3635
+ public static platformControllerDelete(
3636
+ data: PlatformControllerDeleteData
3637
+ ): CancelablePromise<PlatformControllerDeleteResponse> {
3638
+ return __request(OpenAPI, {
3639
+ method: 'DELETE',
3640
+ url: '/api/v1/bean/platforms/{id}',
3641
+ path: {
3642
+ id: data.id
3643
+ },
3644
+ errors: {
3645
+ 404: 'Platform not found'
3646
+ }
3647
+ });
3648
+ }
3649
+ }
3650
+
3207
3651
  export class DashboardService {
3208
3652
  /**
3209
3653
  * Get net worth overview
@@ -3358,173 +3802,6 @@ export class InvestmentService {
3358
3802
  }
3359
3803
  }
3360
3804
 
3361
- export class BeanPricesService {
3362
- /**
3363
- * Create a new price
3364
- * Creates a new price entry for the authenticated user
3365
- * @param data The data for the request.
3366
- * @param data.region Region code for tenant context
3367
- * @param data.requestBody
3368
- * @returns PriceResponseDto Price created successfully
3369
- * @throws ApiError
3370
- */
3371
- public static priceControllerCreate(
3372
- data: PriceControllerCreateData
3373
- ): CancelablePromise<PriceControllerCreateResponse> {
3374
- return __request(OpenAPI, {
3375
- method: 'POST',
3376
- url: '/api/v1/{region}/bean/prices',
3377
- path: {
3378
- region: data.region
3379
- },
3380
- body: data.requestBody,
3381
- mediaType: 'application/json',
3382
- errors: {
3383
- 404: 'Currency or quoteCurrency commodity not found',
3384
- 409: 'Price already exists for this currency pair and date'
3385
- }
3386
- });
3387
- }
3388
-
3389
- /**
3390
- * List user prices
3391
- * Returns all price entries for the authenticated user with optional filtering
3392
- * @param data The data for the request.
3393
- * @param data.region Region code for tenant context
3394
- * @param data.currency Filter by currency (e.g., BTC, AAPL, USD)
3395
- * @param data.quoteCurrency Filter by quote currency (pricing currency, e.g., USD, CNY)
3396
- * @param data.dateFrom Filter prices from this date (ISO 8601 format)
3397
- * @param data.dateTo Filter prices to this date (ISO 8601 format)
3398
- * @param data.search Search term for currency or quoteCurrency (case-insensitive partial match)
3399
- * @param data.page Page number for pagination (default: 1)
3400
- * @param data.limit Number of items per page (default: 20, max: 100)
3401
- * @returns PriceListResponseDto Prices retrieved successfully
3402
- * @throws ApiError
3403
- */
3404
- public static priceControllerFindAll(
3405
- data: PriceControllerFindAllData
3406
- ): CancelablePromise<PriceControllerFindAllResponse> {
3407
- return __request(OpenAPI, {
3408
- method: 'GET',
3409
- url: '/api/v1/{region}/bean/prices',
3410
- path: {
3411
- region: data.region
3412
- },
3413
- query: {
3414
- currency: data.currency,
3415
- quoteCurrency: data.quoteCurrency,
3416
- dateFrom: data.dateFrom,
3417
- dateTo: data.dateTo,
3418
- search: data.search,
3419
- page: data.page,
3420
- limit: data.limit
3421
- }
3422
- });
3423
- }
3424
-
3425
- /**
3426
- * Get price by ID
3427
- * Returns a single price entry by its ID
3428
- * @param data The data for the request.
3429
- * @param data.id Price ID
3430
- * @param data.region Region code for tenant context
3431
- * @returns PriceResponseDto Price retrieved successfully
3432
- * @throws ApiError
3433
- */
3434
- public static priceControllerFindOne(
3435
- data: PriceControllerFindOneData
3436
- ): CancelablePromise<PriceControllerFindOneResponse> {
3437
- return __request(OpenAPI, {
3438
- method: 'GET',
3439
- url: '/api/v1/{region}/bean/prices/{id}',
3440
- path: {
3441
- id: data.id,
3442
- region: data.region
3443
- },
3444
- errors: {
3445
- 404: 'Price not found'
3446
- }
3447
- });
3448
- }
3449
-
3450
- /**
3451
- * Update a price
3452
- * Updates an existing price entry
3453
- * @param data The data for the request.
3454
- * @param data.id Price ID
3455
- * @param data.region Region code for tenant context
3456
- * @param data.requestBody
3457
- * @returns PriceResponseDto Price updated successfully
3458
- * @throws ApiError
3459
- */
3460
- public static priceControllerUpdate(
3461
- data: PriceControllerUpdateData
3462
- ): CancelablePromise<PriceControllerUpdateResponse> {
3463
- return __request(OpenAPI, {
3464
- method: 'PUT',
3465
- url: '/api/v1/{region}/bean/prices/{id}',
3466
- path: {
3467
- id: data.id,
3468
- region: data.region
3469
- },
3470
- body: data.requestBody,
3471
- mediaType: 'application/json',
3472
- errors: {
3473
- 404: 'Price not found',
3474
- 409: 'Updated price conflicts with existing price'
3475
- }
3476
- });
3477
- }
3478
-
3479
- /**
3480
- * Delete a price
3481
- * Deletes a price entry (hard delete)
3482
- * @param data The data for the request.
3483
- * @param data.id Price ID
3484
- * @param data.region Region code for tenant context
3485
- * @returns void Price deleted successfully
3486
- * @throws ApiError
3487
- */
3488
- public static priceControllerDelete(
3489
- data: PriceControllerDeleteData
3490
- ): CancelablePromise<PriceControllerDeleteResponse> {
3491
- return __request(OpenAPI, {
3492
- method: 'DELETE',
3493
- url: '/api/v1/{region}/bean/prices/{id}',
3494
- path: {
3495
- id: data.id,
3496
- region: data.region
3497
- },
3498
- errors: {
3499
- 404: 'Price not found'
3500
- }
3501
- });
3502
- }
3503
-
3504
- /**
3505
- * Bulk create prices
3506
- * Creates multiple price entries at once (skips duplicates)
3507
- * @param data The data for the request.
3508
- * @param data.region Region code for tenant context
3509
- * @param data.requestBody
3510
- * @returns PriceResponseDto Prices created successfully
3511
- * @throws ApiError
3512
- */
3513
- public static priceControllerBulkCreate(
3514
- data: PriceControllerBulkCreateData
3515
- ): CancelablePromise<PriceControllerBulkCreateResponse> {
3516
- return __request(OpenAPI, {
3517
- method: 'POST',
3518
- url: '/api/v1/{region}/bean/prices/bulk',
3519
- path: {
3520
- region: data.region
3521
- },
3522
- body: data.requestBody,
3523
- mediaType: 'application/json'
3524
- });
3525
- }
3526
- }
3527
-
3528
3805
  export class ReportingService {
3529
3806
  /**
3530
3807
  * Get portfolio value trends