@thred-apps/thred-track 1.2.9 → 1.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/core/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,oBAAoB,CAA4C;gBAGtE,GAAG,EAAE,QAAQ,EACb,WAAW,EAAE,kBAAkB,EAC/B,MAAM,EAAE,MAAM;IAOhB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBpC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BxD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsGzB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAOlC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAuBjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAuBhB"}
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/core/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,oBAAoB,CAA4C;gBAGtE,GAAG,EAAE,QAAQ,EACb,WAAW,EAAE,kBAAkB,EAC/B,MAAM,EAAE,MAAM;IAOhB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBpC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BxD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsGzB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAOlC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAuBjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAuBhB"}
package/dist/index.d.ts CHANGED
@@ -19,6 +19,18 @@ export declare class ThredSDK implements IThredSDK {
19
19
  * Check if visitor is from ChatGPT
20
20
  */
21
21
  isFromChatGPT(): boolean;
22
+ /**
23
+ * Check if visitor is from Google Gemini
24
+ */
25
+ isFromGemini(): boolean;
26
+ /**
27
+ * Check if visitor is from Perplexity AI
28
+ */
29
+ isFromPerplexity(): boolean;
30
+ /**
31
+ * Check if visitor is from any supported AI source
32
+ */
33
+ isFromAI(): boolean;
22
34
  /**
23
35
  * Track page view
24
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAO7E,cAAc,SAAS,CAAC;AAIxB,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,YAAY;IAsBjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB;AAaD,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAO7E,cAAc,SAAS,CAAC;AAIxB,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,YAAY;IAsBjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB;AAaD,eAAe,QAAQ,CAAC"}
package/dist/index.esm.js CHANGED
@@ -70,6 +70,55 @@ function isFromChatGPT() {
70
70
  utmSource === 'openai';
71
71
  return isChatGPTUtm || isChatGPTRef;
72
72
  }
73
+ /**
74
+ * Detects if the visitor came from Google Gemini
75
+ */
76
+ function isFromGemini() {
77
+ var _a;
78
+ if (typeof window === 'undefined')
79
+ return false;
80
+ const params = new URLSearchParams(window.location.search);
81
+ const utmSource = ((_a = params.get('utm_source')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
82
+ const referrer = document.referrer.toLowerCase();
83
+ const isGeminiRef = referrer.includes('gemini.google.com');
84
+ const isGeminiUtm = utmSource === 'gemini' ||
85
+ utmSource.includes('gemini') ||
86
+ utmSource === 'google_gemini';
87
+ return isGeminiRef || isGeminiUtm;
88
+ }
89
+ /**
90
+ * Detects if the visitor came from Perplexity AI
91
+ */
92
+ function isFromPerplexity() {
93
+ var _a;
94
+ if (typeof window === 'undefined')
95
+ return false;
96
+ const params = new URLSearchParams(window.location.search);
97
+ const utmSource = ((_a = params.get('utm_source')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
98
+ const referrer = document.referrer.toLowerCase();
99
+ const isPerplexityRef = referrer.includes('perplexity.ai');
100
+ const isPerplexityUtm = utmSource === 'perplexity' ||
101
+ utmSource.includes('perplexity');
102
+ return isPerplexityRef || isPerplexityUtm;
103
+ }
104
+ /**
105
+ * Detects if the visitor came from any supported AI source
106
+ */
107
+ function isFromAI() {
108
+ return isFromChatGPT() || isFromGemini() || isFromPerplexity();
109
+ }
110
+ /**
111
+ * Returns the detected AI source, or null if the visitor didn't come from a known AI
112
+ */
113
+ function getAISource() {
114
+ if (isFromChatGPT())
115
+ return 'chatgpt';
116
+ if (isFromGemini())
117
+ return 'gemini';
118
+ if (isFromPerplexity())
119
+ return 'perplexity';
120
+ return null;
121
+ }
73
122
  /**
74
123
  * Gets the browser key from script tag if present
75
124
  */
@@ -304,16 +353,16 @@ class Tracker {
304
353
  this.logger.log('Tracking disabled by config');
305
354
  return;
306
355
  }
307
- if (!this.config.hasChatSession && !isFromChatGPT()) {
356
+ if (!this.config.hasChatSession && !isFromAI()) {
308
357
  this.logger.log('No chat session for this fingerprint - exiting');
309
358
  return;
310
359
  }
311
360
  // Track initial page view
312
- if (isFromChatGPT()) {
361
+ if (isFromAI()) {
313
362
  yield this.trackPageView();
314
363
  }
315
364
  else {
316
- this.logger.log('UTM not from ChatGPT - skipping page view');
365
+ this.logger.log('UTM not from AI source - skipping page view');
317
366
  }
318
367
  // Track SPA route changes
319
368
  this.setupRouteTracking();
@@ -333,13 +382,10 @@ class Tracker {
333
382
  this.logger.warn('Cannot track page view without fingerprint');
334
383
  return;
335
384
  }
336
- yield this.api.trackPageView({
337
- event: 'page_view',
338
- data: {
385
+ const source = getAISource();
386
+ yield this.api.trackPageView(Object.assign({ event: 'page_view', data: {
339
387
  url: window.location.href,
340
- },
341
- fingerprint: fp,
342
- });
388
+ }, fingerprint: fp }, (source && { source })));
343
389
  });
344
390
  }
345
391
  /**
@@ -604,6 +650,24 @@ class ThredSDK {
604
650
  isFromChatGPT() {
605
651
  return isFromChatGPT();
606
652
  }
653
+ /**
654
+ * Check if visitor is from Google Gemini
655
+ */
656
+ isFromGemini() {
657
+ return isFromGemini();
658
+ }
659
+ /**
660
+ * Check if visitor is from Perplexity AI
661
+ */
662
+ isFromPerplexity() {
663
+ return isFromPerplexity();
664
+ }
665
+ /**
666
+ * Check if visitor is from any supported AI source
667
+ */
668
+ isFromAI() {
669
+ return isFromAI();
670
+ }
607
671
  /**
608
672
  * Track page view
609
673
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/utils/logger.ts","../src/utils/detector.ts","../src/core/fingerprint.ts","../src/core/api.ts","../src/core/tracker.ts","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Simple logger utility\n */\nexport class Logger {\n private debug: boolean;\n private prefix: string;\n\n constructor(debug = false, prefix = '[Thred]') {\n this.debug = debug;\n this.prefix = prefix;\n }\n\n log(...args: unknown[]) {\n if (this.debug) {\n console.log(this.prefix, ...args);\n }\n }\n\n warn(...args: unknown[]) {\n if (this.debug) {\n console.warn(this.prefix, ...args);\n }\n }\n\n error(...args: unknown[]) {\n console.error(this.prefix, ...args);\n }\n}\n","/**\n * Detects if the visitor came from ChatGPT\n */\nexport function isFromChatGPT(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const utmSource = params.get('utm_source')?.toLowerCase() || '';\n const referrer = document.referrer.toLowerCase();\n\n const isChatGPTRef =\n referrer.includes('chat.openai.com') || referrer.includes('chatgpt.com');\n const isChatGPTUtm =\n utmSource === 'chatgpt' ||\n utmSource.includes('chatgpt') ||\n utmSource === 'chat.openai' ||\n utmSource === 'openai';\n\n return isChatGPTUtm || isChatGPTRef;\n}\n\n/**\n * Gets the browser key from script tag if present\n */\nexport function getBrowserKeyFromScript(): string | null {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null;\n }\n\n const scripts = document.getElementsByTagName('script');\n\n for (const script of Array.from(scripts)) {\n if (script.src.includes('thred')) {\n try {\n const url = new URL(script.src);\n return url.searchParams.get('browserKey');\n } catch {\n // Invalid URL\n }\n }\n }\n\n return null;\n}\n","import type { FingerprintResult } from '../types';\nimport { Logger } from '../utils/logger';\n\nconst FP_PROXY_URL =\n 'https://thredproxy.com/35ZCuyzokuT1YGd8/Hm7KPMHUZ4duyPRj?apiKey=iyqKVLQt2560EQUyjfxa';\nconst FP_PROXY_ENDPOINT =\n 'https://thredproxy.com/35ZCuyzokuT1YGd8/qbWl4nqUSCIDTor4';\n\nconst STORAGE_KEY = 'thred_fingerprint';\n\nexport class FingerprintManager {\n private fingerprint: string | null = null;\n private logger: Logger;\n private promise: Promise<string | null> | null = null;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Get or generate fingerprint\n */\n async getFingerprint(): Promise<string | null> {\n if (this.fingerprint) {\n this.logger.log('Using cached fingerprint:', this.fingerprint);\n return this.fingerprint;\n }\n\n if (this.promise) {\n return this.promise;\n }\n\n // Check localStorage (persists across tabs)\n const stored = this.readStorage();\n if (stored) {\n this.fingerprint = stored;\n this.logger.log('Using stored fingerprint:', this.fingerprint);\n return this.fingerprint;\n }\n\n this.promise = this.generateFingerprint();\n return this.promise;\n }\n\n private async generateFingerprint(): Promise<string | null> {\n if (typeof window === 'undefined') {\n this.logger.warn('FingerprintJS requires a browser — skipping');\n return null;\n }\n\n try {\n this.logger.log('Loading FingerprintJS...');\n\n const FingerprintJS = await import(FP_PROXY_URL);\n const fp = await FingerprintJS.load({\n endpoint: [FP_PROXY_ENDPOINT, FingerprintJS.defaultEndpoint],\n });\n\n const result: FingerprintResult = await fp.get();\n this.fingerprint = result.visitorId;\n\n this.writeStorage(this.fingerprint);\n\n this.logger.log('Fingerprint generated:', this.fingerprint);\n return this.fingerprint;\n } catch (error) {\n this.logger.warn('Fingerprint generation failed:', error);\n return null;\n }\n }\n\n getCachedFingerprint(): string | null {\n return this.fingerprint;\n }\n\n clear() {\n this.fingerprint = null;\n this.promise = null;\n this.removeStorage();\n }\n\n private readStorage(): string | null {\n try {\n return typeof window !== 'undefined'\n ? localStorage.getItem(STORAGE_KEY)\n : null;\n } catch {\n return null;\n }\n }\n\n private writeStorage(value: string) {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, value);\n }\n } catch {\n this.logger.warn('Failed to persist fingerprint to localStorage');\n }\n }\n\n private removeStorage() {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEY);\n }\n } catch {\n // Ignore storage errors on cleanup\n }\n }\n}\n","import type {\n ThredConfig,\n PageViewPayload,\n EnrichPayload,\n} from '../types';\nimport { Logger } from '../utils/logger';\n\nexport class ThredAPI {\n private baseUrl: string;\n private browserKey: string;\n private logger: Logger;\n\n constructor(baseUrl: string, browserKey: string, logger: Logger) {\n this.baseUrl = baseUrl;\n this.browserKey = browserKey;\n this.logger = logger;\n }\n\n /**\n * Fetch configuration from API\n */\n async fetchConfig(fingerprint: string): Promise<ThredConfig | null> {\n try {\n const url = `${this.baseUrl}/config?fingerprint=${encodeURIComponent(fingerprint)}&browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Fetching config from:', url);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Config request failed: ${response.status}`);\n }\n\n const config = await response.json();\n this.logger.log('Config received:', config);\n\n return config;\n } catch (error) {\n this.logger.warn('Failed to fetch config:', error);\n return null;\n }\n }\n\n /**\n * Send page view event\n */\n async trackPageView(payload: PageViewPayload): Promise<void> {\n try {\n const url = `${this.baseUrl}/events/page-view?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Tracking page view:', url);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Page view request failed: ${response.status}`);\n }\n\n this.logger.log('Page view tracked successfully');\n } catch (error) {\n this.logger.warn('Failed to track page view:', error);\n }\n }\n\n /**\n * Send lead enrichment data\n */\n async enrichLead(payload: EnrichPayload): Promise<void> {\n try {\n const url = `${this.baseUrl}/customers/enrich?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Enriching lead:', url);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Enrich request failed: ${response.status}`);\n }\n\n this.logger.log('Lead enriched successfully');\n } catch (error) {\n this.logger.warn('Failed to enrich lead:', error);\n }\n }\n}\n","import type { ThredConfig, LeadData } from '../types';\nimport { Logger } from '../utils/logger';\nimport { isFromChatGPT } from '../utils/detector';\nimport { ThredAPI } from './api';\nimport { FingerprintManager } from './fingerprint';\n\nexport class Tracker {\n private api: ThredAPI;\n private fingerprint: FingerprintManager;\n private logger: Logger;\n private config: ThredConfig | null = null;\n private formObserver: MutationObserver | null = null;\n private lastTrackedUrl: string | null = null;\n private popstateHandler: (() => void) | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n\n constructor(\n api: ThredAPI,\n fingerprint: FingerprintManager,\n logger: Logger\n ) {\n this.api = api;\n this.fingerprint = fingerprint;\n this.logger = logger;\n }\n\n /**\n * Initialize tracker with config\n */\n async init(): Promise<void> {\n // Get fingerprint\n const fingerprint = await this.fingerprint.getFingerprint();\n if (!fingerprint) {\n this.logger.warn('Cannot initialize tracker without fingerprint');\n return;\n }\n this.config = await this.api.fetchConfig(fingerprint);\n\n if (!this.config?.enabled) {\n this.logger.log('Tracking disabled by config');\n return;\n }\n\n if (!this.config.hasChatSession && !isFromChatGPT()) {\n this.logger.log('No chat session for this fingerprint - exiting');\n return;\n }\n\n // Track initial page view\n if (isFromChatGPT()) {\n await this.trackPageView();\n } else {\n this.logger.log('UTM not from ChatGPT - skipping page view');\n }\n\n // Track SPA route changes\n this.setupRouteTracking();\n\n // Setup form tracking\n this.setupFormTracking();\n }\n\n /**\n * Track page view event\n */\n async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const fp = await this.fingerprint.getFingerprint();\n\n if (!fp) {\n this.logger.warn('Cannot track page view without fingerprint');\n return;\n }\n\n await this.api.trackPageView({\n event: 'page_view',\n data: {\n url: window.location.href,\n },\n fingerprint: fp,\n });\n }\n\n /**\n * Track form submission and enrich lead\n */\n async trackFormSubmit(formData: FormData): Promise<void> {\n if (!this.config || !this.config.emailId || !this.config.nameId) {\n this.logger.warn('Cannot track form - no config loaded');\n return;\n }\n\n const email = formData.get(this.config.emailId)?.toString().trim();\n const name = formData.get(this.config.nameId)?.toString().trim();\n\n let company: string | undefined = undefined;\n if (this.config.companyId) {\n company = formData.get(this.config.companyId)?.toString().trim();\n }\n\n this.logger.log('Form data extracted:', { email, name, company });\n\n if (!email || !name) {\n this.logger.warn('Missing required fields (email, name)');\n return;\n }\n\n await this.identify({\n name,\n email,\n company: company,\n discovery: false,\n });\n }\n\n /**\n * Identify user and enrich lead data\n */\n async identify(leadData: LeadData): Promise<void> {\n const fp = await this.fingerprint.getFingerprint();\n\n if (!fp) {\n this.logger.warn('Cannot identify without fingerprint');\n return;\n }\n\n await this.api.enrichLead({\n fingerprint: fp,\n leadData,\n });\n }\n\n /**\n * Track page views on SPA route changes by patching pushState/replaceState\n * and listening for popstate.\n */\n private setupRouteTracking(): void {\n if (typeof window === 'undefined') return;\n\n this.lastTrackedUrl = window.location.href;\n\n const onRouteChange = () => {\n const currentUrl = window.location.href;\n if (currentUrl === this.lastTrackedUrl) return;\n this.lastTrackedUrl = currentUrl;\n this.logger.log('Route change detected:', currentUrl);\n this.trackPageView();\n };\n\n this.popstateHandler = onRouteChange;\n window.addEventListener('popstate', this.popstateHandler);\n\n this.originalPushState = history.pushState.bind(history);\n this.originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n this.originalPushState!(...args);\n onRouteChange();\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n this.originalReplaceState!(...args);\n onRouteChange();\n };\n }\n\n /**\n * Setup automatic form tracking\n */\n private setupFormTracking(): void {\n if (!this.config || typeof document === 'undefined') {\n this.logger.warn('Cannot track form - no config or document');\n return;\n }\n\n if (this.config.type === 'hosted') {\n const hostedUrlBase = this.config.hostedUrlBase;\n if (!hostedUrlBase) {\n this.logger.warn('Cannot track form - no hosted URL base');\n return;\n }\n\n // Inject utm_fp into all existing matching links\n this.injectFingerprintIntoLinks(document.body, hostedUrlBase);\n\n // Watch for dynamically added links and inject utm_fp as they appear\n this.formObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (!(node instanceof HTMLElement)) continue;\n\n // Check if the added node itself is a matching link\n if (node.tagName === 'A') {\n this.injectFingerprintIntoLink(node as HTMLAnchorElement, hostedUrlBase);\n }\n\n // Check any child links within the added node\n this.injectFingerprintIntoLinks(node, hostedUrlBase);\n }\n }\n });\n\n this.formObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Fallback: intercept clicks for links that may have had their href changed dynamically\n document.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest('a');\n if (!target) return;\n\n const href = target.getAttribute('href');\n if (!href || !href.includes(hostedUrlBase)) return;\n\n // Already tagged — skip\n if (href.includes('utm_fp=')) return;\n\n this.injectFingerprintIntoLink(target as HTMLAnchorElement, hostedUrlBase);\n }, { capture: true });\n\n return;\n }\n else if (this.config.type === 'custom') {\n const attachFormListener = () => {\n if (!this.config || !this.config.formId) {\n this.logger.warn('Cannot track form - no form ID');\n return;\n }\n const form = document.getElementById(this.config!.formId);\n if (!form) {\n this.logger.log('Form not found:', this.config!.formId);\n return;\n }\n\n const formElement = form as HTMLFormElement;\n\n // Check if already tracked\n if (formElement.dataset.thredTracked) {\n return;\n }\n\n this.logger.log('Attaching listener to form:', this.config!.formId);\n\n formElement.addEventListener(\n 'submit',\n () => {\n const formData = new FormData(formElement);\n this.trackFormSubmit(formData);\n },\n { capture: true }\n );\n\n formElement.dataset.thredTracked = 'true';\n };\n\n // Attach immediately if form exists\n attachFormListener();\n\n // Watch for dynamic forms\n this.formObserver = new MutationObserver(() => {\n attachFormListener();\n });\n\n this.formObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n /**\n * Inject utm_fp into all matching links within a root element\n */\n private injectFingerprintIntoLinks(root: HTMLElement, hostedUrlBase: string): void {\n const links = root.querySelectorAll<HTMLAnchorElement>('a[href]');\n for (const link of Array.from(links)) {\n this.injectFingerprintIntoLink(link, hostedUrlBase);\n }\n }\n\n /**\n * Inject utm_fp into a single link if it matches hostedUrlBase\n */\n private injectFingerprintIntoLink(link: HTMLAnchorElement, hostedUrlBase: string): void {\n const href = link.getAttribute('href');\n if (!href || !href.includes(hostedUrlBase)) return;\n\n // Already tagged — skip\n if (href.includes('utm_fp=')) return;\n\n const fp = this.fingerprint.getCachedFingerprint();\n if (!fp) {\n this.logger.warn('Cannot inject utm_fp - no cached fingerprint');\n return;\n }\n\n try {\n const url = new URL(href, window.location.origin);\n url.searchParams.set('utm_fp', fp);\n link.setAttribute('href', url.toString());\n this.logger.log('Injected utm_fp into link:', url.toString());\n } catch (err) {\n this.logger.warn('Failed to parse URL:', href, err);\n }\n }\n\n /**\n * Cleanup tracker\n */\n destroy(): void {\n if (this.formObserver) {\n this.formObserver.disconnect();\n this.formObserver = null;\n }\n\n if (typeof window === 'undefined') return;\n\n if (this.popstateHandler) {\n window.removeEventListener('popstate', this.popstateHandler);\n this.popstateHandler = null;\n }\n\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n }\n}\n","/**\n * Thred SDK - Browser tracking and lead enrichment\n */\n\nimport type { ThredOptions, ThredSDK as IThredSDK, LeadData } from './types';\nimport { Logger } from './utils/logger';\nimport { isFromChatGPT, getBrowserKeyFromScript } from './utils/detector';\nimport { FingerprintManager } from './core/fingerprint';\nimport { ThredAPI } from './core/api';\nimport { Tracker } from './core/tracker';\n\nexport * from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.thred.dev/v1';\n\nexport class ThredSDK implements IThredSDK {\n private options: ThredOptions;\n private logger: Logger;\n private fingerprint: FingerprintManager;\n private api: ThredAPI;\n private tracker: Tracker;\n private initialized = false;\n\n constructor(options: ThredOptions) {\n this.options = {\n baseUrl: DEFAULT_BASE_URL,\n debug: false, // Set to true for development\n autoInit: true,\n ...options,\n };\n\n this.logger = new Logger(this.options.debug);\n this.fingerprint = new FingerprintManager(this.logger);\n this.api = new ThredAPI(\n this.options.baseUrl!,\n this.options.browserKey,\n this.logger\n );\n this.tracker = new Tracker(this.api, this.fingerprint, this.logger);\n\n if (this.options.autoInit) {\n this.init();\n }\n }\n\n /**\n * Initialize the SDK\n */\n async init(): Promise<void> {\n if (typeof window === 'undefined') {\n this.logger.warn('SDK requires a browser environment — skipping init');\n return;\n }\n\n if (this.initialized) {\n this.logger.warn('SDK already initialized');\n return;\n }\n\n this.logger.log('Initializing Thred SDK...');\n\n // Generate fingerprint\n await this.fingerprint.getFingerprint();\n\n // Initialize tracker\n await this.tracker.init();\n\n this.initialized = true;\n this.logger.log('SDK initialized successfully');\n }\n\n /**\n * Check if visitor is from ChatGPT\n */\n isFromChatGPT(): boolean {\n return isFromChatGPT();\n }\n\n /**\n * Track page view\n */\n async trackPageView(): Promise<void> {\n await this.tracker.trackPageView();\n }\n\n /**\n * Track form submission\n */\n async trackFormSubmit(formData: FormData): Promise<void> {\n await this.tracker.trackFormSubmit(formData);\n }\n\n /**\n * Identify user with lead data\n */\n async identify(leadData: LeadData): Promise<void> {\n await this.tracker.identify(leadData);\n }\n\n /**\n * Get current fingerprint\n */\n getFingerprint(): string | null {\n return this.fingerprint.getCachedFingerprint();\n }\n\n /**\n * Destroy SDK instance and cleanup\n */\n destroy(): void {\n this.tracker.destroy();\n this.fingerprint.clear();\n this.initialized = false;\n this.logger.log('SDK destroyed');\n }\n}\n\n/**\n * Auto-initialize if loaded as script tag with browserKey\n */\nif (typeof window !== 'undefined') {\n const browserKey = getBrowserKeyFromScript();\n if (browserKey) {\n const sdk = new ThredSDK({ browserKey });\n (window as any).Thred = sdk;\n }\n}\n\nexport default ThredSDK;\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/utils/logger.ts","../src/utils/detector.ts","../src/core/fingerprint.ts","../src/core/api.ts","../src/core/tracker.ts","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Simple logger utility\n */\nexport class Logger {\n private debug: boolean;\n private prefix: string;\n\n constructor(debug = false, prefix = '[Thred]') {\n this.debug = debug;\n this.prefix = prefix;\n }\n\n log(...args: unknown[]) {\n if (this.debug) {\n console.log(this.prefix, ...args);\n }\n }\n\n warn(...args: unknown[]) {\n if (this.debug) {\n console.warn(this.prefix, ...args);\n }\n }\n\n error(...args: unknown[]) {\n console.error(this.prefix, ...args);\n }\n}\n","/**\n * Detects if the visitor came from ChatGPT\n */\nexport function isFromChatGPT(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const utmSource = params.get('utm_source')?.toLowerCase() || '';\n const referrer = document.referrer.toLowerCase();\n\n const isChatGPTRef =\n referrer.includes('chat.openai.com') || referrer.includes('chatgpt.com');\n const isChatGPTUtm =\n utmSource === 'chatgpt' ||\n utmSource.includes('chatgpt') ||\n utmSource === 'chat.openai' ||\n utmSource === 'openai';\n\n return isChatGPTUtm || isChatGPTRef;\n}\n\n/**\n * Detects if the visitor came from Google Gemini\n */\nexport function isFromGemini(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const utmSource = params.get('utm_source')?.toLowerCase() || '';\n const referrer = document.referrer.toLowerCase();\n\n const isGeminiRef = referrer.includes('gemini.google.com');\n const isGeminiUtm =\n utmSource === 'gemini' ||\n utmSource.includes('gemini') ||\n utmSource === 'google_gemini';\n\n return isGeminiRef || isGeminiUtm;\n}\n\n/**\n * Detects if the visitor came from Perplexity AI\n */\nexport function isFromPerplexity(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const utmSource = params.get('utm_source')?.toLowerCase() || '';\n const referrer = document.referrer.toLowerCase();\n\n const isPerplexityRef = referrer.includes('perplexity.ai');\n const isPerplexityUtm =\n utmSource === 'perplexity' ||\n utmSource.includes('perplexity');\n\n return isPerplexityRef || isPerplexityUtm;\n}\n\n/**\n * Detects if the visitor came from any supported AI source\n */\nexport function isFromAI(): boolean {\n return isFromChatGPT() || isFromGemini() || isFromPerplexity();\n}\n\nexport type AISource = 'chatgpt' | 'gemini' | 'perplexity';\n\n/**\n * Returns the detected AI source, or null if the visitor didn't come from a known AI\n */\nexport function getAISource(): AISource | null {\n if (isFromChatGPT()) return 'chatgpt';\n if (isFromGemini()) return 'gemini';\n if (isFromPerplexity()) return 'perplexity';\n return null;\n}\n\n/**\n * Gets the browser key from script tag if present\n */\nexport function getBrowserKeyFromScript(): string | null {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null;\n }\n\n const scripts = document.getElementsByTagName('script');\n\n for (const script of Array.from(scripts)) {\n if (script.src.includes('thred')) {\n try {\n const url = new URL(script.src);\n return url.searchParams.get('browserKey');\n } catch {\n // Invalid URL\n }\n }\n }\n\n return null;\n}\n","import type { FingerprintResult } from '../types';\nimport { Logger } from '../utils/logger';\n\nconst FP_PROXY_URL =\n 'https://thredproxy.com/35ZCuyzokuT1YGd8/Hm7KPMHUZ4duyPRj?apiKey=iyqKVLQt2560EQUyjfxa';\nconst FP_PROXY_ENDPOINT =\n 'https://thredproxy.com/35ZCuyzokuT1YGd8/qbWl4nqUSCIDTor4';\n\nconst STORAGE_KEY = 'thred_fingerprint';\n\nexport class FingerprintManager {\n private fingerprint: string | null = null;\n private logger: Logger;\n private promise: Promise<string | null> | null = null;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Get or generate fingerprint\n */\n async getFingerprint(): Promise<string | null> {\n if (this.fingerprint) {\n this.logger.log('Using cached fingerprint:', this.fingerprint);\n return this.fingerprint;\n }\n\n if (this.promise) {\n return this.promise;\n }\n\n // Check localStorage (persists across tabs)\n const stored = this.readStorage();\n if (stored) {\n this.fingerprint = stored;\n this.logger.log('Using stored fingerprint:', this.fingerprint);\n return this.fingerprint;\n }\n\n this.promise = this.generateFingerprint();\n return this.promise;\n }\n\n private async generateFingerprint(): Promise<string | null> {\n if (typeof window === 'undefined') {\n this.logger.warn('FingerprintJS requires a browser — skipping');\n return null;\n }\n\n try {\n this.logger.log('Loading FingerprintJS...');\n\n const FingerprintJS = await import(FP_PROXY_URL);\n const fp = await FingerprintJS.load({\n endpoint: [FP_PROXY_ENDPOINT, FingerprintJS.defaultEndpoint],\n });\n\n const result: FingerprintResult = await fp.get();\n this.fingerprint = result.visitorId;\n\n this.writeStorage(this.fingerprint);\n\n this.logger.log('Fingerprint generated:', this.fingerprint);\n return this.fingerprint;\n } catch (error) {\n this.logger.warn('Fingerprint generation failed:', error);\n return null;\n }\n }\n\n getCachedFingerprint(): string | null {\n return this.fingerprint;\n }\n\n clear() {\n this.fingerprint = null;\n this.promise = null;\n this.removeStorage();\n }\n\n private readStorage(): string | null {\n try {\n return typeof window !== 'undefined'\n ? localStorage.getItem(STORAGE_KEY)\n : null;\n } catch {\n return null;\n }\n }\n\n private writeStorage(value: string) {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, value);\n }\n } catch {\n this.logger.warn('Failed to persist fingerprint to localStorage');\n }\n }\n\n private removeStorage() {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(STORAGE_KEY);\n }\n } catch {\n // Ignore storage errors on cleanup\n }\n }\n}\n","import type {\n ThredConfig,\n PageViewPayload,\n EnrichPayload,\n} from '../types';\nimport { Logger } from '../utils/logger';\n\nexport class ThredAPI {\n private baseUrl: string;\n private browserKey: string;\n private logger: Logger;\n\n constructor(baseUrl: string, browserKey: string, logger: Logger) {\n this.baseUrl = baseUrl;\n this.browserKey = browserKey;\n this.logger = logger;\n }\n\n /**\n * Fetch configuration from API\n */\n async fetchConfig(fingerprint: string): Promise<ThredConfig | null> {\n try {\n const url = `${this.baseUrl}/config?fingerprint=${encodeURIComponent(fingerprint)}&browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Fetching config from:', url);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Config request failed: ${response.status}`);\n }\n\n const config = await response.json();\n this.logger.log('Config received:', config);\n\n return config;\n } catch (error) {\n this.logger.warn('Failed to fetch config:', error);\n return null;\n }\n }\n\n /**\n * Send page view event\n */\n async trackPageView(payload: PageViewPayload): Promise<void> {\n try {\n const url = `${this.baseUrl}/events/page-view?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Tracking page view:', url);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Page view request failed: ${response.status}`);\n }\n\n this.logger.log('Page view tracked successfully');\n } catch (error) {\n this.logger.warn('Failed to track page view:', error);\n }\n }\n\n /**\n * Send lead enrichment data\n */\n async enrichLead(payload: EnrichPayload): Promise<void> {\n try {\n const url = `${this.baseUrl}/customers/enrich?browserKey=${encodeURIComponent(this.browserKey)}`;\n this.logger.log('Enriching lead:', url);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Enrich request failed: ${response.status}`);\n }\n\n this.logger.log('Lead enriched successfully');\n } catch (error) {\n this.logger.warn('Failed to enrich lead:', error);\n }\n }\n}\n","import type { ThredConfig, LeadData } from '../types';\nimport { Logger } from '../utils/logger';\nimport { isFromAI, getAISource } from '../utils/detector';\nimport { ThredAPI } from './api';\nimport { FingerprintManager } from './fingerprint';\n\nexport class Tracker {\n private api: ThredAPI;\n private fingerprint: FingerprintManager;\n private logger: Logger;\n private config: ThredConfig | null = null;\n private formObserver: MutationObserver | null = null;\n private lastTrackedUrl: string | null = null;\n private popstateHandler: (() => void) | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n\n constructor(\n api: ThredAPI,\n fingerprint: FingerprintManager,\n logger: Logger\n ) {\n this.api = api;\n this.fingerprint = fingerprint;\n this.logger = logger;\n }\n\n /**\n * Initialize tracker with config\n */\n async init(): Promise<void> {\n // Get fingerprint\n const fingerprint = await this.fingerprint.getFingerprint();\n if (!fingerprint) {\n this.logger.warn('Cannot initialize tracker without fingerprint');\n return;\n }\n this.config = await this.api.fetchConfig(fingerprint);\n\n if (!this.config?.enabled) {\n this.logger.log('Tracking disabled by config');\n return;\n }\n\n if (!this.config.hasChatSession && !isFromAI()) {\n this.logger.log('No chat session for this fingerprint - exiting');\n return;\n }\n\n // Track initial page view\n if (isFromAI()) {\n await this.trackPageView();\n } else {\n this.logger.log('UTM not from AI source - skipping page view');\n }\n\n // Track SPA route changes\n this.setupRouteTracking();\n\n // Setup form tracking\n this.setupFormTracking();\n }\n\n /**\n * Track page view event\n */\n async trackPageView(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const fp = await this.fingerprint.getFingerprint();\n\n if (!fp) {\n this.logger.warn('Cannot track page view without fingerprint');\n return;\n }\n\n const source = getAISource();\n\n await this.api.trackPageView({\n event: 'page_view',\n data: {\n url: window.location.href,\n },\n fingerprint: fp,\n ...(source && { source }),\n });\n }\n\n /**\n * Track form submission and enrich lead\n */\n async trackFormSubmit(formData: FormData): Promise<void> {\n if (!this.config || !this.config.emailId || !this.config.nameId) {\n this.logger.warn('Cannot track form - no config loaded');\n return;\n }\n\n const email = formData.get(this.config.emailId)?.toString().trim();\n const name = formData.get(this.config.nameId)?.toString().trim();\n\n let company: string | undefined = undefined;\n if (this.config.companyId) {\n company = formData.get(this.config.companyId)?.toString().trim();\n }\n\n this.logger.log('Form data extracted:', { email, name, company });\n\n if (!email || !name) {\n this.logger.warn('Missing required fields (email, name)');\n return;\n }\n\n await this.identify({\n name,\n email,\n company: company,\n discovery: false,\n });\n }\n\n /**\n * Identify user and enrich lead data\n */\n async identify(leadData: LeadData): Promise<void> {\n const fp = await this.fingerprint.getFingerprint();\n\n if (!fp) {\n this.logger.warn('Cannot identify without fingerprint');\n return;\n }\n\n await this.api.enrichLead({\n fingerprint: fp,\n leadData,\n });\n }\n\n /**\n * Track page views on SPA route changes by patching pushState/replaceState\n * and listening for popstate.\n */\n private setupRouteTracking(): void {\n if (typeof window === 'undefined') return;\n\n this.lastTrackedUrl = window.location.href;\n\n const onRouteChange = () => {\n const currentUrl = window.location.href;\n if (currentUrl === this.lastTrackedUrl) return;\n this.lastTrackedUrl = currentUrl;\n this.logger.log('Route change detected:', currentUrl);\n this.trackPageView();\n };\n\n this.popstateHandler = onRouteChange;\n window.addEventListener('popstate', this.popstateHandler);\n\n this.originalPushState = history.pushState.bind(history);\n this.originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n this.originalPushState!(...args);\n onRouteChange();\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n this.originalReplaceState!(...args);\n onRouteChange();\n };\n }\n\n /**\n * Setup automatic form tracking\n */\n private setupFormTracking(): void {\n if (!this.config || typeof document === 'undefined') {\n this.logger.warn('Cannot track form - no config or document');\n return;\n }\n\n if (this.config.type === 'hosted') {\n const hostedUrlBase = this.config.hostedUrlBase;\n if (!hostedUrlBase) {\n this.logger.warn('Cannot track form - no hosted URL base');\n return;\n }\n\n // Inject utm_fp into all existing matching links\n this.injectFingerprintIntoLinks(document.body, hostedUrlBase);\n\n // Watch for dynamically added links and inject utm_fp as they appear\n this.formObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (!(node instanceof HTMLElement)) continue;\n\n // Check if the added node itself is a matching link\n if (node.tagName === 'A') {\n this.injectFingerprintIntoLink(node as HTMLAnchorElement, hostedUrlBase);\n }\n\n // Check any child links within the added node\n this.injectFingerprintIntoLinks(node, hostedUrlBase);\n }\n }\n });\n\n this.formObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Fallback: intercept clicks for links that may have had their href changed dynamically\n document.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest('a');\n if (!target) return;\n\n const href = target.getAttribute('href');\n if (!href || !href.includes(hostedUrlBase)) return;\n\n // Already tagged — skip\n if (href.includes('utm_fp=')) return;\n\n this.injectFingerprintIntoLink(target as HTMLAnchorElement, hostedUrlBase);\n }, { capture: true });\n\n return;\n }\n else if (this.config.type === 'custom') {\n const attachFormListener = () => {\n if (!this.config || !this.config.formId) {\n this.logger.warn('Cannot track form - no form ID');\n return;\n }\n const form = document.getElementById(this.config!.formId);\n if (!form) {\n this.logger.log('Form not found:', this.config!.formId);\n return;\n }\n\n const formElement = form as HTMLFormElement;\n\n // Check if already tracked\n if (formElement.dataset.thredTracked) {\n return;\n }\n\n this.logger.log('Attaching listener to form:', this.config!.formId);\n\n formElement.addEventListener(\n 'submit',\n () => {\n const formData = new FormData(formElement);\n this.trackFormSubmit(formData);\n },\n { capture: true }\n );\n\n formElement.dataset.thredTracked = 'true';\n };\n\n // Attach immediately if form exists\n attachFormListener();\n\n // Watch for dynamic forms\n this.formObserver = new MutationObserver(() => {\n attachFormListener();\n });\n\n this.formObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n /**\n * Inject utm_fp into all matching links within a root element\n */\n private injectFingerprintIntoLinks(root: HTMLElement, hostedUrlBase: string): void {\n const links = root.querySelectorAll<HTMLAnchorElement>('a[href]');\n for (const link of Array.from(links)) {\n this.injectFingerprintIntoLink(link, hostedUrlBase);\n }\n }\n\n /**\n * Inject utm_fp into a single link if it matches hostedUrlBase\n */\n private injectFingerprintIntoLink(link: HTMLAnchorElement, hostedUrlBase: string): void {\n const href = link.getAttribute('href');\n if (!href || !href.includes(hostedUrlBase)) return;\n\n // Already tagged — skip\n if (href.includes('utm_fp=')) return;\n\n const fp = this.fingerprint.getCachedFingerprint();\n if (!fp) {\n this.logger.warn('Cannot inject utm_fp - no cached fingerprint');\n return;\n }\n\n try {\n const url = new URL(href, window.location.origin);\n url.searchParams.set('utm_fp', fp);\n link.setAttribute('href', url.toString());\n this.logger.log('Injected utm_fp into link:', url.toString());\n } catch (err) {\n this.logger.warn('Failed to parse URL:', href, err);\n }\n }\n\n /**\n * Cleanup tracker\n */\n destroy(): void {\n if (this.formObserver) {\n this.formObserver.disconnect();\n this.formObserver = null;\n }\n\n if (typeof window === 'undefined') return;\n\n if (this.popstateHandler) {\n window.removeEventListener('popstate', this.popstateHandler);\n this.popstateHandler = null;\n }\n\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n }\n}\n","/**\n * Thred SDK - Browser tracking and lead enrichment\n */\n\nimport type { ThredOptions, ThredSDK as IThredSDK, LeadData } from './types';\nimport { Logger } from './utils/logger';\nimport { isFromChatGPT, isFromGemini, isFromPerplexity, isFromAI, getBrowserKeyFromScript } from './utils/detector';\nimport { FingerprintManager } from './core/fingerprint';\nimport { ThredAPI } from './core/api';\nimport { Tracker } from './core/tracker';\n\nexport * from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.thred.dev/v1';\n\nexport class ThredSDK implements IThredSDK {\n private options: ThredOptions;\n private logger: Logger;\n private fingerprint: FingerprintManager;\n private api: ThredAPI;\n private tracker: Tracker;\n private initialized = false;\n\n constructor(options: ThredOptions) {\n this.options = {\n baseUrl: DEFAULT_BASE_URL,\n debug: false, // Set to true for development\n autoInit: true,\n ...options,\n };\n\n this.logger = new Logger(this.options.debug);\n this.fingerprint = new FingerprintManager(this.logger);\n this.api = new ThredAPI(\n this.options.baseUrl!,\n this.options.browserKey,\n this.logger\n );\n this.tracker = new Tracker(this.api, this.fingerprint, this.logger);\n\n if (this.options.autoInit) {\n this.init();\n }\n }\n\n /**\n * Initialize the SDK\n */\n async init(): Promise<void> {\n if (typeof window === 'undefined') {\n this.logger.warn('SDK requires a browser environment — skipping init');\n return;\n }\n\n if (this.initialized) {\n this.logger.warn('SDK already initialized');\n return;\n }\n\n this.logger.log('Initializing Thred SDK...');\n\n // Generate fingerprint\n await this.fingerprint.getFingerprint();\n\n // Initialize tracker\n await this.tracker.init();\n\n this.initialized = true;\n this.logger.log('SDK initialized successfully');\n }\n\n /**\n * Check if visitor is from ChatGPT\n */\n isFromChatGPT(): boolean {\n return isFromChatGPT();\n }\n\n /**\n * Check if visitor is from Google Gemini\n */\n isFromGemini(): boolean {\n return isFromGemini();\n }\n\n /**\n * Check if visitor is from Perplexity AI\n */\n isFromPerplexity(): boolean {\n return isFromPerplexity();\n }\n\n /**\n * Check if visitor is from any supported AI source\n */\n isFromAI(): boolean {\n return isFromAI();\n }\n\n /**\n * Track page view\n */\n async trackPageView(): Promise<void> {\n await this.tracker.trackPageView();\n }\n\n /**\n * Track form submission\n */\n async trackFormSubmit(formData: FormData): Promise<void> {\n await this.tracker.trackFormSubmit(formData);\n }\n\n /**\n * Identify user with lead data\n */\n async identify(leadData: LeadData): Promise<void> {\n await this.tracker.identify(leadData);\n }\n\n /**\n * Get current fingerprint\n */\n getFingerprint(): string | null {\n return this.fingerprint.getCachedFingerprint();\n }\n\n /**\n * Destroy SDK instance and cleanup\n */\n destroy(): void {\n this.tracker.destroy();\n this.fingerprint.clear();\n this.initialized = false;\n this.logger.log('SDK destroyed');\n }\n}\n\n/**\n * Auto-initialize if loaded as script tag with browserKey\n */\nif (typeof window !== 'undefined') {\n const browserKey = getBrowserKeyFromScript();\n if (browserKey) {\n const sdk = new ThredSDK({ browserKey });\n (window as any).Thred = sdk;\n }\n}\n\nexport default ThredSDK;\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.js CHANGED
@@ -74,6 +74,55 @@ function isFromChatGPT() {
74
74
  utmSource === 'openai';
75
75
  return isChatGPTUtm || isChatGPTRef;
76
76
  }
77
+ /**
78
+ * Detects if the visitor came from Google Gemini
79
+ */
80
+ function isFromGemini() {
81
+ var _a;
82
+ if (typeof window === 'undefined')
83
+ return false;
84
+ const params = new URLSearchParams(window.location.search);
85
+ const utmSource = ((_a = params.get('utm_source')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
86
+ const referrer = document.referrer.toLowerCase();
87
+ const isGeminiRef = referrer.includes('gemini.google.com');
88
+ const isGeminiUtm = utmSource === 'gemini' ||
89
+ utmSource.includes('gemini') ||
90
+ utmSource === 'google_gemini';
91
+ return isGeminiRef || isGeminiUtm;
92
+ }
93
+ /**
94
+ * Detects if the visitor came from Perplexity AI
95
+ */
96
+ function isFromPerplexity() {
97
+ var _a;
98
+ if (typeof window === 'undefined')
99
+ return false;
100
+ const params = new URLSearchParams(window.location.search);
101
+ const utmSource = ((_a = params.get('utm_source')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
102
+ const referrer = document.referrer.toLowerCase();
103
+ const isPerplexityRef = referrer.includes('perplexity.ai');
104
+ const isPerplexityUtm = utmSource === 'perplexity' ||
105
+ utmSource.includes('perplexity');
106
+ return isPerplexityRef || isPerplexityUtm;
107
+ }
108
+ /**
109
+ * Detects if the visitor came from any supported AI source
110
+ */
111
+ function isFromAI() {
112
+ return isFromChatGPT() || isFromGemini() || isFromPerplexity();
113
+ }
114
+ /**
115
+ * Returns the detected AI source, or null if the visitor didn't come from a known AI
116
+ */
117
+ function getAISource() {
118
+ if (isFromChatGPT())
119
+ return 'chatgpt';
120
+ if (isFromGemini())
121
+ return 'gemini';
122
+ if (isFromPerplexity())
123
+ return 'perplexity';
124
+ return null;
125
+ }
77
126
  /**
78
127
  * Gets the browser key from script tag if present
79
128
  */
@@ -308,16 +357,16 @@ class Tracker {
308
357
  this.logger.log('Tracking disabled by config');
309
358
  return;
310
359
  }
311
- if (!this.config.hasChatSession && !isFromChatGPT()) {
360
+ if (!this.config.hasChatSession && !isFromAI()) {
312
361
  this.logger.log('No chat session for this fingerprint - exiting');
313
362
  return;
314
363
  }
315
364
  // Track initial page view
316
- if (isFromChatGPT()) {
365
+ if (isFromAI()) {
317
366
  yield this.trackPageView();
318
367
  }
319
368
  else {
320
- this.logger.log('UTM not from ChatGPT - skipping page view');
369
+ this.logger.log('UTM not from AI source - skipping page view');
321
370
  }
322
371
  // Track SPA route changes
323
372
  this.setupRouteTracking();
@@ -337,13 +386,10 @@ class Tracker {
337
386
  this.logger.warn('Cannot track page view without fingerprint');
338
387
  return;
339
388
  }
340
- yield this.api.trackPageView({
341
- event: 'page_view',
342
- data: {
389
+ const source = getAISource();
390
+ yield this.api.trackPageView(Object.assign({ event: 'page_view', data: {
343
391
  url: window.location.href,
344
- },
345
- fingerprint: fp,
346
- });
392
+ }, fingerprint: fp }, (source && { source })));
347
393
  });
348
394
  }
349
395
  /**
@@ -608,6 +654,24 @@ class ThredSDK {
608
654
  isFromChatGPT() {
609
655
  return isFromChatGPT();
610
656
  }
657
+ /**
658
+ * Check if visitor is from Google Gemini
659
+ */
660
+ isFromGemini() {
661
+ return isFromGemini();
662
+ }
663
+ /**
664
+ * Check if visitor is from Perplexity AI
665
+ */
666
+ isFromPerplexity() {
667
+ return isFromPerplexity();
668
+ }
669
+ /**
670
+ * Check if visitor is from any supported AI source
671
+ */
672
+ isFromAI() {
673
+ return isFromAI();
674
+ }
611
675
  /**
612
676
  * Track page view
613
677
  */