@supernal/interface 1.0.12 → 1.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/cjs/names/Components.js +13 -0
- package/dist/cjs/names/Components.js.map +1 -1
- package/dist/cjs/src/browser.js +6 -2
- package/dist/cjs/src/browser.js.map +1 -1
- package/dist/cjs/src/cli/upgrade.js +305 -0
- package/dist/cjs/src/cli/upgrade.js.map +1 -0
- package/dist/cjs/src/index.js +18 -1
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/tracking/SITrackingProvider.js +126 -0
- package/dist/cjs/src/tracking/SITrackingProvider.js.map +1 -0
- package/dist/cjs/src/tracking/hooks.js +233 -0
- package/dist/cjs/src/tracking/hooks.js.map +1 -0
- package/dist/cjs/src/tracking/index.js +67 -0
- package/dist/cjs/src/tracking/index.js.map +1 -0
- package/dist/cjs/src/tracking/tracker.js +289 -0
- package/dist/cjs/src/tracking/tracker.js.map +1 -0
- package/dist/esm/names/Components.d.ts +12 -0
- package/dist/esm/names/Components.d.ts.map +1 -1
- package/dist/esm/names/Components.js +13 -0
- package/dist/esm/names/Components.js.map +1 -1
- package/dist/esm/names/index.d.ts +12 -0
- package/dist/esm/names/index.d.ts.map +1 -1
- package/dist/esm/src/browser.d.ts +2 -0
- package/dist/esm/src/browser.d.ts.map +1 -1
- package/dist/esm/src/browser.js +2 -0
- package/dist/esm/src/browser.js.map +1 -1
- package/dist/esm/src/cli/upgrade.d.ts +17 -0
- package/dist/esm/src/cli/upgrade.d.ts.map +1 -0
- package/dist/esm/src/cli/upgrade.js +270 -0
- package/dist/esm/src/cli/upgrade.js.map +1 -0
- package/dist/esm/src/index.d.ts +3 -0
- package/dist/esm/src/index.d.ts.map +1 -1
- package/dist/esm/src/index.js +4 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/tracking/SITrackingProvider.d.ts +64 -0
- package/dist/esm/src/tracking/SITrackingProvider.d.ts.map +1 -0
- package/dist/esm/src/tracking/SITrackingProvider.js +82 -0
- package/dist/esm/src/tracking/SITrackingProvider.js.map +1 -0
- package/dist/esm/src/tracking/hooks.d.ts +112 -0
- package/dist/esm/src/tracking/hooks.d.ts.map +1 -0
- package/dist/esm/src/tracking/hooks.js +215 -0
- package/dist/esm/src/tracking/hooks.js.map +1 -0
- package/dist/esm/src/tracking/index.d.ts +48 -0
- package/dist/esm/src/tracking/index.d.ts.map +1 -0
- package/dist/esm/src/tracking/index.js +51 -0
- package/dist/esm/src/tracking/index.js.map +1 -0
- package/dist/esm/src/tracking/tracker.d.ts +121 -0
- package/dist/esm/src/tracking/tracker.d.ts.map +1 -0
- package/dist/esm/src/tracking/tracker.js +284 -0
- package/dist/esm/src/tracking/tracker.js.map +1 -0
- package/package.json +14 -4
- package/src/claude/agents/si-mcp.md +136 -0
- package/src/claude/agents/si-react.md +136 -0
- package/src/claude/agents/si-tools.md +109 -0
- package/src/claude/skills/si-add-provider/SKILL.md +88 -0
- package/src/claude/skills/si-add-tool/SKILL.md +66 -0
- package/src/claude/skills/si-setup-mcp-oss/SKILL.md +115 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SI Tracking React Hooks
|
|
4
|
+
*
|
|
5
|
+
* React hooks for integrating Supernal Interface tracking into components.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
'use client';
|
|
10
|
+
/**
|
|
11
|
+
* SI Tracking React Hooks
|
|
12
|
+
*
|
|
13
|
+
* React hooks for integrating Supernal Interface tracking into components.
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.SITrackerProvider = void 0;
|
|
19
|
+
exports.useTracker = useTracker;
|
|
20
|
+
exports.useSITrackingInit = useSITrackingInit;
|
|
21
|
+
exports.useTrackClick = useTrackClick;
|
|
22
|
+
exports.useTrackView = useTrackView;
|
|
23
|
+
exports.useTrackEngagement = useTrackEngagement;
|
|
24
|
+
exports.useTrackScrollDepth = useTrackScrollDepth;
|
|
25
|
+
exports.useTrackVisibility = useTrackVisibility;
|
|
26
|
+
exports.createComponentTrackingHook = createComponentTrackingHook;
|
|
27
|
+
const react_1 = require("react");
|
|
28
|
+
// Context for providing tracker instance
|
|
29
|
+
const SITrackerContext = (0, react_1.createContext)(null);
|
|
30
|
+
exports.SITrackerProvider = SITrackerContext.Provider;
|
|
31
|
+
/**
|
|
32
|
+
* Get the tracker instance from context
|
|
33
|
+
*/
|
|
34
|
+
function useTracker() {
|
|
35
|
+
return (0, react_1.useContext)(SITrackerContext);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Hook to sync auth state with tracker
|
|
39
|
+
* Place this once in your app layout
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```tsx
|
|
43
|
+
* function App() {
|
|
44
|
+
* const { user } = useAuth();
|
|
45
|
+
* useSITrackingInit(tracker, user?.id);
|
|
46
|
+
* return <div>...</div>;
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
function useSITrackingInit(tracker, userId) {
|
|
51
|
+
(0, react_1.useEffect)(() => {
|
|
52
|
+
if (tracker) {
|
|
53
|
+
tracker.setUserId(userId ?? null);
|
|
54
|
+
}
|
|
55
|
+
}, [tracker, userId]);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Hook for tracking click events
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* const trackClick = useTrackClick(tracker, 'PostCard');
|
|
63
|
+
* <button onClick={() => trackClick('like', postId)}>Like</button>
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
function useTrackClick(tracker, componentId) {
|
|
67
|
+
return (0, react_1.useCallback)((action, targetId, metadata) => {
|
|
68
|
+
if (tracker) {
|
|
69
|
+
tracker.trackClick(componentId, action, targetId, metadata);
|
|
70
|
+
}
|
|
71
|
+
}, [tracker, componentId]);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Hook for tracking component views (impressions)
|
|
75
|
+
* Automatically tracks when component mounts
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```tsx
|
|
79
|
+
* useTrackView(tracker, 'PostCard', post.id);
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function useTrackView(tracker, componentId, targetId, options) {
|
|
83
|
+
const { trackOnMount = true } = options ?? {};
|
|
84
|
+
(0, react_1.useEffect)(() => {
|
|
85
|
+
if (tracker && trackOnMount) {
|
|
86
|
+
tracker.trackView(componentId, targetId);
|
|
87
|
+
}
|
|
88
|
+
}, [tracker, componentId, targetId, trackOnMount]);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Hook for tracking engagement time on a specific target
|
|
92
|
+
* Automatically handles start/end of engagement session
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```tsx
|
|
96
|
+
* const { recordInteraction } = useTrackEngagement(tracker, post.id);
|
|
97
|
+
* <button onClick={recordInteraction}>Interact</button>
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
function useTrackEngagement(tracker, targetId, componentId = 'Content') {
|
|
101
|
+
const engagementStarted = (0, react_1.useRef)(false);
|
|
102
|
+
(0, react_1.useEffect)(() => {
|
|
103
|
+
if (!tracker || !targetId)
|
|
104
|
+
return;
|
|
105
|
+
// Start engagement tracking
|
|
106
|
+
tracker.startEngagement(targetId);
|
|
107
|
+
engagementStarted.current = true;
|
|
108
|
+
return () => {
|
|
109
|
+
// End engagement tracking on unmount
|
|
110
|
+
if (engagementStarted.current && tracker) {
|
|
111
|
+
tracker.endEngagement(targetId, componentId);
|
|
112
|
+
engagementStarted.current = false;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}, [tracker, targetId, componentId]);
|
|
116
|
+
const recordInteraction = (0, react_1.useCallback)(() => {
|
|
117
|
+
if (tracker) {
|
|
118
|
+
tracker.recordEngagementInteraction(targetId);
|
|
119
|
+
}
|
|
120
|
+
}, [tracker, targetId]);
|
|
121
|
+
return { recordInteraction };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Hook for tracking scroll depth in feed
|
|
125
|
+
* Attach to a scrollable container
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```tsx
|
|
129
|
+
* const { handleScroll, resetScroll } = useTrackScrollDepth(tracker);
|
|
130
|
+
* <div onScroll={handleScroll}>...</div>
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
function useTrackScrollDepth(tracker, componentId = 'Feed') {
|
|
134
|
+
const handleScroll = (0, react_1.useCallback)((event) => {
|
|
135
|
+
if (!tracker)
|
|
136
|
+
return;
|
|
137
|
+
const target = event.currentTarget;
|
|
138
|
+
const scrollHeight = target.scrollHeight - target.clientHeight;
|
|
139
|
+
if (scrollHeight <= 0)
|
|
140
|
+
return;
|
|
141
|
+
const scrollPercent = Math.round((target.scrollTop / scrollHeight) * 100);
|
|
142
|
+
tracker.trackScrollDepth(scrollPercent, componentId);
|
|
143
|
+
}, [tracker, componentId]);
|
|
144
|
+
const resetScroll = (0, react_1.useCallback)(() => {
|
|
145
|
+
if (tracker) {
|
|
146
|
+
tracker.resetScrollTracking();
|
|
147
|
+
}
|
|
148
|
+
}, [tracker]);
|
|
149
|
+
// Reset on mount
|
|
150
|
+
(0, react_1.useEffect)(() => {
|
|
151
|
+
if (tracker) {
|
|
152
|
+
tracker.resetScrollTracking();
|
|
153
|
+
}
|
|
154
|
+
}, [tracker]);
|
|
155
|
+
return { handleScroll, resetScroll };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Hook for tracking intersection observer visibility
|
|
159
|
+
* Useful for tracking when components come into view in feed
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```tsx
|
|
163
|
+
* const ref = useTrackVisibility(tracker, 'PostCard', post.id);
|
|
164
|
+
* <div ref={ref}>...</div>
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
function useTrackVisibility(tracker, componentId, targetId, options) {
|
|
168
|
+
const { threshold = 0.5 } = options ?? {};
|
|
169
|
+
const hasTracked = (0, react_1.useRef)(false);
|
|
170
|
+
const observerRef = (0, react_1.useRef)(null);
|
|
171
|
+
const refCallback = (0, react_1.useCallback)((element) => {
|
|
172
|
+
// Cleanup previous observer
|
|
173
|
+
if (observerRef.current) {
|
|
174
|
+
observerRef.current.disconnect();
|
|
175
|
+
observerRef.current = null;
|
|
176
|
+
}
|
|
177
|
+
if (!element || !tracker)
|
|
178
|
+
return;
|
|
179
|
+
// Create new observer
|
|
180
|
+
observerRef.current = new IntersectionObserver((entries) => {
|
|
181
|
+
entries.forEach((entry) => {
|
|
182
|
+
if (entry.isIntersecting && !hasTracked.current) {
|
|
183
|
+
tracker.trackView(componentId, targetId);
|
|
184
|
+
hasTracked.current = true;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}, { threshold });
|
|
188
|
+
observerRef.current.observe(element);
|
|
189
|
+
}, [tracker, componentId, targetId, threshold]);
|
|
190
|
+
// Reset tracking flag when targetId changes
|
|
191
|
+
(0, react_1.useEffect)(() => {
|
|
192
|
+
hasTracked.current = false;
|
|
193
|
+
}, [targetId]);
|
|
194
|
+
// Cleanup on unmount
|
|
195
|
+
(0, react_1.useEffect)(() => {
|
|
196
|
+
return () => {
|
|
197
|
+
if (observerRef.current) {
|
|
198
|
+
observerRef.current.disconnect();
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
}, []);
|
|
202
|
+
return refCallback;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Create a component-specific tracking hook factory
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```typescript
|
|
209
|
+
* // Define your actions
|
|
210
|
+
* type PostActions = 'like' | 'unlike' | 'share' | 'bookmark';
|
|
211
|
+
*
|
|
212
|
+
* // Create hooks for PostCard
|
|
213
|
+
* export function usePostCardTracking(tracker: SITracker<PostActions>, postId: string) {
|
|
214
|
+
* const trackClick = useTrackClick(tracker, 'PostCard');
|
|
215
|
+
* const visibilityRef = useTrackVisibility(tracker, 'PostCard', postId);
|
|
216
|
+
*
|
|
217
|
+
* return {
|
|
218
|
+
* trackLike: () => trackClick('like', postId),
|
|
219
|
+
* trackShare: () => trackClick('share', postId),
|
|
220
|
+
* visibilityRef,
|
|
221
|
+
* };
|
|
222
|
+
* }
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
function createComponentTrackingHook(componentId, factory) {
|
|
226
|
+
return function useComponentTracking(tracker, targetId) {
|
|
227
|
+
const trackClick = useTrackClick(tracker, componentId);
|
|
228
|
+
if (!tracker)
|
|
229
|
+
return null;
|
|
230
|
+
return factory(trackClick, tracker, targetId);
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../../src/tracking/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Supernal Interface Tracking Module
|
|
4
|
+
*
|
|
5
|
+
* Analytics and interaction tracking for SI-enabled applications.
|
|
6
|
+
* Automatically batches events, handles offline scenarios, and provides
|
|
7
|
+
* React hooks for easy integration.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Create a tracker
|
|
14
|
+
* import { createTracker, TrackingProvider, useTrackClick } from '@supernal/interface/tracking';
|
|
15
|
+
*
|
|
16
|
+
* const tracker = createTracker({
|
|
17
|
+
* endpoint: '/api/v1/analytics',
|
|
18
|
+
* batchSize: 10,
|
|
19
|
+
* debug: process.env.NODE_ENV === 'development',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Provide to React tree
|
|
23
|
+
* function App() {
|
|
24
|
+
* const { user } = useAuth();
|
|
25
|
+
* return (
|
|
26
|
+
* <TrackingProvider tracker={tracker} userId={user?.id}>
|
|
27
|
+
* <YourApp />
|
|
28
|
+
* </TrackingProvider>
|
|
29
|
+
* );
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* // Use in components
|
|
33
|
+
* function PostCard({ post }) {
|
|
34
|
+
* const tracker = useTracker();
|
|
35
|
+
* const trackClick = useTrackClick(tracker, 'PostCard');
|
|
36
|
+
* const visibilityRef = useTrackVisibility(tracker, 'PostCard', post.id);
|
|
37
|
+
*
|
|
38
|
+
* return (
|
|
39
|
+
* <div ref={visibilityRef}>
|
|
40
|
+
* <button onClick={() => trackClick('like', post.id)}>Like</button>
|
|
41
|
+
* </div>
|
|
42
|
+
* );
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.withTracking = exports.TrackingProvider = exports.createComponentTrackingHook = exports.useTrackVisibility = exports.useTrackScrollDepth = exports.useTrackEngagement = exports.useTrackView = exports.useTrackClick = exports.useSITrackingInit = exports.useTracker = exports.SITrackerProvider = exports.createTracker = exports.SITracker = void 0;
|
|
48
|
+
// Core tracker
|
|
49
|
+
var tracker_1 = require("./tracker");
|
|
50
|
+
Object.defineProperty(exports, "SITracker", { enumerable: true, get: function () { return tracker_1.SITracker; } });
|
|
51
|
+
Object.defineProperty(exports, "createTracker", { enumerable: true, get: function () { return tracker_1.createTracker; } });
|
|
52
|
+
// React hooks
|
|
53
|
+
var hooks_1 = require("./hooks");
|
|
54
|
+
Object.defineProperty(exports, "SITrackerProvider", { enumerable: true, get: function () { return hooks_1.SITrackerProvider; } });
|
|
55
|
+
Object.defineProperty(exports, "useTracker", { enumerable: true, get: function () { return hooks_1.useTracker; } });
|
|
56
|
+
Object.defineProperty(exports, "useSITrackingInit", { enumerable: true, get: function () { return hooks_1.useSITrackingInit; } });
|
|
57
|
+
Object.defineProperty(exports, "useTrackClick", { enumerable: true, get: function () { return hooks_1.useTrackClick; } });
|
|
58
|
+
Object.defineProperty(exports, "useTrackView", { enumerable: true, get: function () { return hooks_1.useTrackView; } });
|
|
59
|
+
Object.defineProperty(exports, "useTrackEngagement", { enumerable: true, get: function () { return hooks_1.useTrackEngagement; } });
|
|
60
|
+
Object.defineProperty(exports, "useTrackScrollDepth", { enumerable: true, get: function () { return hooks_1.useTrackScrollDepth; } });
|
|
61
|
+
Object.defineProperty(exports, "useTrackVisibility", { enumerable: true, get: function () { return hooks_1.useTrackVisibility; } });
|
|
62
|
+
Object.defineProperty(exports, "createComponentTrackingHook", { enumerable: true, get: function () { return hooks_1.createComponentTrackingHook; } });
|
|
63
|
+
// React provider component
|
|
64
|
+
var SITrackingProvider_1 = require("./SITrackingProvider");
|
|
65
|
+
Object.defineProperty(exports, "TrackingProvider", { enumerable: true, get: function () { return SITrackingProvider_1.TrackingProvider; } });
|
|
66
|
+
Object.defineProperty(exports, "withTracking", { enumerable: true, get: function () { return SITrackingProvider_1.withTracking; } });
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tracking/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;;;AAEH,eAAe;AACf,qCAMmB;AALjB,oGAAA,SAAS,OAAA;AACT,wGAAA,aAAa,OAAA;AAMf,cAAc;AACd,iCAUiB;AATf,0GAAA,iBAAiB,OAAA;AACjB,mGAAA,UAAU,OAAA;AACV,0GAAA,iBAAiB,OAAA;AACjB,sGAAA,aAAa,OAAA;AACb,qGAAA,YAAY,OAAA;AACZ,2GAAA,kBAAkB,OAAA;AAClB,4GAAA,mBAAmB,OAAA;AACnB,2GAAA,kBAAkB,OAAA;AAClB,oHAAA,2BAA2B,OAAA;AAG7B,2BAA2B;AAC3B,2DAAoG;AAA3F,sHAAA,gBAAgB,OAAA;AAAE,kHAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Supernal Interface Interaction Tracking
|
|
4
|
+
*
|
|
5
|
+
* Tracks user interactions with SI components for analytics and AI analysis.
|
|
6
|
+
* Batches events to minimize network requests and handles offline gracefully.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.SITracker = void 0;
|
|
12
|
+
exports.createTracker = createTracker;
|
|
13
|
+
/**
|
|
14
|
+
* SI Tracker - Core tracking class
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const tracker = new SITracker({ endpoint: '/api/analytics' });
|
|
19
|
+
* tracker.track('PostCard', 'view', 'post-123');
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
class SITracker {
|
|
23
|
+
constructor(config = {}) {
|
|
24
|
+
this.queue = [];
|
|
25
|
+
this.flushInterval = null;
|
|
26
|
+
this.engagementSessions = new Map();
|
|
27
|
+
this.scrollState = {
|
|
28
|
+
maxDepth: 0,
|
|
29
|
+
lastReportedDepth: 0,
|
|
30
|
+
lastUpdateTime: Date.now(),
|
|
31
|
+
};
|
|
32
|
+
this.userId = null;
|
|
33
|
+
this.config = {
|
|
34
|
+
endpoint: config.endpoint ?? '/api/v1/analytics',
|
|
35
|
+
batchSize: config.batchSize ?? 10,
|
|
36
|
+
flushIntervalMs: config.flushIntervalMs ?? 5000,
|
|
37
|
+
minEngagementMs: config.minEngagementMs ?? 3000,
|
|
38
|
+
scrollDebounceMs: config.scrollDebounceMs ?? 500,
|
|
39
|
+
debug: config.debug ?? false,
|
|
40
|
+
customFetch: config.customFetch ?? fetch,
|
|
41
|
+
};
|
|
42
|
+
this.isClient = typeof window !== 'undefined';
|
|
43
|
+
this.sessionId = this.generateSessionId();
|
|
44
|
+
if (this.isClient) {
|
|
45
|
+
this.startFlushInterval();
|
|
46
|
+
this.setupBeforeUnload();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Generate a unique session ID */
|
|
50
|
+
generateSessionId() {
|
|
51
|
+
if (!this.isClient)
|
|
52
|
+
return 'server-session';
|
|
53
|
+
// Try to reuse session ID from sessionStorage
|
|
54
|
+
const stored = sessionStorage.getItem('si_session_id');
|
|
55
|
+
if (stored)
|
|
56
|
+
return stored;
|
|
57
|
+
const id = `si_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;
|
|
58
|
+
sessionStorage.setItem('si_session_id', id);
|
|
59
|
+
return id;
|
|
60
|
+
}
|
|
61
|
+
/** Log debug message */
|
|
62
|
+
log(...args) {
|
|
63
|
+
if (this.config.debug) {
|
|
64
|
+
console.log('[SI Tracking]', ...args);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Set the current user ID for tracking */
|
|
68
|
+
setUserId(userId) {
|
|
69
|
+
this.userId = userId;
|
|
70
|
+
}
|
|
71
|
+
/** Get current session ID */
|
|
72
|
+
getSessionId() {
|
|
73
|
+
return this.sessionId;
|
|
74
|
+
}
|
|
75
|
+
/** Get queue length (for testing) */
|
|
76
|
+
getQueueLength() {
|
|
77
|
+
return this.queue.length;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Track an interaction
|
|
81
|
+
*/
|
|
82
|
+
track(componentId, action, targetId, metadata) {
|
|
83
|
+
if (!this.isClient)
|
|
84
|
+
return;
|
|
85
|
+
const interaction = {
|
|
86
|
+
componentId,
|
|
87
|
+
action,
|
|
88
|
+
targetId,
|
|
89
|
+
metadata,
|
|
90
|
+
timestamp: Date.now(),
|
|
91
|
+
sessionId: this.sessionId,
|
|
92
|
+
};
|
|
93
|
+
this.queue.push(interaction);
|
|
94
|
+
this.log('Queued:', action, targetId);
|
|
95
|
+
// Flush if queue is full
|
|
96
|
+
if (this.queue.length >= this.config.batchSize) {
|
|
97
|
+
this.flush();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Alias for track - for click events */
|
|
101
|
+
trackClick(componentId, action, targetId, metadata) {
|
|
102
|
+
this.track(componentId, action, targetId, metadata);
|
|
103
|
+
}
|
|
104
|
+
/** Track view (impression) of a component */
|
|
105
|
+
trackView(componentId, targetId) {
|
|
106
|
+
this.track(componentId, 'view', targetId);
|
|
107
|
+
}
|
|
108
|
+
/** Start engagement tracking for a target */
|
|
109
|
+
startEngagement(targetId) {
|
|
110
|
+
if (!this.isClient)
|
|
111
|
+
return;
|
|
112
|
+
this.engagementSessions.set(targetId, {
|
|
113
|
+
targetId,
|
|
114
|
+
startTime: Date.now(),
|
|
115
|
+
scrollDepth: 0,
|
|
116
|
+
interactions: 0,
|
|
117
|
+
});
|
|
118
|
+
this.log('Engagement started:', targetId);
|
|
119
|
+
}
|
|
120
|
+
/** Record an interaction during engagement */
|
|
121
|
+
recordEngagementInteraction(targetId) {
|
|
122
|
+
const session = this.engagementSessions.get(targetId);
|
|
123
|
+
if (session) {
|
|
124
|
+
session.interactions++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Update scroll depth for engagement session */
|
|
128
|
+
updateEngagementScrollDepth(targetId, depth) {
|
|
129
|
+
const session = this.engagementSessions.get(targetId);
|
|
130
|
+
if (session && depth > session.scrollDepth) {
|
|
131
|
+
session.scrollDepth = depth;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** End engagement tracking and log the session */
|
|
135
|
+
endEngagement(targetId, componentId = 'Content') {
|
|
136
|
+
if (!this.isClient)
|
|
137
|
+
return;
|
|
138
|
+
const session = this.engagementSessions.get(targetId);
|
|
139
|
+
if (!session)
|
|
140
|
+
return;
|
|
141
|
+
const duration = Date.now() - session.startTime;
|
|
142
|
+
// Only track if engagement was meaningful
|
|
143
|
+
if (duration >= this.config.minEngagementMs) {
|
|
144
|
+
this.track(componentId, 'view', targetId, {
|
|
145
|
+
engagementDuration: duration,
|
|
146
|
+
scrollDepth: session.scrollDepth,
|
|
147
|
+
interactions: session.interactions,
|
|
148
|
+
});
|
|
149
|
+
this.log('Engagement ended:', targetId, { duration, ...session });
|
|
150
|
+
}
|
|
151
|
+
this.engagementSessions.delete(targetId);
|
|
152
|
+
}
|
|
153
|
+
/** Track scroll depth in feed */
|
|
154
|
+
trackScrollDepth(depth, componentId = 'Feed') {
|
|
155
|
+
if (!this.isClient)
|
|
156
|
+
return;
|
|
157
|
+
const now = Date.now();
|
|
158
|
+
// Only update if depth increased
|
|
159
|
+
if (depth > this.scrollState.maxDepth) {
|
|
160
|
+
this.scrollState.maxDepth = depth;
|
|
161
|
+
}
|
|
162
|
+
// Debounce reporting
|
|
163
|
+
if (now - this.scrollState.lastUpdateTime < this.config.scrollDebounceMs) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Report at 25%, 50%, 75%, 100% milestones
|
|
167
|
+
const milestones = [25, 50, 75, 100];
|
|
168
|
+
const currentMilestone = milestones.find((m) => this.scrollState.maxDepth >= m && this.scrollState.lastReportedDepth < m);
|
|
169
|
+
if (currentMilestone) {
|
|
170
|
+
this.track(componentId, 'scroll', undefined, {
|
|
171
|
+
depth: currentMilestone,
|
|
172
|
+
maxDepth: this.scrollState.maxDepth,
|
|
173
|
+
});
|
|
174
|
+
this.scrollState.lastReportedDepth = currentMilestone;
|
|
175
|
+
this.log('Scroll milestone:', currentMilestone);
|
|
176
|
+
}
|
|
177
|
+
this.scrollState.lastUpdateTime = now;
|
|
178
|
+
}
|
|
179
|
+
/** Reset scroll tracking (e.g., on page navigation) */
|
|
180
|
+
resetScrollTracking() {
|
|
181
|
+
this.scrollState = {
|
|
182
|
+
maxDepth: 0,
|
|
183
|
+
lastReportedDepth: 0,
|
|
184
|
+
lastUpdateTime: Date.now(),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** Start periodic flush interval */
|
|
188
|
+
startFlushInterval() {
|
|
189
|
+
if (this.flushInterval)
|
|
190
|
+
return;
|
|
191
|
+
this.flushInterval = setInterval(() => {
|
|
192
|
+
this.flush();
|
|
193
|
+
}, this.config.flushIntervalMs);
|
|
194
|
+
}
|
|
195
|
+
/** Stop flush interval */
|
|
196
|
+
stopFlushInterval() {
|
|
197
|
+
if (this.flushInterval) {
|
|
198
|
+
clearInterval(this.flushInterval);
|
|
199
|
+
this.flushInterval = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Setup beforeunload handler to flush remaining events */
|
|
203
|
+
setupBeforeUnload() {
|
|
204
|
+
window.addEventListener('beforeunload', () => {
|
|
205
|
+
// End all engagement sessions
|
|
206
|
+
for (const targetId of this.engagementSessions.keys()) {
|
|
207
|
+
this.endEngagement(targetId);
|
|
208
|
+
}
|
|
209
|
+
// Use sendBeacon for reliable delivery
|
|
210
|
+
this.flushWithBeacon();
|
|
211
|
+
});
|
|
212
|
+
// Also handle visibility change for mobile
|
|
213
|
+
document.addEventListener('visibilitychange', () => {
|
|
214
|
+
if (document.visibilityState === 'hidden') {
|
|
215
|
+
this.flushWithBeacon();
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/** Flush queued events to the API */
|
|
220
|
+
async flush() {
|
|
221
|
+
if (!this.isClient || this.queue.length === 0)
|
|
222
|
+
return;
|
|
223
|
+
const events = [...this.queue];
|
|
224
|
+
this.queue = [];
|
|
225
|
+
this.log('Flushing', events.length, 'events');
|
|
226
|
+
try {
|
|
227
|
+
const response = await this.config.customFetch(this.config.endpoint, {
|
|
228
|
+
method: 'POST',
|
|
229
|
+
headers: {
|
|
230
|
+
'Content-Type': 'application/json',
|
|
231
|
+
},
|
|
232
|
+
body: JSON.stringify({
|
|
233
|
+
events,
|
|
234
|
+
userId: this.userId,
|
|
235
|
+
}),
|
|
236
|
+
});
|
|
237
|
+
if (!response.ok) {
|
|
238
|
+
// Re-queue events on failure (with limit to prevent infinite growth)
|
|
239
|
+
if (this.queue.length < this.config.batchSize * 3) {
|
|
240
|
+
this.queue.unshift(...events);
|
|
241
|
+
}
|
|
242
|
+
this.log('Flush failed, re-queued');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
// Re-queue events on network error
|
|
247
|
+
if (this.queue.length < this.config.batchSize * 3) {
|
|
248
|
+
this.queue.unshift(...events);
|
|
249
|
+
}
|
|
250
|
+
console.warn('[SI Tracking] Failed to flush events:', error);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/** Flush using sendBeacon (for unload events) */
|
|
254
|
+
flushWithBeacon() {
|
|
255
|
+
if (!this.isClient || this.queue.length === 0)
|
|
256
|
+
return;
|
|
257
|
+
const events = [...this.queue];
|
|
258
|
+
this.queue = [];
|
|
259
|
+
try {
|
|
260
|
+
const blob = new Blob([JSON.stringify({ events, userId: this.userId })], {
|
|
261
|
+
type: 'application/json',
|
|
262
|
+
});
|
|
263
|
+
navigator.sendBeacon(this.config.endpoint, blob);
|
|
264
|
+
this.log('Beacon sent', events.length, 'events');
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
console.warn('[SI Tracking] Beacon failed:', error);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/** Cleanup (for testing or unmounting) */
|
|
271
|
+
destroy() {
|
|
272
|
+
this.stopFlushInterval();
|
|
273
|
+
this.flush();
|
|
274
|
+
this.engagementSessions.clear();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
exports.SITracker = SITracker;
|
|
278
|
+
/**
|
|
279
|
+
* Create a singleton tracker instance
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* export const tracker = createTracker({ endpoint: '/api/analytics' });
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
function createTracker(config) {
|
|
287
|
+
return new SITracker(config);
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../../src/tracking/tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,18 @@ export declare const Components: {
|
|
|
16
16
|
readonly ChatToggleButton: "chat-bubble-toggle";
|
|
17
17
|
readonly ChatMessageList: "chat-message-list";
|
|
18
18
|
readonly ChatTypingIndicator: "chat-typing-indicator";
|
|
19
|
+
readonly ChatMoreMenu: "chat-more-menu";
|
|
20
|
+
readonly ChatMoreMenuButton: "chat-more-menu-button";
|
|
21
|
+
readonly ApiKeySection: "api-key-section";
|
|
22
|
+
readonly ApiKeyInput: "api-key-input";
|
|
23
|
+
readonly ApiKeySubmitButton: "api-key-submit-button";
|
|
24
|
+
readonly ApiKeyClearButton: "api-key-clear-button";
|
|
25
|
+
readonly ApiKeyConfigureButton: "api-key-configure-button";
|
|
26
|
+
readonly ApiKeyStatus: "api-key-status";
|
|
27
|
+
readonly ApiKeyMasked: "api-key-masked";
|
|
28
|
+
readonly ApiKeyError: "api-key-error";
|
|
29
|
+
readonly ApiKeyShowToggle: "api-key-show-toggle";
|
|
30
|
+
readonly ApiKeyCancelButton: "api-key-cancel-button";
|
|
19
31
|
readonly OpenMenuButton: "open-main-menu";
|
|
20
32
|
readonly CloseMenuButton: "close-main-menu";
|
|
21
33
|
readonly FeatureToggle: "feature-toggle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Components.d.ts","sourceRoot":"","sources":["../../../names/Components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"Components.d.ts","sourceRoot":"","sources":["../../../names/Components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFb,CAAC;AAEX;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAiB/E;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,UAAU,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC"}
|
|
@@ -17,6 +17,19 @@ export const Components = {
|
|
|
17
17
|
ChatToggleButton: 'chat-bubble-toggle',
|
|
18
18
|
ChatMessageList: 'chat-message-list',
|
|
19
19
|
ChatTypingIndicator: 'chat-typing-indicator',
|
|
20
|
+
ChatMoreMenu: 'chat-more-menu',
|
|
21
|
+
ChatMoreMenuButton: 'chat-more-menu-button',
|
|
22
|
+
// API Key configuration components (BYOK mode)
|
|
23
|
+
ApiKeySection: 'api-key-section',
|
|
24
|
+
ApiKeyInput: 'api-key-input',
|
|
25
|
+
ApiKeySubmitButton: 'api-key-submit-button',
|
|
26
|
+
ApiKeyClearButton: 'api-key-clear-button',
|
|
27
|
+
ApiKeyConfigureButton: 'api-key-configure-button',
|
|
28
|
+
ApiKeyStatus: 'api-key-status',
|
|
29
|
+
ApiKeyMasked: 'api-key-masked',
|
|
30
|
+
ApiKeyError: 'api-key-error',
|
|
31
|
+
ApiKeyShowToggle: 'api-key-show-toggle',
|
|
32
|
+
ApiKeyCancelButton: 'api-key-cancel-button',
|
|
20
33
|
// Demo widget components - buttons
|
|
21
34
|
OpenMenuButton: 'open-main-menu',
|
|
22
35
|
CloseMenuButton: 'close-main-menu',
|