pigeongov 0.2.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/AGENTS.md +258 -0
- package/LICENSE +21 -0
- package/PRIVACY.md +38 -0
- package/README.md +234 -0
- package/agents.json +72 -0
- package/dist/bin/pigeongov.d.ts +2 -0
- package/dist/bin/pigeongov.js +4 -0
- package/dist/bin/pigeongov.js.map +1 -0
- package/dist/src/advisory/decision-support/contribution-optimizer.d.ts +36 -0
- package/dist/src/advisory/decision-support/contribution-optimizer.js +88 -0
- package/dist/src/advisory/decision-support/contribution-optimizer.js.map +1 -0
- package/dist/src/advisory/decision-support/deduction-optimizer.d.ts +31 -0
- package/dist/src/advisory/decision-support/deduction-optimizer.js +96 -0
- package/dist/src/advisory/decision-support/deduction-optimizer.js.map +1 -0
- package/dist/src/advisory/life-events/events.d.ts +4 -0
- package/dist/src/advisory/life-events/events.js +156 -0
- package/dist/src/advisory/life-events/events.js.map +1 -0
- package/dist/src/advisory/life-events/planner.d.ts +19 -0
- package/dist/src/advisory/life-events/planner.js +72 -0
- package/dist/src/advisory/life-events/planner.js.map +1 -0
- package/dist/src/advisory/screener/engine.d.ts +4 -0
- package/dist/src/advisory/screener/engine.js +368 -0
- package/dist/src/advisory/screener/engine.js.map +1 -0
- package/dist/src/advisory/screener/intake.d.ts +68 -0
- package/dist/src/advisory/screener/intake.js +93 -0
- package/dist/src/advisory/screener/intake.js.map +1 -0
- package/dist/src/analytics/stats.d.ts +18 -0
- package/dist/src/analytics/stats.js +158 -0
- package/dist/src/analytics/stats.js.map +1 -0
- package/dist/src/api/handlers/deadlines.d.ts +2 -0
- package/dist/src/api/handlers/deadlines.js +7 -0
- package/dist/src/api/handlers/deadlines.js.map +1 -0
- package/dist/src/api/handlers/openapi.d.ts +2 -0
- package/dist/src/api/handlers/openapi.js +7 -0
- package/dist/src/api/handlers/openapi.js.map +1 -0
- package/dist/src/api/handlers/workflows.d.ts +5 -0
- package/dist/src/api/handlers/workflows.js +73 -0
- package/dist/src/api/handlers/workflows.js.map +1 -0
- package/dist/src/api/index.d.ts +20 -0
- package/dist/src/api/index.js +70 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/api/openapi.d.ts +5 -0
- package/dist/src/api/openapi.js +384 -0
- package/dist/src/api/openapi.js.map +1 -0
- package/dist/src/api/router.d.ts +19 -0
- package/dist/src/api/router.js +57 -0
- package/dist/src/api/router.js.map +1 -0
- package/dist/src/cli/commands/completions.d.ts +2 -0
- package/dist/src/cli/commands/completions.js +396 -0
- package/dist/src/cli/commands/completions.js.map +1 -0
- package/dist/src/cli/commands/deadlines.d.ts +2 -0
- package/dist/src/cli/commands/deadlines.js +47 -0
- package/dist/src/cli/commands/deadlines.js.map +1 -0
- package/dist/src/cli/commands/doctor.d.ts +2 -0
- package/dist/src/cli/commands/doctor.js +50 -0
- package/dist/src/cli/commands/doctor.js.map +1 -0
- package/dist/src/cli/commands/drafts.d.ts +2 -0
- package/dist/src/cli/commands/drafts.js +75 -0
- package/dist/src/cli/commands/drafts.js.map +1 -0
- package/dist/src/cli/commands/extract.d.ts +2 -0
- package/dist/src/cli/commands/extract.js +17 -0
- package/dist/src/cli/commands/extract.js.map +1 -0
- package/dist/src/cli/commands/fees.d.ts +2 -0
- package/dist/src/cli/commands/fees.js +40 -0
- package/dist/src/cli/commands/fees.js.map +1 -0
- package/dist/src/cli/commands/fill.d.ts +25 -0
- package/dist/src/cli/commands/fill.js +354 -0
- package/dist/src/cli/commands/fill.js.map +1 -0
- package/dist/src/cli/commands/glossary.d.ts +2 -0
- package/dist/src/cli/commands/glossary.js +90 -0
- package/dist/src/cli/commands/glossary.js.map +1 -0
- package/dist/src/cli/commands/life-event.d.ts +2 -0
- package/dist/src/cli/commands/life-event.js +41 -0
- package/dist/src/cli/commands/life-event.js.map +1 -0
- package/dist/src/cli/commands/list.d.ts +2 -0
- package/dist/src/cli/commands/list.js +19 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/machine.d.ts +2 -0
- package/dist/src/cli/commands/machine.js +100 -0
- package/dist/src/cli/commands/machine.js.map +1 -0
- package/dist/src/cli/commands/merge.d.ts +2 -0
- package/dist/src/cli/commands/merge.js +24 -0
- package/dist/src/cli/commands/merge.js.map +1 -0
- package/dist/src/cli/commands/plugin.d.ts +2 -0
- package/dist/src/cli/commands/plugin.js +119 -0
- package/dist/src/cli/commands/plugin.js.map +1 -0
- package/dist/src/cli/commands/profile.d.ts +2 -0
- package/dist/src/cli/commands/profile.js +125 -0
- package/dist/src/cli/commands/profile.js.map +1 -0
- package/dist/src/cli/commands/review.d.ts +2 -0
- package/dist/src/cli/commands/review.js +25 -0
- package/dist/src/cli/commands/review.js.map +1 -0
- package/dist/src/cli/commands/scaffold.d.ts +2 -0
- package/dist/src/cli/commands/scaffold.js +304 -0
- package/dist/src/cli/commands/scaffold.js.map +1 -0
- package/dist/src/cli/commands/schemas.d.ts +2 -0
- package/dist/src/cli/commands/schemas.js +14 -0
- package/dist/src/cli/commands/schemas.js.map +1 -0
- package/dist/src/cli/commands/screen.d.ts +2 -0
- package/dist/src/cli/commands/screen.js +89 -0
- package/dist/src/cli/commands/screen.js.map +1 -0
- package/dist/src/cli/commands/serve.d.ts +2 -0
- package/dist/src/cli/commands/serve.js +46 -0
- package/dist/src/cli/commands/serve.js.map +1 -0
- package/dist/src/cli/commands/start.d.ts +2 -0
- package/dist/src/cli/commands/start.js +16 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/stats.d.ts +2 -0
- package/dist/src/cli/commands/stats.js +17 -0
- package/dist/src/cli/commands/stats.js.map +1 -0
- package/dist/src/cli/commands/testdata.d.ts +2 -0
- package/dist/src/cli/commands/testdata.js +60 -0
- package/dist/src/cli/commands/testdata.js.map +1 -0
- package/dist/src/cli/commands/tui.d.ts +2 -0
- package/dist/src/cli/commands/tui.js +26 -0
- package/dist/src/cli/commands/tui.js.map +1 -0
- package/dist/src/cli/commands/validate.d.ts +2 -0
- package/dist/src/cli/commands/validate.js +22 -0
- package/dist/src/cli/commands/validate.js.map +1 -0
- package/dist/src/cli/commands/vault.d.ts +2 -0
- package/dist/src/cli/commands/vault.js +73 -0
- package/dist/src/cli/commands/vault.js.map +1 -0
- package/dist/src/cli/commands/workflows.d.ts +2 -0
- package/dist/src/cli/commands/workflows.js +23 -0
- package/dist/src/cli/commands/workflows.js.map +1 -0
- package/dist/src/cli/display/review.d.ts +2 -0
- package/dist/src/cli/display/review.js +4 -0
- package/dist/src/cli/display/review.js.map +1 -0
- package/dist/src/cli/display/summary.d.ts +2 -0
- package/dist/src/cli/display/summary.js +19 -0
- package/dist/src/cli/display/summary.js.map +1 -0
- package/dist/src/cli/display/validation.d.ts +2 -0
- package/dist/src/cli/display/validation.js +16 -0
- package/dist/src/cli/display/validation.js.map +1 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +83 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/output.d.ts +21 -0
- package/dist/src/cli/output.js +107 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/cli/prompts/common.d.ts +21 -0
- package/dist/src/cli/prompts/common.js +53 -0
- package/dist/src/cli/prompts/common.js.map +1 -0
- package/dist/src/cli/prompts/credits.d.ts +3 -0
- package/dist/src/cli/prompts/credits.js +23 -0
- package/dist/src/cli/prompts/credits.js.map +1 -0
- package/dist/src/cli/prompts/deductions.d.ts +12 -0
- package/dist/src/cli/prompts/deductions.js +26 -0
- package/dist/src/cli/prompts/deductions.js.map +1 -0
- package/dist/src/cli/prompts/identity.d.ts +8 -0
- package/dist/src/cli/prompts/identity.js +36 -0
- package/dist/src/cli/prompts/identity.js.map +1 -0
- package/dist/src/cli/prompts/income.d.ts +15 -0
- package/dist/src/cli/prompts/income.js +61 -0
- package/dist/src/cli/prompts/income.js.map +1 -0
- package/dist/src/cli/prompts/workflow.d.ts +3 -0
- package/dist/src/cli/prompts/workflow.js +74 -0
- package/dist/src/cli/prompts/workflow.js.map +1 -0
- package/dist/src/cli/support.d.ts +53 -0
- package/dist/src/cli/support.js +80 -0
- package/dist/src/cli/support.js.map +1 -0
- package/dist/src/cli/tui.d.ts +22 -0
- package/dist/src/cli/tui.js +122 -0
- package/dist/src/cli/tui.js.map +1 -0
- package/dist/src/engine/audit-risk/scorer.d.ts +36 -0
- package/dist/src/engine/audit-risk/scorer.js +132 -0
- package/dist/src/engine/audit-risk/scorer.js.map +1 -0
- package/dist/src/engine/crypto/cost-basis.d.ts +19 -0
- package/dist/src/engine/crypto/cost-basis.js +115 -0
- package/dist/src/engine/crypto/cost-basis.js.map +1 -0
- package/dist/src/engine/crypto/transaction-parser.d.ts +36 -0
- package/dist/src/engine/crypto/transaction-parser.js +124 -0
- package/dist/src/engine/crypto/transaction-parser.js.map +1 -0
- package/dist/src/engine/crypto/wash-sale.d.ts +25 -0
- package/dist/src/engine/crypto/wash-sale.js +51 -0
- package/dist/src/engine/crypto/wash-sale.js.map +1 -0
- package/dist/src/engine/equity/espp.d.ts +41 -0
- package/dist/src/engine/equity/espp.js +90 -0
- package/dist/src/engine/equity/espp.js.map +1 -0
- package/dist/src/engine/equity/iso.d.ts +42 -0
- package/dist/src/engine/equity/iso.js +94 -0
- package/dist/src/engine/equity/iso.js.map +1 -0
- package/dist/src/engine/equity/nso.d.ts +35 -0
- package/dist/src/engine/equity/nso.js +63 -0
- package/dist/src/engine/equity/nso.js.map +1 -0
- package/dist/src/engine/equity/rsu.d.ts +33 -0
- package/dist/src/engine/equity/rsu.js +64 -0
- package/dist/src/engine/equity/rsu.js.map +1 -0
- package/dist/src/engine/field-mapper.d.ts +26 -0
- package/dist/src/engine/field-mapper.js +119 -0
- package/dist/src/engine/field-mapper.js.map +1 -0
- package/dist/src/engine/forms/core-1040.d.ts +2 -0
- package/dist/src/engine/forms/core-1040.js +124 -0
- package/dist/src/engine/forms/core-1040.js.map +1 -0
- package/dist/src/engine/forms/form-8949.d.ts +21 -0
- package/dist/src/engine/forms/form-8949.js +96 -0
- package/dist/src/engine/forms/form-8949.js.map +1 -0
- package/dist/src/engine/forms/index.d.ts +7 -0
- package/dist/src/engine/forms/index.js +6 -0
- package/dist/src/engine/forms/index.js.map +1 -0
- package/dist/src/engine/forms/schedule-b.d.ts +15 -0
- package/dist/src/engine/forms/schedule-b.js +78 -0
- package/dist/src/engine/forms/schedule-b.js.map +1 -0
- package/dist/src/engine/forms/schedule-d.d.ts +9 -0
- package/dist/src/engine/forms/schedule-d.js +86 -0
- package/dist/src/engine/forms/schedule-d.js.map +1 -0
- package/dist/src/engine/fpl.d.ts +70 -0
- package/dist/src/engine/fpl.js +127 -0
- package/dist/src/engine/fpl.js.map +1 -0
- package/dist/src/engine/gig/home-office.d.ts +34 -0
- package/dist/src/engine/gig/home-office.js +53 -0
- package/dist/src/engine/gig/home-office.js.map +1 -0
- package/dist/src/engine/gig/mileage.d.ts +30 -0
- package/dist/src/engine/gig/mileage.js +45 -0
- package/dist/src/engine/gig/mileage.js.map +1 -0
- package/dist/src/engine/gig/multi-1099.d.ts +19 -0
- package/dist/src/engine/gig/multi-1099.js +28 -0
- package/dist/src/engine/gig/multi-1099.js.map +1 -0
- package/dist/src/engine/multiyear/carryforward.d.ts +31 -0
- package/dist/src/engine/multiyear/carryforward.js +77 -0
- package/dist/src/engine/multiyear/carryforward.js.map +1 -0
- package/dist/src/engine/multiyear/compare.d.ts +25 -0
- package/dist/src/engine/multiyear/compare.js +94 -0
- package/dist/src/engine/multiyear/compare.js.map +1 -0
- package/dist/src/engine/multiyear/import.d.ts +23 -0
- package/dist/src/engine/multiyear/import.js +193 -0
- package/dist/src/engine/multiyear/import.js.map +1 -0
- package/dist/src/engine/optimizer/filing-status.d.ts +29 -0
- package/dist/src/engine/optimizer/filing-status.js +66 -0
- package/dist/src/engine/optimizer/filing-status.js.map +1 -0
- package/dist/src/engine/orchestrator.d.ts +14 -0
- package/dist/src/engine/orchestrator.js +135 -0
- package/dist/src/engine/orchestrator.js.map +1 -0
- package/dist/src/engine/scenarios/whatif.d.ts +34 -0
- package/dist/src/engine/scenarios/whatif.js +70 -0
- package/dist/src/engine/scenarios/whatif.js.map +1 -0
- package/dist/src/engine/state/ca/calculator.d.ts +3 -0
- package/dist/src/engine/state/ca/calculator.js +107 -0
- package/dist/src/engine/state/ca/calculator.js.map +1 -0
- package/dist/src/engine/state/common.d.ts +39 -0
- package/dist/src/engine/state/common.js +115 -0
- package/dist/src/engine/state/common.js.map +1 -0
- package/dist/src/engine/state/ga/calculator.d.ts +3 -0
- package/dist/src/engine/state/ga/calculator.js +82 -0
- package/dist/src/engine/state/ga/calculator.js.map +1 -0
- package/dist/src/engine/state/il/calculator.d.ts +3 -0
- package/dist/src/engine/state/il/calculator.js +49 -0
- package/dist/src/engine/state/il/calculator.js.map +1 -0
- package/dist/src/engine/state/mi/calculator.d.ts +3 -0
- package/dist/src/engine/state/mi/calculator.js +60 -0
- package/dist/src/engine/state/mi/calculator.js.map +1 -0
- package/dist/src/engine/state/nc/calculator.d.ts +3 -0
- package/dist/src/engine/state/nc/calculator.js +54 -0
- package/dist/src/engine/state/nc/calculator.js.map +1 -0
- package/dist/src/engine/state/nj/calculator.d.ts +3 -0
- package/dist/src/engine/state/nj/calculator.js +90 -0
- package/dist/src/engine/state/nj/calculator.js.map +1 -0
- package/dist/src/engine/state/ny/calculator.d.ts +3 -0
- package/dist/src/engine/state/ny/calculator.js +103 -0
- package/dist/src/engine/state/ny/calculator.js.map +1 -0
- package/dist/src/engine/state/oh/calculator.d.ts +3 -0
- package/dist/src/engine/state/oh/calculator.js +79 -0
- package/dist/src/engine/state/oh/calculator.js.map +1 -0
- package/dist/src/engine/state/pa/calculator.d.ts +3 -0
- package/dist/src/engine/state/pa/calculator.js +58 -0
- package/dist/src/engine/state/pa/calculator.js.map +1 -0
- package/dist/src/engine/state/registry.d.ts +9 -0
- package/dist/src/engine/state/registry.js +67 -0
- package/dist/src/engine/state/registry.js.map +1 -0
- package/dist/src/engine/state/types.d.ts +57 -0
- package/dist/src/engine/state/types.js +2 -0
- package/dist/src/engine/state/types.js.map +1 -0
- package/dist/src/engine/state/va/calculator.d.ts +3 -0
- package/dist/src/engine/state/va/calculator.js +76 -0
- package/dist/src/engine/state/va/calculator.js.map +1 -0
- package/dist/src/engine/suggestions/missed-deductions.d.ts +43 -0
- package/dist/src/engine/suggestions/missed-deductions.js +128 -0
- package/dist/src/engine/suggestions/missed-deductions.js.map +1 -0
- package/dist/src/engine/tax-calculator.d.ts +55 -0
- package/dist/src/engine/tax-calculator.js +156 -0
- package/dist/src/engine/tax-calculator.js.map +1 -0
- package/dist/src/engine/tax-constants-2025.d.ts +56 -0
- package/dist/src/engine/tax-constants-2025.js +138 -0
- package/dist/src/engine/tax-constants-2025.js.map +1 -0
- package/dist/src/engine/types.d.ts +77 -0
- package/dist/src/engine/types.js +2 -0
- package/dist/src/engine/types.js.map +1 -0
- package/dist/src/engine/va-math.d.ts +24 -0
- package/dist/src/engine/va-math.js +90 -0
- package/dist/src/engine/va-math.js.map +1 -0
- package/dist/src/engine/validator.d.ts +7 -0
- package/dist/src/engine/validator.js +108 -0
- package/dist/src/engine/validator.js.map +1 -0
- package/dist/src/glossary/entries/healthcare.d.ts +2 -0
- package/dist/src/glossary/entries/healthcare.js +78 -0
- package/dist/src/glossary/entries/healthcare.js.map +1 -0
- package/dist/src/glossary/entries/immigration.d.ts +2 -0
- package/dist/src/glossary/entries/immigration.js +112 -0
- package/dist/src/glossary/entries/immigration.js.map +1 -0
- package/dist/src/glossary/entries/tax.d.ts +2 -0
- package/dist/src/glossary/entries/tax.js +149 -0
- package/dist/src/glossary/entries/tax.js.map +1 -0
- package/dist/src/glossary/entries/unemployment.d.ts +2 -0
- package/dist/src/glossary/entries/unemployment.js +52 -0
- package/dist/src/glossary/entries/unemployment.js.map +1 -0
- package/dist/src/glossary/index.d.ts +19 -0
- package/dist/src/glossary/index.js +39 -0
- package/dist/src/glossary/index.js.map +1 -0
- package/dist/src/i18n/index.d.ts +21 -0
- package/dist/src/i18n/index.js +92 -0
- package/dist/src/i18n/index.js.map +1 -0
- package/dist/src/mcp/result.d.ts +3 -0
- package/dist/src/mcp/result.js +7 -0
- package/dist/src/mcp/result.js.map +1 -0
- package/dist/src/mcp/return-bundle.d.ts +19 -0
- package/dist/src/mcp/return-bundle.js +49 -0
- package/dist/src/mcp/return-bundle.js.map +1 -0
- package/dist/src/mcp/shared.d.ts +49102 -0
- package/dist/src/mcp/shared.js +354 -0
- package/dist/src/mcp/shared.js.map +1 -0
- package/dist/src/mcp/tools/build-packet.d.ts +7 -0
- package/dist/src/mcp/tools/build-packet.js +23 -0
- package/dist/src/mcp/tools/build-packet.js.map +1 -0
- package/dist/src/mcp/tools/calculate-tax.d.ts +40 -0
- package/dist/src/mcp/tools/calculate-tax.js +17 -0
- package/dist/src/mcp/tools/calculate-tax.js.map +1 -0
- package/dist/src/mcp/tools/deadlines.d.ts +7 -0
- package/dist/src/mcp/tools/deadlines.js +23 -0
- package/dist/src/mcp/tools/deadlines.js.map +1 -0
- package/dist/src/mcp/tools/describe-form.d.ts +14 -0
- package/dist/src/mcp/tools/describe-form.js +23 -0
- package/dist/src/mcp/tools/describe-form.js.map +1 -0
- package/dist/src/mcp/tools/describe-workflow.d.ts +6 -0
- package/dist/src/mcp/tools/describe-workflow.js +16 -0
- package/dist/src/mcp/tools/describe-workflow.js.map +1 -0
- package/dist/src/mcp/tools/explain-flag.d.ts +7 -0
- package/dist/src/mcp/tools/explain-flag.js +19 -0
- package/dist/src/mcp/tools/explain-flag.js.map +1 -0
- package/dist/src/mcp/tools/extract-document.d.ts +13 -0
- package/dist/src/mcp/tools/extract-document.js +20 -0
- package/dist/src/mcp/tools/extract-document.js.map +1 -0
- package/dist/src/mcp/tools/fees.d.ts +7 -0
- package/dist/src/mcp/tools/fees.js +24 -0
- package/dist/src/mcp/tools/fees.js.map +1 -0
- package/dist/src/mcp/tools/fill-form.d.ts +56 -0
- package/dist/src/mcp/tools/fill-form.js +47 -0
- package/dist/src/mcp/tools/fill-form.js.map +1 -0
- package/dist/src/mcp/tools/fill-workflow.d.ts +7 -0
- package/dist/src/mcp/tools/fill-workflow.js +24 -0
- package/dist/src/mcp/tools/fill-workflow.js.map +1 -0
- package/dist/src/mcp/tools/glossary.d.ts +8 -0
- package/dist/src/mcp/tools/glossary.js +54 -0
- package/dist/src/mcp/tools/glossary.js.map +1 -0
- package/dist/src/mcp/tools/list-forms.d.ts +6 -0
- package/dist/src/mcp/tools/list-forms.js +15 -0
- package/dist/src/mcp/tools/list-forms.js.map +1 -0
- package/dist/src/mcp/tools/list-workflows.d.ts +6 -0
- package/dist/src/mcp/tools/list-workflows.js +16 -0
- package/dist/src/mcp/tools/list-workflows.js.map +1 -0
- package/dist/src/mcp/tools/plan-life-event.d.ts +59 -0
- package/dist/src/mcp/tools/plan-life-event.js +41 -0
- package/dist/src/mcp/tools/plan-life-event.js.map +1 -0
- package/dist/src/mcp/tools/review-form.d.ts +40 -0
- package/dist/src/mcp/tools/review-form.js +26 -0
- package/dist/src/mcp/tools/review-form.js.map +1 -0
- package/dist/src/mcp/tools/review-workflow.d.ts +7 -0
- package/dist/src/mcp/tools/review-workflow.js +27 -0
- package/dist/src/mcp/tools/review-workflow.js.map +1 -0
- package/dist/src/mcp/tools/screen-eligibility.d.ts +53 -0
- package/dist/src/mcp/tools/screen-eligibility.js +44 -0
- package/dist/src/mcp/tools/screen-eligibility.js.map +1 -0
- package/dist/src/mcp/tools/start-workflow.d.ts +6 -0
- package/dist/src/mcp/tools/start-workflow.js +17 -0
- package/dist/src/mcp/tools/start-workflow.js.map +1 -0
- package/dist/src/mcp/tools/validate-form.d.ts +48 -0
- package/dist/src/mcp/tools/validate-form.js +30 -0
- package/dist/src/mcp/tools/validate-form.js.map +1 -0
- package/dist/src/mcp/tools/validate-workflow.d.ts +7 -0
- package/dist/src/mcp/tools/validate-workflow.js +24 -0
- package/dist/src/mcp/tools/validate-workflow.js.map +1 -0
- package/dist/src/pdf/batch.d.ts +8 -0
- package/dist/src/pdf/batch.js +15 -0
- package/dist/src/pdf/batch.js.map +1 -0
- package/dist/src/pdf/merge.d.ts +10 -0
- package/dist/src/pdf/merge.js +62 -0
- package/dist/src/pdf/merge.js.map +1 -0
- package/dist/src/pdf/ocr.d.ts +22 -0
- package/dist/src/pdf/ocr.js +52 -0
- package/dist/src/pdf/ocr.js.map +1 -0
- package/dist/src/pdf/reader.d.ts +2 -0
- package/dist/src/pdf/reader.js +354 -0
- package/dist/src/pdf/reader.js.map +1 -0
- package/dist/src/pdf/shared.d.ts +89 -0
- package/dist/src/pdf/shared.js +137 -0
- package/dist/src/pdf/shared.js.map +1 -0
- package/dist/src/pdf/writer.d.ts +7 -0
- package/dist/src/pdf/writer.js +311 -0
- package/dist/src/pdf/writer.js.map +1 -0
- package/dist/src/plugins/loader.d.ts +15 -0
- package/dist/src/plugins/loader.js +86 -0
- package/dist/src/plugins/loader.js.map +1 -0
- package/dist/src/plugins/sandbox.d.ts +14 -0
- package/dist/src/plugins/sandbox.js +88 -0
- package/dist/src/plugins/sandbox.js.map +1 -0
- package/dist/src/plugins/types.d.ts +17 -0
- package/dist/src/plugins/types.js +13 -0
- package/dist/src/plugins/types.js.map +1 -0
- package/dist/src/schemas/2025/f1040.d.ts +127 -0
- package/dist/src/schemas/2025/f1040.js +104 -0
- package/dist/src/schemas/2025/f1040.js.map +1 -0
- package/dist/src/schemas/2025/f1099-int.d.ts +53 -0
- package/dist/src/schemas/2025/f1099-int.js +51 -0
- package/dist/src/schemas/2025/f1099-int.js.map +1 -0
- package/dist/src/schemas/2025/f1099-nec.d.ts +47 -0
- package/dist/src/schemas/2025/f1099-nec.js +45 -0
- package/dist/src/schemas/2025/f1099-nec.js.map +1 -0
- package/dist/src/schemas/2025/form-8949.d.ts +46 -0
- package/dist/src/schemas/2025/form-8949.js +71 -0
- package/dist/src/schemas/2025/form-8949.js.map +1 -0
- package/dist/src/schemas/2025/index.d.ts +1004 -0
- package/dist/src/schemas/2025/index.js +60 -0
- package/dist/src/schemas/2025/index.js.map +1 -0
- package/dist/src/schemas/2025/schedule-1.d.ts +44 -0
- package/dist/src/schemas/2025/schedule-1.js +56 -0
- package/dist/src/schemas/2025/schedule-1.js.map +1 -0
- package/dist/src/schemas/2025/schedule-b.d.ts +32 -0
- package/dist/src/schemas/2025/schedule-b.js +53 -0
- package/dist/src/schemas/2025/schedule-b.js.map +1 -0
- package/dist/src/schemas/2025/schedule-c.d.ts +58 -0
- package/dist/src/schemas/2025/schedule-c.js +46 -0
- package/dist/src/schemas/2025/schedule-c.js.map +1 -0
- package/dist/src/schemas/2025/schedule-d.d.ts +36 -0
- package/dist/src/schemas/2025/schedule-d.js +52 -0
- package/dist/src/schemas/2025/schedule-d.js.map +1 -0
- package/dist/src/schemas/2025/shared.d.ts +98 -0
- package/dist/src/schemas/2025/shared.js +161 -0
- package/dist/src/schemas/2025/shared.js.map +1 -0
- package/dist/src/schemas/2025/w2.d.ts +57 -0
- package/dist/src/schemas/2025/w2.js +62 -0
- package/dist/src/schemas/2025/w2.js.map +1 -0
- package/dist/src/storage/drafts.d.ts +25 -0
- package/dist/src/storage/drafts.js +117 -0
- package/dist/src/storage/drafts.js.map +1 -0
- package/dist/src/storage/paths.d.ts +15 -0
- package/dist/src/storage/paths.js +33 -0
- package/dist/src/storage/paths.js.map +1 -0
- package/dist/src/storage/profile.d.ts +17 -0
- package/dist/src/storage/profile.js +59 -0
- package/dist/src/storage/profile.js.map +1 -0
- package/dist/src/storage/vault.d.ts +38 -0
- package/dist/src/storage/vault.js +187 -0
- package/dist/src/storage/vault.js.map +1 -0
- package/dist/src/testing/synthetic.d.ts +13 -0
- package/dist/src/testing/synthetic.js +164 -0
- package/dist/src/testing/synthetic.js.map +1 -0
- package/dist/src/types.d.ts +362 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/workflows/deadlines.d.ts +13 -0
- package/dist/src/workflows/deadlines.js +88 -0
- package/dist/src/workflows/deadlines.js.map +1 -0
- package/dist/src/workflows/domains/benefits.d.ts +409 -0
- package/dist/src/workflows/domains/benefits.js +744 -0
- package/dist/src/workflows/domains/benefits.js.map +1 -0
- package/dist/src/workflows/domains/business.d.ts +65 -0
- package/dist/src/workflows/domains/business.js +76 -0
- package/dist/src/workflows/domains/business.js.map +1 -0
- package/dist/src/workflows/domains/education.d.ts +251 -0
- package/dist/src/workflows/domains/education.js +504 -0
- package/dist/src/workflows/domains/education.js.map +1 -0
- package/dist/src/workflows/domains/estate.d.ts +217 -0
- package/dist/src/workflows/domains/estate.js +407 -0
- package/dist/src/workflows/domains/estate.js.map +1 -0
- package/dist/src/workflows/domains/healthcare-ext.d.ts +88 -0
- package/dist/src/workflows/domains/healthcare-ext.js +150 -0
- package/dist/src/workflows/domains/healthcare-ext.js.map +1 -0
- package/dist/src/workflows/domains/healthcare.d.ts +92 -0
- package/dist/src/workflows/domains/healthcare.js +126 -0
- package/dist/src/workflows/domains/healthcare.js.map +1 -0
- package/dist/src/workflows/domains/identity-domain.d.ts +291 -0
- package/dist/src/workflows/domains/identity-domain.js +541 -0
- package/dist/src/workflows/domains/identity-domain.js.map +1 -0
- package/dist/src/workflows/domains/immigration-ext.d.ts +282 -0
- package/dist/src/workflows/domains/immigration-ext.js +590 -0
- package/dist/src/workflows/domains/immigration-ext.js.map +1 -0
- package/dist/src/workflows/domains/immigration.d.ts +121 -0
- package/dist/src/workflows/domains/immigration.js +152 -0
- package/dist/src/workflows/domains/immigration.js.map +1 -0
- package/dist/src/workflows/domains/legal.d.ts +235 -0
- package/dist/src/workflows/domains/legal.js +380 -0
- package/dist/src/workflows/domains/legal.js.map +1 -0
- package/dist/src/workflows/domains/permits.d.ts +65 -0
- package/dist/src/workflows/domains/permits.js +74 -0
- package/dist/src/workflows/domains/permits.js.map +1 -0
- package/dist/src/workflows/domains/retirement.d.ts +59 -0
- package/dist/src/workflows/domains/retirement.js +155 -0
- package/dist/src/workflows/domains/retirement.js.map +1 -0
- package/dist/src/workflows/domains/tax.d.ts +133 -0
- package/dist/src/workflows/domains/tax.js +187 -0
- package/dist/src/workflows/domains/tax.js.map +1 -0
- package/dist/src/workflows/domains/unemployment.d.ts +105 -0
- package/dist/src/workflows/domains/unemployment.js +122 -0
- package/dist/src/workflows/domains/unemployment.js.map +1 -0
- package/dist/src/workflows/domains/veterans.d.ts +189 -0
- package/dist/src/workflows/domains/veterans.js +380 -0
- package/dist/src/workflows/domains/veterans.js.map +1 -0
- package/dist/src/workflows/fees.d.ts +15 -0
- package/dist/src/workflows/fees.js +93 -0
- package/dist/src/workflows/fees.js.map +1 -0
- package/dist/src/workflows/helpers.d.ts +8 -0
- package/dist/src/workflows/helpers.js +66 -0
- package/dist/src/workflows/helpers.js.map +1 -0
- package/dist/src/workflows/io.d.ts +3 -0
- package/dist/src/workflows/io.js +38 -0
- package/dist/src/workflows/io.js.map +1 -0
- package/dist/src/workflows/registry.d.ts +51355 -0
- package/dist/src/workflows/registry.js +140 -0
- package/dist/src/workflows/registry.js.map +1 -0
- package/dist/src/workflows/schemas/benefits.d.ts +78 -0
- package/dist/src/workflows/schemas/benefits.js +91 -0
- package/dist/src/workflows/schemas/benefits.js.map +1 -0
- package/dist/src/workflows/schemas/common.d.ts +27 -0
- package/dist/src/workflows/schemas/common.js +28 -0
- package/dist/src/workflows/schemas/common.js.map +1 -0
- package/dist/src/workflows/schemas/education.d.ts +70 -0
- package/dist/src/workflows/schemas/education.js +85 -0
- package/dist/src/workflows/schemas/education.js.map +1 -0
- package/dist/src/workflows/schemas/estate.d.ts +64 -0
- package/dist/src/workflows/schemas/estate.js +85 -0
- package/dist/src/workflows/schemas/estate.js.map +1 -0
- package/dist/src/workflows/schemas/healthcare-ext.d.ts +15 -0
- package/dist/src/workflows/schemas/healthcare-ext.js +17 -0
- package/dist/src/workflows/schemas/healthcare-ext.js.map +1 -0
- package/dist/src/workflows/schemas/healthcare.d.ts +33 -0
- package/dist/src/workflows/schemas/healthcare.js +20 -0
- package/dist/src/workflows/schemas/healthcare.js.map +1 -0
- package/dist/src/workflows/schemas/identity-domain.d.ts +64 -0
- package/dist/src/workflows/schemas/identity-domain.js +87 -0
- package/dist/src/workflows/schemas/identity-domain.js.map +1 -0
- package/dist/src/workflows/schemas/immigration-ext.d.ts +63 -0
- package/dist/src/workflows/schemas/immigration-ext.js +58 -0
- package/dist/src/workflows/schemas/immigration-ext.js.map +1 -0
- package/dist/src/workflows/schemas/immigration.d.ts +48 -0
- package/dist/src/workflows/schemas/immigration.js +27 -0
- package/dist/src/workflows/schemas/immigration.js.map +1 -0
- package/dist/src/workflows/schemas/legal.d.ts +45 -0
- package/dist/src/workflows/schemas/legal.js +45 -0
- package/dist/src/workflows/schemas/legal.js.map +1 -0
- package/dist/src/workflows/schemas/planning.d.ts +23 -0
- package/dist/src/workflows/schemas/planning.js +15 -0
- package/dist/src/workflows/schemas/planning.js.map +1 -0
- package/dist/src/workflows/schemas/retirement.d.ts +14 -0
- package/dist/src/workflows/schemas/retirement.js +22 -0
- package/dist/src/workflows/schemas/retirement.js.map +1 -0
- package/dist/src/workflows/schemas/tax.d.ts +58 -0
- package/dist/src/workflows/schemas/tax.js +51 -0
- package/dist/src/workflows/schemas/tax.js.map +1 -0
- package/dist/src/workflows/schemas/unemployment.d.ts +33 -0
- package/dist/src/workflows/schemas/unemployment.js +19 -0
- package/dist/src/workflows/schemas/unemployment.js.map +1 -0
- package/dist/src/workflows/schemas/veterans.d.ts +47 -0
- package/dist/src/workflows/schemas/veterans.js +51 -0
- package/dist/src/workflows/schemas/veterans.js.map +1 -0
- package/dist/src/workflows/types.d.ts +9 -0
- package/dist/src/workflows/types.js +2 -0
- package/dist/src/workflows/types.js.map +1 -0
- package/dist/xmcp.config.d.ts +3 -0
- package/dist/xmcp.config.js +29 -0
- package/dist/xmcp.config.js.map +1 -0
- package/llms.txt +48 -0
- package/package.json +82 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Prior-Year Return Import
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Import data from a previous year's return bundle to pre-fill the
|
|
5
|
+
// current year. The goal: minimize re-entry of stable information
|
|
6
|
+
// (identity, address, dependents, bank accounts) while flagging
|
|
7
|
+
// anything that likely needs updating.
|
|
8
|
+
//
|
|
9
|
+
// This is the "are these still correct?" module — because life changes
|
|
10
|
+
// but your SSN doesn't.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Fields that are stable year-over-year and safe to import directly.
|
|
14
|
+
*/
|
|
15
|
+
const IMPORTABLE_IDENTITY_FIELDS = [
|
|
16
|
+
"firstName",
|
|
17
|
+
"lastName",
|
|
18
|
+
"ssn",
|
|
19
|
+
"dateOfBirth",
|
|
20
|
+
];
|
|
21
|
+
const IMPORTABLE_ADDRESS_FIELDS = [
|
|
22
|
+
"street1",
|
|
23
|
+
"street2",
|
|
24
|
+
"city",
|
|
25
|
+
"state",
|
|
26
|
+
"zipCode",
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Fields that should NOT be imported because they're year-specific.
|
|
30
|
+
*/
|
|
31
|
+
const SKIP_FIELDS = new Set([
|
|
32
|
+
"federalWithheld",
|
|
33
|
+
"estimatedPayments",
|
|
34
|
+
"wages",
|
|
35
|
+
"taxableInterest",
|
|
36
|
+
"ordinaryDividends",
|
|
37
|
+
"scheduleCNet",
|
|
38
|
+
"otherIncome",
|
|
39
|
+
"refund",
|
|
40
|
+
"amountOwed",
|
|
41
|
+
"totalTax",
|
|
42
|
+
"totalPayments",
|
|
43
|
+
"calculation",
|
|
44
|
+
"validation",
|
|
45
|
+
"review",
|
|
46
|
+
"outputArtifacts",
|
|
47
|
+
"provenance",
|
|
48
|
+
"filledForm",
|
|
49
|
+
]);
|
|
50
|
+
function safeGet(obj, path) {
|
|
51
|
+
const parts = path.split(".");
|
|
52
|
+
let current = obj;
|
|
53
|
+
for (const part of parts) {
|
|
54
|
+
if (current === null || current === undefined || typeof current !== "object") {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
current = current[part];
|
|
58
|
+
}
|
|
59
|
+
return current;
|
|
60
|
+
}
|
|
61
|
+
function safeSet(obj, path, value) {
|
|
62
|
+
const parts = path.split(".");
|
|
63
|
+
let current = obj;
|
|
64
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
65
|
+
const part = parts[i];
|
|
66
|
+
if (!(part in current) || typeof current[part] !== "object" || current[part] === null) {
|
|
67
|
+
current[part] = {};
|
|
68
|
+
}
|
|
69
|
+
current = current[part];
|
|
70
|
+
}
|
|
71
|
+
const lastPart = parts[parts.length - 1];
|
|
72
|
+
current[lastPart] = value;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Import stable data from a previous year's return bundle.
|
|
76
|
+
*
|
|
77
|
+
* Imports:
|
|
78
|
+
* - Identity (name, SSN, DOB)
|
|
79
|
+
* - Address (with a note to verify — people move)
|
|
80
|
+
* - Dependents (with count verification prompt)
|
|
81
|
+
* - Filing status (as a suggestion, not a lock)
|
|
82
|
+
* - Recurring income source labels (not amounts)
|
|
83
|
+
* - Bank account info for direct deposit
|
|
84
|
+
*
|
|
85
|
+
* Skips:
|
|
86
|
+
* - All dollar amounts (income, withholding, payments, results)
|
|
87
|
+
* - Calculation results, validation, review summaries
|
|
88
|
+
* - Year-specific artifacts
|
|
89
|
+
*/
|
|
90
|
+
export function importFromPreviousYear(previousBundle) {
|
|
91
|
+
const prefilled = {};
|
|
92
|
+
const fieldsImported = [];
|
|
93
|
+
const fieldsSkipped = [];
|
|
94
|
+
const notes = [];
|
|
95
|
+
// --- Identity ---
|
|
96
|
+
const applicant = safeGet(previousBundle, "applicant");
|
|
97
|
+
if (applicant && typeof applicant === "object") {
|
|
98
|
+
const importedApplicant = {};
|
|
99
|
+
for (const field of IMPORTABLE_IDENTITY_FIELDS) {
|
|
100
|
+
const value = applicant[field];
|
|
101
|
+
if (value !== undefined && value !== null) {
|
|
102
|
+
importedApplicant[field] = value;
|
|
103
|
+
fieldsImported.push(`applicant.${field}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Import address with verification note
|
|
107
|
+
const address = applicant["address"];
|
|
108
|
+
if (address && typeof address === "object") {
|
|
109
|
+
const importedAddress = {};
|
|
110
|
+
for (const field of IMPORTABLE_ADDRESS_FIELDS) {
|
|
111
|
+
const value = address[field];
|
|
112
|
+
if (value !== undefined && value !== null) {
|
|
113
|
+
importedAddress[field] = value;
|
|
114
|
+
fieldsImported.push(`applicant.address.${field}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
importedApplicant["address"] = importedAddress;
|
|
118
|
+
notes.push("Address imported from last year. Has your address changed?");
|
|
119
|
+
}
|
|
120
|
+
prefilled["applicant"] = importedApplicant;
|
|
121
|
+
}
|
|
122
|
+
// --- Filing status ---
|
|
123
|
+
const filingStatus = safeGet(previousBundle, "filingStatus") ??
|
|
124
|
+
safeGet(previousBundle, "answers.filingStatus");
|
|
125
|
+
if (filingStatus !== undefined) {
|
|
126
|
+
prefilled["filingStatus"] = filingStatus;
|
|
127
|
+
fieldsImported.push("filingStatus");
|
|
128
|
+
notes.push(`Last year you filed as "${String(filingStatus)}". Has your filing status changed?`);
|
|
129
|
+
}
|
|
130
|
+
// --- Dependents ---
|
|
131
|
+
const dependents = safeGet(previousBundle, "dependents") ??
|
|
132
|
+
safeGet(previousBundle, "answers.dependents") ??
|
|
133
|
+
safeGet(previousBundle, "household");
|
|
134
|
+
if (Array.isArray(dependents)) {
|
|
135
|
+
prefilled["dependents"] = dependents;
|
|
136
|
+
fieldsImported.push("dependents");
|
|
137
|
+
notes.push(`Last year you had ${dependents.length} dependent(s). Still correct?`);
|
|
138
|
+
}
|
|
139
|
+
// --- Bank account info (for direct deposit) ---
|
|
140
|
+
const bankAccount = safeGet(previousBundle, "bankAccount") ??
|
|
141
|
+
safeGet(previousBundle, "answers.bankAccount");
|
|
142
|
+
if (bankAccount !== undefined && bankAccount !== null) {
|
|
143
|
+
prefilled["bankAccount"] = bankAccount;
|
|
144
|
+
fieldsImported.push("bankAccount");
|
|
145
|
+
notes.push("Bank account for direct deposit imported. Please verify.");
|
|
146
|
+
}
|
|
147
|
+
// --- Recurring income source labels (not amounts) ---
|
|
148
|
+
const answers = previousBundle["answers"];
|
|
149
|
+
if (answers && typeof answers === "object") {
|
|
150
|
+
const incomeSourceLabels = [];
|
|
151
|
+
// Check for W-2 employers
|
|
152
|
+
const w2s = answers["w2Documents"] ?? answers["w2s"];
|
|
153
|
+
if (Array.isArray(w2s)) {
|
|
154
|
+
for (const w2 of w2s) {
|
|
155
|
+
if (typeof w2 === "object" && w2 !== null) {
|
|
156
|
+
const employer = w2["employerName"];
|
|
157
|
+
if (typeof employer === "string") {
|
|
158
|
+
incomeSourceLabels.push(`W-2: ${employer}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Check for 1099 sources
|
|
164
|
+
const docs1099 = answers["form1099s"] ?? answers["documents"];
|
|
165
|
+
if (Array.isArray(docs1099)) {
|
|
166
|
+
for (const doc of docs1099) {
|
|
167
|
+
if (typeof doc === "object" && doc !== null) {
|
|
168
|
+
const payer = doc["payerName"];
|
|
169
|
+
const docType = doc["type"];
|
|
170
|
+
if (typeof payer === "string") {
|
|
171
|
+
incomeSourceLabels.push(`${typeof docType === "string" ? docType.toUpperCase() : "1099"}: ${payer}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (incomeSourceLabels.length > 0) {
|
|
177
|
+
prefilled["priorIncomeSources"] = incomeSourceLabels;
|
|
178
|
+
fieldsImported.push("priorIncomeSources");
|
|
179
|
+
notes.push(`Found ${incomeSourceLabels.length} income source(s) from last year. ` +
|
|
180
|
+
"Do you still have these same sources?");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// --- Track skipped fields ---
|
|
184
|
+
for (const key of Object.keys(previousBundle)) {
|
|
185
|
+
if (SKIP_FIELDS.has(key) || key in prefilled) {
|
|
186
|
+
if (SKIP_FIELDS.has(key)) {
|
|
187
|
+
fieldsSkipped.push(key);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return { prefilled, fieldsImported, fieldsSkipped, notes };
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../../src/engine/multiyear/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FilingStatus } from "../../types.js";
|
|
2
|
+
export interface FilingStatusComparison {
|
|
3
|
+
statuses: FilingStatusResult[];
|
|
4
|
+
recommended: FilingStatus;
|
|
5
|
+
savings: number;
|
|
6
|
+
explanation: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FilingStatusResult {
|
|
9
|
+
filingStatus: FilingStatus;
|
|
10
|
+
totalTax: number;
|
|
11
|
+
effectiveRate: number;
|
|
12
|
+
refund: number;
|
|
13
|
+
amountOwed: number;
|
|
14
|
+
creditLimitations: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compare MFJ vs MFS for married taxpayers.
|
|
18
|
+
* Shows the actual dollar difference and credits lost under MFS.
|
|
19
|
+
*/
|
|
20
|
+
export declare function compareFilingStatuses(baseInput: Record<string, unknown>, statusesToCompare?: FilingStatus[]): FilingStatusComparison;
|
|
21
|
+
/**
|
|
22
|
+
* Quick check: should a married couple file jointly or separately?
|
|
23
|
+
* Returns a simple recommendation with reasoning.
|
|
24
|
+
*/
|
|
25
|
+
export declare function recommendFilingStatus(baseInput: Record<string, unknown>): {
|
|
26
|
+
recommendation: FilingStatus;
|
|
27
|
+
reason: string;
|
|
28
|
+
savings: number;
|
|
29
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { calculateFederalTax } from "../tax-calculator.js";
|
|
2
|
+
const FILING_STATUS_DISPLAY = {
|
|
3
|
+
single: "Single",
|
|
4
|
+
married_filing_jointly: "Married Filing Jointly",
|
|
5
|
+
married_filing_separately: "Married Filing Separately",
|
|
6
|
+
head_of_household: "Head of Household",
|
|
7
|
+
qualifying_surviving_spouse: "Qualifying Surviving Spouse",
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Compare MFJ vs MFS for married taxpayers.
|
|
11
|
+
* Shows the actual dollar difference and credits lost under MFS.
|
|
12
|
+
*/
|
|
13
|
+
export function compareFilingStatuses(baseInput, statusesToCompare) {
|
|
14
|
+
const statuses = statusesToCompare ?? [
|
|
15
|
+
"married_filing_jointly",
|
|
16
|
+
"married_filing_separately",
|
|
17
|
+
];
|
|
18
|
+
const results = [];
|
|
19
|
+
for (const status of statuses) {
|
|
20
|
+
const modifiedInput = { ...baseInput, filingStatus: status };
|
|
21
|
+
const result = calculateFederalTax(modifiedInput);
|
|
22
|
+
const creditLimitations = [];
|
|
23
|
+
if (status === "married_filing_separately") {
|
|
24
|
+
creditLimitations.push("EITC not available when filing separately");
|
|
25
|
+
creditLimitations.push("Education credits may be reduced or eliminated");
|
|
26
|
+
creditLimitations.push("Child and Dependent Care Credit may be limited");
|
|
27
|
+
creditLimitations.push("Student loan interest deduction not available");
|
|
28
|
+
creditLimitations.push("Standard deduction is half of MFJ amount");
|
|
29
|
+
}
|
|
30
|
+
results.push({
|
|
31
|
+
filingStatus: status,
|
|
32
|
+
totalTax: result.totalTax,
|
|
33
|
+
effectiveRate: result.effectiveRate,
|
|
34
|
+
refund: result.refund,
|
|
35
|
+
amountOwed: result.amountOwed,
|
|
36
|
+
creditLimitations,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Find the best (lowest tax) option
|
|
40
|
+
const sorted = [...results].sort((a, b) => a.totalTax - b.totalTax);
|
|
41
|
+
const best = sorted[0];
|
|
42
|
+
const worst = sorted[sorted.length - 1];
|
|
43
|
+
const savings = Number((worst.totalTax - best.totalTax).toFixed(2));
|
|
44
|
+
const explanation = savings > 0
|
|
45
|
+
? `${FILING_STATUS_DISPLAY[best.filingStatus]} saves $${savings.toLocaleString()} compared to ${FILING_STATUS_DISPLAY[worst.filingStatus]}.`
|
|
46
|
+
: `Both filing statuses result in the same tax liability.`;
|
|
47
|
+
return {
|
|
48
|
+
statuses: results,
|
|
49
|
+
recommended: best.filingStatus,
|
|
50
|
+
savings,
|
|
51
|
+
explanation,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Quick check: should a married couple file jointly or separately?
|
|
56
|
+
* Returns a simple recommendation with reasoning.
|
|
57
|
+
*/
|
|
58
|
+
export function recommendFilingStatus(baseInput) {
|
|
59
|
+
const comparison = compareFilingStatuses(baseInput);
|
|
60
|
+
return {
|
|
61
|
+
recommendation: comparison.recommended,
|
|
62
|
+
reason: comparison.explanation,
|
|
63
|
+
savings: comparison.savings,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=filing-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filing-status.js","sourceRoot":"","sources":["../../../../src/engine/optimizer/filing-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAoB3D,MAAM,qBAAqB,GAAiC;IAC1D,MAAM,EAAE,QAAQ;IAChB,sBAAsB,EAAE,wBAAwB;IAChD,yBAAyB,EAAE,2BAA2B;IACtD,iBAAiB,EAAE,mBAAmB;IACtC,2BAA2B,EAAE,6BAA6B;CAC3D,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAkC,EAClC,iBAAkC;IAElC,MAAM,QAAQ,GAAG,iBAAiB,IAAI;QACpC,wBAAwB;QACxB,2BAA2B;KAC5B,CAAC;IAEF,MAAM,OAAO,GAAyB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,EAAE,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAqE,CAAC,CAAC;QAE1G,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,IAAI,MAAM,KAAK,2BAA2B,EAAE,CAAC;YAC3C,iBAAiB,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACpE,iBAAiB,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YACzE,iBAAiB,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YACzE,iBAAiB,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YACxE,iBAAiB,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,YAAY,EAAE,MAAM;YACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;IAED,oCAAoC;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC;QAC7B,CAAC,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,OAAO,CAAC,cAAc,EAAE,gBAAgB,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG;QAC5I,CAAC,CAAC,wDAAwD,CAAC;IAE7D,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAkC;IAElC,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO;QACL,cAAc,EAAE,UAAU,CAAC,WAAW;QACtC,MAAM,EAAE,UAAU,CAAC,WAAW;QAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FormPlugin, OrchestratorResult, TaxOrchestratorInput } from "./types.js";
|
|
2
|
+
export declare class TaxOrchestrator {
|
|
3
|
+
private plugins;
|
|
4
|
+
/** Register a form plugin. Overwrites any existing plugin with the same formId. */
|
|
5
|
+
register(plugin: FormPlugin): void;
|
|
6
|
+
/** Unregister a plugin by formId. Returns true if it existed. */
|
|
7
|
+
unregister(formId: string): boolean;
|
|
8
|
+
/** List all registered plugin IDs. */
|
|
9
|
+
registeredPlugins(): string[];
|
|
10
|
+
/** Execute the full orchestration pipeline for the given input. */
|
|
11
|
+
execute(input: TaxOrchestratorInput): OrchestratorResult;
|
|
12
|
+
private topologicalSort;
|
|
13
|
+
}
|
|
14
|
+
export declare const defaultOrchestrator: TaxOrchestrator;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Tax Orchestrator
|
|
3
|
+
//
|
|
4
|
+
// Manages a registry of FormPlugin instances, determines which are triggered
|
|
5
|
+
// for a given input, resolves their dependency order via topological sort,
|
|
6
|
+
// and executes them in sequence — collecting results, validation checks, and
|
|
7
|
+
// merged form-line mappings along the way.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export class TaxOrchestrator {
|
|
10
|
+
plugins = new Map();
|
|
11
|
+
/** Register a form plugin. Overwrites any existing plugin with the same formId. */
|
|
12
|
+
register(plugin) {
|
|
13
|
+
this.plugins.set(plugin.formId, plugin);
|
|
14
|
+
}
|
|
15
|
+
/** Unregister a plugin by formId. Returns true if it existed. */
|
|
16
|
+
unregister(formId) {
|
|
17
|
+
return this.plugins.delete(formId);
|
|
18
|
+
}
|
|
19
|
+
/** List all registered plugin IDs. */
|
|
20
|
+
registeredPlugins() {
|
|
21
|
+
return [...this.plugins.keys()];
|
|
22
|
+
}
|
|
23
|
+
/** Execute the full orchestration pipeline for the given input. */
|
|
24
|
+
execute(input) {
|
|
25
|
+
// 1. The core-1040 plugin must be registered — it is the root of every return.
|
|
26
|
+
const corePlugin = this.plugins.get("core-1040");
|
|
27
|
+
if (!corePlugin) {
|
|
28
|
+
throw new Error("TaxOrchestrator: 'core-1040' plugin is not registered. " +
|
|
29
|
+
"Register it before calling execute().");
|
|
30
|
+
}
|
|
31
|
+
// 2. Determine which plugins are triggered.
|
|
32
|
+
const triggeredIds = [];
|
|
33
|
+
for (const [id, plugin] of this.plugins) {
|
|
34
|
+
if (plugin.triggerCondition(input)) {
|
|
35
|
+
triggeredIds.push(id);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 3. Topologically sort triggered plugins by their dependencies.
|
|
39
|
+
const sortedIds = this.topologicalSort(triggeredIds);
|
|
40
|
+
// 4. Execute each plugin in dependency order.
|
|
41
|
+
const intermediateResults = new Map();
|
|
42
|
+
const allValidationChecks = [];
|
|
43
|
+
const formLinesMerged = {};
|
|
44
|
+
let coreResult = undefined;
|
|
45
|
+
for (const id of sortedIds) {
|
|
46
|
+
const plugin = this.plugins.get(id);
|
|
47
|
+
const result = plugin.calculate(input, intermediateResults);
|
|
48
|
+
intermediateResults.set(id, result);
|
|
49
|
+
if (id === "core-1040") {
|
|
50
|
+
coreResult = result;
|
|
51
|
+
}
|
|
52
|
+
// Collect validation checks.
|
|
53
|
+
const checks = plugin.validate(result, input);
|
|
54
|
+
allValidationChecks.push(...checks);
|
|
55
|
+
// Merge form lines.
|
|
56
|
+
const lines = plugin.mapToFormLines(result);
|
|
57
|
+
for (const [key, value] of Object.entries(lines)) {
|
|
58
|
+
formLinesMerged[key] = value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
coreResult,
|
|
63
|
+
formResults: intermediateResults,
|
|
64
|
+
allValidationChecks,
|
|
65
|
+
triggeredForms: sortedIds,
|
|
66
|
+
formLinesMerged,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// -------------------------------------------------------------------------
|
|
70
|
+
// Topological sort via Kahn's algorithm.
|
|
71
|
+
//
|
|
72
|
+
// Only considers plugins that are in the `pluginIds` set. If a dependency
|
|
73
|
+
// is listed but not triggered (and not in the set), it is ignored — this
|
|
74
|
+
// lets optional upstream plugins stay out of the graph when not needed.
|
|
75
|
+
// -------------------------------------------------------------------------
|
|
76
|
+
topologicalSort(pluginIds) {
|
|
77
|
+
const idSet = new Set(pluginIds);
|
|
78
|
+
// Build adjacency list and in-degree map for the triggered subset.
|
|
79
|
+
const inDegree = new Map();
|
|
80
|
+
const dependents = new Map(); // dependency -> [plugins that depend on it]
|
|
81
|
+
for (const id of idSet) {
|
|
82
|
+
if (!inDegree.has(id)) {
|
|
83
|
+
inDegree.set(id, 0);
|
|
84
|
+
}
|
|
85
|
+
if (!dependents.has(id)) {
|
|
86
|
+
dependents.set(id, []);
|
|
87
|
+
}
|
|
88
|
+
const plugin = this.plugins.get(id);
|
|
89
|
+
if (!plugin) {
|
|
90
|
+
throw new Error(`TaxOrchestrator: plugin '${id}' is triggered but not registered.`);
|
|
91
|
+
}
|
|
92
|
+
for (const dep of plugin.dependencies) {
|
|
93
|
+
if (!idSet.has(dep)) {
|
|
94
|
+
// Dependency not triggered — skip it (the plugin will receive
|
|
95
|
+
// no intermediate result for that dep, which is fine if it's optional).
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
inDegree.set(id, (inDegree.get(id) ?? 0) + 1);
|
|
99
|
+
if (!dependents.has(dep)) {
|
|
100
|
+
dependents.set(dep, []);
|
|
101
|
+
}
|
|
102
|
+
dependents.get(dep).push(id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Seed queue with zero-in-degree nodes.
|
|
106
|
+
const queue = [];
|
|
107
|
+
for (const [id, degree] of inDegree) {
|
|
108
|
+
if (degree === 0) {
|
|
109
|
+
queue.push(id);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const sorted = [];
|
|
113
|
+
while (queue.length > 0) {
|
|
114
|
+
const current = queue.shift();
|
|
115
|
+
sorted.push(current);
|
|
116
|
+
for (const dependent of dependents.get(current) ?? []) {
|
|
117
|
+
const newDegree = (inDegree.get(dependent) ?? 1) - 1;
|
|
118
|
+
inDegree.set(dependent, newDegree);
|
|
119
|
+
if (newDegree === 0) {
|
|
120
|
+
queue.push(dependent);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (sorted.length !== idSet.size) {
|
|
125
|
+
const remaining = [...idSet].filter((id) => !sorted.includes(id));
|
|
126
|
+
throw new Error(`TaxOrchestrator: dependency cycle detected among plugins: ${remaining.join(", ")}`);
|
|
127
|
+
}
|
|
128
|
+
return sorted;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Default singleton orchestrator — plugins register themselves on import.
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
export const defaultOrchestrator = new TaxOrchestrator();
|
|
135
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/engine/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TaxCalculationResult } from "../tax-calculator.js";
|
|
2
|
+
export interface WhatIfScenario {
|
|
3
|
+
label: string;
|
|
4
|
+
modifications: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface WhatIfComparison {
|
|
7
|
+
baseCase: ScenarioResult;
|
|
8
|
+
scenarios: ScenarioResult[];
|
|
9
|
+
bestScenario: string;
|
|
10
|
+
maxSavings: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ScenarioResult {
|
|
13
|
+
label: string;
|
|
14
|
+
federalTax: number;
|
|
15
|
+
effectiveRate: number;
|
|
16
|
+
refund: number;
|
|
17
|
+
amountOwed: number;
|
|
18
|
+
deltaFromBase: number;
|
|
19
|
+
deltaLabel: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Compare multiple tax scenarios against a base case.
|
|
23
|
+
* Each scenario modifies one or more fields of the base input.
|
|
24
|
+
*/
|
|
25
|
+
export declare function compareScenarios(baseInput: Record<string, unknown>, scenarios: WhatIfScenario[]): WhatIfComparison;
|
|
26
|
+
/**
|
|
27
|
+
* Quick scenario: "What if I contribute $X more to retirement?"
|
|
28
|
+
*/
|
|
29
|
+
export declare function whatIfRetirementContribution(baseInput: Record<string, unknown>, additionalContribution: number): WhatIfComparison;
|
|
30
|
+
/**
|
|
31
|
+
* Quick scenario: "What if I earn $X more?"
|
|
32
|
+
*/
|
|
33
|
+
export declare function whatIfAdditionalIncome(baseInput: Record<string, unknown>, additionalIncome: number): WhatIfComparison;
|
|
34
|
+
export type { TaxCalculationResult };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { calculateFederalTax } from "../tax-calculator.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compare multiple tax scenarios against a base case.
|
|
4
|
+
* Each scenario modifies one or more fields of the base input.
|
|
5
|
+
*/
|
|
6
|
+
export function compareScenarios(baseInput, scenarios) {
|
|
7
|
+
const baseResult = calculateFederalTax(baseInput);
|
|
8
|
+
const baseSummary = summarizeResult("Base case", baseResult, 0);
|
|
9
|
+
const scenarioResults = [];
|
|
10
|
+
for (const scenario of scenarios) {
|
|
11
|
+
const modifiedInput = { ...baseInput, ...scenario.modifications };
|
|
12
|
+
// Deep merge adjustments if present
|
|
13
|
+
if (scenario.modifications.adjustments && baseInput.adjustments) {
|
|
14
|
+
modifiedInput.adjustments = {
|
|
15
|
+
...baseInput.adjustments,
|
|
16
|
+
...scenario.modifications.adjustments,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const result = calculateFederalTax(modifiedInput);
|
|
20
|
+
const delta = result.totalTax - baseResult.totalTax;
|
|
21
|
+
scenarioResults.push(summarizeResult(scenario.label, result, delta));
|
|
22
|
+
}
|
|
23
|
+
const bestScenario = scenarioResults.reduce((best, current) => current.deltaFromBase < best.deltaFromBase ? current : best, scenarioResults[0]);
|
|
24
|
+
return {
|
|
25
|
+
baseCase: baseSummary,
|
|
26
|
+
scenarios: scenarioResults,
|
|
27
|
+
bestScenario: bestScenario.label,
|
|
28
|
+
maxSavings: Math.abs(Math.min(0, bestScenario.deltaFromBase)),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function summarizeResult(label, result, delta) {
|
|
32
|
+
return {
|
|
33
|
+
label,
|
|
34
|
+
federalTax: result.totalTax,
|
|
35
|
+
effectiveRate: result.effectiveRate,
|
|
36
|
+
refund: result.refund,
|
|
37
|
+
amountOwed: result.amountOwed,
|
|
38
|
+
deltaFromBase: Number(delta.toFixed(2)),
|
|
39
|
+
deltaLabel: delta === 0 ? "no change" : delta > 0 ? `+$${delta.toFixed(2)} more tax` : `-$${Math.abs(delta).toFixed(2)} less tax`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Quick scenario: "What if I contribute $X more to retirement?"
|
|
44
|
+
*/
|
|
45
|
+
export function whatIfRetirementContribution(baseInput, additionalContribution) {
|
|
46
|
+
return compareScenarios(baseInput, [
|
|
47
|
+
{
|
|
48
|
+
label: `Additional $${additionalContribution.toLocaleString()} retirement contribution`,
|
|
49
|
+
modifications: {
|
|
50
|
+
adjustments: {
|
|
51
|
+
iraDeduction: (baseInput.adjustments?.iraDeduction ?? 0) + additionalContribution,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Quick scenario: "What if I earn $X more?"
|
|
59
|
+
*/
|
|
60
|
+
export function whatIfAdditionalIncome(baseInput, additionalIncome) {
|
|
61
|
+
return compareScenarios(baseInput, [
|
|
62
|
+
{
|
|
63
|
+
label: `Additional $${additionalIncome.toLocaleString()} income`,
|
|
64
|
+
modifications: {
|
|
65
|
+
wages: (baseInput.wages ?? 0) + additionalIncome,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=whatif.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatif.js","sourceRoot":"","sources":["../../../../src/engine/scenarios/whatif.ts"],"names":[],"mappings":"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"}
|