device-passport 1.1.0 → 1.2.0

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 (49) hide show
  1. package/CHANGELOG.md +10 -7
  2. package/README.md +41 -0
  3. package/assets/ego-profile-manager.png +0 -0
  4. package/dist/adapters/index.cjs +2 -2
  5. package/dist/adapters/index.d.cts +4 -94
  6. package/dist/adapters/index.d.mts +4 -94
  7. package/dist/adapters/index.d.ts +4 -94
  8. package/dist/adapters/index.mjs +2 -2
  9. package/dist/ego/index.cjs +22 -0
  10. package/dist/ego/index.d.cts +5 -0
  11. package/dist/ego/index.d.mts +5 -0
  12. package/dist/ego/index.d.ts +5 -0
  13. package/dist/ego/index.mjs +8 -0
  14. package/dist/evaluator/index.cjs +22 -584
  15. package/dist/evaluator/index.mjs +3 -564
  16. package/dist/geo/index.cjs +1 -1
  17. package/dist/geo/index.d.cts +4 -0
  18. package/dist/geo/index.d.mts +4 -0
  19. package/dist/geo/index.d.ts +4 -0
  20. package/dist/geo/index.mjs +2 -2
  21. package/dist/index.cjs +41 -441
  22. package/dist/index.d.cts +10 -198
  23. package/dist/index.d.mts +10 -198
  24. package/dist/index.d.ts +10 -198
  25. package/dist/index.mjs +7 -418
  26. package/dist/shared/device-passport.BGfRcQNh.mjs +565 -0
  27. package/dist/shared/{device-passport.BPd2-w8e.cjs → device-passport.BKtmLzPt.cjs} +4 -3
  28. package/dist/shared/{device-passport.BBf9OKap.mjs → device-passport.BPQj0qdT.mjs} +4 -3
  29. package/dist/shared/device-passport.CDS7xrj8.d.ts +469 -0
  30. package/dist/shared/device-passport.CfLes-lq.d.cts +469 -0
  31. package/dist/shared/device-passport.CsOWqPIr.d.cts +77 -0
  32. package/dist/shared/device-passport.D7pEnyp2.d.ts +77 -0
  33. package/dist/shared/{device-passport.CLaBZWUV.cjs → device-passport.D9xW6R0B.cjs} +4 -2
  34. package/dist/shared/device-passport.DirQmSd4.d.cts +47 -0
  35. package/dist/shared/device-passport.DirQmSd4.d.mts +47 -0
  36. package/dist/shared/device-passport.DirQmSd4.d.ts +47 -0
  37. package/dist/shared/device-passport.EK4RX7Xd.cjs +584 -0
  38. package/dist/shared/device-passport.ZBspe4ZW.d.mts +77 -0
  39. package/dist/shared/device-passport.dVEqzSEb.d.mts +469 -0
  40. package/dist/shared/{device-passport.NHw_f6HT.mjs → device-passport.gNo82fQ5.mjs} +5 -3
  41. package/dist/shared/device-passport.kekU28UM.mjs +705 -0
  42. package/dist/shared/device-passport.qL4tjwc0.cjs +718 -0
  43. package/dist/storage/index.d.cts +3 -34
  44. package/dist/storage/index.d.mts +3 -34
  45. package/dist/storage/index.d.ts +3 -34
  46. package/dist/types/index.d.cts +183 -1
  47. package/dist/types/index.d.mts +183 -1
  48. package/dist/types/index.d.ts +183 -1
  49. package/package.json +6 -1
package/dist/index.cjs CHANGED
@@ -1,425 +1,16 @@
1
1
  'use strict';
2
2
 
3
- const cdp = require('./shared/device-passport.CLaBZWUV.cjs');
4
- const evaluator_index = require('./evaluator/index.cjs');
5
- const memory = require('./shared/device-passport.Cjxlv8xI.cjs');
3
+ const bridge = require('./shared/device-passport.qL4tjwc0.cjs');
4
+ const cdp = require('./shared/device-passport.D9xW6R0B.cjs');
6
5
  const geo_index = require('./geo/index.cjs');
7
- const aligner = require('./shared/device-passport.BPd2-w8e.cjs');
6
+ const memory = require('./shared/device-passport.Cjxlv8xI.cjs');
7
+ const evaluator_index = require('./evaluator/index.cjs');
8
+ const aligner = require('./shared/device-passport.BKtmLzPt.cjs');
9
+ const entropy = require('./shared/device-passport.EK4RX7Xd.cjs');
8
10
  require('node:crypto');
9
11
  require('node:fs');
10
12
  require('node:path');
11
13
 
12
- class DevicePassportInstance {
13
- profile;
14
- constructor(profile) {
15
- if (!profile) {
16
- throw new Error("[DevicePassportInstance] Profile cannot be null or undefined");
17
- }
18
- this.profile = profile;
19
- }
20
- /**
21
- * Factory method to create an instance from a plain DevicePassport object.
22
- */
23
- static from(profile) {
24
- return new DevicePassportInstance(profile);
25
- }
26
- // ==========================================
27
- // Getters for core profile facets
28
- // ==========================================
29
- get id() {
30
- return this.profile.id;
31
- }
32
- get seed() {
33
- return this.profile.seed;
34
- }
35
- get createdAt() {
36
- return this.profile.createdAt;
37
- }
38
- get browser() {
39
- return this.profile.browser;
40
- }
41
- get os() {
42
- return this.profile.os;
43
- }
44
- get hardware() {
45
- return this.profile.hardware;
46
- }
47
- get locale() {
48
- return this.profile.locale;
49
- }
50
- get headers() {
51
- return this.profile.headers;
52
- }
53
- get clientHints() {
54
- return this.profile.clientHints;
55
- }
56
- get context() {
57
- return this.profile.context;
58
- }
59
- get userAgent() {
60
- return this.profile.headers["user-agent"] || this.profile.browser.userAgent;
61
- }
62
- get timezone() {
63
- return this.profile.locale.timezone;
64
- }
65
- get playwrightContext() {
66
- return this.getPlaywrightContext();
67
- }
68
- get puppeteerArgs() {
69
- return this.getPuppeteerArgs();
70
- }
71
- get evaluation() {
72
- return this.profile.evaluation;
73
- }
74
- // ==========================================
75
- // Lightweight HTTP Mode Adapters
76
- // ==========================================
77
- /**
78
- * Returns HTTP headers formatted in strict canonical browser sequence.
79
- * Essential for anti-bot evasion against Cloudflare, Akamai, and DataDome.
80
- */
81
- getHeaders(overrides) {
82
- return cdp.formatCanonicalHeaders(this.profile.headers, overrides);
83
- }
84
- /**
85
- * Returns a higher-order fetch function wrapping standard fetch with this passport's canonical persona.
86
- */
87
- wrapFetch(customFetch) {
88
- return cdp.withPassport(this, customFetch);
89
- }
90
- /**
91
- * Alias for wrapFetch.
92
- */
93
- withPassport(customFetch) {
94
- return cdp.withPassport(this, customFetch);
95
- }
96
- /**
97
- * Generates a copy-pasteable cURL command with correct browser headers and User-Agent.
98
- */
99
- toCurl(url, options) {
100
- return cdp.toCurl(this, url, options);
101
- }
102
- // ==========================================
103
- // Heavyweight Browser Automation Adapters
104
- // ==========================================
105
- /**
106
- * Generates Playwright BrowserContext options.
107
- * Usage:
108
- * ```ts
109
- * const context = await browser.newContext(passport.getPlaywrightContext());
110
- * ```
111
- */
112
- getPlaywrightContext() {
113
- return cdp.getPlaywrightContext(this.profile);
114
- }
115
- /**
116
- * Returns Puppeteer launch args and page emulation parameters.
117
- */
118
- getPuppeteerArgs() {
119
- return cdp.getPuppeteerArgs(this.profile);
120
- }
121
- /**
122
- * Generates an in-page stealth script to patch runtime JavaScript APIs
123
- * (navigator.webdriver, hardwareConcurrency, deviceMemory, WebGL, Client Hints).
124
- */
125
- getStealthScript() {
126
- return cdp.getStealthScript(this.profile);
127
- }
128
- /**
129
- * Injects stealth scripts and extra HTTP headers into a Playwright BrowserContext.
130
- */
131
- async applyToPlaywright(context) {
132
- await cdp.applyToPlaywrightContext(context, this.profile);
133
- }
134
- /**
135
- * Injects stealth scripts and emulation parameters into a Puppeteer Page.
136
- */
137
- async applyToPuppeteer(page) {
138
- await cdp.applyToPuppeteerPage(page, this.profile);
139
- }
140
- // ==========================================
141
- // Consistency & Diagnostics
142
- // ==========================================
143
- /**
144
- * Evaluates cross-layer consistency and Shannon entropy.
145
- * Caches the result on `this.profile.evaluation`.
146
- */
147
- evaluate(forceRecompute = false) {
148
- if (this.profile.evaluation && !forceRecompute) {
149
- return this.profile.evaluation;
150
- }
151
- try {
152
- const contradictions = evaluator_index.detectAllContradictions(this.profile);
153
- let estimatedBits = 48;
154
- let collisionRisk = "very_low";
155
- try {
156
- const entropy = evaluator_index.analyzeHeaderEntropy(this.profile.headers);
157
- if (entropy) {
158
- estimatedBits = entropy.estimatedBits;
159
- collisionRisk = entropy.collisionRisk;
160
- }
161
- } catch {
162
- }
163
- const totalPenalty = contradictions.reduce((sum, c) => sum + c.impactPenalty, 0);
164
- const overallScore = Math.max(0, Math.min(100, Math.round(100 - totalPenalty)));
165
- const status = overallScore >= 90 ? "PASS" : overallScore >= 70 ? "WARN" : "FAIL";
166
- const grade = overallScore >= 95 ? "A+" : overallScore >= 85 ? "A" : overallScore >= 70 ? "B" : overallScore >= 50 ? "C" : "F";
167
- const checks = [
168
- {
169
- id: "chk_os_ua_alignment",
170
- name: "OS and User-Agent Alignment",
171
- category: "os_ua_alignment",
172
- passed: !contradictions.some((c) => c.category === "os_browser"),
173
- score: contradictions.some((c) => c.category === "os_browser") ? 0 : 100,
174
- weight: 1.5,
175
- message: contradictions.find((c) => c.category === "os_browser")?.description ?? "User-Agent and Operating System are fully coherent"
176
- },
177
- {
178
- id: "chk_hardware_plausibility",
179
- name: "Hardware and GPU Plausibility",
180
- category: "hardware_plausibility",
181
- passed: !contradictions.some((c) => c.category === "hardware_system"),
182
- score: contradictions.some((c) => c.category === "hardware_system") ? 0 : 100,
183
- weight: 2,
184
- message: contradictions.find((c) => c.category === "hardware_system")?.description ?? "GPU renderer, CPU architecture and RAM are physically plausible"
185
- },
186
- {
187
- id: "chk_geo_locale_coherence",
188
- name: "Geo and Locale Coherence",
189
- category: "geo_locale_coherence",
190
- passed: !contradictions.some((c) => c.category === "geo_chrono"),
191
- score: contradictions.some((c) => c.category === "geo_chrono") ? 0 : 100,
192
- weight: 1.5,
193
- message: contradictions.find((c) => c.category === "geo_chrono")?.description ?? "Timezone, country, and Accept-Language are geographically locked"
194
- },
195
- {
196
- id: "chk_client_hints_entropy",
197
- name: "Client Hints RFC 8942 Compliance",
198
- category: "client_hints_entropy",
199
- passed: !contradictions.some((c) => c.category === "client_hints"),
200
- score: contradictions.some((c) => c.category === "client_hints") ? 0 : 100,
201
- weight: 1.5,
202
- message: contradictions.find((c) => c.category === "client_hints")?.description ?? "User-Agent Client Hints headers strictly match W3C and Chromium freeze specifications"
203
- }
204
- ];
205
- const evaluation = {
206
- overallScore,
207
- status,
208
- grade,
209
- checks,
210
- entropyAnalysis: {
211
- estimatedBits,
212
- collisionRisk
213
- },
214
- evaluatedAt: (/* @__PURE__ */ new Date()).toISOString()
215
- };
216
- this.profile.evaluation = evaluation;
217
- return evaluation;
218
- } catch {
219
- if (this.profile.evaluation) {
220
- return this.profile.evaluation;
221
- }
222
- const baseline = {
223
- overallScore: 100,
224
- status: "PASS",
225
- grade: "A+",
226
- checks: [],
227
- evaluatedAt: (/* @__PURE__ */ new Date()).toISOString()
228
- };
229
- this.profile.evaluation = baseline;
230
- return baseline;
231
- }
232
- }
233
- // ==========================================
234
- // Serialization
235
- // ==========================================
236
- /**
237
- * Returns the underlying raw DevicePassport data object.
238
- */
239
- toJSON() {
240
- return this.profile;
241
- }
242
- toString() {
243
- const { id, browser, os, locale } = this.profile;
244
- return `[DevicePassport ${id} | ${browser?.name ?? "Browser"} ${browser?.version ?? ""} on ${os?.platform ?? "OS"} | ${locale?.language ?? "Locale"}]`;
245
- }
246
- }
247
- function createPassport(seedOrOptionsOrProfile, extraOptions) {
248
- if (seedOrOptionsOrProfile instanceof DevicePassportInstance) {
249
- return seedOrOptionsOrProfile;
250
- }
251
- if (seedOrOptionsOrProfile && typeof seedOrOptionsOrProfile === "object" && "id" in seedOrOptionsOrProfile && "clientHints" in seedOrOptionsOrProfile && "headers" in seedOrOptionsOrProfile) {
252
- return new DevicePassportInstance(seedOrOptionsOrProfile);
253
- }
254
- let options = {};
255
- if (typeof seedOrOptionsOrProfile === "string") {
256
- options = { ...extraOptions, seed: seedOrOptionsOrProfile };
257
- } else if (seedOrOptionsOrProfile && typeof seedOrOptionsOrProfile === "object") {
258
- options = { ...seedOrOptionsOrProfile };
259
- } else if (extraOptions) {
260
- options = { ...extraOptions };
261
- }
262
- if (options.store && options.seed) {
263
- const storage = typeof options.store === "string" ? new memory.JSONFileStorage({ filePath: options.store }) : options.store;
264
- if (storage.hasSync && storage.hasSync(options.seed)) {
265
- const existing = storage.getSync(options.seed);
266
- if (existing) return new DevicePassportInstance(existing);
267
- }
268
- const generated2 = cdp.generatePassport(options);
269
- if (storage.setSync) {
270
- storage.setSync(options.seed, generated2);
271
- } else {
272
- storage.set(options.seed, generated2).catch(() => {
273
- });
274
- }
275
- return new DevicePassportInstance(generated2);
276
- }
277
- const generated = cdp.generatePassport(options);
278
- return new DevicePassportInstance(generated);
279
- }
280
-
281
- class PassportManager {
282
- storage;
283
- defaultGeo;
284
- defaultOS;
285
- defaultBrowser;
286
- generator;
287
- constructor(options) {
288
- if (typeof options?.store === "string") {
289
- this.storage = new memory.JSONFileStorage(options.store);
290
- } else if (options?.store && typeof options.store.get === "function") {
291
- this.storage = options.store;
292
- } else {
293
- this.storage = new memory.MemoryStorage();
294
- }
295
- this.defaultGeo = options?.defaultGeo ?? "US";
296
- this.defaultOS = options?.defaultOS;
297
- this.defaultBrowser = options?.defaultBrowser;
298
- this.generator = options?.generator ?? cdp.generatePassport;
299
- }
300
- /**
301
- * Retrieves an existing sticky passport by seed or deterministically generates
302
- * and persists a new one if it does not already exist.
303
- *
304
- * @param seed Deterministic seed (user ID, account handle, proxy IP, worker slot)
305
- * @param options Generator options to use if persona needs to be created
306
- */
307
- async getPassport(seed, options) {
308
- const seedStr = String(seed);
309
- const existing = await this.storage.get(seedStr);
310
- if (existing) {
311
- return new DevicePassportInstance(existing);
312
- }
313
- const mergedOptions = {
314
- seed: seedStr,
315
- country: options?.country ?? this.defaultGeo,
316
- os: options?.os ?? this.defaultOS,
317
- browser: options?.browser ?? this.defaultBrowser,
318
- ...options
319
- };
320
- const profile = this.generator(mergedOptions);
321
- await this.storage.set(seedStr, profile);
322
- return new DevicePassportInstance(profile);
323
- }
324
- /**
325
- * Synchronous passport retrieval for environments backed by MemoryStorage or JSONFileStorage.
326
- */
327
- getPassportSync(seed, options) {
328
- const seedStr = String(seed);
329
- const syncStore = this.storage;
330
- if (typeof syncStore.getSync === "function") {
331
- const existing = syncStore.getSync(seedStr);
332
- if (existing) {
333
- return new DevicePassportInstance(existing);
334
- }
335
- const mergedOptions = {
336
- seed: seedStr,
337
- country: options?.country ?? this.defaultGeo,
338
- os: options?.os ?? this.defaultOS,
339
- browser: options?.browser ?? this.defaultBrowser,
340
- ...options
341
- };
342
- const profile = this.generator(mergedOptions);
343
- if (typeof syncStore.setSync === "function") {
344
- syncStore.setSync(seedStr, profile);
345
- }
346
- return new DevicePassportInstance(profile);
347
- }
348
- throw new Error(
349
- "[PassportManager] Current storage adapter does not support synchronous operations. Use await manager.getPassport(seed) instead."
350
- );
351
- }
352
- /**
353
- * Forces re-generation and overwrite of a passport for the given seed.
354
- */
355
- async renewPassport(seed, options) {
356
- const seedStr = String(seed);
357
- const mergedOptions = {
358
- seed: seedStr,
359
- country: options?.country ?? this.defaultGeo,
360
- os: options?.os ?? this.defaultOS,
361
- browser: options?.browser ?? this.defaultBrowser,
362
- ...options
363
- };
364
- const profile = this.generator(mergedOptions);
365
- await this.storage.set(seedStr, profile);
366
- return new DevicePassportInstance(profile);
367
- }
368
- /**
369
- * Check if a passport exists in storage for the given seed.
370
- */
371
- async hasPassport(seed) {
372
- return this.storage.has(String(seed));
373
- }
374
- /**
375
- * Delete a passport from storage.
376
- */
377
- async deletePassport(seed) {
378
- return this.storage.delete(String(seed));
379
- }
380
- /**
381
- * Import an existing passport into storage.
382
- */
383
- async importPassport(passport) {
384
- const raw = passport instanceof DevicePassportInstance ? passport.toJSON() : passport;
385
- await this.storage.set(raw.seed, raw);
386
- return new DevicePassportInstance(raw);
387
- }
388
- /**
389
- * List all stored seeds.
390
- */
391
- async listSeeds() {
392
- return this.storage.keys();
393
- }
394
- /**
395
- * List all stored passports as DevicePassportInstance objects.
396
- */
397
- async listPassports() {
398
- const keys = await this.storage.keys();
399
- const instances = [];
400
- for (const key of keys) {
401
- const item = await this.storage.get(key);
402
- if (item) {
403
- instances.push(new DevicePassportInstance(item));
404
- }
405
- }
406
- return instances;
407
- }
408
- /**
409
- * Clear all stored passports.
410
- */
411
- async clear() {
412
- await this.storage.clear();
413
- }
414
- /**
415
- * Return number of stored personas.
416
- */
417
- async count() {
418
- const keys = await this.storage.keys();
419
- return keys.length;
420
- }
421
- }
422
-
423
14
  const BENCHMARK_METRICS_METADATA = {
424
15
  clientHintsSupport: {
425
16
  id: "clientHintsSupport",
@@ -792,6 +383,18 @@ function formatComparativeMatrixJSON() {
792
383
 
793
384
  const VERSION = "1.0.0";
794
385
 
386
+ exports.AccountProfileManager = bridge.AccountProfileManager;
387
+ exports.DevicePassportInstance = bridge.DevicePassportInstance;
388
+ exports.PROXY_MISSING_NOTE = bridge.PROXY_MISSING_NOTE;
389
+ exports.PROXY_RESOLUTION_NOTE = bridge.PROXY_RESOLUTION_NOTE;
390
+ exports.PassportManager = bridge.PassportManager;
391
+ exports.buildEgoSessionPlan = bridge.buildEgoSessionPlan;
392
+ exports.buildProxyDeclaration = bridge.buildProxyDeclaration;
393
+ exports.createEgoBridge = bridge.createEgoBridge;
394
+ exports.createPassport = bridge.createPassport;
395
+ exports.defaultTaskSpaceName = bridge.defaultTaskSpaceName;
396
+ exports.getEgoNativeBridge = bridge.getEgoNativeBridge;
397
+ exports.getProfileReadiness = bridge.getProfileReadiness;
795
398
  exports.ALL_PRESETS = cdp.ALL_PRESETS;
796
399
  exports.CANONICAL_HEADER_ORDER = cdp.CANONICAL_HEADER_ORDER;
797
400
  exports.CHROME_VERSIONS = cdp.CHROME_VERSIONS;
@@ -825,34 +428,16 @@ exports.parseStructuredBrandList = cdp.parseStructuredBrandList;
825
428
  exports.toCurl = cdp.toCurl;
826
429
  exports.validateHardwareContradictions = cdp.validateHardwareContradictions;
827
430
  exports.withPassport = cdp.withPassport;
828
- exports.BASELINE_OPTIMAL_ENTROPY = evaluator_index.BASELINE_OPTIMAL_ENTROPY;
829
- exports.BROWSER_BASELINE_FREQUENCIES = evaluator_index.BROWSER_BASELINE_FREQUENCIES;
830
- exports.COUNTRY_PRIMARY_LANGUAGES = evaluator_index.COUNTRY_PRIMARY_LANGUAGES;
831
- exports.COUNTRY_TIMEZONE_MAP = evaluator_index.COUNTRY_TIMEZONE_MAP;
832
- exports.MIN_STRUCTURAL_ENTROPY = evaluator_index.MIN_STRUCTURAL_ENTROPY;
833
- exports.OPTIMAL_CHAR_ENTROPY_MAX = evaluator_index.OPTIMAL_CHAR_ENTROPY_MAX;
834
- exports.OPTIMAL_CHAR_ENTROPY_MIN = evaluator_index.OPTIMAL_CHAR_ENTROPY_MIN;
835
- exports.OPTIMAL_ENTROPY_MAX = evaluator_index.OPTIMAL_ENTROPY_MAX;
836
- exports.OPTIMAL_ENTROPY_MIN = evaluator_index.OPTIMAL_ENTROPY_MIN;
837
- exports.analyzeHeaderEntropy = evaluator_index.analyzeHeaderEntropy;
838
- exports.calculateKLDivergence = evaluator_index.calculateKLDivergence;
839
- exports.calculateShannonEntropy = evaluator_index.calculateShannonEntropy;
840
- exports.calculateStructuralEntropy = evaluator_index.calculateStructuralEntropy;
841
- exports.detectAllContradictions = evaluator_index.detectAllContradictions;
842
- exports.detectClientHintsContradictions = evaluator_index.detectClientHintsContradictions;
843
- exports.detectGeoChronoContradictions = evaluator_index.detectGeoChronoContradictions;
844
- exports.detectHardwareContradictions = evaluator_index.detectHardwareContradictions;
845
- exports.detectOSBrowserContradictions = evaluator_index.detectOSBrowserContradictions;
846
- exports.evaluateCoherence = evaluator_index.evaluateCoherence;
847
- exports.evaluateGeoAlignment = evaluator_index.evaluateGeoAlignment;
848
- exports.evaluatePassport = evaluator_index.evaluatePassport;
849
- exports.JSONFileStorage = memory.JSONFileStorage;
850
- exports.MemoryStorage = memory.MemoryStorage;
851
431
  exports.GEO_LOCALES = geo_index.GEO_LOCALES;
852
432
  exports.TIMEZONE_MATRIX = geo_index.TIMEZONE_MATRIX;
853
433
  exports.detectGeoFromUrl = geo_index.detectGeoFromUrl;
854
434
  exports.getLocaleProfile = geo_index.getLocaleProfile;
855
435
  exports.isValidCountryCode = geo_index.isValidCountryCode;
436
+ exports.JSONFileStorage = memory.JSONFileStorage;
437
+ exports.MemoryStorage = memory.MemoryStorage;
438
+ exports.evaluateCoherence = evaluator_index.evaluateCoherence;
439
+ exports.evaluateGeoAlignment = evaluator_index.evaluateGeoAlignment;
440
+ exports.evaluatePassport = evaluator_index.evaluatePassport;
856
441
  exports.ALPHA3_TO_ALPHA2 = aligner.ALPHA3_TO_ALPHA2;
857
442
  exports.COUNTRY_LOCALES = aligner.COUNTRY_LOCALES;
858
443
  exports.COUNTRY_NAME_TO_CODE = aligner.COUNTRY_NAME_TO_CODE;
@@ -880,12 +465,27 @@ exports.normalizeCountryCode = aligner.normalizeCountryCode;
880
465
  exports.parseAcceptLanguage = aligner.parseAcceptLanguage;
881
466
  exports.toGeoLocation = aligner.toGeoLocation;
882
467
  exports.toLocaleProfile = aligner.toLocaleProfile;
468
+ exports.BASELINE_OPTIMAL_ENTROPY = entropy.BASELINE_OPTIMAL_ENTROPY;
469
+ exports.BROWSER_BASELINE_FREQUENCIES = entropy.BROWSER_BASELINE_FREQUENCIES;
470
+ exports.COUNTRY_PRIMARY_LANGUAGES = entropy.COUNTRY_PRIMARY_LANGUAGES;
471
+ exports.COUNTRY_TIMEZONE_MAP = entropy.COUNTRY_TIMEZONE_MAP;
472
+ exports.MIN_STRUCTURAL_ENTROPY = entropy.MIN_STRUCTURAL_ENTROPY;
473
+ exports.OPTIMAL_CHAR_ENTROPY_MAX = entropy.OPTIMAL_CHAR_ENTROPY_MAX;
474
+ exports.OPTIMAL_CHAR_ENTROPY_MIN = entropy.OPTIMAL_CHAR_ENTROPY_MIN;
475
+ exports.OPTIMAL_ENTROPY_MAX = entropy.OPTIMAL_ENTROPY_MAX;
476
+ exports.OPTIMAL_ENTROPY_MIN = entropy.OPTIMAL_ENTROPY_MIN;
477
+ exports.analyzeHeaderEntropy = entropy.analyzeHeaderEntropy;
478
+ exports.calculateKLDivergence = entropy.calculateKLDivergence;
479
+ exports.calculateShannonEntropy = entropy.calculateShannonEntropy;
480
+ exports.calculateStructuralEntropy = entropy.calculateStructuralEntropy;
481
+ exports.detectAllContradictions = entropy.detectAllContradictions;
482
+ exports.detectClientHintsContradictions = entropy.detectClientHintsContradictions;
483
+ exports.detectGeoChronoContradictions = entropy.detectGeoChronoContradictions;
484
+ exports.detectHardwareContradictions = entropy.detectHardwareContradictions;
485
+ exports.detectOSBrowserContradictions = entropy.detectOSBrowserContradictions;
883
486
  exports.BENCHMARK_METRICS_METADATA = BENCHMARK_METRICS_METADATA;
884
487
  exports.COMPARATIVE_DATASET = COMPARATIVE_DATASET;
885
- exports.DevicePassportInstance = DevicePassportInstance;
886
- exports.PassportManager = PassportManager;
887
488
  exports.VERSION = VERSION;
888
- exports.createPassport = createPassport;
889
489
  exports.formatComparativeMatrixJSON = formatComparativeMatrixJSON;
890
490
  exports.formatComparativeMatrixLaTeX = formatComparativeMatrixLaTeX;
891
491
  exports.formatComparativeMatrixMarkdown = formatComparativeMatrixMarkdown;