@markcolabs/mcp 0.3.0 → 0.4.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/dist/index.d.ts +9 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -285
- package/dist/index.js.map +1 -1
- package/package.json +7 -12
- package/LICENSE-API.md +0 -111
- package/dist/disclaimers/ymyl.d.ts +0 -16
- package/dist/disclaimers/ymyl.d.ts.map +0 -1
- package/dist/disclaimers/ymyl.js +0 -20
- package/dist/disclaimers/ymyl.js.map +0 -1
- package/dist/engines/compoundInterest.d.ts +0 -75
- package/dist/engines/compoundInterest.d.ts.map +0 -1
- package/dist/engines/compoundInterest.js +0 -74
- package/dist/engines/compoundInterest.js.map +0 -1
- package/dist/engines/data/federalTax.d.ts +0 -47
- package/dist/engines/data/federalTax.d.ts.map +0 -1
- package/dist/engines/data/federalTax.js +0 -111
- package/dist/engines/data/federalTax.js.map +0 -1
- package/dist/engines/data/irs2026.d.ts +0 -137
- package/dist/engines/data/irs2026.d.ts.map +0 -1
- package/dist/engines/data/irs2026.js +0 -113
- package/dist/engines/data/irs2026.js.map +0 -1
- package/dist/engines/data/rmd2026.d.ts +0 -59
- package/dist/engines/data/rmd2026.d.ts.map +0 -1
- package/dist/engines/data/rmd2026.js +0 -75
- package/dist/engines/data/rmd2026.js.map +0 -1
- package/dist/engines/data/ssa.d.ts +0 -39
- package/dist/engines/data/ssa.d.ts.map +0 -1
- package/dist/engines/data/ssa.js +0 -55
- package/dist/engines/data/ssa.js.map +0 -1
- package/dist/engines/data/stateTax2026.d.ts +0 -114
- package/dist/engines/data/stateTax2026.d.ts.map +0 -1
- package/dist/engines/data/stateTax2026.js +0 -348
- package/dist/engines/data/stateTax2026.js.map +0 -1
- package/dist/engines/hsa.d.ts +0 -110
- package/dist/engines/hsa.d.ts.map +0 -1
- package/dist/engines/hsa.js +0 -83
- package/dist/engines/hsa.js.map +0 -1
- package/dist/engines/ira.d.ts +0 -115
- package/dist/engines/ira.d.ts.map +0 -1
- package/dist/engines/ira.js +0 -127
- package/dist/engines/ira.js.map +0 -1
- package/dist/engines/mortgage.d.ts +0 -70
- package/dist/engines/mortgage.d.ts.map +0 -1
- package/dist/engines/mortgage.js +0 -60
- package/dist/engines/mortgage.js.map +0 -1
- package/dist/engines/paycheck.d.ts +0 -128
- package/dist/engines/paycheck.d.ts.map +0 -1
- package/dist/engines/paycheck.js +0 -142
- package/dist/engines/paycheck.js.map +0 -1
- package/dist/engines/retirement401k.d.ts +0 -109
- package/dist/engines/retirement401k.d.ts.map +0 -1
- package/dist/engines/retirement401k.js +0 -130
- package/dist/engines/retirement401k.js.map +0 -1
- package/dist/engines/rmd.d.ts +0 -107
- package/dist/engines/rmd.d.ts.map +0 -1
- package/dist/engines/rmd.js +0 -109
- package/dist/engines/rmd.js.map +0 -1
- package/dist/engines/rothConversion.d.ts +0 -124
- package/dist/engines/rothConversion.d.ts.map +0 -1
- package/dist/engines/rothConversion.js +0 -145
- package/dist/engines/rothConversion.js.map +0 -1
- package/dist/engines/socialSecurity.d.ts +0 -63
- package/dist/engines/socialSecurity.d.ts.map +0 -1
- package/dist/engines/socialSecurity.js +0 -139
- package/dist/engines/socialSecurity.js.map +0 -1
- package/dist/envelope.d.ts +0 -76
- package/dist/envelope.d.ts.map +0 -1
- package/dist/envelope.js +0 -34
- package/dist/envelope.js.map +0 -1
- package/dist/shared/bounds.d.ts +0 -133
- package/dist/shared/bounds.d.ts.map +0 -1
- package/dist/shared/bounds.js +0 -206
- package/dist/shared/bounds.js.map +0 -1
- package/dist/tools/compoundInterest.d.ts +0 -48
- package/dist/tools/compoundInterest.d.ts.map +0 -1
- package/dist/tools/compoundInterest.js +0 -107
- package/dist/tools/compoundInterest.js.map +0 -1
- package/dist/tools/hsa.d.ts +0 -58
- package/dist/tools/hsa.d.ts.map +0 -1
- package/dist/tools/hsa.js +0 -129
- package/dist/tools/hsa.js.map +0 -1
- package/dist/tools/ira.d.ts +0 -55
- package/dist/tools/ira.d.ts.map +0 -1
- package/dist/tools/ira.js +0 -117
- package/dist/tools/ira.js.map +0 -1
- package/dist/tools/mortgage.d.ts +0 -51
- package/dist/tools/mortgage.d.ts.map +0 -1
- package/dist/tools/mortgage.js +0 -112
- package/dist/tools/mortgage.js.map +0 -1
- package/dist/tools/paycheck.d.ts +0 -61
- package/dist/tools/paycheck.d.ts.map +0 -1
- package/dist/tools/paycheck.js +0 -135
- package/dist/tools/paycheck.js.map +0 -1
- package/dist/tools/retirement401k.d.ts +0 -85
- package/dist/tools/retirement401k.d.ts.map +0 -1
- package/dist/tools/retirement401k.js +0 -141
- package/dist/tools/retirement401k.js.map +0 -1
- package/dist/tools/rmd.d.ts +0 -60
- package/dist/tools/rmd.d.ts.map +0 -1
- package/dist/tools/rmd.js +0 -130
- package/dist/tools/rmd.js.map +0 -1
- package/dist/tools/rothConversion.d.ts +0 -66
- package/dist/tools/rothConversion.d.ts.map +0 -1
- package/dist/tools/rothConversion.js +0 -141
- package/dist/tools/rothConversion.js.map +0 -1
- package/dist/tools/socialSecurity.d.ts +0 -51
- package/dist/tools/socialSecurity.d.ts.map +0 -1
- package/dist/tools/socialSecurity.js +0 -117
- package/dist/tools/socialSecurity.js.map +0 -1
- package/dist/util/zod-to-json-schema.d.ts +0 -28
- package/dist/util/zod-to-json-schema.d.ts.map +0 -1
- package/dist/util/zod-to-json-schema.js +0 -98
- package/dist/util/zod-to-json-schema.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stateTax2026.js","sourceRoot":"","sources":["../../../src/engines/data/stateTax2026.ts"],"names":[],"mappings":"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"}
|
package/dist/engines/hsa.d.ts
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HSA (Health Savings Account) contribution-limit engine — lifted from
|
|
3
|
-
* site/src/utils/hsa-limits.js (functions `getMaxContribution`,
|
|
4
|
-
* `isCatchUpEligible`).
|
|
5
|
-
*
|
|
6
|
-
* Per ADR-0039 § 5: pure synchronous function, ENGINE_VERSION constant,
|
|
7
|
-
* parity test against the site source as the gate.
|
|
8
|
-
*
|
|
9
|
-
* Scope (S141 Wave 1B Item #3): contribution-LIMIT and employer-reduction
|
|
10
|
-
* math. Does NOT compute long-term HSA growth projection (the site calc's
|
|
11
|
-
* `generateGrowthProjection`) or split federal/state/FICA tax-savings
|
|
12
|
-
* breakdown (the site calc's `calculateTotalTaxSavings` returns a 3-component
|
|
13
|
-
* breakdown). For v1 this tool exposes a single `payrollDeductionTaxSavings`
|
|
14
|
-
* convenience field — combined federal+state+FICA at the caller-provided
|
|
15
|
-
* marginal rate — as the simplest useful tax-impact answer. Detailed
|
|
16
|
-
* breakdowns are a future tool: `dc.calculator.hsa.taxSavingsBreakdown`.
|
|
17
|
-
*
|
|
18
|
-
* Math reference (per IRC §223 + IRS Rev. Proc. 2025-19):
|
|
19
|
-
* baseLimit = coverageTier === "family" ? family : selfOnly
|
|
20
|
-
* catchUpAmount = age ≥ 55 ? 1000 : 0
|
|
21
|
-
* totalContributionLimit = baseLimit + catchUpAmount
|
|
22
|
-
* employeeMaxRemaining = max(0, totalContributionLimit − employerContribution)
|
|
23
|
-
* payrollDeductionTaxSavings = marginalRate provided
|
|
24
|
-
* ? employeeMaxRemaining × (marginalRate / 100)
|
|
25
|
-
* : 0
|
|
26
|
-
*
|
|
27
|
-
* Why employer contributions reduce employee max dollar-for-dollar: the IRS
|
|
28
|
-
* §223(b) limit is a TOTAL annual limit across all funding sources, not a
|
|
29
|
-
* per-source limit. An employer that contributes $2,000 to a family-tier HSA
|
|
30
|
-
* leaves $6,750 of room for employee payroll deductions ($8,750 − $2,000).
|
|
31
|
-
*
|
|
32
|
-
* Source: IRS Rev. Proc. 2025-19 (2026 HSA inflation adjustments) +
|
|
33
|
-
* IRC §223(b)(3)(B) (statutory $1,000 catch-up, NOT inflation-indexed).
|
|
34
|
-
* Last verified: 2026-05-27.
|
|
35
|
-
*/
|
|
36
|
-
/**
|
|
37
|
-
* SemVer of the HSA engine. Per ADR-0039 § 5 (reaffirmed in ADR-0041
|
|
38
|
-
* Position #4a): major bump = math change; minor = additive output; patch =
|
|
39
|
-
* numerical correction. NOT bumped for cosmetic refactors.
|
|
40
|
-
* - 1.0.0: initial v1 lift from hsa-limits.js (S141 Wave 1B).
|
|
41
|
-
*/
|
|
42
|
-
export declare const ENGINE_VERSION = "1.0.0";
|
|
43
|
-
/**
|
|
44
|
-
* HDHP coverage tier. IRS canonical names per Rev. Proc. 2025-19:
|
|
45
|
-
* - `"self-only"` (≈ site's `"individual"` spelling)
|
|
46
|
-
* - `"family"` (matches site)
|
|
47
|
-
*/
|
|
48
|
-
export type HsaCoverageTier = "self-only" | "family";
|
|
49
|
-
/** Inputs to the HSA contribution-limit engine. */
|
|
50
|
-
export interface HsaContributionLimitInput {
|
|
51
|
-
/** Current age (drives age-55+ catch-up eligibility). */
|
|
52
|
-
age: number;
|
|
53
|
-
/** HDHP coverage tier. */
|
|
54
|
-
coverageTier: HsaCoverageTier;
|
|
55
|
-
/**
|
|
56
|
-
* Annual employer HSA contribution, USD. Reduces the employee's eligible
|
|
57
|
-
* payroll-deduction room dollar-for-dollar. Defaults to 0.
|
|
58
|
-
*/
|
|
59
|
-
employerContribution?: number;
|
|
60
|
-
/**
|
|
61
|
-
* Estimated marginal federal tax rate, whole-number percent (e.g., 22 for
|
|
62
|
-
* 22%). Optional — when omitted, `payrollDeductionTaxSavings` returns 0.
|
|
63
|
-
* Combined federal+state+FICA is a future tool; for v1 this is treated as
|
|
64
|
-
* the user's effective marginal rate against the remaining employee
|
|
65
|
-
* contribution.
|
|
66
|
-
*/
|
|
67
|
-
estimatedMarginalRatePercent?: number;
|
|
68
|
-
}
|
|
69
|
-
/** Result payload returned by the engine. */
|
|
70
|
-
export interface HsaContributionLimitResult {
|
|
71
|
-
/** Base IRS limit for the selected coverage tier (without catch-up), USD. */
|
|
72
|
-
contributionLimit: number;
|
|
73
|
-
/** Whether the user qualifies for the age 55+ catch-up. */
|
|
74
|
-
catchUpEligible: boolean;
|
|
75
|
-
/** Catch-up amount applied ($1,000 if eligible, else 0), USD. */
|
|
76
|
-
catchUpAmount: number;
|
|
77
|
-
/** Total annual limit (contributionLimit + catchUpAmount), USD. */
|
|
78
|
-
totalContributionLimit: number;
|
|
79
|
-
/** Echoes the input employer contribution, USD. */
|
|
80
|
-
employerContribution: number;
|
|
81
|
-
/**
|
|
82
|
-
* Remaining room the EMPLOYEE can contribute via payroll after subtracting
|
|
83
|
-
* the employer contribution. Clamped at 0 (an over-the-cap employer
|
|
84
|
-
* contribution does not produce negative employee room). USD.
|
|
85
|
-
*/
|
|
86
|
-
employeeMaxRemaining: number;
|
|
87
|
-
/**
|
|
88
|
-
* Estimated tax savings if the employee contributes employeeMaxRemaining
|
|
89
|
-
* via payroll, at the provided marginal rate. 0 when marginal rate is not
|
|
90
|
-
* provided. USD.
|
|
91
|
-
*/
|
|
92
|
-
payrollDeductionTaxSavings: number;
|
|
93
|
-
/** Provenance metadata. */
|
|
94
|
-
meta: {
|
|
95
|
-
/** IRS tax year these limits apply to. */
|
|
96
|
-
tableYear: number;
|
|
97
|
-
/** Source authority (IRS revenue procedure / IRC citation). */
|
|
98
|
-
source: string;
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Compute the HSA contribution limit + employer-reduction + payroll-deduction
|
|
103
|
-
* tax savings for the given inputs.
|
|
104
|
-
*
|
|
105
|
-
* 1-to-1 logic port of site/src/utils/hsa-limits.js `getMaxContribution` +
|
|
106
|
-
* `isCatchUpEligible`, extended with the explicit employer-reduction math
|
|
107
|
-
* and an optional payroll-deduction tax-savings convenience field.
|
|
108
|
-
*/
|
|
109
|
-
export declare function contributionLimit(input: HsaContributionLimitInput): HsaContributionLimitResult;
|
|
110
|
-
//# sourceMappingURL=hsa.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hsa.d.ts","sourceRoot":"","sources":["../../src/engines/hsa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErD,mDAAmD;AACnD,MAAM,WAAW,yBAAyB;IACxC,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,YAAY,EAAE,eAAe,CAAC;IAC9B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,6CAA6C;AAC7C,MAAM,WAAW,0BAA0B;IACzC,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,eAAe,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mDAAmD;IACnD,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC,2BAA2B;IAC3B,IAAI,EAAE;QACJ,0CAA0C;QAC1C,SAAS,EAAE,MAAM,CAAC;QAClB,+DAA+D;QAC/D,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,yBAAyB,GAC/B,0BAA0B,CAiD5B"}
|
package/dist/engines/hsa.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HSA (Health Savings Account) contribution-limit engine — lifted from
|
|
3
|
-
* site/src/utils/hsa-limits.js (functions `getMaxContribution`,
|
|
4
|
-
* `isCatchUpEligible`).
|
|
5
|
-
*
|
|
6
|
-
* Per ADR-0039 § 5: pure synchronous function, ENGINE_VERSION constant,
|
|
7
|
-
* parity test against the site source as the gate.
|
|
8
|
-
*
|
|
9
|
-
* Scope (S141 Wave 1B Item #3): contribution-LIMIT and employer-reduction
|
|
10
|
-
* math. Does NOT compute long-term HSA growth projection (the site calc's
|
|
11
|
-
* `generateGrowthProjection`) or split federal/state/FICA tax-savings
|
|
12
|
-
* breakdown (the site calc's `calculateTotalTaxSavings` returns a 3-component
|
|
13
|
-
* breakdown). For v1 this tool exposes a single `payrollDeductionTaxSavings`
|
|
14
|
-
* convenience field — combined federal+state+FICA at the caller-provided
|
|
15
|
-
* marginal rate — as the simplest useful tax-impact answer. Detailed
|
|
16
|
-
* breakdowns are a future tool: `dc.calculator.hsa.taxSavingsBreakdown`.
|
|
17
|
-
*
|
|
18
|
-
* Math reference (per IRC §223 + IRS Rev. Proc. 2025-19):
|
|
19
|
-
* baseLimit = coverageTier === "family" ? family : selfOnly
|
|
20
|
-
* catchUpAmount = age ≥ 55 ? 1000 : 0
|
|
21
|
-
* totalContributionLimit = baseLimit + catchUpAmount
|
|
22
|
-
* employeeMaxRemaining = max(0, totalContributionLimit − employerContribution)
|
|
23
|
-
* payrollDeductionTaxSavings = marginalRate provided
|
|
24
|
-
* ? employeeMaxRemaining × (marginalRate / 100)
|
|
25
|
-
* : 0
|
|
26
|
-
*
|
|
27
|
-
* Why employer contributions reduce employee max dollar-for-dollar: the IRS
|
|
28
|
-
* §223(b) limit is a TOTAL annual limit across all funding sources, not a
|
|
29
|
-
* per-source limit. An employer that contributes $2,000 to a family-tier HSA
|
|
30
|
-
* leaves $6,750 of room for employee payroll deductions ($8,750 − $2,000).
|
|
31
|
-
*
|
|
32
|
-
* Source: IRS Rev. Proc. 2025-19 (2026 HSA inflation adjustments) +
|
|
33
|
-
* IRC §223(b)(3)(B) (statutory $1,000 catch-up, NOT inflation-indexed).
|
|
34
|
-
* Last verified: 2026-05-27.
|
|
35
|
-
*/
|
|
36
|
-
import { LIMITS_HSA_2026 } from "./data/irs2026.js";
|
|
37
|
-
/**
|
|
38
|
-
* SemVer of the HSA engine. Per ADR-0039 § 5 (reaffirmed in ADR-0041
|
|
39
|
-
* Position #4a): major bump = math change; minor = additive output; patch =
|
|
40
|
-
* numerical correction. NOT bumped for cosmetic refactors.
|
|
41
|
-
* - 1.0.0: initial v1 lift from hsa-limits.js (S141 Wave 1B).
|
|
42
|
-
*/
|
|
43
|
-
export const ENGINE_VERSION = "1.0.0";
|
|
44
|
-
/**
|
|
45
|
-
* Compute the HSA contribution limit + employer-reduction + payroll-deduction
|
|
46
|
-
* tax savings for the given inputs.
|
|
47
|
-
*
|
|
48
|
-
* 1-to-1 logic port of site/src/utils/hsa-limits.js `getMaxContribution` +
|
|
49
|
-
* `isCatchUpEligible`, extended with the explicit employer-reduction math
|
|
50
|
-
* and an optional payroll-deduction tax-savings convenience field.
|
|
51
|
-
*/
|
|
52
|
-
export function contributionLimit(input) {
|
|
53
|
-
const { age, coverageTier, employerContribution = 0, estimatedMarginalRatePercent, } = input;
|
|
54
|
-
// Base contribution limit per coverage tier (IRS Rev. Proc. 2025-19).
|
|
55
|
-
const baseLimit = coverageTier === "family"
|
|
56
|
-
? LIMITS_HSA_2026.family
|
|
57
|
-
: LIMITS_HSA_2026.selfOnly;
|
|
58
|
-
// Catch-up: $1,000 if age ≥ 55 (statutory, IRC §223(b)(3)(B)).
|
|
59
|
-
const catchUpEligible = age >= LIMITS_HSA_2026.catchUpAge;
|
|
60
|
-
const catchUpAmount = catchUpEligible ? LIMITS_HSA_2026.catchUp : 0;
|
|
61
|
-
const totalContributionLimit = baseLimit + catchUpAmount;
|
|
62
|
-
// Employer contribution reduces employee max dollar-for-dollar; clamp at 0.
|
|
63
|
-
const employeeMaxRemaining = Math.max(0, totalContributionLimit - employerContribution);
|
|
64
|
-
// Payroll-deduction tax savings (combined federal + state + FICA proxy).
|
|
65
|
-
// Pre-tax payroll deduction reduces taxable income → marginal-rate savings.
|
|
66
|
-
const payrollDeductionTaxSavings = typeof estimatedMarginalRatePercent === "number"
|
|
67
|
-
? Math.round(employeeMaxRemaining * (estimatedMarginalRatePercent / 100) * 100) / 100
|
|
68
|
-
: 0;
|
|
69
|
-
return {
|
|
70
|
-
contributionLimit: baseLimit,
|
|
71
|
-
catchUpEligible,
|
|
72
|
-
catchUpAmount,
|
|
73
|
-
totalContributionLimit,
|
|
74
|
-
employerContribution,
|
|
75
|
-
employeeMaxRemaining,
|
|
76
|
-
payrollDeductionTaxSavings,
|
|
77
|
-
meta: {
|
|
78
|
-
tableYear: 2026,
|
|
79
|
-
source: "IRS Rev. Proc. 2025-19; IRC §223(b)(3)(B) (statutory $1,000 catch-up)",
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=hsa.js.map
|
package/dist/engines/hsa.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hsa.js","sourceRoot":"","sources":["../../src/engines/hsa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AA+DtC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAgC;IAEhC,MAAM,EACJ,GAAG,EACH,YAAY,EACZ,oBAAoB,GAAG,CAAC,EACxB,4BAA4B,GAC7B,GAAG,KAAK,CAAC;IAEV,sEAAsE;IACtE,MAAM,SAAS,GACb,YAAY,KAAK,QAAQ;QACvB,CAAC,CAAC,eAAe,CAAC,MAAM;QACxB,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC;IAE/B,+DAA+D;IAC/D,MAAM,eAAe,GAAG,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC;IAC1D,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,sBAAsB,GAAG,SAAS,GAAG,aAAa,CAAC;IAEzD,4EAA4E;IAC5E,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CACnC,CAAC,EACD,sBAAsB,GAAG,oBAAoB,CAC9C,CAAC;IAEF,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,0BAA0B,GAC9B,OAAO,4BAA4B,KAAK,QAAQ;QAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,oBAAoB,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC,GAAG,GAAG,CAClE,GAAG,GAAG;QACT,CAAC,CAAC,CAAC,CAAC;IAER,OAAO;QACL,iBAAiB,EAAE,SAAS;QAC5B,eAAe;QACf,aAAa;QACb,sBAAsB;QACtB,oBAAoB;QACpB,oBAAoB;QACpB,0BAA0B;QAC1B,IAAI,EAAE;YACJ,SAAS,EAAE,IAAI;YACf,MAAM,EACJ,uEAAuE;SAC1E;KACF,CAAC;AACJ,CAAC"}
|
package/dist/engines/ira.d.ts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IRA contribution-limit engine — lifted from
|
|
3
|
-
* site/src/utils/ira-limits.js (functions `getContributionLimit`,
|
|
4
|
-
* `isCatchUpEligible`, `getRothContributionLimit`).
|
|
5
|
-
*
|
|
6
|
-
* Per ADR-0039 § 5: pure synchronous function, ENGINE_VERSION constant,
|
|
7
|
-
* parity test against the site source as the gate.
|
|
8
|
-
*
|
|
9
|
-
* Scope (S141 Wave 1A Item #2): MAGI + age + filing status → eligible Roth /
|
|
10
|
-
* Traditional contribution + phase-out reduction. Catch-up eligibility for
|
|
11
|
-
* age ≥ 50. Does NOT compute future-value projection or tax-deduction
|
|
12
|
-
* reinvestment side-account math — those stay in the calculator UI / a future
|
|
13
|
-
* tool. This is a contribution-LIMIT tool, not a projection tool.
|
|
14
|
-
*
|
|
15
|
-
* Math reference (Roth, per IRC §408A(c)(3)):
|
|
16
|
-
* baseCap = age ≥ 50 ? standard + catchUp : standard
|
|
17
|
-
* if MAGI ≤ phaseOut.start → eligible = baseCap
|
|
18
|
-
* if MAGI ≥ phaseOut.end → eligible = 0
|
|
19
|
-
* else:
|
|
20
|
-
* reductionRatio = (MAGI − phaseOut.start) / (phaseOut.end − phaseOut.start)
|
|
21
|
-
* reduced = baseCap × (1 − reductionRatio)
|
|
22
|
-
* eligible = max(round_to_$10(reduced), reduced > 0 ? $200 : 0)
|
|
23
|
-
*
|
|
24
|
-
* Math reference (Traditional, per IRC §219(b) + §219(g)):
|
|
25
|
-
* eligible = baseCap (Traditional CONTRIBUTION is not MAGI-limited;
|
|
26
|
-
* only the DEDUCTION is, via §219(g) phase-out.
|
|
27
|
-
* The contributionLimit tool reports the
|
|
28
|
-
* contribution; the deduction phase-out is
|
|
29
|
-
* surfaced as a separate field for clients that
|
|
30
|
-
* need it.)
|
|
31
|
-
*
|
|
32
|
-
* Source: IRS Notice 2025-67 (2026 retirement plan limits) +
|
|
33
|
-
* SECURE 2.0 Act §107 (catch-up indexing).
|
|
34
|
-
*/
|
|
35
|
-
/**
|
|
36
|
-
* SemVer of the IRA engine. Per ADR-0039 § 5 (reaffirmed in ADR-0041 Position #4a):
|
|
37
|
-
* major bump = math change; minor = additive output; patch = numerical correction.
|
|
38
|
-
* NOT bumped for cosmetic refactors.
|
|
39
|
-
* - 1.0.0: initial v1 lift from ira-limits.js (S141 Wave 1A).
|
|
40
|
-
*/
|
|
41
|
-
export declare const ENGINE_VERSION = "1.0.0";
|
|
42
|
-
/** Filing status (camelCase, matches the MCP package's federalTax convention). */
|
|
43
|
-
export type IraFilingStatus = "single" | "marriedFilingJointly" | "marriedFilingSeparately" | "headOfHousehold";
|
|
44
|
-
/** IRA type — drives Roth vs Traditional phase-out semantics. */
|
|
45
|
-
export type IraType = "traditional" | "roth";
|
|
46
|
-
/** Inputs to the IRA contribution-limit engine. */
|
|
47
|
-
export interface IraContributionLimitInput {
|
|
48
|
-
/** Current age (used for catch-up eligibility). */
|
|
49
|
-
age: number;
|
|
50
|
-
/** Federal filing status. */
|
|
51
|
-
filingStatus: IraFilingStatus;
|
|
52
|
-
/**
|
|
53
|
-
* Modified Adjusted Gross Income (MAGI), USD. Drives Roth phase-out and
|
|
54
|
-
* is reported alongside the Traditional deduction-phase-out signal.
|
|
55
|
-
*/
|
|
56
|
-
magi: number;
|
|
57
|
-
/** Whether to compute the limit for Traditional or Roth. */
|
|
58
|
-
type: IraType;
|
|
59
|
-
}
|
|
60
|
-
/** Result payload returned by the engine. */
|
|
61
|
-
export interface IraContributionLimitResult {
|
|
62
|
-
/** User's max eligible contribution after phase-out, USD. */
|
|
63
|
-
eligibleContribution: number;
|
|
64
|
-
/** Base IRA limit (before catch-up), USD. Same for Traditional and Roth. */
|
|
65
|
-
traditionalCap: number;
|
|
66
|
-
/** Base Roth IRA limit (before catch-up), USD. Same number as traditionalCap. */
|
|
67
|
-
rothCap: number;
|
|
68
|
-
/** Catch-up contribution if age ≥ 50, else 0, USD. */
|
|
69
|
-
catchUp: number;
|
|
70
|
-
/**
|
|
71
|
-
* Reduction applied due to MAGI phase-out (Roth only, USD).
|
|
72
|
-
* For Traditional this is always 0 because contributionLimit is not
|
|
73
|
-
* MAGI-gated (the DEDUCTION is, surfaced separately).
|
|
74
|
-
*/
|
|
75
|
-
phaseOutReduction: number;
|
|
76
|
-
/**
|
|
77
|
-
* Whether the user is in the catch-up window (age ≥ catchUpAge).
|
|
78
|
-
* Set independent of `type` so clients can advertise the catch-up regardless
|
|
79
|
-
* of which IRA type they're querying.
|
|
80
|
-
*/
|
|
81
|
-
catchUpEligible: boolean;
|
|
82
|
-
/**
|
|
83
|
-
* Traditional IRA deduction phase-out signal (informational; does not
|
|
84
|
-
* affect `eligibleContribution`). Useful for clients that want to advise
|
|
85
|
-
* users their Traditional contribution may be non-deductible at high MAGI.
|
|
86
|
-
* - "fullyDeductible" — MAGI ≤ traditionalPhaseOut.start
|
|
87
|
-
* - "partiallyDeductible" — MAGI within phase-out range
|
|
88
|
-
* - "notDeductible" — MAGI ≥ traditionalPhaseOut.end
|
|
89
|
-
*
|
|
90
|
-
* Assumes the contributor (or spouse) IS covered by a workplace plan; if
|
|
91
|
-
* neither is covered, full deduction applies regardless of MAGI.
|
|
92
|
-
*/
|
|
93
|
-
traditionalDeductionStatus: "fullyDeductible" | "partiallyDeductible" | "notDeductible";
|
|
94
|
-
/** Provenance metadata. */
|
|
95
|
-
meta: {
|
|
96
|
-
/** IRS tax year these limits apply to. */
|
|
97
|
-
tableYear: number;
|
|
98
|
-
/** Source authority (IRS notice / IRC citation). */
|
|
99
|
-
source: string;
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Compute IRA contribution limit + phase-out reduction for the given inputs.
|
|
104
|
-
*
|
|
105
|
-
* 1-to-1 logic port of site/src/utils/ira-limits.js `getContributionLimit` +
|
|
106
|
-
* `isCatchUpEligible` + `getRothContributionLimit` (the contribution-limit
|
|
107
|
-
* portion; future-value projection is out of scope per S141 Wave 1A).
|
|
108
|
-
*
|
|
109
|
-
* Filing-status key mapping vs. site (which uses 'single' / 'mfj' / 'mfs'):
|
|
110
|
-
* the MCP camelCase keys ('single' / 'marriedFilingJointly' /
|
|
111
|
-
* 'marriedFilingSeparately' / 'headOfHousehold') resolve to the same numeric
|
|
112
|
-
* phase-out thresholds — see ROTH_PHASE_OUT_2026 in data/irs2026.ts.
|
|
113
|
-
*/
|
|
114
|
-
export declare function contributionLimit(input: IraContributionLimitInput): IraContributionLimitResult;
|
|
115
|
-
//# sourceMappingURL=ira.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ira.d.ts","sourceRoot":"","sources":["../../src/engines/ira.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAQH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,kFAAkF;AAClF,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,sBAAsB,GACtB,yBAAyB,GACzB,iBAAiB,CAAC;AAEtB,iEAAiE;AACjE,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC;AAE7C,mDAAmD;AACnD,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,YAAY,EAAE,eAAe,CAAC;IAC9B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,IAAI,EAAE,OAAO,CAAC;CACf;AAED,6CAA6C;AAC7C,MAAM,WAAW,0BAA0B;IACzC,6DAA6D;IAC7D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;;;;OAUG;IACH,0BAA0B,EACtB,iBAAiB,GACjB,qBAAqB,GACrB,eAAe,CAAC;IACpB,2BAA2B;IAC3B,IAAI,EAAE;QACJ,0CAA0C;QAC1C,SAAS,EAAE,MAAM,CAAC;QAClB,oDAAoD;QACpD,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAYD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,yBAAyB,GAC/B,0BAA0B,CAgE5B"}
|
package/dist/engines/ira.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IRA contribution-limit engine — lifted from
|
|
3
|
-
* site/src/utils/ira-limits.js (functions `getContributionLimit`,
|
|
4
|
-
* `isCatchUpEligible`, `getRothContributionLimit`).
|
|
5
|
-
*
|
|
6
|
-
* Per ADR-0039 § 5: pure synchronous function, ENGINE_VERSION constant,
|
|
7
|
-
* parity test against the site source as the gate.
|
|
8
|
-
*
|
|
9
|
-
* Scope (S141 Wave 1A Item #2): MAGI + age + filing status → eligible Roth /
|
|
10
|
-
* Traditional contribution + phase-out reduction. Catch-up eligibility for
|
|
11
|
-
* age ≥ 50. Does NOT compute future-value projection or tax-deduction
|
|
12
|
-
* reinvestment side-account math — those stay in the calculator UI / a future
|
|
13
|
-
* tool. This is a contribution-LIMIT tool, not a projection tool.
|
|
14
|
-
*
|
|
15
|
-
* Math reference (Roth, per IRC §408A(c)(3)):
|
|
16
|
-
* baseCap = age ≥ 50 ? standard + catchUp : standard
|
|
17
|
-
* if MAGI ≤ phaseOut.start → eligible = baseCap
|
|
18
|
-
* if MAGI ≥ phaseOut.end → eligible = 0
|
|
19
|
-
* else:
|
|
20
|
-
* reductionRatio = (MAGI − phaseOut.start) / (phaseOut.end − phaseOut.start)
|
|
21
|
-
* reduced = baseCap × (1 − reductionRatio)
|
|
22
|
-
* eligible = max(round_to_$10(reduced), reduced > 0 ? $200 : 0)
|
|
23
|
-
*
|
|
24
|
-
* Math reference (Traditional, per IRC §219(b) + §219(g)):
|
|
25
|
-
* eligible = baseCap (Traditional CONTRIBUTION is not MAGI-limited;
|
|
26
|
-
* only the DEDUCTION is, via §219(g) phase-out.
|
|
27
|
-
* The contributionLimit tool reports the
|
|
28
|
-
* contribution; the deduction phase-out is
|
|
29
|
-
* surfaced as a separate field for clients that
|
|
30
|
-
* need it.)
|
|
31
|
-
*
|
|
32
|
-
* Source: IRS Notice 2025-67 (2026 retirement plan limits) +
|
|
33
|
-
* SECURE 2.0 Act §107 (catch-up indexing).
|
|
34
|
-
*/
|
|
35
|
-
import { LIMITS_IRA_2026, ROTH_PHASE_OUT_2026, TRADITIONAL_PHASE_OUT_2026, } from "./data/irs2026.js";
|
|
36
|
-
/**
|
|
37
|
-
* SemVer of the IRA engine. Per ADR-0039 § 5 (reaffirmed in ADR-0041 Position #4a):
|
|
38
|
-
* major bump = math change; minor = additive output; patch = numerical correction.
|
|
39
|
-
* NOT bumped for cosmetic refactors.
|
|
40
|
-
* - 1.0.0: initial v1 lift from ira-limits.js (S141 Wave 1A).
|
|
41
|
-
*/
|
|
42
|
-
export const ENGINE_VERSION = "1.0.0";
|
|
43
|
-
/**
|
|
44
|
-
* IRS rounding rule for phase-out reductions: round to nearest $10, minimum
|
|
45
|
-
* $200 if any contribution is allowed. Per IRC §408A(c)(3)(B)(ii).
|
|
46
|
-
*/
|
|
47
|
-
function roundPhaseOutReduction(reduced) {
|
|
48
|
-
if (reduced <= 0)
|
|
49
|
-
return 0;
|
|
50
|
-
const rounded = Math.round(reduced / 10) * 10;
|
|
51
|
-
return Math.max(rounded, 200);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Compute IRA contribution limit + phase-out reduction for the given inputs.
|
|
55
|
-
*
|
|
56
|
-
* 1-to-1 logic port of site/src/utils/ira-limits.js `getContributionLimit` +
|
|
57
|
-
* `isCatchUpEligible` + `getRothContributionLimit` (the contribution-limit
|
|
58
|
-
* portion; future-value projection is out of scope per S141 Wave 1A).
|
|
59
|
-
*
|
|
60
|
-
* Filing-status key mapping vs. site (which uses 'single' / 'mfj' / 'mfs'):
|
|
61
|
-
* the MCP camelCase keys ('single' / 'marriedFilingJointly' /
|
|
62
|
-
* 'marriedFilingSeparately' / 'headOfHousehold') resolve to the same numeric
|
|
63
|
-
* phase-out thresholds — see ROTH_PHASE_OUT_2026 in data/irs2026.ts.
|
|
64
|
-
*/
|
|
65
|
-
export function contributionLimit(input) {
|
|
66
|
-
const { age, filingStatus, magi, type } = input;
|
|
67
|
-
// Base cap (Traditional and Roth share the same base contribution limit).
|
|
68
|
-
const baseCap = LIMITS_IRA_2026.standard;
|
|
69
|
-
const catchUpEligible = age >= LIMITS_IRA_2026.catchUpAge;
|
|
70
|
-
const catchUp = catchUpEligible ? LIMITS_IRA_2026.catchUp : 0;
|
|
71
|
-
const fullCap = baseCap + catchUp;
|
|
72
|
-
// --- Roth phase-out (eligibility-gated) ---
|
|
73
|
-
// The Roth contribution itself is phased out at high MAGI. Traditional
|
|
74
|
-
// contribution is NOT (only its deductibility is — surfaced separately).
|
|
75
|
-
let eligibleContribution;
|
|
76
|
-
let phaseOutReduction;
|
|
77
|
-
if (type === "roth") {
|
|
78
|
-
const phaseOut = ROTH_PHASE_OUT_2026[filingStatus];
|
|
79
|
-
if (magi <= phaseOut.start) {
|
|
80
|
-
eligibleContribution = fullCap;
|
|
81
|
-
phaseOutReduction = 0;
|
|
82
|
-
}
|
|
83
|
-
else if (magi >= phaseOut.end) {
|
|
84
|
-
eligibleContribution = 0;
|
|
85
|
-
phaseOutReduction = fullCap;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
const range = phaseOut.end - phaseOut.start;
|
|
89
|
-
const overStart = magi - phaseOut.start;
|
|
90
|
-
const reductionRatio = overStart / range;
|
|
91
|
-
const reducedRaw = fullCap * (1 - reductionRatio);
|
|
92
|
-
eligibleContribution = roundPhaseOutReduction(reducedRaw);
|
|
93
|
-
phaseOutReduction = fullCap - eligibleContribution;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
// Traditional: contribution is never MAGI-phased-out, only deduction is.
|
|
98
|
-
eligibleContribution = fullCap;
|
|
99
|
-
phaseOutReduction = 0;
|
|
100
|
-
}
|
|
101
|
-
// --- Traditional deduction-phase-out signal (informational, always reported) ---
|
|
102
|
-
const tradPhaseOut = TRADITIONAL_PHASE_OUT_2026[filingStatus];
|
|
103
|
-
let traditionalDeductionStatus;
|
|
104
|
-
if (magi <= tradPhaseOut.start) {
|
|
105
|
-
traditionalDeductionStatus = "fullyDeductible";
|
|
106
|
-
}
|
|
107
|
-
else if (magi >= tradPhaseOut.end) {
|
|
108
|
-
traditionalDeductionStatus = "notDeductible";
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
traditionalDeductionStatus = "partiallyDeductible";
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
eligibleContribution,
|
|
115
|
-
traditionalCap: baseCap,
|
|
116
|
-
rothCap: baseCap,
|
|
117
|
-
catchUp,
|
|
118
|
-
phaseOutReduction,
|
|
119
|
-
catchUpEligible,
|
|
120
|
-
traditionalDeductionStatus,
|
|
121
|
-
meta: {
|
|
122
|
-
tableYear: 2026,
|
|
123
|
-
source: "IRS Notice 2025-67",
|
|
124
|
-
},
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
//# sourceMappingURL=ira.js.map
|
package/dist/engines/ira.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ira.js","sourceRoot":"","sources":["../../src/engines/ira.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mortgage engine — lifted from site/src/pages/mortgage-calculator/mortgage-calculator.js
|
|
3
|
-
* (function `calculateMonthlyPI`).
|
|
4
|
-
*
|
|
5
|
-
* Per ADR-0039 § 5 (Calc-Engine Lift Pattern):
|
|
6
|
-
* - Pure synchronous functions of inputs → results. No DOM, no fetch.
|
|
7
|
-
* - ENGINE_VERSION bumps when math changes (semver).
|
|
8
|
-
* - Parity tests at packages/mcp/test/parity/mortgage.test.ts gate this engine
|
|
9
|
-
* against the source site calculator JS to the cent.
|
|
10
|
-
*
|
|
11
|
-
* Math reference (standard amortization formula):
|
|
12
|
-
* M = P * [r(1+r)^n] / [(1+r)^n - 1]
|
|
13
|
-
* where:
|
|
14
|
-
* M = monthly payment
|
|
15
|
-
* P = principal (loan amount)
|
|
16
|
-
* r = monthly interest rate (annual / 12, as decimal)
|
|
17
|
-
* n = number of monthly payments (years * 12)
|
|
18
|
-
*
|
|
19
|
-
* For 0% rate the formula reduces to: M = P / n
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* SemVer of the mortgage engine math. Per ADR-0039 § 5 (reaffirmed in
|
|
23
|
-
* ADR-0041 Position #4a): major bump = math change; minor = additive output;
|
|
24
|
-
* patch = numerical correction. NOT bumped for cosmetic refactors.
|
|
25
|
-
* - 0.1.0: initial v1 lift from mortgage-calculator.js (Sprint 135 Item 5).
|
|
26
|
-
* - 0.2.0 (v0.1.0 publish): out-of-policy package-surface bump — superseded.
|
|
27
|
-
* - 1.0.0 (v0.2.0 publish): one-time reset to align with ADR-0039 § 5 semantics
|
|
28
|
-
* per ADR-0041 D4a. Math is unchanged from 0.1.0 / 0.2.0.
|
|
29
|
-
*/
|
|
30
|
-
export declare const ENGINE_VERSION = "1.0.0";
|
|
31
|
-
/**
|
|
32
|
-
* Inputs to the mortgage monthly-payment engine.
|
|
33
|
-
*
|
|
34
|
-
* Per ADR-0039 § 2:
|
|
35
|
-
* - Monetary fields are bare USD numbers.
|
|
36
|
-
* - Percentage fields use whole-number-percent units (e.g., 6.5 for 6.5%).
|
|
37
|
-
*
|
|
38
|
-
* NOTE on convention vs. sprint prompt: the sprint prompt referenced
|
|
39
|
-
* decimal-rate inputs (0.065). ADR-0039 § 2 locks the `Percent` suffix +
|
|
40
|
-
* whole-number-percent convention. The contract wins; this engine accepts
|
|
41
|
-
* `annualRatePercent` (e.g., 6.5).
|
|
42
|
-
*/
|
|
43
|
-
export interface MortgageMonthlyPaymentInput {
|
|
44
|
-
/** Principal loan amount in USD. */
|
|
45
|
-
principal: number;
|
|
46
|
-
/** Annual interest rate as whole-number percent (e.g., 6.5 for 6.5%). */
|
|
47
|
-
annualRatePercent: number;
|
|
48
|
-
/** Loan term in years. Must be a positive integer. */
|
|
49
|
-
termYears: number;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Result payload (what goes inside ToolResult.result).
|
|
53
|
-
*/
|
|
54
|
-
export interface MortgageMonthlyPaymentResult {
|
|
55
|
-
/** Monthly principal & interest payment, in USD. */
|
|
56
|
-
monthlyPayment: number;
|
|
57
|
-
/** Total interest paid over the life of the loan, in USD. */
|
|
58
|
-
totalInterest: number;
|
|
59
|
-
/** Total paid (principal + interest) over the life of the loan, in USD. */
|
|
60
|
-
totalPaid: number;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Compute the monthly principal & interest payment.
|
|
64
|
-
*
|
|
65
|
-
* 1-to-1 port of site/src/pages/mortgage-calculator/mortgage-calculator.js
|
|
66
|
-
* function `calculateMonthlyPI`. Same math, same edge case handling
|
|
67
|
-
* (0% rate → straight-line amortization).
|
|
68
|
-
*/
|
|
69
|
-
export declare function monthlyPayment(input: MortgageMonthlyPaymentInput): MortgageMonthlyPaymentResult;
|
|
70
|
-
//# sourceMappingURL=mortgage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mortgage.d.ts","sourceRoot":"","sources":["../../src/engines/mortgage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,2BAA2B;IAC1C,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,2BAA2B,GACjC,4BAA4B,CAwB9B"}
|
package/dist/engines/mortgage.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mortgage engine — lifted from site/src/pages/mortgage-calculator/mortgage-calculator.js
|
|
3
|
-
* (function `calculateMonthlyPI`).
|
|
4
|
-
*
|
|
5
|
-
* Per ADR-0039 § 5 (Calc-Engine Lift Pattern):
|
|
6
|
-
* - Pure synchronous functions of inputs → results. No DOM, no fetch.
|
|
7
|
-
* - ENGINE_VERSION bumps when math changes (semver).
|
|
8
|
-
* - Parity tests at packages/mcp/test/parity/mortgage.test.ts gate this engine
|
|
9
|
-
* against the source site calculator JS to the cent.
|
|
10
|
-
*
|
|
11
|
-
* Math reference (standard amortization formula):
|
|
12
|
-
* M = P * [r(1+r)^n] / [(1+r)^n - 1]
|
|
13
|
-
* where:
|
|
14
|
-
* M = monthly payment
|
|
15
|
-
* P = principal (loan amount)
|
|
16
|
-
* r = monthly interest rate (annual / 12, as decimal)
|
|
17
|
-
* n = number of monthly payments (years * 12)
|
|
18
|
-
*
|
|
19
|
-
* For 0% rate the formula reduces to: M = P / n
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* SemVer of the mortgage engine math. Per ADR-0039 § 5 (reaffirmed in
|
|
23
|
-
* ADR-0041 Position #4a): major bump = math change; minor = additive output;
|
|
24
|
-
* patch = numerical correction. NOT bumped for cosmetic refactors.
|
|
25
|
-
* - 0.1.0: initial v1 lift from mortgage-calculator.js (Sprint 135 Item 5).
|
|
26
|
-
* - 0.2.0 (v0.1.0 publish): out-of-policy package-surface bump — superseded.
|
|
27
|
-
* - 1.0.0 (v0.2.0 publish): one-time reset to align with ADR-0039 § 5 semantics
|
|
28
|
-
* per ADR-0041 D4a. Math is unchanged from 0.1.0 / 0.2.0.
|
|
29
|
-
*/
|
|
30
|
-
export const ENGINE_VERSION = "1.0.0";
|
|
31
|
-
/**
|
|
32
|
-
* Compute the monthly principal & interest payment.
|
|
33
|
-
*
|
|
34
|
-
* 1-to-1 port of site/src/pages/mortgage-calculator/mortgage-calculator.js
|
|
35
|
-
* function `calculateMonthlyPI`. Same math, same edge case handling
|
|
36
|
-
* (0% rate → straight-line amortization).
|
|
37
|
-
*/
|
|
38
|
-
export function monthlyPayment(input) {
|
|
39
|
-
const { principal, annualRatePercent, termYears } = input;
|
|
40
|
-
const monthlyRate = annualRatePercent / 100 / 12;
|
|
41
|
-
const numPayments = termYears * 12;
|
|
42
|
-
let monthly;
|
|
43
|
-
if (annualRatePercent === 0) {
|
|
44
|
-
monthly = principal / numPayments;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
monthly =
|
|
48
|
-
principal *
|
|
49
|
-
((monthlyRate * Math.pow(1 + monthlyRate, numPayments)) /
|
|
50
|
-
(Math.pow(1 + monthlyRate, numPayments) - 1));
|
|
51
|
-
}
|
|
52
|
-
const totalPaid = monthly * numPayments;
|
|
53
|
-
const totalInterest = totalPaid - principal;
|
|
54
|
-
return {
|
|
55
|
-
monthlyPayment: monthly,
|
|
56
|
-
totalInterest,
|
|
57
|
-
totalPaid,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=mortgage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mortgage.js","sourceRoot":"","sources":["../../src/engines/mortgage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAmCtC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAkC;IAElC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAE1D,MAAM,WAAW,GAAG,iBAAiB,GAAG,GAAG,GAAG,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,SAAS,GAAG,EAAE,CAAC;IAEnC,IAAI,OAAe,CAAC;IACpB,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO;YACL,SAAS;gBACT,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,WAAW,CAAC,CAAC;oBACrD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;IACxC,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;IAE5C,OAAO;QACL,cAAc,EAAE,OAAO;QACvB,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC"}
|