faf-cli 2.3.5 → 2.4.1
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.
- package/README.md +15 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +128 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.d.ts +10 -0
- package/dist/commands/about.d.ts.map +1 -0
- package/dist/commands/about.js +249 -0
- package/dist/commands/about.js.map +1 -0
- package/dist/commands/art.d.ts +10 -0
- package/dist/commands/art.d.ts.map +1 -0
- package/dist/commands/art.js +130 -0
- package/dist/commands/art.js.map +1 -0
- package/dist/commands/license-config.d.ts +10 -0
- package/dist/commands/license-config.d.ts.map +1 -0
- package/dist/commands/license-config.js +140 -0
- package/dist/commands/license-config.js.map +1 -0
- package/dist/commands/license.d.ts +7 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +60 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/score-v3.d.ts.map +1 -1
- package/dist/commands/score-v3.js +14 -7
- package/dist/commands/score-v3.js.map +1 -1
- package/dist/commands/score.d.ts.map +1 -1
- package/dist/commands/score.js +30 -10
- package/dist/commands/score.js.map +1 -1
- package/dist/commands/submit-art.d.ts +25 -0
- package/dist/commands/submit-art.d.ts.map +1 -0
- package/dist/commands/submit-art.js +348 -0
- package/dist/commands/submit-art.js.map +1 -0
- package/dist/engine/engine-loader.d.ts +24 -0
- package/dist/engine/engine-loader.d.ts.map +1 -0
- package/dist/engine/engine-loader.js +156 -0
- package/dist/engine/engine-loader.js.map +1 -0
- package/dist/engine-bridge.d.ts +5 -5
- package/dist/engine-bridge.d.ts.map +1 -1
- package/dist/engine-bridge.js +20 -7
- package/dist/engine-bridge.js.map +1 -1
- package/dist/engine-mk2/mk2-core.d.ts +38 -0
- package/dist/engine-mk2/mk2-core.d.ts.map +1 -0
- package/dist/engine-mk2/mk2-core.js +217 -0
- package/dist/engine-mk2/mk2-core.js.map +1 -0
- package/dist/license/license-config.d.ts +59 -0
- package/dist/license/license-config.d.ts.map +1 -0
- package/dist/license/license-config.js +263 -0
- package/dist/license/license-config.js.map +1 -0
- package/dist/license/license-controller.d.ts +41 -0
- package/dist/license/license-controller.d.ts.map +1 -0
- package/dist/license/license-controller.js +243 -0
- package/dist/license/license-controller.js.map +1 -0
- package/dist/utils/art-gallery.d.ts +66 -0
- package/dist/utils/art-gallery.d.ts.map +1 -0
- package/dist/utils/art-gallery.js +320 -0
- package/dist/utils/art-gallery.js.map +1 -0
- package/dist/utils/championship-style.d.ts +1 -1
- package/dist/utils/championship-style.d.ts.map +1 -1
- package/dist/utils/championship-style.js +17 -13
- package/dist/utils/championship-style.js.map +1 -1
- package/dist/utils/score-header.d.ts +22 -0
- package/dist/utils/score-header.d.ts.map +1 -0
- package/dist/utils/score-header.js +85 -0
- package/dist/utils/score-header.js.map +1 -0
- package/dist/utils/score-indicators.d.ts +47 -0
- package/dist/utils/score-indicators.d.ts.map +1 -0
- package/dist/utils/score-indicators.js +197 -0
- package/dist/utils/score-indicators.js.map +1 -0
- package/package.json +8 -3
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🏎️ FAF Engine MK-2 Core
|
|
3
|
+
* Championship Edition - The Secret Sauce
|
|
4
|
+
*/
|
|
5
|
+
declare const MK2_SIGNATURE = "FAF-ENGINE-MK2-CHAMPIONSHIP";
|
|
6
|
+
/**
|
|
7
|
+
* FAF Engine MK-2 - Main Class
|
|
8
|
+
*/
|
|
9
|
+
export declare class FafEngineMK2 {
|
|
10
|
+
private fabFormats;
|
|
11
|
+
private dnaManager;
|
|
12
|
+
private licenseLevel;
|
|
13
|
+
private initialized;
|
|
14
|
+
constructor(licenseKey?: string);
|
|
15
|
+
/**
|
|
16
|
+
* Initialize MK-2 engine
|
|
17
|
+
*/
|
|
18
|
+
private initialize;
|
|
19
|
+
/**
|
|
20
|
+
* Analyze project with MK-2 intelligence
|
|
21
|
+
*/
|
|
22
|
+
analyzeProject(projectPath: string): Promise<any>;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate championship score
|
|
25
|
+
*/
|
|
26
|
+
calculateScore(data: any): Promise<any>;
|
|
27
|
+
/**
|
|
28
|
+
* Generate checksum for verification
|
|
29
|
+
*/
|
|
30
|
+
private generateChecksum;
|
|
31
|
+
/**
|
|
32
|
+
* Get engine info
|
|
33
|
+
*/
|
|
34
|
+
getInfo(): any;
|
|
35
|
+
}
|
|
36
|
+
export default FafEngineMK2;
|
|
37
|
+
export { FafEngineMK2, MK2_SIGNATURE };
|
|
38
|
+
//# sourceMappingURL=mk2-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mk2-core.d.ts","sourceRoot":"","sources":["../../src/engine-mk2/mk2-core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,QAAA,MAAM,aAAa,gCAAgC,CAAC;AAwEpD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkB;gBAEzB,UAAU,CAAC,EAAE,MAAM;IAW/B;;OAEG;YACW,UAAU;IAYxB;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAgCvD;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAmC7C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,IAAI,GAAG;CAgBf;AAeD,eAAe,YAAY,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🏎️ FAF Engine MK-2 Core
|
|
4
|
+
* Championship Edition - The Secret Sauce
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MK2_SIGNATURE = exports.FafEngineMK2 = void 0;
|
|
8
|
+
// Import all proprietary modules (these will be bundled and obfuscated)
|
|
9
|
+
const fab_formats_processor_1 = require("../engines/fab-formats-processor");
|
|
10
|
+
const relentless_context_extractor_1 = require("../engines/relentless-context-extractor");
|
|
11
|
+
const faf_dna_1 = require("../engines/faf-dna");
|
|
12
|
+
const turbo_cat_knowledge_1 = require("../utils/turbo-cat-knowledge");
|
|
13
|
+
// MK-2 Version identifier
|
|
14
|
+
const MK2_SIGNATURE = 'FAF-ENGINE-MK2-CHAMPIONSHIP';
|
|
15
|
+
exports.MK2_SIGNATURE = MK2_SIGNATURE;
|
|
16
|
+
const BUILD_TIME = process.env.ENGINE_BUILD || Date.now();
|
|
17
|
+
/**
|
|
18
|
+
* License validation for MK-2
|
|
19
|
+
*/
|
|
20
|
+
class MK2LicenseValidator {
|
|
21
|
+
static CHECKSUM = 'mk2-2025-championship';
|
|
22
|
+
static validatedCache = new Map();
|
|
23
|
+
static validate(key) {
|
|
24
|
+
if (!key)
|
|
25
|
+
return 'free';
|
|
26
|
+
// Cache validation results
|
|
27
|
+
if (this.validatedCache.has(key)) {
|
|
28
|
+
return this.validatedCache.get(key) ? 'championship' : 'free';
|
|
29
|
+
}
|
|
30
|
+
// Simple validation (enhanced in obfuscated version)
|
|
31
|
+
const isValid = key.includes('MK2') || key.startsWith('dev_');
|
|
32
|
+
this.validatedCache.set(key, isValid);
|
|
33
|
+
if (key.startsWith('CHAMPIONSHIP'))
|
|
34
|
+
return 'championship';
|
|
35
|
+
if (key.startsWith('dev_'))
|
|
36
|
+
return 'developer';
|
|
37
|
+
return 'free';
|
|
38
|
+
}
|
|
39
|
+
static getScoreLimit(level) {
|
|
40
|
+
switch (level) {
|
|
41
|
+
case 'championship': return 100;
|
|
42
|
+
case 'developer': return 85;
|
|
43
|
+
default: return 70;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Self-protection mechanisms
|
|
49
|
+
*/
|
|
50
|
+
class MK2Protection {
|
|
51
|
+
static tamperDetected = false;
|
|
52
|
+
static initialize() {
|
|
53
|
+
// Detect debugger
|
|
54
|
+
const detectDebugger = () => {
|
|
55
|
+
const start = Date.now();
|
|
56
|
+
// debugger; // Uncomment in production
|
|
57
|
+
const duration = Date.now() - start;
|
|
58
|
+
if (duration > 100) {
|
|
59
|
+
this.tamperDetected = true;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
// Check periodically
|
|
63
|
+
setInterval(detectDebugger, 5000);
|
|
64
|
+
// Detect tampering via function toString
|
|
65
|
+
const originalToString = Function.prototype.toString;
|
|
66
|
+
Function.prototype.toString = function (...args) {
|
|
67
|
+
if (this === FafEngineMK2 || this === MK2Protection) {
|
|
68
|
+
MK2Protection.tamperDetected = true;
|
|
69
|
+
return 'function() { [native code] }';
|
|
70
|
+
}
|
|
71
|
+
return originalToString.apply(this, args);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
static checkIntegrity() {
|
|
75
|
+
return !this.tamperDetected;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* FAF Engine MK-2 - Main Class
|
|
80
|
+
*/
|
|
81
|
+
class FafEngineMK2 {
|
|
82
|
+
fabFormats;
|
|
83
|
+
dnaManager = null;
|
|
84
|
+
licenseLevel;
|
|
85
|
+
initialized = false;
|
|
86
|
+
constructor(licenseKey) {
|
|
87
|
+
// Initialize protection
|
|
88
|
+
MK2Protection.initialize();
|
|
89
|
+
// Validate license
|
|
90
|
+
this.licenseLevel = MK2LicenseValidator.validate(licenseKey);
|
|
91
|
+
// Initialize processors
|
|
92
|
+
this.fabFormats = new fab_formats_processor_1.FabFormatsProcessor();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Initialize MK-2 engine
|
|
96
|
+
*/
|
|
97
|
+
async initialize(projectPath) {
|
|
98
|
+
if (this.initialized)
|
|
99
|
+
return;
|
|
100
|
+
try {
|
|
101
|
+
this.dnaManager = new faf_dna_1.FafDNAManager(projectPath);
|
|
102
|
+
this.initialized = true;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.warn('MK-2 initialization warning:', error);
|
|
106
|
+
this.initialized = true; // Continue without DNA
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Analyze project with MK-2 intelligence
|
|
111
|
+
*/
|
|
112
|
+
async analyzeProject(projectPath) {
|
|
113
|
+
// Check integrity
|
|
114
|
+
if (!MK2Protection.checkIntegrity()) {
|
|
115
|
+
throw new Error('Engine integrity check failed');
|
|
116
|
+
}
|
|
117
|
+
await this.initialize(projectPath);
|
|
118
|
+
// Run championship analysis
|
|
119
|
+
const fabResults = await this.fabFormats.processFiles(projectPath);
|
|
120
|
+
const contextResults = await relentless_context_extractor_1.relentlessExtractor.extractFromProject(projectPath);
|
|
121
|
+
// Apply license limits
|
|
122
|
+
const scoreLimit = MK2LicenseValidator.getScoreLimit(this.licenseLevel);
|
|
123
|
+
return {
|
|
124
|
+
engine: MK2_SIGNATURE,
|
|
125
|
+
version: 'MK-2',
|
|
126
|
+
build: BUILD_TIME,
|
|
127
|
+
license: this.licenseLevel,
|
|
128
|
+
analysis: {
|
|
129
|
+
fabFormats: fabResults,
|
|
130
|
+
context: contextResults,
|
|
131
|
+
scoreLimit,
|
|
132
|
+
turbocat: {
|
|
133
|
+
formats: turbo_cat_knowledge_1.TURBO_CAT_KNOWLEDGE.knowledgeBase.formats.length,
|
|
134
|
+
pyramid: turbo_cat_knowledge_1.TURBO_CAT_KNOWLEDGE.formatPyramid.length
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Calculate championship score
|
|
141
|
+
*/
|
|
142
|
+
async calculateScore(data) {
|
|
143
|
+
// Check integrity
|
|
144
|
+
if (!MK2Protection.checkIntegrity()) {
|
|
145
|
+
return { score: 0, error: 'Integrity check failed' };
|
|
146
|
+
}
|
|
147
|
+
// Calculate raw score
|
|
148
|
+
let score = 10; // Base score
|
|
149
|
+
// Add FAB-FORMATS intelligence
|
|
150
|
+
if (data.fabFormats) {
|
|
151
|
+
score += data.fabFormats.totalBonus || 0;
|
|
152
|
+
}
|
|
153
|
+
// Add context extraction bonus
|
|
154
|
+
if (data.context) {
|
|
155
|
+
const contextSlots = Object.keys(data.context).filter(k => data.context[k]).length;
|
|
156
|
+
score += contextSlots * 5;
|
|
157
|
+
}
|
|
158
|
+
// Apply license cap
|
|
159
|
+
const scoreLimit = MK2LicenseValidator.getScoreLimit(this.licenseLevel);
|
|
160
|
+
const finalScore = Math.min(score, scoreLimit);
|
|
161
|
+
return {
|
|
162
|
+
engine: 'MK-2',
|
|
163
|
+
rawScore: score,
|
|
164
|
+
finalScore,
|
|
165
|
+
capped: score > scoreLimit,
|
|
166
|
+
license: this.licenseLevel,
|
|
167
|
+
scoreLimit,
|
|
168
|
+
checksum: this.generateChecksum(data)
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Generate checksum for verification
|
|
173
|
+
*/
|
|
174
|
+
generateChecksum(data) {
|
|
175
|
+
const crypto = require('crypto');
|
|
176
|
+
const stringified = JSON.stringify(data, Object.keys(data).sort());
|
|
177
|
+
return crypto
|
|
178
|
+
.createHash('sha256')
|
|
179
|
+
.update(stringified + MK2_SIGNATURE)
|
|
180
|
+
.digest('hex')
|
|
181
|
+
.substring(0, 8);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get engine info
|
|
185
|
+
*/
|
|
186
|
+
getInfo() {
|
|
187
|
+
return {
|
|
188
|
+
engine: 'FAF Engine MK-2',
|
|
189
|
+
version: '2.0.0',
|
|
190
|
+
signature: MK2_SIGNATURE,
|
|
191
|
+
build: BUILD_TIME,
|
|
192
|
+
license: this.licenseLevel,
|
|
193
|
+
features: this.licenseLevel === 'championship'
|
|
194
|
+
? ['all']
|
|
195
|
+
: this.licenseLevel === 'developer'
|
|
196
|
+
? ['advanced', 'cache', 'chrome']
|
|
197
|
+
: ['basic'],
|
|
198
|
+
protection: 'MAXIMUM',
|
|
199
|
+
formats: turbo_cat_knowledge_1.TURBO_CAT_KNOWLEDGE.knowledgeBase.formats.length
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.FafEngineMK2 = FafEngineMK2;
|
|
204
|
+
// Self-defending wrapper
|
|
205
|
+
(function () {
|
|
206
|
+
// Prevent extraction of source
|
|
207
|
+
if (typeof global !== 'undefined') {
|
|
208
|
+
Object.defineProperty(global, 'FafEngineMK2', {
|
|
209
|
+
value: FafEngineMK2,
|
|
210
|
+
writable: false,
|
|
211
|
+
configurable: false
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
})();
|
|
215
|
+
// Default export for CommonJS
|
|
216
|
+
exports.default = FafEngineMK2;
|
|
217
|
+
//# sourceMappingURL=mk2-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mk2-core.js","sourceRoot":"","sources":["../../src/engine-mk2/mk2-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Configuration - Dynamically configurable limits
|
|
3
|
+
* Can be updated without code changes
|
|
4
|
+
*/
|
|
5
|
+
interface TierConfig {
|
|
6
|
+
scoreLimit: number;
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
features: string[];
|
|
9
|
+
message?: string;
|
|
10
|
+
}
|
|
11
|
+
interface LicenseConfig {
|
|
12
|
+
tiers: {
|
|
13
|
+
free: TierConfig;
|
|
14
|
+
developer: TierConfig;
|
|
15
|
+
professional: TierConfig;
|
|
16
|
+
enterprise: TierConfig;
|
|
17
|
+
championship: TierConfig;
|
|
18
|
+
};
|
|
19
|
+
championshipMode: {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
duration: number;
|
|
22
|
+
limit: number;
|
|
23
|
+
};
|
|
24
|
+
messaging: {
|
|
25
|
+
upgradeCTA: boolean;
|
|
26
|
+
showLimitWarnings: boolean;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
declare class LicenseConfigManager {
|
|
30
|
+
private static instance;
|
|
31
|
+
private config;
|
|
32
|
+
private configPath;
|
|
33
|
+
private constructor();
|
|
34
|
+
static getInstance(): LicenseConfigManager;
|
|
35
|
+
private findConfigFile;
|
|
36
|
+
private loadConfig;
|
|
37
|
+
private getDefaultConfig;
|
|
38
|
+
private getEnvOverrides;
|
|
39
|
+
private mergeConfigs;
|
|
40
|
+
getScoreLimit(tier: string): number;
|
|
41
|
+
isTierEnabled(tier: string): boolean;
|
|
42
|
+
getTierConfig(tier: string): TierConfig | null;
|
|
43
|
+
isChampionshipModeEnabled(): boolean;
|
|
44
|
+
getChampionshipDuration(): number;
|
|
45
|
+
shouldShowUpgradeMessages(): boolean;
|
|
46
|
+
updateTierLimit(tier: string, limit: number): void;
|
|
47
|
+
enableTier(tier: string): void;
|
|
48
|
+
disableTier(tier: string): void;
|
|
49
|
+
saveConfig(): void;
|
|
50
|
+
setTestConfig(config: Partial<LicenseConfig>): void;
|
|
51
|
+
resetToDefaults(): void;
|
|
52
|
+
getFullConfig(): LicenseConfig;
|
|
53
|
+
}
|
|
54
|
+
export declare const licenseConfig: LicenseConfigManager;
|
|
55
|
+
export declare function configureLicenseLimits(limits: {
|
|
56
|
+
[key: string]: number;
|
|
57
|
+
}): void;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=license-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-config.d.ts","sourceRoot":"","sources":["../../src/license/license-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE;QACL,IAAI,EAAE,UAAU,CAAC;QACjB,SAAS,EAAE,UAAU,CAAC;QACtB,YAAY,EAAE,UAAU,CAAC;QACzB,UAAU,EAAE,UAAU,CAAC;QACvB,YAAY,EAAE,UAAU,CAAC;KAC1B,CAAC;IACF,gBAAgB,EAAE;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE;QACT,UAAU,EAAE,OAAO,CAAC;QACpB,iBAAiB,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,YAAY;IA8BpB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKpC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAK9C,yBAAyB,IAAI,OAAO;IAIpC,uBAAuB,IAAI,MAAM;IAIjC,yBAAyB,IAAI,OAAO;IAMpC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOlD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO9B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO/B,UAAU,IAAI,IAAI;IAclB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAInD,eAAe,IAAI,IAAI;IAKvB,aAAa,IAAI,aAAa;CAG/B;AAED,eAAO,MAAM,aAAa,sBAAqC,CAAC;AAGhE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,IAAI,CAK9E"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* License Configuration - Dynamically configurable limits
|
|
4
|
+
* Can be updated without code changes
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.licenseConfig = void 0;
|
|
41
|
+
exports.configureLicenseLimits = configureLicenseLimits;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
class LicenseConfigManager {
|
|
45
|
+
static instance;
|
|
46
|
+
config;
|
|
47
|
+
configPath;
|
|
48
|
+
constructor() {
|
|
49
|
+
this.configPath = this.findConfigFile();
|
|
50
|
+
this.config = this.loadConfig();
|
|
51
|
+
}
|
|
52
|
+
static getInstance() {
|
|
53
|
+
if (!this.instance) {
|
|
54
|
+
this.instance = new LicenseConfigManager();
|
|
55
|
+
}
|
|
56
|
+
return this.instance;
|
|
57
|
+
}
|
|
58
|
+
findConfigFile() {
|
|
59
|
+
// Check for config file in order of precedence
|
|
60
|
+
const locations = [
|
|
61
|
+
process.env.FAF_LICENSE_CONFIG, // Environment variable
|
|
62
|
+
path.join(process.cwd(), '.faf-license-config.json'), // Project directory
|
|
63
|
+
path.join(require('os').homedir(), '.faf', 'license-config.json'), // User home
|
|
64
|
+
'/etc/faf/license-config.json' // System-wide
|
|
65
|
+
].filter(Boolean);
|
|
66
|
+
for (const location of locations) {
|
|
67
|
+
if (location && fs.existsSync(location)) {
|
|
68
|
+
return location;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Return default location
|
|
72
|
+
return path.join(require('os').homedir(), '.faf', 'license-config.json');
|
|
73
|
+
}
|
|
74
|
+
loadConfig() {
|
|
75
|
+
// Try environment variable overrides first
|
|
76
|
+
const envConfig = this.getEnvOverrides();
|
|
77
|
+
// Try loading from file
|
|
78
|
+
let fileConfig = {};
|
|
79
|
+
try {
|
|
80
|
+
if (fs.existsSync(this.configPath)) {
|
|
81
|
+
const content = fs.readFileSync(this.configPath, 'utf-8');
|
|
82
|
+
fileConfig = JSON.parse(content);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.warn('Failed to load license config file, using defaults');
|
|
87
|
+
}
|
|
88
|
+
// Merge with defaults
|
|
89
|
+
return this.mergeConfigs(this.getDefaultConfig(), fileConfig, envConfig);
|
|
90
|
+
}
|
|
91
|
+
getDefaultConfig() {
|
|
92
|
+
return {
|
|
93
|
+
tiers: {
|
|
94
|
+
free: {
|
|
95
|
+
scoreLimit: 85, // Can be changed!
|
|
96
|
+
enabled: true,
|
|
97
|
+
features: ['basic'],
|
|
98
|
+
message: "You're doing great! Unlock more with an upgrade"
|
|
99
|
+
},
|
|
100
|
+
developer: {
|
|
101
|
+
scoreLimit: 90,
|
|
102
|
+
enabled: true,
|
|
103
|
+
features: ['basic', 'cache', 'chrome-extension']
|
|
104
|
+
},
|
|
105
|
+
professional: {
|
|
106
|
+
scoreLimit: 95,
|
|
107
|
+
enabled: true,
|
|
108
|
+
features: ['basic', 'cache', 'chrome-extension', 'advanced-scoring', 'compiler']
|
|
109
|
+
},
|
|
110
|
+
enterprise: {
|
|
111
|
+
scoreLimit: 100,
|
|
112
|
+
enabled: true,
|
|
113
|
+
features: ['all']
|
|
114
|
+
},
|
|
115
|
+
championship: {
|
|
116
|
+
scoreLimit: 100,
|
|
117
|
+
enabled: true,
|
|
118
|
+
features: ['all', 'priority-support', 'custom-features']
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
championshipMode: {
|
|
122
|
+
enabled: true,
|
|
123
|
+
duration: 60, // minutes
|
|
124
|
+
limit: 100
|
|
125
|
+
},
|
|
126
|
+
messaging: {
|
|
127
|
+
upgradeCTA: true,
|
|
128
|
+
showLimitWarnings: true
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
getEnvOverrides() {
|
|
133
|
+
const overrides = {};
|
|
134
|
+
// Check environment variables for overrides
|
|
135
|
+
// FAF_FREE_LIMIT=75 sets free tier to 75%
|
|
136
|
+
if (process.env.FAF_FREE_LIMIT) {
|
|
137
|
+
overrides.tiers = overrides.tiers || {};
|
|
138
|
+
overrides.tiers.free = overrides.tiers.free || {};
|
|
139
|
+
overrides.tiers.free.scoreLimit = parseInt(process.env.FAF_FREE_LIMIT);
|
|
140
|
+
}
|
|
141
|
+
// FAF_FREE_ENABLED=false disables free tier
|
|
142
|
+
if (process.env.FAF_FREE_ENABLED === 'false') {
|
|
143
|
+
overrides.tiers = overrides.tiers || {};
|
|
144
|
+
overrides.tiers.free = overrides.tiers.free || {};
|
|
145
|
+
overrides.tiers.free.enabled = false;
|
|
146
|
+
}
|
|
147
|
+
// FAF_CHAMPIONSHIP_MODE=false disables championship mode
|
|
148
|
+
if (process.env.FAF_CHAMPIONSHIP_MODE === 'false') {
|
|
149
|
+
overrides.championshipMode = overrides.championshipMode || {};
|
|
150
|
+
overrides.championshipMode.enabled = false;
|
|
151
|
+
}
|
|
152
|
+
// FAF_UPGRADE_CTA=false disables upgrade messages
|
|
153
|
+
if (process.env.FAF_UPGRADE_CTA === 'false') {
|
|
154
|
+
overrides.messaging = overrides.messaging || {};
|
|
155
|
+
overrides.messaging.upgradeCTA = false;
|
|
156
|
+
}
|
|
157
|
+
return overrides;
|
|
158
|
+
}
|
|
159
|
+
mergeConfigs(...configs) {
|
|
160
|
+
// Deep merge configs, later ones override earlier ones
|
|
161
|
+
const result = this.getDefaultConfig();
|
|
162
|
+
for (const config of configs) {
|
|
163
|
+
if (config.tiers) {
|
|
164
|
+
Object.keys(config.tiers).forEach(tier => {
|
|
165
|
+
if (config.tiers[tier]) {
|
|
166
|
+
result.tiers[tier] = {
|
|
167
|
+
...result.tiers[tier],
|
|
168
|
+
...config.tiers[tier]
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (config.championshipMode) {
|
|
174
|
+
result.championshipMode = { ...result.championshipMode, ...config.championshipMode };
|
|
175
|
+
}
|
|
176
|
+
if (config.messaging) {
|
|
177
|
+
result.messaging = { ...result.messaging, ...config.messaging };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
// Public API
|
|
183
|
+
getScoreLimit(tier) {
|
|
184
|
+
const tierConfig = this.config.tiers[tier];
|
|
185
|
+
if (!tierConfig || !tierConfig.enabled) {
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
return tierConfig.scoreLimit;
|
|
189
|
+
}
|
|
190
|
+
isTierEnabled(tier) {
|
|
191
|
+
const tierConfig = this.config.tiers[tier];
|
|
192
|
+
return tierConfig?.enabled || false;
|
|
193
|
+
}
|
|
194
|
+
getTierConfig(tier) {
|
|
195
|
+
const tierConfig = this.config.tiers[tier];
|
|
196
|
+
return tierConfig || null;
|
|
197
|
+
}
|
|
198
|
+
isChampionshipModeEnabled() {
|
|
199
|
+
return this.config.championshipMode.enabled;
|
|
200
|
+
}
|
|
201
|
+
getChampionshipDuration() {
|
|
202
|
+
return this.config.championshipMode.duration;
|
|
203
|
+
}
|
|
204
|
+
shouldShowUpgradeMessages() {
|
|
205
|
+
return this.config.messaging.upgradeCTA;
|
|
206
|
+
}
|
|
207
|
+
// Dynamic updates
|
|
208
|
+
updateTierLimit(tier, limit) {
|
|
209
|
+
if (this.config.tiers[tier]) {
|
|
210
|
+
this.config.tiers[tier].scoreLimit = limit;
|
|
211
|
+
this.saveConfig();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
enableTier(tier) {
|
|
215
|
+
if (this.config.tiers[tier]) {
|
|
216
|
+
this.config.tiers[tier].enabled = true;
|
|
217
|
+
this.saveConfig();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
disableTier(tier) {
|
|
221
|
+
if (this.config.tiers[tier]) {
|
|
222
|
+
this.config.tiers[tier].enabled = false;
|
|
223
|
+
this.saveConfig();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
saveConfig() {
|
|
227
|
+
try {
|
|
228
|
+
const dir = path.dirname(this.configPath);
|
|
229
|
+
if (!fs.existsSync(dir)) {
|
|
230
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
231
|
+
}
|
|
232
|
+
fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8');
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.warn('Failed to save license config');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Testing/Admin functions
|
|
239
|
+
setTestConfig(config) {
|
|
240
|
+
this.config = this.mergeConfigs(this.config, config);
|
|
241
|
+
}
|
|
242
|
+
resetToDefaults() {
|
|
243
|
+
this.config = this.getDefaultConfig();
|
|
244
|
+
this.saveConfig();
|
|
245
|
+
}
|
|
246
|
+
getFullConfig() {
|
|
247
|
+
return this.config;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.licenseConfig = LicenseConfigManager.getInstance();
|
|
251
|
+
// CLI helpers for easy configuration
|
|
252
|
+
function configureLicenseLimits(limits) {
|
|
253
|
+
const config = exports.licenseConfig;
|
|
254
|
+
Object.entries(limits).forEach(([tier, limit]) => {
|
|
255
|
+
config.updateTierLimit(tier, limit);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// Usage examples:
|
|
259
|
+
// FAF_FREE_LIMIT=75 faf score # Free tier at 75%
|
|
260
|
+
// FAF_FREE_LIMIT=90 faf score # Free tier at 90%
|
|
261
|
+
// FAF_FREE_ENABLED=false faf score # No free tier
|
|
262
|
+
// FAF_CHAMPIONSHIP_MODE=false faf # No championship mode
|
|
263
|
+
//# sourceMappingURL=license-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-config.js","sourceRoot":"","sources":["../../src/license/license-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Controller for FAF Engine
|
|
3
|
+
* Controls which engine (MK-1/MK-2) and features are available
|
|
4
|
+
*/
|
|
5
|
+
export type LicenseType = 'free' | 'developer' | 'professional' | 'enterprise' | 'championship';
|
|
6
|
+
export type EngineVersion = 'MK-1' | 'MK-2';
|
|
7
|
+
interface License {
|
|
8
|
+
type: LicenseType;
|
|
9
|
+
engine: EngineVersion;
|
|
10
|
+
scoreLimit: number;
|
|
11
|
+
features: string[];
|
|
12
|
+
expiresAt?: Date;
|
|
13
|
+
issuedTo?: string;
|
|
14
|
+
key?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class LicenseController {
|
|
17
|
+
private static instance;
|
|
18
|
+
private currentLicense;
|
|
19
|
+
private licensePath;
|
|
20
|
+
private constructor();
|
|
21
|
+
static getInstance(): LicenseController;
|
|
22
|
+
private findLicenseFile;
|
|
23
|
+
private loadLicense;
|
|
24
|
+
private validateKey;
|
|
25
|
+
private verifySignature;
|
|
26
|
+
private buildLicense;
|
|
27
|
+
private getFreeTier;
|
|
28
|
+
private getChampionshipTier;
|
|
29
|
+
getLicense(): License;
|
|
30
|
+
getEngine(): EngineVersion;
|
|
31
|
+
getScoreLimit(): number;
|
|
32
|
+
hasFeature(feature: string): boolean;
|
|
33
|
+
canUseEngine(engine: EngineVersion): boolean;
|
|
34
|
+
setLicense(key: string): boolean;
|
|
35
|
+
generateTrialKey(email: string, days?: number): string;
|
|
36
|
+
private hash;
|
|
37
|
+
getInfo(): string;
|
|
38
|
+
}
|
|
39
|
+
export declare const licenseController: LicenseController;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=license-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-controller.d.ts","sourceRoot":"","sources":["../../src/license/license-controller.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,CAAC;AAChG,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,UAAU,OAAO;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAMP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOvC,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB;IAW3B,UAAU,IAAI,OAAO;IAIrB,SAAS,IAAI,aAAa;IAI1B,aAAa,IAAI,MAAM;IAIvB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAQ5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAoBhC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM;IAM1D,OAAO,CAAC,IAAI;IAIZ,OAAO,IAAI,MAAM;CAmBlB;AAGD,eAAO,MAAM,iBAAiB,mBAAkC,CAAC"}
|