pulse-cv / server /analysis /types.ts
qyam23's picture
Deploy PulseCV Docker Space
e3a3383 verified
Raw
History Blame Contribute Delete
4.51 kB
export type RequirementType =
| "role_title"
| "seniority"
| "education_background"
| "degree"
| "certification"
| "hard_skill"
| "tool_system"
| "methodology"
| "manufacturing_domain"
| "leadership_responsibility"
| "regulatory_requirement"
| "language_requirement"
| "years_experience"
| "industry_context"
| "must_have_requirement"
| "nice_to_have_requirement";
export type SupportLevel =
| "explicit"
| "strong_partial"
| "weak_partial"
| "implied"
| "missing"
| "unclear";
export type EvidenceType =
| "exact_term"
| "normalized_alias"
| "semantic_equivalent"
| "responsibility_evidence"
| "quantified_impact"
| "tool_usage"
| "title_signal"
| "domain_context"
| "education_signal";
export type MatchState =
| "matched"
| "partially_matched"
| "weakly_supported"
| "missing"
| "uncertain";
export interface SourceSpan {
text: string;
start: number;
end: number;
}
export interface DomainDetection {
primaryDomain: string;
secondaryDomain: string | null;
roleFamily: string;
seniority: string;
confidence: number;
signals: string[];
}
export interface Requirement {
id: string;
label: string;
normalizedValue: string;
type: RequirementType;
subtype: string;
sourceText: string;
sourceSpanStart: number;
sourceSpanEnd: number;
domain: string;
importance: number;
requirementStrength: number;
senioritySignal: string | null;
mustHave: boolean;
confidence: number;
}
export interface Evidence {
requirementId: string;
supportLevel: SupportLevel;
confidence: number;
cvSourceText: string;
cvSpanStart: number;
cvSpanEnd: number;
evidenceType: EvidenceType;
rationale: string;
matchedAlias: string | null;
recencySignal: string | null;
strengthSignal: string | null;
yearsInferred: number | null;
quantifiedImpactPresent: boolean;
ambiguityFlag: boolean;
}
export interface RequirementMatch {
requirement: Requirement;
evidence: Evidence[];
state: MatchState;
topEvidence: Evidence | null;
confidence: number;
rationale: string;
}
export interface JDQualityWarning {
id: string;
severity: "info" | "warning" | "high_risk";
title: string;
message: string;
affectedRequirementIds: string[];
}
export interface ScoringBreakdown {
roleFitScore: number;
domainFitScore: number;
hardSkillsFitScore: number;
toolsFitScore: number;
leadershipFitScore: number;
mustHaveCoverage: number;
evidenceStrengthScore: number;
confidenceScore: number;
uncertaintyPenalty: number;
finalScore: number;
}
export interface EvidenceMapRow {
requirementId: string;
requirement: string;
category: string;
importance: number;
supportLevel: SupportLevel;
matchState: MatchState;
confidence: number;
jdEvidence: string;
cvEvidence: string;
rationale: string;
mustHave: boolean;
}
export interface CandidateRecommendations {
wordingFixes: string[];
proofGaps: string[];
likelyInterviewQuestions: string[];
titleAlignmentSuggestions: string[];
}
export interface RecruiterRecommendations {
verifyManually: string[];
weakEvidenceZones: string[];
interviewProbes: string[];
possibleFalseNegatives: string[];
}
export interface AnalysisMeta {
version: string;
analysisMode: string;
vertical: string;
generatedAt: string;
inputHash: string;
resumeLanguage?: "he" | "en" | "mixed" | "unknown";
resumeLanguageConfidence?: number;
}
export interface FitAnalysis {
domainDetection: DomainDetection;
jdRequirementsByType: Record<string, Requirement[]>;
matchedEvidenceByType: Record<string, RequirementMatch[]>;
missingRequirementsByType: Record<string, RequirementMatch[]>;
uncertaintyFlags: string[];
scoringBreakdown: ScoringBreakdown;
finalScore: number;
confidenceScore: number;
jdQualityWarnings: JDQualityWarning[];
candidateRecommendations: CandidateRecommendations;
recruiterRecommendations: RecruiterRecommendations;
evidenceMap: EvidenceMapRow[];
analysisMeta: AnalysisMeta;
profileSummary: string;
tailoredBio: string;
bulletPointOptimization: {
original: string;
optimized: string;
rationale: string;
}[];
matchedKeywords: string[];
missingKeywords: string[];
matchScore: number;
atsVisibilityScore: number;
jobFitDecision: "High" | "Medium" | "Low";
strengths: string[];
weaknesses: string[];
recommendations: string[];
scoringMode: string;
scoreLocked: boolean;
candidateViewMode: "free" | "premium_preview";
}