flowgrid-sdk 1.6.6 → 1.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +3 -0
- package/dist/browser.js.map +1 -1
- package/dist/flowgrid.min.js +1 -1
- package/dist/flowgrid.min.js.map +1 -1
- package/dist/lib/features/analytics/identify.d.ts +27 -0
- package/dist/lib/features/analytics/identify.js +193 -0
- package/dist/lib/features/analytics/identify.js.map +1 -1
- package/dist/lib/features/analytics/index.d.ts +1 -1
- package/dist/lib/features/core/experiment.d.ts +21 -10
- package/dist/lib/features/core/experiment.js +115 -15
- package/dist/lib/features/core/experiment.js.map +1 -1
- package/dist/lib/features/core/index.d.ts +1 -1
- package/dist/lib/features/core/track-feature.d.ts +31 -0
- package/dist/lib/features/core/track-feature.js +67 -0
- package/dist/lib/features/core/track-feature.js.map +1 -1
- package/dist/lib/flowgrid.d.ts +17 -0
- package/dist/lib/flowgrid.js +32 -0
- package/dist/lib/flowgrid.js.map +1 -1
- package/dist/lib/tracking/core/feature.d.ts +3 -1
- package/dist/lib/tracking/core/feature.js +3 -1
- package/dist/lib/tracking/core/feature.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
* ```
|
|
44
44
|
*/
|
|
45
45
|
import { FlowGridTransport } from "../../client/transport";
|
|
46
|
+
import { type Teardown } from "../../utils/browser";
|
|
46
47
|
import { UserTraits, MoneyValue, TimeSeriesData } from "../../types";
|
|
47
48
|
/**
|
|
48
49
|
* Configuration for identifying a user.
|
|
@@ -55,6 +56,15 @@ export interface IdentifyConfig {
|
|
|
55
56
|
/** User traits/properties */
|
|
56
57
|
traits?: UserTraits;
|
|
57
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Options for {@link Identify.autoTrackForms} passive identity capture.
|
|
61
|
+
*/
|
|
62
|
+
export interface PassiveIdentityOptions {
|
|
63
|
+
/** Debounce for `input` events before reading a field (ms, default 800). */
|
|
64
|
+
debounceMs?: number;
|
|
65
|
+
/** Extra `path` regex on which NO inputs are captured (replaces the default). */
|
|
66
|
+
excludePath?: RegExp;
|
|
67
|
+
}
|
|
58
68
|
/**
|
|
59
69
|
* Configuration for aliasing user IDs.
|
|
60
70
|
*/
|
|
@@ -249,5 +259,22 @@ export declare class Identify extends FlowGridTransport {
|
|
|
249
259
|
* @returns Promise resolving to reset response
|
|
250
260
|
*/
|
|
251
261
|
reset(userId: string): Promise<IdentifyResponse>;
|
|
262
|
+
/**
|
|
263
|
+
* Passive identity capture — the browser-side form-field tracker (parity with
|
|
264
|
+
* `flowgrid.js`'s `setupPassiveIdentityCapture`). Watches inputs (initial scan
|
|
265
|
+
* + a MutationObserver for fields added by modals/SPAs), classifies each by
|
|
266
|
+
* name/id/placeholder/autocomplete, hashes PII (SHA-256) before it leaves the
|
|
267
|
+
* browser, and posts the captured identity to the flowgrid-core identity store
|
|
268
|
+
* (`POST /api/v1/identity/identify`) so the dashboard can map the anonymous
|
|
269
|
+
* `visitor_id` to a person — and, with a CRM connected, to a known customer.
|
|
270
|
+
*
|
|
271
|
+
* Privacy: requires `analytics` consent; never attaches to password/card/cvv/
|
|
272
|
+
* ssn/pin fields or anything marked `data-analytics="ignore"` / `.no-track`;
|
|
273
|
+
* skips sensitive paths (checkout/account-settings/admin). Off by default in
|
|
274
|
+
* {@link FlowGrid.autoTrack} — enable with `autoTrack({ passiveIdentity: true })`.
|
|
275
|
+
*
|
|
276
|
+
* @returns a teardown that detaches every listener (no-op on the server).
|
|
277
|
+
*/
|
|
278
|
+
autoTrackForms(options?: PassiveIdentityOptions): Teardown;
|
|
252
279
|
}
|
|
253
280
|
export default Identify;
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
47
|
exports.Identify = void 0;
|
|
48
48
|
const transport_1 = require("../../client/transport");
|
|
49
|
+
const browser_1 = require("../../utils/browser");
|
|
49
50
|
// ============================================================================
|
|
50
51
|
// IDENTIFY CLASS
|
|
51
52
|
// ============================================================================
|
|
@@ -211,6 +212,198 @@ class Identify extends transport_1.FlowGridTransport {
|
|
|
211
212
|
timestamp: new Date().toISOString()
|
|
212
213
|
});
|
|
213
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Passive identity capture — the browser-side form-field tracker (parity with
|
|
217
|
+
* `flowgrid.js`'s `setupPassiveIdentityCapture`). Watches inputs (initial scan
|
|
218
|
+
* + a MutationObserver for fields added by modals/SPAs), classifies each by
|
|
219
|
+
* name/id/placeholder/autocomplete, hashes PII (SHA-256) before it leaves the
|
|
220
|
+
* browser, and posts the captured identity to the flowgrid-core identity store
|
|
221
|
+
* (`POST /api/v1/identity/identify`) so the dashboard can map the anonymous
|
|
222
|
+
* `visitor_id` to a person — and, with a CRM connected, to a known customer.
|
|
223
|
+
*
|
|
224
|
+
* Privacy: requires `analytics` consent; never attaches to password/card/cvv/
|
|
225
|
+
* ssn/pin fields or anything marked `data-analytics="ignore"` / `.no-track`;
|
|
226
|
+
* skips sensitive paths (checkout/account-settings/admin). Off by default in
|
|
227
|
+
* {@link FlowGrid.autoTrack} — enable with `autoTrack({ passiveIdentity: true })`.
|
|
228
|
+
*
|
|
229
|
+
* @returns a teardown that detaches every listener (no-op on the server).
|
|
230
|
+
*/
|
|
231
|
+
autoTrackForms(options = {}) {
|
|
232
|
+
if (!(0, browser_1.isBrowser)())
|
|
233
|
+
return () => { };
|
|
234
|
+
if (!transport_1.FlowGridTransport.hasConsent("analytics"))
|
|
235
|
+
return () => { };
|
|
236
|
+
const win = (0, browser_1.getWindow)();
|
|
237
|
+
const doc = (0, browser_1.getDocument)();
|
|
238
|
+
const debounceMs = options.debounceMs ?? 800;
|
|
239
|
+
const EXCLUDED_PATH_RE = options.excludePath ?? /\/(checkout|account\/settings|admin)(\/|$)/i;
|
|
240
|
+
const BLOCKED_RE = /(password|cardnumber|creditcard|\bcard\b|cvv|cvc|ssn|\bpin\b|securitycode)/i;
|
|
241
|
+
const SKIP_RE = /(message|comment|note|feedback|search|query)/i;
|
|
242
|
+
const FIELD_MAP = [
|
|
243
|
+
{ re: /(email|emailaddress)/, trait: "email", pii: true, identify: true },
|
|
244
|
+
{ re: /(phone|tel|mobile|cell)/, trait: "phone", pii: true, identify: false },
|
|
245
|
+
{ re: /(firstname|fname|givenname)/, trait: "firstName", pii: false, identify: false },
|
|
246
|
+
{ re: /(lastname|lname|surname|familyname)/, trait: "lastName", pii: false, identify: false },
|
|
247
|
+
{ re: /(company|organi[sz]ation|businessname)/, trait: "company", pii: false, identify: false },
|
|
248
|
+
{ re: /(streetaddress|addressline|^address$|^street$)/, trait: "address", pii: false, identify: false },
|
|
249
|
+
{ re: /(^city$|town)/, trait: "city", pii: false, identify: false },
|
|
250
|
+
{ re: /(postcode|postalcode|zipcode|^zip$)/, trait: "postcode", pii: false, identify: false },
|
|
251
|
+
// A single full-name / username field maps to firstName; listed last so
|
|
252
|
+
// dedicated first/last-name fields win when both exist.
|
|
253
|
+
{ re: /(fullname|^name$|username|yourname|contactname|displayname)/, trait: "firstName", pii: false, identify: false },
|
|
254
|
+
];
|
|
255
|
+
const captured = {};
|
|
256
|
+
const seen = new WeakSet();
|
|
257
|
+
const debounceTimers = new WeakMap();
|
|
258
|
+
const teardowns = [];
|
|
259
|
+
const fieldEl = (el) => el;
|
|
260
|
+
const normalize = (el) => [fieldEl(el).name, el.id, el.getAttribute("placeholder"), el.getAttribute("autocomplete")]
|
|
261
|
+
.filter(Boolean).join(" ").toLowerCase().replace(/[\s_-]/g, "");
|
|
262
|
+
const isBlocked = (el, key) => {
|
|
263
|
+
const input = fieldEl(el);
|
|
264
|
+
if (input.type === "password" || input.type === "hidden")
|
|
265
|
+
return true;
|
|
266
|
+
if (el.getAttribute("data-analytics") === "ignore")
|
|
267
|
+
return true;
|
|
268
|
+
if (el.classList && el.classList.contains("no-track"))
|
|
269
|
+
return true;
|
|
270
|
+
return BLOCKED_RE.test(key);
|
|
271
|
+
};
|
|
272
|
+
const classify = (el) => {
|
|
273
|
+
const key = normalize(el);
|
|
274
|
+
if (!key)
|
|
275
|
+
return null;
|
|
276
|
+
if (isBlocked(el, key))
|
|
277
|
+
return { blocked: true };
|
|
278
|
+
if (SKIP_RE.test(key))
|
|
279
|
+
return null;
|
|
280
|
+
return FIELD_MAP.find((f) => f.re.test(key)) ?? null;
|
|
281
|
+
};
|
|
282
|
+
const sha256hex = async (value) => {
|
|
283
|
+
try {
|
|
284
|
+
const enc = new TextEncoder().encode(String(value).trim().toLowerCase());
|
|
285
|
+
const buf = await win.crypto.subtle.digest("SHA-256", enc);
|
|
286
|
+
return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
const resolveVisitorId = () => (this.identityManager ? this.identityManager.getVisitorId() : this.visitorId) || "";
|
|
293
|
+
const resolveSessionId = () => this.identityManager ? this.identityManager.getSessionId() : null;
|
|
294
|
+
// Posts the captured identity to the flowgrid-core identity store. Raw email
|
|
295
|
+
// stays server-side (CRM enrichment + dashboard display); the analytics
|
|
296
|
+
// event store only ever sees hashes (the `field_captured` mirror below).
|
|
297
|
+
const sendIdentity = () => {
|
|
298
|
+
const visitorId = resolveVisitorId();
|
|
299
|
+
if (!this.webId || !visitorId)
|
|
300
|
+
return;
|
|
301
|
+
if (!captured.email && !captured.emailHash && !captured.firstName && !captured.lastName)
|
|
302
|
+
return;
|
|
303
|
+
const traits = {
|
|
304
|
+
email: captured.email ?? null,
|
|
305
|
+
email_hash: captured.emailHash ?? null,
|
|
306
|
+
phone_hash: captured.phoneHash ?? null,
|
|
307
|
+
first_name: captured.firstName ?? null,
|
|
308
|
+
last_name: captured.lastName ?? null,
|
|
309
|
+
company: captured.company ?? null,
|
|
310
|
+
address: captured.address ?? null,
|
|
311
|
+
city: captured.city ?? null,
|
|
312
|
+
postcode: captured.postcode ?? null,
|
|
313
|
+
};
|
|
314
|
+
const url = `${this.endpoint}/api/v1/identity/identify`;
|
|
315
|
+
const payload = JSON.stringify({
|
|
316
|
+
web_id: this.webId,
|
|
317
|
+
visitor_id: visitorId,
|
|
318
|
+
session_id: resolveSessionId(),
|
|
319
|
+
path_name: win.location.pathname,
|
|
320
|
+
traits,
|
|
321
|
+
});
|
|
322
|
+
try {
|
|
323
|
+
if (typeof navigator !== "undefined" && navigator.sendBeacon &&
|
|
324
|
+
navigator.sendBeacon(url, new Blob([payload], { type: "application/json" }))) {
|
|
325
|
+
// sent via beacon
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
void fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: payload, keepalive: true }).catch(() => { });
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch { /* swallow */ }
|
|
332
|
+
};
|
|
333
|
+
const captureField = (el) => {
|
|
334
|
+
const cls = classify(el);
|
|
335
|
+
if (!cls || "blocked" in cls)
|
|
336
|
+
return;
|
|
337
|
+
const value = (fieldEl(el).value || "").trim();
|
|
338
|
+
if (!value)
|
|
339
|
+
return;
|
|
340
|
+
if (cls.pii) {
|
|
341
|
+
const toHash = cls.trait === "phone" ? value.replace(/[^\d+]/g, "") : value;
|
|
342
|
+
void sha256hex(toHash).then((hash) => {
|
|
343
|
+
if (cls.trait === "email") {
|
|
344
|
+
captured.email = value;
|
|
345
|
+
if (hash)
|
|
346
|
+
captured.emailHash = hash;
|
|
347
|
+
}
|
|
348
|
+
else if (cls.trait === "phone" && hash) {
|
|
349
|
+
captured.phoneHash = hash;
|
|
350
|
+
}
|
|
351
|
+
if (cls.identify || captured.email)
|
|
352
|
+
sendIdentity();
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
captured[cls.trait] = value;
|
|
357
|
+
if (captured.email)
|
|
358
|
+
sendIdentity();
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
const attach = (el) => {
|
|
362
|
+
if (seen.has(el))
|
|
363
|
+
return;
|
|
364
|
+
const cls = classify(el);
|
|
365
|
+
if (!cls || "blocked" in cls)
|
|
366
|
+
return; // never listen to blocked / unknown fields
|
|
367
|
+
seen.add(el);
|
|
368
|
+
const onBlur = () => captureField(el);
|
|
369
|
+
const onInput = () => {
|
|
370
|
+
clearTimeout(debounceTimers.get(el));
|
|
371
|
+
debounceTimers.set(el, setTimeout(() => captureField(el), debounceMs));
|
|
372
|
+
};
|
|
373
|
+
el.addEventListener("blur", onBlur, { passive: true });
|
|
374
|
+
el.addEventListener("input", onInput, { passive: true });
|
|
375
|
+
teardowns.push(() => {
|
|
376
|
+
el.removeEventListener("blur", onBlur);
|
|
377
|
+
el.removeEventListener("input", onInput);
|
|
378
|
+
});
|
|
379
|
+
};
|
|
380
|
+
const scanPage = () => {
|
|
381
|
+
if (EXCLUDED_PATH_RE.test(win.location.pathname))
|
|
382
|
+
return;
|
|
383
|
+
doc.querySelectorAll("input, textarea, select").forEach(attach);
|
|
384
|
+
};
|
|
385
|
+
scanPage();
|
|
386
|
+
let mo = null;
|
|
387
|
+
try {
|
|
388
|
+
mo = new MutationObserver(() => scanPage());
|
|
389
|
+
if (doc.body)
|
|
390
|
+
mo.observe(doc.body, { childList: true, subtree: true });
|
|
391
|
+
}
|
|
392
|
+
catch { /* MutationObserver unavailable */ }
|
|
393
|
+
return () => {
|
|
394
|
+
if (mo)
|
|
395
|
+
try {
|
|
396
|
+
mo.disconnect();
|
|
397
|
+
}
|
|
398
|
+
catch { /* noop */ }
|
|
399
|
+
for (const t of teardowns) {
|
|
400
|
+
try {
|
|
401
|
+
t();
|
|
402
|
+
}
|
|
403
|
+
catch { /* noop */ }
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
}
|
|
214
407
|
}
|
|
215
408
|
exports.Identify = Identify;
|
|
216
409
|
exports.default = Identify;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identify.js","sourceRoot":"","sources":["../../../../src/lib/features/analytics/identify.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;;;AAEH,sDAA2D;
|
|
1
|
+
{"version":3,"file":"identify.js","sourceRoot":"","sources":["../../../../src/lib/features/analytics/identify.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export type { ReplayPrivacyMetadata, SessionReplayDropMetadata, SessionReplayErr
|
|
|
16
16
|
export type { PageViewConfig, ScrollDepthConfig, TimeOnPageConfig, PageViewResponse, PageAnalyticsData } from './page-views';
|
|
17
17
|
export type { SessionStartConfig, SessionResponse, SessionEndResponse, SessionAnalyticsData, RealTimeSessionData } from './sessions';
|
|
18
18
|
export type { EventTrackConfig, BatchEventConfig, EventResponse, BatchEventResponse, EventAnalyticsData } from './events';
|
|
19
|
-
export type { IdentifyConfig, AliasConfig, GroupConfig, IdentifyResponse, UserAnalyticsData } from './identify';
|
|
19
|
+
export type { IdentifyConfig, AliasConfig, GroupConfig, IdentifyResponse, UserAnalyticsData, PassiveIdentityOptions } from './identify';
|
|
20
20
|
export type { FunnelDefinition, FunnelStepConfig, FunnelStepResponse, FunnelAnalyticsData, FunnelComparisonData } from './funnels';
|
|
21
21
|
export type { ActivityConfig, CohortAnalysisConfig, ActivityResponse, CohortAnalysisData, StickinessData, ChurnAnalysisData } from './retention';
|
|
22
22
|
export type { AttributionModel, TouchpointConfig, ConversionEvent, TouchpointResponse, AttributionReportData } from './attribution';
|
|
@@ -40,6 +40,14 @@
|
|
|
40
40
|
import { FlowGridTransport } from "../../client/transport";
|
|
41
41
|
import { TimeSeriesData } from "../../types";
|
|
42
42
|
import { ServerCookieReader } from "../../utils/identity";
|
|
43
|
+
/**
|
|
44
|
+
* Global holdout (guide §3) — a fixed, deterministic slice of all visitors
|
|
45
|
+
* who are excluded from every experiment on the site. Lets teams measure
|
|
46
|
+
* the combined lift of "all active experiments" against a clean baseline,
|
|
47
|
+
* with zero server round-trips: each visitor's holdout membership is a pure
|
|
48
|
+
* function of their id, so it's stable across page loads and experiments.
|
|
49
|
+
*/
|
|
50
|
+
export declare const HOLDOUT_PCT = 5;
|
|
43
51
|
/**
|
|
44
52
|
* Configuration for tracking an experiment-related event.
|
|
45
53
|
*
|
|
@@ -80,16 +88,6 @@ export interface ExperimentDefinition {
|
|
|
80
88
|
/** Optional human-readable variant name */
|
|
81
89
|
name?: string;
|
|
82
90
|
}>;
|
|
83
|
-
/**
|
|
84
|
-
* Optional audience configuration.
|
|
85
|
-
* Allows limiting exposure by percentage and/or filter conditions.
|
|
86
|
-
*/
|
|
87
|
-
audience?: {
|
|
88
|
-
/** Percentage of total traffic eligible (0–100) */
|
|
89
|
-
percentage: number;
|
|
90
|
-
/** Attribute-based targeting filters */
|
|
91
|
-
filters?: Record<string, unknown>;
|
|
92
|
-
};
|
|
93
91
|
/** Primary metric used to evaluate experiment success */
|
|
94
92
|
primaryMetric: string;
|
|
95
93
|
/** Optional secondary metrics */
|
|
@@ -410,6 +408,19 @@ export declare class Experiment extends FlowGridTransport {
|
|
|
410
408
|
*/
|
|
411
409
|
private deterministicAssign;
|
|
412
410
|
private assignVariant;
|
|
411
|
+
/**
|
|
412
|
+
* Groups experiment ids by their `properties.exclusion_group`, so
|
|
413
|
+
* `assignVariant` can deterministically pick exactly one experiment per
|
|
414
|
+
* group for each visitor (guide §3 mutual exclusion).
|
|
415
|
+
*/
|
|
416
|
+
private computeExclusionGroupMembers;
|
|
417
|
+
/**
|
|
418
|
+
* Assigns variants straight from the locally supplied configs — the
|
|
419
|
+
* degraded path when the verify endpoint is unreachable OR returns an
|
|
420
|
+
* error (429 rate limit, 5xx). An unverified local assignment that emits
|
|
421
|
+
* events beats silently disabling the experiment for this visitor.
|
|
422
|
+
*/
|
|
423
|
+
private assignFromLocalConfigs;
|
|
413
424
|
private verifyExperiments;
|
|
414
425
|
/**
|
|
415
426
|
* Initialise the client-side experiment engine.
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* ```
|
|
40
40
|
*/
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.Experiment = void 0;
|
|
42
|
+
exports.Experiment = exports.HOLDOUT_PCT = void 0;
|
|
43
43
|
const transport_1 = require("../../client/transport");
|
|
44
44
|
const storage_1 = require("../../utils/storage");
|
|
45
45
|
// ============================================================================
|
|
@@ -57,6 +57,36 @@ function fnv1a(input) {
|
|
|
57
57
|
}
|
|
58
58
|
return hash;
|
|
59
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Global holdout (guide §3) — a fixed, deterministic slice of all visitors
|
|
62
|
+
* who are excluded from every experiment on the site. Lets teams measure
|
|
63
|
+
* the combined lift of "all active experiments" against a clean baseline,
|
|
64
|
+
* with zero server round-trips: each visitor's holdout membership is a pure
|
|
65
|
+
* function of their id, so it's stable across page loads and experiments.
|
|
66
|
+
*/
|
|
67
|
+
exports.HOLDOUT_PCT = 5;
|
|
68
|
+
function isInHoldout(userId, holdoutPct = exports.HOLDOUT_PCT) {
|
|
69
|
+
if (holdoutPct <= 0)
|
|
70
|
+
return false;
|
|
71
|
+
if (holdoutPct >= 100)
|
|
72
|
+
return true;
|
|
73
|
+
const hash = fnv1a('holdout::' + userId);
|
|
74
|
+
return (hash % 10000) / 100 < holdoutPct;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Mutual exclusion (guide §3) — experiments that could interact (e.g. two
|
|
78
|
+
* tests on the same checkout flow) share an `exclusion_group` id in their
|
|
79
|
+
* properties. Each visitor deterministically "claims" exactly one experiment
|
|
80
|
+
* per group, so no one is ever in two experiments from the same group at once.
|
|
81
|
+
*/
|
|
82
|
+
function filterMutuallyExclusive(userId, experimentId, exclusionGroup, groupMemberIds) {
|
|
83
|
+
const members = Array.from(new Set([...groupMemberIds, experimentId])).sort();
|
|
84
|
+
if (members.length <= 1)
|
|
85
|
+
return true;
|
|
86
|
+
const hash = fnv1a('exclusion::' + exclusionGroup + '::' + userId);
|
|
87
|
+
const claimed = members[hash % members.length];
|
|
88
|
+
return claimed === experimentId;
|
|
89
|
+
}
|
|
60
90
|
// ============================================================================
|
|
61
91
|
// CONSTANTS
|
|
62
92
|
// ============================================================================
|
|
@@ -347,18 +377,53 @@ class Experiment extends transport_1.FlowGridTransport {
|
|
|
347
377
|
}
|
|
348
378
|
return variants[variants.length - 1].id;
|
|
349
379
|
}
|
|
350
|
-
assignVariant(experimentId, variants) {
|
|
380
|
+
assignVariant(experimentId, variants, properties = {}, exclusionGroupMembers = []) {
|
|
351
381
|
// Reload from localStorage to handle cross-tab race conditions
|
|
352
382
|
this.assignments = this.loadAssignments();
|
|
353
383
|
const existing = this.assignments[experimentId];
|
|
354
|
-
if (existing && variants.some(v => v.id === existing)) {
|
|
355
|
-
// Existing assignment still valid — keep it
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
384
|
// Resolve a userId for the hash: prefer identityManager's visitorId, then fall back
|
|
359
385
|
const userId = this.identityManager?.getVisitorId?.()
|
|
360
386
|
|| this.visitorId
|
|
361
387
|
|| this.getOrCreateAnonId();
|
|
388
|
+
// "Ship B" short-circuit (guide §6 `initExperiment` pattern): once the
|
|
389
|
+
// dashboard declares a winner, `properties.status`/`winner_id` on the
|
|
390
|
+
// definition are enough to converge every visitor — new or already
|
|
391
|
+
// bucketed — onto it. Stopping a test becomes a data change (one row
|
|
392
|
+
// update, picked up on the next page load), not a redeploy.
|
|
393
|
+
const status = typeof properties.status === 'string' ? properties.status : undefined;
|
|
394
|
+
const winnerId = typeof properties.winner_id === 'string' ? properties.winner_id : undefined;
|
|
395
|
+
if (status === 'complete' && winnerId && variants.some(v => v.id === winnerId)) {
|
|
396
|
+
if (existing === winnerId)
|
|
397
|
+
return;
|
|
398
|
+
this.assignments[experimentId] = winnerId;
|
|
399
|
+
this.saveAssignments();
|
|
400
|
+
this.init('experiment_assignment', {
|
|
401
|
+
type: 'experiment',
|
|
402
|
+
subtype: 'assignment',
|
|
403
|
+
experimentId,
|
|
404
|
+
userId,
|
|
405
|
+
variantId: winnerId,
|
|
406
|
+
source: 'shipped_winner',
|
|
407
|
+
assignmentSource: 'sdk_init',
|
|
408
|
+
timestamp: new Date().toISOString(),
|
|
409
|
+
}).catch(() => { });
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (existing && variants.some(v => v.id === existing)) {
|
|
413
|
+
// Existing assignment still valid — keep it
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
// Traffic-splitting primitives (guide §3) — these only gate *new*
|
|
417
|
+
// assignments. A visitor already bucketed into this experiment keeps
|
|
418
|
+
// their assignment even if they'd now land in the holdout or lose an
|
|
419
|
+
// exclusion-group claim; retroactively pulling people out would bias
|
|
420
|
+
// the very results the test is trying to measure.
|
|
421
|
+
if (isInHoldout(userId))
|
|
422
|
+
return;
|
|
423
|
+
const exclusionGroup = typeof properties.exclusion_group === 'string' ? properties.exclusion_group : undefined;
|
|
424
|
+
if (exclusionGroup && !filterMutuallyExclusive(userId, experimentId, exclusionGroup, exclusionGroupMembers)) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
362
427
|
// Deterministic assignment via hash
|
|
363
428
|
const assignedVariantId = this.deterministicAssign(userId, experimentId, variants);
|
|
364
429
|
this.assignments[experimentId] = assignedVariantId;
|
|
@@ -379,6 +444,41 @@ class Experiment extends transport_1.FlowGridTransport {
|
|
|
379
444
|
// ---------------------------------------------------------------------------
|
|
380
445
|
// CLIENT-SIDE ENGINE — server verification
|
|
381
446
|
// ---------------------------------------------------------------------------
|
|
447
|
+
/**
|
|
448
|
+
* Groups experiment ids by their `properties.exclusion_group`, so
|
|
449
|
+
* `assignVariant` can deterministically pick exactly one experiment per
|
|
450
|
+
* group for each visitor (guide §3 mutual exclusion).
|
|
451
|
+
*/
|
|
452
|
+
computeExclusionGroupMembers(items) {
|
|
453
|
+
const groups = new Map();
|
|
454
|
+
for (const item of items) {
|
|
455
|
+
const group = typeof item.properties?.exclusion_group === 'string' ? item.properties.exclusion_group : undefined;
|
|
456
|
+
if (!group)
|
|
457
|
+
continue;
|
|
458
|
+
if (!groups.has(group))
|
|
459
|
+
groups.set(group, []);
|
|
460
|
+
groups.get(group).push(item.experiment_id);
|
|
461
|
+
}
|
|
462
|
+
return groups;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Assigns variants straight from the locally supplied configs — the
|
|
466
|
+
* degraded path when the verify endpoint is unreachable OR returns an
|
|
467
|
+
* error (429 rate limit, 5xx). An unverified local assignment that emits
|
|
468
|
+
* events beats silently disabling the experiment for this visitor.
|
|
469
|
+
*/
|
|
470
|
+
assignFromLocalConfigs(configs) {
|
|
471
|
+
const groupMembers = this.computeExclusionGroupMembers(configs.map(exp => ({ experiment_id: exp.id, properties: exp.properties })));
|
|
472
|
+
for (const exp of configs) {
|
|
473
|
+
this.experiments[exp.id] = {
|
|
474
|
+
variants: exp.variants,
|
|
475
|
+
properties: exp.properties || {},
|
|
476
|
+
verified: false,
|
|
477
|
+
};
|
|
478
|
+
const exclusionGroup = typeof exp.properties?.exclusion_group === 'string' ? exp.properties.exclusion_group : undefined;
|
|
479
|
+
this.assignVariant(exp.id, exp.variants, exp.properties || {}, exclusionGroup ? groupMembers.get(exclusionGroup) ?? [] : []);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
382
482
|
async verifyExperiments(configs) {
|
|
383
483
|
const payload = {
|
|
384
484
|
web_id: this.webId,
|
|
@@ -396,6 +496,7 @@ class Experiment extends transport_1.FlowGridTransport {
|
|
|
396
496
|
});
|
|
397
497
|
const response = await res.json();
|
|
398
498
|
if (response.ok && Array.isArray(response.data)) {
|
|
499
|
+
const groupMembers = this.computeExclusionGroupMembers(response.data);
|
|
399
500
|
for (const item of response.data) {
|
|
400
501
|
if (item.action !== 'error') {
|
|
401
502
|
this.experiments[item.experiment_id] = {
|
|
@@ -403,21 +504,20 @@ class Experiment extends transport_1.FlowGridTransport {
|
|
|
403
504
|
properties: item.properties ?? {},
|
|
404
505
|
verified: true,
|
|
405
506
|
};
|
|
406
|
-
|
|
507
|
+
const exclusionGroup = typeof item.properties?.exclusion_group === 'string' ? item.properties.exclusion_group : undefined;
|
|
508
|
+
this.assignVariant(item.experiment_id, item.variants, item.properties ?? {}, exclusionGroup ? groupMembers.get(exclusionGroup) ?? [] : []);
|
|
407
509
|
}
|
|
408
510
|
}
|
|
409
511
|
}
|
|
512
|
+
else {
|
|
513
|
+
// Server replied but refused (rate limit, validation, 5xx) — degrade
|
|
514
|
+
// to local assignment rather than leaving the visitor unassigned.
|
|
515
|
+
this.assignFromLocalConfigs(configs);
|
|
516
|
+
}
|
|
410
517
|
}
|
|
411
518
|
catch {
|
|
412
519
|
// Network failure — fall back to local config
|
|
413
|
-
|
|
414
|
-
this.experiments[exp.id] = {
|
|
415
|
-
variants: exp.variants,
|
|
416
|
-
properties: exp.properties || {},
|
|
417
|
-
verified: false,
|
|
418
|
-
};
|
|
419
|
-
this.assignVariant(exp.id, exp.variants);
|
|
420
|
-
}
|
|
520
|
+
this.assignFromLocalConfigs(configs);
|
|
421
521
|
}
|
|
422
522
|
}
|
|
423
523
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experiment.js","sourceRoot":"","sources":["../../../../src/lib/features/core/experiment.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"experiment.js","sourceRoot":"","sources":["../../../../src/lib/features/core/experiment.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,6 @@ export { TrackFeature } from './track-feature';
|
|
|
7
7
|
export { TrackPrompt } from './track-prompt';
|
|
8
8
|
export { Experiment } from './experiment';
|
|
9
9
|
export type { ActivationConfig, OnboardingStepConfig, FirstActionConfig, ActivationResponse, ActivationAnalyticsData } from './activation';
|
|
10
|
-
export type { FeatureConfig, FeatureUsageConfig, FeatureDiscoveryConfig, FeatureResponse, FeatureAnalyticsData } from './track-feature';
|
|
10
|
+
export type { FeatureConfig, FeatureUsageConfig, FeatureDiscoveryConfig, FeatureResponse, FeatureAnalyticsData, SmartFeatureOptions, FeatureStage } from './track-feature';
|
|
11
11
|
export type { PromptConfig, PromptSubmissionConfig, PromptResponseConfig, PromptFeedbackConfig, PromptResponse, PromptAnalyticsData } from './track-prompt';
|
|
12
12
|
export type { ExperimentConfig, ExperimentDefinition, ExperimentAssignmentConfig, ExperimentConversionConfig, ExperimentResponse, ExperimentResultsData, ExperimentAnalyticsData, ExperimentVariant, ExperimentInitConfig, VariantResponse } from './experiment';
|
|
@@ -39,6 +39,25 @@
|
|
|
39
39
|
*/
|
|
40
40
|
import { FlowGridTransport } from "../../client/transport";
|
|
41
41
|
import { TimeSeriesData } from "../../types";
|
|
42
|
+
/** Lifecycle stage the dashboard's adoption funnel reads (event_subtype). */
|
|
43
|
+
export type FeatureStage = "discovery" | "viewed" | "adoption" | "completed" | "abandonment";
|
|
44
|
+
/** Options for the intelligent one-liner {@link TrackFeature.feature}. */
|
|
45
|
+
export interface SmartFeatureOptions {
|
|
46
|
+
/** Human label; defaults to a humanised `featureId`. */
|
|
47
|
+
name?: string;
|
|
48
|
+
/** Feature category (e.g. "Automation"). */
|
|
49
|
+
category?: string;
|
|
50
|
+
/** Mark this interaction as a successful completion of the feature's job. */
|
|
51
|
+
completed?: boolean;
|
|
52
|
+
/** Mark this interaction as abandoned (started but gave up). */
|
|
53
|
+
abandoned?: boolean;
|
|
54
|
+
/** Distinct days of use before a visitor counts as "adopted" (default 2). */
|
|
55
|
+
adoptionDays?: number;
|
|
56
|
+
/** Total uses before a visitor counts as "adopted" (default 5). */
|
|
57
|
+
adoptionUses?: number;
|
|
58
|
+
/** Extra properties to attach. */
|
|
59
|
+
properties?: Record<string, unknown>;
|
|
60
|
+
}
|
|
42
61
|
type FeatureConfigProperties = {
|
|
43
62
|
featureId?: string;
|
|
44
63
|
featureName: string;
|
|
@@ -199,4 +218,16 @@ export declare class TrackFeature extends FlowGridTransport {
|
|
|
199
218
|
*/
|
|
200
219
|
trackUsage(config: FeatureUsageConfig): Promise<FeatureResponse>;
|
|
201
220
|
}
|
|
221
|
+
/** Humanises a feature id → display name ("ai-agent-builder" → "Ai Agent Builder"). */
|
|
222
|
+
export declare function humaniseFeatureId(id: string): string;
|
|
223
|
+
/**
|
|
224
|
+
* Derives the lifecycle stage(s) a single `feature()` call should emit, from
|
|
225
|
+
* per-visitor local state. Pure of any transport — the caller emits each stage
|
|
226
|
+
* via `FlowGrid.track("feature_usage", …)`. Persists the updated state.
|
|
227
|
+
*
|
|
228
|
+
* - first-ever use → ["discovery", "viewed"]
|
|
229
|
+
* - subsequent use → ["viewed"] (+ "adoption" once past the threshold)
|
|
230
|
+
* - `{ completed }` → ["completed"] `{ abandoned }` → ["abandonment"]
|
|
231
|
+
*/
|
|
232
|
+
export declare function deriveFeatureStages(stateKey: string, opts?: SmartFeatureOptions): FeatureStage[];
|
|
202
233
|
export default TrackFeature;
|