@agentuity/frontend 0.0.111 → 0.1.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.
- package/dist/analytics/beacon.d.ts +15 -0
- package/dist/analytics/beacon.d.ts.map +1 -0
- package/dist/analytics/beacon.js +177 -0
- package/dist/analytics/beacon.js.map +1 -0
- package/dist/analytics/collectors/clicks.d.ts +10 -0
- package/dist/analytics/collectors/clicks.d.ts.map +1 -0
- package/dist/analytics/collectors/clicks.js +84 -0
- package/dist/analytics/collectors/clicks.js.map +1 -0
- package/dist/analytics/collectors/errors.d.ts +5 -0
- package/dist/analytics/collectors/errors.d.ts.map +1 -0
- package/dist/analytics/collectors/errors.js +43 -0
- package/dist/analytics/collectors/errors.js.map +1 -0
- package/dist/analytics/collectors/forms.d.ts +5 -0
- package/dist/analytics/collectors/forms.d.ts.map +1 -0
- package/dist/analytics/collectors/forms.js +55 -0
- package/dist/analytics/collectors/forms.js.map +1 -0
- package/dist/analytics/collectors/pageview.d.ts +15 -0
- package/dist/analytics/collectors/pageview.d.ts.map +1 -0
- package/dist/analytics/collectors/pageview.js +64 -0
- package/dist/analytics/collectors/pageview.js.map +1 -0
- package/dist/analytics/collectors/scroll.d.ts +17 -0
- package/dist/analytics/collectors/scroll.d.ts.map +1 -0
- package/dist/analytics/collectors/scroll.js +93 -0
- package/dist/analytics/collectors/scroll.js.map +1 -0
- package/dist/analytics/collectors/spa.d.ts +10 -0
- package/dist/analytics/collectors/spa.d.ts.map +1 -0
- package/dist/analytics/collectors/spa.js +53 -0
- package/dist/analytics/collectors/spa.js.map +1 -0
- package/dist/analytics/collectors/visibility.d.ts +18 -0
- package/dist/analytics/collectors/visibility.d.ts.map +1 -0
- package/dist/analytics/collectors/visibility.js +81 -0
- package/dist/analytics/collectors/visibility.js.map +1 -0
- package/dist/analytics/collectors/webvitals.d.ts +6 -0
- package/dist/analytics/collectors/webvitals.d.ts.map +1 -0
- package/dist/analytics/collectors/webvitals.js +111 -0
- package/dist/analytics/collectors/webvitals.js.map +1 -0
- package/dist/analytics/events.d.ts +18 -0
- package/dist/analytics/events.d.ts.map +1 -0
- package/dist/analytics/events.js +126 -0
- package/dist/analytics/events.js.map +1 -0
- package/dist/analytics/index.d.ts +12 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +12 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/offline.d.ts +19 -0
- package/dist/analytics/offline.d.ts.map +1 -0
- package/dist/analytics/offline.js +145 -0
- package/dist/analytics/offline.js.map +1 -0
- package/dist/analytics/types.d.ts +113 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +2 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/analytics/utils/storage.d.ts +13 -0
- package/dist/analytics/utils/storage.d.ts.map +1 -0
- package/dist/analytics/utils/storage.js +63 -0
- package/dist/analytics/utils/storage.js.map +1 -0
- package/dist/analytics/utils/utm.d.ts +12 -0
- package/dist/analytics/utils/utm.d.ts.map +1 -0
- package/dist/analytics/utils/utm.js +27 -0
- package/dist/analytics/utils/utm.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/analytics/beacon.ts +203 -0
- package/src/analytics/collectors/clicks.ts +100 -0
- package/src/analytics/collectors/errors.ts +49 -0
- package/src/analytics/collectors/forms.ts +64 -0
- package/src/analytics/collectors/pageview.ts +76 -0
- package/src/analytics/collectors/scroll.ts +112 -0
- package/src/analytics/collectors/spa.ts +60 -0
- package/src/analytics/collectors/visibility.ts +94 -0
- package/src/analytics/collectors/webvitals.ts +129 -0
- package/src/analytics/events.ts +144 -0
- package/src/analytics/index.ts +21 -0
- package/src/analytics/offline.ts +163 -0
- package/src/analytics/types.ts +139 -0
- package/src/analytics/utils/storage.ts +64 -0
- package/src/analytics/utils/utm.ts +36 -0
- package/src/index.ts +18 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
const DB_NAME = 'agentuity_analytics';
|
|
2
|
+
const STORE_NAME = 'events';
|
|
3
|
+
const DB_VERSION = 1;
|
|
4
|
+
const MAX_QUEUE_SIZE = 1000;
|
|
5
|
+
let db = null;
|
|
6
|
+
let dbInitPromise = null;
|
|
7
|
+
/**
|
|
8
|
+
* Initialize IndexedDB for offline event storage
|
|
9
|
+
*/
|
|
10
|
+
async function initDB() {
|
|
11
|
+
if (typeof indexedDB === 'undefined') {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
try {
|
|
16
|
+
const request = indexedDB.open(DB_NAME, DB_VERSION);
|
|
17
|
+
request.onerror = () => {
|
|
18
|
+
resolve(null);
|
|
19
|
+
};
|
|
20
|
+
request.onsuccess = () => {
|
|
21
|
+
resolve(request.result);
|
|
22
|
+
};
|
|
23
|
+
request.onupgradeneeded = (e) => {
|
|
24
|
+
const database = e.target.result;
|
|
25
|
+
if (!database.objectStoreNames.contains(STORE_NAME)) {
|
|
26
|
+
database.createObjectStore(STORE_NAME, { keyPath: 'id' });
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
resolve(null);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get database instance
|
|
37
|
+
*/
|
|
38
|
+
async function getDB() {
|
|
39
|
+
if (db) {
|
|
40
|
+
return db;
|
|
41
|
+
}
|
|
42
|
+
if (!dbInitPromise) {
|
|
43
|
+
dbInitPromise = initDB();
|
|
44
|
+
}
|
|
45
|
+
db = await dbInitPromise;
|
|
46
|
+
return db;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Store event in IndexedDB for offline persistence
|
|
50
|
+
*/
|
|
51
|
+
export async function storeOfflineEvent(event) {
|
|
52
|
+
const database = await getDB();
|
|
53
|
+
if (!database) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
58
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
59
|
+
// Check current count and evict old events if needed before adding
|
|
60
|
+
const count = await new Promise((resolve) => {
|
|
61
|
+
const countRequest = store.count();
|
|
62
|
+
countRequest.onsuccess = () => resolve(countRequest.result);
|
|
63
|
+
countRequest.onerror = () => resolve(0);
|
|
64
|
+
});
|
|
65
|
+
if (count >= MAX_QUEUE_SIZE) {
|
|
66
|
+
// Evict oldest event (FIFO) before adding new one
|
|
67
|
+
await new Promise((resolve) => {
|
|
68
|
+
const cursorRequest = store.openCursor();
|
|
69
|
+
cursorRequest.onsuccess = () => {
|
|
70
|
+
const cursor = cursorRequest.result;
|
|
71
|
+
if (cursor) {
|
|
72
|
+
const deleteRequest = cursor.delete();
|
|
73
|
+
deleteRequest.onsuccess = () => resolve();
|
|
74
|
+
deleteRequest.onerror = () => resolve();
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
resolve();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
cursorRequest.onerror = () => resolve();
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
store.add(event);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Silent failure
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get all offline events and clear them
|
|
91
|
+
*/
|
|
92
|
+
export async function getAndClearOfflineEvents() {
|
|
93
|
+
const database = await getDB();
|
|
94
|
+
if (!database) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
return new Promise((resolve) => {
|
|
98
|
+
try {
|
|
99
|
+
const transaction = database.transaction(STORE_NAME, 'readwrite');
|
|
100
|
+
const store = transaction.objectStore(STORE_NAME);
|
|
101
|
+
const events = [];
|
|
102
|
+
const request = store.openCursor();
|
|
103
|
+
request.onsuccess = () => {
|
|
104
|
+
const cursor = request.result;
|
|
105
|
+
if (cursor) {
|
|
106
|
+
events.push(cursor.value);
|
|
107
|
+
cursor.delete();
|
|
108
|
+
cursor.continue();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
resolve(events);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
request.onerror = () => {
|
|
115
|
+
resolve([]);
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
resolve([]);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if we're online
|
|
125
|
+
*/
|
|
126
|
+
export function isOnline() {
|
|
127
|
+
if (typeof navigator === 'undefined') {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
return navigator.onLine !== false;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Initialize offline support
|
|
134
|
+
* Listens for online event to flush queued events
|
|
135
|
+
*/
|
|
136
|
+
export function initOfflineSupport(flushCallback) {
|
|
137
|
+
if (typeof window === 'undefined') {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
window.addEventListener('online', () => {
|
|
141
|
+
// Flush offline events when coming back online
|
|
142
|
+
flushCallback();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=offline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.js","sourceRoot":"","sources":["../../src/analytics/offline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics event types
|
|
3
|
+
*/
|
|
4
|
+
export type AnalyticsEventType = 'pageview' | 'click' | 'scroll' | 'visibility' | 'error' | 'custom' | 'web_vital' | 'form_submit' | 'outbound_link';
|
|
5
|
+
/**
|
|
6
|
+
* Analytics event sent to the collection endpoint
|
|
7
|
+
*/
|
|
8
|
+
export interface AnalyticsEvent {
|
|
9
|
+
id: string;
|
|
10
|
+
timestamp: number;
|
|
11
|
+
timezone_offset: number;
|
|
12
|
+
event_type: AnalyticsEventType;
|
|
13
|
+
event_name?: string;
|
|
14
|
+
event_data?: Record<string, unknown>;
|
|
15
|
+
url: string;
|
|
16
|
+
path: string;
|
|
17
|
+
referrer: string;
|
|
18
|
+
title: string;
|
|
19
|
+
screen_width: number;
|
|
20
|
+
screen_height: number;
|
|
21
|
+
viewport_width: number;
|
|
22
|
+
viewport_height: number;
|
|
23
|
+
device_pixel_ratio: number;
|
|
24
|
+
user_agent: string;
|
|
25
|
+
language: string;
|
|
26
|
+
load_time?: number;
|
|
27
|
+
dom_ready?: number;
|
|
28
|
+
ttfb?: number;
|
|
29
|
+
fcp?: number;
|
|
30
|
+
lcp?: number;
|
|
31
|
+
cls?: number;
|
|
32
|
+
inp?: number;
|
|
33
|
+
scroll_depth?: number;
|
|
34
|
+
time_on_page?: number;
|
|
35
|
+
utm_source?: string;
|
|
36
|
+
utm_medium?: string;
|
|
37
|
+
utm_campaign?: string;
|
|
38
|
+
utm_term?: string;
|
|
39
|
+
utm_content?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Batch payload sent to /_agentuity/webanalytics/collect
|
|
43
|
+
*/
|
|
44
|
+
export interface AnalyticsBatchPayload {
|
|
45
|
+
org_id: string;
|
|
46
|
+
project_id: string;
|
|
47
|
+
session_id: string;
|
|
48
|
+
thread_id: string;
|
|
49
|
+
visitor_id: string;
|
|
50
|
+
is_devmode: boolean;
|
|
51
|
+
events: AnalyticsEvent[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Configuration injected by SDK runtime into window.__AGENTUITY_ANALYTICS__
|
|
55
|
+
*/
|
|
56
|
+
export interface AnalyticsPageConfig {
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
orgId: string;
|
|
59
|
+
projectId: string;
|
|
60
|
+
sessionId: string;
|
|
61
|
+
threadId: string;
|
|
62
|
+
isDevmode: boolean;
|
|
63
|
+
trackClicks?: boolean;
|
|
64
|
+
trackScroll?: boolean;
|
|
65
|
+
trackOutboundLinks?: boolean;
|
|
66
|
+
trackForms?: boolean;
|
|
67
|
+
trackWebVitals?: boolean;
|
|
68
|
+
trackErrors?: boolean;
|
|
69
|
+
trackSPANavigation?: boolean;
|
|
70
|
+
requireConsent?: boolean;
|
|
71
|
+
sampleRate?: number;
|
|
72
|
+
excludePatterns?: string[];
|
|
73
|
+
globalProperties?: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Public analytics client interface
|
|
77
|
+
*/
|
|
78
|
+
export interface AnalyticsClient {
|
|
79
|
+
/**
|
|
80
|
+
* Track a custom event
|
|
81
|
+
*/
|
|
82
|
+
track(eventName: string, properties?: Record<string, unknown>): void;
|
|
83
|
+
/**
|
|
84
|
+
* Identify the current user (sets visitor properties)
|
|
85
|
+
*/
|
|
86
|
+
identify(userId: string, traits?: Record<string, unknown>): void;
|
|
87
|
+
/**
|
|
88
|
+
* Manually track a page view
|
|
89
|
+
*/
|
|
90
|
+
pageview(path?: string): void;
|
|
91
|
+
/**
|
|
92
|
+
* Flush pending events immediately
|
|
93
|
+
*/
|
|
94
|
+
flush(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Opt out of analytics
|
|
97
|
+
*/
|
|
98
|
+
optOut(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Opt back in to analytics
|
|
101
|
+
*/
|
|
102
|
+
optIn(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Check if analytics is currently enabled
|
|
105
|
+
*/
|
|
106
|
+
isEnabled(): boolean;
|
|
107
|
+
}
|
|
108
|
+
declare global {
|
|
109
|
+
interface Window {
|
|
110
|
+
__AGENTUITY_ANALYTICS__?: AnalyticsPageConfig;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get or create the visitor ID from localStorage
|
|
3
|
+
*/
|
|
4
|
+
export declare function getVisitorId(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Check if user has opted out
|
|
7
|
+
*/
|
|
8
|
+
export declare function isOptedOut(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Set opt-out status
|
|
11
|
+
*/
|
|
12
|
+
export declare function setOptOut(optOut: boolean): void;
|
|
13
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/analytics/utils/storage.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAa/C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const VISITOR_ID_KEY = 'agentuity_visitor_id';
|
|
2
|
+
const OPT_OUT_KEY = 'agentuity_analytics_optout';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a random UUID v4
|
|
5
|
+
*/
|
|
6
|
+
function generateUUID() {
|
|
7
|
+
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
8
|
+
return crypto.randomUUID();
|
|
9
|
+
}
|
|
10
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
11
|
+
const r = (Math.random() * 16) | 0;
|
|
12
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
13
|
+
return v.toString(16);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get or create the visitor ID from localStorage
|
|
18
|
+
*/
|
|
19
|
+
export function getVisitorId() {
|
|
20
|
+
if (typeof localStorage === 'undefined') {
|
|
21
|
+
return generateUUID();
|
|
22
|
+
}
|
|
23
|
+
let visitorId = localStorage.getItem(VISITOR_ID_KEY);
|
|
24
|
+
if (!visitorId) {
|
|
25
|
+
visitorId = `vid_${generateUUID()}`;
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem(VISITOR_ID_KEY, visitorId);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// localStorage might be full or disabled
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return visitorId;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if user has opted out
|
|
37
|
+
*/
|
|
38
|
+
export function isOptedOut() {
|
|
39
|
+
if (typeof localStorage === 'undefined') {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return localStorage.getItem(OPT_OUT_KEY) === 'true';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Set opt-out status
|
|
46
|
+
*/
|
|
47
|
+
export function setOptOut(optOut) {
|
|
48
|
+
if (typeof localStorage === 'undefined') {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
if (optOut) {
|
|
53
|
+
localStorage.setItem(OPT_OUT_KEY, 'true');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
localStorage.removeItem(OPT_OUT_KEY);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// localStorage might be full or disabled
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/analytics/utils/storage.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAC9C,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAEjD;;GAEG;AACH,SAAS,YAAY;IACpB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACpE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,YAAY,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,SAAS,GAAG,OAAO,YAAY,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACJ,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACR,yCAAyC;QAC1C,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACzB,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAe;IACxC,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,IAAI,MAAM,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACP,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,yCAAyC;IAC1C,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface UTMParams {
|
|
2
|
+
utm_source?: string;
|
|
3
|
+
utm_medium?: string;
|
|
4
|
+
utm_campaign?: string;
|
|
5
|
+
utm_term?: string;
|
|
6
|
+
utm_content?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extract UTM parameters from the current URL
|
|
10
|
+
*/
|
|
11
|
+
export declare function getUTMParams(): UTMParams;
|
|
12
|
+
//# sourceMappingURL=utm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utm.d.ts","sourceRoot":"","sources":["../../../src/analytics/utils/utm.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAwBxC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract UTM parameters from the current URL
|
|
3
|
+
*/
|
|
4
|
+
export function getUTMParams() {
|
|
5
|
+
if (typeof window === 'undefined') {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
const params = new URLSearchParams(window.location.search);
|
|
9
|
+
const utm = {};
|
|
10
|
+
const source = params.get('utm_source');
|
|
11
|
+
if (source)
|
|
12
|
+
utm.utm_source = source;
|
|
13
|
+
const medium = params.get('utm_medium');
|
|
14
|
+
if (medium)
|
|
15
|
+
utm.utm_medium = medium;
|
|
16
|
+
const campaign = params.get('utm_campaign');
|
|
17
|
+
if (campaign)
|
|
18
|
+
utm.utm_campaign = campaign;
|
|
19
|
+
const term = params.get('utm_term');
|
|
20
|
+
if (term)
|
|
21
|
+
utm.utm_term = term;
|
|
22
|
+
const content = params.get('utm_content');
|
|
23
|
+
if (content)
|
|
24
|
+
utm.utm_content = content;
|
|
25
|
+
return utm;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=utm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utm.js","sourceRoot":"","sources":["../../../src/analytics/utils/utm.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAc,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,MAAM;QAAE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;IAEpC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,MAAM;QAAE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;IAEpC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,QAAQ;QAAE,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,IAAI;QAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,OAAO;QAAE,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAEvC,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export { WebSocketManager, type MessageHandler as WebSocketMessageHandler, type
|
|
|
8
8
|
export { EventStreamManager, type MessageHandler as EventStreamMessageHandler, type EventStreamCallbacks, type EventStreamManagerOptions, type EventStreamManagerState, } from './eventstream-manager';
|
|
9
9
|
export { createClient } from './client/index';
|
|
10
10
|
export type { Client, ClientOptions, RouteEndpoint, WebSocketClient, EventStreamClient, StreamClient, EventHandler, } from './client/types';
|
|
11
|
+
export { getAnalytics, track, initBeacon, trackPageview, createBaseEvent, getVisitorId, isOptedOut, setOptOut, getUTMParams, type AnalyticsClient, type AnalyticsEvent, type AnalyticsEventType, type AnalyticsBatchPayload, type AnalyticsPageConfig, } from './analytics';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,EAChB,KAAK,cAAc,IAAI,uBAAuB,EAC9C,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,EAClB,KAAK,cAAc,IAAI,yBAAyB,EAChD,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACX,MAAM,EACN,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACZ,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,EAChB,KAAK,cAAc,IAAI,uBAAuB,EAC9C,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,EAClB,KAAK,cAAc,IAAI,yBAAyB,EAChD,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,GAC5B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACX,MAAM,EACN,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACN,YAAY,EACZ,KAAK,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACxB,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,4 +7,6 @@ export { WebSocketManager, } from './websocket-manager';
|
|
|
7
7
|
export { EventStreamManager, } from './eventstream-manager';
|
|
8
8
|
// Export client implementation (local to this package)
|
|
9
9
|
export { createClient } from './client/index';
|
|
10
|
+
// Export analytics
|
|
11
|
+
export { getAnalytics, track, initBeacon, trackPageview, createBaseEvent, getVisitorId, isOptedOut, setOptOut, getUTMParams, } from './analytics';
|
|
10
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAgD,MAAM,aAAa,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,GAKhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,GAKlB,MAAM,uBAAuB,CAAC;AAE/B,uDAAuD;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAgD,MAAM,aAAa,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACN,gBAAgB,GAKhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,kBAAkB,GAKlB,MAAM,uBAAuB,CAAC;AAE/B,uDAAuD;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW9C,mBAAmB;AACnB,OAAO,EACN,YAAY,EACZ,KAAK,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,GAMZ,MAAM,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentuity/frontend",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Agentuity employees and contributors",
|
|
6
6
|
"type": "module",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"prepublishOnly": "bun run clean && bun run build"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@agentuity/core": "0.0
|
|
29
|
+
"@agentuity/core": "0.1.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@agentuity/test-utils": "0.0
|
|
32
|
+
"@agentuity/test-utils": "0.1.0",
|
|
33
33
|
"@types/bun": "latest",
|
|
34
34
|
"bun-types": "latest",
|
|
35
35
|
"typescript": "^5.9.0"
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { AnalyticsPageConfig, AnalyticsClient } from './types';
|
|
2
|
+
import { initEventQueue, queueEvent, flushEvents } from './events';
|
|
3
|
+
import { initPageviewTracking, createBaseEvent, trackPageview } from './collectors/pageview';
|
|
4
|
+
import { initSPATracking } from './collectors/spa';
|
|
5
|
+
import { initClickTracking, initOutboundLinkTracking } from './collectors/clicks';
|
|
6
|
+
import { initScrollTracking } from './collectors/scroll';
|
|
7
|
+
import { initErrorTracking } from './collectors/errors';
|
|
8
|
+
import { initVisibilityTracking } from './collectors/visibility';
|
|
9
|
+
import { initFormTracking } from './collectors/forms';
|
|
10
|
+
import { initWebVitalsTracking } from './collectors/webvitals';
|
|
11
|
+
import { isOptedOut, setOptOut } from './utils/storage';
|
|
12
|
+
import { initOfflineSupport, getAndClearOfflineEvents } from './offline';
|
|
13
|
+
|
|
14
|
+
let initialized = false;
|
|
15
|
+
let trackingStarted = false;
|
|
16
|
+
let analyticsEnabled = true;
|
|
17
|
+
let consentRequired = false;
|
|
18
|
+
let consentGiven = false;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if analytics should run
|
|
22
|
+
*/
|
|
23
|
+
function shouldTrack(): boolean {
|
|
24
|
+
if (!analyticsEnabled) return false;
|
|
25
|
+
if (isOptedOut()) return false;
|
|
26
|
+
if (consentRequired && !consentGiven) return false;
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Initialize the analytics beacon
|
|
32
|
+
* Called automatically when the script loads
|
|
33
|
+
*/
|
|
34
|
+
export function initBeacon(): void {
|
|
35
|
+
if (initialized) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const config = window.__AGENTUITY_ANALYTICS__;
|
|
40
|
+
if (!config || !config.enabled) {
|
|
41
|
+
analyticsEnabled = false;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
initialized = true;
|
|
46
|
+
consentRequired = config.requireConsent ?? false;
|
|
47
|
+
|
|
48
|
+
// If consent is required and not given, wait for optIn
|
|
49
|
+
if (consentRequired && !consentGiven) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
startTracking(config);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Start all tracking based on config
|
|
58
|
+
*/
|
|
59
|
+
function startTracking(config: AnalyticsPageConfig): void {
|
|
60
|
+
if (trackingStarted) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
trackingStarted = true;
|
|
64
|
+
|
|
65
|
+
// Initialize event queue
|
|
66
|
+
initEventQueue(config);
|
|
67
|
+
|
|
68
|
+
// Initialize offline support
|
|
69
|
+
initOfflineSupport(async () => {
|
|
70
|
+
// Flush offline events when coming back online
|
|
71
|
+
const offlineEvents = await getAndClearOfflineEvents();
|
|
72
|
+
for (const event of offlineEvents) {
|
|
73
|
+
queueEvent(event);
|
|
74
|
+
}
|
|
75
|
+
flushEvents();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Always track pageviews
|
|
79
|
+
initPageviewTracking();
|
|
80
|
+
|
|
81
|
+
// Initialize visibility tracking (for time on page)
|
|
82
|
+
initVisibilityTracking();
|
|
83
|
+
|
|
84
|
+
// Conditional tracking based on config (all default to true except requireConsent)
|
|
85
|
+
if (config.trackSPANavigation !== false) {
|
|
86
|
+
initSPATracking();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (config.trackClicks !== false) {
|
|
90
|
+
initClickTracking();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (config.trackOutboundLinks !== false) {
|
|
94
|
+
initOutboundLinkTracking();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (config.trackScroll !== false) {
|
|
98
|
+
initScrollTracking();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (config.trackErrors !== false) {
|
|
102
|
+
initErrorTracking();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (config.trackForms !== false) {
|
|
106
|
+
initFormTracking();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (config.trackWebVitals !== false) {
|
|
110
|
+
initWebVitalsTracking();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Create the analytics client API
|
|
116
|
+
*/
|
|
117
|
+
function createClient(): AnalyticsClient {
|
|
118
|
+
return {
|
|
119
|
+
track(eventName: string, properties?: Record<string, unknown>): void {
|
|
120
|
+
if (!shouldTrack()) return;
|
|
121
|
+
|
|
122
|
+
const event = createBaseEvent('custom');
|
|
123
|
+
event.event_name = eventName;
|
|
124
|
+
if (properties) {
|
|
125
|
+
event.event_data = properties;
|
|
126
|
+
}
|
|
127
|
+
queueEvent(event);
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
identify(userId: string, traits?: Record<string, unknown>): void {
|
|
131
|
+
if (!shouldTrack()) return;
|
|
132
|
+
|
|
133
|
+
const event = createBaseEvent('custom');
|
|
134
|
+
event.event_name = 'identify';
|
|
135
|
+
event.event_data = {
|
|
136
|
+
user_id: userId,
|
|
137
|
+
...traits,
|
|
138
|
+
};
|
|
139
|
+
queueEvent(event);
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
pageview(path?: string): void {
|
|
143
|
+
if (!shouldTrack()) return;
|
|
144
|
+
trackPageview(path);
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
async flush(): Promise<void> {
|
|
148
|
+
flushEvents();
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
optOut(): void {
|
|
152
|
+
setOptOut(true);
|
|
153
|
+
analyticsEnabled = false;
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
optIn(): void {
|
|
157
|
+
setOptOut(false);
|
|
158
|
+
analyticsEnabled = true;
|
|
159
|
+
consentGiven = true;
|
|
160
|
+
|
|
161
|
+
// If consent was required and now given, start tracking
|
|
162
|
+
if (consentRequired && !trackingStarted) {
|
|
163
|
+
const config = window.__AGENTUITY_ANALYTICS__;
|
|
164
|
+
if (config) {
|
|
165
|
+
startTracking(config);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
isEnabled(): boolean {
|
|
171
|
+
return shouldTrack();
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Singleton client instance
|
|
177
|
+
let clientInstance: AnalyticsClient | null = null;
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Get the analytics client instance
|
|
181
|
+
*/
|
|
182
|
+
export function getAnalytics(): AnalyticsClient {
|
|
183
|
+
if (!clientInstance) {
|
|
184
|
+
clientInstance = createClient();
|
|
185
|
+
}
|
|
186
|
+
return clientInstance;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Convenience function to track a custom event
|
|
191
|
+
*/
|
|
192
|
+
export function track(eventName: string, properties?: Record<string, unknown>): void {
|
|
193
|
+
getAnalytics().track(eventName, properties);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Auto-initialize when script loads
|
|
197
|
+
if (typeof window !== 'undefined') {
|
|
198
|
+
if (document.readyState === 'loading') {
|
|
199
|
+
document.addEventListener('DOMContentLoaded', initBeacon);
|
|
200
|
+
} else {
|
|
201
|
+
initBeacon();
|
|
202
|
+
}
|
|
203
|
+
}
|