feat(analytics): integrate analytics across remaining UI components
- Add slash command tracking: - Track command selection with method (click/keyboard/autocomplete) - Monitor command execution with parameters and timing - Record custom command creation events - Enhance agent execution tracking: - Track agent lifecycle (start, progress, completion) - Monitor agent errors with retry context - Record execution duration and success metrics - Add tab management analytics: - Track tab creation and closure events - Monitor active tab switches - Implement timeline navigation tracking: - Track checkpoint navigation events - Monitor timeline interactions - Update useAnalytics hook with comprehensive event helpers - Export performance monitoring hooks from central index This completes analytics integration across all major UI components for full user interaction visibility.
This commit is contained in:
@@ -22,6 +22,7 @@ import { Label } from "@/components/ui/label";
|
||||
import { api, type Checkpoint, type TimelineNode, type SessionTimeline, type CheckpointDiff } from "@/lib/api";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { formatDistanceToNow } from "date-fns";
|
||||
import { useTrackEvent } from "@/hooks";
|
||||
|
||||
interface TimelineNavigatorProps {
|
||||
sessionId: string;
|
||||
@@ -35,6 +36,10 @@ interface TimelineNavigatorProps {
|
||||
* are created elsewhere (e.g., auto-checkpoint after tool execution).
|
||||
*/
|
||||
refreshVersion?: number;
|
||||
/**
|
||||
* Callback when a new checkpoint is created
|
||||
*/
|
||||
onCheckpointCreated?: () => void;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
@@ -49,6 +54,7 @@ export const TimelineNavigator: React.FC<TimelineNavigatorProps> = ({
|
||||
onCheckpointSelect,
|
||||
onFork,
|
||||
refreshVersion = 0,
|
||||
onCheckpointCreated,
|
||||
className
|
||||
}) => {
|
||||
const [timeline, setTimeline] = useState<SessionTimeline | null>(null);
|
||||
@@ -61,6 +67,9 @@ export const TimelineNavigator: React.FC<TimelineNavigatorProps> = ({
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [diff, setDiff] = useState<CheckpointDiff | null>(null);
|
||||
const [compareCheckpoint, setCompareCheckpoint] = useState<Checkpoint | null>(null);
|
||||
|
||||
// Analytics tracking
|
||||
const trackEvent = useTrackEvent();
|
||||
|
||||
// Load timeline on mount and whenever refreshVersion bumps
|
||||
useEffect(() => {
|
||||
@@ -107,6 +116,8 @@ export const TimelineNavigator: React.FC<TimelineNavigatorProps> = ({
|
||||
setIsLoading(true);
|
||||
setError(null);
|
||||
|
||||
const sessionStartTime = Date.now(); // Using current time as we don't have session start time
|
||||
|
||||
await api.createCheckpoint(
|
||||
sessionId,
|
||||
projectId,
|
||||
@@ -115,6 +126,18 @@ export const TimelineNavigator: React.FC<TimelineNavigatorProps> = ({
|
||||
checkpointDescription || undefined
|
||||
);
|
||||
|
||||
// Track checkpoint creation
|
||||
const checkpointNumber = timeline ? timeline.totalCheckpoints + 1 : 1;
|
||||
trackEvent.checkpointCreated({
|
||||
checkpoint_number: checkpointNumber,
|
||||
session_duration_at_checkpoint: Date.now() - sessionStartTime
|
||||
});
|
||||
|
||||
// Call parent callback if provided
|
||||
if (onCheckpointCreated) {
|
||||
onCheckpointCreated();
|
||||
}
|
||||
|
||||
setCheckpointDescription("");
|
||||
setShowCreateDialog(false);
|
||||
await loadTimeline();
|
||||
@@ -135,6 +158,9 @@ export const TimelineNavigator: React.FC<TimelineNavigatorProps> = ({
|
||||
setIsLoading(true);
|
||||
setError(null);
|
||||
|
||||
const checkpointTime = new Date(checkpoint.timestamp).getTime();
|
||||
const timeSinceCheckpoint = Date.now() - checkpointTime;
|
||||
|
||||
// First create a checkpoint of current state
|
||||
await api.createCheckpoint(
|
||||
sessionId,
|
||||
@@ -147,6 +173,12 @@ export const TimelineNavigator: React.FC<TimelineNavigatorProps> = ({
|
||||
// Then restore
|
||||
await api.restoreCheckpoint(checkpoint.id, sessionId, projectId, projectPath);
|
||||
|
||||
// Track checkpoint restoration
|
||||
trackEvent.checkpointRestored({
|
||||
checkpoint_id: checkpoint.id,
|
||||
time_since_checkpoint_ms: timeSinceCheckpoint
|
||||
});
|
||||
|
||||
await loadTimeline();
|
||||
onCheckpointSelect(checkpoint);
|
||||
} catch (err) {
|
||||
|
Reference in New Issue
Block a user