118 lines
4.8 KiB
TypeScript
118 lines
4.8 KiB
TypeScript
import { config } from "../config.js";
|
|
|
|
export type GrowServiceId = "resume-service" | "interview-service" | "roleplay-service" | "qscore-service" | "social-branding-service" | "matchmaking-service";
|
|
export type GrowFeatureId = "resume-building" | "mock-interview" | "mock-roleplay" | "q-score" | "social-branding" | "matchmaking";
|
|
|
|
export type GrowFeatureDefinition = {
|
|
id: GrowFeatureId;
|
|
serviceId: GrowServiceId;
|
|
title: string;
|
|
label: string;
|
|
description: string;
|
|
promptModulePath: string;
|
|
enabled: boolean;
|
|
internalUrl?: string;
|
|
publicUrl?: string;
|
|
operations: string[];
|
|
};
|
|
|
|
export const featureDefinitions: GrowFeatureDefinition[] = [
|
|
{
|
|
id: "resume-building",
|
|
serviceId: "resume-service",
|
|
title: "Resume Building",
|
|
label: "Resume",
|
|
description: "Build, tailor, analyze, and improve resumes for role fit and ATS readiness.",
|
|
promptModulePath: "agents/resume.md",
|
|
enabled: Boolean(config.resumeServiceUrl),
|
|
internalUrl: config.resumeServiceUrl,
|
|
publicUrl: config.resumePublicUrl,
|
|
operations: ["resume.state", "resume.templates", "resume.a2aTask", "resume.create", "resume.update", "resume.analyze", "resume.suggestions", "resume.copilot", "resume.optimizeSummary", "resume.optimizeExperience", "resume.suggestSkills", "resume.generateSummary", "resume.versions", "resume.preview"],
|
|
},
|
|
{
|
|
id: "mock-interview",
|
|
serviceId: "interview-service",
|
|
title: "Mock Interview",
|
|
label: "Interview",
|
|
description: "Configure, practice, review, and score interview sessions.",
|
|
promptModulePath: "agents/interview.md",
|
|
enabled: Boolean(config.interviewServiceUrl),
|
|
internalUrl: config.interviewServiceUrl,
|
|
publicUrl: config.interviewPublicUrl,
|
|
operations: ["interview.configure", "interview.preview", "interview.questions", "interview.approve", "interview.assignments", "interview.unassign", "interview.resultsBulk", "interview.review", "interview.leaderboard", "interview.artifacts", "interview.videoUpload", "interview.practice"],
|
|
},
|
|
{
|
|
id: "mock-roleplay",
|
|
serviceId: "roleplay-service",
|
|
title: "Mock Roleplay",
|
|
label: "Roleplay",
|
|
description: "Practice negotiations, recruiter calls, manager conversations, and stakeholder roleplays.",
|
|
promptModulePath: "agents/roleplay.md",
|
|
enabled: Boolean(config.roleplayServiceUrl),
|
|
internalUrl: config.roleplayServiceUrl,
|
|
publicUrl: config.roleplayPublicUrl,
|
|
operations: ["roleplay.configure", "roleplay.preview", "roleplay.questions", "roleplay.approve", "roleplay.assignments", "roleplay.unassign", "roleplay.resultsBulk", "roleplay.review", "roleplay.leaderboard", "roleplay.artifacts", "roleplay.videoUpload", "roleplay.practice"],
|
|
},
|
|
{
|
|
id: "q-score",
|
|
serviceId: "qscore-service",
|
|
title: "Q Score",
|
|
label: "Q Score",
|
|
description: "Analyze overall job-market readiness and convert signals into improvement priorities.",
|
|
promptModulePath: "agents/qscore.md",
|
|
enabled: Boolean(config.qscoreServiceUrl),
|
|
internalUrl: config.qscoreServiceUrl,
|
|
operations: ["qscore.ingest", "qscore.compute"],
|
|
},
|
|
{
|
|
id: "social-branding",
|
|
serviceId: "social-branding-service",
|
|
title: "Social Branding",
|
|
label: "Branding",
|
|
description: "Build and optimize your professional profile, LinkedIn presence, and personal brand.",
|
|
promptModulePath: "agents/social-branding.md",
|
|
enabled: Boolean(config.socialBrandingServiceUrl),
|
|
internalUrl: config.socialBrandingServiceUrl,
|
|
operations: ["branding.profile", "branding.linkedin", "branding.content", "branding.analyze"],
|
|
},
|
|
{
|
|
id: "matchmaking",
|
|
serviceId: "matchmaking-service",
|
|
title: "Matchmaking",
|
|
label: "Matchmaking",
|
|
description: "Connect with relevant professionals, mentors, and opportunities through curated matching.",
|
|
promptModulePath: "agents/matchmaking.md",
|
|
enabled: Boolean(config.matchmakingServiceUrl),
|
|
internalUrl: config.matchmakingServiceUrl,
|
|
operations: ["matchmaking.find", "matchmaking.connect", "matchmaking.schedule", "matchmaking.review"],
|
|
},
|
|
];
|
|
|
|
export const internalWorkflowModules = [
|
|
{
|
|
id: "mission-planning",
|
|
title: "Mission Planning",
|
|
label: "Mission Planning",
|
|
description: "Internal planning and artifact drafting for a mission. This is not a user-facing feature service.",
|
|
execution: "opencode" as const,
|
|
},
|
|
];
|
|
|
|
export function listFeatureDefinitions() {
|
|
return featureDefinitions;
|
|
}
|
|
|
|
export function getFeatureByServiceId(serviceId: string) {
|
|
return featureDefinitions.find((feature) => feature.serviceId === serviceId);
|
|
}
|
|
|
|
export function displayLabelForService(serviceId: string | undefined) {
|
|
if (!serviceId) return undefined;
|
|
return getFeatureByServiceId(serviceId)?.label;
|
|
}
|
|
|
|
export function displayLabelForExecution(execution: string) {
|
|
if (execution === "opencode") return "Mission Planning";
|
|
return undefined;
|
|
}
|