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.
Files changed (571) hide show
  1. package/AGENTS.md +258 -0
  2. package/LICENSE +21 -0
  3. package/PRIVACY.md +38 -0
  4. package/README.md +234 -0
  5. package/agents.json +72 -0
  6. package/dist/bin/pigeongov.d.ts +2 -0
  7. package/dist/bin/pigeongov.js +4 -0
  8. package/dist/bin/pigeongov.js.map +1 -0
  9. package/dist/src/advisory/decision-support/contribution-optimizer.d.ts +36 -0
  10. package/dist/src/advisory/decision-support/contribution-optimizer.js +88 -0
  11. package/dist/src/advisory/decision-support/contribution-optimizer.js.map +1 -0
  12. package/dist/src/advisory/decision-support/deduction-optimizer.d.ts +31 -0
  13. package/dist/src/advisory/decision-support/deduction-optimizer.js +96 -0
  14. package/dist/src/advisory/decision-support/deduction-optimizer.js.map +1 -0
  15. package/dist/src/advisory/life-events/events.d.ts +4 -0
  16. package/dist/src/advisory/life-events/events.js +156 -0
  17. package/dist/src/advisory/life-events/events.js.map +1 -0
  18. package/dist/src/advisory/life-events/planner.d.ts +19 -0
  19. package/dist/src/advisory/life-events/planner.js +72 -0
  20. package/dist/src/advisory/life-events/planner.js.map +1 -0
  21. package/dist/src/advisory/screener/engine.d.ts +4 -0
  22. package/dist/src/advisory/screener/engine.js +368 -0
  23. package/dist/src/advisory/screener/engine.js.map +1 -0
  24. package/dist/src/advisory/screener/intake.d.ts +68 -0
  25. package/dist/src/advisory/screener/intake.js +93 -0
  26. package/dist/src/advisory/screener/intake.js.map +1 -0
  27. package/dist/src/analytics/stats.d.ts +18 -0
  28. package/dist/src/analytics/stats.js +158 -0
  29. package/dist/src/analytics/stats.js.map +1 -0
  30. package/dist/src/api/handlers/deadlines.d.ts +2 -0
  31. package/dist/src/api/handlers/deadlines.js +7 -0
  32. package/dist/src/api/handlers/deadlines.js.map +1 -0
  33. package/dist/src/api/handlers/openapi.d.ts +2 -0
  34. package/dist/src/api/handlers/openapi.js +7 -0
  35. package/dist/src/api/handlers/openapi.js.map +1 -0
  36. package/dist/src/api/handlers/workflows.d.ts +5 -0
  37. package/dist/src/api/handlers/workflows.js +73 -0
  38. package/dist/src/api/handlers/workflows.js.map +1 -0
  39. package/dist/src/api/index.d.ts +20 -0
  40. package/dist/src/api/index.js +70 -0
  41. package/dist/src/api/index.js.map +1 -0
  42. package/dist/src/api/openapi.d.ts +5 -0
  43. package/dist/src/api/openapi.js +384 -0
  44. package/dist/src/api/openapi.js.map +1 -0
  45. package/dist/src/api/router.d.ts +19 -0
  46. package/dist/src/api/router.js +57 -0
  47. package/dist/src/api/router.js.map +1 -0
  48. package/dist/src/cli/commands/completions.d.ts +2 -0
  49. package/dist/src/cli/commands/completions.js +396 -0
  50. package/dist/src/cli/commands/completions.js.map +1 -0
  51. package/dist/src/cli/commands/deadlines.d.ts +2 -0
  52. package/dist/src/cli/commands/deadlines.js +47 -0
  53. package/dist/src/cli/commands/deadlines.js.map +1 -0
  54. package/dist/src/cli/commands/doctor.d.ts +2 -0
  55. package/dist/src/cli/commands/doctor.js +50 -0
  56. package/dist/src/cli/commands/doctor.js.map +1 -0
  57. package/dist/src/cli/commands/drafts.d.ts +2 -0
  58. package/dist/src/cli/commands/drafts.js +75 -0
  59. package/dist/src/cli/commands/drafts.js.map +1 -0
  60. package/dist/src/cli/commands/extract.d.ts +2 -0
  61. package/dist/src/cli/commands/extract.js +17 -0
  62. package/dist/src/cli/commands/extract.js.map +1 -0
  63. package/dist/src/cli/commands/fees.d.ts +2 -0
  64. package/dist/src/cli/commands/fees.js +40 -0
  65. package/dist/src/cli/commands/fees.js.map +1 -0
  66. package/dist/src/cli/commands/fill.d.ts +25 -0
  67. package/dist/src/cli/commands/fill.js +354 -0
  68. package/dist/src/cli/commands/fill.js.map +1 -0
  69. package/dist/src/cli/commands/glossary.d.ts +2 -0
  70. package/dist/src/cli/commands/glossary.js +90 -0
  71. package/dist/src/cli/commands/glossary.js.map +1 -0
  72. package/dist/src/cli/commands/life-event.d.ts +2 -0
  73. package/dist/src/cli/commands/life-event.js +41 -0
  74. package/dist/src/cli/commands/life-event.js.map +1 -0
  75. package/dist/src/cli/commands/list.d.ts +2 -0
  76. package/dist/src/cli/commands/list.js +19 -0
  77. package/dist/src/cli/commands/list.js.map +1 -0
  78. package/dist/src/cli/commands/machine.d.ts +2 -0
  79. package/dist/src/cli/commands/machine.js +100 -0
  80. package/dist/src/cli/commands/machine.js.map +1 -0
  81. package/dist/src/cli/commands/merge.d.ts +2 -0
  82. package/dist/src/cli/commands/merge.js +24 -0
  83. package/dist/src/cli/commands/merge.js.map +1 -0
  84. package/dist/src/cli/commands/plugin.d.ts +2 -0
  85. package/dist/src/cli/commands/plugin.js +119 -0
  86. package/dist/src/cli/commands/plugin.js.map +1 -0
  87. package/dist/src/cli/commands/profile.d.ts +2 -0
  88. package/dist/src/cli/commands/profile.js +125 -0
  89. package/dist/src/cli/commands/profile.js.map +1 -0
  90. package/dist/src/cli/commands/review.d.ts +2 -0
  91. package/dist/src/cli/commands/review.js +25 -0
  92. package/dist/src/cli/commands/review.js.map +1 -0
  93. package/dist/src/cli/commands/scaffold.d.ts +2 -0
  94. package/dist/src/cli/commands/scaffold.js +304 -0
  95. package/dist/src/cli/commands/scaffold.js.map +1 -0
  96. package/dist/src/cli/commands/schemas.d.ts +2 -0
  97. package/dist/src/cli/commands/schemas.js +14 -0
  98. package/dist/src/cli/commands/schemas.js.map +1 -0
  99. package/dist/src/cli/commands/screen.d.ts +2 -0
  100. package/dist/src/cli/commands/screen.js +89 -0
  101. package/dist/src/cli/commands/screen.js.map +1 -0
  102. package/dist/src/cli/commands/serve.d.ts +2 -0
  103. package/dist/src/cli/commands/serve.js +46 -0
  104. package/dist/src/cli/commands/serve.js.map +1 -0
  105. package/dist/src/cli/commands/start.d.ts +2 -0
  106. package/dist/src/cli/commands/start.js +16 -0
  107. package/dist/src/cli/commands/start.js.map +1 -0
  108. package/dist/src/cli/commands/stats.d.ts +2 -0
  109. package/dist/src/cli/commands/stats.js +17 -0
  110. package/dist/src/cli/commands/stats.js.map +1 -0
  111. package/dist/src/cli/commands/testdata.d.ts +2 -0
  112. package/dist/src/cli/commands/testdata.js +60 -0
  113. package/dist/src/cli/commands/testdata.js.map +1 -0
  114. package/dist/src/cli/commands/tui.d.ts +2 -0
  115. package/dist/src/cli/commands/tui.js +26 -0
  116. package/dist/src/cli/commands/tui.js.map +1 -0
  117. package/dist/src/cli/commands/validate.d.ts +2 -0
  118. package/dist/src/cli/commands/validate.js +22 -0
  119. package/dist/src/cli/commands/validate.js.map +1 -0
  120. package/dist/src/cli/commands/vault.d.ts +2 -0
  121. package/dist/src/cli/commands/vault.js +73 -0
  122. package/dist/src/cli/commands/vault.js.map +1 -0
  123. package/dist/src/cli/commands/workflows.d.ts +2 -0
  124. package/dist/src/cli/commands/workflows.js +23 -0
  125. package/dist/src/cli/commands/workflows.js.map +1 -0
  126. package/dist/src/cli/display/review.d.ts +2 -0
  127. package/dist/src/cli/display/review.js +4 -0
  128. package/dist/src/cli/display/review.js.map +1 -0
  129. package/dist/src/cli/display/summary.d.ts +2 -0
  130. package/dist/src/cli/display/summary.js +19 -0
  131. package/dist/src/cli/display/summary.js.map +1 -0
  132. package/dist/src/cli/display/validation.d.ts +2 -0
  133. package/dist/src/cli/display/validation.js +16 -0
  134. package/dist/src/cli/display/validation.js.map +1 -0
  135. package/dist/src/cli/index.d.ts +1 -0
  136. package/dist/src/cli/index.js +83 -0
  137. package/dist/src/cli/index.js.map +1 -0
  138. package/dist/src/cli/output.d.ts +21 -0
  139. package/dist/src/cli/output.js +107 -0
  140. package/dist/src/cli/output.js.map +1 -0
  141. package/dist/src/cli/prompts/common.d.ts +21 -0
  142. package/dist/src/cli/prompts/common.js +53 -0
  143. package/dist/src/cli/prompts/common.js.map +1 -0
  144. package/dist/src/cli/prompts/credits.d.ts +3 -0
  145. package/dist/src/cli/prompts/credits.js +23 -0
  146. package/dist/src/cli/prompts/credits.js.map +1 -0
  147. package/dist/src/cli/prompts/deductions.d.ts +12 -0
  148. package/dist/src/cli/prompts/deductions.js +26 -0
  149. package/dist/src/cli/prompts/deductions.js.map +1 -0
  150. package/dist/src/cli/prompts/identity.d.ts +8 -0
  151. package/dist/src/cli/prompts/identity.js +36 -0
  152. package/dist/src/cli/prompts/identity.js.map +1 -0
  153. package/dist/src/cli/prompts/income.d.ts +15 -0
  154. package/dist/src/cli/prompts/income.js +61 -0
  155. package/dist/src/cli/prompts/income.js.map +1 -0
  156. package/dist/src/cli/prompts/workflow.d.ts +3 -0
  157. package/dist/src/cli/prompts/workflow.js +74 -0
  158. package/dist/src/cli/prompts/workflow.js.map +1 -0
  159. package/dist/src/cli/support.d.ts +53 -0
  160. package/dist/src/cli/support.js +80 -0
  161. package/dist/src/cli/support.js.map +1 -0
  162. package/dist/src/cli/tui.d.ts +22 -0
  163. package/dist/src/cli/tui.js +122 -0
  164. package/dist/src/cli/tui.js.map +1 -0
  165. package/dist/src/engine/audit-risk/scorer.d.ts +36 -0
  166. package/dist/src/engine/audit-risk/scorer.js +132 -0
  167. package/dist/src/engine/audit-risk/scorer.js.map +1 -0
  168. package/dist/src/engine/crypto/cost-basis.d.ts +19 -0
  169. package/dist/src/engine/crypto/cost-basis.js +115 -0
  170. package/dist/src/engine/crypto/cost-basis.js.map +1 -0
  171. package/dist/src/engine/crypto/transaction-parser.d.ts +36 -0
  172. package/dist/src/engine/crypto/transaction-parser.js +124 -0
  173. package/dist/src/engine/crypto/transaction-parser.js.map +1 -0
  174. package/dist/src/engine/crypto/wash-sale.d.ts +25 -0
  175. package/dist/src/engine/crypto/wash-sale.js +51 -0
  176. package/dist/src/engine/crypto/wash-sale.js.map +1 -0
  177. package/dist/src/engine/equity/espp.d.ts +41 -0
  178. package/dist/src/engine/equity/espp.js +90 -0
  179. package/dist/src/engine/equity/espp.js.map +1 -0
  180. package/dist/src/engine/equity/iso.d.ts +42 -0
  181. package/dist/src/engine/equity/iso.js +94 -0
  182. package/dist/src/engine/equity/iso.js.map +1 -0
  183. package/dist/src/engine/equity/nso.d.ts +35 -0
  184. package/dist/src/engine/equity/nso.js +63 -0
  185. package/dist/src/engine/equity/nso.js.map +1 -0
  186. package/dist/src/engine/equity/rsu.d.ts +33 -0
  187. package/dist/src/engine/equity/rsu.js +64 -0
  188. package/dist/src/engine/equity/rsu.js.map +1 -0
  189. package/dist/src/engine/field-mapper.d.ts +26 -0
  190. package/dist/src/engine/field-mapper.js +119 -0
  191. package/dist/src/engine/field-mapper.js.map +1 -0
  192. package/dist/src/engine/forms/core-1040.d.ts +2 -0
  193. package/dist/src/engine/forms/core-1040.js +124 -0
  194. package/dist/src/engine/forms/core-1040.js.map +1 -0
  195. package/dist/src/engine/forms/form-8949.d.ts +21 -0
  196. package/dist/src/engine/forms/form-8949.js +96 -0
  197. package/dist/src/engine/forms/form-8949.js.map +1 -0
  198. package/dist/src/engine/forms/index.d.ts +7 -0
  199. package/dist/src/engine/forms/index.js +6 -0
  200. package/dist/src/engine/forms/index.js.map +1 -0
  201. package/dist/src/engine/forms/schedule-b.d.ts +15 -0
  202. package/dist/src/engine/forms/schedule-b.js +78 -0
  203. package/dist/src/engine/forms/schedule-b.js.map +1 -0
  204. package/dist/src/engine/forms/schedule-d.d.ts +9 -0
  205. package/dist/src/engine/forms/schedule-d.js +86 -0
  206. package/dist/src/engine/forms/schedule-d.js.map +1 -0
  207. package/dist/src/engine/fpl.d.ts +70 -0
  208. package/dist/src/engine/fpl.js +127 -0
  209. package/dist/src/engine/fpl.js.map +1 -0
  210. package/dist/src/engine/gig/home-office.d.ts +34 -0
  211. package/dist/src/engine/gig/home-office.js +53 -0
  212. package/dist/src/engine/gig/home-office.js.map +1 -0
  213. package/dist/src/engine/gig/mileage.d.ts +30 -0
  214. package/dist/src/engine/gig/mileage.js +45 -0
  215. package/dist/src/engine/gig/mileage.js.map +1 -0
  216. package/dist/src/engine/gig/multi-1099.d.ts +19 -0
  217. package/dist/src/engine/gig/multi-1099.js +28 -0
  218. package/dist/src/engine/gig/multi-1099.js.map +1 -0
  219. package/dist/src/engine/multiyear/carryforward.d.ts +31 -0
  220. package/dist/src/engine/multiyear/carryforward.js +77 -0
  221. package/dist/src/engine/multiyear/carryforward.js.map +1 -0
  222. package/dist/src/engine/multiyear/compare.d.ts +25 -0
  223. package/dist/src/engine/multiyear/compare.js +94 -0
  224. package/dist/src/engine/multiyear/compare.js.map +1 -0
  225. package/dist/src/engine/multiyear/import.d.ts +23 -0
  226. package/dist/src/engine/multiyear/import.js +193 -0
  227. package/dist/src/engine/multiyear/import.js.map +1 -0
  228. package/dist/src/engine/optimizer/filing-status.d.ts +29 -0
  229. package/dist/src/engine/optimizer/filing-status.js +66 -0
  230. package/dist/src/engine/optimizer/filing-status.js.map +1 -0
  231. package/dist/src/engine/orchestrator.d.ts +14 -0
  232. package/dist/src/engine/orchestrator.js +135 -0
  233. package/dist/src/engine/orchestrator.js.map +1 -0
  234. package/dist/src/engine/scenarios/whatif.d.ts +34 -0
  235. package/dist/src/engine/scenarios/whatif.js +70 -0
  236. package/dist/src/engine/scenarios/whatif.js.map +1 -0
  237. package/dist/src/engine/state/ca/calculator.d.ts +3 -0
  238. package/dist/src/engine/state/ca/calculator.js +107 -0
  239. package/dist/src/engine/state/ca/calculator.js.map +1 -0
  240. package/dist/src/engine/state/common.d.ts +39 -0
  241. package/dist/src/engine/state/common.js +115 -0
  242. package/dist/src/engine/state/common.js.map +1 -0
  243. package/dist/src/engine/state/ga/calculator.d.ts +3 -0
  244. package/dist/src/engine/state/ga/calculator.js +82 -0
  245. package/dist/src/engine/state/ga/calculator.js.map +1 -0
  246. package/dist/src/engine/state/il/calculator.d.ts +3 -0
  247. package/dist/src/engine/state/il/calculator.js +49 -0
  248. package/dist/src/engine/state/il/calculator.js.map +1 -0
  249. package/dist/src/engine/state/mi/calculator.d.ts +3 -0
  250. package/dist/src/engine/state/mi/calculator.js +60 -0
  251. package/dist/src/engine/state/mi/calculator.js.map +1 -0
  252. package/dist/src/engine/state/nc/calculator.d.ts +3 -0
  253. package/dist/src/engine/state/nc/calculator.js +54 -0
  254. package/dist/src/engine/state/nc/calculator.js.map +1 -0
  255. package/dist/src/engine/state/nj/calculator.d.ts +3 -0
  256. package/dist/src/engine/state/nj/calculator.js +90 -0
  257. package/dist/src/engine/state/nj/calculator.js.map +1 -0
  258. package/dist/src/engine/state/ny/calculator.d.ts +3 -0
  259. package/dist/src/engine/state/ny/calculator.js +103 -0
  260. package/dist/src/engine/state/ny/calculator.js.map +1 -0
  261. package/dist/src/engine/state/oh/calculator.d.ts +3 -0
  262. package/dist/src/engine/state/oh/calculator.js +79 -0
  263. package/dist/src/engine/state/oh/calculator.js.map +1 -0
  264. package/dist/src/engine/state/pa/calculator.d.ts +3 -0
  265. package/dist/src/engine/state/pa/calculator.js +58 -0
  266. package/dist/src/engine/state/pa/calculator.js.map +1 -0
  267. package/dist/src/engine/state/registry.d.ts +9 -0
  268. package/dist/src/engine/state/registry.js +67 -0
  269. package/dist/src/engine/state/registry.js.map +1 -0
  270. package/dist/src/engine/state/types.d.ts +57 -0
  271. package/dist/src/engine/state/types.js +2 -0
  272. package/dist/src/engine/state/types.js.map +1 -0
  273. package/dist/src/engine/state/va/calculator.d.ts +3 -0
  274. package/dist/src/engine/state/va/calculator.js +76 -0
  275. package/dist/src/engine/state/va/calculator.js.map +1 -0
  276. package/dist/src/engine/suggestions/missed-deductions.d.ts +43 -0
  277. package/dist/src/engine/suggestions/missed-deductions.js +128 -0
  278. package/dist/src/engine/suggestions/missed-deductions.js.map +1 -0
  279. package/dist/src/engine/tax-calculator.d.ts +55 -0
  280. package/dist/src/engine/tax-calculator.js +156 -0
  281. package/dist/src/engine/tax-calculator.js.map +1 -0
  282. package/dist/src/engine/tax-constants-2025.d.ts +56 -0
  283. package/dist/src/engine/tax-constants-2025.js +138 -0
  284. package/dist/src/engine/tax-constants-2025.js.map +1 -0
  285. package/dist/src/engine/types.d.ts +77 -0
  286. package/dist/src/engine/types.js +2 -0
  287. package/dist/src/engine/types.js.map +1 -0
  288. package/dist/src/engine/va-math.d.ts +24 -0
  289. package/dist/src/engine/va-math.js +90 -0
  290. package/dist/src/engine/va-math.js.map +1 -0
  291. package/dist/src/engine/validator.d.ts +7 -0
  292. package/dist/src/engine/validator.js +108 -0
  293. package/dist/src/engine/validator.js.map +1 -0
  294. package/dist/src/glossary/entries/healthcare.d.ts +2 -0
  295. package/dist/src/glossary/entries/healthcare.js +78 -0
  296. package/dist/src/glossary/entries/healthcare.js.map +1 -0
  297. package/dist/src/glossary/entries/immigration.d.ts +2 -0
  298. package/dist/src/glossary/entries/immigration.js +112 -0
  299. package/dist/src/glossary/entries/immigration.js.map +1 -0
  300. package/dist/src/glossary/entries/tax.d.ts +2 -0
  301. package/dist/src/glossary/entries/tax.js +149 -0
  302. package/dist/src/glossary/entries/tax.js.map +1 -0
  303. package/dist/src/glossary/entries/unemployment.d.ts +2 -0
  304. package/dist/src/glossary/entries/unemployment.js +52 -0
  305. package/dist/src/glossary/entries/unemployment.js.map +1 -0
  306. package/dist/src/glossary/index.d.ts +19 -0
  307. package/dist/src/glossary/index.js +39 -0
  308. package/dist/src/glossary/index.js.map +1 -0
  309. package/dist/src/i18n/index.d.ts +21 -0
  310. package/dist/src/i18n/index.js +92 -0
  311. package/dist/src/i18n/index.js.map +1 -0
  312. package/dist/src/mcp/result.d.ts +3 -0
  313. package/dist/src/mcp/result.js +7 -0
  314. package/dist/src/mcp/result.js.map +1 -0
  315. package/dist/src/mcp/return-bundle.d.ts +19 -0
  316. package/dist/src/mcp/return-bundle.js +49 -0
  317. package/dist/src/mcp/return-bundle.js.map +1 -0
  318. package/dist/src/mcp/shared.d.ts +49102 -0
  319. package/dist/src/mcp/shared.js +354 -0
  320. package/dist/src/mcp/shared.js.map +1 -0
  321. package/dist/src/mcp/tools/build-packet.d.ts +7 -0
  322. package/dist/src/mcp/tools/build-packet.js +23 -0
  323. package/dist/src/mcp/tools/build-packet.js.map +1 -0
  324. package/dist/src/mcp/tools/calculate-tax.d.ts +40 -0
  325. package/dist/src/mcp/tools/calculate-tax.js +17 -0
  326. package/dist/src/mcp/tools/calculate-tax.js.map +1 -0
  327. package/dist/src/mcp/tools/deadlines.d.ts +7 -0
  328. package/dist/src/mcp/tools/deadlines.js +23 -0
  329. package/dist/src/mcp/tools/deadlines.js.map +1 -0
  330. package/dist/src/mcp/tools/describe-form.d.ts +14 -0
  331. package/dist/src/mcp/tools/describe-form.js +23 -0
  332. package/dist/src/mcp/tools/describe-form.js.map +1 -0
  333. package/dist/src/mcp/tools/describe-workflow.d.ts +6 -0
  334. package/dist/src/mcp/tools/describe-workflow.js +16 -0
  335. package/dist/src/mcp/tools/describe-workflow.js.map +1 -0
  336. package/dist/src/mcp/tools/explain-flag.d.ts +7 -0
  337. package/dist/src/mcp/tools/explain-flag.js +19 -0
  338. package/dist/src/mcp/tools/explain-flag.js.map +1 -0
  339. package/dist/src/mcp/tools/extract-document.d.ts +13 -0
  340. package/dist/src/mcp/tools/extract-document.js +20 -0
  341. package/dist/src/mcp/tools/extract-document.js.map +1 -0
  342. package/dist/src/mcp/tools/fees.d.ts +7 -0
  343. package/dist/src/mcp/tools/fees.js +24 -0
  344. package/dist/src/mcp/tools/fees.js.map +1 -0
  345. package/dist/src/mcp/tools/fill-form.d.ts +56 -0
  346. package/dist/src/mcp/tools/fill-form.js +47 -0
  347. package/dist/src/mcp/tools/fill-form.js.map +1 -0
  348. package/dist/src/mcp/tools/fill-workflow.d.ts +7 -0
  349. package/dist/src/mcp/tools/fill-workflow.js +24 -0
  350. package/dist/src/mcp/tools/fill-workflow.js.map +1 -0
  351. package/dist/src/mcp/tools/glossary.d.ts +8 -0
  352. package/dist/src/mcp/tools/glossary.js +54 -0
  353. package/dist/src/mcp/tools/glossary.js.map +1 -0
  354. package/dist/src/mcp/tools/list-forms.d.ts +6 -0
  355. package/dist/src/mcp/tools/list-forms.js +15 -0
  356. package/dist/src/mcp/tools/list-forms.js.map +1 -0
  357. package/dist/src/mcp/tools/list-workflows.d.ts +6 -0
  358. package/dist/src/mcp/tools/list-workflows.js +16 -0
  359. package/dist/src/mcp/tools/list-workflows.js.map +1 -0
  360. package/dist/src/mcp/tools/plan-life-event.d.ts +59 -0
  361. package/dist/src/mcp/tools/plan-life-event.js +41 -0
  362. package/dist/src/mcp/tools/plan-life-event.js.map +1 -0
  363. package/dist/src/mcp/tools/review-form.d.ts +40 -0
  364. package/dist/src/mcp/tools/review-form.js +26 -0
  365. package/dist/src/mcp/tools/review-form.js.map +1 -0
  366. package/dist/src/mcp/tools/review-workflow.d.ts +7 -0
  367. package/dist/src/mcp/tools/review-workflow.js +27 -0
  368. package/dist/src/mcp/tools/review-workflow.js.map +1 -0
  369. package/dist/src/mcp/tools/screen-eligibility.d.ts +53 -0
  370. package/dist/src/mcp/tools/screen-eligibility.js +44 -0
  371. package/dist/src/mcp/tools/screen-eligibility.js.map +1 -0
  372. package/dist/src/mcp/tools/start-workflow.d.ts +6 -0
  373. package/dist/src/mcp/tools/start-workflow.js +17 -0
  374. package/dist/src/mcp/tools/start-workflow.js.map +1 -0
  375. package/dist/src/mcp/tools/validate-form.d.ts +48 -0
  376. package/dist/src/mcp/tools/validate-form.js +30 -0
  377. package/dist/src/mcp/tools/validate-form.js.map +1 -0
  378. package/dist/src/mcp/tools/validate-workflow.d.ts +7 -0
  379. package/dist/src/mcp/tools/validate-workflow.js +24 -0
  380. package/dist/src/mcp/tools/validate-workflow.js.map +1 -0
  381. package/dist/src/pdf/batch.d.ts +8 -0
  382. package/dist/src/pdf/batch.js +15 -0
  383. package/dist/src/pdf/batch.js.map +1 -0
  384. package/dist/src/pdf/merge.d.ts +10 -0
  385. package/dist/src/pdf/merge.js +62 -0
  386. package/dist/src/pdf/merge.js.map +1 -0
  387. package/dist/src/pdf/ocr.d.ts +22 -0
  388. package/dist/src/pdf/ocr.js +52 -0
  389. package/dist/src/pdf/ocr.js.map +1 -0
  390. package/dist/src/pdf/reader.d.ts +2 -0
  391. package/dist/src/pdf/reader.js +354 -0
  392. package/dist/src/pdf/reader.js.map +1 -0
  393. package/dist/src/pdf/shared.d.ts +89 -0
  394. package/dist/src/pdf/shared.js +137 -0
  395. package/dist/src/pdf/shared.js.map +1 -0
  396. package/dist/src/pdf/writer.d.ts +7 -0
  397. package/dist/src/pdf/writer.js +311 -0
  398. package/dist/src/pdf/writer.js.map +1 -0
  399. package/dist/src/plugins/loader.d.ts +15 -0
  400. package/dist/src/plugins/loader.js +86 -0
  401. package/dist/src/plugins/loader.js.map +1 -0
  402. package/dist/src/plugins/sandbox.d.ts +14 -0
  403. package/dist/src/plugins/sandbox.js +88 -0
  404. package/dist/src/plugins/sandbox.js.map +1 -0
  405. package/dist/src/plugins/types.d.ts +17 -0
  406. package/dist/src/plugins/types.js +13 -0
  407. package/dist/src/plugins/types.js.map +1 -0
  408. package/dist/src/schemas/2025/f1040.d.ts +127 -0
  409. package/dist/src/schemas/2025/f1040.js +104 -0
  410. package/dist/src/schemas/2025/f1040.js.map +1 -0
  411. package/dist/src/schemas/2025/f1099-int.d.ts +53 -0
  412. package/dist/src/schemas/2025/f1099-int.js +51 -0
  413. package/dist/src/schemas/2025/f1099-int.js.map +1 -0
  414. package/dist/src/schemas/2025/f1099-nec.d.ts +47 -0
  415. package/dist/src/schemas/2025/f1099-nec.js +45 -0
  416. package/dist/src/schemas/2025/f1099-nec.js.map +1 -0
  417. package/dist/src/schemas/2025/form-8949.d.ts +46 -0
  418. package/dist/src/schemas/2025/form-8949.js +71 -0
  419. package/dist/src/schemas/2025/form-8949.js.map +1 -0
  420. package/dist/src/schemas/2025/index.d.ts +1004 -0
  421. package/dist/src/schemas/2025/index.js +60 -0
  422. package/dist/src/schemas/2025/index.js.map +1 -0
  423. package/dist/src/schemas/2025/schedule-1.d.ts +44 -0
  424. package/dist/src/schemas/2025/schedule-1.js +56 -0
  425. package/dist/src/schemas/2025/schedule-1.js.map +1 -0
  426. package/dist/src/schemas/2025/schedule-b.d.ts +32 -0
  427. package/dist/src/schemas/2025/schedule-b.js +53 -0
  428. package/dist/src/schemas/2025/schedule-b.js.map +1 -0
  429. package/dist/src/schemas/2025/schedule-c.d.ts +58 -0
  430. package/dist/src/schemas/2025/schedule-c.js +46 -0
  431. package/dist/src/schemas/2025/schedule-c.js.map +1 -0
  432. package/dist/src/schemas/2025/schedule-d.d.ts +36 -0
  433. package/dist/src/schemas/2025/schedule-d.js +52 -0
  434. package/dist/src/schemas/2025/schedule-d.js.map +1 -0
  435. package/dist/src/schemas/2025/shared.d.ts +98 -0
  436. package/dist/src/schemas/2025/shared.js +161 -0
  437. package/dist/src/schemas/2025/shared.js.map +1 -0
  438. package/dist/src/schemas/2025/w2.d.ts +57 -0
  439. package/dist/src/schemas/2025/w2.js +62 -0
  440. package/dist/src/schemas/2025/w2.js.map +1 -0
  441. package/dist/src/storage/drafts.d.ts +25 -0
  442. package/dist/src/storage/drafts.js +117 -0
  443. package/dist/src/storage/drafts.js.map +1 -0
  444. package/dist/src/storage/paths.d.ts +15 -0
  445. package/dist/src/storage/paths.js +33 -0
  446. package/dist/src/storage/paths.js.map +1 -0
  447. package/dist/src/storage/profile.d.ts +17 -0
  448. package/dist/src/storage/profile.js +59 -0
  449. package/dist/src/storage/profile.js.map +1 -0
  450. package/dist/src/storage/vault.d.ts +38 -0
  451. package/dist/src/storage/vault.js +187 -0
  452. package/dist/src/storage/vault.js.map +1 -0
  453. package/dist/src/testing/synthetic.d.ts +13 -0
  454. package/dist/src/testing/synthetic.js +164 -0
  455. package/dist/src/testing/synthetic.js.map +1 -0
  456. package/dist/src/types.d.ts +362 -0
  457. package/dist/src/types.js +2 -0
  458. package/dist/src/types.js.map +1 -0
  459. package/dist/src/workflows/deadlines.d.ts +13 -0
  460. package/dist/src/workflows/deadlines.js +88 -0
  461. package/dist/src/workflows/deadlines.js.map +1 -0
  462. package/dist/src/workflows/domains/benefits.d.ts +409 -0
  463. package/dist/src/workflows/domains/benefits.js +744 -0
  464. package/dist/src/workflows/domains/benefits.js.map +1 -0
  465. package/dist/src/workflows/domains/business.d.ts +65 -0
  466. package/dist/src/workflows/domains/business.js +76 -0
  467. package/dist/src/workflows/domains/business.js.map +1 -0
  468. package/dist/src/workflows/domains/education.d.ts +251 -0
  469. package/dist/src/workflows/domains/education.js +504 -0
  470. package/dist/src/workflows/domains/education.js.map +1 -0
  471. package/dist/src/workflows/domains/estate.d.ts +217 -0
  472. package/dist/src/workflows/domains/estate.js +407 -0
  473. package/dist/src/workflows/domains/estate.js.map +1 -0
  474. package/dist/src/workflows/domains/healthcare-ext.d.ts +88 -0
  475. package/dist/src/workflows/domains/healthcare-ext.js +150 -0
  476. package/dist/src/workflows/domains/healthcare-ext.js.map +1 -0
  477. package/dist/src/workflows/domains/healthcare.d.ts +92 -0
  478. package/dist/src/workflows/domains/healthcare.js +126 -0
  479. package/dist/src/workflows/domains/healthcare.js.map +1 -0
  480. package/dist/src/workflows/domains/identity-domain.d.ts +291 -0
  481. package/dist/src/workflows/domains/identity-domain.js +541 -0
  482. package/dist/src/workflows/domains/identity-domain.js.map +1 -0
  483. package/dist/src/workflows/domains/immigration-ext.d.ts +282 -0
  484. package/dist/src/workflows/domains/immigration-ext.js +590 -0
  485. package/dist/src/workflows/domains/immigration-ext.js.map +1 -0
  486. package/dist/src/workflows/domains/immigration.d.ts +121 -0
  487. package/dist/src/workflows/domains/immigration.js +152 -0
  488. package/dist/src/workflows/domains/immigration.js.map +1 -0
  489. package/dist/src/workflows/domains/legal.d.ts +235 -0
  490. package/dist/src/workflows/domains/legal.js +380 -0
  491. package/dist/src/workflows/domains/legal.js.map +1 -0
  492. package/dist/src/workflows/domains/permits.d.ts +65 -0
  493. package/dist/src/workflows/domains/permits.js +74 -0
  494. package/dist/src/workflows/domains/permits.js.map +1 -0
  495. package/dist/src/workflows/domains/retirement.d.ts +59 -0
  496. package/dist/src/workflows/domains/retirement.js +155 -0
  497. package/dist/src/workflows/domains/retirement.js.map +1 -0
  498. package/dist/src/workflows/domains/tax.d.ts +133 -0
  499. package/dist/src/workflows/domains/tax.js +187 -0
  500. package/dist/src/workflows/domains/tax.js.map +1 -0
  501. package/dist/src/workflows/domains/unemployment.d.ts +105 -0
  502. package/dist/src/workflows/domains/unemployment.js +122 -0
  503. package/dist/src/workflows/domains/unemployment.js.map +1 -0
  504. package/dist/src/workflows/domains/veterans.d.ts +189 -0
  505. package/dist/src/workflows/domains/veterans.js +380 -0
  506. package/dist/src/workflows/domains/veterans.js.map +1 -0
  507. package/dist/src/workflows/fees.d.ts +15 -0
  508. package/dist/src/workflows/fees.js +93 -0
  509. package/dist/src/workflows/fees.js.map +1 -0
  510. package/dist/src/workflows/helpers.d.ts +8 -0
  511. package/dist/src/workflows/helpers.js +66 -0
  512. package/dist/src/workflows/helpers.js.map +1 -0
  513. package/dist/src/workflows/io.d.ts +3 -0
  514. package/dist/src/workflows/io.js +38 -0
  515. package/dist/src/workflows/io.js.map +1 -0
  516. package/dist/src/workflows/registry.d.ts +51355 -0
  517. package/dist/src/workflows/registry.js +140 -0
  518. package/dist/src/workflows/registry.js.map +1 -0
  519. package/dist/src/workflows/schemas/benefits.d.ts +78 -0
  520. package/dist/src/workflows/schemas/benefits.js +91 -0
  521. package/dist/src/workflows/schemas/benefits.js.map +1 -0
  522. package/dist/src/workflows/schemas/common.d.ts +27 -0
  523. package/dist/src/workflows/schemas/common.js +28 -0
  524. package/dist/src/workflows/schemas/common.js.map +1 -0
  525. package/dist/src/workflows/schemas/education.d.ts +70 -0
  526. package/dist/src/workflows/schemas/education.js +85 -0
  527. package/dist/src/workflows/schemas/education.js.map +1 -0
  528. package/dist/src/workflows/schemas/estate.d.ts +64 -0
  529. package/dist/src/workflows/schemas/estate.js +85 -0
  530. package/dist/src/workflows/schemas/estate.js.map +1 -0
  531. package/dist/src/workflows/schemas/healthcare-ext.d.ts +15 -0
  532. package/dist/src/workflows/schemas/healthcare-ext.js +17 -0
  533. package/dist/src/workflows/schemas/healthcare-ext.js.map +1 -0
  534. package/dist/src/workflows/schemas/healthcare.d.ts +33 -0
  535. package/dist/src/workflows/schemas/healthcare.js +20 -0
  536. package/dist/src/workflows/schemas/healthcare.js.map +1 -0
  537. package/dist/src/workflows/schemas/identity-domain.d.ts +64 -0
  538. package/dist/src/workflows/schemas/identity-domain.js +87 -0
  539. package/dist/src/workflows/schemas/identity-domain.js.map +1 -0
  540. package/dist/src/workflows/schemas/immigration-ext.d.ts +63 -0
  541. package/dist/src/workflows/schemas/immigration-ext.js +58 -0
  542. package/dist/src/workflows/schemas/immigration-ext.js.map +1 -0
  543. package/dist/src/workflows/schemas/immigration.d.ts +48 -0
  544. package/dist/src/workflows/schemas/immigration.js +27 -0
  545. package/dist/src/workflows/schemas/immigration.js.map +1 -0
  546. package/dist/src/workflows/schemas/legal.d.ts +45 -0
  547. package/dist/src/workflows/schemas/legal.js +45 -0
  548. package/dist/src/workflows/schemas/legal.js.map +1 -0
  549. package/dist/src/workflows/schemas/planning.d.ts +23 -0
  550. package/dist/src/workflows/schemas/planning.js +15 -0
  551. package/dist/src/workflows/schemas/planning.js.map +1 -0
  552. package/dist/src/workflows/schemas/retirement.d.ts +14 -0
  553. package/dist/src/workflows/schemas/retirement.js +22 -0
  554. package/dist/src/workflows/schemas/retirement.js.map +1 -0
  555. package/dist/src/workflows/schemas/tax.d.ts +58 -0
  556. package/dist/src/workflows/schemas/tax.js +51 -0
  557. package/dist/src/workflows/schemas/tax.js.map +1 -0
  558. package/dist/src/workflows/schemas/unemployment.d.ts +33 -0
  559. package/dist/src/workflows/schemas/unemployment.js +19 -0
  560. package/dist/src/workflows/schemas/unemployment.js.map +1 -0
  561. package/dist/src/workflows/schemas/veterans.d.ts +47 -0
  562. package/dist/src/workflows/schemas/veterans.js +51 -0
  563. package/dist/src/workflows/schemas/veterans.js.map +1 -0
  564. package/dist/src/workflows/types.d.ts +9 -0
  565. package/dist/src/workflows/types.js +2 -0
  566. package/dist/src/workflows/types.js.map +1 -0
  567. package/dist/xmcp.config.d.ts +3 -0
  568. package/dist/xmcp.config.js +29 -0
  569. package/dist/xmcp.config.js.map +1 -0
  570. package/llms.txt +48 -0
  571. package/package.json +82 -0
@@ -0,0 +1,127 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Federal Poverty Level Guidelines — 2025
3
+ // ---------------------------------------------------------------------------
4
+ // Used by benefits eligibility screening across SNAP, Medicaid, WIC,
5
+ // LIHEAP, ACA subsidies, CHIP, school lunch programs, and more.
6
+ //
7
+ // Source: HHS Federal Register, effective January 2025.
8
+ // Alaska and Hawaii have their own guidelines because cost of living
9
+ // there makes the lower-48 numbers look like a cruel joke.
10
+ // ---------------------------------------------------------------------------
11
+ export const FPL_2025 = {
12
+ baseAmount: 15_650,
13
+ perAdditionalPerson: 5_580,
14
+ // Alaska and Hawaii have higher FPLs
15
+ alaska: { baseAmount: 19_560, perAdditionalPerson: 6_980 },
16
+ hawaii: { baseAmount: 18_000, perAdditionalPerson: 6_420 },
17
+ };
18
+ /**
19
+ * Common program eligibility thresholds as percentages of FPL.
20
+ * These are the magic numbers that determine who qualifies for what.
21
+ */
22
+ export const PROGRAM_THRESHOLDS = {
23
+ snap: { gross: 130, net: 100 }, // % of FPL
24
+ medicaid_expansion: 138,
25
+ wic: 185,
26
+ liheap: 150,
27
+ aca_subsidy_max: 400,
28
+ chip_typical: 200,
29
+ reduced_school_lunch: 185,
30
+ free_school_lunch: 130,
31
+ };
32
+ /**
33
+ * Maximum monthly SNAP allotments for 2025 by household size.
34
+ * For households larger than 8, add $220 per additional person.
35
+ */
36
+ export const SNAP_MAX_ALLOTMENT_2025 = {
37
+ 1: 292,
38
+ 2: 536,
39
+ 3: 768,
40
+ 4: 975,
41
+ 5: 1158,
42
+ 6: 1390,
43
+ 7: 1536,
44
+ 8: 1756,
45
+ };
46
+ const SNAP_PER_ADDITIONAL_PERSON = 220;
47
+ function roundCurrency(value) {
48
+ return Number(value.toFixed(2));
49
+ }
50
+ /**
51
+ * Determine the FPL parameters for a given state.
52
+ * Alaska and Hawaii get their own numbers; everyone else uses the
53
+ * contiguous-US guidelines.
54
+ */
55
+ function fplParamsForState(state) {
56
+ const normalized = state?.toUpperCase().trim();
57
+ if (normalized === "AK" || normalized === "ALASKA") {
58
+ return FPL_2025.alaska;
59
+ }
60
+ if (normalized === "HI" || normalized === "HAWAII") {
61
+ return FPL_2025.hawaii;
62
+ }
63
+ return { baseAmount: FPL_2025.baseAmount, perAdditionalPerson: FPL_2025.perAdditionalPerson };
64
+ }
65
+ /**
66
+ * Calculate the Federal Poverty Level for a given household size.
67
+ * Household size must be at least 1.
68
+ *
69
+ * Formula: base amount + (per-additional × (size - 1))
70
+ */
71
+ export function fplForHousehold(size, state) {
72
+ const effectiveSize = Math.max(1, Math.round(size));
73
+ const params = fplParamsForState(state);
74
+ return params.baseAmount + params.perAdditionalPerson * (effectiveSize - 1);
75
+ }
76
+ /**
77
+ * Calculate what percentage of FPL a household's income represents.
78
+ *
79
+ * Returns the percentage as a number (e.g., 138 means 138% of FPL).
80
+ * This is the key number for virtually every means-tested benefit
81
+ * in the United States.
82
+ */
83
+ export function fplPercentage(income, householdSize, state) {
84
+ const fpl = fplForHousehold(householdSize, state);
85
+ if (fpl === 0)
86
+ return 0;
87
+ return roundCurrency((income / fpl) * 100);
88
+ }
89
+ /**
90
+ * Check whether a household's income falls below a given FPL percentage
91
+ * threshold. This is the actual eligibility gate for most programs.
92
+ *
93
+ * Example: isBelow(25000, 3, 130) checks if $25k for a household of 3
94
+ * is below 130% FPL (SNAP gross income test).
95
+ */
96
+ export function isBelow(income, householdSize, percentage, state) {
97
+ const fpl = fplForHousehold(householdSize, state);
98
+ const threshold = (fpl * percentage) / 100;
99
+ return income <= threshold;
100
+ }
101
+ /**
102
+ * Estimate monthly SNAP benefit for a household.
103
+ *
104
+ * The basic formula: max allotment - (30% of net monthly income).
105
+ * The 30% figure reflects the USDA's assumption that households
106
+ * should spend 30% of their net income on food. Whether that's
107
+ * realistic in 2025 is another conversation entirely.
108
+ *
109
+ * Returns 0 if the household doesn't qualify (benefit would be negative).
110
+ * Minimum benefit for 1-2 person households is typically $23/month,
111
+ * but we don't enforce that here since state rules vary.
112
+ */
113
+ export function estimateSnapBenefit(householdSize, netMonthlyIncome) {
114
+ const effectiveSize = Math.max(1, Math.round(householdSize));
115
+ let maxAllotment;
116
+ if (effectiveSize <= 8) {
117
+ maxAllotment = SNAP_MAX_ALLOTMENT_2025[effectiveSize] ?? 0;
118
+ }
119
+ else {
120
+ const base8 = SNAP_MAX_ALLOTMENT_2025[8] ?? 1756;
121
+ maxAllotment = base8 + SNAP_PER_ADDITIONAL_PERSON * (effectiveSize - 8);
122
+ }
123
+ const expectedContribution = roundCurrency(netMonthlyIncome * 0.3);
124
+ const benefit = roundCurrency(Math.max(0, maxAllotment - expectedContribution));
125
+ return benefit;
126
+ }
127
+ //# sourceMappingURL=fpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fpl.js","sourceRoot":"","sources":["../../../src/engine/fpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface HomeOfficeCalculation {
2
+ simplifiedDeduction: number;
3
+ actualDeduction: number;
4
+ recommendedMethod: "simplified" | "actual";
5
+ savingsFromRecommended: number;
6
+ details: {
7
+ squareFootage: number;
8
+ totalHomeSquareFootage: number;
9
+ businessUsePercentage: number;
10
+ simplifiedRate: number;
11
+ simplifiedMaxSqft: number;
12
+ actualExpenses: ActualHomeExpenses;
13
+ };
14
+ }
15
+ export interface ActualHomeExpenses {
16
+ mortgage: number;
17
+ rent: number;
18
+ utilities: number;
19
+ insurance: number;
20
+ repairs: number;
21
+ depreciation: number;
22
+ propertyTax: number;
23
+ other: number;
24
+ total: number;
25
+ }
26
+ /**
27
+ * Compare simplified method vs. actual expense method for home office deduction.
28
+ *
29
+ * Simplified: $5/sq ft up to 300 sq ft = max $1,500 deduction
30
+ * Actual: percentage of home expenses based on office-to-home square footage ratio
31
+ *
32
+ * The home must be used regularly and exclusively for business.
33
+ */
34
+ export declare function calculateHomeOfficeDeduction(officeSquareFootage: number, totalHomeSquareFootage: number, actualExpenses?: Partial<ActualHomeExpenses>): HomeOfficeCalculation;
@@ -0,0 +1,53 @@
1
+ // IRS simplified home office deduction: $5 per square foot, max 300 sq ft
2
+ const SIMPLIFIED_RATE = 5;
3
+ const SIMPLIFIED_MAX_SQFT = 300;
4
+ /**
5
+ * Compare simplified method vs. actual expense method for home office deduction.
6
+ *
7
+ * Simplified: $5/sq ft up to 300 sq ft = max $1,500 deduction
8
+ * Actual: percentage of home expenses based on office-to-home square footage ratio
9
+ *
10
+ * The home must be used regularly and exclusively for business.
11
+ */
12
+ export function calculateHomeOfficeDeduction(officeSquareFootage, totalHomeSquareFootage, actualExpenses) {
13
+ // Simplified method
14
+ const qualifyingSqft = Math.min(officeSquareFootage, SIMPLIFIED_MAX_SQFT);
15
+ const simplifiedDeduction = roundCurrency(qualifyingSqft * SIMPLIFIED_RATE);
16
+ // Actual method
17
+ const businessUsePercentage = totalHomeSquareFootage > 0 ? officeSquareFootage / totalHomeSquareFootage : 0;
18
+ const expenses = {
19
+ mortgage: actualExpenses?.mortgage ?? 0,
20
+ rent: actualExpenses?.rent ?? 0,
21
+ utilities: actualExpenses?.utilities ?? 0,
22
+ insurance: actualExpenses?.insurance ?? 0,
23
+ repairs: actualExpenses?.repairs ?? 0,
24
+ depreciation: actualExpenses?.depreciation ?? 0,
25
+ propertyTax: actualExpenses?.propertyTax ?? 0,
26
+ other: actualExpenses?.other ?? 0,
27
+ total: 0,
28
+ };
29
+ expenses.total = roundCurrency(expenses.mortgage + expenses.rent + expenses.utilities +
30
+ expenses.insurance + expenses.repairs + expenses.depreciation +
31
+ expenses.propertyTax + expenses.other);
32
+ const actualDeduction = roundCurrency(expenses.total * businessUsePercentage);
33
+ const recommendedMethod = simplifiedDeduction >= actualDeduction ? "simplified" : "actual";
34
+ const savingsFromRecommended = roundCurrency(Math.abs(simplifiedDeduction - actualDeduction));
35
+ return {
36
+ simplifiedDeduction,
37
+ actualDeduction,
38
+ recommendedMethod,
39
+ savingsFromRecommended,
40
+ details: {
41
+ squareFootage: officeSquareFootage,
42
+ totalHomeSquareFootage,
43
+ businessUsePercentage: Number((businessUsePercentage * 100).toFixed(1)),
44
+ simplifiedRate: SIMPLIFIED_RATE,
45
+ simplifiedMaxSqft: SIMPLIFIED_MAX_SQFT,
46
+ actualExpenses: expenses,
47
+ },
48
+ };
49
+ }
50
+ function roundCurrency(value) {
51
+ return Number(value.toFixed(2));
52
+ }
53
+ //# sourceMappingURL=home-office.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-office.js","sourceRoot":"","sources":["../../../../src/engine/gig/home-office.ts"],"names":[],"mappings":"AA2BA,0EAA0E;AAC1E,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,mBAA2B,EAC3B,sBAA8B,EAC9B,cAA4C;IAE5C,oBAAoB;IACpB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,aAAa,CAAC,cAAc,GAAG,eAAe,CAAC,CAAC;IAE5E,gBAAgB;IAChB,MAAM,qBAAqB,GACzB,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhF,MAAM,QAAQ,GAAuB;QACnC,QAAQ,EAAE,cAAc,EAAE,QAAQ,IAAI,CAAC;QACvC,IAAI,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC;QAC/B,SAAS,EAAE,cAAc,EAAE,SAAS,IAAI,CAAC;QACzC,SAAS,EAAE,cAAc,EAAE,SAAS,IAAI,CAAC;QACzC,OAAO,EAAE,cAAc,EAAE,OAAO,IAAI,CAAC;QACrC,YAAY,EAAE,cAAc,EAAE,YAAY,IAAI,CAAC;QAC/C,WAAW,EAAE,cAAc,EAAE,WAAW,IAAI,CAAC;QAC7C,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;QACjC,KAAK,EAAE,CAAC;KACT,CAAC;IACF,QAAQ,CAAC,KAAK,GAAG,aAAa,CAC5B,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,SAAS;QACtD,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,YAAY;QAC7D,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CACtC,CAAC;IAEF,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,GAAG,qBAAqB,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,mBAAmB,IAAI,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3F,MAAM,sBAAsB,GAAG,aAAa,CAC1C,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,eAAe,CAAC,CAChD,CAAC;IAEF,OAAO;QACL,mBAAmB;QACnB,eAAe;QACf,iBAAiB;QACjB,sBAAsB;QACtB,OAAO,EAAE;YACP,aAAa,EAAE,mBAAmB;YAClC,sBAAsB;YACtB,qBAAqB,EAAE,MAAM,CAAC,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvE,cAAc,EAAE,eAAe;YAC/B,iBAAiB,EAAE,mBAAmB;YACtC,cAAc,EAAE,QAAQ;SACzB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface MileageCalculation {
2
+ standardDeduction: number;
3
+ actualDeduction: number;
4
+ recommendedMethod: "standard" | "actual";
5
+ savingsFromRecommended: number;
6
+ details: {
7
+ totalMiles: number;
8
+ businessMiles: number;
9
+ standardRate: number;
10
+ actualExpenses: ActualVehicleExpenses;
11
+ businessUsePercentage: number;
12
+ };
13
+ }
14
+ export interface ActualVehicleExpenses {
15
+ gas: number;
16
+ insurance: number;
17
+ repairs: number;
18
+ depreciation: number;
19
+ registration: number;
20
+ leasePayments: number;
21
+ parking: number;
22
+ tolls: number;
23
+ other: number;
24
+ total: number;
25
+ }
26
+ /**
27
+ * Compare standard mileage deduction vs. actual expense method.
28
+ * The IRS allows self-employed individuals to choose whichever is higher.
29
+ */
30
+ export declare function calculateMileageDeduction(totalMiles: number, businessMiles: number, actualExpenses?: Partial<ActualVehicleExpenses>): MileageCalculation;
@@ -0,0 +1,45 @@
1
+ // IRS standard mileage rate for 2025
2
+ const STANDARD_MILEAGE_RATE_2025 = 0.70; // 70 cents per mile
3
+ /**
4
+ * Compare standard mileage deduction vs. actual expense method.
5
+ * The IRS allows self-employed individuals to choose whichever is higher.
6
+ */
7
+ export function calculateMileageDeduction(totalMiles, businessMiles, actualExpenses) {
8
+ const standardDeduction = roundCurrency(businessMiles * STANDARD_MILEAGE_RATE_2025);
9
+ const expenses = {
10
+ gas: actualExpenses?.gas ?? 0,
11
+ insurance: actualExpenses?.insurance ?? 0,
12
+ repairs: actualExpenses?.repairs ?? 0,
13
+ depreciation: actualExpenses?.depreciation ?? 0,
14
+ registration: actualExpenses?.registration ?? 0,
15
+ leasePayments: actualExpenses?.leasePayments ?? 0,
16
+ parking: actualExpenses?.parking ?? 0,
17
+ tolls: actualExpenses?.tolls ?? 0,
18
+ other: actualExpenses?.other ?? 0,
19
+ total: 0,
20
+ };
21
+ expenses.total = roundCurrency(expenses.gas + expenses.insurance + expenses.repairs +
22
+ expenses.depreciation + expenses.registration + expenses.leasePayments +
23
+ expenses.parking + expenses.tolls + expenses.other);
24
+ const businessUsePercentage = totalMiles > 0 ? businessMiles / totalMiles : 0;
25
+ const actualDeduction = roundCurrency(expenses.total * businessUsePercentage);
26
+ const recommendedMethod = standardDeduction >= actualDeduction ? "standard" : "actual";
27
+ const savingsFromRecommended = roundCurrency(Math.abs(standardDeduction - actualDeduction));
28
+ return {
29
+ standardDeduction,
30
+ actualDeduction,
31
+ recommendedMethod,
32
+ savingsFromRecommended,
33
+ details: {
34
+ totalMiles,
35
+ businessMiles,
36
+ standardRate: STANDARD_MILEAGE_RATE_2025,
37
+ actualExpenses: expenses,
38
+ businessUsePercentage: Number((businessUsePercentage * 100).toFixed(1)),
39
+ },
40
+ };
41
+ }
42
+ function roundCurrency(value) {
43
+ return Number(value.toFixed(2));
44
+ }
45
+ //# sourceMappingURL=mileage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mileage.js","sourceRoot":"","sources":["../../../../src/engine/gig/mileage.ts"],"names":[],"mappings":"AA2BA,qCAAqC;AACrC,MAAM,0BAA0B,GAAG,IAAI,CAAC,CAAC,oBAAoB;AAE7D;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,aAAqB,EACrB,cAA+C;IAE/C,MAAM,iBAAiB,GAAG,aAAa,CAAC,aAAa,GAAG,0BAA0B,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAA0B;QACtC,GAAG,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;QAC7B,SAAS,EAAE,cAAc,EAAE,SAAS,IAAI,CAAC;QACzC,OAAO,EAAE,cAAc,EAAE,OAAO,IAAI,CAAC;QACrC,YAAY,EAAE,cAAc,EAAE,YAAY,IAAI,CAAC;QAC/C,YAAY,EAAE,cAAc,EAAE,YAAY,IAAI,CAAC;QAC/C,aAAa,EAAE,cAAc,EAAE,aAAa,IAAI,CAAC;QACjD,OAAO,EAAE,cAAc,EAAE,OAAO,IAAI,CAAC;QACrC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;QACjC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;QACjC,KAAK,EAAE,CAAC;KACT,CAAC;IACF,QAAQ,CAAC,KAAK,GAAG,aAAa,CAC5B,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO;QACpD,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa;QACtE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CACnD,CAAC;IAEF,MAAM,qBAAqB,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,GAAG,qBAAqB,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,iBAAiB,IAAI,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvF,MAAM,sBAAsB,GAAG,aAAa,CAC1C,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,eAAe,CAAC,CAC9C,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,eAAe;QACf,iBAAiB;QACjB,sBAAsB;QACtB,OAAO,EAAE;YACP,UAAU;YACV,aAAa;YACb,YAAY,EAAE,0BAA0B;YACxC,cAAc,EAAE,QAAQ;YACxB,qBAAqB,EAAE,MAAM,CAAC,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACxE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Form1099NecDocument } from "../../types.js";
2
+ export interface ScheduleCAggregate {
3
+ totalGrossReceipts: number;
4
+ totalExpenses: number;
5
+ netProfit: number;
6
+ sourceCount: number;
7
+ sources: Array<{
8
+ payerName: string;
9
+ compensation: number;
10
+ federalWithheld: number;
11
+ }>;
12
+ totalFederalWithheld: number;
13
+ }
14
+ /**
15
+ * Aggregate multiple 1099-NEC documents into a single Schedule C summary.
16
+ * Self-employed individuals receiving multiple 1099-NECs report all on one Schedule C
17
+ * (unless they have truly separate businesses, which is rare for gig workers).
18
+ */
19
+ export declare function aggregateScheduleC(documents: Form1099NecDocument[], expenses?: number): ScheduleCAggregate;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Aggregate multiple 1099-NEC documents into a single Schedule C summary.
3
+ * Self-employed individuals receiving multiple 1099-NECs report all on one Schedule C
4
+ * (unless they have truly separate businesses, which is rare for gig workers).
5
+ */
6
+ export function aggregateScheduleC(documents, expenses) {
7
+ const sources = documents.map((doc) => ({
8
+ payerName: doc.payerName,
9
+ compensation: doc.nonemployeeCompensation,
10
+ federalWithheld: doc.federalWithheld ?? 0,
11
+ }));
12
+ const totalGrossReceipts = roundCurrency(sources.reduce((sum, s) => sum + s.compensation, 0));
13
+ const totalFederalWithheld = roundCurrency(sources.reduce((sum, s) => sum + s.federalWithheld, 0));
14
+ const totalExpenses = roundCurrency(expenses ?? 0);
15
+ const netProfit = roundCurrency(totalGrossReceipts - totalExpenses);
16
+ return {
17
+ totalGrossReceipts,
18
+ totalExpenses,
19
+ netProfit,
20
+ sourceCount: sources.length,
21
+ sources,
22
+ totalFederalWithheld,
23
+ };
24
+ }
25
+ function roundCurrency(value) {
26
+ return Number(value.toFixed(2));
27
+ }
28
+ //# sourceMappingURL=multi-1099.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-1099.js","sourceRoot":"","sources":["../../../../src/engine/gig/multi-1099.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAgC,EAChC,QAAiB;IAEjB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,YAAY,EAAE,GAAG,CAAC,uBAAuB;QACzC,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC;KAC1C,CAAC,CAAC,CAAC;IAEJ,MAAM,kBAAkB,GAAG,aAAa,CACtC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CACpD,CAAC;IACF,MAAM,oBAAoB,GAAG,aAAa,CACxC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CACvD,CAAC;IACF,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,aAAa,CAAC,kBAAkB,GAAG,aAAa,CAAC,CAAC;IAEpE,OAAO;QACL,kBAAkB;QAClB,aAAa;QACb,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,OAAO;QACP,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface CarryforwardState {
2
+ taxYear: number;
3
+ capitalLossCarryover: number;
4
+ charitableExcess: number;
5
+ netOperatingLoss: number;
6
+ }
7
+ /**
8
+ * Calculate the carryforward state after applying current-year deductions.
9
+ *
10
+ * Takes the existing carryforward balances, subtracts what was used
11
+ * this year, and returns the remaining balances to carry into next year.
12
+ */
13
+ export declare function calculateCarryforward(currentYear: CarryforwardState, capitalLossUsed: number, charitableUsed: number): CarryforwardState;
14
+ /**
15
+ * Apply carryforward balances to the next year's income to determine
16
+ * how much can be deducted.
17
+ *
18
+ * Capital loss carryover: up to $3,000 against ordinary income,
19
+ * plus unlimited offset against capital gains (not modeled here —
20
+ * that happens in the capital gains module).
21
+ *
22
+ * Charitable excess: carried forward at the same AGI-percentage limit.
23
+ *
24
+ * NOL: limited to 80% of taxable income in the carryforward year.
25
+ */
26
+ export declare function applyCarryforward(state: CarryforwardState, nextYearIncome: number): {
27
+ capitalLossDeduction: number;
28
+ charitableDeduction: number;
29
+ nolDeduction: number;
30
+ remainingCarryforward: CarryforwardState;
31
+ };
@@ -0,0 +1,77 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Tax Carryforward Tracker
3
+ // ---------------------------------------------------------------------------
4
+ // Some tax items persist across years like a hangover from a particularly
5
+ // volatile portfolio. This module tracks capital loss carryovers,
6
+ // excess charitable contributions, and net operating losses.
7
+ //
8
+ // Key limits:
9
+ // - Capital losses: max $3,000/year deductible against ordinary income,
10
+ // remainder carries forward indefinitely
11
+ // - Charitable contributions: generally capped at 60% of AGI,
12
+ // excess carries forward up to 5 years
13
+ // - NOL: carries forward indefinitely (post-TCJA), limited to 80% of
14
+ // taxable income in carryforward years
15
+ // ---------------------------------------------------------------------------
16
+ function roundCurrency(value) {
17
+ return Number(value.toFixed(2));
18
+ }
19
+ /**
20
+ * Maximum capital loss deduction allowed against ordinary income per year.
21
+ * Married-filing-separately gets $1,500, everyone else gets $3,000.
22
+ * We use $3,000 as the default since MFS is the minority case.
23
+ */
24
+ const MAX_CAPITAL_LOSS_DEDUCTION = 3_000;
25
+ /**
26
+ * Post-TCJA NOL deduction is limited to 80% of taxable income
27
+ * in the carryforward year.
28
+ */
29
+ const NOL_DEDUCTION_LIMIT_PERCENT = 0.8;
30
+ /**
31
+ * Calculate the carryforward state after applying current-year deductions.
32
+ *
33
+ * Takes the existing carryforward balances, subtracts what was used
34
+ * this year, and returns the remaining balances to carry into next year.
35
+ */
36
+ export function calculateCarryforward(currentYear, capitalLossUsed, charitableUsed) {
37
+ return {
38
+ taxYear: currentYear.taxYear + 1,
39
+ capitalLossCarryover: roundCurrency(Math.max(0, currentYear.capitalLossCarryover - capitalLossUsed)),
40
+ charitableExcess: roundCurrency(Math.max(0, currentYear.charitableExcess - charitableUsed)),
41
+ netOperatingLoss: currentYear.netOperatingLoss, // NOL usage tracked separately
42
+ };
43
+ }
44
+ /**
45
+ * Apply carryforward balances to the next year's income to determine
46
+ * how much can be deducted.
47
+ *
48
+ * Capital loss carryover: up to $3,000 against ordinary income,
49
+ * plus unlimited offset against capital gains (not modeled here —
50
+ * that happens in the capital gains module).
51
+ *
52
+ * Charitable excess: carried forward at the same AGI-percentage limit.
53
+ *
54
+ * NOL: limited to 80% of taxable income in the carryforward year.
55
+ */
56
+ export function applyCarryforward(state, nextYearIncome) {
57
+ // Capital loss: deduct up to $3,000 against ordinary income
58
+ const capitalLossDeduction = roundCurrency(Math.min(state.capitalLossCarryover, MAX_CAPITAL_LOSS_DEDUCTION));
59
+ // Charitable: allow the full excess (subject to AGI limits applied elsewhere)
60
+ const charitableDeduction = roundCurrency(state.charitableExcess);
61
+ // NOL: limited to 80% of taxable income
62
+ const nolLimit = roundCurrency(Math.max(0, nextYearIncome * NOL_DEDUCTION_LIMIT_PERCENT));
63
+ const nolDeduction = roundCurrency(Math.min(state.netOperatingLoss, nolLimit));
64
+ const remainingCarryforward = {
65
+ taxYear: state.taxYear + 1,
66
+ capitalLossCarryover: roundCurrency(Math.max(0, state.capitalLossCarryover - capitalLossDeduction)),
67
+ charitableExcess: roundCurrency(Math.max(0, state.charitableExcess - charitableDeduction)),
68
+ netOperatingLoss: roundCurrency(Math.max(0, state.netOperatingLoss - nolDeduction)),
69
+ };
70
+ return {
71
+ capitalLossDeduction,
72
+ charitableDeduction,
73
+ nolDeduction,
74
+ remainingCarryforward,
75
+ };
76
+ }
77
+ //# sourceMappingURL=carryforward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carryforward.js","sourceRoot":"","sources":["../../../../src/engine/multiyear/carryforward.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAC9E,0EAA0E;AAC1E,kEAAkE;AAClE,6DAA6D;AAC7D,EAAE;AACF,cAAc;AACd,wEAAwE;AACxE,2CAA2C;AAC3C,8DAA8D;AAC9D,yCAAyC;AACzC,qEAAqE;AACrE,yCAAyC;AACzC,8EAA8E;AAS9E,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEzC;;;GAGG;AACH,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAA8B,EAC9B,eAAuB,EACvB,cAAsB;IAEtB,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,CAAC;QAChC,oBAAoB,EAAE,aAAa,CACjC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,oBAAoB,GAAG,eAAe,CAAC,CAChE;QACD,gBAAgB,EAAE,aAAa,CAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,gBAAgB,GAAG,cAAc,CAAC,CAC3D;QACD,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,EAAE,+BAA+B;KAChF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAwB,EACxB,cAAsB;IAOtB,4DAA4D;IAC5D,MAAM,oBAAoB,GAAG,aAAa,CACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,0BAA0B,CAAC,CACjE,CAAC;IAEF,8EAA8E;IAC9E,MAAM,mBAAmB,GAAG,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAElE,wCAAwC;IACxC,MAAM,QAAQ,GAAG,aAAa,CAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,2BAA2B,CAAC,CAC1D,CAAC;IACF,MAAM,YAAY,GAAG,aAAa,CAChC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAC3C,CAAC;IAEF,MAAM,qBAAqB,GAAsB;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC;QAC1B,oBAAoB,EAAE,aAAa,CACjC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,CAC/D;QACD,gBAAgB,EAAE,aAAa,CAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,CAC1D;QACD,gBAAgB,EAAE,aAAa,CAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,gBAAgB,GAAG,YAAY,CAAC,CACnD;KACF,CAAC;IAEF,OAAO;QACL,oBAAoB;QACpB,mBAAmB;QACnB,YAAY;QACZ,qBAAqB;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface YearOverYearComparison {
2
+ years: number[];
3
+ metrics: ComparisonMetric[];
4
+ significantChanges: string[];
5
+ }
6
+ export interface ComparisonMetric {
7
+ label: string;
8
+ values: Record<number, number>;
9
+ delta: number;
10
+ deltaPercent: number;
11
+ }
12
+ interface ReturnBundle {
13
+ year: number;
14
+ bundle: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * Compare tax returns across multiple years.
18
+ *
19
+ * Extracts key metrics from each year's bundle, calculates deltas,
20
+ * and flags anything that changed by more than 20%. The result is
21
+ * a structured comparison suitable for rendering in a dashboard
22
+ * or advisory summary.
23
+ */
24
+ export declare function compareReturns(bundles: ReturnBundle[]): YearOverYearComparison;
25
+ export {};
@@ -0,0 +1,94 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Multi-Year Tax Return Comparison
3
+ // ---------------------------------------------------------------------------
4
+ // Compare returns across years to surface trends and significant changes.
5
+ // A 20% delta on your tax bill deserves an explanation — this module
6
+ // provides the data to give one.
7
+ // ---------------------------------------------------------------------------
8
+ function roundCurrency(value) {
9
+ return Number(value.toFixed(2));
10
+ }
11
+ function roundPercent(value) {
12
+ return Number(value.toFixed(2));
13
+ }
14
+ /**
15
+ * Significance threshold: changes exceeding 20% get flagged.
16
+ * Not because 20% is a magic number, but because anything below it
17
+ * is usually explainable by inflation adjustments and bracket creep.
18
+ * Anything above it suggests a material life change worth reviewing.
19
+ */
20
+ const SIGNIFICANT_CHANGE_THRESHOLD = 0.2;
21
+ const TRACKED_METRICS = [
22
+ { label: "Gross Income", key: "grossIncome" },
23
+ { label: "Adjusted Gross Income", key: "adjustedGrossIncome" },
24
+ { label: "Deduction", key: "deduction" },
25
+ { label: "Taxable Income", key: "taxableIncome" },
26
+ { label: "Federal Tax", key: "federalTax" },
27
+ { label: "Total Tax", key: "totalTax" },
28
+ { label: "Total Credits", key: "totalCredits" },
29
+ { label: "Refund", key: "refund" },
30
+ { label: "Amount Owed", key: "amountOwed" },
31
+ { label: "Effective Rate", key: "effectiveRate" },
32
+ ];
33
+ function extractMetricValue(bundle, key) {
34
+ // Try to find the value in the bundle's calculation result or at top level
35
+ const calculation = bundle["calculation"];
36
+ if (calculation && typeof calculation[key] === "number") {
37
+ return calculation[key];
38
+ }
39
+ if (typeof bundle[key] === "number") {
40
+ return bundle[key];
41
+ }
42
+ // Check nested derived
43
+ const derived = bundle["derived"];
44
+ if (derived && typeof derived[key] === "number") {
45
+ return derived[key];
46
+ }
47
+ return 0;
48
+ }
49
+ function buildMetric(label, key, bundles) {
50
+ const values = {};
51
+ for (const b of bundles) {
52
+ values[b.year] = extractMetricValue(b.bundle, key);
53
+ }
54
+ const sortedYears = bundles
55
+ .map((b) => b.year)
56
+ .sort((a, b) => a - b);
57
+ const firstYear = sortedYears[0];
58
+ const lastYear = sortedYears[sortedYears.length - 1];
59
+ const firstValue = values[firstYear] ?? 0;
60
+ const lastValue = values[lastYear] ?? 0;
61
+ const delta = roundCurrency(lastValue - firstValue);
62
+ const deltaPercent = firstValue === 0
63
+ ? lastValue === 0
64
+ ? 0
65
+ : 100
66
+ : roundPercent((delta / Math.abs(firstValue)) * 100);
67
+ return { label, values, delta, deltaPercent };
68
+ }
69
+ /**
70
+ * Compare tax returns across multiple years.
71
+ *
72
+ * Extracts key metrics from each year's bundle, calculates deltas,
73
+ * and flags anything that changed by more than 20%. The result is
74
+ * a structured comparison suitable for rendering in a dashboard
75
+ * or advisory summary.
76
+ */
77
+ export function compareReturns(bundles) {
78
+ if (bundles.length === 0) {
79
+ return { years: [], metrics: [], significantChanges: [] };
80
+ }
81
+ const sortedBundles = [...bundles].sort((a, b) => a.year - b.year);
82
+ const years = sortedBundles.map((b) => b.year);
83
+ const metrics = TRACKED_METRICS.map((m) => buildMetric(m.label, m.key, sortedBundles));
84
+ const significantChanges = [];
85
+ for (const metric of metrics) {
86
+ if (Math.abs(metric.deltaPercent) > SIGNIFICANT_CHANGE_THRESHOLD * 100) {
87
+ const direction = metric.delta > 0 ? "increased" : "decreased";
88
+ significantChanges.push(`${metric.label} ${direction} by ${Math.abs(metric.deltaPercent).toFixed(1)}% ` +
89
+ `(${metric.delta > 0 ? "+" : ""}$${metric.delta.toLocaleString()})`);
90
+ }
91
+ }
92
+ return { years, metrics, significantChanges };
93
+ }
94
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../../src/engine/multiyear/compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface ImportResult {
2
+ prefilled: Record<string, unknown>;
3
+ fieldsImported: string[];
4
+ fieldsSkipped: string[];
5
+ notes: string[];
6
+ }
7
+ /**
8
+ * Import stable data from a previous year's return bundle.
9
+ *
10
+ * Imports:
11
+ * - Identity (name, SSN, DOB)
12
+ * - Address (with a note to verify — people move)
13
+ * - Dependents (with count verification prompt)
14
+ * - Filing status (as a suggestion, not a lock)
15
+ * - Recurring income source labels (not amounts)
16
+ * - Bank account info for direct deposit
17
+ *
18
+ * Skips:
19
+ * - All dollar amounts (income, withholding, payments, results)
20
+ * - Calculation results, validation, review summaries
21
+ * - Year-specific artifacts
22
+ */
23
+ export declare function importFromPreviousYear(previousBundle: Record<string, unknown>): ImportResult;