@journeeze/sdk 0.0.0-stage → 0.1.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/AGENTS.md +67 -0
  2. package/CHANGELOG.md +30 -0
  3. package/LICENSE.md +27 -0
  4. package/README.md +164 -2
  5. package/dist/THIRD_PARTY_LICENSES.txt +246 -0
  6. package/dist/consent-CoKD33Rm.js +170 -0
  7. package/dist/context-UnG6_X61.js +17 -0
  8. package/dist/contract.js +10 -0
  9. package/dist/feedback-C4CYtS2A.js +196 -0
  10. package/dist/help-C1x-y2f9.js +878 -0
  11. package/dist/hook-BdG4UL4k.js +91 -0
  12. package/dist/index-B_nob8S0.js +2091 -0
  13. package/dist/index-CfCbJJXa.js +20 -0
  14. package/dist/index.js +10 -0
  15. package/dist/loader-Ba4X-WNl.js +95 -0
  16. package/dist/react.js +70 -0
  17. package/dist/resolve-BfWByuTp.js +97 -0
  18. package/dist/script.js +13 -0
  19. package/dist/signals-E3VEdmWH.js +477 -0
  20. package/dist/telemetry-Cik-cYzw.js +140 -0
  21. package/dist/transport-B5YJFQEF.js +60 -0
  22. package/dist/types/config.d.ts +17 -0
  23. package/dist/types/context.d.ts +6 -0
  24. package/dist/types/contract.d.ts +13 -0
  25. package/dist/types/help/core/client.d.ts +26 -0
  26. package/dist/types/help/core/controller.d.ts +175 -0
  27. package/dist/types/help/core/events.d.ts +8 -0
  28. package/dist/types/help/core/help.d.ts +24 -0
  29. package/dist/types/help/core/highlight.d.ts +38 -0
  30. package/dist/types/help/core/panel.d.ts +11 -0
  31. package/dist/types/help/core/search.d.ts +7 -0
  32. package/dist/types/help/ui/callout.d.ts +2 -0
  33. package/dist/types/help/ui/panel.d.ts +3 -0
  34. package/dist/types/help/ui/request.d.ts +2 -0
  35. package/dist/types/help/ui/styles.d.ts +1 -0
  36. package/dist/types/index.d.ts +7 -0
  37. package/dist/types/invite.d.ts +4 -0
  38. package/dist/types/loader.d.ts +57 -0
  39. package/dist/types/mask.d.ts +10 -0
  40. package/dist/types/react.d.ts +9 -0
  41. package/dist/types/resolve/resolve.d.ts +12 -0
  42. package/dist/types/script.d.ts +6 -0
  43. package/dist/types/signals/cel.d.ts +8 -0
  44. package/dist/types/signals/hook.d.ts +10 -0
  45. package/dist/types/signals/signals.conformance.d.ts +2 -0
  46. package/dist/types/signals/signals.d.ts +145 -0
  47. package/dist/types/telemetry/telemetry.d.ts +63 -0
  48. package/dist/types/transport.d.ts +30 -0
  49. package/dist/types/types.d.ts +391 -0
  50. package/dist/types/widget/anchor.d.ts +11 -0
  51. package/dist/types/widget/capture.d.ts +28 -0
  52. package/dist/types/widget/consent.d.ts +25 -0
  53. package/dist/types/widget/feedback.d.ts +36 -0
  54. package/dist/types/widget/icons.d.ts +14 -0
  55. package/dist/types/widget/outbox.d.ts +69 -0
  56. package/dist/types/widget/styles.d.ts +1 -0
  57. package/dist/types/widget.d.ts +27 -0
  58. package/dist/types/wire.d.ts +66 -0
  59. package/dist/widget-DQZm8sAC.js +1599 -0
  60. package/package.json +68 -4
@@ -0,0 +1,477 @@
1
+ import { CONTEXT_FIELDS as Xt, CONTEXT_ID_PATTERN as qt } from "./contract.js";
2
+ import { w as C } from "./loader-Ba4X-WNl.js";
3
+ import { p as Gt, s as Ht, j as gt, m as Vt, M as Zt, r as Qt } from "./transport-B5YJFQEF.js";
4
+ import { c as Yt, C as vt } from "./consent-CoKD33Rm.js";
5
+ const Jt = /[A-Za-z0-9_]/, te = /^[A-Za-z_]\w{0,63}$/, Z = (o) => !!o && Jt.test(o), st = (o) => !!o && o >= "0" && o <= "9";
6
+ function wt(o, n, r) {
7
+ const m = typeof o == typeof r;
8
+ return n === "==" ? m && o === r : n === "!=" ? !(m && o === r) : !m || typeof o == "boolean" ? !1 : n === "<" ? o < r : n === "<=" ? o <= r : n === ">" ? o > r : o >= r;
9
+ }
10
+ function ee(o) {
11
+ if (!(o?.length <= 1024)) return;
12
+ let n = 0, r = 0, m = 0;
13
+ const v = () => {
14
+ for (; n < o.length && o[n] <= " "; ) n++;
15
+ }, w = () => {
16
+ const a = n;
17
+ for (; n < o.length && Z(o[n]); ) n++;
18
+ if (o.slice(a, n) !== "event" || o[n] !== ".") return;
19
+ n++;
20
+ const l = n;
21
+ for (; n < o.length && Z(o[n]); ) n++;
22
+ const c = o.slice(l, n);
23
+ if (c === "kind") return [!0, ""];
24
+ if (c !== "fields" || o[n] !== ".") return;
25
+ n++;
26
+ const h = n;
27
+ for (; n < o.length && Z(o[n]); ) n++;
28
+ const u = o.slice(h, n);
29
+ return te.test(u) ? [!1, u] : void 0;
30
+ }, x = (a) => {
31
+ let l = "";
32
+ for (n++; n < o.length; ) {
33
+ const c = o[n];
34
+ if (c === a)
35
+ return n++, l;
36
+ if (c === "\\") {
37
+ const h = o[n + 1];
38
+ if (h === void 0 || !`\\"'`.includes(h)) return;
39
+ l += h, n += 2;
40
+ continue;
41
+ }
42
+ if (c < " ") return;
43
+ l += c, n++;
44
+ }
45
+ }, U = () => {
46
+ const a = n;
47
+ o[n] === "-" && n++;
48
+ const l = n;
49
+ for (; n < o.length && st(o[n]); ) n++;
50
+ if (n !== l) {
51
+ if (o[n] === ".") {
52
+ n++;
53
+ const c = n;
54
+ for (; n < o.length && st(o[n]); ) n++;
55
+ if (n === c) return;
56
+ }
57
+ return Number(o.slice(a, n));
58
+ }
59
+ }, D = () => {
60
+ const a = o[n];
61
+ if (a === '"' || a === "'") return x(a);
62
+ if (a === "-" || st(a)) return U();
63
+ const l = n;
64
+ for (; n < o.length && Z(o[n]); ) n++;
65
+ const c = o.slice(l, n);
66
+ return c === "true" ? !0 : c === "false" ? !1 : void 0;
67
+ }, k = () => {
68
+ const a = o[n], l = o[n + 1];
69
+ if (a === "=" && l === "=")
70
+ return n += 2, "==";
71
+ if (a === "!" && l === "=")
72
+ return n += 2, "!=";
73
+ if (a === "<" || a === ">")
74
+ return n += l === "=" ? 2 : 1, l === "=" ? a + "=" : a;
75
+ }, R = () => {
76
+ if (v(), o[n] === "(") {
77
+ if (++m > 8) return;
78
+ n++;
79
+ const u = W();
80
+ return v(), !u || o[n] !== ")" ? void 0 : (n++, m--, u);
81
+ }
82
+ const a = o[n] === "e", l = a ? w() : D();
83
+ if (l === void 0) return;
84
+ v();
85
+ const c = k();
86
+ if (!c) return;
87
+ if (v(), a) {
88
+ const u = D();
89
+ if (u === void 0 || ++r > 32) return;
90
+ const b = l;
91
+ return (j) => wt(b[0] ? j.kind : j.fields[b[1]], c, u);
92
+ }
93
+ const h = w();
94
+ if (h && !(++r > 32))
95
+ return (u) => wt(l, c, h[0] ? u.kind : u.fields[h[1]]);
96
+ }, S = (a, l, c) => {
97
+ let h = a();
98
+ if (h)
99
+ for (; ; ) {
100
+ if (v(), o[n] !== l || o[n + 1] !== l) return h;
101
+ n += 2;
102
+ const u = a();
103
+ if (!u) return;
104
+ const b = h;
105
+ h = c ? (j) => b(j) && u(j) : (j) => b(j) || u(j);
106
+ }
107
+ }, p = () => S(R, "&", !0), W = () => S(p, "|", !1), L = W();
108
+ return v(), L && n === o.length ? L : void 0;
109
+ }
110
+ const ne = "jz-platform@1", rt = {
111
+ abandoned_step: { step: "int" },
112
+ hesitation: { dwell_ms: "int" },
113
+ rage_click: { clicks: "int" },
114
+ dead_click: {},
115
+ step_target_missing: { journey: "id", step: "int", rev: "int", tried: "id" }
116
+ }, yt = /^[a-z][a-z0-9_]{0,63}$/, It = /^[a-z0-9._:-]{1,96}$/, oe = /^[a-z0-9._:-]{1,64}$/, _t = 700, ke = 3, jt = 3e3, at = 1e3, ie = 12e4, se = 1e3, re = 1e4, ae = 300, ce = 64, kt = 50, St = 32 * 1024, bt = 5e3, zt = 200, le = 256 * 1024, At = (o, n) => typeof o == "function" && n.every((r) => typeof o.prototype?.[r] == "function");
117
+ function Et(o) {
118
+ const n = o;
119
+ return !!n && At(n.TFloBrowser, ["init", "addPattern", "removePattern", "ingest", "flush", "destroy"]) && At(n.Pattern, ["when", "then", "notThen", "within", "emit"]);
120
+ }
121
+ const de = () => import("./index-B_nob8S0.js");
122
+ async function fe(o, n = de) {
123
+ if (o !== void 0)
124
+ try {
125
+ const r = typeof o == "function" ? await o() : o;
126
+ if (Et(r)) return r;
127
+ C("signals.tflo lacks the TFloBrowser/Pattern surface; using the SDK's own");
128
+ } catch {
129
+ C("signals.tflo failed to load; using the SDK's own");
130
+ }
131
+ try {
132
+ const r = await n();
133
+ if (Et(r)) return r;
134
+ } catch {
135
+ }
136
+ C("tflo failed to load; signals off");
137
+ }
138
+ const Tt = "[data-jz-mask],[data-jz-block],input,textarea,select,[contenteditable]:not([contenteditable='false'])";
139
+ function Mt(o, n = []) {
140
+ let r = o instanceof Element ? o : o instanceof Node ? o.parentElement : null;
141
+ if (!r) return;
142
+ const m = [Tt, ...n].join(",");
143
+ try {
144
+ if (r.closest(m)) return;
145
+ } catch {
146
+ if (r.closest(Tt)) return;
147
+ }
148
+ const w = r.closest("[data-tflow-id]")?.getAttribute("data-tflow-id") ?? void 0;
149
+ return w !== void 0 && It.test(w) ? w : void 0;
150
+ }
151
+ const ue = (o) => Math.round(o / 500) * 500;
152
+ function pe() {
153
+ return crypto.randomUUID();
154
+ }
155
+ const me = 128;
156
+ async function Se(o) {
157
+ const n = o.site;
158
+ if (n.signalsEnabled !== !0) return;
159
+ const r = o.options.signals ?? {}, m = await fe(r.tflo, o.loadOwn);
160
+ if (!m) return;
161
+ const v = o.now ?? (() => performance.now()), w = o.fetchImpl ?? ((...t) => fetch(...t)), x = o.newId ?? pe, U = o.options.maskSelectors ?? [], D = /* @__PURE__ */ new Map();
162
+ for (const t of n.siteSignals ?? []) {
163
+ if (!yt.test(t.name) || t.name in rt || t.name.startsWith("jz_")) continue;
164
+ const e = {};
165
+ for (const i of (t.params ?? []).slice(0, 8)) e[i.name] = i.type === "string" ? "id" : i.type;
166
+ D.set(t.name, e);
167
+ }
168
+ let k = !1;
169
+ const R = [], S = (t, e, i) => {
170
+ t.addEventListener(e, i, { capture: !0, passive: !0 }), R.push(() => t.removeEventListener(e, i, { capture: !0 }));
171
+ };
172
+ let p = [], W = 0, L = 0, a, l = 0, c, h = Promise.resolve();
173
+ const u = (t) => {
174
+ k || c !== void 0 || (c = setTimeout(() => {
175
+ c = void 0, h = h.then(Pt);
176
+ }, t));
177
+ }, b = (t, e = 0) => ({
178
+ siteKey: o.options.siteKey,
179
+ consentGiven: !0,
180
+ ruleSet: ne,
181
+ signals: t,
182
+ ...e > 0 ? { droppedAtUnload: e } : {}
183
+ }), j = (t, e) => {
184
+ const i = [];
185
+ for (const s of t) {
186
+ if (i.length >= kt || gt(b([...i, s])) > e) break;
187
+ i.push(s);
188
+ }
189
+ return i;
190
+ }, Pt = async () => {
191
+ let t = a;
192
+ if (!t && p.length > 0) {
193
+ const e = j(p, St);
194
+ p = p.slice(e.length), t = { signals: e, retries: 0, firstAt: Date.now(), dropped: l }, l = 0;
195
+ }
196
+ if (!(!t || t.signals.length === 0)) {
197
+ a = void 0;
198
+ try {
199
+ await Yt(o.endpoint, "RecordSignals", b(t.signals, t.dropped), w);
200
+ } catch (e) {
201
+ const i = e instanceof vt ? e.status : 0, s = e instanceof vt ? e.retryAfterMs : void 0;
202
+ if (!k && Vt(t.retries, i) && Date.now() - t.firstAt < Zt) {
203
+ a = { ...t, retries: t.retries + 1 }, u(Qt(t.retries + 1, s));
204
+ return;
205
+ }
206
+ }
207
+ p.length > 0 && u(p.length >= kt ? 0 : bt);
208
+ }
209
+ }, Ot = (t, e) => {
210
+ if (!(k || L >= ae)) {
211
+ for (L++, p.push({ eventId: x(), seq: ++W, ...t }), p.length > zt && (p = p.slice(-zt)); p.length > 1 && gt(p) > le; ) p = p.slice(1);
212
+ e ? (c !== void 0 && clearTimeout(c), c = void 0, u(0)) : u(bt);
213
+ }
214
+ }, ct = /* @__PURE__ */ new Map(), B = /* @__PURE__ */ new Map(), K = /* @__PURE__ */ new Map(), Ct = () => {
215
+ const t = o.getContext(), e = {};
216
+ for (const i of Xt) {
217
+ const s = t[i];
218
+ typeof s == "string" && qt.test(s) && (e[i] = s);
219
+ }
220
+ return e;
221
+ }, xt = (t, e) => {
222
+ if (t === "int" && typeof e == "number" && Number.isFinite(e)) return { intValue: String(Math.trunc(e)) };
223
+ if (t === "double" && typeof e == "number" && Number.isFinite(e)) return { doubleValue: e };
224
+ if (t === "bool" && typeof e == "boolean") return { boolValue: e };
225
+ if (t === "id" && typeof e == "string" && oe.test(e)) return { stringValue: e };
226
+ }, lt = (t) => {
227
+ const e = t.payload ?? {};
228
+ if (e.__drop === !0) return;
229
+ const i = rt[t.name], s = i ?? D.get(t.name);
230
+ if (!s) return;
231
+ const d = typeof e.target == "string" && It.test(e.target) ? e.target : void 0;
232
+ if (t.name === "rage_click" && d) {
233
+ const I = K.get(d);
234
+ queueMicrotask(() => _(() => I?.reset()));
235
+ }
236
+ const f = `${t.name} ${d ?? ""}`, g = v(), T = ct.get(f);
237
+ if (T !== void 0 && g - T < re) {
238
+ t.name === "rage_click" && typeof e.clicks == "number" && B.set(f, (B.get(f) ?? 0) + e.clicks);
239
+ return;
240
+ }
241
+ ct.set(f, g);
242
+ const V = {};
243
+ let F = 0;
244
+ for (const [I, Kt] of Object.entries(s)) {
245
+ let it = e[I];
246
+ I === "clicks" && typeof it == "number" && (it += B.get(f) ?? 0, B.delete(f));
247
+ const ht = xt(Kt, it);
248
+ ht && F < 8 && (V[I] = ht, F++);
249
+ }
250
+ Ot(
251
+ {
252
+ name: t.name,
253
+ source: i ? "SIGNAL_SOURCE_PLATFORM" : "SIGNAL_SOURCE_SITE",
254
+ context: Ct(),
255
+ ...d ? { target: d } : {},
256
+ ...F > 0 ? { params: V } : {}
257
+ },
258
+ t.name === "abandoned_step"
259
+ );
260
+ }, Q = m.Pattern;
261
+ let y;
262
+ const dt = async () => {
263
+ const t = new m.TFloBrowser({ sinks: [{ name: "journeeze", send: lt }], onSinkError: () => {
264
+ } });
265
+ try {
266
+ await t.init();
267
+ } catch {
268
+ return C("tflo failed to initialise; signals off"), !1;
269
+ }
270
+ return k ? (t.destroy(), !1) : (y = t, Bt(t), !0);
271
+ }, P = (t, e = {}) => {
272
+ !k && y && _(() => y.ingest({ kind: t, ts: v(), fields: e }));
273
+ }, Y = (t) => t.kind === "jz.end", z = /* @__PURE__ */ new Map();
274
+ let Dt = 0, M;
275
+ const X = (t) => {
276
+ z.delete(t.name), _(() => y?.removePattern(t.name));
277
+ }, J = (t, e, i, s, d, f) => {
278
+ if (!y) return;
279
+ for (const I of z.values()) if (I.key === e) return;
280
+ z.size >= me && X(z.values().next().value);
281
+ const g = ++Dt, T = `${t}#${g}`, V = s(new Q(T), g).within(i).emit(d), F = y.addPattern(V);
282
+ z.set(T, { name: T, key: e, runtime: F, deadline: v() + i }), P("jz.window", { ...f, w: g }), M ?? (M = setInterval(Rt, se));
283
+ };
284
+ function Rt() {
285
+ const t = v();
286
+ for (const e of [...z.values()]) {
287
+ if (e.deadline > t) continue;
288
+ const i = _(() => e.runtime.flush()) ?? [];
289
+ X(e);
290
+ for (const s of i) lt(s);
291
+ }
292
+ z.size === 0 && M !== void 0 && (clearInterval(M), M = void 0);
293
+ }
294
+ const O = (t, e) => {
295
+ for (const i of [...z.values()]) i.name.startsWith(`${t}#`) && (e === void 0 || i.key === e) && X(i);
296
+ };
297
+ let Lt = 0;
298
+ const A = /* @__PURE__ */ new Map(), Nt = (t) => {
299
+ if (!y) return;
300
+ const e = A.get(t);
301
+ if (e) {
302
+ A.delete(t), A.set(t, e);
303
+ return;
304
+ }
305
+ if (A.size >= ce) {
306
+ const [f, g] = A.entries().next().value;
307
+ _(() => y?.removePattern(g)), A.delete(f), K.delete(f);
308
+ }
309
+ const i = (f) => f.kind === "jz.click" && f.fields.target === t, s = `rage_click#${++Lt}`, d = y.addPattern(
310
+ new Q(s).when(i).then(i).then(i).within(_t).emit(
311
+ (f) => f.last().ts - f.first().ts <= _t ? { name: "rage_click", payload: { target: t, clicks: f.length } } : { name: "rage_click", payload: { __drop: !0 } }
312
+ )
313
+ );
314
+ A.set(t, s), K.set(t, d);
315
+ }, $t = (t, e) => J(
316
+ "hesitation",
317
+ t,
318
+ jt,
319
+ (i, s) => i.when((d) => d.fields.w === s).notThen((d) => Y(d) || (d.kind === "jz.unhover" || d.kind === "jz.blur" || d.kind === "jz.click" || d.kind === "jz.change") && d.fields.target === t),
320
+ (i) => ({ name: "hesitation", payload: { target: t, dwell_ms: Math.max(jt, ue(v() - i.first().ts)) } }),
321
+ { target: t, kind: e }
322
+ ), Ft = (t) => J(
323
+ "dead_click",
324
+ t,
325
+ at,
326
+ (e, i) => e.when((s) => s.fields.w === i).notThen((s) => Y(s) || s.kind === "jz.effect"),
327
+ () => ({ name: "dead_click", payload: { target: t } }),
328
+ { target: t }
329
+ );
330
+ let Ut = 0;
331
+ const ft = [];
332
+ for (const t of r.rules ?? []) {
333
+ if (!yt.test(t.name) || t.name in rt || t.name.startsWith("jz_")) {
334
+ C(`site rule ${t.name} refused (name)`);
335
+ continue;
336
+ }
337
+ const e = typeof t.when == "function" ? t.when : ee(t.when);
338
+ if (!e) {
339
+ C(`site rule ${t.name} refused (outside the SDK's CEL subset)`);
340
+ continue;
341
+ }
342
+ ft.push({ rule: t, pred: e });
343
+ }
344
+ const Wt = (t) => he.has(t.kind);
345
+ function Bt(t) {
346
+ for (const { rule: e, pred: i } of ft)
347
+ t.addPattern(
348
+ new Q(`site:${e.name}#${++Ut}`).when((s) => Wt(s) && _(() => i({ kind: s.kind.slice(3), ts: s.ts, fields: { target: s.fields.target } })) === !0).emit((s) => {
349
+ const d = s.first(), f = { target: d.fields.target };
350
+ for (const [g, T] of Object.entries(e.params ?? {})) g !== "target" && (f[g] = ve(d, T));
351
+ return { name: e.name, payload: f };
352
+ })
353
+ );
354
+ }
355
+ let E;
356
+ const tt = () => {
357
+ const t = o.getContext();
358
+ E && t.journeyId !== E.journey && (O("abandoned_step"), E = void 0);
359
+ const e = ge(n, t, E);
360
+ if (!e || E && e.index <= E.index || (E && P("jz.step", { journey: e.journey, index: e.index }), O("abandoned_step"), E = e, e.last)) return;
361
+ const { journey: i, index: s } = e;
362
+ J(
363
+ "abandoned_step",
364
+ i,
365
+ ie,
366
+ (d, f) => d.when((g) => g.fields.w === f).notThen((g) => Y(g) || g.kind === "jz.step" && g.fields.journey === i && g.fields.index > s),
367
+ () => ({ name: "abandoned_step", payload: { step: s + 1 } }),
368
+ { journey: i, index: s }
369
+ );
370
+ };
371
+ let ut = 0;
372
+ const q = () => {
373
+ v() > ut || (P("jz.effect"), O("dead_click"));
374
+ }, N = typeof MutationObserver == "function" ? new MutationObserver(q) : void 0;
375
+ let $;
376
+ const et = typeof PerformanceObserver == "function" ? _(() => new PerformanceObserver((t) => t.getEntries().length > 0 && q())) : void 0;
377
+ _(() => et?.observe({ type: "resource" }));
378
+ const nt = (t) => Mt(t.composedPath?.()[0] ?? t.target, U);
379
+ S(document, "click", (t) => {
380
+ const e = nt(t);
381
+ e && (Nt(e), P("jz.click", { target: e }), O("hesitation", e), ut = v() + at, N && (N.observe(document.documentElement, { childList: !0, attributes: !0, subtree: !0 }), $ !== void 0 && clearTimeout($), $ = setTimeout(() => N.disconnect(), at)), Ft(e));
382
+ });
383
+ const G = (t, e) => S(document, t, (i) => {
384
+ e === "jz.focus" && q();
385
+ const s = nt(i);
386
+ s && ((e === "jz.hover" || e === "jz.unhover") && Mt(i.relatedTarget, U) === s || (P(e, { target: s }), e === "jz.hover" || e === "jz.focus" ? $t(s, e) : O("hesitation", s)));
387
+ });
388
+ G("pointerover", "jz.hover"), G("pointerout", "jz.unhover"), G("focusin", "jz.focus"), G("focusout", "jz.blur"), S(document, "change", (t) => {
389
+ const e = nt(t);
390
+ e && (P("jz.change", { target: e }), O("hesitation", e));
391
+ });
392
+ for (const t of ["popstate", "hashchange"]) S(window, t, q);
393
+ let H = !1;
394
+ const ot = () => {
395
+ if (k || H) return;
396
+ H = !0;
397
+ const t = [...a?.signals ?? [], ...p];
398
+ if (t.length === 0) return;
399
+ const e = (a?.dropped ?? 0) + l, i = j(t, Math.min(Gt(), St));
400
+ i.length > 0 && Ht(o.endpoint, "RecordSignals", b(i, e), w) && (a = void 0, p = [], l = t.length - i.length);
401
+ }, pt = () => {
402
+ for (const t of [...z.values()]) X(t);
403
+ E = void 0;
404
+ }, mt = () => {
405
+ pt();
406
+ for (const e of A.values()) _(() => y?.removePattern(e));
407
+ A.clear(), K.clear();
408
+ const t = y;
409
+ y = void 0, _(() => t?.destroy());
410
+ };
411
+ if (S(window, "pagehide", () => {
412
+ mt(), ot();
413
+ }), S(document, "visibilitychange", () => {
414
+ document.visibilityState === "hidden" ? ot() : H = !1;
415
+ }), S(window, "pageshow", (t) => {
416
+ H = !1, !(!t.persisted || y) && dt().then((e) => e && _(tt));
417
+ }), !await dt()) {
418
+ for (const t of R.splice(0)) t();
419
+ N?.disconnect(), et?.disconnect();
420
+ return;
421
+ }
422
+ return _(tt), {
423
+ contextChanged: () => _(tt),
424
+ stop(t) {
425
+ if (!k) {
426
+ pt(), t || ot(), k = !0;
427
+ for (const e of R.splice(0)) e();
428
+ M !== void 0 && clearInterval(M), c !== void 0 && clearTimeout(c), $ !== void 0 && clearTimeout($), N?.disconnect(), et?.disconnect(), p = [], a = void 0, mt();
429
+ }
430
+ },
431
+ idle: () => h
432
+ };
433
+ }
434
+ const he = /* @__PURE__ */ new Set(["jz.click", "jz.hover", "jz.unhover", "jz.focus", "jz.blur", "jz.change"]);
435
+ function ge(o, n, r) {
436
+ if (!n.journeyId || !n.journeyStep) return;
437
+ const m = o.publishedJourneys?.find((x) => x.journeyId === n.journeyId)?.stepIds;
438
+ if (!m || m.length === 0) return;
439
+ const v = r && r.journey === n.journeyId ? r.index + 1 : 0;
440
+ let w = m.indexOf(n.journeyStep, v);
441
+ return w < 0 && (w = m.indexOf(n.journeyStep)), w >= 0 ? { journey: n.journeyId, index: w, last: w === m.length - 1 } : void 0;
442
+ }
443
+ function _(o) {
444
+ try {
445
+ return o();
446
+ } catch {
447
+ return;
448
+ }
449
+ }
450
+ function ve(o, n) {
451
+ if (n === "event.kind") return o.kind.slice(3);
452
+ const r = /^event\.fields\.([A-Za-z_][A-Za-z0-9_]{0,63})$/.exec(n);
453
+ return r ? o.fields[r[1]] : void 0;
454
+ }
455
+ export {
456
+ ie as ABANDON_MS,
457
+ se as CLOCK_MS,
458
+ at as DEAD_CLICK_MS,
459
+ bt as FLUSH_MS,
460
+ jt as HESITATION_MS,
461
+ kt as MAX_BATCH,
462
+ St as MAX_BATCH_BYTES,
463
+ zt as MAX_QUEUED,
464
+ le as MAX_QUEUED_BYTES,
465
+ ce as MAX_TARGETS,
466
+ me as MAX_WINDOWS,
467
+ ae as PAGE_CAP,
468
+ ke as RAGE_CLICKS,
469
+ _t as RAGE_WINDOW_MS,
470
+ ne as RULE_SET,
471
+ re as THROTTLE_MS,
472
+ Et as hasFloor,
473
+ ge as matchCheckpoint,
474
+ fe as resolveTflo,
475
+ Se as startSignals,
476
+ Mt as trackedId
477
+ };
@@ -0,0 +1,140 @@
1
+ import { h as j, c as W, C as q } from "./consent-CoKD33Rm.js";
2
+ import { p as Q, j as L, s as V, M as z, m as J, r as Z } from "./transport-B5YJFQEF.js";
3
+ function ee(n, u = globalThis.navigator) {
4
+ return n.respectGlobalPrivacyControl !== !1 && u?.globalPrivacyControl === !0;
5
+ }
6
+ const M = 50, B = 32 * 1024, te = 5e3, ne = 1e3, ie = 1e4, $ = 200, re = 256 * 1024, h = "HELP_EVENT_";
7
+ function T(n, u) {
8
+ return n.version ? { journeyId: n.journeyId, stepIndex: u, guideVersion: n.version } : { journeyId: n.journeyId, stepIndex: u };
9
+ }
10
+ const N = /* @__PURE__ */ new Set([`${h}GUIDE_ABANDONED`]);
11
+ function oe(n) {
12
+ return Math.min(Math.max(n ?? te, ne), ie);
13
+ }
14
+ function se() {
15
+ return crypto.randomUUID();
16
+ }
17
+ function le(n) {
18
+ if (ee(n)) return { checkin: () => {
19
+ }, stop: () => {
20
+ } };
21
+ const u = n.fetchImpl ?? fetch, m = oe(n.flushMs), O = n.random ?? Math.random, k = n.newId ?? se;
22
+ let t = [], r, o, l = !1, y = !1, _ = 0, E = 0, i, A, C = !1, D;
23
+ const c = (e) => {
24
+ l || o || (o = setTimeout(() => {
25
+ o = void 0, H();
26
+ }, e));
27
+ }, K = () => {
28
+ for (t.length > $ && (t = t.slice(-$)); t.length > 0 && L(t) > re; ) t = t.slice(1);
29
+ }, g = (e) => {
30
+ l || (_ = _ + 1 >>> 0 || 1, t.push({ ...e, eventId: k(), seq: _ }), K(), N.has(e.event) ? (o && clearTimeout(o), o = void 0, H()) : c(m));
31
+ }, G = () => {
32
+ if (r) return r;
33
+ if (t.length === 0) return;
34
+ const e = [];
35
+ for (const s of t) {
36
+ if (e.length === M || e.length > 0 && L([...e, s]) > B) break;
37
+ e.push(s);
38
+ }
39
+ return t = t.slice(e.length), { events: e, firstAttempt: Date.now(), retries: 0 };
40
+ }, w = (e) => {
41
+ const s = { siteKey: n.siteKey, consentGiven: !0, events: e };
42
+ return E > 0 && (s.droppedAtUnload = E), s;
43
+ }, H = async () => {
44
+ if (y || l) return;
45
+ if (!j(n.siteKey)) {
46
+ t = [], r = void 0;
47
+ return;
48
+ }
49
+ if (typeof navigator < "u" && navigator.onLine === !1) return;
50
+ const e = G();
51
+ if (!e) return;
52
+ if (r = void 0, Date.now() - e.firstAttempt > z) {
53
+ t.length > 0 && c(m);
54
+ return;
55
+ }
56
+ y = !0;
57
+ const s = E;
58
+ try {
59
+ await W(n.endpoint, "RecordHelpEvents", w(e.events), u), E -= s;
60
+ } catch (f) {
61
+ const d = f instanceof q ? f : void 0, a = d?.status ?? 0;
62
+ if (d?.code === "failed_precondition")
63
+ l = !0, t = [];
64
+ else if (J(e.retries, a)) {
65
+ e.retries += 1, r = e, y = !1, c(Z(e.retries, d?.retryAfterMs, O));
66
+ return;
67
+ }
68
+ } finally {
69
+ y = !1;
70
+ }
71
+ !l && (t.length > 0 || r) && c(t.length >= M ? 0 : m);
72
+ }, R = () => {
73
+ if (l && t.length === 0 && !r || (o && clearTimeout(o), o = void 0, !j(n.siteKey))) return;
74
+ const e = [...r?.events ?? [], ...t];
75
+ if (e.length === 0) return;
76
+ const s = [...e.filter((a) => N.has(a.event)), ...e.filter((a) => !N.has(a.event))], f = Math.min(Q(), B), d = [];
77
+ for (const a of s) {
78
+ if (d.length === M || L(w([...d, a])) > f) break;
79
+ d.push(a);
80
+ }
81
+ d.length !== 0 && V(n.endpoint, "RecordHelpEvents", w(d), u) && (E += e.length - d.length, t = [], r = void 0);
82
+ };
83
+ let I = !1;
84
+ const S = () => {
85
+ I || (I = !0, R());
86
+ }, U = () => {
87
+ typeof document < "u" && document.visibilityState === "hidden" && S();
88
+ }, p = () => {
89
+ typeof document < "u" && document.visibilityState !== "visible" || (I = !1, (t.length > 0 || r) && c(0));
90
+ }, P = () => {
91
+ (t.length > 0 || r) && c(0);
92
+ }, b = () => {
93
+ i && !i.done && i.last !== void 0 && g({ event: `${h}GUIDE_ABANDONED`, ...T(i.guide, i.last) }), i = void 0, A = void 0;
94
+ }, X = (e) => {
95
+ const s = D;
96
+ if (D = e, s === void 0) return;
97
+ if (e.view === "disabled") {
98
+ l = !0, t = [];
99
+ return;
100
+ }
101
+ s.view === "closed" && (e.view === "index" || e.view === "guide") && g({ event: `${h}HELP_OPENED`, entry: e.view === "index" ? "HELP_ENTRY_LAUNCHER" : "HELP_ENTRY_API" });
102
+ const f = e.view === "guide" || e.view === "finished" ? e.guide : void 0, d = e.view === "guide" ? e.journeyId : f?.journeyId;
103
+ if (i && d !== i.guide.journeyId && b(), e.view === "guide" && e.status === "ready" && e.guide) {
104
+ i || (i = { guide: e.guide, seen: /* @__PURE__ */ new Set(), done: !1 });
105
+ const v = e.guide.steps[e.step], x = v && `${e.guide.journeyId}/${e.step}`;
106
+ v && x !== A && (A = x, i.last = v.index, g({ event: `${h}${i.seen.has(v.index) ? "STEP_REPEATED" : "STEP_REACHED"}`, ...T(e.guide, v.index) }), i.seen.add(v.index));
107
+ } else e.view === "finished" && i && (i.done = !0, b());
108
+ const a = e.view === "index" && e.status === "ready" && e.query.trim() !== "" && e.results.length === 0;
109
+ a && !C && g({ event: `${h}SEARCH_NO_RESULT` }), C = a;
110
+ }, F = n.subscribe(X);
111
+ addEventListener("pagehide", S), addEventListener("visibilitychange", U), addEventListener("visibilitychange", p), addEventListener("pageshow", p), addEventListener("online", P);
112
+ const Y = () => {
113
+ removeEventListener("pagehide", S), removeEventListener("visibilitychange", U), removeEventListener("visibilitychange", p), removeEventListener("pageshow", p), removeEventListener("online", P);
114
+ };
115
+ return {
116
+ checkin(e) {
117
+ g({ event: `${h}CHECKIN_ANSWERED`, ...T(e.guide, e.step.index), answer: e.answer === "confused" ? "CHECKIN_ANSWER_CONFUSED" : "CHECKIN_ANSWER_UNDERSTOOD" });
118
+ },
119
+ stop(e) {
120
+ if (F(), Y(), !l) {
121
+ if (e) {
122
+ t = [], r = void 0, o && clearTimeout(o), o = void 0, l = !0;
123
+ return;
124
+ }
125
+ b(), l = !0, R();
126
+ }
127
+ }
128
+ };
129
+ }
130
+ export {
131
+ te as FLUSH_MS,
132
+ M as MAX_BATCH,
133
+ B as MAX_BATCH_BYTES,
134
+ ie as MAX_FLUSH_MS,
135
+ $ as MAX_QUEUED,
136
+ re as MAX_QUEUED_BYTES,
137
+ ne as MIN_FLUSH_MS,
138
+ ee as gpcRefusesTelemetry,
139
+ le as startTelemetry
140
+ };
@@ -0,0 +1,60 @@
1
+ import { r as l, T as d, R as f } from "./consent-CoKD33Rm.js";
2
+ const E = 1e3, p = 5, y = 3, S = 55 * 6e4;
3
+ function h(e) {
4
+ return e === 0 || e === 408 || e === 429 || e === 500 || e === 502 || e === 503 || e === 504;
5
+ }
6
+ function _(e, n) {
7
+ return h(n) && e < (n === 0 ? y : p);
8
+ }
9
+ function T(e, n, o = Math.random) {
10
+ const t = Math.min(E * 2 ** Math.max(e - 1, 0), f) * (0.5 + o());
11
+ return Math.round(Math.max(Math.min(t, f), n ?? 0));
12
+ }
13
+ const m = 32 * 1024;
14
+ function v() {
15
+ try {
16
+ return typeof Request < "u" && "keepalive" in new Request("https://journeeze.invalid/", { method: "POST", keepalive: !0 });
17
+ } catch {
18
+ return !1;
19
+ }
20
+ }
21
+ let r = 0, u = !1;
22
+ function R() {
23
+ if (u || typeof addEventListener != "function") return;
24
+ u = !0;
25
+ const e = () => {
26
+ (typeof document > "u" || document.visibilityState === "visible") && (r = 0);
27
+ };
28
+ addEventListener("pageshow", e), addEventListener("visibilitychange", e);
29
+ }
30
+ function g() {
31
+ return R(), Math.max(m - r, 0);
32
+ }
33
+ function A(e, n, o, a = fetch) {
34
+ const t = JSON.stringify(o), i = new TextEncoder().encode(t).length;
35
+ if (i > g()) return !1;
36
+ const c = l(e, n);
37
+ if (v()) {
38
+ r += i;
39
+ try {
40
+ return a(c, { method: "POST", headers: { "content-type": d }, body: t, keepalive: !0, credentials: "omit", cache: "no-store", referrerPolicy: "no-referrer" }).catch(() => {
41
+ }), !0;
42
+ } catch {
43
+ return !1;
44
+ }
45
+ }
46
+ if (typeof navigator > "u" || typeof navigator.sendBeacon != "function") return !1;
47
+ const s = navigator.sendBeacon(c, new Blob([t], { type: d }));
48
+ return s && (r += i), s;
49
+ }
50
+ function b(e) {
51
+ return new TextEncoder().encode(JSON.stringify(e)).length;
52
+ }
53
+ export {
54
+ S as M,
55
+ b as j,
56
+ _ as m,
57
+ g as p,
58
+ T as r,
59
+ A as s
60
+ };
@@ -0,0 +1,17 @@
1
+ import type { JourneezeConfigV1, JourneezeContext } from "./types";
2
+ /**
3
+ * The collector base URL (contract §5): `endpoint` (deprecated, wins), else `apiHost` + `apiPath`,
4
+ * else the Journeeze collector itself (direct mode, the v1 default: C0a §5 "Change [J3c]", C0b §1).
5
+ * A v0 host that relied on its own same-origin proxy without `endpoint` must set
6
+ * `apiHost: location.origin`. `apiHost` is an https origin (http only for localhost/127.0.0.1)
7
+ * without path, query or fragment.
8
+ */
9
+ export declare function collectorBase(config: Pick<JourneezeConfigV1, "endpoint" | "apiHost" | "apiPath">, page?: string): string;
10
+ /** The context fields the collector accepts (§3): an invalid value is dropped, never sent. */
11
+ export declare function checkContext(next: Readonly<JourneezeContext>): JourneezeContext;
12
+ /**
13
+ * The page path feedback carries (contract §3): {@link pagePath} with identifier-like segments
14
+ * replaced by `:id`, since they can name a person or a record. `pagePath: "none"` (Allumata review
15
+ * B7) drops it entirely, in the feedback channel.
16
+ */
17
+ export declare function sentPath(href: string): string;