@markcolabs/mcp 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/LICENSE-API.md +111 -0
- package/README.md +128 -205
- package/dist/engines/compoundInterest.d.ts +8 -6
- package/dist/engines/compoundInterest.d.ts.map +1 -1
- package/dist/engines/compoundInterest.js +8 -6
- package/dist/engines/compoundInterest.js.map +1 -1
- package/dist/engines/data/irs2026.d.ts +110 -3
- package/dist/engines/data/irs2026.d.ts.map +1 -1
- package/dist/engines/data/irs2026.js +86 -3
- package/dist/engines/data/irs2026.js.map +1 -1
- package/dist/engines/data/rmd2026.d.ts +59 -0
- package/dist/engines/data/rmd2026.d.ts.map +1 -0
- package/dist/engines/data/rmd2026.js +75 -0
- package/dist/engines/data/rmd2026.js.map +1 -0
- package/dist/engines/data/stateTax2026.d.ts +114 -0
- package/dist/engines/data/stateTax2026.d.ts.map +1 -0
- package/dist/engines/data/stateTax2026.js +348 -0
- package/dist/engines/data/stateTax2026.js.map +1 -0
- package/dist/engines/hsa.d.ts +110 -0
- package/dist/engines/hsa.d.ts.map +1 -0
- package/dist/engines/hsa.js +83 -0
- package/dist/engines/hsa.js.map +1 -0
- package/dist/engines/ira.d.ts +115 -0
- package/dist/engines/ira.d.ts.map +1 -0
- package/dist/engines/ira.js +127 -0
- package/dist/engines/ira.js.map +1 -0
- package/dist/engines/mortgage.d.ts +7 -6
- package/dist/engines/mortgage.d.ts.map +1 -1
- package/dist/engines/mortgage.js +7 -6
- package/dist/engines/mortgage.js.map +1 -1
- package/dist/engines/paycheck.d.ts +57 -18
- package/dist/engines/paycheck.d.ts.map +1 -1
- package/dist/engines/paycheck.js +59 -26
- package/dist/engines/paycheck.js.map +1 -1
- package/dist/engines/retirement401k.d.ts +7 -3
- package/dist/engines/retirement401k.d.ts.map +1 -1
- package/dist/engines/retirement401k.js +7 -3
- package/dist/engines/retirement401k.js.map +1 -1
- package/dist/engines/rmd.d.ts +107 -0
- package/dist/engines/rmd.d.ts.map +1 -0
- package/dist/engines/rmd.js +109 -0
- package/dist/engines/rmd.js.map +1 -0
- package/dist/engines/rothConversion.d.ts +124 -0
- package/dist/engines/rothConversion.d.ts.map +1 -0
- package/dist/engines/rothConversion.js +145 -0
- package/dist/engines/rothConversion.js.map +1 -0
- package/dist/engines/socialSecurity.d.ts +7 -3
- package/dist/engines/socialSecurity.d.ts.map +1 -1
- package/dist/engines/socialSecurity.js +7 -3
- package/dist/engines/socialSecurity.js.map +1 -1
- package/dist/index.d.ts +21 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -11
- package/dist/index.js.map +1 -1
- package/dist/shared/bounds.d.ts +50 -0
- package/dist/shared/bounds.d.ts.map +1 -1
- package/dist/shared/bounds.js +85 -0
- package/dist/shared/bounds.js.map +1 -1
- package/dist/tools/hsa.d.ts +58 -0
- package/dist/tools/hsa.d.ts.map +1 -0
- package/dist/tools/hsa.js +129 -0
- package/dist/tools/hsa.js.map +1 -0
- package/dist/tools/ira.d.ts +55 -0
- package/dist/tools/ira.d.ts.map +1 -0
- package/dist/tools/ira.js +117 -0
- package/dist/tools/ira.js.map +1 -0
- package/dist/tools/paycheck.d.ts +14 -7
- package/dist/tools/paycheck.d.ts.map +1 -1
- package/dist/tools/paycheck.js +24 -11
- package/dist/tools/paycheck.js.map +1 -1
- package/dist/tools/retirement401k.d.ts +3 -3
- package/dist/tools/retirement401k.d.ts.map +1 -1
- package/dist/tools/retirement401k.js +3 -3
- package/dist/tools/retirement401k.js.map +1 -1
- package/dist/tools/rmd.d.ts +60 -0
- package/dist/tools/rmd.d.ts.map +1 -0
- package/dist/tools/rmd.js +130 -0
- package/dist/tools/rmd.js.map +1 -0
- package/dist/tools/rothConversion.d.ts +66 -0
- package/dist/tools/rothConversion.d.ts.map +1 -0
- package/dist/tools/rothConversion.js +141 -0
- package/dist/tools/rothConversion.js.map +1 -0
- package/dist/tools/socialSecurity.d.ts +3 -3
- package/dist/tools/socialSecurity.d.ts.map +1 -1
- package/dist/tools/socialSecurity.js +3 -3
- package/dist/tools/socialSecurity.js.map +1 -1
- package/package.json +19 -5
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Self-contained 2026 IRS retirement-plan limits subset for the MCP package's
|
|
3
|
-
*
|
|
3
|
+
* retirement engines (401k, IRA, Roth conversion).
|
|
4
4
|
*
|
|
5
|
-
* Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026
|
|
6
|
-
* engines/data/ssa.ts
|
|
5
|
+
* Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026 / LIMITS_IRA_2026
|
|
6
|
+
* / ROTH_PHASE_OUT_2026 / TRADITIONAL_PHASE_OUT_2026. See engines/data/ssa.ts
|
|
7
|
+
* for full rationale on the mirror pattern.
|
|
7
8
|
*
|
|
8
9
|
* Source: IRS Notice 2025-67 (2026 retirement-plan limits) +
|
|
9
10
|
* SECURE 2.0 Act §109 (super catch-up provision for ages 60-63).
|
|
11
|
+
* IRA limits re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
|
|
10
12
|
* Last verified: 2026-05-09.
|
|
11
13
|
*/
|
|
12
14
|
export declare const LIMITS_401K_2026: {
|
|
@@ -27,4 +29,109 @@ export declare const LIMITS_401K_2026: {
|
|
|
27
29
|
/** End of super catch-up window. */
|
|
28
30
|
readonly superCatchUpAgeEnd: 63;
|
|
29
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* 2026 IRA Contribution Limits.
|
|
34
|
+
* Mirrored from site/src/data/annual-limits.js `LIMITS_IRA_2026`.
|
|
35
|
+
*
|
|
36
|
+
* Source: IRS Notice 2025-67 (2026 retirement plan limits); SECURE 2.0 Act §107
|
|
37
|
+
* (catch-up indexing). Re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
|
|
38
|
+
*/
|
|
39
|
+
export declare const LIMITS_IRA_2026: {
|
|
40
|
+
/** Base IRA contribution limit (under age 50). */
|
|
41
|
+
readonly standard: 7500;
|
|
42
|
+
/** Catch-up amount for age 50+ (SECURE 2.0 indexed). */
|
|
43
|
+
readonly catchUp: 1100;
|
|
44
|
+
/** Total contribution limit for age 50+ (standard + catchUp). */
|
|
45
|
+
readonly total50Plus: 8600;
|
|
46
|
+
/** Minimum age for catch-up eligibility. */
|
|
47
|
+
readonly catchUpAge: 50;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 2026 Roth IRA Income (MAGI) Phase-Out Thresholds.
|
|
51
|
+
* Mirrored from site/src/data/annual-limits.js `ROTH_PHASE_OUT_2026`.
|
|
52
|
+
*
|
|
53
|
+
* Source: IRS Notice 2025-67; IRC §408A(c)(3) phase-out methodology.
|
|
54
|
+
* Filing-status keys are camelCase to match the MCP package's `FilingStatus`
|
|
55
|
+
* convention; mapping vs. site keys: single=single, mfj=marriedFilingJointly,
|
|
56
|
+
* mfs=marriedFilingSeparately. (Head-of-household uses the single thresholds
|
|
57
|
+
* per IRS rules.)
|
|
58
|
+
*/
|
|
59
|
+
export declare const ROTH_PHASE_OUT_2026: {
|
|
60
|
+
readonly single: {
|
|
61
|
+
readonly start: 153000;
|
|
62
|
+
readonly end: 168000;
|
|
63
|
+
};
|
|
64
|
+
readonly marriedFilingJointly: {
|
|
65
|
+
readonly start: 242000;
|
|
66
|
+
readonly end: 252000;
|
|
67
|
+
};
|
|
68
|
+
readonly marriedFilingSeparately: {
|
|
69
|
+
readonly start: 0;
|
|
70
|
+
readonly end: 10000;
|
|
71
|
+
};
|
|
72
|
+
readonly headOfHousehold: {
|
|
73
|
+
readonly start: 153000;
|
|
74
|
+
readonly end: 168000;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* 2026 Traditional IRA Deduction Phase-Out (contributor covered by workplace plan).
|
|
79
|
+
* Mirrored from site/src/data/annual-limits.js `TRADITIONAL_PHASE_OUT_2026`.
|
|
80
|
+
*
|
|
81
|
+
* Source: IRS Notice 2025-67; IRC §219(g) deduction phase-out methodology.
|
|
82
|
+
* NOTE: This phase-out governs the DEDUCTIBILITY of traditional IRA
|
|
83
|
+
* contributions, not the contribution limit itself. The IRA contributionLimit
|
|
84
|
+
* tool returns the eligibleContribution (= base limit for Traditional regardless
|
|
85
|
+
* of MAGI, since non-deductible contributions are always permitted). The
|
|
86
|
+
* Traditional phase-out is exposed via a separate field for clients that need
|
|
87
|
+
* the deduction-phase-out signal.
|
|
88
|
+
*/
|
|
89
|
+
export declare const TRADITIONAL_PHASE_OUT_2026: {
|
|
90
|
+
readonly single: {
|
|
91
|
+
readonly start: 81000;
|
|
92
|
+
readonly end: 91000;
|
|
93
|
+
};
|
|
94
|
+
readonly marriedFilingJointly: {
|
|
95
|
+
readonly start: 129000;
|
|
96
|
+
readonly end: 149000;
|
|
97
|
+
};
|
|
98
|
+
readonly marriedFilingSeparately: {
|
|
99
|
+
readonly start: 0;
|
|
100
|
+
readonly end: 10000;
|
|
101
|
+
};
|
|
102
|
+
readonly headOfHousehold: {
|
|
103
|
+
readonly start: 81000;
|
|
104
|
+
readonly end: 91000;
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* 2026 HSA Contribution Limits.
|
|
109
|
+
* Mirrored from site/src/data/annual-limits.js `LIMITS_HSA_2026`.
|
|
110
|
+
*
|
|
111
|
+
* Source: IRS Rev. Proc. 2025-19 (2026 HSA inflation adjustments under IRC §223);
|
|
112
|
+
* IRC §223(b)(3)(B) ($1,000 catch-up is statutory and NOT inflation-indexed).
|
|
113
|
+
* Last verified: 2026-05-27 (mirrored from site/src/data/annual-limits.js,
|
|
114
|
+
* site _meta.last_verified_date: 2026-05-07).
|
|
115
|
+
*
|
|
116
|
+
* Notes:
|
|
117
|
+
* - `medicareAge`: HSA contributions are prohibited once enrolled in Medicare
|
|
118
|
+
* (typically age 65). Surfaced as an informational threshold; the HSA
|
|
119
|
+
* contribution-limit tool does not zero out the limit at this age, it just
|
|
120
|
+
* reports it (parallel to how the site shows a Medicare warning badge).
|
|
121
|
+
* - Employer contributions REDUCE the employee's eligible payroll deduction
|
|
122
|
+
* dollar-for-dollar because the IRS limit is a TOTAL annual limit, not a
|
|
123
|
+
* per-source limit. See engines/hsa.ts for the clamp.
|
|
124
|
+
*/
|
|
125
|
+
export declare const LIMITS_HSA_2026: {
|
|
126
|
+
/** Self-only HDHP coverage base limit. */
|
|
127
|
+
readonly selfOnly: 4400;
|
|
128
|
+
/** Family HDHP coverage base limit. */
|
|
129
|
+
readonly family: 8750;
|
|
130
|
+
/** Catch-up amount for age 55+ (statutory, not indexed). */
|
|
131
|
+
readonly catchUp: 1000;
|
|
132
|
+
/** Minimum age for catch-up eligibility. */
|
|
133
|
+
readonly catchUpAge: 55;
|
|
134
|
+
/** Age at which Medicare enrollment typically begins (informational only). */
|
|
135
|
+
readonly medicareAge: 65;
|
|
136
|
+
};
|
|
30
137
|
//# sourceMappingURL=irs2026.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"irs2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"irs2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,gBAAgB;IAC3B,oCAAoC;;IAEpC,qDAAqD;;IAErD,yDAAyD;;IAEzD,kDAAkD;;IAElD,gDAAgD;;IAEhD,oCAAoC;;IAEpC,sCAAsC;;IAEtC,oCAAoC;;CAE5B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;IAC1B,kDAAkD;;IAElD,wDAAwD;;IAExD,iEAAiE;;IAEjE,4CAA4C;;CAEpC,CAAC;AAEX;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAKtB,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;CAK7B,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe;IAC1B,0CAA0C;;IAE1C,uCAAuC;;IAEvC,4DAA4D;;IAE5D,4CAA4C;;IAE5C,8EAA8E;;CAEtE,CAAC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Self-contained 2026 IRS retirement-plan limits subset for the MCP package's
|
|
3
|
-
*
|
|
3
|
+
* retirement engines (401k, IRA, Roth conversion).
|
|
4
4
|
*
|
|
5
|
-
* Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026
|
|
6
|
-
* engines/data/ssa.ts
|
|
5
|
+
* Mirrored from site/src/data/annual-limits.js LIMITS_401K_2026 / LIMITS_IRA_2026
|
|
6
|
+
* / ROTH_PHASE_OUT_2026 / TRADITIONAL_PHASE_OUT_2026. See engines/data/ssa.ts
|
|
7
|
+
* for full rationale on the mirror pattern.
|
|
7
8
|
*
|
|
8
9
|
* Source: IRS Notice 2025-67 (2026 retirement-plan limits) +
|
|
9
10
|
* SECURE 2.0 Act §109 (super catch-up provision for ages 60-63).
|
|
11
|
+
* IRA limits re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
|
|
10
12
|
* Last verified: 2026-05-09.
|
|
11
13
|
*/
|
|
12
14
|
export const LIMITS_401K_2026 = {
|
|
@@ -27,4 +29,85 @@ export const LIMITS_401K_2026 = {
|
|
|
27
29
|
/** End of super catch-up window. */
|
|
28
30
|
superCatchUpAgeEnd: 63,
|
|
29
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* 2026 IRA Contribution Limits.
|
|
34
|
+
* Mirrored from site/src/data/annual-limits.js `LIMITS_IRA_2026`.
|
|
35
|
+
*
|
|
36
|
+
* Source: IRS Notice 2025-67 (2026 retirement plan limits); SECURE 2.0 Act §107
|
|
37
|
+
* (catch-up indexing). Re-affirmed AL-2026-001 / ARCH-BRIEF-20260504.
|
|
38
|
+
*/
|
|
39
|
+
export const LIMITS_IRA_2026 = {
|
|
40
|
+
/** Base IRA contribution limit (under age 50). */
|
|
41
|
+
standard: 7_500,
|
|
42
|
+
/** Catch-up amount for age 50+ (SECURE 2.0 indexed). */
|
|
43
|
+
catchUp: 1_100,
|
|
44
|
+
/** Total contribution limit for age 50+ (standard + catchUp). */
|
|
45
|
+
total50Plus: 8_600,
|
|
46
|
+
/** Minimum age for catch-up eligibility. */
|
|
47
|
+
catchUpAge: 50,
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 2026 Roth IRA Income (MAGI) Phase-Out Thresholds.
|
|
51
|
+
* Mirrored from site/src/data/annual-limits.js `ROTH_PHASE_OUT_2026`.
|
|
52
|
+
*
|
|
53
|
+
* Source: IRS Notice 2025-67; IRC §408A(c)(3) phase-out methodology.
|
|
54
|
+
* Filing-status keys are camelCase to match the MCP package's `FilingStatus`
|
|
55
|
+
* convention; mapping vs. site keys: single=single, mfj=marriedFilingJointly,
|
|
56
|
+
* mfs=marriedFilingSeparately. (Head-of-household uses the single thresholds
|
|
57
|
+
* per IRS rules.)
|
|
58
|
+
*/
|
|
59
|
+
export const ROTH_PHASE_OUT_2026 = {
|
|
60
|
+
single: { start: 153_000, end: 168_000 },
|
|
61
|
+
marriedFilingJointly: { start: 242_000, end: 252_000 },
|
|
62
|
+
marriedFilingSeparately: { start: 0, end: 10_000 },
|
|
63
|
+
headOfHousehold: { start: 153_000, end: 168_000 },
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* 2026 Traditional IRA Deduction Phase-Out (contributor covered by workplace plan).
|
|
67
|
+
* Mirrored from site/src/data/annual-limits.js `TRADITIONAL_PHASE_OUT_2026`.
|
|
68
|
+
*
|
|
69
|
+
* Source: IRS Notice 2025-67; IRC §219(g) deduction phase-out methodology.
|
|
70
|
+
* NOTE: This phase-out governs the DEDUCTIBILITY of traditional IRA
|
|
71
|
+
* contributions, not the contribution limit itself. The IRA contributionLimit
|
|
72
|
+
* tool returns the eligibleContribution (= base limit for Traditional regardless
|
|
73
|
+
* of MAGI, since non-deductible contributions are always permitted). The
|
|
74
|
+
* Traditional phase-out is exposed via a separate field for clients that need
|
|
75
|
+
* the deduction-phase-out signal.
|
|
76
|
+
*/
|
|
77
|
+
export const TRADITIONAL_PHASE_OUT_2026 = {
|
|
78
|
+
single: { start: 81_000, end: 91_000 },
|
|
79
|
+
marriedFilingJointly: { start: 129_000, end: 149_000 },
|
|
80
|
+
marriedFilingSeparately: { start: 0, end: 10_000 },
|
|
81
|
+
headOfHousehold: { start: 81_000, end: 91_000 },
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* 2026 HSA Contribution Limits.
|
|
85
|
+
* Mirrored from site/src/data/annual-limits.js `LIMITS_HSA_2026`.
|
|
86
|
+
*
|
|
87
|
+
* Source: IRS Rev. Proc. 2025-19 (2026 HSA inflation adjustments under IRC §223);
|
|
88
|
+
* IRC §223(b)(3)(B) ($1,000 catch-up is statutory and NOT inflation-indexed).
|
|
89
|
+
* Last verified: 2026-05-27 (mirrored from site/src/data/annual-limits.js,
|
|
90
|
+
* site _meta.last_verified_date: 2026-05-07).
|
|
91
|
+
*
|
|
92
|
+
* Notes:
|
|
93
|
+
* - `medicareAge`: HSA contributions are prohibited once enrolled in Medicare
|
|
94
|
+
* (typically age 65). Surfaced as an informational threshold; the HSA
|
|
95
|
+
* contribution-limit tool does not zero out the limit at this age, it just
|
|
96
|
+
* reports it (parallel to how the site shows a Medicare warning badge).
|
|
97
|
+
* - Employer contributions REDUCE the employee's eligible payroll deduction
|
|
98
|
+
* dollar-for-dollar because the IRS limit is a TOTAL annual limit, not a
|
|
99
|
+
* per-source limit. See engines/hsa.ts for the clamp.
|
|
100
|
+
*/
|
|
101
|
+
export const LIMITS_HSA_2026 = {
|
|
102
|
+
/** Self-only HDHP coverage base limit. */
|
|
103
|
+
selfOnly: 4_400,
|
|
104
|
+
/** Family HDHP coverage base limit. */
|
|
105
|
+
family: 8_750,
|
|
106
|
+
/** Catch-up amount for age 55+ (statutory, not indexed). */
|
|
107
|
+
catchUp: 1_000,
|
|
108
|
+
/** Minimum age for catch-up eligibility. */
|
|
109
|
+
catchUpAge: 55,
|
|
110
|
+
/** Age at which Medicare enrollment typically begins (informational only). */
|
|
111
|
+
medicareAge: 65,
|
|
112
|
+
};
|
|
30
113
|
//# sourceMappingURL=irs2026.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"irs2026.js","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"irs2026.js","sourceRoot":"","sources":["../../../src/engines/data/irs2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,oCAAoC;IACpC,IAAI,EAAE,MAAM;IACZ,qDAAqD;IACrD,OAAO,EAAE,KAAK;IACd,yDAAyD;IACzD,YAAY,EAAE,MAAM;IACpB,kDAAkD;IAClD,gBAAgB,EAAE,MAAM;IACxB,gDAAgD;IAChD,qBAAqB,EAAE,MAAM;IAC7B,oCAAoC;IACpC,UAAU,EAAE,EAAE;IACd,sCAAsC;IACtC,oBAAoB,EAAE,EAAE;IACxB,oCAAoC;IACpC,kBAAkB,EAAE,EAAE;CACd,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kDAAkD;IAClD,QAAQ,EAAE,KAAK;IACf,wDAAwD;IACxD,OAAO,EAAE,KAAK;IACd,iEAAiE;IACjE,WAAW,EAAE,KAAK;IAClB,4CAA4C;IAC5C,UAAU,EAAE,EAAE;CACN,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAC1D,oBAAoB,EAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAC1D,uBAAuB,EAAG,EAAE,KAAK,EAAE,CAAC,EAAQ,GAAG,EAAE,MAAM,EAAG;IAC1D,eAAe,EAAW,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;CAClD,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAoB,EAAE,KAAK,EAAE,MAAM,EAAG,GAAG,EAAE,MAAM,EAAG;IAC1D,oBAAoB,EAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAC1D,uBAAuB,EAAG,EAAE,KAAK,EAAE,CAAC,EAAQ,GAAG,EAAE,MAAM,EAAG;IAC1D,eAAe,EAAW,EAAE,KAAK,EAAE,MAAM,EAAG,GAAG,EAAE,MAAM,EAAG;CAClD,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,KAAK;IACf,uCAAuC;IACvC,MAAM,EAAI,KAAK;IACf,4DAA4D;IAC5D,OAAO,EAAG,KAAK;IACf,4CAA4C;IAC5C,UAAU,EAAE,EAAE;IACd,8EAA8E;IAC9E,WAAW,EAAE,EAAE;CACP,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IRS Uniform Lifetime Table (Pub. 590-B Table III, post-2022 version) and
|
|
3
|
+
* SECURE 2.0 RMD-start-age tiers for the MCP `rmd` engine.
|
|
4
|
+
*
|
|
5
|
+
* Mirrored from site/src/utils/rmd-engine.js — `UNIFORM_LIFETIME_TABLE` and
|
|
6
|
+
* `getRMDStartAge`. Following the same mirror pattern as other data modules
|
|
7
|
+
* (engines/data/ssa.ts, engines/data/irs2026.ts): keep self-contained so the
|
|
8
|
+
* npm package has no runtime dependency on the site `src/` tree.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: The site rmd-engine.js currently uses ONLY the Uniform Lifetime
|
|
11
|
+
* Table — the Joint Life Expectancy Table (Pub. 590-B Table II, applied
|
|
12
|
+
* when spouse is sole beneficiary AND 10+ years younger) is NOT implemented
|
|
13
|
+
* in the site source. To stay 1:1 with the site for parity-test correctness,
|
|
14
|
+
* the MCP RMD tool also exposes ONLY the Uniform Lifetime path. The
|
|
15
|
+
* `tableUsed` field in the result is always `"uniform-lifetime"` for v1.
|
|
16
|
+
* If Joint Life is added to the site engine later, both sides bump in
|
|
17
|
+
* lockstep.
|
|
18
|
+
*
|
|
19
|
+
* Source: IRS Publication 590-B (2024/2025) + SECURE 2.0 Act §107 (RMD age
|
|
20
|
+
* tier: pre-1951 → 70.5, 1951-1959 → 73, 1960+ → 75).
|
|
21
|
+
* SECURE 2.0 §302 reduced the missed-RMD excise tax from 50% to 25%
|
|
22
|
+
* (and to 10% if corrected within the IRS correction window).
|
|
23
|
+
* Last verified: 2026-05-27.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* IRS Uniform Lifetime Table (Table III) — post-2022 version per Pub. 590-B.
|
|
27
|
+
* Keys are integer ages 72-120; values are distribution-period factors (years).
|
|
28
|
+
* RMD = balance / distributionPeriod.
|
|
29
|
+
*/
|
|
30
|
+
export declare const UNIFORM_LIFETIME_TABLE_2026: Readonly<Record<number, number>>;
|
|
31
|
+
/**
|
|
32
|
+
* Lowest age in the Uniform Lifetime Table. RMD requests below this age are
|
|
33
|
+
* either pre-RMD (caller error) or use the lower bound (72) clamp matching
|
|
34
|
+
* the site's `getDistributionPeriod` behavior. The MCP tool prefers an
|
|
35
|
+
* INPUT_VALIDATION error for ages below the SECURE-2.0 floor (73 for the
|
|
36
|
+
* common 1951-1959 cohort).
|
|
37
|
+
*/
|
|
38
|
+
export declare const UNIFORM_LIFETIME_MIN_AGE = 72;
|
|
39
|
+
/** Highest age in the Uniform Lifetime Table — clamps lookups for age > 120. */
|
|
40
|
+
export declare const UNIFORM_LIFETIME_MAX_AGE = 120;
|
|
41
|
+
/**
|
|
42
|
+
* SECURE 2.0 RMD-start-age tiers (verbatim port of site `getRMDStartAge`).
|
|
43
|
+
* - Born ≤ 1950 → 70.5 (legacy, pre-SECURE-Act)
|
|
44
|
+
* - Born 1951-1959 → 73 (SECURE 2.0 §107 phase 1)
|
|
45
|
+
* - Born ≥ 1960 → 75 (SECURE 2.0 §107 phase 2, effective 2033)
|
|
46
|
+
*/
|
|
47
|
+
export declare function getRmdStartAge(birthYear: number): number;
|
|
48
|
+
/**
|
|
49
|
+
* SECURE 2.0 §302 missed-RMD excise tax (reduced from 50% pre-2023).
|
|
50
|
+
* - 25% on the under-distributed amount (default)
|
|
51
|
+
* - 10% if corrected within the IRS correction window (typically 2 years)
|
|
52
|
+
* Surfaced as an informational field in the RMD result so callers can warn
|
|
53
|
+
* users about the cost of missing the deadline.
|
|
54
|
+
*/
|
|
55
|
+
export declare const RMD_MISSED_EXCISE_RATE = 0.25;
|
|
56
|
+
export declare const RMD_MISSED_EXCISE_RATE_IF_CORRECTED = 0.1;
|
|
57
|
+
/** Stable provenance string for `result.meta.source`. */
|
|
58
|
+
export declare const RMD_TABLE_SOURCE = "IRS Publication 590-B (Uniform Lifetime Table III, post-2022); SECURE 2.0 Act \u00A7107 (RMD age tiers); \u00A7302 (25% excise tax)";
|
|
59
|
+
//# sourceMappingURL=rmd2026.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rmd2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/rmd2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU/D,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,mCAAmC,MAAO,CAAC;AAExD,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,wIACgG,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IRS Uniform Lifetime Table (Pub. 590-B Table III, post-2022 version) and
|
|
3
|
+
* SECURE 2.0 RMD-start-age tiers for the MCP `rmd` engine.
|
|
4
|
+
*
|
|
5
|
+
* Mirrored from site/src/utils/rmd-engine.js — `UNIFORM_LIFETIME_TABLE` and
|
|
6
|
+
* `getRMDStartAge`. Following the same mirror pattern as other data modules
|
|
7
|
+
* (engines/data/ssa.ts, engines/data/irs2026.ts): keep self-contained so the
|
|
8
|
+
* npm package has no runtime dependency on the site `src/` tree.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: The site rmd-engine.js currently uses ONLY the Uniform Lifetime
|
|
11
|
+
* Table — the Joint Life Expectancy Table (Pub. 590-B Table II, applied
|
|
12
|
+
* when spouse is sole beneficiary AND 10+ years younger) is NOT implemented
|
|
13
|
+
* in the site source. To stay 1:1 with the site for parity-test correctness,
|
|
14
|
+
* the MCP RMD tool also exposes ONLY the Uniform Lifetime path. The
|
|
15
|
+
* `tableUsed` field in the result is always `"uniform-lifetime"` for v1.
|
|
16
|
+
* If Joint Life is added to the site engine later, both sides bump in
|
|
17
|
+
* lockstep.
|
|
18
|
+
*
|
|
19
|
+
* Source: IRS Publication 590-B (2024/2025) + SECURE 2.0 Act §107 (RMD age
|
|
20
|
+
* tier: pre-1951 → 70.5, 1951-1959 → 73, 1960+ → 75).
|
|
21
|
+
* SECURE 2.0 §302 reduced the missed-RMD excise tax from 50% to 25%
|
|
22
|
+
* (and to 10% if corrected within the IRS correction window).
|
|
23
|
+
* Last verified: 2026-05-27.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* IRS Uniform Lifetime Table (Table III) — post-2022 version per Pub. 590-B.
|
|
27
|
+
* Keys are integer ages 72-120; values are distribution-period factors (years).
|
|
28
|
+
* RMD = balance / distributionPeriod.
|
|
29
|
+
*/
|
|
30
|
+
export const UNIFORM_LIFETIME_TABLE_2026 = {
|
|
31
|
+
72: 27.4, 73: 26.5, 74: 25.5, 75: 24.6, 76: 23.7, 77: 22.9,
|
|
32
|
+
78: 22.0, 79: 21.1, 80: 20.2, 81: 19.4, 82: 18.5, 83: 17.7,
|
|
33
|
+
84: 16.8, 85: 16.0, 86: 15.2, 87: 14.4, 88: 13.7, 89: 12.9,
|
|
34
|
+
90: 12.2, 91: 11.5, 92: 10.8, 93: 10.1, 94: 9.5, 95: 8.9,
|
|
35
|
+
96: 8.4, 97: 7.8, 98: 7.3, 99: 6.8, 100: 6.4, 101: 6.0,
|
|
36
|
+
102: 5.6, 103: 5.2, 104: 4.9, 105: 4.6, 106: 4.3, 107: 4.1,
|
|
37
|
+
108: 3.9, 109: 3.7, 110: 3.5, 111: 3.4, 112: 3.3, 113: 3.1,
|
|
38
|
+
114: 3.0, 115: 2.9, 116: 2.8, 117: 2.7, 118: 2.5, 119: 2.3,
|
|
39
|
+
120: 2.0,
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Lowest age in the Uniform Lifetime Table. RMD requests below this age are
|
|
43
|
+
* either pre-RMD (caller error) or use the lower bound (72) clamp matching
|
|
44
|
+
* the site's `getDistributionPeriod` behavior. The MCP tool prefers an
|
|
45
|
+
* INPUT_VALIDATION error for ages below the SECURE-2.0 floor (73 for the
|
|
46
|
+
* common 1951-1959 cohort).
|
|
47
|
+
*/
|
|
48
|
+
export const UNIFORM_LIFETIME_MIN_AGE = 72;
|
|
49
|
+
/** Highest age in the Uniform Lifetime Table — clamps lookups for age > 120. */
|
|
50
|
+
export const UNIFORM_LIFETIME_MAX_AGE = 120;
|
|
51
|
+
/**
|
|
52
|
+
* SECURE 2.0 RMD-start-age tiers (verbatim port of site `getRMDStartAge`).
|
|
53
|
+
* - Born ≤ 1950 → 70.5 (legacy, pre-SECURE-Act)
|
|
54
|
+
* - Born 1951-1959 → 73 (SECURE 2.0 §107 phase 1)
|
|
55
|
+
* - Born ≥ 1960 → 75 (SECURE 2.0 §107 phase 2, effective 2033)
|
|
56
|
+
*/
|
|
57
|
+
export function getRmdStartAge(birthYear) {
|
|
58
|
+
if (birthYear <= 1950)
|
|
59
|
+
return 70.5;
|
|
60
|
+
if (birthYear <= 1959)
|
|
61
|
+
return 73;
|
|
62
|
+
return 75;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* SECURE 2.0 §302 missed-RMD excise tax (reduced from 50% pre-2023).
|
|
66
|
+
* - 25% on the under-distributed amount (default)
|
|
67
|
+
* - 10% if corrected within the IRS correction window (typically 2 years)
|
|
68
|
+
* Surfaced as an informational field in the RMD result so callers can warn
|
|
69
|
+
* users about the cost of missing the deadline.
|
|
70
|
+
*/
|
|
71
|
+
export const RMD_MISSED_EXCISE_RATE = 0.25;
|
|
72
|
+
export const RMD_MISSED_EXCISE_RATE_IF_CORRECTED = 0.10;
|
|
73
|
+
/** Stable provenance string for `result.meta.source`. */
|
|
74
|
+
export const RMD_TABLE_SOURCE = "IRS Publication 590-B (Uniform Lifetime Table III, post-2022); SECURE 2.0 Act §107 (RMD age tiers); §302 (25% excise tax)";
|
|
75
|
+
//# sourceMappingURL=rmd2026.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rmd2026.js","sourceRoot":"","sources":["../../../src/engines/data/rmd2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAqC;IAC3E,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI;IAC1D,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;IACxD,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IACtD,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAC1D,GAAG,EAAE,GAAG;CACA,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC;AAExD,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAC3B,2HAA2H,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained 2026 state-income-tax effective-rate table for the
|
|
3
|
+
* `@markcolabs/mcp` paycheck engine (MCP-AUDIT-011 fix, S141 Item #5).
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists
|
|
6
|
+
*
|
|
7
|
+
* v0.2.x of the paycheck engine returned a flat 5% state-tax estimate for
|
|
8
|
+
* every income-tax state. For HCOL states (CA top 13.3%, NY top 10.9%, HI
|
|
9
|
+
* top 11%) this was materially wrong — a $1M earner in CA was under-taxed by
|
|
10
|
+
* ~$85k. Documented as a known limitation but YMYL exposure was significant.
|
|
11
|
+
*
|
|
12
|
+
* v0.3.0 replaces the flat estimate with a state-aware effective-rate lookup
|
|
13
|
+
* using marginal-bracket simplification: for each state we precompute a
|
|
14
|
+
* **top-of-bracket effective rate** for several income tiers and pick the
|
|
15
|
+
* tier that brackets the caller's taxable income. This is not a full per-state
|
|
16
|
+
* bracket simulation (out of scope per kickoff) but materially correct for
|
|
17
|
+
* the common HCOL cases that drove the original finding.
|
|
18
|
+
*
|
|
19
|
+
* The site source for the rate data is `site/src/data/tax-tables/` for the
|
|
20
|
+
* three states the site engine models (CA, NY, TX). For the remaining 38
|
|
21
|
+
* income-tax states this module is the canonical mirror — the data is
|
|
22
|
+
* sourced from the Tax Foundation 2026 State Individual Income Tax Rates
|
|
23
|
+
* report (a citable, annually-updated authority).
|
|
24
|
+
*
|
|
25
|
+
* ## Simplification per kickoff
|
|
26
|
+
*
|
|
27
|
+
* Income tiers used for effective-rate lookup:
|
|
28
|
+
* - tier 1: taxable < $50,000 (most filers)
|
|
29
|
+
* - tier 2: taxable < $100,000 (median-to-upper-middle)
|
|
30
|
+
* - tier 3: taxable < $250,000 (HCOL professionals)
|
|
31
|
+
* - tier 4: taxable < $500,000 (high earners)
|
|
32
|
+
* - tier 5: taxable >= $500,000 (top-bracket)
|
|
33
|
+
*
|
|
34
|
+
* The rate at each tier is the **effective** rate (not the marginal top rate)
|
|
35
|
+
* for a hypothetical filer at the top of that tier, accounting for the
|
|
36
|
+
* weighted average across the state's progressive brackets. Flat-rate states
|
|
37
|
+
* use the same rate at every tier. No-income-tax states are omitted (handled
|
|
38
|
+
* by `NO_TAX_STATES` in `federalTax.ts`).
|
|
39
|
+
*
|
|
40
|
+
* ## Source
|
|
41
|
+
*
|
|
42
|
+
* Tax Foundation 2026 State Individual Income Tax Rates and Brackets,
|
|
43
|
+
* effective Jan 1 2026 (with 2026 inflation adjustments where applicable).
|
|
44
|
+
*
|
|
45
|
+
* Last verified: 2026-05-27 (S141 Item #5).
|
|
46
|
+
*
|
|
47
|
+
* @see MCP-AUDIT-011 — Paycheck flat 5% state-tax estimate
|
|
48
|
+
* @see docs/Claude/Architecture/ADR/ADR-0039 § 5 — engine SemVer policy
|
|
49
|
+
*/
|
|
50
|
+
export interface StateTaxDataMeta {
|
|
51
|
+
/** Citable source for the rate data (annual Tax Foundation report). */
|
|
52
|
+
source: string;
|
|
53
|
+
/** ISO date of last verification against the source. */
|
|
54
|
+
lastVerified: string;
|
|
55
|
+
/** Effective tax year these rates apply to. */
|
|
56
|
+
taxYear: number;
|
|
57
|
+
/** Methodology note for callers. */
|
|
58
|
+
methodology: string;
|
|
59
|
+
}
|
|
60
|
+
export declare const STATE_TAX_2026_META: StateTaxDataMeta;
|
|
61
|
+
/** Income tiers for effective-rate lookup. */
|
|
62
|
+
export type StateTaxIncomeTier = "under50k" | "under100k" | "under250k" | "under500k" | "over500k";
|
|
63
|
+
/** Effective rates by income tier for one state. */
|
|
64
|
+
export interface StateEffectiveRates {
|
|
65
|
+
/** Two-letter state code. */
|
|
66
|
+
stateCode: string;
|
|
67
|
+
/** Full state name (for diagnostics). */
|
|
68
|
+
stateName: string;
|
|
69
|
+
/** Effective rates expressed as decimals (0.093 = 9.3%). */
|
|
70
|
+
rates: Record<StateTaxIncomeTier, number>;
|
|
71
|
+
/**
|
|
72
|
+
* Notes about quirks (local-tax piggybacks excluded, SDI excluded, etc.).
|
|
73
|
+
* Surface in `_meta` if non-empty.
|
|
74
|
+
*/
|
|
75
|
+
notes?: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Pick the income tier appropriate for a given taxable income.
|
|
79
|
+
* Uses left-inclusive boundaries.
|
|
80
|
+
*/
|
|
81
|
+
export declare function pickIncomeTier(taxableIncome: number): StateTaxIncomeTier;
|
|
82
|
+
/**
|
|
83
|
+
* 2026 state effective tax rates (decimals) by income tier.
|
|
84
|
+
*
|
|
85
|
+
* NOT INCLUDED (handled by NO_TAX_STATES in federalTax.ts):
|
|
86
|
+
* AK, FL, NV, NH, SD, TN, TX, WA, WY
|
|
87
|
+
*
|
|
88
|
+
* NH currently taxes only interest/dividends (phased out for wages 2025+),
|
|
89
|
+
* treated as no-tax for wage income.
|
|
90
|
+
*
|
|
91
|
+
* Rates rounded to four decimal places. Local-income-tax piggybacks (NYC,
|
|
92
|
+
* Yonkers, PA municipal EIT) NOT included — surfaced as a `notes` warning
|
|
93
|
+
* for impacted states. State Disability Insurance (CA SDI, NY SDI, NJ SDI)
|
|
94
|
+
* is not income tax and is NOT included.
|
|
95
|
+
*/
|
|
96
|
+
export declare const STATE_EFFECTIVE_RATES_2026: Record<string, StateEffectiveRates>;
|
|
97
|
+
/**
|
|
98
|
+
* Look up the effective state income-tax rate for a given state and taxable income.
|
|
99
|
+
*
|
|
100
|
+
* Returns 0 for no-income-tax states (caller should also check NO_TAX_STATES).
|
|
101
|
+
* Returns 0 for unknown state codes (defensive fallback — caller already validated
|
|
102
|
+
* 2-letter format at the Zod schema layer; this guards against typos that pass
|
|
103
|
+
* Zod but aren't in our table).
|
|
104
|
+
*
|
|
105
|
+
* @param stateCode 2-letter US state code (uppercase)
|
|
106
|
+
* @param taxableIncome Annual taxable income in USD (post-federal-standard-deduction basis)
|
|
107
|
+
* @returns Decimal effective rate (e.g., 0.093 for 9.3%); 0 if state not modeled
|
|
108
|
+
*/
|
|
109
|
+
export declare function getStateEffectiveRate(stateCode: string, taxableIncome: number): number;
|
|
110
|
+
/**
|
|
111
|
+
* Get the full state data entry (for surfacing `notes` in the tool envelope).
|
|
112
|
+
*/
|
|
113
|
+
export declare function getStateEntry(stateCode: string): StateEffectiveRates | undefined;
|
|
114
|
+
//# sourceMappingURL=stateTax2026.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateTax2026.d.ts","sourceRoot":"","sources":["../../../src/engines/data/stateTax2026.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAOjC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,WAAW,GACX,WAAW,GACX,WAAW,GACX,UAAU,CAAC;AAEf,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC1C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAMxE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CA4O1E,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAChB,mBAAmB,GAAG,SAAS,CAEjC"}
|