@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.
Files changed (57) hide show
  1. package/dist/cjs/names/Components.js +13 -0
  2. package/dist/cjs/names/Components.js.map +1 -1
  3. package/dist/cjs/src/browser.js +6 -2
  4. package/dist/cjs/src/browser.js.map +1 -1
  5. package/dist/cjs/src/cli/upgrade.js +305 -0
  6. package/dist/cjs/src/cli/upgrade.js.map +1 -0
  7. package/dist/cjs/src/index.js +18 -1
  8. package/dist/cjs/src/index.js.map +1 -1
  9. package/dist/cjs/src/tracking/SITrackingProvider.js +126 -0
  10. package/dist/cjs/src/tracking/SITrackingProvider.js.map +1 -0
  11. package/dist/cjs/src/tracking/hooks.js +233 -0
  12. package/dist/cjs/src/tracking/hooks.js.map +1 -0
  13. package/dist/cjs/src/tracking/index.js +67 -0
  14. package/dist/cjs/src/tracking/index.js.map +1 -0
  15. package/dist/cjs/src/tracking/tracker.js +289 -0
  16. package/dist/cjs/src/tracking/tracker.js.map +1 -0
  17. package/dist/esm/names/Components.d.ts +12 -0
  18. package/dist/esm/names/Components.d.ts.map +1 -1
  19. package/dist/esm/names/Components.js +13 -0
  20. package/dist/esm/names/Components.js.map +1 -1
  21. package/dist/esm/names/index.d.ts +12 -0
  22. package/dist/esm/names/index.d.ts.map +1 -1
  23. package/dist/esm/src/browser.d.ts +2 -0
  24. package/dist/esm/src/browser.d.ts.map +1 -1
  25. package/dist/esm/src/browser.js +2 -0
  26. package/dist/esm/src/browser.js.map +1 -1
  27. package/dist/esm/src/cli/upgrade.d.ts +17 -0
  28. package/dist/esm/src/cli/upgrade.d.ts.map +1 -0
  29. package/dist/esm/src/cli/upgrade.js +270 -0
  30. package/dist/esm/src/cli/upgrade.js.map +1 -0
  31. package/dist/esm/src/index.d.ts +3 -0
  32. package/dist/esm/src/index.d.ts.map +1 -1
  33. package/dist/esm/src/index.js +4 -0
  34. package/dist/esm/src/index.js.map +1 -1
  35. package/dist/esm/src/tracking/SITrackingProvider.d.ts +64 -0
  36. package/dist/esm/src/tracking/SITrackingProvider.d.ts.map +1 -0
  37. package/dist/esm/src/tracking/SITrackingProvider.js +82 -0
  38. package/dist/esm/src/tracking/SITrackingProvider.js.map +1 -0
  39. package/dist/esm/src/tracking/hooks.d.ts +112 -0
  40. package/dist/esm/src/tracking/hooks.d.ts.map +1 -0
  41. package/dist/esm/src/tracking/hooks.js +215 -0
  42. package/dist/esm/src/tracking/hooks.js.map +1 -0
  43. package/dist/esm/src/tracking/index.d.ts +48 -0
  44. package/dist/esm/src/tracking/index.d.ts.map +1 -0
  45. package/dist/esm/src/tracking/index.js +51 -0
  46. package/dist/esm/src/tracking/index.js.map +1 -0
  47. package/dist/esm/src/tracking/tracker.d.ts +121 -0
  48. package/dist/esm/src/tracking/tracker.d.ts.map +1 -0
  49. package/dist/esm/src/tracking/tracker.js +284 -0
  50. package/dist/esm/src/tracking/tracker.js.map +1 -0
  51. package/package.json +14 -4
  52. package/src/claude/agents/si-mcp.md +136 -0
  53. package/src/claude/agents/si-react.md +136 -0
  54. package/src/claude/agents/si-tools.md +109 -0
  55. package/src/claude/skills/si-add-provider/SKILL.md +88 -0
  56. package/src/claude/skills/si-add-tool/SKILL.md +66 -0
  57. 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEb,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"}
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',