Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions Cyrano/src/engines/base-engine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -707,14 +707,4 @@ export abstract class BaseEngine {
* Cleanup resources
*/
abstract cleanup(): Promise<void>;
}


}
}
}
}
}
}
}
}
19 changes: 0 additions & 19 deletions Cyrano/src/engines/chronometric/chronometric-engine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,22 +341,3 @@ export class ChronometricEngine extends BaseEngine {

// Export singleton instance
export const chronometricEngine = new ChronometricEngine();

}
}
}
}
}
}
}
]
}
}
}
}
}
}
}
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -417,14 +417,3 @@ export class CostEstimationModule extends BaseModule {
}

// Export singleton instance
export const costEstimationModule = new CostEstimationModule();

}
}
}
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -368,9 +368,3 @@ export class PatternLearningModule extends BaseModule {
}

// Export singleton instance
export const patternLearningModule = new PatternLearningModule();


}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -489,10 +489,3 @@ export class TimeReconstructionModule extends BaseModule {
}

// Export singleton instance
export const timeReconstructionModule = new TimeReconstructionModule();

}
}
}
}
}
16 changes: 0 additions & 16 deletions Cyrano/src/engines/chronometric/services/baseline-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,19 +128,3 @@ export async function addOffDay(userId: string, date: string): Promise<BaselineC
/**
* Remove an off-day
*/
export async function removeOffDay(userId: string, date: string): Promise<BaselineConfig | null> {
const config = await getBaselineConfig(userId);
if (!config || !config.offDays) {
return config;
}

const offDays = config.offDays.filter(d => d !== date);

return await saveBaselineConfig({
...config,
offDays,
});
}


}
16 changes: 0 additions & 16 deletions Cyrano/src/engines/chronometric/services/cost-estimation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,19 +295,3 @@ ${new Date().toISOString().split('T')[0]}

// Export singleton instance
export const costEstimationService = new CostEstimationService();

}
}
}
}
)
}
}
}
}
)
}
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -262,14 +262,3 @@ export async function getProfitabilitySummary(userId: string): Promise<{
totalActual,
overallVariance: totalActual - totalBudgeted,
};
}


}
}
}
}
}
}
}
}
38 changes: 33 additions & 5 deletions Cyrano/src/http-bridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1015,8 +1015,14 @@ app.get('/api/good-counsel/overview', async (req, res) => {
// FORECASTER API (LexFiat Forecaster™ standalone frontend compatibility)
// ============================================================================

// Import FederalTaxInputSchema dynamically for validation
// Note: We use z.lazy() to avoid circular dependency issues with dynamic imports
const ForecastHttpRequestSchema = z.object({
forecast_input: z.any(),
forecast_input: z.lazy(() => {
// This will be validated in the handler after importing the schema
// Using z.record allows flexibility for additional properties
return z.record(z.any());
}),
branding: z.object({
presentationMode: z.enum(['strip', 'watermark', 'none']).optional(),
userRole: z.enum(['attorney', 'staff', 'client', 'other']).optional(),
Expand Down Expand Up @@ -1050,8 +1056,19 @@ app.post('/api/forecast/tax', async (req, res) => {
}

// Use calculateFederal() for complete credit calculations (CTC/ODC/ACTC/EITC)
const { calculateFederal } = await import('./modules/forecast/formulas/tax-formulas.js');
const calculatedValues = calculateFederal(forecast_input);
const { calculateFederal, FederalTaxInputSchema } = await import('./modules/forecast/formulas/tax-formulas.js');

// Validate forecast_input with FederalTaxInputSchema for type safety
const validationResult = FederalTaxInputSchema.safeParse(forecast_input);
if (!validationResult.success) {
return res.status(400).json({
success: false,
error: 'Invalid forecast_input data',
details: validationResult.error.issues
});
}

const calculatedValues = calculateFederal(validationResult.data);

res.json({
success: true,
Expand Down Expand Up @@ -1080,8 +1097,19 @@ app.post('/api/forecast/tax/pdf', async (req, res) => {
const year = forecast_input?.year || new Date().getFullYear();

// 1) Calculate values using calculateFederal() for complete credit calculations
const { calculateFederal } = await import('./modules/forecast/formulas/tax-formulas.js');
const calculated = calculateFederal(forecast_input);
const { calculateFederal, FederalTaxInputSchema } = await import('./modules/forecast/formulas/tax-formulas.js');

// Validate forecast_input with Zod schema
const validationResult = FederalTaxInputSchema.safeParse(forecast_input);
if (!validationResult.success) {
return res.status(400).json({
success: false,
error: 'Invalid forecast_input data',
details: validationResult.error.issues
});
}

const calculated = calculateFederal(validationResult.data);

// 2) Map to 1040 fill keys (minimal set; expands as module evolves)
const filingStatusIndex: Record<string, number> = {
Expand Down
26 changes: 26 additions & 0 deletions Cyrano/src/modules/forecast/formulas/tax-formulas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* Implements IRS tax brackets and calculation logic for 2018-2025
*/

import { z } from 'zod';

export type FilingStatus = 'single' | 'married_joint' | 'married_separate' | 'head_of_household' | 'qualifying_widow';

export interface TaxBracket {
Expand Down Expand Up @@ -511,6 +513,30 @@ export interface FederalTaxInput {
estimatedWithholding?: number;
}

/**
* Zod validation schema for FederalTaxInput
* Ensures type safety and runtime validation at API boundaries
*/
export const FederalTaxInputSchema = z.object({
year: z.number().int().min(2018).max(2025),
filingStatus: z.enum(['single', 'married_joint', 'married_separate', 'head_of_household', 'qualifying_widow']),
wages: z.number().nonnegative(),
selfEmploymentIncome: z.number().nonnegative().optional(),
interestIncome: z.number().nonnegative().optional(),
dividendIncome: z.number().nonnegative().optional(),
capitalGains: z.number().optional(),
otherIncome: z.number().optional(),
itemizedDeductions: z.number().nonnegative().optional(),
standardDeduction: z.number().nonnegative().optional(),
qualifyingChildrenUnder17: z.number().int().nonnegative().optional(),
otherDependents: z.number().int().nonnegative().optional(),
filerAge: z.number().int().positive().optional(),
spouseAge: z.number().int().positive().optional(),
canBeClaimedAsDependent: z.boolean().optional(),
estimatedWithholding: z.number().nonnegative().optional()
});


/**
* Standalone backend result interface (for compatibility)
*/
Expand Down
8 changes: 4 additions & 4 deletions apps/forecaster/backend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions apps/forecaster/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@
"devDependencies": {
"@types/cors": "^2.8.19",
"@types/express": "^5.0.6",
"@types/node": "^25.0.3",
"@types/node": "^25.0.8",
"tsx": "^4.21.0",
"typescript": "^5.9.3"
}
}

4 changes: 0 additions & 4 deletions apps/forecaster/backend/src/city/city-tax.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,4 @@ export function calculateCityTax(input: CityTaxInput): CityTaxResult {
refundOrBalance,
warnings
};
}


}
}
8 changes: 1 addition & 7 deletions apps/forecaster/backend/src/pdf/pdf-filler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,4 @@ export async function applyBranding(params: {

const bytes = await pdfDoc.save();
return { pdfBase64: toBase64(bytes) };
}


}
}
}
)
}
2 changes: 1 addition & 1 deletion apps/forecaster/backend/src/tax/federal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
type FederalTaxInput,
type FederalTaxResult,
type FilingStatus,
} from '../../../../Cyrano/src/modules/forecast/formulas/tax-formulas.js';
} from '../../../../../Cyrano/src/modules/forecast/formulas/tax-formulas.js';

// Re-export for backward compatibility
export type { FederalTaxInput, FederalTaxResult, FilingStatus };
Expand Down
3 changes: 1 addition & 2 deletions apps/forecaster/backend/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
"module": "ESNext",
"moduleResolution": "bundler",
"outDir": "dist",
"rootDir": "src",
"strict": true,
"skipLibCheck": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"types": ["node"]
},
"include": ["src"]
"include": ["src", "../../../Cyrano/src/modules/forecast/formulas/tax-formulas.ts"]
}

Loading