fraim-framework 2.0.171 → 2.0.174

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 (32) hide show
  1. package/dist/src/ai-hub/hosts.js +227 -6
  2. package/dist/src/ai-hub/server.js +1014 -35
  3. package/dist/src/cli/commands/add-ide.js +2 -0
  4. package/dist/src/cli/commands/cleanup-artifacts.js +39 -0
  5. package/dist/src/cli/commands/init-project.js +12 -5
  6. package/dist/src/cli/commands/sync.js +74 -7
  7. package/dist/src/cli/fraim.js +2 -0
  8. package/dist/src/cli/setup/ide-detector.js +6 -0
  9. package/dist/src/cli/utils/agent-adapters.js +40 -18
  10. package/dist/src/cli/utils/fraim-gitignore.js +13 -0
  11. package/dist/src/cli/utils/remote-sync.js +129 -53
  12. package/dist/src/cli/utils/user-config.js +12 -0
  13. package/dist/src/config/ai-manager-hiring.js +121 -0
  14. package/dist/src/config/compat.js +16 -0
  15. package/dist/src/config/feature-flags.js +25 -0
  16. package/dist/src/config/persona-capability-bundles.js +273 -0
  17. package/dist/src/config/persona-hiring.js +270 -0
  18. package/dist/src/config/portfolio-slug-overrides.js +17 -0
  19. package/dist/src/config/pricing.js +37 -0
  20. package/dist/src/config/stripe.js +43 -0
  21. package/dist/src/core/fraim-config-schema.generated.js +8 -2
  22. package/dist/src/core/utils/local-registry-resolver.js +26 -0
  23. package/dist/src/core/utils/project-fraim-paths.js +89 -2
  24. package/dist/src/first-run/session-service.js +9 -0
  25. package/dist/src/local-mcp-server/artifact-retention-cleanup.js +298 -0
  26. package/dist/src/local-mcp-server/learning-context-builder.js +41 -81
  27. package/dist/src/local-mcp-server/stdio-server.js +42 -7
  28. package/package.json +5 -1
  29. package/public/ai-hub/index.html +205 -89
  30. package/public/ai-hub/review.css +12 -0
  31. package/public/ai-hub/script.js +1720 -240
  32. package/public/ai-hub/styles.css +473 -6
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PERSONA_CAPABILITY_BUNDLES = exports.FREE_JOBS = void 0;
4
+ exports.isFreeJob = isFreeJob;
5
+ exports.getPersonaCapabilityBundle = getPersonaCapabilityBundle;
6
+ exports.getProtectedPersonaForJob = getProtectedPersonaForJob;
7
+ exports.listPersonaCapabilityBundles = listPersonaCapabilityBundles;
8
+ const persona_hiring_1 = require("./persona-hiring");
9
+ const persona_catalog_routes_1 = require("../routes/persona-catalog-routes");
10
+ exports.FREE_JOBS = new Set([
11
+ 'create-architecture', 'project-scaffolding',
12
+ 'blue-sky-brainstorming', 'codebase-analysis-and-ideation',
13
+ 'domain-registration-research', 'google-workspace-setup', 'github-org-setup',
14
+ 'contribute-to-fraim', 'file-fraim-issue', 'praise-fraim',
15
+ ]);
16
+ function isFreeJob(jobName) {
17
+ return exports.FREE_JOBS.has(jobName);
18
+ }
19
+ function buildCatalogMetadata(personaKey, sampleJobs) {
20
+ const persona = persona_hiring_1.PERSONA_HIRE_CATALOG[personaKey];
21
+ const pricingLabel = `${(0, persona_catalog_routes_1.formatPrice)(persona.jobPriceCents)}/job or ${(0, persona_catalog_routes_1.formatPrice)(persona.fulltimePriceCents)}/mo`;
22
+ return {
23
+ displayName: persona.displayName,
24
+ role: persona.role,
25
+ pricingLabel,
26
+ sampleJobs
27
+ };
28
+ }
29
+ exports.PERSONA_CAPABILITY_BUNDLES = {
30
+ maestro: {
31
+ personaKey: 'maestro',
32
+ bundleId: 'persona-maestro-core',
33
+ catalogMetadata: buildCatalogMetadata('maestro', ['feature-implementation', 'review-business-strategy', 'security-review', 'contract-review-analysis']),
34
+ protectedJobs: [],
35
+ protectedAliases: ['maestro', 'founder-mode'],
36
+ defaultHireMode: 'fulltime',
37
+ lockCopy: 'Hire Maestro to unlock full-brained AI employee capabilities across every function.'
38
+ },
39
+ beza: {
40
+ personaKey: 'beza',
41
+ bundleId: 'persona-beza-core',
42
+ catalogMetadata: buildCatalogMetadata('beza', ['competitive-analysis', 'review-business-strategy', 'business-plan-creation']),
43
+ protectedJobs: ['competitive-analysis', 'review-business-strategy', 'business-plan-creation', 'problem-statement-crystallization', 'business-idea-validation-and-scoping', 'founder-market-fit-analysis', 'rfp-response-preparation', 'aws-activate-credits-application', 'community-funding-preparation', 'fundraising-prospect-discovery', 'google-cloud-credits-application', 'investor-pitch-preparation', 'microsoft-azure-credits-application', 'review-funding-preparation', 'advisory-board-development', 'advisor-interview', 'advisory-board-selection'],
44
+ protectedAliases: ['business-strategy', 'company-strategy'],
45
+ defaultHireMode: 'job',
46
+ lockCopy: 'Hire BeZa to unlock business strategy work for this request.'
47
+ },
48
+ pam: {
49
+ personaKey: 'pam',
50
+ bundleId: 'persona-pam-core',
51
+ catalogMetadata: buildCatalogMetadata('pam', ['feature-specification', 'technical-design', 'issue-preparation']),
52
+ protectedJobs: ['feature-specification', 'technical-design', 'issue-preparation', 'implementation-design-review', 'issue-retrospective', 'work-completion', 'scrum-sprint-planning', 'mvp-validation-plan'],
53
+ protectedAliases: ['product-management', 'product-spec'],
54
+ defaultHireMode: 'job',
55
+ lockCopy: 'Hire PaM to unlock product-management work for this request.'
56
+ },
57
+ swen: {
58
+ personaKey: 'swen',
59
+ bundleId: 'persona-swen-core',
60
+ catalogMetadata: buildCatalogMetadata('swen', ['feature-implementation', 'code-refactoring', 'pr-iteration']),
61
+ protectedJobs: ['feature-implementation', 'code-refactoring', 'pr-iteration', 'mobile-app-development', 'mcp-server-creation', 'cloud-application-deployment', 'cloud-cost-optimization', 'cloud-performance-diagnosis', 'route-llm-spend-to-cloud-credits', 'set-up-cloud-cost-alerts', 'gitlabs-to-github', 'system-migration', 'cross-cloud-migration', 'data-pipeline-design', 'data-quality-monitoring', 'data-platform-architecture', 'write-dev-docs', 'database-schema-design'],
62
+ protectedAliases: ['software-engineering', 'implementation'],
63
+ defaultHireMode: 'job',
64
+ lockCopy: 'Hire SWEn to unlock software-engineering delivery for this request.'
65
+ },
66
+ qasm: {
67
+ personaKey: 'qasm',
68
+ bundleId: 'persona-qasm-core',
69
+ catalogMetadata: buildCatalogMetadata('qasm', ['test-execution', 'browser-application-validation', 'ui-polish-validation']),
70
+ protectedJobs: ['test-execution', 'browser-application-validation', 'ui-polish-validation', 'code-quality-assessment', 'test-quality-assessment', 'user-testing-and-bug-bash', 'broken-windows-detection-and-remediation', 'iterative-quality-improvement', 'implementation-feature-review', 'accessibility-audit', 'api-testing', 'performance-benchmarking'],
71
+ protectedAliases: ['qa', 'quality-assurance'],
72
+ defaultHireMode: 'job',
73
+ lockCopy: 'Hire QAsm to unlock QA validation for this request.'
74
+ },
75
+ huxley: {
76
+ personaKey: 'huxley',
77
+ bundleId: 'persona-huxley-core',
78
+ catalogMetadata: buildCatalogMetadata('huxley', ['design-system-creation', 'user-facing-prototyping', 'ux-research-synthesis']),
79
+ protectedJobs: ['design-system-creation', 'user-facing-prototyping', 'website-creation', 'linkedin-carousel-from-deck', 'brand-creation', 'branding-quality-audit', 'ux-research-synthesis', 'user-journey-mapping'],
80
+ protectedAliases: ['ux-design', 'brand-design'],
81
+ defaultHireMode: 'job',
82
+ lockCopy: 'Hire hUXley to unlock design-system, UX research, and brand design work for this request.'
83
+ },
84
+ gautam: {
85
+ personaKey: 'gautam',
86
+ bundleId: 'persona-gautam-core',
87
+ catalogMetadata: buildCatalogMetadata('gautam', ['analyze-revenue-system', 'build-gtm-motion', 'ppc-campaign-management']),
88
+ protectedJobs: ['pricing-strategy-definition', 'marketing-strategy-definition', 'product-launch-management', 'customer-prospect-discovery', 'evangelist-content-development', 'funnel-analysis', 'growth-loop-design', 'analyze-revenue-system', 'design-gtm-system', 'build-gtm-motion', 'build-gtm-stack', 'plan-gtm-team', 'marketing-content-creation', 'ppc-campaign-management', 'paid-social-strategy', 'ad-performance-analysis', 'tracking-and-attribution-setup', 'developer-advocacy', 'seo-strategy', 'marketing-analytics-review'],
89
+ protectedAliases: ['gtm', 'marketing'],
90
+ defaultHireMode: 'job',
91
+ lockCopy: 'Hire GauTaM to unlock go-to-market and paid media work for this request.'
92
+ },
93
+ cela: {
94
+ personaKey: 'cela',
95
+ bundleId: 'persona-cela-core',
96
+ catalogMetadata: buildCatalogMetadata('cela', ['contract-review-analysis', 'nda-creation', 'saas-contract-package-creation']),
97
+ protectedJobs: ['contract-review-analysis', 'nda-creation', 'saas-contract-package-creation', 'trademark-registration-management', 'provisional-patent-application-creation', 'opensign-cloud-esign-dispatch', 'w9-creation', 'invoice-generation', 'entity-type-selection', 'state-incorporation-filing', 'business-tax-registration', 'ein-application', 'cap-table-construction', 'founder-and-equity-agreements', 'ip-assignment-agreement-creation', 'employment-structure-decision', 'business-banking-setup'],
98
+ protectedAliases: ['legal', 'counsel'],
99
+ defaultHireMode: 'job',
100
+ lockCopy: 'Hire CELiA to unlock legal workflow support for this request.'
101
+ },
102
+ sekhar: {
103
+ personaKey: 'sekhar',
104
+ bundleId: 'persona-sekhar-core',
105
+ catalogMetadata: buildCatalogMetadata('sekhar', ['security-review', 'ai-native-security-setup', 'security-findings-command-center']),
106
+ protectedJobs: ['security-review', 'ai-native-security-setup', 'security-findings-command-center', 'vulnerability-triage-and-remediation', 'production-readiness-review', 'compliance-review', 'compliance-continuous-monitoring', 'compliance-policy-authoring', 'compliance-questionnaire-response', 'compliance-requirements-detection', 'generate-audit-evidence', 'regulation-evidence-management', 'soc2-evidence-management'],
107
+ protectedAliases: ['security', 'appsec'],
108
+ defaultHireMode: 'job',
109
+ lockCopy: 'Hire SEChar to unlock security setup, review, and findings-command work for this request.'
110
+ },
111
+ ashley: {
112
+ personaKey: 'ashley',
113
+ bundleId: 'persona-ashley-core',
114
+ catalogMetadata: buildCatalogMetadata('ashley', ['executive-assistant', 'weekly-operating-review', 'send-thank-you-notes']),
115
+ protectedJobs: ['executive-assistant', 'weekly-operating-review', 'send-thank-you-notes', 'send-newsletter', 'analyze-transcript', 'send-stakeholder-update', 'portfolio-impact-report'],
116
+ protectedAliases: ['executive-assistant', 'operations-assistant'],
117
+ defaultHireMode: 'job',
118
+ lockCopy: 'Hire AshLey to unlock executive-assistant work for this request.'
119
+ },
120
+ mandy: {
121
+ personaKey: 'mandy',
122
+ bundleId: 'persona-mandy-core',
123
+ catalogMetadata: buildCatalogMetadata('mandy', ['fully-delegate', 'project-plan-creation', 'stakeholder-status-reporting']),
124
+ protectedJobs: ['fully-delegate', 'delivery-governance-review', 'project-plan-creation', 'stakeholder-status-reporting', 'experiment-tracking', 'cross-functional-dependency-management'],
125
+ protectedAliases: ['manager', 'team-lead', 'orchestrator'],
126
+ defaultHireMode: 'job',
127
+ lockCopy: 'Hire MANdy to unlock autonomous multi-role orchestration — MANdy plans the job sequence, runs sub-agents in parallel, coaches them through verification loops, and hands back a synthesized DRAFT for your approval.'
128
+ },
129
+ ricardo: {
130
+ personaKey: 'ricardo',
131
+ bundleId: 'persona-ricardo-core',
132
+ catalogMetadata: buildCatalogMetadata('ricardo', ['role-intake-and-scorecard', 'job-posting-and-sourcing', 'candidate-pipeline-management']),
133
+ protectedJobs: ['role-intake-and-scorecard', 'job-posting-and-sourcing', 'candidate-pipeline-management', 'interview-coordination', 'offer-and-close-management'],
134
+ protectedAliases: ['recruiting', 'recruiter', 'hiring'],
135
+ defaultHireMode: 'job',
136
+ lockCopy: 'Hire RECardo to unlock full-cycle recruiting work for this request.'
137
+ },
138
+ hari: {
139
+ personaKey: 'hari',
140
+ bundleId: 'persona-hari-core',
141
+ catalogMetadata: buildCatalogMetadata('hari', ['new-hire-onboarding', 'performance-review-preparation', 'benefits-analysis-and-enrollment']),
142
+ protectedJobs: ['new-hire-onboarding', 'performance-review-preparation', 'benefits-analysis-and-enrollment', 'payroll-coordination', 'hr-business-partner-advisory'],
143
+ protectedAliases: ['hr', 'human-resources', 'people-ops'],
144
+ defaultHireMode: 'job',
145
+ lockCopy: 'Hire HaRi to unlock HR and people-ops work for this request.'
146
+ },
147
+ careena: {
148
+ personaKey: 'careena',
149
+ bundleId: 'persona-careena-core',
150
+ catalogMetadata: buildCatalogMetadata('careena', ['job-application-execution', 'pitch-and-interview-prep', 'career-networking']),
151
+ protectedJobs: ['career-spec', 'job-application-execution', 'resume-creation', 'public-profile-updates', 'career-trajectory-planning', 'pitch-and-interview-prep', 'career-networking', 'offer-negotiation', 'resilience-planning'],
152
+ protectedAliases: ['career', 'career-coach', 'job-search'],
153
+ defaultHireMode: 'job',
154
+ lockCopy: 'Hire CAREEna to unlock job-search execution, interview prep, and career coaching for this request.'
155
+ },
156
+ sade: {
157
+ personaKey: 'sade',
158
+ bundleId: 'persona-sade-core',
159
+ catalogMetadata: buildCatalogMetadata('sade', ['sf-config-deployment', 'sf-build-dashboard', 'sf-build-automation']),
160
+ protectedJobs: ['sf-config-deployment', 'sf-build-dashboard', 'sf-build-automation', 'sf-org-health-check', 'sf-user-and-access-management', 'sf-data-management'],
161
+ protectedAliases: ['salesforce', 'salesforce-developer', 'salesforce-admin'],
162
+ defaultHireMode: 'job',
163
+ lockCopy: 'Hire SADE to unlock Salesforce development and administration work for this request.'
164
+ },
165
+ sam: {
166
+ personaKey: 'sam',
167
+ bundleId: 'persona-sam-core',
168
+ catalogMetadata: buildCatalogMetadata('sam', ['crm-pipeline-review', 'outbound-sales-strategy', 'discovery-coaching']),
169
+ protectedJobs: ['crm-pipeline-review', 'outbound-sales-strategy', 'discovery-coaching', 'deal-strategy', 'proposal-development', 'account-strategy', 'sales-coaching'],
170
+ protectedAliases: ['sales', 'sales-manager', 'account-manager', 'pipeline'],
171
+ defaultHireMode: 'job',
172
+ lockCopy: 'Hire SAM to unlock full-cycle sales work for this request.'
173
+ },
174
+ casey: {
175
+ personaKey: 'casey',
176
+ bundleId: 'persona-casey-core',
177
+ catalogMetadata: buildCatalogMetadata('casey', ['support-case-resolution', 'support-sop-operationalization', 'support-system-operationalization', 'support-playbook-evaluation']),
178
+ protectedJobs: ['crm-account-health-review', 'crm-case-resolution', 'customer-health-review', 'loyalty-program-management', 'survey-campaign-management', 'support-queue-management', 'support-case-resolution', 'support-sop-operationalization', 'support-system-operationalization', 'support-playbook-evaluation'],
179
+ protectedAliases: ['customer-success', 'customer-support', 'csm', 'support'],
180
+ defaultHireMode: 'job',
181
+ lockCopy: 'Hire CaSey to unlock customer success and support work for this request.'
182
+ },
183
+ deidre: {
184
+ personaKey: 'deidre',
185
+ bundleId: 'persona-deidre-core',
186
+ catalogMetadata: buildCatalogMetadata('deidre', [
187
+ 'dei-toolkit-creation',
188
+ 'equity-pattern-analysis',
189
+ 'ai-governance-for-inclusion'
190
+ ]),
191
+ protectedJobs: [
192
+ 'dei-toolkit-creation',
193
+ 'equity-pattern-analysis',
194
+ 'ai-governance-for-inclusion',
195
+ 'ai-fluency-program-design',
196
+ 'executive-order-dei-impact-analysis',
197
+ 'erg-sop-modernization',
198
+ 'inclusion-ai-readiness-audit'
199
+ ],
200
+ protectedAliases: ['dei', 'inclusion', 'diversity', 'equity', 'erg', 'inclusion-leader'],
201
+ defaultHireMode: 'job',
202
+ lockCopy: 'Hire DEIdre to unlock equity and inclusion work for this request.'
203
+ },
204
+ mona: {
205
+ personaKey: 'mona',
206
+ bundleId: 'persona-mona-core',
207
+ catalogMetadata: buildCatalogMetadata('mona', ['financial-analysis', 'fpa-and-forecasting', 'monthly-close-review']),
208
+ protectedJobs: ['financial-analysis', 'fpa-and-forecasting', 'monthly-close-review', 'tax-strategy-planning'],
209
+ protectedAliases: ['finance', 'financial-modeling', 'fpa', 'bookkeeping'],
210
+ defaultHireMode: 'job',
211
+ lockCopy: 'Hire MONa to unlock financial modeling, FP&A, and tax strategy work for this request.'
212
+ },
213
+ sreya: {
214
+ personaKey: 'sreya',
215
+ bundleId: 'persona-sreya-core',
216
+ catalogMetadata: buildCatalogMetadata('sreya', ['slo-design-and-implementation', 'incident-response', 'reliability-review']),
217
+ protectedJobs: ['slo-design-and-implementation', 'incident-response', 'reliability-review'],
218
+ protectedAliases: ['sre', 'reliability', 'incident-response', 'on-call'],
219
+ defaultHireMode: 'job',
220
+ lockCopy: 'Hire SREya to unlock SLO governance, incident response, and production reliability work for this request.'
221
+ },
222
+ procella: {
223
+ personaKey: 'procella',
224
+ bundleId: 'persona-procella-core',
225
+ catalogMetadata: buildCatalogMetadata('procella', ['procurement-intake-and-strategy', 'rfx-package-authoring', 'proposal-response-evaluation']),
226
+ protectedJobs: [
227
+ 'procurement-intake-and-strategy',
228
+ 'supplier-discovery-and-qualification',
229
+ 'rfx-package-authoring',
230
+ 'proposal-response-evaluation',
231
+ 'procurement-negotiation-prep',
232
+ 'purchase-approval-and-po-package',
233
+ 'equipment-acceptance-and-supplier-retrospective',
234
+ 'supplier-performance-review'
235
+ ],
236
+ protectedAliases: ['procurement', 'sourcing', 'purchasing', 'supplier-management'],
237
+ defaultHireMode: 'job',
238
+ lockCopy: 'Hire PROCella to unlock procurement strategy, supplier sourcing, RFx, quote evaluation, and supplier performance work for this request.'
239
+ },
240
+ banke: {
241
+ personaKey: 'banke',
242
+ bundleId: 'persona-banke-core',
243
+ catalogMetadata: buildCatalogMetadata('banke', ['kyc-case-review']),
244
+ protectedJobs: ['kyc-case-review'],
245
+ protectedAliases: ['banking', 'kyc', 'account-aggregator'],
246
+ defaultHireMode: 'job',
247
+ lockCopy: 'Hire BANKe to unlock banking KYC evidence review work for this request.'
248
+ },
249
+ auditya: {
250
+ personaKey: 'auditya',
251
+ bundleId: 'persona-auditya-core',
252
+ catalogMetadata: buildCatalogMetadata('auditya', ['banking-evidence-audit']),
253
+ protectedJobs: ['banking-evidence-audit'],
254
+ protectedAliases: ['banking-audit', 'kyc-audit', 'audit'],
255
+ defaultHireMode: 'job',
256
+ lockCopy: 'Hire AUDITya to unlock banking evidence audit work for this request.'
257
+ }
258
+ };
259
+ const PROTECTED_JOB_TO_PERSONA = new Map();
260
+ for (const bundle of Object.values(exports.PERSONA_CAPABILITY_BUNDLES)) {
261
+ for (const jobName of bundle.protectedJobs) {
262
+ PROTECTED_JOB_TO_PERSONA.set(jobName, bundle.personaKey);
263
+ }
264
+ }
265
+ function getPersonaCapabilityBundle(personaKey) {
266
+ return exports.PERSONA_CAPABILITY_BUNDLES[personaKey];
267
+ }
268
+ function getProtectedPersonaForJob(jobName) {
269
+ return PROTECTED_JOB_TO_PERSONA.get(jobName) || null;
270
+ }
271
+ function listPersonaCapabilityBundles() {
272
+ return Object.values(exports.PERSONA_CAPABILITY_BUNDLES);
273
+ }
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PERSONA_AVATAR_CATALOG = exports.PERSONA_HIRE_CATALOG = void 0;
4
+ exports.buildPersonaAvatarUrl = buildPersonaAvatarUrl;
5
+ exports.isPersonaHireKey = isPersonaHireKey;
6
+ exports.getPersonaHireAmountCents = getPersonaHireAmountCents;
7
+ /**
8
+ * PERSONA_HIRE_CATALOG — single source of truth for all AI employee identity,
9
+ * pricing, and card-display fields.
10
+ *
11
+ * Fields added in issue #545:
12
+ * emoji — avatar icon rendered on persona cards
13
+ * gradient — CSS gradient string for card background accent
14
+ * blurb — 1-2 sentence marketing description shown on persona cards
15
+ *
16
+ * These were previously hard-coded in fraim-pro/index.html and
17
+ * fraim-pro/pricing.html. Moving them here makes this catalog the single
18
+ * authoritative record for everything a card needs to render, served via
19
+ * GET /api/personas/catalog.
20
+ */
21
+ exports.PERSONA_HIRE_CATALOG = {
22
+ maestro: {
23
+ displayName: 'MAESTRO',
24
+ role: 'Full-Brained AI Employee',
25
+ emoji: '★',
26
+ gradient: 'linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #d946ef 100%)',
27
+ blurb: 'One AI employee who can take a job from any function and ship it back with evidence. You set the direction. You sign off on what ships. Maestro does the work.',
28
+ jobPriceCents: 24900, // $249 — full-time only; job mode maps to same price
29
+ fulltimePriceCents: 24900, // $249/mo
30
+ },
31
+ beza: {
32
+ displayName: 'BeZa',
33
+ role: 'AI Business Strategist',
34
+ emoji: '🧭',
35
+ gradient: 'linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)',
36
+ blurb: 'Turns ideas into structured business plans, validates founder-market fit, and pressure-tests strategy.',
37
+ jobPriceCents: 990,
38
+ fulltimePriceCents: 4990,
39
+ },
40
+ pam: {
41
+ displayName: 'PaM',
42
+ role: 'AI Product Manager',
43
+ emoji: '📋',
44
+ gradient: 'linear-gradient(135deg, #8b5cf6 0%, #d946ef 100%)',
45
+ blurb: 'Owns specs, PRDs, technical design, issue prep, and the path from idea to shippable artifact.',
46
+ jobPriceCents: 790,
47
+ fulltimePriceCents: 4990,
48
+ },
49
+ swen: {
50
+ displayName: 'SWEn',
51
+ role: 'AI Software Engineer',
52
+ emoji: '💻',
53
+ gradient: 'linear-gradient(135deg, #2563eb 0%, #06b6d4 100%)',
54
+ blurb: 'Implements features, refactors code, and drives PR iteration to merge, reviewing design and code as a senior would.',
55
+ jobPriceCents: 1290,
56
+ fulltimePriceCents: 5990,
57
+ },
58
+ qasm: {
59
+ displayName: 'QAsm',
60
+ role: 'AI QA Engineer',
61
+ emoji: '🛡️',
62
+ gradient: 'linear-gradient(135deg, #10b981 0%, #14b8a6 100%)',
63
+ blurb: 'Runs tests, assesses code and test quality, polishes UI, and drives bug bashes with evidence.',
64
+ jobPriceCents: 590,
65
+ fulltimePriceCents: 3990,
66
+ },
67
+ huxley: {
68
+ displayName: 'hUXley',
69
+ role: 'AI UX / Brand Designer',
70
+ emoji: '🎨',
71
+ gradient: 'linear-gradient(135deg, #ec4899 0%, #f472b6 100%)',
72
+ blurb: 'Builds design systems, prototypes polished user-facing surfaces, and carries brand decisions into shipped product experiences.',
73
+ jobPriceCents: 1490,
74
+ fulltimePriceCents: 5490,
75
+ },
76
+ gautam: {
77
+ displayName: 'GauTaM',
78
+ role: 'AI GTM & Marketing Manager',
79
+ emoji: '📣',
80
+ gradient: 'linear-gradient(135deg, #f97316 0%, #f59e0b 100%)',
81
+ blurb: 'Defines marketing strategy, ships content, runs launches, and owns the brand voice in market.',
82
+ jobPriceCents: 890,
83
+ fulltimePriceCents: 4990,
84
+ },
85
+ cela: {
86
+ displayName: 'CELiA',
87
+ role: 'AI Legal Counsel',
88
+ emoji: '⚖️',
89
+ gradient: 'linear-gradient(135deg, #475569 0%, #6366f1 100%)',
90
+ blurb: 'Drafts and reviews contracts, NDAs, patents, trademarks, and the SaaS legal stack.',
91
+ jobPriceCents: 1990,
92
+ fulltimePriceCents: 6990,
93
+ },
94
+ sekhar: {
95
+ displayName: 'SEChar',
96
+ role: 'AI Security Engineer',
97
+ emoji: '🔒',
98
+ gradient: 'linear-gradient(135deg, #ef4444 0%, #f43f5e 100%)',
99
+ blurb: 'Sets up AI-native security baselines, runs the findings command center, reviews changes for risk, and drives remediation to closure.',
100
+ jobPriceCents: 1790,
101
+ fulltimePriceCents: 6490,
102
+ },
103
+ ashley: {
104
+ displayName: 'AshLey',
105
+ role: 'AI Executive Assistant',
106
+ emoji: '📅',
107
+ gradient: 'linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%)',
108
+ blurb: 'Owns executive coordination, weekly operating reviews, and portfolio reporting across the workforce.',
109
+ jobPriceCents: 490,
110
+ fulltimePriceCents: 2990,
111
+ },
112
+ mandy: {
113
+ displayName: 'MANdy',
114
+ role: 'AI Manager',
115
+ emoji: '🎯',
116
+ gradient: 'linear-gradient(135deg, #7c3aed 0%, #4338ca 100%)',
117
+ blurb: 'Plans the job sequence, runs sub-agents in parallel, coaches them through verification loops, and hands back a synthesized DRAFT for your approval.',
118
+ jobPriceCents: 1490,
119
+ fulltimePriceCents: 5990,
120
+ },
121
+ ricardo: {
122
+ displayName: 'RECardo',
123
+ role: 'AI Recruiter',
124
+ emoji: '🤝',
125
+ gradient: 'linear-gradient(135deg, #6366f1 0%, #ec4899 100%)',
126
+ blurb: 'Sources candidates, writes job descriptions, screens pipelines, and manages the hiring loop end-to-end.',
127
+ jobPriceCents: 790,
128
+ fulltimePriceCents: 4490,
129
+ },
130
+ hari: {
131
+ displayName: 'HaRi',
132
+ role: 'AI HR Manager',
133
+ emoji: '👥',
134
+ gradient: 'linear-gradient(135deg, #0d9488 0%, #059669 100%)',
135
+ blurb: 'Manages onboarding, performance reviews, benefits analysis, payroll coordination, and HR business-partner advisory.',
136
+ jobPriceCents: 790,
137
+ fulltimePriceCents: 4490,
138
+ },
139
+ careena: {
140
+ displayName: 'CAREEna',
141
+ role: 'AI Career Coach',
142
+ emoji: '🎓',
143
+ gradient: 'linear-gradient(135deg, #0ea5e9 0%, #6366f1 100%)',
144
+ blurb: 'Runs the candidate-side search loop: role sourcing, application execution, networking, interview prep, and close-stage offer strategy.',
145
+ jobPriceCents: 890,
146
+ fulltimePriceCents: 4990,
147
+ },
148
+ sade: {
149
+ displayName: 'SADE',
150
+ role: 'AI Salesforce Developer',
151
+ emoji: '☁️',
152
+ gradient: 'linear-gradient(135deg, #0284c7 0%, #0369a1 100%)',
153
+ blurb: 'Deploys Salesforce configuration from ServiceNow tickets, builds reports and dashboards, creates Flows from business requirements, audits org health, and manages users and data at scale.',
154
+ jobPriceCents: 1490,
155
+ fulltimePriceCents: 6490,
156
+ },
157
+ sam: {
158
+ displayName: 'SAM',
159
+ role: 'AI Sales Account Manager',
160
+ emoji: '📈',
161
+ gradient: 'linear-gradient(135deg, #059669 0%, #0d9488 100%)',
162
+ blurb: 'Surfaces stalled deals, computes pipeline health, and drafts account-specific re-engagement proposals for your top at-risk opportunities.',
163
+ jobPriceCents: 1290,
164
+ fulltimePriceCents: 5990,
165
+ },
166
+ casey: {
167
+ displayName: 'CaSey',
168
+ role: 'AI Customer Success + Support',
169
+ emoji: '💬',
170
+ gradient: 'linear-gradient(135deg, #db2777 0%, #9333ea 100%)',
171
+ blurb: 'Scores account churn risk and expansion potential, generates prioritized action plans for CSMs, triages support cases, and routes L1 cases through automated resolution.',
172
+ jobPriceCents: 990,
173
+ fulltimePriceCents: 4990,
174
+ },
175
+ deidre: {
176
+ displayName: 'DEIdre',
177
+ role: 'AI Inclusion Leader',
178
+ emoji: '🌍',
179
+ gradient: 'linear-gradient(135deg, #9333ea 0%, #d946ef 100%)',
180
+ blurb: 'Audits equity gaps, designs bias-aware AI governance, builds ERG toolkits, and creates inclusion-fluency programs.',
181
+ jobPriceCents: 890,
182
+ fulltimePriceCents: 4490,
183
+ },
184
+ mona: {
185
+ displayName: 'MONa',
186
+ role: 'AI Finance Manager',
187
+ emoji: '💰',
188
+ gradient: 'linear-gradient(135deg, #10b981 0%, #f59e0b 100%)',
189
+ blurb: 'Models revenue, tracks unit economics, builds financial forecasts, and owns the metrics that drive growth decisions.',
190
+ jobPriceCents: 990,
191
+ fulltimePriceCents: 4990,
192
+ },
193
+ sreya: {
194
+ displayName: 'SREya',
195
+ role: 'AI Site Reliability Engineer',
196
+ emoji: '☁️',
197
+ gradient: 'linear-gradient(135deg, #2563eb 0%, #10b981 100%)',
198
+ blurb: 'Manages deployments, monitors uptime, optimizes cloud cost, and keeps infrastructure resilient and observable.',
199
+ jobPriceCents: 1290,
200
+ fulltimePriceCents: 5990,
201
+ },
202
+ procella: {
203
+ displayName: 'PROCella',
204
+ role: 'AI Procurement Manager',
205
+ emoji: '📦',
206
+ gradient: 'linear-gradient(135deg, #0f766e 0%, #7c3aed 100%)',
207
+ blurb: 'Frames procurement strategy, sources suppliers, runs RFx packages, evaluates responses, and keeps purchases acceptance-gated.',
208
+ jobPriceCents: 990,
209
+ fulltimePriceCents: 4990,
210
+ },
211
+ banke: {
212
+ displayName: 'BANKe',
213
+ role: 'AI Banking KYC Employee',
214
+ emoji: '\u{1F3E6}',
215
+ gradient: 'linear-gradient(135deg, #0f766e 0%, #2563eb 100%)',
216
+ blurb: 'Runs banking KYC cases with consent-aware evidence capture, decision receipts, and stable audit handoff artifacts.',
217
+ jobPriceCents: 1490,
218
+ fulltimePriceCents: 6490,
219
+ },
220
+ auditya: {
221
+ displayName: 'AUDITya',
222
+ role: 'AI Banking Auditor',
223
+ emoji: '\u{1F50E}',
224
+ gradient: 'linear-gradient(135deg, #7c3aed 0%, #0f172a 100%)',
225
+ blurb: 'Audits AI banking work by tracing decisions back to evidence, receipts, exceptions, and reusable audit reports.',
226
+ jobPriceCents: 1490,
227
+ fulltimePriceCents: 6490,
228
+ },
229
+ };
230
+ exports.PERSONA_AVATAR_CATALOG = {
231
+ maestro: { seed: 'MAESTRO-founder-mode', bg: 'fde68a', style: 'notionists' },
232
+ beza: { seed: 'BEZA-strategist', bg: 'c7d2fe', style: 'notionists' },
233
+ pam: { seed: 'PAM-product', bg: 'ddd6fe', style: 'notionists' },
234
+ swen: { seed: 'SWEN-engineer', bg: 'bfdbfe', style: 'notionists' },
235
+ qasm: { seed: 'QASM-quality', bg: 'a7f3d0', style: 'notionists' },
236
+ huxley: { seed: 'HUXLEY-design', bg: 'fbcfe8', style: 'notionists' },
237
+ gautam: { seed: 'Gautam-marketing', bg: 'fed7aa', style: 'notionists' },
238
+ cela: { seed: 'CELA-legal', bg: 'cbd5e1', style: 'notionists' },
239
+ sekhar: { seed: 'SEKHAR-security', bg: 'fecaca', style: 'notionists' },
240
+ ashley: { seed: 'Ashley-assistant', bg: 'fde68a', style: 'notionists' },
241
+ mandy: { seed: 'MANDY-manager', bg: 'ede9fe', style: 'notionists' },
242
+ ricardo: { seed: 'RICARDO-recruiter', bg: 'ede9fe', style: 'notionists' },
243
+ hari: { seed: 'HARI-hr', bg: 'ccfbf1', style: 'notionists' },
244
+ careena: { seed: 'CAREENA-career-coach', bg: 'e0f2fe', style: 'notionists' },
245
+ sade: { seed: 'SADE-salesforce', bg: 'bae6fd', style: 'notionists' },
246
+ sam: { seed: 'SAM-sales-account', bg: 'd1fae5', style: 'notionists' },
247
+ casey: { seed: 'CASEY-cx', bg: 'a5f3fc', style: 'notionists' },
248
+ deidre: { seed: 'DEIDRE-inclusion-leader', bg: 'e9d5ff', style: 'notionists' },
249
+ mona: { seed: 'MONA-finance', bg: 'd1fae5', style: 'notionists' },
250
+ sreya: { seed: 'SREYA-sre-cloud', bg: 'bbf7d0', style: 'notionists' },
251
+ procella: { seed: 'PROCELLA-procurement', bg: 'ccfbf1', style: 'notionists' },
252
+ banke: { seed: 'BANKe-banking-kyc', bg: 'ccfbf1', style: 'notionists' },
253
+ auditya: { seed: 'AUDITya-banking-audit', bg: 'e9d5ff', style: 'notionists' },
254
+ };
255
+ function buildPersonaAvatarUrl(personaKey) {
256
+ const avatar = exports.PERSONA_AVATAR_CATALOG[personaKey];
257
+ const params = new URLSearchParams({
258
+ seed: avatar.seed,
259
+ backgroundColor: avatar.bg,
260
+ radius: '50',
261
+ });
262
+ return `https://api.dicebear.com/9.x/${avatar.style}/svg?${params.toString()}`;
263
+ }
264
+ function isPersonaHireKey(value) {
265
+ return value in exports.PERSONA_HIRE_CATALOG;
266
+ }
267
+ function getPersonaHireAmountCents(personaKey, mode) {
268
+ const persona = exports.PERSONA_HIRE_CATALOG[personaKey];
269
+ return mode === 'fulltime' ? persona.fulltimePriceCents : persona.jobPriceCents;
270
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PORTFOLIO_SLUG_OVERRIDES = void 0;
4
+ /**
5
+ * Portfolio filename slug overrides.
6
+ *
7
+ * When a persona's portfolio HTML file name differs from the persona key,
8
+ * add an entry here. Both `scripts/validate-employee-catalog.ts` and
9
+ * `src/routes/persona-catalog-routes.ts` import from this single module so
10
+ * the override map is defined exactly once.
11
+ *
12
+ * Issue #545.
13
+ */
14
+ exports.PORTFOLIO_SLUG_OVERRIDES = {
15
+ cela: 'celia',
16
+ sekhar: 'sechar',
17
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ // Shared pricing configuration
3
+ // Used by both backend (payment-calculator.ts) and frontend (payment.js via API)
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.CONSUMER_EMAIL_DOMAINS = exports.FOUNDER_DISCOUNT_RATE = exports.MANAGED_PRICING = exports.FIXED_FEES = exports.PRICING = void 0;
6
+ exports.PRICING = {
7
+ 'self-served': {
8
+ monthly: 20000, // $200/user/month
9
+ annual: 199200, // $200/user/month * 12 months * 0.83 (17% annual discount)
10
+ },
11
+ 'managed': {
12
+ monthly: 20000, // $200/user/month (license cost)
13
+ annual: 199200, // $200/user/month * 12 months * 0.83 (17% annual discount)
14
+ },
15
+ };
16
+ exports.FIXED_FEES = {
17
+ 'self-served': 0,
18
+ 'managed': 0,
19
+ };
20
+ // Managed plan: $200/user/month (license) + $10K per group of 10 (training/support)
21
+ exports.MANAGED_PRICING = {
22
+ trainingFeePerGroup: 1000000, // $10,000 training/support per group of 10 licenses
23
+ licensesPerGroup: 10,
24
+ monthly: 1000000, // $10,000 training fee per group/month
25
+ annual: 9960000, // $10,000 training fee per group/month * 12 months * 0.83 (17% annual discount)
26
+ };
27
+ exports.FOUNDER_DISCOUNT_RATE = 0.90; // Discount rate for startups and academia (90% off)
28
+ exports.CONSUMER_EMAIL_DOMAINS = [
29
+ 'gmail.com',
30
+ 'yahoo.com',
31
+ 'hotmail.com',
32
+ 'outlook.com',
33
+ 'aol.com',
34
+ 'icloud.com',
35
+ 'protonmail.com',
36
+ 'mail.com',
37
+ ];
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.STRIPE_CONFIG = exports.stripe = void 0;
7
+ const stripe_1 = __importDefault(require("stripe"));
8
+ // Lazy initialization to allow environment variables to be loaded first
9
+ let stripeInstance = null;
10
+ function getStripe() {
11
+ if (!stripeInstance) {
12
+ if (!process.env.STRIPE_SECRET_KEY) {
13
+ throw new Error('STRIPE_SECRET_KEY environment variable is required');
14
+ }
15
+ stripeInstance = new stripe_1.default(process.env.STRIPE_SECRET_KEY, {
16
+ apiVersion: '2026-01-28.clover',
17
+ typescript: true,
18
+ });
19
+ }
20
+ return stripeInstance;
21
+ }
22
+ exports.stripe = new Proxy({}, {
23
+ get(target, prop) {
24
+ return getStripe()[prop];
25
+ }
26
+ });
27
+ exports.STRIPE_CONFIG = {
28
+ get publishableKey() {
29
+ if (!process.env.STRIPE_PUBLISHABLE_KEY) {
30
+ throw new Error('STRIPE_PUBLISHABLE_KEY environment variable is required');
31
+ }
32
+ return process.env.STRIPE_PUBLISHABLE_KEY;
33
+ },
34
+ get webhookSecret() {
35
+ if (!process.env.STRIPE_WEBHOOK_SECRET) {
36
+ throw new Error('STRIPE_WEBHOOK_SECRET environment variable is required');
37
+ }
38
+ return process.env.STRIPE_WEBHOOK_SECRET;
39
+ },
40
+ currency: 'usd',
41
+ successUrl: process.env.STRIPE_SUCCESS_URL || 'https://fraimworks.ai/payment-success.html',
42
+ cancelUrl: process.env.STRIPE_CANCEL_URL || 'https://fraimworks.ai/pricing.html',
43
+ };