@firela/api-types 0.0.0-canary.8cbdced0 → 0.0.0-canary.9d0af796

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.
@@ -3029,6 +3029,96 @@ export type UpdatePropertyDto = {
3029
3029
  value: string;
3030
3030
  };
3031
3031
 
3032
+ export type CreateBeanEventDto = {
3033
+ /**
3034
+ * Life event date (ISO 8601)
3035
+ */
3036
+ date: string;
3037
+ /**
3038
+ * Life event type (e.g., "employer", "location", "marital-status") — user-defined, no enum constraint at engine layer
3039
+ */
3040
+ type: string;
3041
+ /**
3042
+ * Life event description. Empty string is a VALID value (distinct from absence).
3043
+ */
3044
+ description: string;
3045
+ /**
3046
+ * Product-side metadata (lives in BeanEvent.meta JSON, never in engine Event fields)
3047
+ */
3048
+ meta?: {
3049
+ [key: string]: unknown;
3050
+ };
3051
+ };
3052
+
3053
+ export type EventResponseDto = {
3054
+ /**
3055
+ * Unique identifier
3056
+ */
3057
+ id: string;
3058
+ /**
3059
+ * User ID (owner of the life event)
3060
+ */
3061
+ userId: string;
3062
+ /**
3063
+ * Life event date (ISO 8601 format)
3064
+ */
3065
+ date: string;
3066
+ /**
3067
+ * Life event type (user-defined, e.g., "employer", "location")
3068
+ */
3069
+ type: string;
3070
+ /**
3071
+ * Life event description. May be an empty string (a valid value distinct from absence).
3072
+ */
3073
+ description: string;
3074
+ /**
3075
+ * Product-side metadata (free-form JSON)
3076
+ */
3077
+ meta: {
3078
+ [key: string]: unknown;
3079
+ };
3080
+ /**
3081
+ * Creation timestamp
3082
+ */
3083
+ createdAt: string;
3084
+ /**
3085
+ * Last update timestamp. Also emitted as the ETag response header for If-Match optimistic concurrency.
3086
+ */
3087
+ updatedAt: string;
3088
+ };
3089
+
3090
+ export type EventListResponseDto = {
3091
+ /**
3092
+ * List of life events
3093
+ */
3094
+ items: Array<EventResponseDto>;
3095
+ /**
3096
+ * Total number of life events matching the query
3097
+ */
3098
+ total: number;
3099
+ };
3100
+
3101
+ export type UpdateBeanEventDto = {
3102
+ /**
3103
+ * Life event date (ISO 8601)
3104
+ */
3105
+ date?: string;
3106
+ /**
3107
+ * Life event type (user-defined)
3108
+ */
3109
+ type?: string;
3110
+ /**
3111
+ * Life event description. Empty string is a VALID value (distinct from absence).
3112
+ */
3113
+ description?: string;
3114
+ /**
3115
+ * Product-side metadata (free-form JSON)
3116
+ */
3117
+ meta?: {
3118
+ [key: string]: unknown;
3119
+ };
3120
+ };
3121
+
3032
3122
  export type FileImportDto = {
3033
3123
  /**
3034
3124
  * Bill file to import (CSV, PDF, OFX, etc.)
@@ -3457,6 +3547,33 @@ export type ProviderSyncDto = {
3457
3547
  transactions: unknown[];
3458
3548
  };
3459
3549
 
3550
+ export type ProviderSyncResponseDto = {
3551
+ /**
3552
+ * Number of transactions successfully imported
3553
+ */
3554
+ imported: number;
3555
+ /**
3556
+ * Number of transactions skipped (duplicates)
3557
+ */
3558
+ skipped: number;
3559
+ /**
3560
+ * Number of transactions pending review
3561
+ */
3562
+ pendingReview: number;
3563
+ /**
3564
+ * Number of transactions that failed to import
3565
+ */
3566
+ failed: number;
3567
+ /**
3568
+ * IDs of successfully imported transactions
3569
+ */
3570
+ importedTransactionIds?: Array<string>;
3571
+ /**
3572
+ * IDs of review items created for branched transactions
3573
+ */
3574
+ reviewItemIds?: Array<string>;
3575
+ };
3576
+
3460
3577
  export type SupportedProvidersResponseDto = {
3461
3578
  /**
3462
3579
  * List of supported provider names
@@ -3485,6 +3602,564 @@ export type ProcessNlpDto = {
3485
3602
  };
3486
3603
  };
3487
3604
 
3605
+ export type NlpTransactionInfoDto = {
3606
+ /**
3607
+ * Transaction ID
3608
+ */
3609
+ id: string;
3610
+ /**
3611
+ * Transaction date (ISO format)
3612
+ */
3613
+ date: string;
3614
+ /**
3615
+ * Transaction amount
3616
+ */
3617
+ amount: number;
3618
+ /**
3619
+ * Currency code
3620
+ */
3621
+ currency: string;
3622
+ /**
3623
+ * Payee name
3624
+ */
3625
+ payee?: string;
3626
+ /**
3627
+ * Transaction narration
3628
+ */
3629
+ narration?: string;
3630
+ /**
3631
+ * Warning message for special transaction scenarios (e.g., cross-currency settlement)
3632
+ */
3633
+ warning?: string;
3634
+ };
3635
+
3636
+ export type NlpParsedDataDto = {
3637
+ /**
3638
+ * Extracted amount
3639
+ */
3640
+ amount?: number;
3641
+ /**
3642
+ * Currency code
3643
+ */
3644
+ currency?: string;
3645
+ /**
3646
+ * Transaction date (ISO format)
3647
+ */
3648
+ date?: string;
3649
+ /**
3650
+ * Payee name
3651
+ */
3652
+ payee?: string;
3653
+ /**
3654
+ * Transaction narration
3655
+ */
3656
+ narration?: string;
3657
+ /**
3658
+ * Category
3659
+ */
3660
+ category?: string;
3661
+ /**
3662
+ * Income type (e.g., Salary, Bonus, Dividend, Interest)
3663
+ */
3664
+ incomeType?: string;
3665
+ /**
3666
+ * Income source (e.g., company name)
3667
+ */
3668
+ incomeSource?: string;
3669
+ /**
3670
+ * Security symbol code (e.g., 600519, AAPL)
3671
+ */
3672
+ symbol?: string;
3673
+ /**
3674
+ * Quantity of shares/units
3675
+ */
3676
+ quantity?: number;
3677
+ /**
3678
+ * Unit price per share/unit
3679
+ */
3680
+ price?: number;
3681
+ /**
3682
+ * Investment action
3683
+ */
3684
+ investmentAction?: 'buy' | 'sell';
3685
+ /**
3686
+ * Payment source: asset (default) or liability (credit card)
3687
+ */
3688
+ paymentSource?: 'asset' | 'liability';
3689
+ /**
3690
+ * Liability account hint (CreditCard/Huabei/Baitiao)
3691
+ */
3692
+ liabilityHint?: string;
3693
+ /**
3694
+ * Warning message for special scenarios (e.g., cross-currency settlement)
3695
+ */
3696
+ warning?: string;
3697
+ };
3698
+
3699
+ /**
3700
+ * Investment action
3701
+ */
3702
+ export type investmentAction = 'buy' | 'sell';
3703
+
3704
+ /**
3705
+ * Payment source: asset (default) or liability (credit card)
3706
+ */
3707
+ export type paymentSource = 'asset' | 'liability';
3708
+
3709
+ export type NlpSourceTransactionDto = {
3710
+ /**
3711
+ * Transaction date (ISO format)
3712
+ */
3713
+ date: string;
3714
+ /**
3715
+ * Amount as string
3716
+ */
3717
+ amount: string;
3718
+ /**
3719
+ * Currency code
3720
+ */
3721
+ currency: string;
3722
+ /**
3723
+ * Payee name
3724
+ */
3725
+ payee?: string;
3726
+ /**
3727
+ * Transaction narration
3728
+ */
3729
+ narration: string;
3730
+ };
3731
+
3732
+ export type NlpTargetTransactionDto = {
3733
+ /**
3734
+ * Existing transaction ID
3735
+ */
3736
+ id: string;
3737
+ /**
3738
+ * Transaction date (ISO format)
3739
+ */
3740
+ date: string;
3741
+ /**
3742
+ * Amount as string
3743
+ */
3744
+ amount: string;
3745
+ /**
3746
+ * Currency code
3747
+ */
3748
+ currency: string;
3749
+ /**
3750
+ * Payee name
3751
+ */
3752
+ payee?: string;
3753
+ /**
3754
+ * Transaction narration
3755
+ */
3756
+ narration: string;
3757
+ };
3758
+
3759
+ export type NlpSimilarityDto = {
3760
+ /**
3761
+ * Whether dates match
3762
+ */
3763
+ dateMatch: boolean;
3764
+ /**
3765
+ * Date difference in days
3766
+ */
3767
+ dateDiff: number;
3768
+ /**
3769
+ * Whether amounts match
3770
+ */
3771
+ amountMatch: boolean;
3772
+ /**
3773
+ * Amount difference as decimal string
3774
+ */
3775
+ amountDiff: string;
3776
+ /**
3777
+ * Whether payees match
3778
+ */
3779
+ payeeMatch: boolean;
3780
+ /**
3781
+ * Payee similarity score (0-1)
3782
+ */
3783
+ payeeSimilarity: number;
3784
+ /**
3785
+ * Account overlap score (0-1)
3786
+ */
3787
+ accountOverlap: number;
3788
+ };
3789
+
3790
+ export type NlpDuplicateConfirmationDataDto = {
3791
+ /**
3792
+ * Duplicate detection confidence score (0.5-0.89)
3793
+ */
3794
+ confidence: number;
3795
+ /**
3796
+ * Source transaction summary (the new transaction being entered)
3797
+ */
3798
+ sourceTransaction: NlpSourceTransactionDto;
3799
+ /**
3800
+ * Target transaction summary (existing potential duplicate)
3801
+ */
3802
+ targetTransaction: NlpTargetTransactionDto;
3803
+ /**
3804
+ * Detailed similarity information
3805
+ */
3806
+ similarity: NlpSimilarityDto;
3807
+ /**
3808
+ * Human-readable reasons for duplicate detection
3809
+ */
3810
+ reasons: Array<string>;
3811
+ };
3812
+
3813
+ export type NlpRuleConfirmationDataDto = {
3814
+ /**
3815
+ * Rule match confidence score (0.5-0.74)
3816
+ */
3817
+ confidence: number;
3818
+ /**
3819
+ * Matched rule information
3820
+ */
3821
+ matchedRule: {
3822
+ [key: string]: unknown;
3823
+ };
3824
+ /**
3825
+ * Suggested accounts from the rule
3826
+ */
3827
+ suggestedAccounts: {
3828
+ [key: string]: unknown;
3829
+ };
3830
+ /**
3831
+ * Alternative rules that also match
3832
+ */
3833
+ alternatives: unknown[];
3834
+ /**
3835
+ * Human-readable reasons for the match
3836
+ */
3837
+ reasons: Array<string>;
3838
+ };
3839
+
3840
+ export type NlpAccountConfirmationDataDto = {
3841
+ /**
3842
+ * The invalid account name
3843
+ */
3844
+ invalidAccount: string;
3845
+ /**
3846
+ * Suggested replacement account
3847
+ */
3848
+ suggestedAccount: string;
3849
+ /**
3850
+ * Similar accounts for user selection
3851
+ */
3852
+ similarAccounts: Array<string>;
3853
+ /**
3854
+ * Error message explaining the issue
3855
+ */
3856
+ errorMessage: string;
3857
+ /**
3858
+ * Transaction context for reference
3859
+ */
3860
+ transactionContext: {
3861
+ [key: string]: unknown;
3862
+ };
3863
+ };
3864
+
3865
+ export type NlpSuggestedPayeeDto = {
3866
+ /**
3867
+ * Payee ID
3868
+ */
3869
+ id: string;
3870
+ /**
3871
+ * Payee name
3872
+ */
3873
+ name: string;
3874
+ /**
3875
+ * Payee category
3876
+ */
3877
+ category?: string;
3878
+ /**
3879
+ * Source of the payee
3880
+ */
3881
+ source?: 'user' | 'global';
3882
+ /**
3883
+ * PayeeProfile ID (if matched from global)
3884
+ */
3885
+ payeeProfileId?: string;
3886
+ };
3887
+
3888
+ /**
3889
+ * Source of the payee
3890
+ */
3891
+ export type source = 'user' | 'global';
3892
+
3893
+ export type NlpAlternativePayeeDto = {
3894
+ /**
3895
+ * Payee ID
3896
+ */
3897
+ id: string;
3898
+ /**
3899
+ * Payee name
3900
+ */
3901
+ name: string;
3902
+ /**
3903
+ * Similarity score (0-1)
3904
+ */
3905
+ similarity: number;
3906
+ };
3907
+
3908
+ export type NlpPayeeConfirmationDataDto = {
3909
+ /**
3910
+ * Confidence score for the payee match (0-1)
3911
+ */
3912
+ confidence: number;
3913
+ /**
3914
+ * Original payee string from user input
3915
+ */
3916
+ originalPayee: string;
3917
+ /**
3918
+ * Suggested payee to use (null when no similar payees found)
3919
+ */
3920
+ suggestedPayee?: NlpSuggestedPayeeDto | null;
3921
+ /**
3922
+ * Similarity score between original and suggested (0-1)
3923
+ */
3924
+ similarity: number;
3925
+ /**
3926
+ * Alternative payee options
3927
+ */
3928
+ alternatives: Array<NlpAlternativePayeeDto>;
3929
+ /**
3930
+ * Human-readable reasons for the match
3931
+ */
3932
+ reasons: Array<string>;
3933
+ };
3934
+
3935
+ export type RecurringMatchInfoDto = {
3936
+ /**
3937
+ * Expected transaction ID
3938
+ */
3939
+ expectedId: string;
3940
+ /**
3941
+ * Recurring rule ID
3942
+ */
3943
+ ruleId: string;
3944
+ /**
3945
+ * Rule name for display
3946
+ */
3947
+ ruleName: string;
3948
+ /**
3949
+ * Rule icon
3950
+ */
3951
+ ruleIcon?: string;
3952
+ /**
3953
+ * Expected date (YYYY-MM-DD)
3954
+ */
3955
+ expectedDate: string;
3956
+ /**
3957
+ * Expected amount
3958
+ */
3959
+ expectedAmount: number;
3960
+ /**
3961
+ * Match confidence score (0-1)
3962
+ */
3963
+ confidence: number;
3964
+ /**
3965
+ * Whether auto-matched (confidence >= 0.82)
3966
+ */
3967
+ isAutoMatched: boolean;
3968
+ };
3969
+
3970
+ export type NlpSuggestedAccountDto = {
3971
+ /**
3972
+ * Suggested account path
3973
+ */
3974
+ account: string;
3975
+ /**
3976
+ * Confidence score for this suggestion (0-1)
3977
+ */
3978
+ confidence?: number;
3979
+ };
3980
+
3981
+ export type NlpSuggestedAccountsDto = {
3982
+ /**
3983
+ * Source account suggestion (where money comes from). For expense: asset/liability account. For income: income account.
3984
+ */
3985
+ source?: NlpSuggestedAccountDto;
3986
+ /**
3987
+ * Destination account suggestion (where money goes to). For expense: expense account. For income: asset/liability account.
3988
+ */
3989
+ destination?: NlpSuggestedAccountDto;
3990
+ };
3991
+
3992
+ export type NlpDefaultAccountsDto = {
3993
+ /**
3994
+ * Default asset account
3995
+ */
3996
+ asset: string;
3997
+ /**
3998
+ * Default expense account
3999
+ */
4000
+ expense: string;
4001
+ /**
4002
+ * Default income account
4003
+ */
4004
+ income: string;
4005
+ /**
4006
+ * Default liability account
4007
+ */
4008
+ liability: string;
4009
+ };
4010
+
4011
+ export type NlpResponseDto = {
4012
+ /**
4013
+ * Response status
4014
+ */
4015
+ status: 'success' | 'pending' | 'error';
4016
+ /**
4017
+ * Action taken or requested
4018
+ */
4019
+ action:
4020
+ | 'created'
4021
+ | 'ask'
4022
+ | 'confirm'
4023
+ | 'confirm_duplicate'
4024
+ | 'confirm_rule'
4025
+ | 'confirm_account'
4026
+ | 'confirm_payee'
4027
+ | 'cancel';
4028
+ /**
4029
+ * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4030
+ */
4031
+ intent?: 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4032
+ /**
4033
+ * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4034
+ */
4035
+ assetSubType?: 'transfer' | 'banking' | 'investment';
4036
+ /**
4037
+ * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4038
+ */
4039
+ liabilitySubType?: 'borrow' | 'repay';
4040
+ /**
4041
+ * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4042
+ */
4043
+ equitySubType?: 'opening' | 'adjustment';
4044
+ /**
4045
+ * Payment source for expense transactions (v6.1). Indicates whether payment comes from asset or liability account. Only present when intent is "expense".
4046
+ */
4047
+ paymentSource?: 'asset' | 'liability';
4048
+ /**
4049
+ * Liability account type hint for credit card/BNPL spending (v6.1). Only present when paymentSource is "liability". Values: CreditCard, Huabei, Baitiao
4050
+ */
4051
+ liabilityHint?: string;
4052
+ /**
4053
+ * Human-readable message (for ask or error actions). Deprecated: Use messageKey for i18n support.
4054
+ * @deprecated
4055
+ */
4056
+ message?: string;
4057
+ /**
4058
+ * i18n message key for frontend translation. Use this instead of message for internationalization support.
4059
+ */
4060
+ messageKey?: string;
4061
+ /**
4062
+ * Parameters for message interpolation. Used with messageKey for dynamic values in translated messages.
4063
+ */
4064
+ messageParams?: {
4065
+ [key: string]: unknown;
4066
+ };
4067
+ /**
4068
+ * Session ID for multi-turn dialogue. Must be included in subsequent requests to continue the conversation.
4069
+ */
4070
+ sessionId?: string;
4071
+ /**
4072
+ * Which slot is waiting for user input
4073
+ */
4074
+ waitingFor?: string;
4075
+ /**
4076
+ * Created transaction info (for created action)
4077
+ */
4078
+ transaction?: NlpTransactionInfoDto;
4079
+ /**
4080
+ * Parsed data for confirmation (when action is "confirm"). Contains extracted fields that user should verify before transaction creation.
4081
+ */
4082
+ parsedData?: NlpParsedDataDto;
4083
+ /**
4084
+ * Duplicate detection data (when action is "confirm_duplicate"). Contains information about potential duplicate transaction for user confirmation.
4085
+ */
4086
+ duplicateData?: NlpDuplicateConfirmationDataDto;
4087
+ /**
4088
+ * Rule match data (when action is "confirm_rule"). Contains information about medium-confidence rule match for user confirmation.
4089
+ */
4090
+ ruleData?: NlpRuleConfirmationDataDto;
4091
+ /**
4092
+ * Account validation data (when action is "confirm_account"). Contains information about invalid account for user correction.
4093
+ */
4094
+ accountData?: NlpAccountConfirmationDataDto;
4095
+ /**
4096
+ * Payee confirmation data (when action is "confirm_payee"). Contains information about medium/low confidence payee match for user confirmation.
4097
+ */
4098
+ payeeData?: NlpPayeeConfirmationDataDto;
4099
+ /**
4100
+ * Overall confidence score (0-1)
4101
+ */
4102
+ confidence?: number;
4103
+ /**
4104
+ * Confidence threshold for automatic creation (default: 0.75). When confidence < threshold, action will be "confirm" requiring user verification.
4105
+ */
4106
+ confidenceThreshold?: number;
4107
+ /**
4108
+ * Recurring transaction match info (when action is "created"). Contains match details when transaction matches a pending expected transaction.
4109
+ */
4110
+ recurringMatch?: RecurringMatchInfoDto;
4111
+ /**
4112
+ * Recurring rule creation suggestion (when action is "created"). Contains suggestion to create a recurring rule based on detected patterns. Only present when no existing rule matched and similar historical transactions were found.
4113
+ */
4114
+ recurringSuggestion?: RecurringSuggestionDto;
4115
+ /**
4116
+ * Suggested accounts for this transaction. Contains recommended source and destination accounts based on the detected intent and rules.
4117
+ */
4118
+ suggestedAccounts?: NlpSuggestedAccountsDto;
4119
+ /**
4120
+ * Default accounts for the user/region. These are fallback accounts used when no specific suggestion is available.
4121
+ */
4122
+ defaultAccounts?: NlpDefaultAccountsDto;
4123
+ };
4124
+
4125
+ /**
4126
+ * Response status
4127
+ */
4128
+ export type status4 = 'success' | 'pending' | 'error';
4129
+
4130
+ /**
4131
+ * Action taken or requested
4132
+ */
4133
+ export type action2 =
4134
+ | 'created'
4135
+ | 'ask'
4136
+ | 'confirm'
4137
+ | 'confirm_duplicate'
4138
+ | 'confirm_rule'
4139
+ | 'confirm_account'
4140
+ | 'confirm_payee'
4141
+ | 'cancel';
4142
+
4143
+ /**
4144
+ * Transaction intent detected by EntityRouter (v6.0: 5 core intents). Frontend uses this to render scenario-specific form fields.
4145
+ */
4146
+ export type intent = 'expense' | 'asset' | 'income' | 'liability' | 'equity';
4147
+
4148
+ /**
4149
+ * Asset sub-type (only present when intent is "asset"). Determines which asset-related form to render.
4150
+ */
4151
+ export type assetSubType = 'transfer' | 'banking' | 'investment';
4152
+
4153
+ /**
4154
+ * Liability sub-type (only present when intent is "liability"). borrow: borrowing money (Liabilities → Assets), repay: repaying debt (Assets → Liabilities).
4155
+ */
4156
+ export type liabilitySubType = 'borrow' | 'repay';
4157
+
4158
+ /**
4159
+ * Equity sub-type (only present when intent is "equity"). opening: account opening balance (Equity → Assets), adjustment: balance correction.
4160
+ */
4161
+ export type equitySubType = 'opening' | 'adjustment';
4162
+
3488
4163
  export type BalanceByCurrencyDto = {
3489
4164
  /**
3490
4165
  * ISO 4217 currency code
@@ -3704,7 +4379,7 @@ export type AccountItemWithAssetClassDto = {
3704
4379
  /**
3705
4380
  * ADR-0105 classification provenance (holding level always; account level only on FALLBACK)
3706
4381
  */
3707
- export type source =
4382
+ export type source2 =
3708
4383
  | 'USER_META'
3709
4384
  | 'FIAT_CURRENCY'
3710
4385
  | 'OPENBB_MAPPING'
@@ -3983,7 +4658,7 @@ export type CurrentPriceDto = {
3983
4658
  /**
3984
4659
  * Price source
3985
4660
  */
3986
- export type source2 = 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
4661
+ export type source3 = 'USER_OVERRIDE' | 'OPENBB_EQUITY' | 'OPENBB_CURRENCY';
3987
4662
 
3988
4663
  export type FxRateDto = {
3989
4664
  from: string;
@@ -4334,6 +5009,71 @@ export type PortfolioTrendsResponseDto = {
4334
5009
  warnings?: Array<ExchangeRateWarningDto>;
4335
5010
  };
4336
5011
 
5012
+ export type CashFlowPointDto = {
5013
+ /**
5014
+ * Month key (YYYY-MM)
5015
+ */
5016
+ month: string;
5017
+ /**
5018
+ * Income in base currency (absolute, converted)
5019
+ */
5020
+ income: string;
5021
+ /**
5022
+ * Expense in base currency (absolute, converted)
5023
+ */
5024
+ expense: string;
5025
+ /**
5026
+ * netSavings = income − expense (savings positive)
5027
+ */
5028
+ netSavings: string;
5029
+ };
5030
+
5031
+ export type CashFlowTrendSummaryDto = {
5032
+ /**
5033
+ * Total income across the period
5034
+ */
5035
+ totalIncome: string;
5036
+ /**
5037
+ * Total expense across the period
5038
+ */
5039
+ totalExpense: string;
5040
+ /**
5041
+ * income − expense across the period
5042
+ */
5043
+ totalNetSavings: string;
5044
+ /**
5045
+ * totalNetSavings divided by the window length (N months, incl. zero-filled)
5046
+ */
5047
+ averageMonthlyNetSavings: string;
5048
+ };
5049
+
5050
+ export type CashFlowTrendsResponseDto = {
5051
+ /**
5052
+ * Monthly cash-flow series (fixed N-month window, zero-filled)
5053
+ */
5054
+ series: Array<CashFlowPointDto>;
5055
+ /**
5056
+ * Period totals
5057
+ */
5058
+ summary: CashFlowTrendSummaryDto;
5059
+ /**
5060
+ * Period requested
5061
+ */
5062
+ period: string;
5063
+ /**
5064
+ * Data granularity (v1 returns month buckets)
5065
+ */
5066
+ granularity: string;
5067
+ /**
5068
+ * Base currency for converted values
5069
+ */
5070
+ currency: string;
5071
+ /**
5072
+ * Exchange rate warnings (e.g. missing rate for a currency)
5073
+ */
5074
+ warnings?: Array<ExchangeRateWarningDto>;
5075
+ };
5076
+
4337
5077
  export type GenerateSnapshotBody = unknown;
4338
5078
 
4339
5079
  export type GenerateSnapshotResponse = unknown;
@@ -4357,7 +5097,7 @@ export type AccountControllerCreateData = {
4357
5097
  requestBody: CreateAccountDto;
4358
5098
  };
4359
5099
 
4360
- export type AccountControllerCreateResponse = unknown;
5100
+ export type AccountControllerCreateResponse = AccountResponseDto;
4361
5101
 
4362
5102
  export type AccountControllerFindAllData = {
4363
5103
  /**
@@ -4406,6 +5146,9 @@ export type AccountControllerFindOneData = {
4406
5146
  export type AccountControllerFindOneResponse = AccountResponseDto;
4407
5147
 
4408
5148
  export type AccountControllerUpdateData = {
5149
+ /**
5150
+ * Account UUID
5151
+ */
4409
5152
  id: string;
4410
5153
  /**
4411
5154
  * Region code for tenant context
@@ -4414,9 +5157,12 @@ export type AccountControllerUpdateData = {
4414
5157
  requestBody: UpdateAccountDto;
4415
5158
  };
4416
5159
 
4417
- export type AccountControllerUpdateResponse = unknown;
5160
+ export type AccountControllerUpdateResponse = AccountResponseDto;
4418
5161
 
4419
5162
  export type AccountControllerDeleteData = {
5163
+ /**
5164
+ * Account UUID
5165
+ */
4420
5166
  id: string;
4421
5167
  /**
4422
5168
  * Region code for tenant context
@@ -4424,9 +5170,12 @@ export type AccountControllerDeleteData = {
4424
5170
  region: 'cn' | 'us' | 'de' | 'gb';
4425
5171
  };
4426
5172
 
4427
- export type AccountControllerDeleteResponse = unknown;
5173
+ export type AccountControllerDeleteResponse = void;
4428
5174
 
4429
5175
  export type AccountControllerCloseData = {
5176
+ /**
5177
+ * Account UUID
5178
+ */
4430
5179
  id: string;
4431
5180
  /**
4432
5181
  * Region code for tenant context
@@ -4435,9 +5184,12 @@ export type AccountControllerCloseData = {
4435
5184
  requestBody: CloseAccountDto;
4436
5185
  };
4437
5186
 
4438
- export type AccountControllerCloseResponse = unknown;
5187
+ export type AccountControllerCloseResponse = AccountResponseDto;
4439
5188
 
4440
5189
  export type AccountControllerReopenData = {
5190
+ /**
5191
+ * Account UUID
5192
+ */
4441
5193
  id: string;
4442
5194
  /**
4443
5195
  * Region code for tenant context
@@ -4446,7 +5198,7 @@ export type AccountControllerReopenData = {
4446
5198
  requestBody: ReopenAccountDto;
4447
5199
  };
4448
5200
 
4449
- export type AccountControllerReopenResponse = unknown;
5201
+ export type AccountControllerReopenResponse = AccountResponseDto;
4450
5202
 
4451
5203
  export type AccountStandardsControllerGetTemplatesData = {
4452
5204
  /**
@@ -5499,6 +6251,104 @@ export type PropertyControllerDeleteData = {
5499
6251
 
5500
6252
  export type PropertyControllerDeleteResponse = void;
5501
6253
 
6254
+ export type EventControllerCreateData = {
6255
+ /**
6256
+ * Region code for tenant context (decorative for life events)
6257
+ */
6258
+ region: 'cn' | 'us' | 'de' | 'gb';
6259
+ requestBody: CreateBeanEventDto;
6260
+ };
6261
+
6262
+ export type EventControllerCreateResponse = EventResponseDto;
6263
+
6264
+ export type EventControllerFindAllData = {
6265
+ /**
6266
+ * Filter life events from this date (ISO 8601 format)
6267
+ */
6268
+ from?: string;
6269
+ /**
6270
+ * Number of items per page (default: 20, max: 100)
6271
+ */
6272
+ limit?: number;
6273
+ /**
6274
+ * Page number for pagination (default: 1)
6275
+ */
6276
+ page?: number;
6277
+ /**
6278
+ * Search term for description (case-insensitive partial match)
6279
+ */
6280
+ q?: string;
6281
+ /**
6282
+ * Region code for tenant context (decorative for life events)
6283
+ */
6284
+ region: 'cn' | 'us' | 'de' | 'gb';
6285
+ /**
6286
+ * Filter life events to this date (ISO 8601 format)
6287
+ */
6288
+ to?: string;
6289
+ /**
6290
+ * Filter by life event type (exact match)
6291
+ */
6292
+ type?: string;
6293
+ };
6294
+
6295
+ export type EventControllerFindAllResponse = EventListResponseDto;
6296
+
6297
+ export type EventControllerFindOneData = {
6298
+ /**
6299
+ * Life event ID
6300
+ */
6301
+ id: string;
6302
+ /**
6303
+ * Region code for tenant context (decorative for life events)
6304
+ */
6305
+ region: 'cn' | 'us' | 'de' | 'gb';
6306
+ };
6307
+
6308
+ export type EventControllerFindOneResponse = EventResponseDto;
6309
+
6310
+ export type EventControllerUpdateData = {
6311
+ /**
6312
+ * Life event ID
6313
+ */
6314
+ id: string;
6315
+ /**
6316
+ * Region code for tenant context (decorative for life events)
6317
+ */
6318
+ region: 'cn' | 'us' | 'de' | 'gb';
6319
+ requestBody: UpdateBeanEventDto;
6320
+ };
6321
+
6322
+ export type EventControllerUpdateResponse = EventResponseDto;
6323
+
6324
+ export type EventControllerDeleteData = {
6325
+ /**
6326
+ * Life event ID
6327
+ */
6328
+ id: string;
6329
+ /**
6330
+ * Region code for tenant context (decorative for life events)
6331
+ */
6332
+ region: 'cn' | 'us' | 'de' | 'gb';
6333
+ };
6334
+
6335
+ export type EventControllerDeleteResponse = void;
6336
+
6337
+ export type EventControllerGetSliceData = {
6338
+ accountPattern: string;
6339
+ granularity: string;
6340
+ /**
6341
+ * Life event ID
6342
+ */
6343
+ id: string;
6344
+ /**
6345
+ * Region code for tenant context (decorative for life events)
6346
+ */
6347
+ region: 'cn' | 'us' | 'de' | 'gb';
6348
+ };
6349
+
6350
+ export type EventControllerGetSliceResponse = unknown;
6351
+
5502
6352
  export type ExportControllerExportBeancountResponse = unknown;
5503
6353
 
5504
6354
  export type FileImportControllerImportFileData = {
@@ -5528,13 +6378,25 @@ export type FileImportControllerIdentifyFileData = {
5528
6378
  export type FileImportControllerIdentifyFileResponse = IdentifyResultDto;
5529
6379
 
5530
6380
  export type FileImportControllerImportBeancountData = {
6381
+ /**
6382
+ * Beancount file to import
6383
+ */
6384
+ formData: FileImportDto;
5531
6385
  /**
5532
6386
  * Region code for tenant context
5533
6387
  */
5534
6388
  region: 'cn' | 'us' | 'de' | 'gb';
5535
6389
  };
5536
6390
 
5537
- export type FileImportControllerImportBeancountResponse = unknown;
6391
+ export type FileImportControllerImportBeancountResponse = {
6392
+ imported?: number;
6393
+ skipped?: number;
6394
+ failed?: number;
6395
+ accountsCreated?: number;
6396
+ errors?: Array<{
6397
+ [key: string]: unknown;
6398
+ }>;
6399
+ };
5538
6400
 
5539
6401
  export type ImporterConfigControllerGetConfigData = {
5540
6402
  /**
@@ -5622,7 +6484,18 @@ export type PlatformControllerDeleteData = {
5622
6484
  export type PlatformControllerDeleteResponse = void;
5623
6485
 
5624
6486
  export type ProviderSyncControllerSyncData = {
5625
- providerName: string;
6487
+ /**
6488
+ * Provider name
6489
+ */
6490
+ providerName:
6491
+ | 'plaid'
6492
+ | 'teller'
6493
+ | 'truelayer'
6494
+ | 'gocardless'
6495
+ | 'simplefin'
6496
+ | 'yodlee'
6497
+ | 'beancount-direct'
6498
+ | 'parsed-bill';
5626
6499
  /**
5627
6500
  * Region code for tenant context
5628
6501
  */
@@ -5630,7 +6503,7 @@ export type ProviderSyncControllerSyncData = {
5630
6503
  requestBody: ProviderSyncDto;
5631
6504
  };
5632
6505
 
5633
- export type ProviderSyncControllerSyncResponse = unknown;
6506
+ export type ProviderSyncControllerSyncResponse = ProviderSyncResponseDto;
5634
6507
 
5635
6508
  export type ProviderSyncControllerGetSupportedProvidersData = {
5636
6509
  /**
@@ -5693,10 +6566,13 @@ export type NlpControllerProcessNaturalLanguageData = {
5693
6566
  * Region code for tenant context
5694
6567
  */
5695
6568
  region: 'cn' | 'us' | 'de' | 'gb';
6569
+ /**
6570
+ * Natural language transaction input with optional session ID
6571
+ */
5696
6572
  requestBody: ProcessNlpDto;
5697
6573
  };
5698
6574
 
5699
- export type NlpControllerProcessNaturalLanguageResponse = unknown;
6575
+ export type NlpControllerProcessNaturalLanguageResponse = NlpResponseDto;
5700
6576
 
5701
6577
  export type NlpControllerClearSessionData = {
5702
6578
  /**
@@ -5914,6 +6790,24 @@ export type ReportingControllerGetPortfolioTrendsData = {
5914
6790
  export type ReportingControllerGetPortfolioTrendsResponse =
5915
6791
  PortfolioTrendsResponseDto;
5916
6792
 
6793
+ export type ReportingControllerGetCashFlowTrendsData = {
6794
+ /**
6795
+ * Data granularity (accepted for API symmetry; v1 returns month buckets)
6796
+ */
6797
+ granularity?: 'day' | 'week' | 'month';
6798
+ /**
6799
+ * Time period
6800
+ */
6801
+ period?: '1m' | '3m' | '6m' | '1y';
6802
+ /**
6803
+ * Region code for tenant context
6804
+ */
6805
+ region: 'cn' | 'us' | 'de' | 'gb';
6806
+ };
6807
+
6808
+ export type ReportingControllerGetCashFlowTrendsResponse =
6809
+ CashFlowTrendsResponseDto;
6810
+
5917
6811
  export type ReportingControllerGenerateSnapshotData = {
5918
6812
  /**
5919
6813
  * Region code for tenant context
@@ -5990,7 +6884,14 @@ export type $OpenApiTs = {
5990
6884
  post: {
5991
6885
  req: AccountControllerCreateData;
5992
6886
  res: {
5993
- 201: unknown;
6887
+ /**
6888
+ * Account created successfully
6889
+ */
6890
+ 201: AccountResponseDto;
6891
+ /**
6892
+ * Account already exists
6893
+ */
6894
+ 409: unknown;
5994
6895
  };
5995
6896
  };
5996
6897
  get: {
@@ -6020,13 +6921,31 @@ export type $OpenApiTs = {
6020
6921
  put: {
6021
6922
  req: AccountControllerUpdateData;
6022
6923
  res: {
6023
- 200: unknown;
6924
+ /**
6925
+ * Account updated successfully
6926
+ */
6927
+ 200: AccountResponseDto;
6928
+ /**
6929
+ * Account not found
6930
+ */
6931
+ 404: unknown;
6024
6932
  };
6025
6933
  };
6026
6934
  delete: {
6027
6935
  req: AccountControllerDeleteData;
6028
6936
  res: {
6029
- 200: unknown;
6937
+ /**
6938
+ * Account deleted successfully
6939
+ */
6940
+ 204: void;
6941
+ /**
6942
+ * Account not found
6943
+ */
6944
+ 404: unknown;
6945
+ /**
6946
+ * Account has transactions and cannot be deleted
6947
+ */
6948
+ 409: unknown;
6030
6949
  };
6031
6950
  };
6032
6951
  };
@@ -6034,7 +6953,18 @@ export type $OpenApiTs = {
6034
6953
  post: {
6035
6954
  req: AccountControllerCloseData;
6036
6955
  res: {
6037
- 201: unknown;
6956
+ /**
6957
+ * Account closed successfully
6958
+ */
6959
+ 200: AccountResponseDto;
6960
+ /**
6961
+ * Account is already closed
6962
+ */
6963
+ 400: unknown;
6964
+ /**
6965
+ * Account not found
6966
+ */
6967
+ 404: unknown;
6038
6968
  };
6039
6969
  };
6040
6970
  };
@@ -6042,7 +6972,18 @@ export type $OpenApiTs = {
6042
6972
  post: {
6043
6973
  req: AccountControllerReopenData;
6044
6974
  res: {
6045
- 201: unknown;
6975
+ /**
6976
+ * Account reopened successfully
6977
+ */
6978
+ 200: AccountResponseDto;
6979
+ /**
6980
+ * Account is not closed
6981
+ */
6982
+ 400: unknown;
6983
+ /**
6984
+ * Account not found
6985
+ */
6986
+ 404: unknown;
6046
6987
  };
6047
6988
  };
6048
6989
  };
@@ -7298,6 +8239,102 @@ export type $OpenApiTs = {
7298
8239
  };
7299
8240
  };
7300
8241
  };
8242
+ '/api/v1/{region}/bean/events': {
8243
+ post: {
8244
+ req: EventControllerCreateData;
8245
+ res: {
8246
+ /**
8247
+ * Life event created successfully
8248
+ */
8249
+ 201: EventResponseDto;
8250
+ /**
8251
+ * Life event already exists for this (userId, type, date) combination
8252
+ */
8253
+ 409: unknown;
8254
+ };
8255
+ };
8256
+ get: {
8257
+ req: EventControllerFindAllData;
8258
+ res: {
8259
+ /**
8260
+ * Life events retrieved successfully
8261
+ */
8262
+ 200: EventListResponseDto;
8263
+ };
8264
+ };
8265
+ };
8266
+ '/api/v1/{region}/bean/events/{id}': {
8267
+ get: {
8268
+ req: EventControllerFindOneData;
8269
+ res: {
8270
+ /**
8271
+ * Life event retrieved successfully
8272
+ */
8273
+ 200: EventResponseDto;
8274
+ /**
8275
+ * Life event not found
8276
+ */
8277
+ 404: unknown;
8278
+ };
8279
+ };
8280
+ put: {
8281
+ req: EventControllerUpdateData;
8282
+ res: {
8283
+ /**
8284
+ * Life event updated successfully
8285
+ */
8286
+ 200: EventResponseDto;
8287
+ /**
8288
+ * If-Match header is not a valid ISO 8601 date
8289
+ */
8290
+ 400: unknown;
8291
+ /**
8292
+ * Life event not found
8293
+ */
8294
+ 404: unknown;
8295
+ /**
8296
+ * Updated event conflicts with an existing (userId, type, date) combination
8297
+ */
8298
+ 409: unknown;
8299
+ /**
8300
+ * If-Match precondition failed (updatedAt mismatch)
8301
+ */
8302
+ 412: unknown;
8303
+ };
8304
+ };
8305
+ delete: {
8306
+ req: EventControllerDeleteData;
8307
+ res: {
8308
+ /**
8309
+ * Life event deleted successfully
8310
+ */
8311
+ 204: void;
8312
+ /**
8313
+ * Life event not found
8314
+ */
8315
+ 404: unknown;
8316
+ };
8317
+ };
8318
+ };
8319
+ '/api/v1/{region}/bean/events/{id}/slice': {
8320
+ get: {
8321
+ req: EventControllerGetSliceData;
8322
+ res: {
8323
+ /**
8324
+ * Time-series sliced by the life event range
8325
+ */
8326
+ 200: unknown;
8327
+ /**
8328
+ * accountPattern query param is empty
8329
+ */
8330
+ 400: unknown;
8331
+ /**
8332
+ * Life event not found
8333
+ */
8334
+ 404: unknown;
8335
+ };
8336
+ };
8337
+ };
7301
8338
  '/api/v1/{region}/bean/export/beancount': {
7302
8339
  get: {
7303
8340
  res: {
@@ -7378,7 +8415,22 @@ export type $OpenApiTs = {
7378
8415
  post: {
7379
8416
  req: FileImportControllerImportBeancountData;
7380
8417
  res: {
7381
- 201: unknown;
8418
+ /**
8419
+ * Beancount file imported successfully
8420
+ */
8421
+ 200: {
8422
+ imported?: number;
8423
+ skipped?: number;
8424
+ failed?: number;
8425
+ accountsCreated?: number;
8426
+ errors?: Array<{
8427
+ [key: string]: unknown;
8428
+ }>;
8429
+ };
8430
+ /**
8431
+ * Bad request - invalid file or no file uploaded
8432
+ */
8433
+ 400: ApiProblemResponseDto;
7382
8434
  };
7383
8435
  };
7384
8436
  };
@@ -7509,7 +8561,22 @@ export type $OpenApiTs = {
7509
8561
  post: {
7510
8562
  req: ProviderSyncControllerSyncData;
7511
8563
  res: {
7512
- 201: unknown;
8564
+ /**
8565
+ * Sync completed successfully
8566
+ */
8567
+ 200: ProviderSyncResponseDto;
8568
+ /**
8569
+ * Invalid request data
8570
+ */
8571
+ 400: unknown;
8572
+ /**
8573
+ * Missing or invalid authentication
8574
+ */
8575
+ 401: unknown;
8576
+ /**
8577
+ * Provider not supported
8578
+ */
8579
+ 404: unknown;
7513
8580
  };
7514
8581
  };
7515
8582
  };
@@ -7588,7 +8655,18 @@ export type $OpenApiTs = {
7588
8655
  post: {
7589
8656
  req: NlpControllerProcessNaturalLanguageData;
7590
8657
  res: {
7591
- 201: unknown;
8658
+ /**
8659
+ * NLP processing result - either created transaction or asking for more info
8660
+ */
8661
+ 200: NlpResponseDto;
8662
+ /**
8663
+ * Invalid input
8664
+ */
8665
+ 400: unknown;
8666
+ /**
8667
+ * Unauthorized
8668
+ */
8669
+ 401: unknown;
7592
8670
  };
7593
8671
  };
7594
8672
  };
@@ -7790,6 +8868,21 @@ export type $OpenApiTs = {
7790
8868
  };
7791
8869
  };
7792
8870
  };
8871
+ '/api/v1/{region}/reporting/cash-flow/trends': {
8872
+ get: {
8873
+ req: ReportingControllerGetCashFlowTrendsData;
8874
+ res: {
8875
+ /**
8876
+ * Cash-flow trends retrieved successfully
8877
+ */
8878
+ 200: CashFlowTrendsResponseDto;
8879
+ /**
8880
+ * User not authenticated
8881
+ */
8882
+ 401: unknown;
8883
+ };
8884
+ };
8885
+ };
7793
8886
  '/api/v1/{region}/reporting/snapshots/generate': {
7794
8887
  post: {
7795
8888
  req: ReportingControllerGenerateSnapshotData;