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:
Vivek R
2025-07-31 14:22:47 +05:30
parent f08764c6ea
commit db1efc2831
7 changed files with 584 additions and 8 deletions

View File

@@ -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) {