aether-react 0.1.0 → 1.0.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/index.d.ts +346 -9
- package/dist/index.js +4135 -1249
- package/dist/index.js.map +1 -1
- package/dist/studio/assets/icon-BfbUHDfA.png +0 -0
- package/dist/studio/assets/index-pfWyyaa5.js +119 -0
- package/dist/studio/assets/index-r14phtju.css +1 -0
- package/dist/studio/index.html +44 -0
- package/package.json +14 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/AetherProvider.tsx","../src/hooks/useMemoryStream.ts","../src/components/MemoryGraphView/index.tsx","../src/components/TimelineView/index.tsx","../src/components/MemoryCard/index.tsx","../src/components/ClusterMap/index.tsx","../src/components/MemoryExplorer/index.tsx","../src/components/AddMemoryForm/index.tsx","../src/components/SearchBar/index.tsx","../src/components/StatsPanel/index.tsx","../src/components/ActorSelector/index.tsx","../src/components/ConnectionStatus/index.tsx","../src/components/Dashboard/index.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';\nimport type { Aether, MemoryEvent, RetrievalOptions } from 'aether-core';\n\ninterface AetherContextValue {\n aether: Aether | null;\n events: MemoryEvent[];\n loading: boolean;\n error: Error | null;\n add: (content: string, context?: Record<string, unknown>) => Promise<MemoryEvent | null>;\n retrieve: (query: string, options?: RetrievalOptions) => Promise<MemoryEvent[]>;\n refresh: () => Promise<void>;\n clearEvents: () => void;\n}\n\nconst AetherContext = createContext<AetherContextValue | null>(null);\n\ninterface AetherProviderProps {\n aether: Aether;\n children: React.ReactNode;\n /** Initial actor to load history for */\n initialActor?: string;\n /** Auto-subscribe to new events */\n autoSubscribe?: boolean;\n}\n\nexport function AetherProvider({\n aether,\n children,\n initialActor,\n autoSubscribe = true,\n}: AetherProviderProps) {\n const [events, setEvents] = useState<MemoryEvent[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Load initial events\n useEffect(() => {\n if (initialActor) {\n setLoading(true);\n aether\n .getHistory(initialActor)\n .then(setEvents)\n .catch(setError)\n .finally(() => setLoading(false));\n }\n }, [aether, initialActor]);\n\n // Subscribe to new events\n useEffect(() => {\n if (!autoSubscribe) return;\n\n const unsubscribe = aether.subscribe((event) => {\n setEvents((prev) => [event, ...prev]);\n });\n\n return unsubscribe;\n }, [aether, autoSubscribe]);\n\n const add = useCallback(\n async (content: string, context?: Record<string, unknown>) => {\n try {\n setLoading(true);\n const event = await aether.add(content, context);\n // Event will be added via subscription if autoSubscribe is true\n if (!autoSubscribe) {\n setEvents((prev) => [event, ...prev]);\n }\n return event;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [aether, autoSubscribe]\n );\n\n const retrieve = useCallback(\n async (query: string, options?: RetrievalOptions) => {\n try {\n setLoading(true);\n const results = await aether.retrieve(query, options);\n return results;\n } catch (err) {\n setError(err as Error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [aether]\n );\n\n const refresh = useCallback(async () => {\n if (initialActor) {\n setLoading(true);\n try {\n const history = await aether.getHistory(initialActor);\n setEvents(history);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }\n }, [aether, initialActor]);\n\n const clearEvents = useCallback(() => {\n setEvents([]);\n }, []);\n\n const value: AetherContextValue = {\n aether,\n events,\n loading,\n error,\n add,\n retrieve,\n refresh,\n clearEvents,\n };\n\n return <AetherContext.Provider value={value}>{children}</AetherContext.Provider>;\n}\n\nexport function useAether(): AetherContextValue {\n const context = useContext(AetherContext);\n if (!context) {\n throw new Error('useAether must be used within an AetherProvider');\n }\n return context;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\ninterface WebSocketMessage {\n type: string;\n data?: unknown;\n}\n\ninterface UseMemoryStreamOptions {\n /** Auto-connect on mount */\n autoConnect?: boolean;\n /** Reconnect on disconnect */\n autoReconnect?: boolean;\n /** Max reconnect attempts */\n maxReconnectAttempts?: number;\n /** Reconnect delay in ms */\n reconnectDelay?: number;\n}\n\ninterface UseMemoryStreamReturn {\n events: MemoryEvent[];\n connected: boolean;\n error: Error | null;\n connect: () => void;\n disconnect: () => void;\n send: (message: WebSocketMessage) => void;\n clearEvents: () => void;\n}\n\nexport function useMemoryStream(\n serverUrl: string,\n options: UseMemoryStreamOptions = {}\n): UseMemoryStreamReturn {\n const {\n autoConnect = true,\n autoReconnect = true,\n maxReconnectAttempts = 5,\n reconnectDelay = 1000,\n } = options;\n\n const [events, setEvents] = useState<MemoryEvent[]>([]);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectAttemptsRef = useRef(0);\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const connect = useCallback(() => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n return;\n }\n\n try {\n const ws = new WebSocket(serverUrl);\n wsRef.current = ws;\n\n ws.onopen = () => {\n setConnected(true);\n setError(null);\n reconnectAttemptsRef.current = 0;\n };\n\n ws.onclose = () => {\n setConnected(false);\n wsRef.current = null;\n\n if (autoReconnect && reconnectAttemptsRef.current < maxReconnectAttempts) {\n reconnectAttemptsRef.current++;\n reconnectTimeoutRef.current = setTimeout(() => {\n connect();\n }, reconnectDelay * reconnectAttemptsRef.current);\n }\n };\n\n ws.onerror = (event) => {\n setError(new Error('WebSocket error'));\n console.error('WebSocket error:', event);\n };\n\n ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as WebSocketMessage;\n\n if (message.type === 'memory:added' && message.data) {\n const memoryEvent = message.data as MemoryEvent;\n setEvents((prev) => [memoryEvent, ...prev]);\n }\n } catch (err) {\n console.error('Failed to parse WebSocket message:', err);\n }\n };\n } catch (err) {\n setError(err as Error);\n }\n }, [serverUrl, autoReconnect, maxReconnectAttempts, reconnectDelay]);\n\n const disconnect = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n\n setConnected(false);\n }, []);\n\n const send = useCallback((message: WebSocketMessage) => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(JSON.stringify(message));\n } else {\n console.warn('WebSocket is not connected');\n }\n }, []);\n\n const clearEvents = useCallback(() => {\n setEvents([]);\n }, []);\n\n // Auto-connect on mount\n useEffect(() => {\n if (autoConnect) {\n connect();\n }\n\n return () => {\n disconnect();\n };\n }, [autoConnect, connect, disconnect]);\n\n return {\n events,\n connected,\n error,\n connect,\n disconnect,\n send,\n clearEvents,\n };\n}\n","import React, { useEffect, useRef, useMemo } from 'react';\nimport * as d3 from 'd3';\nimport type { MemoryEvent } from 'aether-core';\n\nexport interface MemoryGraphViewProps {\n events: MemoryEvent[];\n width?: number;\n height?: number;\n onNodeClick?: (event: MemoryEvent) => void;\n highlightActor?: string;\n showRelations?: boolean;\n className?: string;\n}\n\ninterface GraphNode {\n id: string;\n type: 'event' | 'actor';\n label: string;\n event?: MemoryEvent;\n x?: number;\n y?: number;\n fx?: number | null;\n fy?: number | null;\n}\n\ninterface GraphLink {\n source: string | GraphNode;\n target: string | GraphNode;\n type: 'actor' | 'temporal' | 'relation';\n}\n\nexport function MemoryGraphView({\n events,\n width = 800,\n height = 600,\n onNodeClick,\n highlightActor,\n showRelations = true,\n className = '',\n}: MemoryGraphViewProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n\n const { nodes, links } = useMemo(() => {\n const nodeMap = new Map<string, GraphNode>();\n const linkList: GraphLink[] = [];\n\n // Create actor nodes\n const actors = new Set(events.map((e) => e.actor));\n for (const actor of actors) {\n nodeMap.set(`actor:${actor}`, {\n id: `actor:${actor}`,\n type: 'actor',\n label: actor,\n });\n }\n\n // Create event nodes and links\n const sortedEvents = [...events].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n\n let prevEventByActor = new Map<string, string>();\n\n for (const event of sortedEvents) {\n const eventId = `event:${event.id}`;\n\n nodeMap.set(eventId, {\n id: eventId,\n type: 'event',\n label: event.action,\n event,\n });\n\n // Link to actor\n linkList.push({\n source: `actor:${event.actor}`,\n target: eventId,\n type: 'actor',\n });\n\n // Temporal link to previous event by same actor\n const prevId = prevEventByActor.get(event.actor);\n if (prevId) {\n linkList.push({\n source: prevId,\n target: eventId,\n type: 'temporal',\n });\n }\n prevEventByActor.set(event.actor, eventId);\n\n // Relation links\n if (showRelations && event.relations) {\n for (const relation of event.relations) {\n const targetId = `event:${relation.targetEventId}`;\n if (nodeMap.has(targetId)) {\n linkList.push({\n source: eventId,\n target: targetId,\n type: 'relation',\n });\n }\n }\n }\n }\n\n return {\n nodes: Array.from(nodeMap.values()),\n links: linkList,\n };\n }, [events, showRelations]);\n\n useEffect(() => {\n if (!svgRef.current || nodes.length === 0) return;\n\n const svg = d3.select(svgRef.current);\n svg.selectAll('*').remove();\n\n // Create container for zoom\n const container = svg.append('g');\n\n // Add zoom behavior\n const zoom = d3.zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4])\n .on('zoom', (event) => {\n container.attr('transform', event.transform);\n });\n\n svg.call(zoom);\n\n // Create simulation\n const simulation = d3.forceSimulation(nodes as d3.SimulationNodeDatum[])\n .force(\n 'link',\n d3.forceLink(links)\n .id((d: any) => d.id)\n .distance((d: any) => (d.type === 'actor' ? 100 : 50))\n )\n .force('charge', d3.forceManyBody().strength(-200))\n .force('center', d3.forceCenter(width / 2, height / 2))\n .force('collision', d3.forceCollide().radius(30));\n\n // Draw links\n const link = container\n .append('g')\n .selectAll('line')\n .data(links)\n .join('line')\n .attr('stroke', (d) => {\n switch (d.type) {\n case 'actor':\n return '#94a3b8';\n case 'temporal':\n return '#3b82f6';\n case 'relation':\n return '#f59e0b';\n default:\n return '#d1d5db';\n }\n })\n .attr('stroke-width', (d) => (d.type === 'temporal' ? 2 : 1))\n .attr('stroke-dasharray', (d) => (d.type === 'relation' ? '4,4' : 'none'));\n\n // Draw nodes\n const node = container\n .append('g')\n .selectAll('g')\n .data(nodes)\n .join('g')\n .attr('cursor', 'pointer')\n .call(\n d3.drag<SVGGElement, GraphNode>()\n .on('start', (event, d) => {\n if (!event.active) simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n })\n .on('drag', (event, d) => {\n d.fx = event.x;\n d.fy = event.y;\n })\n .on('end', (event, d) => {\n if (!event.active) simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n }) as any\n );\n\n // Node circles\n node\n .append('circle')\n .attr('r', (d) => (d.type === 'actor' ? 20 : 12))\n .attr('fill', (d) => {\n if (d.type === 'actor') {\n return highlightActor === d.label ? '#3b82f6' : '#6366f1';\n }\n return '#10b981';\n })\n .attr('stroke', '#ffffff')\n .attr('stroke-width', 2);\n\n // Node labels\n node\n .append('text')\n .text((d) => d.label)\n .attr('font-size', (d) => (d.type === 'actor' ? 12 : 10))\n .attr('dx', (d) => (d.type === 'actor' ? 25 : 16))\n .attr('dy', 4)\n .attr('fill', '#374151');\n\n // Click handler\n node.on('click', (event, d) => {\n if (d.event && onNodeClick) {\n onNodeClick(d.event);\n }\n });\n\n // Update positions on tick\n simulation.on('tick', () => {\n link\n .attr('x1', (d: any) => d.source.x)\n .attr('y1', (d: any) => d.source.y)\n .attr('x2', (d: any) => d.target.x)\n .attr('y2', (d: any) => d.target.y);\n\n node.attr('transform', (d: any) => `translate(${d.x},${d.y})`);\n });\n\n return () => {\n simulation.stop();\n };\n }, [nodes, links, width, height, highlightActor, onNodeClick]);\n\n if (events.length === 0) {\n return (\n <div\n className={`aether-graph-empty ${className}`}\n style={{\n width,\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#9ca3af',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n }}\n >\n No events to display\n </div>\n );\n }\n\n return (\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={`aether-graph ${className}`}\n style={{\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n }}\n />\n );\n}\n","import React, { useMemo } from 'react';\nimport type { MemoryEvent } from 'aether-core';\nimport { MemoryCard } from '../MemoryCard/index.js';\n\nexport interface TimelineViewProps {\n events: MemoryEvent[];\n onEventClick?: (event: MemoryEvent) => void;\n selectedEventId?: string;\n showContext?: boolean;\n groupBy?: 'none' | 'day' | 'actor';\n maxHeight?: string | number;\n className?: string;\n}\n\ninterface GroupedEvents {\n label: string;\n events: MemoryEvent[];\n}\n\nexport function TimelineView({\n events,\n onEventClick,\n selectedEventId,\n showContext = false,\n groupBy = 'none',\n maxHeight = '600px',\n className = '',\n}: TimelineViewProps) {\n const sortedEvents = useMemo(() => {\n return [...events].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n }, [events]);\n\n const groupedEvents = useMemo((): GroupedEvents[] => {\n if (groupBy === 'none') {\n return [{ label: '', events: sortedEvents }];\n }\n\n const groups = new Map<string, MemoryEvent[]>();\n\n for (const event of sortedEvents) {\n let key: string;\n\n if (groupBy === 'day') {\n key = new Date(event.timestamp).toLocaleDateString();\n } else {\n key = event.actor;\n }\n\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(event);\n }\n\n return Array.from(groups.entries()).map(([label, events]) => ({\n label,\n events,\n }));\n }, [sortedEvents, groupBy]);\n\n if (events.length === 0) {\n return (\n <div\n className={`aether-timeline-empty ${className}`}\n style={{\n padding: '40px',\n textAlign: 'center',\n color: '#9ca3af',\n }}\n >\n No events to display\n </div>\n );\n }\n\n return (\n <div\n className={`aether-timeline ${className}`}\n style={{\n maxHeight,\n overflowY: 'auto',\n padding: '16px',\n }}\n >\n {groupedEvents.map((group, groupIndex) => (\n <div key={group.label || groupIndex} className=\"aether-timeline-group\">\n {group.label && (\n <div\n style={{\n padding: '8px 0',\n marginBottom: '8px',\n borderBottom: '1px solid #e5e7eb',\n fontWeight: 600,\n color: '#374151',\n position: 'sticky',\n top: 0,\n backgroundColor: '#ffffff',\n zIndex: 1,\n }}\n >\n {group.label}\n </div>\n )}\n\n <div className=\"aether-timeline-events\">\n {group.events.map((event) => (\n <div\n key={event.id}\n style={{\n display: 'flex',\n gap: '12px',\n }}\n >\n {/* Timeline line */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '20px',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor:\n event.id === selectedEventId ? '#3b82f6' : '#d1d5db',\n border: '2px solid #ffffff',\n boxShadow: '0 0 0 2px ' +\n (event.id === selectedEventId ? '#3b82f6' : '#d1d5db'),\n }}\n />\n <div\n style={{\n flex: 1,\n width: '2px',\n backgroundColor: '#e5e7eb',\n minHeight: '20px',\n }}\n />\n </div>\n\n {/* Event card */}\n <div style={{ flex: 1, paddingBottom: '8px' }}>\n <MemoryCard\n event={event}\n onClick={onEventClick}\n selected={event.id === selectedEventId}\n showContext={showContext}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\nexport interface MemoryCardProps {\n event: MemoryEvent;\n onClick?: (event: MemoryEvent) => void;\n selected?: boolean;\n showContext?: boolean;\n className?: string;\n}\n\nexport function MemoryCard({\n event,\n onClick,\n selected = false,\n showContext = false,\n className = '',\n}: MemoryCardProps) {\n const formatTimestamp = (timestamp: string) => {\n const date = new Date(timestamp);\n return date.toLocaleString();\n };\n\n const handleClick = () => {\n onClick?.(event);\n };\n\n return (\n <div\n className={`aether-memory-card ${selected ? 'selected' : ''} ${className}`}\n onClick={handleClick}\n style={{\n padding: '12px',\n borderRadius: '8px',\n border: `1px solid ${selected ? '#3b82f6' : '#e5e7eb'}`,\n backgroundColor: selected ? '#eff6ff' : '#ffffff',\n cursor: onClick ? 'pointer' : 'default',\n marginBottom: '8px',\n transition: 'all 0.2s ease',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '8px',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span\n style={{\n fontWeight: 600,\n color: '#1f2937',\n }}\n >\n {event.actor}\n </span>\n <span\n style={{\n fontSize: '12px',\n padding: '2px 6px',\n borderRadius: '4px',\n backgroundColor: '#f3f4f6',\n color: '#6b7280',\n }}\n >\n {event.action}\n </span>\n </div>\n <span\n style={{\n fontSize: '12px',\n color: '#9ca3af',\n }}\n >\n {formatTimestamp(event.timestamp)}\n </span>\n </div>\n\n {/* Content */}\n <p\n style={{\n margin: 0,\n color: '#374151',\n lineHeight: 1.5,\n }}\n >\n {event.content}\n </p>\n\n {/* Context */}\n {showContext && Object.keys(event.context).length > 0 && (\n <div\n style={{\n marginTop: '8px',\n padding: '8px',\n borderRadius: '4px',\n backgroundColor: '#f9fafb',\n fontSize: '12px',\n }}\n >\n <span style={{ color: '#6b7280', fontWeight: 500 }}>Context:</span>\n <pre\n style={{\n margin: '4px 0 0 0',\n fontSize: '11px',\n color: '#4b5563',\n overflow: 'auto',\n }}\n >\n {JSON.stringify(event.context, null, 2)}\n </pre>\n </div>\n )}\n\n {/* ID */}\n <div\n style={{\n marginTop: '8px',\n fontSize: '10px',\n color: '#9ca3af',\n fontFamily: 'monospace',\n }}\n >\n {event.id.slice(0, 12)}...\n </div>\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\nexport interface ClusterMapProps {\n events: MemoryEvent[];\n width?: number;\n height?: number;\n onEventClick?: (event: MemoryEvent) => void;\n colorBy?: 'actor' | 'action';\n className?: string;\n}\n\n/**\n * ClusterMap visualizes events in a 2D space based on their embeddings.\n * Note: Full t-SNE/UMAP implementation requires additional dependencies.\n * This is a simplified version that uses a basic layout.\n */\nexport function ClusterMap({\n events,\n width = 600,\n height = 400,\n onEventClick,\n colorBy = 'actor',\n className = '',\n}: ClusterMapProps) {\n // Color palette for actors/actions\n const colorPalette = [\n '#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6',\n '#ec4899', '#06b6d4', '#84cc16', '#f97316', '#6366f1',\n ];\n\n const { points, colorMap } = useMemo(() => {\n const colorKey = colorBy === 'actor' ? 'actor' : 'action';\n const uniqueValues = [...new Set(events.map((e) => e[colorKey]))];\n const colorMap = new Map<string, string>();\n\n uniqueValues.forEach((value, i) => {\n colorMap.set(value, colorPalette[i % colorPalette.length]!);\n });\n\n // Simple layout: spread events in a grid-like pattern\n // In a full implementation, this would use t-SNE or UMAP on embeddings\n const cols = Math.ceil(Math.sqrt(events.length));\n const padding = 60;\n const cellWidth = (width - padding * 2) / cols;\n const cellHeight = (height - padding * 2) / cols;\n\n const points = events.map((event, i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n\n // Add some jitter for visual interest\n const jitterX = (Math.random() - 0.5) * cellWidth * 0.5;\n const jitterY = (Math.random() - 0.5) * cellHeight * 0.5;\n\n return {\n event,\n x: padding + col * cellWidth + cellWidth / 2 + jitterX,\n y: padding + row * cellHeight + cellHeight / 2 + jitterY,\n color: colorMap.get(event[colorKey]) ?? '#9ca3af',\n };\n });\n\n return { points, colorMap };\n }, [events, colorBy, width, height]);\n\n if (events.length === 0) {\n return (\n <div\n className={`aether-cluster-empty ${className}`}\n style={{\n width,\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#9ca3af',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n }}\n >\n No events to display\n </div>\n );\n }\n\n return (\n <div\n className={`aether-cluster ${className}`}\n style={{\n width,\n height,\n position: 'relative',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n overflow: 'hidden',\n }}\n >\n {/* Points */}\n <svg width={width} height={height}>\n {points.map((point, i) => (\n <g key={point.event.id}>\n <circle\n cx={point.x}\n cy={point.y}\n r={8}\n fill={point.color}\n stroke=\"#ffffff\"\n strokeWidth={2}\n style={{ cursor: 'pointer' }}\n onClick={() => onEventClick?.(point.event)}\n >\n <title>{point.event.content}</title>\n </circle>\n </g>\n ))}\n </svg>\n\n {/* Legend */}\n <div\n style={{\n position: 'absolute',\n bottom: 10,\n left: 10,\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n padding: '8px',\n borderRadius: '4px',\n fontSize: '12px',\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>\n {colorBy === 'actor' ? 'Actors' : 'Actions'}\n </div>\n {Array.from(colorMap.entries()).slice(0, 5).map(([label, color]) => (\n <div\n key={label}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n marginBottom: '2px',\n }}\n >\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: color,\n }}\n />\n <span>{label}</span>\n </div>\n ))}\n {colorMap.size > 5 && (\n <div style={{ color: '#9ca3af' }}>+{colorMap.size - 5} more</div>\n )}\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport type { MemoryEvent } from 'aether-core';\nimport { TimelineView } from '../TimelineView/index.js';\nimport { MemoryGraphView } from '../MemoryGraphView/index.js';\nimport { ClusterMap } from '../ClusterMap/index.js';\nimport { MemoryCard } from '../MemoryCard/index.js';\n\nexport interface MemoryExplorerProps {\n events: MemoryEvent[];\n onEventClick?: (event: MemoryEvent) => void;\n defaultView?: 'timeline' | 'graph' | 'cluster';\n showViewSwitcher?: boolean;\n className?: string;\n}\n\ntype ViewType = 'timeline' | 'graph' | 'cluster';\n\nexport function MemoryExplorer({\n events,\n onEventClick,\n defaultView = 'timeline',\n showViewSwitcher = true,\n className = '',\n}: MemoryExplorerProps) {\n const [currentView, setCurrentView] = useState<ViewType>(defaultView);\n const [selectedEvent, setSelectedEvent] = useState<MemoryEvent | null>(null);\n\n const handleEventClick = (event: MemoryEvent) => {\n setSelectedEvent(event);\n onEventClick?.(event);\n };\n\n const renderView = () => {\n switch (currentView) {\n case 'timeline':\n return (\n <TimelineView\n events={events}\n onEventClick={handleEventClick}\n selectedEventId={selectedEvent?.id}\n showContext\n maxHeight=\"500px\"\n />\n );\n\n case 'graph':\n return (\n <MemoryGraphView\n events={events}\n onNodeClick={handleEventClick}\n width={700}\n height={500}\n />\n );\n\n case 'cluster':\n return (\n <ClusterMap\n events={events}\n onEventClick={handleEventClick}\n width={700}\n height={500}\n colorBy=\"actor\"\n />\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div\n className={`aether-explorer ${className}`}\n style={{\n display: 'flex',\n gap: '16px',\n padding: '16px',\n }}\n >\n {/* Main view */}\n <div style={{ flex: 1 }}>\n {/* View switcher */}\n {showViewSwitcher && (\n <div\n style={{\n display: 'flex',\n gap: '8px',\n marginBottom: '16px',\n }}\n >\n {(['timeline', 'graph', 'cluster'] as ViewType[]).map((view) => (\n <button\n key={view}\n onClick={() => setCurrentView(view)}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: currentView === view ? '#3b82f6' : '#e5e7eb',\n color: currentView === view ? '#ffffff' : '#374151',\n cursor: 'pointer',\n fontWeight: 500,\n textTransform: 'capitalize',\n transition: 'all 0.2s ease',\n }}\n >\n {view}\n </button>\n ))}\n </div>\n )}\n\n {/* View content */}\n <div\n style={{\n backgroundColor: '#ffffff',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n overflow: 'hidden',\n }}\n >\n {renderView()}\n </div>\n\n {/* Stats */}\n <div\n style={{\n marginTop: '12px',\n padding: '8px 12px',\n backgroundColor: '#f9fafb',\n borderRadius: '6px',\n fontSize: '12px',\n color: '#6b7280',\n }}\n >\n {events.length} events • {new Set(events.map((e) => e.actor)).size} actors\n </div>\n </div>\n\n {/* Selected event detail */}\n {selectedEvent && (\n <div\n style={{\n width: '300px',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n fontWeight: 600,\n marginBottom: '8px',\n color: '#374151',\n }}\n >\n Selected Event\n </div>\n <MemoryCard event={selectedEvent} showContext />\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\n\nexport interface AddMemoryFormProps {\n onAdd: (content: string, actor: string, context?: Record<string, unknown>) => Promise<void>;\n loading?: boolean;\n defaultActor?: string;\n placeholder?: string;\n className?: string;\n}\n\nexport function AddMemoryForm({\n onAdd,\n loading = false,\n defaultActor = 'user',\n placeholder = 'What happened? (e.g., \"User clicked the buy button\")',\n className = '',\n}: AddMemoryFormProps) {\n const [content, setContent] = useState('');\n const [actor, setActor] = useState(defaultActor);\n const [contextJson, setContextJson] = useState('');\n const [showAdvanced, setShowAdvanced] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!content.trim()) {\n setError('Content is required');\n return;\n }\n\n let context: Record<string, unknown> | undefined;\n if (contextJson.trim()) {\n try {\n context = JSON.parse(contextJson);\n } catch {\n setError('Invalid JSON in context field');\n return;\n }\n }\n\n try {\n await onAdd(content.trim(), actor.trim() || 'user', context);\n setContent('');\n setContextJson('');\n } catch (err) {\n setError(String(err));\n }\n },\n [content, actor, contextJson, onAdd]\n );\n\n return (\n <form\n onSubmit={handleSubmit}\n className={`aether-add-memory-form ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n backgroundColor: '#ffffff',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n }}\n >\n {/* Main input */}\n <div style={{ display: 'flex', gap: '8px' }}>\n <input\n type=\"text\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={placeholder}\n disabled={loading}\n style={{\n flex: 1,\n padding: '10px 14px',\n fontSize: '14px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n outline: 'none',\n transition: 'border-color 0.2s',\n }}\n onFocus={(e) => (e.target.style.borderColor = '#3b82f6')}\n onBlur={(e) => (e.target.style.borderColor = '#d1d5db')}\n />\n <button\n type=\"submit\"\n disabled={loading || !content.trim()}\n style={{\n padding: '10px 20px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: loading || !content.trim() ? '#9ca3af' : '#3b82f6',\n border: 'none',\n borderRadius: '6px',\n cursor: loading || !content.trim() ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {loading ? 'Adding...' : 'Add Memory'}\n </button>\n </div>\n\n {/* Toggle advanced options */}\n <button\n type=\"button\"\n onClick={() => setShowAdvanced(!showAdvanced)}\n style={{\n alignSelf: 'flex-start',\n padding: '4px 8px',\n fontSize: '12px',\n color: '#6b7280',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'underline',\n }}\n >\n {showAdvanced ? 'Hide options' : 'Show options'}\n </button>\n\n {/* Advanced options */}\n {showAdvanced && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <label style={{ fontSize: '13px', color: '#6b7280', minWidth: '50px' }}>\n Actor:\n </label>\n <input\n type=\"text\"\n value={actor}\n onChange={(e) => setActor(e.target.value)}\n placeholder=\"user\"\n style={{\n flex: 1,\n padding: '8px 12px',\n fontSize: '13px',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n outline: 'none',\n }}\n />\n </div>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'flex-start' }}>\n <label style={{ fontSize: '13px', color: '#6b7280', minWidth: '50px', paddingTop: '8px' }}>\n Context:\n </label>\n <textarea\n value={contextJson}\n onChange={(e) => setContextJson(e.target.value)}\n placeholder='{\"key\": \"value\"}'\n rows={2}\n style={{\n flex: 1,\n padding: '8px 12px',\n fontSize: '13px',\n fontFamily: 'monospace',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n outline: 'none',\n resize: 'vertical',\n }}\n />\n </div>\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <div\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n color: '#dc2626',\n backgroundColor: '#fef2f2',\n borderRadius: '4px',\n }}\n >\n {error}\n </div>\n )}\n </form>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport type { RetrievalType } from 'aether-core';\n\nexport interface SearchBarProps {\n onSearch: (query: string, options: SearchOptions) => Promise<void>;\n loading?: boolean;\n placeholder?: string;\n className?: string;\n}\n\nexport interface SearchOptions {\n retrievalType: RetrievalType;\n limit: number;\n actor?: string;\n}\n\nconst RETRIEVAL_TYPES: { value: RetrievalType; label: string; description: string }[] = [\n { value: 'hybrid', label: 'Hybrid', description: 'Combines all strategies' },\n { value: 'semantic', label: 'Semantic', description: 'Vector similarity search' },\n { value: 'temporal', label: 'Temporal', description: 'Recent events first' },\n { value: 'relational', label: 'Relational', description: 'Entity-based search' },\n];\n\nexport function SearchBar({\n onSearch,\n loading = false,\n placeholder = 'Search memories...',\n className = '',\n}: SearchBarProps) {\n const [query, setQuery] = useState('');\n const [retrievalType, setRetrievalType] = useState<RetrievalType>('hybrid');\n const [limit, setLimit] = useState(10);\n const [actor, setActor] = useState('');\n const [showFilters, setShowFilters] = useState(false);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!query.trim()) return;\n\n await onSearch(query.trim(), {\n retrievalType,\n limit,\n actor: actor.trim() || undefined,\n });\n },\n [query, retrievalType, limit, actor, onSearch]\n );\n\n return (\n <form\n onSubmit={handleSubmit}\n className={`aether-search-bar ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n {/* Search input row */}\n <div style={{ display: 'flex', gap: '8px' }}>\n <div style={{ flex: 1, position: 'relative' }}>\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n disabled={loading}\n style={{\n width: '100%',\n padding: '12px 16px',\n paddingLeft: '40px',\n fontSize: '14px',\n border: '1px solid #d1d5db',\n borderRadius: '8px',\n outline: 'none',\n transition: 'border-color 0.2s, box-shadow 0.2s',\n }}\n onFocus={(e) => {\n e.target.style.borderColor = '#3b82f6';\n e.target.style.boxShadow = '0 0 0 3px rgba(59, 130, 246, 0.1)';\n }}\n onBlur={(e) => {\n e.target.style.borderColor = '#d1d5db';\n e.target.style.boxShadow = 'none';\n }}\n />\n {/* Search icon */}\n <svg\n style={{\n position: 'absolute',\n left: '12px',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '20px',\n height: '20px',\n color: '#9ca3af',\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setShowFilters(!showFilters)}\n style={{\n padding: '12px',\n backgroundColor: showFilters ? '#eff6ff' : '#f9fafb',\n border: `1px solid ${showFilters ? '#3b82f6' : '#d1d5db'}`,\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n title=\"Toggle filters\"\n >\n <svg\n style={{ width: '20px', height: '20px', color: showFilters ? '#3b82f6' : '#6b7280' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n </button>\n\n <button\n type=\"submit\"\n disabled={loading || !query.trim()}\n style={{\n padding: '12px 24px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: loading || !query.trim() ? '#9ca3af' : '#3b82f6',\n border: 'none',\n borderRadius: '8px',\n cursor: loading || !query.trim() ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {loading ? 'Searching...' : 'Search'}\n </button>\n </div>\n\n {/* Filters panel */}\n {showFilters && (\n <div\n style={{\n display: 'flex',\n gap: '16px',\n padding: '16px',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n flexWrap: 'wrap',\n }}\n >\n {/* Retrieval type */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '12px', fontWeight: 500, color: '#374151' }}>\n Retrieval Type\n </label>\n <select\n value={retrievalType}\n onChange={(e) => setRetrievalType(e.target.value as RetrievalType)}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n }}\n >\n {RETRIEVAL_TYPES.map((type) => (\n <option key={type.value} value={type.value}>\n {type.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Limit */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '12px', fontWeight: 500, color: '#374151' }}>\n Max Results\n </label>\n <select\n value={limit}\n onChange={(e) => setLimit(parseInt(e.target.value, 10))}\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n }}\n >\n {[5, 10, 20, 50, 100].map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </div>\n\n {/* Actor filter */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '12px', fontWeight: 500, color: '#374151' }}>\n Actor (optional)\n </label>\n <input\n type=\"text\"\n value={actor}\n onChange={(e) => setActor(e.target.value)}\n placeholder=\"Filter by actor\"\n style={{\n padding: '8px 12px',\n fontSize: '13px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n width: '150px',\n }}\n />\n </div>\n </div>\n )}\n </form>\n );\n}\n","import React from 'react';\nimport type { MemoryStats } from 'aether-core';\n\nexport interface StatsPanelProps {\n stats: MemoryStats | null;\n loading?: boolean;\n className?: string;\n}\n\ninterface StatItemProps {\n label: string;\n value: string | number;\n icon: React.ReactNode;\n color: string;\n}\n\nfunction StatItem({ label, value, icon, color }: StatItemProps) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '16px',\n backgroundColor: '#ffffff',\n borderRadius: '8px',\n border: '1px solid #e5e7eb',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '40px',\n height: '40px',\n borderRadius: '8px',\n backgroundColor: color,\n }}\n >\n {icon}\n </div>\n <div>\n <div style={{ fontSize: '24px', fontWeight: 600, color: '#1f2937' }}>{value}</div>\n <div style={{ fontSize: '13px', color: '#6b7280' }}>{label}</div>\n </div>\n </div>\n );\n}\n\nexport function StatsPanel({ stats, loading = false, className = '' }: StatsPanelProps) {\n if (loading) {\n return (\n <div\n className={`aether-stats-panel ${className}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: '12px',\n }}\n >\n {[1, 2, 3, 4].map((i) => (\n <div\n key={i}\n style={{\n height: '88px',\n backgroundColor: '#f3f4f6',\n borderRadius: '8px',\n animation: 'pulse 2s infinite',\n }}\n />\n ))}\n </div>\n );\n }\n\n if (!stats) {\n return (\n <div\n className={`aether-stats-panel ${className}`}\n style={{\n padding: '24px',\n textAlign: 'center',\n color: '#9ca3af',\n backgroundColor: '#f9fafb',\n borderRadius: '8px',\n }}\n >\n No statistics available\n </div>\n );\n }\n\n const formatDate = (dateStr?: string) => {\n if (!dateStr) return 'N/A';\n return new Date(dateStr).toLocaleDateString();\n };\n\n return (\n <div\n className={`aether-stats-panel ${className}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: '12px',\n }}\n >\n <StatItem\n label=\"Total Memories\"\n value={stats.totalEvents.toLocaleString()}\n color=\"#dbeafe\"\n icon={\n <svg\n style={{ width: '20px', height: '20px', color: '#3b82f6' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\"\n />\n </svg>\n }\n />\n\n <StatItem\n label=\"Unique Actors\"\n value={stats.uniqueActors}\n color=\"#dcfce7\"\n icon={\n <svg\n style={{ width: '20px', height: '20px', color: '#22c55e' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z\"\n />\n </svg>\n }\n />\n\n <StatItem\n label=\"First Event\"\n value={formatDate(stats.oldestEvent)}\n color=\"#fef3c7\"\n icon={\n <svg\n style={{ width: '20px', height: '20px', color: '#f59e0b' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n }\n />\n\n <StatItem\n label=\"Latest Event\"\n value={formatDate(stats.newestEvent)}\n color=\"#fce7f3\"\n icon={\n <svg\n style={{ width: '20px', height: '20px', color: '#ec4899' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n }\n />\n </div>\n );\n}\n","import React from 'react';\n\nexport interface ActorSelectorProps {\n actors: string[];\n selectedActor: string | null;\n onSelect: (actor: string | null) => void;\n loading?: boolean;\n className?: string;\n}\n\nexport function ActorSelector({\n actors,\n selectedActor,\n onSelect,\n loading = false,\n className = '',\n}: ActorSelectorProps) {\n if (loading) {\n return (\n <div\n className={`aether-actor-selector ${className}`}\n style={{\n display: 'flex',\n gap: '8px',\n flexWrap: 'wrap',\n }}\n >\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n style={{\n width: '80px',\n height: '32px',\n backgroundColor: '#f3f4f6',\n borderRadius: '9999px',\n animation: 'pulse 2s infinite',\n }}\n />\n ))}\n </div>\n );\n }\n\n if (actors.length === 0) {\n return (\n <div\n className={`aether-actor-selector ${className}`}\n style={{\n padding: '12px',\n fontSize: '13px',\n color: '#9ca3af',\n textAlign: 'center',\n }}\n >\n No actors found\n </div>\n );\n }\n\n return (\n <div\n className={`aether-actor-selector ${className}`}\n style={{\n display: 'flex',\n gap: '8px',\n flexWrap: 'wrap',\n alignItems: 'center',\n }}\n >\n <span style={{ fontSize: '13px', color: '#6b7280', marginRight: '4px' }}>\n Filter by actor:\n </span>\n\n {/* All actors button */}\n <button\n onClick={() => onSelect(null)}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n fontWeight: 500,\n color: selectedActor === null ? '#ffffff' : '#374151',\n backgroundColor: selectedActor === null ? '#3b82f6' : '#f3f4f6',\n border: 'none',\n borderRadius: '9999px',\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n >\n All\n </button>\n\n {/* Actor buttons */}\n {actors.map((actor) => (\n <button\n key={actor}\n onClick={() => onSelect(actor)}\n style={{\n padding: '6px 14px',\n fontSize: '13px',\n fontWeight: 500,\n color: selectedActor === actor ? '#ffffff' : '#374151',\n backgroundColor: selectedActor === actor ? '#3b82f6' : '#f3f4f6',\n border: 'none',\n borderRadius: '9999px',\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n >\n {actor}\n </button>\n ))}\n </div>\n );\n}\n","import React from 'react';\n\nexport interface ConnectionStatusProps {\n connected: boolean;\n error?: Error | null;\n onReconnect?: () => void;\n className?: string;\n}\n\nexport function ConnectionStatus({\n connected,\n error,\n onReconnect,\n className = '',\n}: ConnectionStatusProps) {\n return (\n <div\n className={`aether-connection-status ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 12px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n backgroundColor: connected ? '#dcfce7' : error ? '#fef2f2' : '#fef3c7',\n color: connected ? '#166534' : error ? '#991b1b' : '#92400e',\n }}\n >\n {/* Status indicator dot */}\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: connected ? '#22c55e' : error ? '#ef4444' : '#f59e0b',\n animation: connected ? 'none' : 'pulse 2s infinite',\n }}\n />\n\n {/* Status text */}\n <span>\n {connected ? 'Connected' : error ? 'Connection Error' : 'Connecting...'}\n </span>\n\n {/* Reconnect button */}\n {!connected && onReconnect && (\n <button\n onClick={onReconnect}\n style={{\n marginLeft: '4px',\n padding: '2px 8px',\n fontSize: '11px',\n color: '#374151',\n backgroundColor: '#ffffff',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Retry\n </button>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { Aether, MemoryEvent, MemoryStats, RetrievalType } from 'aether-core';\nimport { AddMemoryForm } from '../AddMemoryForm/index.js';\nimport { SearchBar, type SearchOptions } from '../SearchBar/index.js';\nimport { StatsPanel } from '../StatsPanel/index.js';\nimport { ActorSelector } from '../ActorSelector/index.js';\nimport { TimelineView } from '../TimelineView/index.js';\nimport { MemoryGraphView } from '../MemoryGraphView/index.js';\nimport { MemoryCard } from '../MemoryCard/index.js';\n\nexport interface DashboardProps {\n aether: Aether;\n title?: string;\n className?: string;\n}\n\ntype ViewMode = 'timeline' | 'graph';\n\nexport function Dashboard({ aether, title = 'Aether Memory Explorer', className = '' }: DashboardProps) {\n const [events, setEvents] = useState<MemoryEvent[]>([]);\n const [searchResults, setSearchResults] = useState<MemoryEvent[] | null>(null);\n const [stats, setStats] = useState<MemoryStats | null>(null);\n const [actors, setActors] = useState<string[]>([]);\n const [selectedActor, setSelectedActor] = useState<string | null>(null);\n const [selectedEvent, setSelectedEvent] = useState<MemoryEvent | null>(null);\n const [viewMode, setViewMode] = useState<ViewMode>('timeline');\n const [loading, setLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n // Load initial data\n useEffect(() => {\n const loadData = async () => {\n setLoading(true);\n try {\n const [statsData] = await Promise.all([\n aether.stats(),\n ]);\n setStats(statsData);\n\n // Get actors from stats or try to get history for common actor\n // In a real app, you might have a dedicated API for this\n const actorsList: string[] = [];\n setActors(actorsList);\n } catch (err) {\n console.error('Failed to load data:', err);\n } finally {\n setLoading(false);\n }\n };\n\n loadData();\n }, [aether]);\n\n // Subscribe to new events\n useEffect(() => {\n const unsubscribe = aether.subscribe((event) => {\n setEvents((prev) => [event, ...prev]);\n\n // Update actors list if new actor\n setActors((prev) => {\n if (!prev.includes(event.actor)) {\n return [...prev, event.actor];\n }\n return prev;\n });\n\n // Update stats\n setStats((prev) => prev ? {\n ...prev,\n totalEvents: prev.totalEvents + 1,\n newestEvent: event.timestamp,\n } : null);\n });\n\n return unsubscribe;\n }, [aether]);\n\n // Handle adding a memory\n const handleAddMemory = useCallback(\n async (content: string, actor: string, context?: Record<string, unknown>) => {\n await aether.add({ content, actor, context });\n },\n [aether]\n );\n\n // Handle search\n const handleSearch = useCallback(\n async (query: string, options: SearchOptions) => {\n setLoading(true);\n setSearchQuery(query);\n try {\n const results = await aether.retrieve(query, {\n retrievalType: options.retrievalType,\n limit: options.limit,\n actor: options.actor,\n });\n setSearchResults(results);\n } catch (err) {\n console.error('Search failed:', err);\n } finally {\n setLoading(false);\n }\n },\n [aether]\n );\n\n // Handle actor filter change\n const handleActorChange = useCallback(\n async (actor: string | null) => {\n setSelectedActor(actor);\n setLoading(true);\n try {\n if (actor) {\n const history = await aether.getHistory(actor, 50);\n setEvents(history);\n } else {\n // Clear filter - in a real app, you might load all recent events\n setEvents([]);\n }\n setSearchResults(null);\n setSearchQuery('');\n } catch (err) {\n console.error('Failed to load actor history:', err);\n } finally {\n setLoading(false);\n }\n },\n [aether]\n );\n\n // Clear search results\n const handleClearSearch = useCallback(() => {\n setSearchResults(null);\n setSearchQuery('');\n }, []);\n\n // Displayed events (search results or all events)\n const displayedEvents = searchResults ?? events;\n\n // Filter by selected actor if not searching\n const filteredEvents = useMemo(() => {\n if (searchResults) return searchResults;\n if (!selectedActor) return events;\n return events.filter((e) => e.actor === selectedActor);\n }, [events, searchResults, selectedActor]);\n\n return (\n <div\n className={`aether-dashboard ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: '#f9fafb',\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n }}\n >\n {/* Header */}\n <header\n style={{\n padding: '16px 24px',\n backgroundColor: '#ffffff',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <h1 style={{ margin: 0, fontSize: '20px', fontWeight: 600, color: '#1f2937' }}>\n {title}\n </h1>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n onClick={() => setViewMode('timeline')}\n style={{\n padding: '8px 16px',\n fontSize: '13px',\n fontWeight: 500,\n color: viewMode === 'timeline' ? '#3b82f6' : '#6b7280',\n backgroundColor: viewMode === 'timeline' ? '#eff6ff' : 'transparent',\n border: `1px solid ${viewMode === 'timeline' ? '#3b82f6' : '#d1d5db'}`,\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n >\n Timeline\n </button>\n <button\n onClick={() => setViewMode('graph')}\n style={{\n padding: '8px 16px',\n fontSize: '13px',\n fontWeight: 500,\n color: viewMode === 'graph' ? '#3b82f6' : '#6b7280',\n backgroundColor: viewMode === 'graph' ? '#eff6ff' : 'transparent',\n border: `1px solid ${viewMode === 'graph' ? '#3b82f6' : '#d1d5db'}`,\n borderRadius: '6px',\n cursor: 'pointer',\n }}\n >\n Graph\n </button>\n </div>\n </div>\n </header>\n\n {/* Main content */}\n <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n {/* Left sidebar */}\n <aside\n style={{\n width: '320px',\n padding: '16px',\n borderRight: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n }}\n >\n {/* Add memory form */}\n <div>\n <h2 style={{ margin: '0 0 12px 0', fontSize: '14px', fontWeight: 600, color: '#374151' }}>\n Add Memory\n </h2>\n <AddMemoryForm onAdd={handleAddMemory} loading={loading} />\n </div>\n\n {/* Stats */}\n <div>\n <h2 style={{ margin: '0 0 12px 0', fontSize: '14px', fontWeight: 600, color: '#374151' }}>\n Statistics\n </h2>\n <StatsPanel stats={stats} loading={loading} />\n </div>\n\n {/* Actor filter */}\n {actors.length > 0 && (\n <div>\n <h2 style={{ margin: '0 0 12px 0', fontSize: '14px', fontWeight: 600, color: '#374151' }}>\n Actors\n </h2>\n <ActorSelector\n actors={actors}\n selectedActor={selectedActor}\n onSelect={handleActorChange}\n />\n </div>\n )}\n </aside>\n\n {/* Main area */}\n <main style={{ flex: 1, display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>\n {/* Search bar */}\n <div style={{ padding: '16px', backgroundColor: '#ffffff', borderBottom: '1px solid #e5e7eb' }}>\n <SearchBar onSearch={handleSearch} loading={loading} />\n {searchQuery && (\n <div style={{ marginTop: '8px', display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ fontSize: '13px', color: '#6b7280' }}>\n Showing results for \"{searchQuery}\"\n </span>\n <button\n onClick={handleClearSearch}\n style={{\n padding: '4px 8px',\n fontSize: '12px',\n color: '#3b82f6',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n textDecoration: 'underline',\n }}\n >\n Clear\n </button>\n </div>\n )}\n </div>\n\n {/* Content area */}\n <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n {/* Events view */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '16px' }}>\n {filteredEvents.length === 0 ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: '#9ca3af',\n }}\n >\n <svg\n style={{ width: '48px', height: '48px', marginBottom: '12px' }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\"\n />\n </svg>\n <p style={{ margin: 0, fontSize: '14px' }}>No memories yet</p>\n <p style={{ margin: '4px 0 0 0', fontSize: '13px' }}>\n Add your first memory using the form on the left\n </p>\n </div>\n ) : viewMode === 'timeline' ? (\n <TimelineView\n events={filteredEvents}\n onEventClick={setSelectedEvent}\n selectedEventId={selectedEvent?.id}\n showContext\n />\n ) : (\n <MemoryGraphView\n events={filteredEvents}\n onNodeClick={setSelectedEvent}\n highlightActor={selectedActor ?? undefined}\n width={600}\n height={500}\n />\n )}\n </div>\n\n {/* Selected event detail */}\n {selectedEvent && (\n <aside\n style={{\n width: '300px',\n padding: '16px',\n borderLeft: '1px solid #e5e7eb',\n backgroundColor: '#ffffff',\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '12px' }}>\n <h3 style={{ margin: 0, fontSize: '14px', fontWeight: 600, color: '#374151' }}>\n Event Details\n </h3>\n <button\n onClick={() => setSelectedEvent(null)}\n style={{\n padding: '4px',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: '#9ca3af',\n }}\n >\n <svg style={{ width: '20px', height: '20px' }} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <MemoryCard event={selectedEvent} showContext />\n </aside>\n )}\n </div>\n </main>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useEffect","useRef","jsx","zoom","useMemo","jsx","jsx","jsxs","useMemo","events","useMemo","jsx","jsxs","colorMap","points","useState","jsx","jsxs","useState","useState","useCallback","jsx","jsxs","useState","useCallback","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","useCallback","useMemo","jsx","jsxs","useState","useEffect","useCallback","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/RemoteAether.ts","../src/context/AetherProvider.tsx","../src/hooks/useMemoryStream.ts","../src/components/MemoryGraphView/index.tsx","../src/components/MemoryCard/index.tsx","../src/components/TimelineView/index.tsx","../src/components/ClusterMap/index.tsx","../src/components/MemoryExplorer/index.tsx","../src/components/TrajectoryView/index.tsx","../src/components/PatternDashboard/index.tsx","../src/components/PredictionPanel/index.tsx","../src/components/AnomalyAlerts/index.tsx","../src/components/AddMemoryForm/index.tsx","../src/components/SearchBar/index.tsx","../src/components/StatsPanel/index.tsx","../src/components/ActorSelector/index.tsx","../src/components/ConnectionStatus/index.tsx","../src/components/ConnectionScreen/index.tsx","../src/components/Dashboard/index.tsx"],"sourcesContent":["import type {\n MemoryEvent,\n MemoryEventInput,\n RetrievalOptions,\n MemoryStats,\n} from 'aether-core';\n\n/**\n * Configuration for RemoteAether client.\n */\nexport interface RemoteAetherConfig {\n /** Base URL of the Aether server (e.g., 'http://localhost:3000') */\n baseUrl: string;\n /** Optional API key for authentication */\n apiKey?: string;\n /** WebSocket URL (defaults to ws(s)://baseUrl/ws) */\n wsUrl?: string;\n /** Auto-reconnect WebSocket on disconnect */\n autoReconnect?: boolean;\n /** Reconnect delay in ms */\n reconnectDelay?: number;\n}\n\n/**\n * Unsubscribe function type.\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Event listener callback type.\n */\nexport type EventListener = (event: MemoryEvent) => void;\n\n/**\n * Connection state listener type.\n */\nexport type ConnectionListener = (connected: boolean) => void;\n\n/**\n * RemoteAether - A client that implements the Aether interface over REST/WebSocket.\n *\n * Use this to connect a React app to a remote Aether server.\n *\n * @example\n * ```typescript\n * import { RemoteAether, Dashboard } from 'aether-react';\n *\n * const client = new RemoteAether({ baseUrl: 'http://localhost:3000' });\n * await client.initialize();\n *\n * // Use with Dashboard\n * <Dashboard aether={client} />\n * ```\n */\nexport class RemoteAether {\n private readonly config: Required<RemoteAetherConfig>;\n private ws: WebSocket | null = null;\n private listeners: Set<EventListener> = new Set();\n private connectionListeners: Set<ConnectionListener> = new Set();\n private connected = false;\n private initialized = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: RemoteAetherConfig | string) {\n const baseConfig = typeof config === 'string' ? { baseUrl: config } : config;\n\n // Normalize base URL (remove trailing slash)\n const baseUrl = baseConfig.baseUrl.replace(/\\/$/, '');\n\n // Derive WebSocket URL from base URL\n const wsProtocol = baseUrl.startsWith('https') ? 'wss' : 'ws';\n const wsHost = baseUrl.replace(/^https?:\\/\\//, '');\n\n this.config = {\n baseUrl,\n apiKey: baseConfig.apiKey ?? '',\n wsUrl: baseConfig.wsUrl ?? `${wsProtocol}://${wsHost}/ws`,\n autoReconnect: baseConfig.autoReconnect ?? true,\n reconnectDelay: baseConfig.reconnectDelay ?? 3000,\n };\n }\n\n /**\n * Initialize the client and establish WebSocket connection.\n * Verifies server connectivity before establishing WebSocket.\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Verify server is accessible by fetching stats\n await this.stats();\n\n // Establish WebSocket connection\n this.connectWebSocket();\n this.initialized = true;\n }\n\n /**\n * Add a memory event.\n */\n async add(content: string, context?: Record<string, unknown>): Promise<MemoryEvent>;\n async add(event: MemoryEventInput): Promise<MemoryEvent>;\n async add(\n contentOrEvent: string | MemoryEventInput,\n context?: Record<string, unknown>\n ): Promise<MemoryEvent> {\n const body =\n typeof contentOrEvent === 'string'\n ? { content: contentOrEvent, context }\n : contentOrEvent;\n\n const response = await this.fetch('/api/v1/memory', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n return response;\n }\n\n /**\n * Add multiple memory events in a batch.\n */\n async addBatch(events: MemoryEventInput[]): Promise<MemoryEvent[]> {\n const response = await this.fetch('/api/v1/memory/batch', {\n method: 'POST',\n body: JSON.stringify({ events }),\n });\n\n return response;\n }\n\n /**\n * Retrieve relevant memories based on a query.\n */\n async retrieve(query: string, options?: RetrievalOptions): Promise<MemoryEvent[]> {\n const params = new URLSearchParams({ q: query });\n\n if (options?.retrievalType) params.set('type', options.retrievalType);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.actor) params.set('actor', options.actor);\n if (options?.threshold) params.set('threshold', String(options.threshold));\n\n const response = await this.fetch(`/api/v1/memory?${params}`);\n return Array.isArray(response) ? response : response.events ?? [];\n }\n\n /**\n * Get all events.\n */\n async getAll(limit?: number): Promise<MemoryEvent[]> {\n const params = new URLSearchParams();\n if (limit) params.set('limit', String(limit));\n\n const response = await this.fetch(`/api/v1/events?${params}`);\n return Array.isArray(response) ? response : response.events ?? [];\n }\n\n /**\n * Get the history of events for a specific actor.\n */\n async getHistory(actor: string, limit?: number): Promise<MemoryEvent[]> {\n const params = new URLSearchParams();\n if (limit) params.set('limit', String(limit));\n\n const response = await this.fetch(`/api/v1/history/${encodeURIComponent(actor)}?${params}`);\n return Array.isArray(response) ? response : response.events ?? [];\n }\n\n /**\n * Get a specific event by ID.\n */\n async get(id: string): Promise<MemoryEvent | null> {\n try {\n return await this.fetch(`/api/v1/memory/${encodeURIComponent(id)}`);\n } catch {\n return null;\n }\n }\n\n /**\n * Delete a specific event by ID.\n */\n async delete(id: string): Promise<boolean> {\n try {\n await this.fetch(`/api/v1/memory/${encodeURIComponent(id)}`, { method: 'DELETE' });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get statistics about the memory store.\n */\n async stats(): Promise<MemoryStats> {\n return this.fetch('/api/v1/stats');\n }\n\n /**\n * Subscribe to new memory events.\n */\n subscribe(callback: EventListener): Unsubscribe {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n /**\n * Subscribe to connection state changes.\n */\n onConnectionChange(callback: ConnectionListener): Unsubscribe {\n this.connectionListeners.add(callback);\n // Immediately notify of current state\n callback(this.connected);\n return () => {\n this.connectionListeners.delete(callback);\n };\n }\n\n /**\n * Check if WebSocket is connected.\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Close the client and disconnect WebSocket.\n */\n async close(): Promise<void> {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.listeners.clear();\n this.connectionListeners.clear();\n this.initialized = false;\n }\n\n /**\n * Make an authenticated fetch request.\n */\n private async fetch(path: string, options: RequestInit = {}): Promise<any> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: response.statusText }));\n throw new Error(error.error || error.message || 'Request failed');\n }\n\n return response.json();\n }\n\n /**\n * Establish WebSocket connection.\n */\n private connectWebSocket(): void {\n try {\n this.ws = new WebSocket(this.config.wsUrl);\n\n this.ws.onopen = () => {\n this.connected = true;\n this.notifyConnectionListeners(true);\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data);\n if (message.type === 'memory:added' && message.data) {\n this.notifyListeners(message.data);\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n this.ws.onclose = () => {\n this.connected = false;\n this.notifyConnectionListeners(false);\n this.ws = null;\n\n if (this.config.autoReconnect && this.initialized) {\n this.scheduleReconnect();\n }\n };\n\n this.ws.onerror = () => {\n // Error will trigger onclose\n };\n } catch {\n this.scheduleReconnect();\n }\n }\n\n /**\n * Schedule a WebSocket reconnection attempt.\n */\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (this.initialized && !this.connected) {\n this.connectWebSocket();\n }\n }, this.config.reconnectDelay);\n }\n\n /**\n * Notify all event listeners.\n */\n private notifyListeners(event: MemoryEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n /**\n * Notify all connection listeners.\n */\n private notifyConnectionListeners(connected: boolean): void {\n for (const listener of this.connectionListeners) {\n try {\n listener(connected);\n } catch {\n // Ignore listener errors\n }\n }\n }\n}\n","import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';\nimport type { Aether, MemoryEvent, RetrievalOptions } from 'aether-core';\n\ninterface AetherContextValue {\n aether: Aether | null;\n events: MemoryEvent[];\n loading: boolean;\n error: Error | null;\n add: (content: string, context?: Record<string, unknown>) => Promise<MemoryEvent | null>;\n retrieve: (query: string, options?: RetrievalOptions) => Promise<MemoryEvent[]>;\n refresh: () => Promise<void>;\n clearEvents: () => void;\n}\n\nconst AetherContext = createContext<AetherContextValue | null>(null);\n\ninterface AetherProviderProps {\n aether: Aether;\n children: React.ReactNode;\n /** Initial actor to load history for */\n initialActor?: string;\n /** Auto-subscribe to new events */\n autoSubscribe?: boolean;\n}\n\nexport function AetherProvider({\n aether,\n children,\n initialActor,\n autoSubscribe = true,\n}: AetherProviderProps) {\n const [events, setEvents] = useState<MemoryEvent[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Load initial events\n useEffect(() => {\n if (initialActor) {\n setLoading(true);\n aether\n .getHistory(initialActor)\n .then(setEvents)\n .catch(setError)\n .finally(() => setLoading(false));\n }\n }, [aether, initialActor]);\n\n // Subscribe to new events\n useEffect(() => {\n if (!autoSubscribe) return;\n\n const unsubscribe = aether.subscribe((event) => {\n setEvents((prev) => [event, ...prev]);\n });\n\n return unsubscribe;\n }, [aether, autoSubscribe]);\n\n const add = useCallback(\n async (content: string, context?: Record<string, unknown>) => {\n try {\n setLoading(true);\n const event = await aether.add(content, context);\n // Event will be added via subscription if autoSubscribe is true\n if (!autoSubscribe) {\n setEvents((prev) => [event, ...prev]);\n }\n return event;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [aether, autoSubscribe]\n );\n\n const retrieve = useCallback(\n async (query: string, options?: RetrievalOptions) => {\n try {\n setLoading(true);\n const results = await aether.retrieve(query, options);\n return results;\n } catch (err) {\n setError(err as Error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [aether]\n );\n\n const refresh = useCallback(async () => {\n if (initialActor) {\n setLoading(true);\n try {\n const history = await aether.getHistory(initialActor);\n setEvents(history);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }\n }, [aether, initialActor]);\n\n const clearEvents = useCallback(() => {\n setEvents([]);\n }, []);\n\n const value: AetherContextValue = {\n aether,\n events,\n loading,\n error,\n add,\n retrieve,\n refresh,\n clearEvents,\n };\n\n return <AetherContext.Provider value={value}>{children}</AetherContext.Provider>;\n}\n\nexport function useAether(): AetherContextValue {\n const context = useContext(AetherContext);\n if (!context) {\n throw new Error('useAether must be used within an AetherProvider');\n }\n return context;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\ninterface WebSocketMessage {\n type: string;\n data?: unknown;\n}\n\ninterface UseMemoryStreamOptions {\n /** Auto-connect on mount */\n autoConnect?: boolean;\n /** Reconnect on disconnect */\n autoReconnect?: boolean;\n /** Max reconnect attempts */\n maxReconnectAttempts?: number;\n /** Reconnect delay in ms */\n reconnectDelay?: number;\n}\n\ninterface UseMemoryStreamReturn {\n events: MemoryEvent[];\n connected: boolean;\n error: Error | null;\n connect: () => void;\n disconnect: () => void;\n send: (message: WebSocketMessage) => void;\n clearEvents: () => void;\n}\n\nexport function useMemoryStream(\n serverUrl: string,\n options: UseMemoryStreamOptions = {}\n): UseMemoryStreamReturn {\n const {\n autoConnect = true,\n autoReconnect = true,\n maxReconnectAttempts = 5,\n reconnectDelay = 1000,\n } = options;\n\n const [events, setEvents] = useState<MemoryEvent[]>([]);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectAttemptsRef = useRef(0);\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const connect = useCallback(() => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n return;\n }\n\n try {\n const ws = new WebSocket(serverUrl);\n wsRef.current = ws;\n\n ws.onopen = () => {\n setConnected(true);\n setError(null);\n reconnectAttemptsRef.current = 0;\n };\n\n ws.onclose = () => {\n setConnected(false);\n wsRef.current = null;\n\n if (autoReconnect && reconnectAttemptsRef.current < maxReconnectAttempts) {\n reconnectAttemptsRef.current++;\n reconnectTimeoutRef.current = setTimeout(() => {\n connect();\n }, reconnectDelay * reconnectAttemptsRef.current);\n }\n };\n\n ws.onerror = (event) => {\n setError(new Error('WebSocket error'));\n console.error('WebSocket error:', event);\n };\n\n ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as WebSocketMessage;\n\n if (message.type === 'memory:added' && message.data) {\n const memoryEvent = message.data as MemoryEvent;\n setEvents((prev) => [memoryEvent, ...prev]);\n }\n } catch (err) {\n console.error('Failed to parse WebSocket message:', err);\n }\n };\n } catch (err) {\n setError(err as Error);\n }\n }, [serverUrl, autoReconnect, maxReconnectAttempts, reconnectDelay]);\n\n const disconnect = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n\n setConnected(false);\n }, []);\n\n const send = useCallback((message: WebSocketMessage) => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(JSON.stringify(message));\n } else {\n console.warn('WebSocket is not connected');\n }\n }, []);\n\n const clearEvents = useCallback(() => {\n setEvents([]);\n }, []);\n\n // Auto-connect on mount\n useEffect(() => {\n if (autoConnect) {\n connect();\n }\n\n return () => {\n disconnect();\n };\n }, [autoConnect, connect, disconnect]);\n\n return {\n events,\n connected,\n error,\n connect,\n disconnect,\n send,\n clearEvents,\n };\n}\n","import React, { useEffect, useRef, useMemo, useState, useCallback } from 'react';\nimport * as d3 from 'd3';\nimport type { MemoryEvent } from 'aether-core';\nimport { MemoryCard } from '../MemoryCard/index.js';\n\nexport type SelectionType = 'event' | 'actor' | 'link';\n\nexport interface GraphSelection {\n type: SelectionType;\n data: MemoryEvent | string | GraphLink;\n}\n\nexport interface MemoryGraphViewProps {\n events: MemoryEvent[];\n onNodeClick?: (event: MemoryEvent | null) => void;\n onSelectionChange?: (selection: GraphSelection | null) => void;\n selectedEvent?: MemoryEvent | null;\n selection?: GraphSelection | null;\n highlightActor?: string;\n showRelations?: boolean;\n showLegend?: boolean;\n className?: string;\n}\n\ninterface GraphNode {\n id: string;\n type: 'event' | 'actor';\n label: string;\n event?: MemoryEvent;\n x?: number;\n y?: number;\n fx?: number | null;\n fy?: number | null;\n}\n\ninterface GraphLink {\n id: string;\n source: string | GraphNode;\n target: string | GraphNode;\n type: 'actor' | 'temporal' | 'relation';\n sourceLabel?: string;\n targetLabel?: string;\n}\n\nconst XIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst getLinkTypeLabel = (type: GraphLink['type']) => {\n switch (type) {\n case 'actor': return 'Actor Connection';\n case 'temporal': return 'Temporal Sequence';\n case 'relation': return 'Relation';\n default: return 'Connection';\n }\n};\n\nconst getLinkTypeDescription = (type: GraphLink['type']) => {\n switch (type) {\n case 'actor': return 'Links an actor to their performed events';\n case 'temporal': return 'Shows the chronological order of events by the same actor';\n case 'relation': return 'Indicates a semantic relationship between events';\n default: return 'A connection between nodes';\n }\n};\n\nconst getLinkTypeColor = (type: GraphLink['type']) => {\n switch (type) {\n case 'actor': return '#a3a3a3';\n case 'temporal': return '#3b82f6';\n case 'relation': return '#f59e0b';\n default: return '#e5e5e5';\n }\n};\n\ninterface ActorDetailsProps {\n actor: string;\n events: MemoryEvent[];\n}\n\nfunction ActorDetails({ actor, events }: ActorDetailsProps) {\n const actorEvents = events.filter(e => e.actor === actor);\n\n return (\n <div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n marginBottom: '16px',\n }}>\n <div style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#f59e0b',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fff',\n fontWeight: 600,\n fontSize: '16px',\n }}>\n {actor.charAt(0).toUpperCase()}\n </div>\n <div>\n <div style={{ fontWeight: 600, fontSize: '14px' }}>{actor}</div>\n <div style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {actorEvents.length} event{actorEvents.length !== 1 ? 's' : ''}\n </div>\n </div>\n </div>\n\n <div style={{ marginBottom: '12px' }}>\n <div style={{ fontSize: '12px', fontWeight: 500, color: 'var(--aether-muted-fg, #737373)', marginBottom: '8px' }}>\n Events by this actor\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {actorEvents.map(event => (\n <div\n key={event.id}\n style={{\n padding: '8px 12px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '6px',\n fontSize: '13px',\n }}\n >\n <div style={{ fontWeight: 500 }}>{event.action}</div>\n <div style={{ fontSize: '11px', color: 'var(--aether-muted-fg, #737373)', marginTop: '2px' }}>\n {new Date(event.timestamp).toLocaleString()}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\ninterface LinkDetailsProps {\n link: GraphLink;\n}\n\nfunction LinkDetails({ link }: LinkDetailsProps) {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n\n return (\n <div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '16px',\n }}>\n <div style={{\n width: '24px',\n height: '4px',\n backgroundColor: getLinkTypeColor(link.type),\n borderRadius: '2px',\n ...(link.type === 'relation' ? {\n backgroundImage: `repeating-linear-gradient(90deg, ${getLinkTypeColor(link.type)}, ${getLinkTypeColor(link.type)} 4px, transparent 4px, transparent 8px)`,\n backgroundColor: 'transparent',\n } : {}),\n }} />\n <span style={{ fontWeight: 600, fontSize: '14px' }}>{getLinkTypeLabel(link.type)}</span>\n </div>\n\n <div style={{\n padding: '12px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '8px',\n marginBottom: '16px',\n }}>\n <div style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)', marginBottom: '4px' }}>\n Description\n </div>\n <div style={{ fontSize: '13px' }}>\n {getLinkTypeDescription(link.type)}\n </div>\n </div>\n\n <div style={{ marginBottom: '12px' }}>\n <div style={{ fontSize: '12px', fontWeight: 500, color: 'var(--aether-muted-fg, #737373)', marginBottom: '8px' }}>\n Connected Nodes\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{\n padding: '10px 12px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: '6px',\n }}>\n <div style={{ fontSize: '11px', color: 'var(--aether-muted-fg, #737373)', marginBottom: '2px' }}>\n Source\n </div>\n <div style={{ fontSize: '13px', fontWeight: 500 }}>\n {link.sourceLabel || sourceId}\n </div>\n <div style={{ fontSize: '11px', color: 'var(--aether-muted-fg, #737373)' }}>\n {sourceId.startsWith('actor:') ? 'Actor' : 'Event'}\n </div>\n </div>\n\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--aether-muted-fg, #737373)\" strokeWidth=\"2\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n </div>\n\n <div style={{\n padding: '10px 12px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: '6px',\n }}>\n <div style={{ fontSize: '11px', color: 'var(--aether-muted-fg, #737373)', marginBottom: '2px' }}>\n Target\n </div>\n <div style={{ fontSize: '13px', fontWeight: 500 }}>\n {link.targetLabel || targetId}\n </div>\n <div style={{ fontSize: '11px', color: 'var(--aether-muted-fg, #737373)' }}>\n {targetId.startsWith('actor:') ? 'Actor' : 'Event'}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction Legend() {\n return (\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '16px',\n padding: '8px 12px',\n backgroundColor: 'var(--aether-bg, #fff)',\n borderTop: '1px solid var(--aether-border, #e5e5e5)',\n fontSize: '12px',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '24px' }}>\n <span style={{ fontWeight: 500, color: 'var(--aether-muted-fg, #737373)' }}>Nodes:</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <div style={{ width: '12px', height: '12px', borderRadius: '50%', backgroundColor: '#f59e0b' }} />\n <span>Actor</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <div style={{ width: '12px', height: '12px', borderRadius: '50%', backgroundColor: '#10b981' }} />\n <span>Event</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <div style={{ width: '12px', height: '12px', borderRadius: '50%', backgroundColor: '#8b5cf6' }} />\n <span>Selected</span>\n </div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '24px' }}>\n <span style={{ fontWeight: 500, color: 'var(--aether-muted-fg, #737373)' }}>Links:</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <div style={{ width: '20px', height: '2px', backgroundColor: '#a3a3a3' }} />\n <span>Actor</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <div style={{ width: '20px', height: '2px', backgroundColor: '#3b82f6' }} />\n <span>Temporal</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <div style={{\n width: '20px',\n height: '2px',\n backgroundImage: 'repeating-linear-gradient(90deg, #f59e0b, #f59e0b 4px, transparent 4px, transparent 8px)',\n }} />\n <span>Relation</span>\n </div>\n </div>\n </div>\n );\n}\n\nexport function MemoryGraphView({\n events,\n onNodeClick,\n onSelectionChange,\n selectedEvent,\n selection: controlledSelection,\n highlightActor,\n showRelations = true,\n showLegend = true,\n className,\n}: MemoryGraphViewProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const simulationRef = useRef<d3.Simulation<GraphNode, GraphLink> | null>(null);\n const [dimensions, setDimensions] = useState({ width: 800, height: 600 });\n const [internalSelection, setInternalSelection] = useState<GraphSelection | null>(null);\n\n // Use controlled selection if provided, otherwise use internal state\n const selection = controlledSelection !== undefined ? controlledSelection : internalSelection;\n\n const handleSelectionChange = useCallback((newSelection: GraphSelection | null) => {\n if (controlledSelection === undefined) {\n setInternalSelection(newSelection);\n }\n onSelectionChange?.(newSelection);\n // Maintain backward compatibility with onNodeClick\n if (newSelection?.type === 'event') {\n onNodeClick?.(newSelection.data as MemoryEvent);\n } else if (newSelection === null) {\n onNodeClick?.(null);\n }\n }, [controlledSelection, onSelectionChange, onNodeClick]);\n\n // Track container size with ResizeObserver\n useEffect(() => {\n if (!containerRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (width > 0 && height > 0) {\n setDimensions({ width, height });\n }\n }\n });\n\n resizeObserver.observe(containerRef.current);\n return () => resizeObserver.disconnect();\n }, []);\n\n const { nodes, links, linksById } = useMemo(() => {\n const nodeMap = new Map<string, GraphNode>();\n const linkList: GraphLink[] = [];\n const linkMap = new Map<string, GraphLink>();\n let linkIdCounter = 0;\n\n const actors = new Set(events.map((e) => e.actor));\n for (const actor of actors) {\n nodeMap.set(`actor:${actor}`, {\n id: `actor:${actor}`,\n type: 'actor',\n label: actor,\n });\n }\n\n const sortedEvents = [...events].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n\n const prevEventByActor = new Map<string, string>();\n\n for (const event of sortedEvents) {\n const eventId = `event:${event.id}`;\n\n nodeMap.set(eventId, {\n id: eventId,\n type: 'event',\n label: event.action,\n event,\n });\n\n const actorLinkId = `link-${linkIdCounter++}`;\n const actorLink: GraphLink = {\n id: actorLinkId,\n source: `actor:${event.actor}`,\n target: eventId,\n type: 'actor',\n sourceLabel: event.actor,\n targetLabel: event.action,\n };\n linkList.push(actorLink);\n linkMap.set(actorLinkId, actorLink);\n\n const prevId = prevEventByActor.get(event.actor);\n if (prevId) {\n const prevNode = nodeMap.get(prevId);\n const temporalLinkId = `link-${linkIdCounter++}`;\n const temporalLink: GraphLink = {\n id: temporalLinkId,\n source: prevId,\n target: eventId,\n type: 'temporal',\n sourceLabel: prevNode?.label || prevId,\n targetLabel: event.action,\n };\n linkList.push(temporalLink);\n linkMap.set(temporalLinkId, temporalLink);\n }\n prevEventByActor.set(event.actor, eventId);\n\n if (showRelations && event.relations) {\n for (const relation of event.relations) {\n const targetId = `event:${relation.targetEventId}`;\n if (nodeMap.has(targetId)) {\n const targetNode = nodeMap.get(targetId);\n const relationLinkId = `link-${linkIdCounter++}`;\n const relationLink: GraphLink = {\n id: relationLinkId,\n source: eventId,\n target: targetId,\n type: 'relation',\n sourceLabel: event.action,\n targetLabel: targetNode?.label || targetId,\n };\n linkList.push(relationLink);\n linkMap.set(relationLinkId, relationLink);\n }\n }\n }\n }\n\n return {\n nodes: Array.from(nodeMap.values()),\n links: linkList,\n linksById: linkMap,\n };\n }, [events, showRelations]);\n\n useEffect(() => {\n if (simulationRef.current && dimensions.width > 0 && dimensions.height > 0) {\n simulationRef.current\n .force('center', d3.forceCenter(dimensions.width / 2, dimensions.height / 2))\n .alpha(0.3)\n .restart();\n }\n }, [dimensions]);\n\n useEffect(() => {\n if (!svgRef.current || nodes.length === 0) return;\n\n const svg = d3.select(svgRef.current);\n svg.selectAll('*').remove();\n\n const container = svg.append('g');\n\n const zoom = d3.zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4])\n .on('zoom', (event) => {\n container.attr('transform', event.transform);\n });\n\n svg.call(zoom);\n\n const simulation = d3.forceSimulation(nodes as d3.SimulationNodeDatum[])\n .force(\n 'link',\n d3.forceLink(links)\n .id((d: any) => d.id)\n .distance((d: any) => (d.type === 'actor' ? 100 : 50))\n )\n .force('charge', d3.forceManyBody().strength(-200))\n .force('center', d3.forceCenter(dimensions.width / 2, dimensions.height / 2))\n .force('collision', d3.forceCollide().radius(30));\n\n simulationRef.current = simulation as any;\n\n const linkGroup = container\n .append('g')\n .selectAll('g')\n .data(links)\n .join('g')\n .attr('cursor', 'pointer');\n\n // Invisible wider stroke for easier clicking\n linkGroup\n .append('line')\n .attr('stroke', 'transparent')\n .attr('stroke-width', 12);\n\n // Visible link line\n const link = linkGroup\n .append('line')\n .attr('stroke', (d) => {\n const isSelected = selection?.type === 'link' && (selection.data as GraphLink).id === d.id;\n if (isSelected) return '#8b5cf6';\n switch (d.type) {\n case 'actor': return '#a3a3a3';\n case 'temporal': return '#3b82f6';\n case 'relation': return '#f59e0b';\n default: return '#e5e5e5';\n }\n })\n .attr('stroke-width', (d) => {\n const isSelected = selection?.type === 'link' && (selection.data as GraphLink).id === d.id;\n if (isSelected) return 3;\n return d.type === 'temporal' ? 2 : 1;\n })\n .attr('stroke-dasharray', (d) => (d.type === 'relation' ? '4,4' : 'none'));\n\n linkGroup.on('click', (event, d) => {\n event.stopPropagation();\n handleSelectionChange({ type: 'link', data: d });\n });\n\n const node = container\n .append('g')\n .selectAll('g')\n .data(nodes)\n .join('g')\n .attr('cursor', 'pointer')\n .call(\n d3.drag<SVGGElement, GraphNode>()\n .on('start', (event, d) => {\n if (!event.active) simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n })\n .on('drag', (event, d) => {\n d.fx = event.x;\n d.fy = event.y;\n })\n .on('end', (event, d) => {\n if (!event.active) simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n }) as any\n );\n\n node\n .append('circle')\n .attr('r', (d) => (d.type === 'actor' ? 20 : 12))\n .attr('fill', (d) => {\n const isActorSelected = selection?.type === 'actor' && selection.data === d.label;\n const isEventSelected = selection?.type === 'event' && d.event && (selection.data as MemoryEvent).id === d.event.id;\n\n if (isActorSelected || isEventSelected) {\n return '#8b5cf6'; // Purple for selected\n }\n if (d.type === 'actor') {\n return highlightActor === d.label ? '#3b82f6' : '#f59e0b';\n }\n return '#10b981';\n })\n .attr('stroke', (d) => {\n const isActorSelected = selection?.type === 'actor' && selection.data === d.label;\n const isEventSelected = selection?.type === 'event' && d.event && (selection.data as MemoryEvent).id === d.event.id;\n return (isActorSelected || isEventSelected) ? '#6d28d9' : '#fff';\n })\n .attr('stroke-width', (d) => {\n const isActorSelected = selection?.type === 'actor' && selection.data === d.label;\n const isEventSelected = selection?.type === 'event' && d.event && (selection.data as MemoryEvent).id === d.event.id;\n return (isActorSelected || isEventSelected) ? 3 : 2;\n });\n\n node\n .append('text')\n .text((d) => d.label)\n .attr('font-size', (d) => (d.type === 'actor' ? 12 : 10))\n .attr('dx', (d) => (d.type === 'actor' ? 25 : 16))\n .attr('dy', 4)\n .attr('fill', '#1a1a1a');\n\n node.on('click', (event, d) => {\n event.stopPropagation();\n if (d.type === 'actor') {\n handleSelectionChange({ type: 'actor', data: d.label });\n } else if (d.event) {\n handleSelectionChange({ type: 'event', data: d.event });\n }\n });\n\n // Click on background to deselect\n svg.on('click', () => {\n handleSelectionChange(null);\n });\n\n simulation.on('tick', () => {\n // Update all lines in linkGroup (both visible and invisible)\n linkGroup.selectAll('line')\n .attr('x1', (d: any) => d.source.x)\n .attr('y1', (d: any) => d.source.y)\n .attr('x2', (d: any) => d.target.x)\n .attr('y2', (d: any) => d.target.y);\n\n node.attr('transform', (d: any) => `translate(${d.x},${d.y})`);\n });\n\n return () => {\n simulation.stop();\n simulationRef.current = null;\n };\n }, [nodes, links, dimensions.width, dimensions.height, highlightActor, selection, handleSelectionChange]);\n\n const handleClosePanel = useCallback(() => {\n handleSelectionChange(null);\n }, [handleSelectionChange]);\n\n if (events.length === 0) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No events to display\n </div>\n );\n }\n\n const hasSelection = selection !== null;\n const panelTitle = selection?.type === 'event'\n ? 'Event Details'\n : selection?.type === 'actor'\n ? 'Actor Details'\n : 'Link Details';\n\n return (\n <div className={className} style={{ position: 'relative', display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}>\n <div style={{ display: 'flex', flex: 1, minHeight: 0 }}>\n {/* Graph container */}\n <div\n ref={containerRef}\n style={{\n height: '100%',\n width: hasSelection ? '70%' : '100%',\n transition: 'width 0.3s ease-in-out',\n }}\n >\n <svg\n ref={svgRef}\n width={dimensions.width}\n height={dimensions.height}\n style={{\n width: '100%',\n height: '100%',\n borderRadius: showLegend ? 'var(--aether-radius, 8px) var(--aether-radius, 8px) 0 0' : 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n }}\n />\n </div>\n\n {/* Side panel for selection */}\n <div\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n height: showLegend ? 'calc(100% - 42px)' : '100%',\n width: hasSelection ? '30%' : 0,\n overflow: hasSelection ? 'auto' : 'hidden',\n opacity: hasSelection ? 1 : 0,\n borderLeft: hasSelection ? '1px solid var(--aether-border, #e5e5e5)' : 'none',\n backgroundColor: 'var(--aether-bg, #fff)',\n transition: 'width 0.3s ease-in-out, opacity 0.3s ease-in-out',\n }}\n >\n {selection && (\n <div style={{ padding: '16px' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '16px' }}>\n <h3 style={{ fontSize: '14px', fontWeight: 600 }}>{panelTitle}</h3>\n <button\n onClick={handleClosePanel}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n }}\n >\n <XIcon />\n </button>\n </div>\n\n {selection.type === 'event' && (\n <MemoryCard event={selection.data as MemoryEvent} showContext />\n )}\n\n {selection.type === 'actor' && (\n <ActorDetails actor={selection.data as string} events={events} />\n )}\n\n {selection.type === 'link' && (\n <LinkDetails link={selection.data as GraphLink} />\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Legend */}\n {showLegend && <Legend />}\n </div>\n );\n}\n","import React from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\nexport interface MemoryCardProps {\n event: MemoryEvent;\n onClick?: (event: MemoryEvent) => void;\n selected?: boolean;\n showContext?: boolean;\n className?: string;\n}\n\nexport function MemoryCard({\n event,\n onClick,\n selected = false,\n showContext = false,\n className,\n}: MemoryCardProps) {\n const formatTimestamp = (timestamp: string) => {\n const date = new Date(timestamp);\n return date.toLocaleString();\n };\n\n const handleClick = () => {\n onClick?.(event);\n };\n\n const cardStyle: React.CSSProperties = {\n marginBottom: '8px',\n padding: '12px',\n borderRadius: 'var(--aether-radius, 8px)',\n border: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n cursor: onClick ? 'pointer' : 'default',\n transition: 'box-shadow 0.2s, border-color 0.2s',\n ...(selected && {\n borderColor: 'var(--aether-primary, #3b82f6)',\n boxShadow: '0 0 0 2px var(--aether-primary, #3b82f6)',\n }),\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '8px',\n };\n\n const actorStyle: React.CSSProperties = {\n fontWeight: 600,\n color: 'var(--aether-fg, #1a1a1a)',\n };\n\n const badgeStyle: React.CSSProperties = {\n marginLeft: '8px',\n padding: '2px 8px',\n fontSize: '11px',\n borderRadius: '9999px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n color: 'var(--aether-muted-fg, #737373)',\n };\n\n const timestampStyle: React.CSSProperties = {\n fontSize: '12px',\n color: 'var(--aether-muted-fg, #737373)',\n };\n\n const contentStyle: React.CSSProperties = {\n fontSize: '14px',\n lineHeight: 1.6,\n color: 'var(--aether-fg, #1a1a1a)',\n opacity: 0.8,\n };\n\n const contextStyle: React.CSSProperties = {\n marginTop: '12px',\n padding: '8px',\n borderRadius: '4px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n };\n\n const idStyle: React.CSSProperties = {\n marginTop: '8px',\n fontSize: '10px',\n fontFamily: 'monospace',\n color: 'var(--aether-muted-fg, #737373)',\n };\n\n return (\n <div className={className} style={cardStyle} onClick={handleClick}>\n <div style={headerStyle}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span style={actorStyle}>{event.actor}</span>\n <span style={badgeStyle}>{event.action}</span>\n </div>\n <span style={timestampStyle}>{formatTimestamp(event.timestamp)}</span>\n </div>\n\n <p style={contentStyle}>{event.content}</p>\n\n {showContext && Object.keys(event.context).length > 0 && (\n <>\n <hr style={{ margin: '12px 0', border: 'none', borderTop: '1px solid var(--aether-border, #e5e5e5)' }} />\n <div style={contextStyle}>\n <span style={{ fontSize: '12px', fontWeight: 500, color: 'var(--aether-muted-fg, #737373)' }}>\n Context:\n </span>\n <pre style={{ marginTop: '4px', fontSize: '11px', overflow: 'auto', color: 'var(--aether-fg, #1a1a1a)', opacity: 0.7 }}>\n {JSON.stringify(event.context, null, 2)}\n </pre>\n </div>\n </>\n )}\n\n <div style={idStyle}>{event.id.slice(0, 12)}...</div>\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { MemoryEvent } from 'aether-core';\nimport { MemoryCard } from '../MemoryCard/index.js';\n\nexport interface TimelineViewProps {\n events: MemoryEvent[];\n onEventClick?: (event: MemoryEvent) => void;\n selectedEventId?: string;\n showContext?: boolean;\n groupBy?: 'none' | 'day' | 'actor';\n maxHeight?: string | number;\n className?: string;\n}\n\ninterface GroupedEvents {\n label: string;\n events: MemoryEvent[];\n}\n\nexport function TimelineView({\n events,\n onEventClick,\n selectedEventId,\n showContext = false,\n groupBy = 'none',\n maxHeight = '600px',\n className,\n}: TimelineViewProps) {\n const sortedEvents = useMemo(() => {\n return [...events].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n }, [events]);\n\n const groupedEvents = useMemo((): GroupedEvents[] => {\n if (groupBy === 'none') {\n return [{ label: '', events: sortedEvents }];\n }\n\n const groups = new Map<string, MemoryEvent[]>();\n\n for (const event of sortedEvents) {\n let key: string;\n\n if (groupBy === 'day') {\n key = new Date(event.timestamp).toLocaleDateString();\n } else {\n key = event.actor;\n }\n\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(event);\n }\n\n return Array.from(groups.entries()).map(([label, events]) => ({\n label,\n events,\n }));\n }, [sortedEvents, groupBy]);\n\n const containerStyle: React.CSSProperties = {\n height: '100%',\n maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,\n overflow: 'auto',\n };\n\n if (events.length === 0) {\n return (\n <div\n className={className}\n style={{\n padding: '40px',\n textAlign: 'center',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No events to display\n </div>\n );\n }\n\n return (\n <div className={className} style={containerStyle}>\n <div style={{ padding: '16px' }}>\n {groupedEvents.map((group, groupIndex) => (\n <div key={group.label || groupIndex}>\n {group.label && (\n <div\n style={{\n position: 'sticky',\n top: 0,\n zIndex: 10,\n marginBottom: '8px',\n padding: '8px 0',\n fontWeight: 600,\n backgroundColor: 'var(--aether-bg, #fff)',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n color: 'var(--aether-fg, #1a1a1a)',\n }}\n >\n {group.label}\n </div>\n )}\n\n <div>\n {group.events.map((event) => (\n <div key={event.id} style={{ display: 'flex', gap: '12px' }}>\n {/* Timeline indicator */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '20px',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n border: '2px solid var(--aether-bg, #fff)',\n backgroundColor:\n event.id === selectedEventId\n ? 'var(--aether-primary, #3b82f6)'\n : 'var(--aether-muted-fg, #737373)',\n boxShadow:\n event.id === selectedEventId\n ? '0 0 0 2px var(--aether-primary, #3b82f6)'\n : 'none',\n }}\n />\n <div\n style={{\n flex: 1,\n width: '2px',\n minHeight: '20px',\n backgroundColor: 'var(--aether-border, #e5e5e5)',\n }}\n />\n </div>\n\n {/* Event card */}\n <div style={{ flex: 1, paddingBottom: '8px' }}>\n <MemoryCard\n event={event}\n onClick={onEventClick}\n selected={event.id === selectedEventId}\n showContext={showContext}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\nexport interface ClusterMapProps {\n events: MemoryEvent[];\n width?: number;\n height?: number;\n onEventClick?: (event: MemoryEvent) => void;\n colorBy?: 'actor' | 'action';\n className?: string;\n}\n\n/**\n * ClusterMap visualizes events in a 2D space based on their embeddings.\n * Note: Full t-SNE/UMAP implementation requires additional dependencies.\n * This is a simplified version that uses a basic layout.\n */\nexport function ClusterMap({\n events,\n width = 600,\n height = 400,\n onEventClick,\n colorBy = 'actor',\n className,\n}: ClusterMapProps) {\n const colorPalette = [\n '#3b82f6',\n '#10b981',\n '#f59e0b',\n '#ef4444',\n '#8b5cf6',\n '#ec4899',\n ];\n\n const { points, colorMap } = useMemo(() => {\n const colorKey = colorBy === 'actor' ? 'actor' : 'action';\n const uniqueValues = [...new Set(events.map((e) => e[colorKey]))];\n const colorMap = new Map<string, string>();\n\n uniqueValues.forEach((value, i) => {\n colorMap.set(value, colorPalette[i % colorPalette.length]!);\n });\n\n // Simple layout: spread events in a grid-like pattern\n const cols = Math.ceil(Math.sqrt(events.length));\n const padding = 60;\n const cellWidth = (width - padding * 2) / cols;\n const cellHeight = (height - padding * 2) / cols;\n\n const points = events.map((event, i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n\n // Add some jitter for visual interest\n const jitterX = (Math.random() - 0.5) * cellWidth * 0.5;\n const jitterY = (Math.random() - 0.5) * cellHeight * 0.5;\n\n return {\n event,\n x: padding + col * cellWidth + cellWidth / 2 + jitterX,\n y: padding + row * cellHeight + cellHeight / 2 + jitterY,\n color: colorMap.get(event[colorKey]) ?? '#737373',\n };\n });\n\n return { points, colorMap };\n }, [events, colorBy, width, height, colorPalette]);\n\n if (events.length === 0) {\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No events to display\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n width,\n height,\n overflow: 'hidden',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n }}\n >\n <svg width={width} height={height}>\n {points.map((point) => (\n <g key={point.event.id}>\n <circle\n cx={point.x}\n cy={point.y}\n r={8}\n fill={point.color}\n stroke=\"var(--aether-bg, #fff)\"\n strokeWidth={2}\n style={{ cursor: 'pointer', transition: 'transform 0.2s' }}\n onClick={() => onEventClick?.(point.event)}\n >\n <title>{point.event.content}</title>\n </circle>\n </g>\n ))}\n </svg>\n\n {/* Legend */}\n <div\n style={{\n position: 'absolute',\n bottom: '10px',\n left: '10px',\n padding: '8px',\n borderRadius: '4px',\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n fontSize: '12px',\n }}\n >\n <div style={{ marginBottom: '4px', fontWeight: 600 }}>\n {colorBy === 'actor' ? 'Actors' : 'Actions'}\n </div>\n {Array.from(colorMap.entries())\n .slice(0, 5)\n .map(([label, color]) => (\n <div\n key={label}\n style={{ display: 'flex', alignItems: 'center', gap: '6px', marginBottom: '2px' }}\n >\n <div\n style={{\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: color,\n }}\n />\n <span>{label}</span>\n </div>\n ))}\n {colorMap.size > 5 && (\n <div style={{ color: 'var(--aether-muted-fg, #737373)' }}>+{colorMap.size - 5} more</div>\n )}\n </div>\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport type { MemoryEvent } from 'aether-core';\nimport { TimelineView } from '../TimelineView/index.js';\nimport { MemoryGraphView } from '../MemoryGraphView/index.js';\nimport { ClusterMap } from '../ClusterMap/index.js';\nimport { MemoryCard } from '../MemoryCard/index.js';\n\nexport interface MemoryExplorerProps {\n events: MemoryEvent[];\n onEventClick?: (event: MemoryEvent) => void;\n defaultView?: 'timeline' | 'graph' | 'cluster';\n showViewSwitcher?: boolean;\n className?: string;\n}\n\ntype ViewType = 'timeline' | 'graph' | 'cluster';\n\nexport function MemoryExplorer({\n events,\n onEventClick,\n defaultView = 'timeline',\n showViewSwitcher = true,\n className,\n}: MemoryExplorerProps) {\n const [currentView, setCurrentView] = useState<ViewType>(defaultView);\n const [selectedEvent, setSelectedEvent] = useState<MemoryEvent | null>(null);\n\n const handleEventClick = useCallback((event: MemoryEvent) => {\n setSelectedEvent(event);\n onEventClick?.(event);\n }, [onEventClick]);\n\n const handleGraphNodeClick = useCallback((event: MemoryEvent | null) => {\n setSelectedEvent(event);\n if (event) {\n onEventClick?.(event);\n }\n }, [onEventClick]);\n\n const buttonStyle = (isSelected: boolean): React.CSSProperties => ({\n padding: '6px 16px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--aether-radius, 8px)',\n cursor: 'pointer',\n textTransform: 'capitalize',\n backgroundColor: isSelected ? 'var(--aether-primary, #3b82f6)' : 'var(--aether-muted, #f5f5f5)',\n color: isSelected ? 'var(--aether-primary-fg, #fff)' : 'var(--aether-fg, #1a1a1a)',\n } as React.CSSProperties);\n\n const renderView = () => {\n switch (currentView) {\n case 'timeline':\n return (\n <TimelineView\n events={events}\n onEventClick={handleEventClick}\n selectedEventId={selectedEvent?.id}\n showContext\n maxHeight=\"500px\"\n />\n );\n\n case 'graph':\n return (\n <div style={{ height: '500px' }}>\n <MemoryGraphView\n events={events}\n onNodeClick={handleGraphNodeClick}\n selectedEvent={selectedEvent}\n />\n </div>\n );\n\n case 'cluster':\n return (\n <ClusterMap\n events={events}\n onEventClick={handleEventClick}\n width={700}\n height={500}\n colorBy=\"actor\"\n />\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div className={className} style={{ display: 'flex', gap: '16px', padding: '16px' }}>\n {/* Main view */}\n <div style={{ flex: 1 }}>\n {/* View switcher */}\n {showViewSwitcher && (\n <div style={{ display: 'flex', gap: '8px', marginBottom: '16px' }}>\n {(['timeline', 'graph', 'cluster'] as ViewType[]).map((view) => (\n <button\n key={view}\n style={buttonStyle(currentView === view)}\n onClick={() => setCurrentView(view)}\n >\n {view}\n </button>\n ))}\n </div>\n )}\n\n {/* View content */}\n <div\n style={{\n overflow: 'hidden',\n borderRadius: 'var(--aether-radius, 8px)',\n border: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n }}\n >\n {renderView()}\n </div>\n\n {/* Stats */}\n <div\n style={{\n marginTop: '12px',\n padding: '8px 12px',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n fontSize: '12px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n {events.length} events • {new Set(events.map((e) => e.actor)).size} actors\n </div>\n </div>\n\n {/* Selected event detail */}\n {selectedEvent && currentView !== 'graph' && (\n <div style={{ width: '300px', flexShrink: 0 }}>\n <div\n style={{\n marginBottom: '8px',\n fontWeight: 600,\n color: 'var(--aether-fg, #1a1a1a)',\n }}\n >\n Selected Event\n </div>\n <MemoryCard event={selectedEvent} showContext />\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport type { MemoryEvent } from 'aether-core';\n\n/**\n * Trajectory data for display.\n * Aligned with core Trajectory type for consistency.\n */\nexport interface TrajectoryData {\n id: string;\n actor: string;\n status: 'active' | 'completed' | 'abandoned';\n outcome?: 'success' | 'failure' | 'partial';\n /** Event IDs in chronological order */\n events: string[];\n /** ISO 8601 timestamp when trajectory started */\n startTime: string;\n /** ISO 8601 timestamp when trajectory ended */\n endTime?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Props for TrajectoryView component.\n */\nexport interface TrajectoryViewProps {\n /** Memory events to display */\n events: MemoryEvent[];\n /** Optional trajectories data */\n trajectories?: TrajectoryData[];\n /** Callback when an event is clicked */\n onEventClick?: (event: MemoryEvent) => void;\n /** Callback when a trajectory is clicked */\n onTrajectoryClick?: (trajectory: TrajectoryData) => void;\n /** Currently selected event ID */\n selectedEventId?: string;\n /** Currently selected trajectory ID */\n selectedTrajectoryId?: string;\n /** Show trajectory boundaries */\n showBoundaries?: boolean;\n /** Maximum height */\n maxHeight?: string;\n}\n\n// Icons\nconst ChevronRightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\nconst XIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"5 3 19 12 5 21 5 3\" />\n </svg>\n);\n\n/**\n * Format a timestamp for display.\n */\nfunction formatTime(timestamp: string): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n}\n\n/**\n * Format duration in milliseconds.\n */\nfunction formatDuration(startTime: string, endTime?: string): string {\n const start = new Date(startTime).getTime();\n const end = endTime ? new Date(endTime).getTime() : Date.now();\n const durationMs = end - start;\n\n if (durationMs < 1000) return `${durationMs}ms`;\n if (durationMs < 60000) return `${(durationMs / 1000).toFixed(1)}s`;\n if (durationMs < 3600000) return `${Math.floor(durationMs / 60000)}m`;\n return `${(durationMs / 3600000).toFixed(1)}h`;\n}\n\n/**\n * Get status color.\n */\nfunction getStatusColor(status: TrajectoryData['status'], outcome?: TrajectoryData['outcome']): string {\n if (status === 'active') return '#3b82f6';\n if (outcome === 'success') return '#22c55e';\n if (outcome === 'failure') return '#ef4444';\n if (outcome === 'partial') return '#f59e0b';\n return '#737373';\n}\n\n/**\n * Get outcome icon.\n */\nfunction OutcomeIcon({ outcome, status }: { outcome?: TrajectoryData['outcome']; status: TrajectoryData['status'] }) {\n if (status === 'active') return <PlayIcon />;\n if (outcome === 'success') return <CheckIcon />;\n if (outcome === 'failure') return <XIcon />;\n return null;\n}\n\n/**\n * Group events by trajectory.\n */\nfunction groupEventsByTrajectory(\n events: MemoryEvent[],\n trajectories: TrajectoryData[]\n): Map<string, MemoryEvent[]> {\n const groups = new Map<string, MemoryEvent[]>();\n const eventIdToTrajectory = new Map<string, string>();\n\n // Map event IDs to trajectories\n for (const trajectory of trajectories) {\n for (const eventId of trajectory.events) {\n eventIdToTrajectory.set(eventId, trajectory.id);\n }\n groups.set(trajectory.id, []);\n }\n\n // Group events\n const unassigned: MemoryEvent[] = [];\n for (const event of events) {\n const trajectoryId = eventIdToTrajectory.get(event.id);\n if (trajectoryId && groups.has(trajectoryId)) {\n groups.get(trajectoryId)!.push(event);\n } else {\n unassigned.push(event);\n }\n }\n\n if (unassigned.length > 0) {\n groups.set('_unassigned', unassigned);\n }\n\n return groups;\n}\n\n/**\n * TrajectoryView - Shows events grouped by trajectories with boundaries.\n */\nexport function TrajectoryView({\n events,\n trajectories = [],\n onEventClick,\n onTrajectoryClick,\n selectedEventId,\n selectedTrajectoryId,\n showBoundaries = true,\n maxHeight = '100%',\n}: TrajectoryViewProps) {\n const [expandedTrajectories, setExpandedTrajectories] = useState<Set<string>>(new Set());\n\n const groupedEvents = useMemo(\n () => groupEventsByTrajectory(events, trajectories),\n [events, trajectories]\n );\n\n const toggleTrajectory = (id: string) => {\n setExpandedTrajectories((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n // If no trajectories, show flat list\n if (trajectories.length === 0) {\n return (\n <div\n style={{\n maxHeight,\n overflow: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n }}\n >\n {events.map((event) => (\n <EventCard\n key={event.id}\n event={event}\n onClick={() => onEventClick?.(event)}\n selected={event.id === selectedEventId}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n style={{\n maxHeight,\n overflow: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n {trajectories.map((trajectory) => {\n const trajectoryEvents = groupedEvents.get(trajectory.id) ?? [];\n const isExpanded = expandedTrajectories.has(trajectory.id);\n const isSelected = trajectory.id === selectedTrajectoryId;\n const statusColor = getStatusColor(trajectory.status, trajectory.outcome);\n\n return (\n <div\n key={trajectory.id}\n style={{\n border: `1px solid ${isSelected ? statusColor : 'var(--aether-border, #e5e5e5)'}`,\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-bg, #fff)',\n overflow: 'hidden',\n }}\n >\n {/* Trajectory header */}\n <button\n style={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n padding: '12px',\n border: 'none',\n backgroundColor: isSelected ? `${statusColor}10` : 'transparent',\n cursor: 'pointer',\n gap: '8px',\n }}\n onClick={() => {\n toggleTrajectory(trajectory.id);\n onTrajectoryClick?.(trajectory);\n }}\n >\n <span style={{ color: 'var(--aether-muted-fg, #737373)' }}>\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </span>\n\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n backgroundColor: statusColor,\n color: '#fff',\n }}\n >\n <OutcomeIcon outcome={trajectory.outcome} status={trajectory.status} />\n </span>\n\n <div style={{ flex: 1, textAlign: 'left' }}>\n <div style={{ fontWeight: 500, fontSize: '14px' }}>\n {trajectory.actor}\n </div>\n <div style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {trajectoryEvents.length} events · {formatDuration(trajectory.startTime, trajectory.endTime)}\n </div>\n </div>\n\n <div style={{ textAlign: 'right', fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {formatTime(trajectory.startTime)}\n </div>\n </button>\n\n {/* Trajectory events */}\n {isExpanded && trajectoryEvents.length > 0 && (\n <div\n style={{\n borderTop: '1px solid var(--aether-border, #e5e5e5)',\n padding: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n position: 'relative',\n }}\n >\n {/* Timeline line */}\n {showBoundaries && (\n <div\n style={{\n position: 'absolute',\n left: '24px',\n top: '20px',\n bottom: '20px',\n width: '2px',\n backgroundColor: `${statusColor}40`,\n }}\n />\n )}\n\n {trajectoryEvents.map((event, index) => (\n <div\n key={event.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n paddingLeft: '8px',\n }}\n >\n {showBoundaries && (\n <div\n style={{\n width: '8px',\n height: '8px',\n marginTop: '6px',\n borderRadius: '50%',\n backgroundColor: index === 0 || index === trajectoryEvents.length - 1\n ? statusColor\n : `${statusColor}60`,\n flexShrink: 0,\n zIndex: 1,\n }}\n />\n )}\n <EventCard\n event={event}\n onClick={() => onEventClick?.(event)}\n selected={event.id === selectedEventId}\n compact\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Unassigned events */}\n {groupedEvents.has('_unassigned') && (\n <div>\n <h3 style={{ fontSize: '12px', fontWeight: 600, color: 'var(--aether-muted-fg, #737373)', marginBottom: '8px' }}>\n Unassigned Events\n </h3>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {groupedEvents.get('_unassigned')!.map((event) => (\n <EventCard\n key={event.id}\n event={event}\n onClick={() => onEventClick?.(event)}\n selected={event.id === selectedEventId}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Simple event card for the trajectory view.\n */\nfunction EventCard({\n event,\n onClick,\n selected,\n compact = false,\n}: {\n event: MemoryEvent;\n onClick?: () => void;\n selected?: boolean;\n compact?: boolean;\n}) {\n return (\n <button\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n width: '100%',\n padding: compact ? '8px' : '12px',\n border: `1px solid ${selected ? 'var(--aether-primary, #3b82f6)' : 'var(--aether-border, #e5e5e5)'}`,\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: selected ? 'var(--aether-primary-bg, #eff6ff)' : 'var(--aether-bg, #fff)',\n cursor: 'pointer',\n textAlign: 'left',\n }}\n onClick={onClick}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', width: '100%' }}>\n <span\n style={{\n padding: '2px 6px',\n fontSize: '11px',\n fontWeight: 500,\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '4px',\n color: 'var(--aether-primary, #3b82f6)',\n }}\n >\n {event.action}\n </span>\n <span style={{ flex: 1, fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {event.actor}\n </span>\n <span style={{ fontSize: '11px', color: 'var(--aether-muted-fg, #737373)' }}>\n {formatTime(event.timestamp)}\n </span>\n </div>\n <p\n style={{\n marginTop: '4px',\n fontSize: '13px',\n lineHeight: '1.4',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: compact ? 1 : 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {event.content}\n </p>\n </button>\n );\n}\n","import React, { useState, useMemo } from 'react';\n\n/**\n * Pattern data for display.\n */\nexport interface PatternData {\n id: string;\n sequence: string[];\n frequency: number;\n confidence: number;\n support: number;\n examples: string[];\n avgDurationMs?: number;\n}\n\n/**\n * Anomaly data for display.\n */\nexport interface AnomalyData {\n eventId: string;\n reason: string;\n severity: 'low' | 'medium' | 'high';\n deviationScore: number;\n detectedAt: string;\n expectedAction?: string;\n}\n\n/**\n * Transition matrix data.\n */\nexport interface TransitionMatrixData {\n actions: string[];\n probabilities: number[][];\n counts: number[][];\n totalTransitions: number;\n}\n\n/**\n * Props for PatternDashboard component.\n */\nexport interface PatternDashboardProps {\n /** Detected patterns */\n patterns?: PatternData[];\n /** Detected anomalies */\n anomalies?: AnomalyData[];\n /** Transition matrix */\n transitionMatrix?: TransitionMatrixData;\n /** Loading state */\n loading?: boolean;\n /** Callback when a pattern is clicked */\n onPatternClick?: (pattern: PatternData) => void;\n /** Callback when an anomaly is clicked */\n onAnomalyClick?: (anomaly: AnomalyData) => void;\n}\n\n// Icons\nconst TrendingUpIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\" />\n <polyline points=\"17 6 23 6 23 12\" />\n </svg>\n);\n\nconst AlertTriangleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst GridIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </svg>\n);\n\n/**\n * Get severity color.\n */\nfunction getSeverityColor(severity: AnomalyData['severity']): string {\n switch (severity) {\n case 'high':\n return '#ef4444';\n case 'medium':\n return '#f59e0b';\n case 'low':\n return '#3b82f6';\n default:\n return '#737373';\n }\n}\n\n/**\n * Format percentage.\n */\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(0)}%`;\n}\n\n/**\n * PatternDashboard - Shows patterns, anomalies, and transition matrix.\n */\nexport function PatternDashboard({\n patterns = [],\n anomalies = [],\n transitionMatrix,\n loading = false,\n onPatternClick,\n onAnomalyClick,\n}: PatternDashboardProps) {\n const [activeTab, setActiveTab] = useState<'patterns' | 'anomalies' | 'matrix'>('patterns');\n\n const sortedPatterns = useMemo(\n () => [...patterns].sort((a, b) => b.frequency - a.frequency),\n [patterns]\n );\n\n const sortedAnomalies = useMemo(\n () => [...anomalies].sort((a, b) => {\n const severityOrder = { high: 3, medium: 2, low: 1 };\n return severityOrder[b.severity] - severityOrder[a.severity];\n }),\n [anomalies]\n );\n\n const tabStyle = (isActive: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 12px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--aether-radius, 8px)',\n cursor: 'pointer',\n backgroundColor: isActive ? 'var(--aether-primary, #3b82f6)' : 'transparent',\n color: isActive ? '#fff' : 'var(--aether-muted-fg, #737373)',\n });\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n Loading patterns...\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px', height: '100%' }}>\n {/* Tab navigation */}\n <div\n style={{\n display: 'flex',\n gap: '4px',\n padding: '4px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: 'var(--aether-radius, 8px)',\n width: 'fit-content',\n }}\n >\n <button style={tabStyle(activeTab === 'patterns')} onClick={() => setActiveTab('patterns')}>\n <TrendingUpIcon />\n <span>Patterns ({patterns.length})</span>\n </button>\n <button style={tabStyle(activeTab === 'anomalies')} onClick={() => setActiveTab('anomalies')}>\n <AlertTriangleIcon />\n <span>Anomalies ({anomalies.length})</span>\n </button>\n <button style={tabStyle(activeTab === 'matrix')} onClick={() => setActiveTab('matrix')}>\n <GridIcon />\n <span>Transitions</span>\n </button>\n </div>\n\n {/* Tab content */}\n <div style={{ flex: 1, overflow: 'auto' }}>\n {activeTab === 'patterns' && (\n <PatternList patterns={sortedPatterns} onClick={onPatternClick} />\n )}\n {activeTab === 'anomalies' && (\n <AnomalyList anomalies={sortedAnomalies} onClick={onAnomalyClick} />\n )}\n {activeTab === 'matrix' && transitionMatrix && (\n <TransitionHeatmap matrix={transitionMatrix} />\n )}\n {activeTab === 'matrix' && !transitionMatrix && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No transition data available\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Pattern list component.\n */\nfunction PatternList({\n patterns,\n onClick,\n}: {\n patterns: PatternData[];\n onClick?: (pattern: PatternData) => void;\n}) {\n if (patterns.length === 0) {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <TrendingUpIcon />\n <p style={{ marginTop: '8px' }}>No patterns detected yet</p>\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {patterns.map((pattern) => (\n <button\n key={pattern.id}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n padding: '12px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-bg, #fff)',\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n }}\n onClick={() => onClick?.(pattern)}\n >\n {/* Sequence visualization */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', flexWrap: 'wrap', marginBottom: '8px' }}>\n {pattern.sequence.map((action, i) => (\n <React.Fragment key={i}>\n <span\n style={{\n padding: '4px 8px',\n fontSize: '12px',\n fontWeight: 500,\n backgroundColor: 'var(--aether-primary-bg, #eff6ff)',\n color: 'var(--aether-primary, #3b82f6)',\n borderRadius: '4px',\n }}\n >\n {action}\n </span>\n {i < pattern.sequence.length - 1 && (\n <span style={{ color: 'var(--aether-muted-fg, #737373)' }}>→</span>\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Metrics */}\n <div style={{ display: 'flex', gap: '16px', fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n <span>\n <strong style={{ color: 'var(--aether-fg, #1a1a1a)' }}>{pattern.frequency}</strong> occurrences\n </span>\n <span>\n <strong style={{ color: 'var(--aether-fg, #1a1a1a)' }}>{formatPercent(pattern.confidence)}</strong> confidence\n </span>\n <span>\n <strong style={{ color: 'var(--aether-fg, #1a1a1a)' }}>{formatPercent(pattern.support)}</strong> support\n </span>\n </div>\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * Anomaly list component.\n */\nfunction AnomalyList({\n anomalies,\n onClick,\n}: {\n anomalies: AnomalyData[];\n onClick?: (anomaly: AnomalyData) => void;\n}) {\n if (anomalies.length === 0) {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <AlertTriangleIcon />\n <p style={{ marginTop: '8px' }}>No anomalies detected</p>\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {anomalies.map((anomaly) => {\n const color = getSeverityColor(anomaly.severity);\n\n return (\n <button\n key={anomaly.eventId}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '12px',\n border: `1px solid ${color}40`,\n borderLeft: `4px solid ${color}`,\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: `${color}08`,\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n gap: '12px',\n }}\n onClick={() => onClick?.(anomaly)}\n >\n <div\n style={{\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n backgroundColor: color,\n color: '#fff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <AlertTriangleIcon />\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '4px' }}>\n <span\n style={{\n padding: '2px 6px',\n fontSize: '10px',\n fontWeight: 600,\n textTransform: 'uppercase',\n backgroundColor: `${color}20`,\n color,\n borderRadius: '4px',\n }}\n >\n {anomaly.severity}\n </span>\n <span style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {new Date(anomaly.detectedAt).toLocaleTimeString()}\n </span>\n </div>\n\n <p style={{ fontSize: '13px', margin: 0 }}>{anomaly.reason}</p>\n\n {anomaly.expectedAction && (\n <p style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)', marginTop: '4px' }}>\n Expected: <strong>{anomaly.expectedAction}</strong>\n </p>\n )}\n </div>\n\n <div style={{ textAlign: 'right', flexShrink: 0 }}>\n <div style={{ fontSize: '18px', fontWeight: 600, color }}>\n {(anomaly.deviationScore * 100).toFixed(0)}\n </div>\n <div style={{ fontSize: '10px', color: 'var(--aether-muted-fg, #737373)' }}>\n deviation\n </div>\n </div>\n </button>\n );\n })}\n </div>\n );\n}\n\n/**\n * Transition heatmap component.\n */\nfunction TransitionHeatmap({ matrix }: { matrix: TransitionMatrixData }) {\n const { actions, probabilities } = matrix;\n\n if (actions.length === 0) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No transition data\n </div>\n );\n }\n\n // Get color for probability\n const getColor = (prob: number): string => {\n if (prob === 0) return 'var(--aether-muted, #f5f5f5)';\n const intensity = Math.min(255, Math.floor(prob * 255));\n return `rgba(59, 130, 246, ${prob})`;\n };\n\n return (\n <div style={{ overflow: 'auto' }}>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `auto repeat(${actions.length}, 1fr)`,\n gap: '2px',\n fontSize: '11px',\n minWidth: `${(actions.length + 1) * 60}px`,\n }}\n >\n {/* Header row */}\n <div style={{ padding: '4px' }} />\n {actions.map((action) => (\n <div\n key={action}\n style={{\n padding: '4px',\n fontWeight: 600,\n textAlign: 'center',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n transform: 'rotate(-45deg)',\n transformOrigin: 'center center',\n height: '60px',\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'center',\n }}\n title={action}\n >\n {action.length > 8 ? action.slice(0, 8) + '...' : action}\n </div>\n ))}\n\n {/* Data rows */}\n {actions.map((rowAction, i) => (\n <React.Fragment key={rowAction}>\n <div\n style={{\n padding: '4px 8px',\n fontWeight: 600,\n textAlign: 'right',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={rowAction}\n >\n {rowAction.length > 10 ? rowAction.slice(0, 10) + '...' : rowAction}\n </div>\n {actions.map((colAction, j) => {\n const prob = probabilities[i]?.[j] ?? 0;\n return (\n <div\n key={colAction}\n style={{\n padding: '4px',\n backgroundColor: getColor(prob),\n color: prob > 0.5 ? '#fff' : 'var(--aether-fg, #1a1a1a)',\n textAlign: 'center',\n borderRadius: '2px',\n cursor: 'pointer',\n }}\n title={`${rowAction} → ${colAction}: ${formatPercent(prob)}`}\n >\n {prob > 0 ? formatPercent(prob) : ''}\n </div>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n\n {/* Legend */}\n <div style={{ marginTop: '16px', display: 'flex', alignItems: 'center', gap: '8px', fontSize: '12px' }}>\n <span style={{ color: 'var(--aether-muted-fg, #737373)' }}>P(action | previous):</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <div style={{ width: '16px', height: '16px', backgroundColor: getColor(0), borderRadius: '2px' }} />\n <span style={{ marginLeft: '4px', color: 'var(--aether-muted-fg, #737373)' }}>0%</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <div style={{ width: '16px', height: '16px', backgroundColor: getColor(0.5), borderRadius: '2px' }} />\n <span style={{ marginLeft: '4px', color: 'var(--aether-muted-fg, #737373)' }}>50%</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <div style={{ width: '16px', height: '16px', backgroundColor: getColor(1), borderRadius: '2px' }} />\n <span style={{ marginLeft: '4px', color: 'var(--aether-muted-fg, #737373)' }}>100%</span>\n </div>\n </div>\n </div>\n );\n}\n\nexport { TransitionHeatmap };\n","import React, { useState, useCallback } from 'react';\nimport type { Prediction, SimulationResult } from 'aether-core';\n\n/**\n * Props for PredictionPanel component.\n */\nexport interface PredictionPanelProps {\n /** Current predictions */\n predictions: Prediction[];\n /** Loading state */\n loading?: boolean;\n /** Error message */\n error?: string;\n /** Callback to run simulation */\n onSimulate?: (action: string, context?: Record<string, unknown>) => Promise<SimulationResult>;\n /** Callback when a prediction is clicked */\n onPredictionClick?: (prediction: Prediction) => void;\n /** Whether simulation is available */\n simulationEnabled?: boolean;\n /** Maximum height */\n maxHeight?: string;\n}\n\n// Icons\nconst LightbulbIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 18h6\" />\n <path d=\"M10 22h4\" />\n <path d=\"M12 2a7 7 0 0 0-4 12.9V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.1A7 7 0 0 0 12 2z\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"5 3 19 12 5 21 5 3\" />\n </svg>\n);\n\nconst AlertTriangleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst CheckCircleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n);\n\nconst XCircleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n);\n\nconst LoaderIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ animation: 'spin 1s linear infinite' }}>\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"6\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\" />\n <line x1=\"4.93\" y1=\"4.93\" x2=\"7.76\" y2=\"7.76\" />\n <line x1=\"16.24\" y1=\"16.24\" x2=\"19.07\" y2=\"19.07\" />\n <line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" />\n <line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <line x1=\"4.93\" y1=\"19.07\" x2=\"7.76\" y2=\"16.24\" />\n <line x1=\"16.24\" y1=\"7.76\" x2=\"19.07\" y2=\"4.93\" />\n </svg>\n);\n\n/**\n * Format probability as percentage.\n */\nfunction formatProbability(probability: number): string {\n return `${Math.round(probability * 100)}%`;\n}\n\n/**\n * Get outcome color.\n */\nfunction getOutcomeColor(outcome: SimulationResult['likelyOutcome']): string {\n switch (outcome) {\n case 'success':\n return '#22c55e';\n case 'failure':\n return '#ef4444';\n case 'partial':\n return '#f59e0b';\n default:\n return '#737373';\n }\n}\n\n/**\n * Get risk level color.\n */\nfunction getRiskColor(level: 'low' | 'medium' | 'high'): string {\n switch (level) {\n case 'low':\n return '#22c55e';\n case 'medium':\n return '#f59e0b';\n case 'high':\n return '#ef4444';\n default:\n return '#737373';\n }\n}\n\n/**\n * PredictionPanel - Shows predictions and simulation sandbox.\n */\nexport function PredictionPanel({\n predictions,\n loading = false,\n error,\n onSimulate,\n onPredictionClick,\n simulationEnabled = true,\n maxHeight = '100%',\n}: PredictionPanelProps) {\n const [simulationAction, setSimulationAction] = useState('');\n const [simulationContext, setSimulationContext] = useState('');\n const [simulationResult, setSimulationResult] = useState<SimulationResult | null>(null);\n const [simulating, setSimulating] = useState(false);\n const [simulationError, setSimulationError] = useState<string | null>(null);\n\n const handleSimulate = useCallback(async () => {\n if (!onSimulate || !simulationAction.trim()) return;\n\n setSimulating(true);\n setSimulationError(null);\n\n try {\n let context: Record<string, unknown> | undefined;\n if (simulationContext.trim()) {\n try {\n context = JSON.parse(simulationContext);\n } catch {\n throw new Error('Invalid JSON in context');\n }\n }\n\n const result = await onSimulate(simulationAction.trim(), context);\n setSimulationResult(result);\n } catch (err) {\n setSimulationError(err instanceof Error ? err.message : 'Simulation failed');\n } finally {\n setSimulating(false);\n }\n }, [onSimulate, simulationAction, simulationContext]);\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n maxHeight,\n overflow: 'auto',\n }}\n >\n {/* Predictions Section */}\n <section>\n <h3\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n fontWeight: 600,\n marginBottom: '12px',\n color: 'var(--aether-fg, #171717)',\n }}\n >\n <span style={{ color: '#f59e0b' }}>\n <LightbulbIcon />\n </span>\n Next Action Predictions\n </h3>\n\n {loading ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <LoaderIcon />\n <span style={{ marginLeft: '8px' }}>Loading predictions...</span>\n </div>\n ) : error ? (\n <div\n style={{\n padding: '12px',\n backgroundColor: '#fef2f2',\n borderRadius: 'var(--aether-radius, 8px)',\n color: '#dc2626',\n fontSize: '13px',\n }}\n >\n {error}\n </div>\n ) : predictions.length === 0 ? (\n <div\n style={{\n padding: '24px',\n textAlign: 'center',\n color: 'var(--aether-muted-fg, #737373)',\n fontSize: '13px',\n }}\n >\n No predictions available yet\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {predictions.map((prediction, index) => (\n <button\n key={`${prediction.action}-${index}`}\n onClick={() => onPredictionClick?.(prediction)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '12px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-bg, #fff)',\n cursor: 'pointer',\n textAlign: 'left',\n width: '100%',\n }}\n >\n {/* Probability bar */}\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n background: `conic-gradient(#3b82f6 ${prediction.probability * 360}deg, #e5e5e5 0deg)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n backgroundColor: 'var(--aether-bg, #fff)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '11px',\n fontWeight: 600,\n }}\n >\n {formatProbability(prediction.probability)}\n </div>\n </div>\n\n {/* Prediction details */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontWeight: 500, fontSize: '14px' }}>{prediction.action}</div>\n {prediction.suggestedContent && (\n <div\n style={{\n fontSize: '12px',\n color: 'var(--aether-muted-fg, #737373)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {prediction.suggestedContent}\n </div>\n )}\n {prediction.expectedTimeMs && (\n <div\n style={{\n fontSize: '11px',\n color: 'var(--aether-muted-fg, #737373)',\n marginTop: '2px',\n }}\n >\n Expected in ~{Math.round(prediction.expectedTimeMs / 1000)}s\n </div>\n )}\n </div>\n\n {/* Confidence badge */}\n <div\n style={{\n padding: '4px 8px',\n fontSize: '11px',\n fontWeight: 500,\n backgroundColor:\n prediction.confidence > 0.7\n ? '#dcfce7'\n : prediction.confidence > 0.4\n ? '#fef3c7'\n : '#f5f5f5',\n color:\n prediction.confidence > 0.7\n ? '#166534'\n : prediction.confidence > 0.4\n ? '#92400e'\n : '#525252',\n borderRadius: '4px',\n }}\n >\n {Math.round(prediction.confidence * 100)}% confident\n </div>\n </button>\n ))}\n </div>\n )}\n </section>\n\n {/* Simulation Section */}\n {simulationEnabled && onSimulate && (\n <section\n style={{\n borderTop: '1px solid var(--aether-border, #e5e5e5)',\n paddingTop: '16px',\n }}\n >\n <h3\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n fontWeight: 600,\n marginBottom: '12px',\n color: 'var(--aether-fg, #171717)',\n }}\n >\n <span style={{ color: '#8b5cf6' }}>\n <PlayIcon />\n </span>\n Simulation Sandbox\n </h3>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <div>\n <label\n style={{\n display: 'block',\n fontSize: '12px',\n fontWeight: 500,\n marginBottom: '4px',\n }}\n >\n Proposed Action\n </label>\n <input\n type=\"text\"\n value={simulationAction}\n onChange={(e) => setSimulationAction(e.target.value)}\n placeholder=\"e.g., checkout, search, submit\"\n style={{\n width: '100%',\n padding: '8px 12px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n fontSize: '13px',\n }}\n />\n </div>\n\n <div>\n <label\n style={{\n display: 'block',\n fontSize: '12px',\n fontWeight: 500,\n marginBottom: '4px',\n }}\n >\n Context (JSON, optional)\n </label>\n <textarea\n value={simulationContext}\n onChange={(e) => setSimulationContext(e.target.value)}\n placeholder='{\"productId\": \"123\", \"quantity\": 2}'\n rows={2}\n style={{\n width: '100%',\n padding: '8px 12px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n fontSize: '13px',\n fontFamily: 'monospace',\n resize: 'vertical',\n }}\n />\n </div>\n\n <button\n onClick={handleSimulate}\n disabled={simulating || !simulationAction.trim()}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '10px 16px',\n backgroundColor: simulating ? '#a78bfa' : '#8b5cf6',\n color: '#fff',\n border: 'none',\n borderRadius: 'var(--aether-radius, 8px)',\n fontSize: '13px',\n fontWeight: 500,\n cursor: simulating || !simulationAction.trim() ? 'not-allowed' : 'pointer',\n opacity: !simulationAction.trim() ? 0.5 : 1,\n }}\n >\n {simulating ? (\n <>\n <LoaderIcon />\n Simulating...\n </>\n ) : (\n <>\n <PlayIcon />\n Run Simulation\n </>\n )}\n </button>\n\n {simulationError && (\n <div\n style={{\n padding: '12px',\n backgroundColor: '#fef2f2',\n borderRadius: 'var(--aether-radius, 8px)',\n color: '#dc2626',\n fontSize: '13px',\n }}\n >\n {simulationError}\n </div>\n )}\n\n {/* Simulation Result */}\n {simulationResult && (\n <SimulationResultView result={simulationResult} />\n )}\n </div>\n </section>\n )}\n\n <style>{`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n}\n\n/**\n * Display simulation result.\n */\nfunction SimulationResultView({ result }: { result: SimulationResult }) {\n const outcomeColor = getOutcomeColor(result.likelyOutcome);\n\n return (\n <div\n style={{\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '12px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n }}\n >\n <span style={{ color: outcomeColor }}>\n {result.likelyOutcome === 'success' ? (\n <CheckCircleIcon />\n ) : result.likelyOutcome === 'failure' ? (\n <XCircleIcon />\n ) : (\n <AlertTriangleIcon />\n )}\n </span>\n <div style={{ flex: 1 }}>\n <div style={{ fontWeight: 500, fontSize: '14px' }}>\n Likely Outcome:{' '}\n <span style={{ color: outcomeColor, textTransform: 'capitalize' }}>\n {result.likelyOutcome}\n </span>\n </div>\n <div style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {Math.round(result.confidence * 100)}% confidence\n </div>\n </div>\n </div>\n\n {/* Similar Past Cases */}\n {result.similarPastCases.length > 0 && (\n <div\n style={{\n padding: '12px',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n }}\n >\n <h4\n style={{\n fontSize: '12px',\n fontWeight: 600,\n marginBottom: '8px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n Similar Past Cases\n </h4>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n {result.similarPastCases.slice(0, 3).map((pastCase, index) => (\n <div\n key={index}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px',\n backgroundColor: 'var(--aether-bg, #fff)',\n borderRadius: '4px',\n fontSize: '12px',\n }}\n >\n <span style={{ fontFamily: 'monospace', color: 'var(--aether-muted-fg, #737373)' }}>\n {pastCase.trajectoryId.slice(0, 8)}...\n </span>\n <span\n style={{\n color: getOutcomeColor(pastCase.outcome as SimulationResult['likelyOutcome']),\n fontWeight: 500,\n }}\n >\n {pastCase.outcome}\n </span>\n <span style={{ color: 'var(--aether-muted-fg, #737373)' }}>\n {Math.round(pastCase.similarity * 100)}% similar\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Predicted Follow-up */}\n {result.predictedFollowUp.length > 0 && (\n <div\n style={{\n padding: '12px',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n }}\n >\n <h4\n style={{\n fontSize: '12px',\n fontWeight: 600,\n marginBottom: '8px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n Predicted Follow-up Actions\n </h4>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '6px' }}>\n {result.predictedFollowUp.map((prediction, index) => (\n <span\n key={index}\n style={{\n padding: '4px 8px',\n backgroundColor: '#eff6ff',\n color: '#1d4ed8',\n borderRadius: '4px',\n fontSize: '12px',\n }}\n >\n {prediction.action} ({formatProbability(prediction.probability)})\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Risk Assessment */}\n {result.riskAssessment && (\n <div style={{ padding: '12px' }}>\n <h4\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n fontSize: '12px',\n fontWeight: 600,\n marginBottom: '8px',\n color: getRiskColor(result.riskAssessment.level),\n }}\n >\n <AlertTriangleIcon />\n Risk Level: {result.riskAssessment.level.toUpperCase()}\n </h4>\n {result.riskAssessment.risks.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {result.riskAssessment.risks.map((risk, index) => (\n <div\n key={index}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: '12px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <span>{risk.description}</span>\n <span style={{ fontWeight: 500 }}>\n {formatProbability(risk.probability)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport type { Anomaly, AnomalySeverity } from 'aether-core';\n\n/**\n * Props for AnomalyAlerts component.\n */\nexport interface AnomalyAlertsProps {\n /** List of anomalies */\n anomalies: Anomaly[];\n /** Loading state */\n loading?: boolean;\n /** Error message */\n error?: string;\n /** Callback when an anomaly is clicked */\n onAnomalyClick?: (anomaly: Anomaly) => void;\n /** Callback to dismiss an anomaly */\n onDismiss?: (anomalyId: string) => void;\n /** Whether to show dismissed anomalies */\n showDismissed?: boolean;\n /** Minimum severity to display */\n minSeverity?: AnomalySeverity;\n /** Maximum height */\n maxHeight?: string;\n /** Show as compact notification list */\n compact?: boolean;\n}\n\n// Icons\nconst AlertTriangleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst XIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n);\n\nconst ChevronUpIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n);\n\nconst BellIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n </svg>\n);\n\n/**\n * Severity levels for filtering.\n */\nconst SEVERITY_ORDER: AnomalySeverity[] = ['low', 'medium', 'high'];\n\n/**\n * Get severity color.\n */\nfunction getSeverityColor(severity: AnomalySeverity): string {\n switch (severity) {\n case 'high':\n return '#ef4444';\n case 'medium':\n return '#f59e0b';\n case 'low':\n return '#3b82f6';\n default:\n return '#737373';\n }\n}\n\n/**\n * Get severity background color.\n */\nfunction getSeverityBgColor(severity: AnomalySeverity): string {\n switch (severity) {\n case 'high':\n return '#fef2f2';\n case 'medium':\n return '#fffbeb';\n case 'low':\n return '#eff6ff';\n default:\n return '#f5f5f5';\n }\n}\n\n/**\n * Format timestamp.\n */\nfunction formatTime(timestamp: string): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return date.toLocaleDateString();\n}\n\n/**\n * AnomalyAlerts - Real-time anomaly notification panel.\n */\nexport function AnomalyAlerts({\n anomalies,\n loading = false,\n error,\n onAnomalyClick,\n onDismiss,\n minSeverity = 'low',\n maxHeight = '100%',\n compact = false,\n}: AnomalyAlertsProps) {\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [filterSeverity, setFilterSeverity] = useState<AnomalySeverity | 'all'>('all');\n\n const filteredAnomalies = useMemo(() => {\n const minIndex = SEVERITY_ORDER.indexOf(minSeverity);\n\n return anomalies.filter((anomaly) => {\n const severityIndex = SEVERITY_ORDER.indexOf(anomaly.severity);\n if (severityIndex < minIndex) return false;\n if (filterSeverity !== 'all' && anomaly.severity !== filterSeverity) return false;\n return true;\n });\n }, [anomalies, minSeverity, filterSeverity]);\n\n const severityCounts = useMemo(() => {\n const counts: Record<AnomalySeverity, number> = { low: 0, medium: 0, high: 0 };\n for (const anomaly of anomalies) {\n counts[anomaly.severity]++;\n }\n return counts;\n }, [anomalies]);\n\n const toggleExpand = (id: string) => {\n setExpandedId(expandedId === id ? null : id);\n };\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n Loading anomalies...\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '12px',\n backgroundColor: '#fef2f2',\n borderRadius: 'var(--aether-radius, 8px)',\n color: '#dc2626',\n fontSize: '13px',\n }}\n >\n {error}\n </div>\n );\n }\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n maxHeight,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <h3\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--aether-fg, #171717)',\n margin: 0,\n }}\n >\n <span style={{ color: '#ef4444' }}>\n <BellIcon />\n </span>\n Anomaly Alerts\n {filteredAnomalies.length > 0 && (\n <span\n style={{\n padding: '2px 8px',\n fontSize: '12px',\n fontWeight: 600,\n backgroundColor: '#ef4444',\n color: '#fff',\n borderRadius: '10px',\n }}\n >\n {filteredAnomalies.length}\n </span>\n )}\n </h3>\n\n {/* Filter buttons */}\n <div style={{ display: 'flex', gap: '4px' }}>\n <FilterButton\n active={filterSeverity === 'all'}\n onClick={() => setFilterSeverity('all')}\n count={anomalies.length}\n >\n All\n </FilterButton>\n <FilterButton\n active={filterSeverity === 'high'}\n onClick={() => setFilterSeverity('high')}\n count={severityCounts.high}\n color=\"#ef4444\"\n >\n High\n </FilterButton>\n <FilterButton\n active={filterSeverity === 'medium'}\n onClick={() => setFilterSeverity('medium')}\n count={severityCounts.medium}\n color=\"#f59e0b\"\n >\n Med\n </FilterButton>\n <FilterButton\n active={filterSeverity === 'low'}\n onClick={() => setFilterSeverity('low')}\n count={severityCounts.low}\n color=\"#3b82f6\"\n >\n Low\n </FilterButton>\n </div>\n </div>\n\n {/* Anomaly List */}\n <div\n style={{\n flex: 1,\n overflow: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n }}\n >\n {filteredAnomalies.length === 0 ? (\n <div\n style={{\n padding: '24px',\n textAlign: 'center',\n color: 'var(--aether-muted-fg, #737373)',\n fontSize: '13px',\n }}\n >\n No anomalies detected\n </div>\n ) : (\n filteredAnomalies.map((anomaly) => (\n <AnomalyCard\n key={anomaly.eventId}\n anomaly={anomaly}\n expanded={expandedId === anomaly.eventId}\n onToggleExpand={() => toggleExpand(anomaly.eventId)}\n onClick={() => onAnomalyClick?.(anomaly)}\n onDismiss={onDismiss ? () => onDismiss(anomaly.eventId) : undefined}\n compact={compact}\n />\n ))\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Filter button component.\n */\nfunction FilterButton({\n active,\n onClick,\n count,\n color,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n count: number;\n color?: string;\n children: React.ReactNode;\n}) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n border: `1px solid ${active ? color || '#3b82f6' : 'var(--aether-border, #e5e5e5)'}`,\n borderRadius: '4px',\n backgroundColor: active ? `${color || '#3b82f6'}10` : 'transparent',\n color: active ? color || '#3b82f6' : 'var(--aether-muted-fg, #737373)',\n fontSize: '11px',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n {children}\n {count > 0 && (\n <span\n style={{\n padding: '1px 4px',\n fontSize: '10px',\n backgroundColor: active ? color || '#3b82f6' : 'var(--aether-muted, #f5f5f5)',\n color: active ? '#fff' : 'var(--aether-muted-fg, #737373)',\n borderRadius: '3px',\n }}\n >\n {count}\n </span>\n )}\n </button>\n );\n}\n\n/**\n * Individual anomaly card.\n */\nfunction AnomalyCard({\n anomaly,\n expanded,\n onToggleExpand,\n onClick,\n onDismiss,\n compact,\n}: {\n anomaly: Anomaly;\n expanded: boolean;\n onToggleExpand: () => void;\n onClick?: () => void;\n onDismiss?: () => void;\n compact: boolean;\n}) {\n const color = getSeverityColor(anomaly.severity);\n const bgColor = getSeverityBgColor(anomaly.severity);\n\n return (\n <div\n style={{\n border: `1px solid ${color}40`,\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: bgColor,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: compact ? '8px 12px' : '12px',\n cursor: 'pointer',\n }}\n onClick={onClick}\n >\n <span style={{ color, flexShrink: 0 }}>\n <AlertTriangleIcon />\n </span>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n }}\n >\n <span\n style={{\n padding: '2px 6px',\n fontSize: '10px',\n fontWeight: 600,\n backgroundColor: color,\n color: '#fff',\n borderRadius: '3px',\n textTransform: 'uppercase',\n }}\n >\n {anomaly.severity}\n </span>\n <span\n style={{\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--aether-fg, #171717)',\n }}\n >\n {anomaly.event.action}\n </span>\n <span\n style={{\n fontSize: '11px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n by {anomaly.event.actor}\n </span>\n </div>\n\n <div\n style={{\n fontSize: '12px',\n color: 'var(--aether-muted-fg, #737373)',\n marginTop: '4px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: compact ? 'nowrap' : 'normal',\n }}\n >\n {anomaly.reason}\n </div>\n </div>\n\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: '11px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n {formatTime(anomaly.detectedAt)}\n </span>\n\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpand();\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--aether-muted-fg, #737373)',\n cursor: 'pointer',\n borderRadius: '4px',\n }}\n >\n {expanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n </button>\n\n {onDismiss && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDismiss();\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--aether-muted-fg, #737373)',\n cursor: 'pointer',\n borderRadius: '4px',\n }}\n >\n <XIcon />\n </button>\n )}\n </div>\n </div>\n\n {/* Expanded Details */}\n {expanded && (\n <div\n style={{\n padding: '12px',\n borderTop: `1px solid ${color}20`,\n backgroundColor: 'var(--aether-bg, #fff)',\n }}\n >\n <div style={{ display: 'grid', gap: '12px' }}>\n {/* Deviation Score */}\n <div>\n <label\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: 'var(--aether-muted-fg, #737373)',\n textTransform: 'uppercase',\n }}\n >\n Deviation Score\n </label>\n <div\n style={{\n marginTop: '4px',\n height: '8px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '4px',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: `${anomaly.deviationScore * 100}%`,\n height: '100%',\n backgroundColor: color,\n }}\n />\n </div>\n <span style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)' }}>\n {Math.round(anomaly.deviationScore * 100)}%\n </span>\n </div>\n\n {/* Expected Actions */}\n {anomaly.expectedActions && anomaly.expectedActions.length > 0 && (\n <div>\n <label\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: 'var(--aether-muted-fg, #737373)',\n textTransform: 'uppercase',\n }}\n >\n Expected Actions\n </label>\n <div\n style={{\n marginTop: '4px',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n }}\n >\n {anomaly.expectedActions.map((exp, index) => (\n <span\n key={index}\n style={{\n padding: '2px 8px',\n fontSize: '11px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '4px',\n }}\n >\n {exp.action} ({Math.round(exp.probability * 100)}%)\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Context */}\n {anomaly.context && (\n <div>\n <label\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: 'var(--aether-muted-fg, #737373)',\n textTransform: 'uppercase',\n }}\n >\n Context\n </label>\n <div\n style={{\n marginTop: '4px',\n padding: '8px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n }}\n >\n {anomaly.context.patternId && (\n <div>Pattern: {anomaly.context.patternId}</div>\n )}\n {anomaly.context.patternPosition !== undefined && (\n <div>Position in pattern: {anomaly.context.patternPosition}</div>\n )}\n {anomaly.context.previousEvents && anomaly.context.previousEvents.length > 0 && (\n <div>Previous events: {anomaly.context.previousEvents.length}</div>\n )}\n </div>\n </div>\n )}\n\n {/* Event Details */}\n <div>\n <label\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: 'var(--aether-muted-fg, #737373)',\n textTransform: 'uppercase',\n }}\n >\n Event Content\n </label>\n <div\n style={{\n marginTop: '4px',\n padding: '8px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: 1.4,\n }}\n >\n {anomaly.event.content}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\n\nexport interface AddMemoryFormProps {\n onAdd: (content: string, actor: string, context?: Record<string, unknown>) => Promise<void>;\n loading?: boolean;\n defaultActor?: string;\n placeholder?: string;\n className?: string;\n}\n\nconst ChevronDownIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n);\n\nconst ChevronUpIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n);\n\nexport function AddMemoryForm({\n onAdd,\n loading = false,\n defaultActor = 'user',\n placeholder = 'What happened? (e.g., \"User clicked the buy button\")',\n className,\n}: AddMemoryFormProps) {\n const [content, setContent] = useState('');\n const [actor, setActor] = useState(defaultActor);\n const [contextJson, setContextJson] = useState('');\n const [showAdvanced, setShowAdvanced] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!content.trim()) {\n setError('Content is required');\n return;\n }\n\n let context: Record<string, unknown> | undefined;\n if (contextJson.trim()) {\n try {\n context = JSON.parse(contextJson);\n } catch {\n setError('Invalid JSON in context field');\n return;\n }\n }\n\n try {\n await onAdd(content.trim(), actor.trim() || 'user', context);\n setContent('');\n setContextJson('');\n } catch (err) {\n setError(String(err));\n }\n },\n [content, actor, contextJson, onAdd]\n );\n\n const cardStyle: React.CSSProperties = {\n padding: '16px',\n borderRadius: 'var(--aether-radius, 8px)',\n border: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n };\n\n const inputStyle: React.CSSProperties = {\n width: '100%',\n padding: '10px 12px',\n fontSize: '14px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'transparent',\n color: 'var(--aether-fg, #1a1a1a)',\n outline: 'none',\n };\n\n const buttonStyle: React.CSSProperties = {\n width: '100%',\n padding: '10px 16px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: loading || !content.trim() ? 'var(--aether-muted, #f5f5f5)' : 'var(--aether-primary, #3b82f6)',\n color: loading || !content.trim() ? 'var(--aether-muted-fg, #737373)' : 'var(--aether-primary-fg, #fff)',\n cursor: loading || !content.trim() ? 'not-allowed' : 'pointer',\n };\n\n const toggleButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n fontSize: '14px',\n color: 'var(--aether-muted-fg, #737373)',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: '4px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--aether-muted-fg, #737373)',\n };\n\n const errorStyle: React.CSSProperties = {\n padding: '8px',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: '#fee2e2',\n color: '#b91c1c',\n fontSize: '14px',\n };\n\n return (\n <div className={className} style={cardStyle}>\n <form onSubmit={handleSubmit}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <input\n type=\"text\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={placeholder}\n disabled={loading}\n style={inputStyle}\n />\n <button type=\"submit\" disabled={loading || !content.trim()} style={buttonStyle}>\n {loading ? 'Adding...' : 'Add Memory'}\n </button>\n </div>\n\n <button type=\"button\" style={toggleButtonStyle} onClick={() => setShowAdvanced(!showAdvanced)}>\n {showAdvanced ? <ChevronUpIcon /> : <ChevronDownIcon />}\n {showAdvanced ? 'Hide options' : 'Show options'}\n </button>\n\n {showAdvanced && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px', paddingTop: '8px' }}>\n <div>\n <label style={labelStyle}>Actor</label>\n <input\n type=\"text\"\n value={actor}\n onChange={(e) => setActor(e.target.value)}\n placeholder=\"user\"\n style={inputStyle}\n />\n </div>\n <div>\n <label style={labelStyle}>Context (JSON)</label>\n <textarea\n value={contextJson}\n onChange={(e) => setContextJson(e.target.value)}\n placeholder='{\"key\": \"value\"}'\n rows={2}\n style={{ ...inputStyle, resize: 'vertical', fontFamily: 'monospace' }}\n />\n </div>\n </div>\n )}\n\n {error && <div style={{ ...errorStyle, marginTop: '12px' }}>{error}</div>}\n </form>\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport type { RetrievalType } from 'aether-core';\nimport { Search } from 'lucide-react';\n\nexport interface SearchBarProps {\n onSearch: (query: string, options: SearchOptions) => Promise<void>;\n loading?: boolean;\n placeholder?: string;\n className?: string;\n}\n\nexport interface SearchOptions {\n retrievalType: RetrievalType;\n limit: number;\n actor?: string;\n}\n\nconst SlidersIcon = () => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\" />\n <line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\" />\n <line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\" />\n <line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\" />\n <line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\" />\n <line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\" />\n </svg>\n);\n\nconst RETRIEVAL_TYPES: { value: RetrievalType; label: string }[] = [\n { value: 'hybrid', label: 'Hybrid' },\n { value: 'semantic', label: 'Semantic' },\n { value: 'temporal', label: 'Temporal' },\n { value: 'relational', label: 'Relational' },\n];\n\nexport function SearchBar({\n onSearch,\n loading = false,\n placeholder = 'Search memories...',\n className,\n}: SearchBarProps) {\n const [query, setQuery] = useState('');\n const [retrievalType, setRetrievalType] = useState<RetrievalType>('hybrid');\n const [limit, setLimit] = useState(10);\n const [actor, setActor] = useState('');\n const [showFilters, setShowFilters] = useState(false);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!query.trim()) return;\n\n await onSearch(query.trim(), {\n retrievalType,\n limit,\n actor: actor.trim() || undefined,\n });\n },\n [query, retrievalType, limit, actor, onSearch]\n );\n\n const inputContainerStyle: React.CSSProperties = {\n position: 'relative',\n flex: 1,\n };\n\n const inputStyle: React.CSSProperties = {\n width: '100%',\n padding: '10px 12px 10px 40px',\n fontSize: '14px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'transparent',\n color: 'var(--aether-fg, #1a1a1a)',\n outline: 'none',\n };\n\n const iconStyle: React.CSSProperties = {\n position: 'absolute',\n left: '12px',\n top: '50%',\n transform: 'translateY(-50%)',\n color: 'var(--aether-muted-fg, #737373)',\n };\n\n const buttonStyle: React.CSSProperties = {\n padding: '10px 16px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor:\n loading || !query.trim() ? 'var(--aether-muted, #f5f5f5)' : 'var(--aether-primary, #3b82f6)',\n color:\n loading || !query.trim()\n ? 'var(--aether-muted-fg, #737373)'\n : 'var(--aether-primary-fg, #fff)',\n cursor: loading || !query.trim() ? 'not-allowed' : 'pointer',\n };\n\n const iconButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '40px',\n height: '40px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: showFilters ? 'var(--aether-muted, #f5f5f5)' : 'transparent',\n color: showFilters ? 'var(--aether-primary, #3b82f6)' : 'var(--aether-muted-fg, #737373)',\n cursor: 'pointer',\n };\n\n const filterPanelStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '16px',\n padding: '16px',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n };\n\n const selectStyle: React.CSSProperties = {\n padding: '8px 12px',\n fontSize: '14px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-bg, #fff)',\n color: 'var(--aether-fg, #1a1a1a)',\n cursor: 'pointer',\n outline: 'none',\n };\n\n const smallInputStyle: React.CSSProperties = {\n width: '150px',\n padding: '8px 12px',\n fontSize: '14px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'transparent',\n color: 'var(--aether-fg, #1a1a1a)',\n outline: 'none',\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: '4px',\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--aether-fg, #1a1a1a)',\n };\n\n return (\n <form\n className={className}\n onSubmit={handleSubmit}\n style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}\n >\n <div style={{ display: 'flex', gap: '8px' }}>\n <div style={inputContainerStyle}>\n <span style={iconStyle}>\n <Search />\n </span>\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n disabled={loading}\n style={inputStyle}\n />\n </div>\n\n <button type=\"button\" style={iconButtonStyle} onClick={() => setShowFilters(!showFilters)}>\n <SlidersIcon />\n </button>\n\n <button type=\"submit\" disabled={loading || !query.trim()} style={buttonStyle}>\n {loading ? 'Searching...' : 'Search'}\n </button>\n </div>\n\n {showFilters && (\n <div style={filterPanelStyle}>\n <div>\n <label style={labelStyle}>Retrieval Type</label>\n <select\n value={retrievalType}\n onChange={(e) => setRetrievalType(e.target.value as RetrievalType)}\n style={selectStyle}\n >\n {RETRIEVAL_TYPES.map((type) => (\n <option key={type.value} value={type.value}>\n {type.label}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label style={labelStyle}>Max Results</label>\n <select\n value={limit}\n onChange={(e) => setLimit(parseInt(e.target.value, 10))}\n style={selectStyle}\n >\n {[5, 10, 20, 50, 100].map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label style={labelStyle}>Actor (optional)</label>\n <input\n type=\"text\"\n value={actor}\n onChange={(e) => setActor(e.target.value)}\n placeholder=\"Filter by actor\"\n style={smallInputStyle}\n />\n </div>\n </div>\n )}\n </form>\n );\n}\n","import React from 'react';\nimport type { MemoryStats } from 'aether-core';\nimport { Calendar1, Clock3, GalleryVerticalEnd, Users } from 'lucide-react';\n\nexport interface StatsPanelProps {\n stats: MemoryStats | null;\n loading?: boolean;\n className?: string;\n}\n\ninterface StatItemProps {\n label: string;\n value: string | number;\n icon: React.ReactNode;\n}\n\nfunction StatItem({ label, value, icon }: StatItemProps) {\n const cardStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '16px',\n borderRadius: 'var(--aether-radius, 8px)',\n border: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n };\n\n const iconContainerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '40px',\n height: '40px',\n borderRadius: '8px',\n // backgroundColor: '#dbeafe',\n color: '#2563eb',\n };\n\n return (\n <div style={cardStyle}>\n <div style={iconContainerStyle}>{icon}</div>\n <div>\n <div style={{ fontSize: '24px', fontWeight: 600, color: 'var(--aether-fg, #1a1a1a)' }}>\n {value}\n </div>\n <div style={{ fontSize: '14px', color: 'var(--aether-muted-fg, #737373)' }}>{label}</div>\n </div>\n </div>\n );\n}\n\nexport function StatsPanel({ stats, loading = false, className }: StatsPanelProps) {\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',\n gap: '12px',\n };\n\n const skeletonStyle: React.CSSProperties = {\n height: '88px',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n animation: 'pulse 2s infinite',\n };\n\n if (loading) {\n return (\n <div className={className} style={gridStyle}>\n <style>{`@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }`}</style>\n {[1, 2, 3, 4].map((i) => (\n <div key={i} style={skeletonStyle} />\n ))}\n </div>\n );\n }\n\n if (!stats) {\n return (\n <div\n className={className}\n style={{\n padding: '24px',\n textAlign: 'center',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No statistics available\n </div>\n );\n }\n\n const formatDate = (dateStr?: string) => {\n if (!dateStr) return '—';\n\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n\n // Less than 24 hours - show relative time\n if (diffMs >= 0 && diffMs < 24 * 60 * 60 * 1000) {\n if (diffSeconds < 60) {\n return diffSeconds <= 10 ? 'a few seconds ago' : `${diffSeconds} seconds ago`;\n }\n if (diffMinutes < 60) {\n return diffMinutes === 1 ? '1 minute ago' : `${diffMinutes} minutes ago`;\n }\n return diffHours === 1 ? '1 hour ago' : `${diffHours} hours ago`;\n }\n\n // 24+ hours - show date like \"20 Jan 2025\"\n return date.toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n });\n };\n\n return (\n <div className={className} style={gridStyle}>\n <StatItem\n label=\"Total Memories\"\n value={stats.totalEvents.toLocaleString()}\n icon={<GalleryVerticalEnd className=\"w-5 h-5\" />}\n />\n <StatItem\n label=\"Unique Actors\"\n value={stats.uniqueActors}\n icon={<Users className=\"w-5 h-5\" />}\n />\n <StatItem\n label=\"First Event\"\n value={formatDate(stats.oldestEvent)}\n icon={<Calendar1 className=\"w-5 h-5\" />}\n />\n <StatItem\n label=\"Latest Event\"\n value={formatDate(stats.newestEvent)}\n icon={<Clock3 className=\"h-5 w-5\" />}\n />\n </div>\n );\n}\n","import React from 'react';\n\nexport interface ActorSelectorProps {\n actors: string[];\n selectedActor: string | null;\n onSelect: (actor: string | null) => void;\n loading?: boolean;\n className?: string;\n}\n\nexport function ActorSelector({\n actors,\n selectedActor,\n onSelect,\n loading = false,\n className,\n}: ActorSelectorProps) {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '8px',\n };\n\n const skeletonStyle: React.CSSProperties = {\n height: '32px',\n width: '80px',\n borderRadius: '9999px',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n animation: 'pulse 2s infinite',\n };\n\n const buttonStyle = (isSelected: boolean): React.CSSProperties => ({\n padding: '6px 16px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '9999px',\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n backgroundColor: isSelected ? 'var(--aether-primary, #3b82f6)' : 'transparent',\n color: isSelected ? 'var(--aether-primary-fg, #fff)' : 'var(--aether-muted-fg, #737373)',\n });\n\n if (loading) {\n return (\n <div className={className} style={containerStyle}>\n <style>{`@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }`}</style>\n {[1, 2, 3].map((i) => (\n <div key={i} style={skeletonStyle} />\n ))}\n </div>\n );\n }\n\n if (actors.length === 0) {\n return (\n <div\n className={className}\n style={{\n padding: '12px',\n textAlign: 'center',\n fontSize: '14px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n No actors found\n </div>\n );\n }\n\n return (\n <div className={className} style={containerStyle}>\n <span style={{ marginRight: '4px', fontSize: '14px', color: 'var(--aether-muted-fg, #737373)' }}>\n Filter by actor:\n </span>\n\n <button style={buttonStyle(selectedActor === null)} onClick={() => onSelect(null)}>\n All\n </button>\n\n {actors.map((actor) => (\n <button\n key={actor}\n style={buttonStyle(selectedActor === actor)}\n onClick={() => onSelect(actor)}\n >\n {actor}\n </button>\n ))}\n </div>\n );\n}\n","import { Loader } from 'lucide-react';\nimport React from 'react';\n\nexport interface ConnectionStatusProps {\n connected: boolean;\n error?: string | null;\n onReconnect?: () => void;\n className?: string;\n}\n\nconst WifiIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12.55a11 11 0 0 1 14.08 0\" />\n <path d=\"M1.42 9a16 16 0 0 1 21.16 0\" />\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\n <line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\" />\n </svg>\n);\n\nconst WifiOffIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M16.72 11.06A10.94 10.94 0 0 1 19 12.55\" />\n <path d=\"M5 12.55a10.94 10.94 0 0 1 5.17-2.39\" />\n <path d=\"M10.71 5.05A16 16 0 0 1 22.58 9\" />\n <path d=\"M1.42 9a15.91 15.91 0 0 1 4.7-2.88\" />\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\n <line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\" />\n </svg>\n);\n\nexport function ConnectionStatus({\n connected,\n error,\n onReconnect,\n className,\n}: ConnectionStatusProps) {\n const isConnecting = !connected && !error;\n\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '9999px',\n padding: '6px 12px',\n fontSize: '12px',\n fontWeight: 500,\n transition: 'background-color 0.2s',\n };\n\n const statusStyle: React.CSSProperties = connected\n ? { backgroundColor: '#dcfce7', color: '#15803d' }\n : error\n ? { backgroundColor: '#fee2e2', color: '#b91c1c' }\n : { backgroundColor: '#fef3c7', color: '#b45309' };\n\n const buttonStyle: React.CSSProperties = {\n marginLeft: '4px',\n padding: '2px 8px',\n fontSize: '11px',\n border: '1px solid currentColor',\n borderRadius: '4px',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n };\n\n return (\n <div className={className} style={{ ...baseStyle, ...statusStyle }}>\n <style>{`@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }`}</style>\n {connected ? <WifiIcon /> : error ? <WifiOffIcon /> : <Loader />}\n <span>{connected ? 'Connected' : error ? 'Connection Error' : 'Connecting...'}</span>\n {!connected && onReconnect && (\n <button style={buttonStyle} onClick={onReconnect}>\n Retry\n </button>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { Loader, Server, Wifi, WifiOff, ExternalLink } from 'lucide-react';\n\nexport interface ConnectionScreenProps {\n onConnect: (url: string, apiKey?: string) => void;\n defaultUrl?: string;\n isConnecting?: boolean;\n error?: string | null;\n}\n\nconst STORAGE_KEY = 'aether-studio-connection';\n\nexport function ConnectionScreen({\n onConnect,\n defaultUrl,\n isConnecting = false,\n error,\n}: ConnectionScreenProps) {\n const [url, setUrl] = useState(defaultUrl || 'http://localhost:3456');\n const [apiKey, setApiKey] = useState('');\n const [showApiKey, setShowApiKey] = useState(false);\n\n // Load saved connection on mount\n useEffect(() => {\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const { url: savedUrl, apiKey: savedKey } = JSON.parse(saved);\n if (savedUrl) setUrl(savedUrl);\n if (savedKey) {\n setApiKey(savedKey);\n setShowApiKey(true);\n }\n }\n } catch {\n // Ignore parse errors\n }\n }, []);\n\n const handleConnect = () => {\n // Save connection for next time\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ url, apiKey: apiKey || undefined }));\n } catch {\n // Ignore storage errors\n }\n onConnect(url, apiKey || undefined);\n };\n\n const selectServer = (serverUrl: string) => {\n setUrl(serverUrl);\n };\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n padding: '24px',\n };\n\n const cardStyle: React.CSSProperties = {\n backgroundColor: 'var(--aether-bg, #ffffff)',\n borderRadius: '12px',\n padding: '32px',\n maxWidth: '420px',\n width: '100%',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: '24px',\n fontWeight: 600,\n color: 'var(--aether-fg, #1a1a1a)',\n marginBottom: '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n };\n\n const subtitleStyle: React.CSSProperties = {\n fontSize: '14px',\n color: 'var(--aether-muted-fg, #737373)',\n marginBottom: '24px',\n };\n\n const inputGroupStyle: React.CSSProperties = {\n marginBottom: '16px',\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: '13px',\n fontWeight: 500,\n color: 'var(--aether-fg, #1a1a1a)',\n marginBottom: '6px',\n };\n\n const inputStyle: React.CSSProperties = {\n width: '100%',\n padding: '10px 12px',\n fontSize: '14px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: '8px',\n backgroundColor: 'var(--aether-bg, #ffffff)',\n color: 'var(--aether-fg, #1a1a1a)',\n outline: 'none',\n boxSizing: 'border-box',\n };\n\n const buttonStyle: React.CSSProperties = {\n width: '100%',\n padding: '12px',\n fontSize: '14px',\n fontWeight: 500,\n backgroundColor: 'var(--aether-primary, #3b82f6)',\n color: 'var(--aether-primary-fg, #ffffff)',\n border: 'none',\n borderRadius: '8px',\n cursor: isConnecting ? 'not-allowed' : 'pointer',\n opacity: isConnecting ? 0.7 : 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n };\n\n const secondaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n backgroundColor: 'transparent',\n color: 'var(--aether-primary, #3b82f6)',\n border: '1px solid var(--aether-border, #e5e5e5)',\n marginBottom: '16px',\n };\n\n const errorStyle: React.CSSProperties = {\n backgroundColor: '#fee2e2',\n color: '#b91c1c',\n padding: '12px',\n borderRadius: '8px',\n fontSize: '13px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n };\n\n const linkStyle: React.CSSProperties = {\n color: 'var(--aether-primary, #3b82f6)',\n textDecoration: 'none',\n fontSize: '12px',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n };\n\n const serverListStyle: React.CSSProperties = {\n marginBottom: '16px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: '8px',\n overflow: 'hidden',\n };\n\n const serverItemStyle = (available: boolean, selected: boolean): React.CSSProperties => ({\n padding: '10px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: selected ? 'var(--aether-muted, #f5f5f5)' : 'transparent',\n cursor: available ? 'pointer' : 'default',\n opacity: available ? 1 : 0.5,\n });\n\n return (\n <div style={containerStyle}>\n <div style={cardStyle}>\n <h1 style={titleStyle}>\n <Server size={24} color=\"var(--aether-primary, #3b82f6)\" />\n Aether Studio\n </h1>\n <p style={subtitleStyle}>Connect to an Aether server to explore your memory data.</p>\n\n {error && (\n <div style={errorStyle}>\n <WifiOff size={16} />\n {error}\n </div>\n )}\n\n <div style={inputGroupStyle}>\n <label style={labelStyle}>Server URL</label>\n <input\n type=\"text\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"http://localhost:3000\"\n style={inputStyle}\n />\n </div>\n\n {showApiKey ? (\n <div style={inputGroupStyle}>\n <label style={labelStyle}>\n API Key{' '}\n <span style={{ color: 'var(--aether-muted-fg)', fontWeight: 400 }}>(optional)</span>\n </label>\n <input\n type=\"password\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Enter API key if required\"\n style={inputStyle}\n />\n </div>\n ) : (\n <div style={{ marginBottom: '16px' }}>\n <span style={linkStyle} onClick={() => setShowApiKey(true)}>\n + Add API key\n </span>\n </div>\n )}\n\n <button style={buttonStyle} onClick={handleConnect} disabled={isConnecting || !url}>\n {isConnecting ? (\n <>\n <Loader size={16} style={{ animation: 'spin 1s linear infinite' }} />\n Connecting...\n </>\n ) : (\n <>\n <Wifi size={16} />\n Connect\n </>\n )}\n </button>\n\n <div style={{ marginTop: '24px', textAlign: 'center' }}>\n <a\n href=\"https://github.com/your-org/aether\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ ...linkStyle, fontSize: '12px' }}\n >\n Need help starting a server? <ExternalLink size={12} />\n </a>\n </div>\n </div>\n\n <style>{`\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n input:focus { border-color: var(--aether-primary, #3b82f6); }\n button:hover:not(:disabled) { opacity: 0.9; }\n `}</style>\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport type {\n MemoryEvent,\n MemoryEventInput,\n MemoryStats,\n RetrievalOptions,\n Trajectory,\n Pattern,\n Anomaly,\n TransitionMatrix,\n Prediction,\n SimulationResult,\n} from 'aether-core';\nimport { AddMemoryForm } from '../AddMemoryForm/index.js';\nimport { SearchBar, type SearchOptions } from '../SearchBar/index.js';\nimport { StatsPanel } from '../StatsPanel/index.js';\nimport { ActorSelector } from '../ActorSelector/index.js';\nimport { TimelineView } from '../TimelineView/index.js';\nimport { MemoryGraphView } from '../MemoryGraphView/index.js';\nimport { MemoryCard } from '../MemoryCard/index.js';\nimport { ConnectionStatus } from '../ConnectionStatus/index.js';\nimport { TrajectoryView, type TrajectoryData } from '../TrajectoryView/index.js';\nimport { PatternDashboard } from '../PatternDashboard/index.js';\nimport { PredictionPanel } from '../PredictionPanel/index.js';\nimport { AnomalyAlerts } from '../AnomalyAlerts/index.js';\n\n// Icons\nconst MenuIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n);\n\nconst XIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst EyeIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n);\n\nconst EyeOffIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n);\n\nconst ListIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n </svg>\n);\n\nconst NetworkIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"5\" r=\"3\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\" />\n <circle cx=\"6\" cy=\"19\" r=\"3\" />\n <circle cx=\"18\" cy=\"19\" r=\"3\" />\n <line x1=\"9\" y1=\"17.2\" x2=\"12\" y2=\"16\" />\n <line x1=\"15\" y1=\"17.2\" x2=\"12\" y2=\"16\" />\n </svg>\n);\n\nconst InboxIcon = () => (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" />\n <path d=\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n </svg>\n);\n\nconst RouteIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"6\" cy=\"19\" r=\"3\" />\n <path d=\"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\" />\n <circle cx=\"18\" cy=\"5\" r=\"3\" />\n </svg>\n);\n\nconst ActivityIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\" />\n </svg>\n);\n\nconst LightbulbIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 18h6\" />\n <path d=\"M10 22h4\" />\n <path d=\"M12 2a7 7 0 0 0-4 12.9V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.1A7 7 0 0 0 12 2z\" />\n </svg>\n);\n\nconst AlertTriangleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nexport interface AetherClient {\n add(content: string, context?: Record<string, unknown>): Promise<MemoryEvent>;\n add(event: MemoryEventInput): Promise<MemoryEvent>;\n retrieve(query: string, options?: RetrievalOptions): Promise<MemoryEvent[]>;\n getAll?(limit?: number): Promise<MemoryEvent[]>;\n getHistory(actor: string, limit?: number): Promise<MemoryEvent[]>;\n stats(): Promise<MemoryStats>;\n subscribe(callback: (event: MemoryEvent) => void): () => void;\n\n // Trajectory methods (optional - for extended features)\n getTrajectories?(actor: string): Promise<Trajectory[]>;\n getTrajectory?(id: string): Promise<Trajectory | null>;\n\n // Pattern methods (optional)\n detectPatterns?(actor: string): Promise<Pattern[]>;\n findAnomalies?(actor: string): Promise<Anomaly[]>;\n getTransitionProbabilities?(actor: string): Promise<TransitionMatrix>;\n\n // Prediction methods (optional)\n predictNext?(eventId: string): Promise<Prediction[]>;\n simulate?(actor: string, action: string, context?: Record<string, unknown>): Promise<SimulationResult>;\n}\n\nexport interface ConnectionState {\n connected: boolean;\n error?: string | null;\n onReconnect?: () => void;\n}\n\nexport interface DashboardProps {\n aether: AetherClient;\n title?: string;\n subtitle?: string;\n className?: string;\n connection?: ConnectionState;\n previewMode?: boolean;\n previewMemories?: MemoryEvent[];\n onPreviewToggle?: (enabled: boolean) => void;\n onDisconnect?: () => void;\n}\n\ntype ViewMode = 'timeline' | 'graph' | 'trajectories' | 'patterns' | 'predictions';\n\nfunction useIsMobile(breakpoint: number = 768): boolean {\n const [isMobile, setIsMobile] = useState(\n typeof window !== 'undefined' ? window.innerWidth < breakpoint : false\n );\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleResize = () => {\n setIsMobile(window.innerWidth < breakpoint);\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [breakpoint]);\n\n return isMobile;\n}\n\nexport function Dashboard({\n aether,\n title = 'Aether Memory Explorer',\n subtitle,\n className,\n connection,\n previewMode = false,\n previewMemories = [],\n onPreviewToggle,\n onDisconnect,\n}: DashboardProps) {\n const [events, setEvents] = useState<MemoryEvent[]>([]);\n const [searchResults, setSearchResults] = useState<MemoryEvent[] | null>(null);\n const [stats, setStats] = useState<MemoryStats | null>(null);\n const [actors, setActors] = useState<string[]>([]);\n const [selectedActor, setSelectedActor] = useState<string | null>(null);\n const [selectedEvent, setSelectedEvent] = useState<MemoryEvent | null>(null);\n const [viewMode, setViewMode] = useState<ViewMode>('timeline');\n const [loading, setLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n // Extended feature states\n const [trajectories, setTrajectories] = useState<TrajectoryData[]>([]);\n const [patterns, setPatterns] = useState<Pattern[]>([]);\n const [anomalies, setAnomalies] = useState<Anomaly[]>([]);\n const [transitionMatrix, setTransitionMatrix] = useState<TransitionMatrix | null>(null);\n const [predictions, setPredictions] = useState<Prediction[]>([]);\n const [extendedLoading, setExtendedLoading] = useState(false);\n\n const isMobile = useIsMobile();\n\n useEffect(() => {\n if (previewMode && previewMemories.length > 0) {\n setEvents(previewMemories);\n const uniqueActors = [...new Set(previewMemories.map((e) => e.actor))];\n setActors(uniqueActors);\n setStats({\n totalEvents: previewMemories.length,\n uniqueActors: uniqueActors.length,\n oldestEvent: previewMemories[previewMemories.length - 1]?.timestamp,\n newestEvent: previewMemories[0]?.timestamp,\n storageAdapter: 'preview',\n embeddingProvider: 'preview',\n });\n return;\n }\n }, [previewMode, previewMemories]);\n\n useEffect(() => {\n if (previewMode) return;\n\n const loadData = async () => {\n setLoading(true);\n try {\n const [statsData, eventsData] = await Promise.all([\n aether.stats(),\n aether.getAll ? aether.getAll(100) : Promise.resolve([]),\n ]);\n\n setStats(statsData);\n setEvents(eventsData);\n\n const uniqueActors = [...new Set(eventsData.map((e) => e.actor))];\n setActors(uniqueActors);\n } catch (err) {\n console.error('Failed to load data:', err);\n } finally {\n setLoading(false);\n }\n };\n\n loadData();\n }, [aether, previewMode]);\n\n useEffect(() => {\n if (previewMode) return;\n\n const unsubscribe = aether.subscribe((event) => {\n setEvents((prev) => [event, ...prev]);\n\n setActors((prev) => {\n if (!prev.includes(event.actor)) {\n return [...prev, event.actor];\n }\n return prev;\n });\n\n setStats((prev) =>\n prev\n ? {\n ...prev,\n totalEvents: prev.totalEvents + 1,\n newestEvent: event.timestamp,\n }\n : null\n );\n });\n\n return unsubscribe;\n }, [aether, previewMode]);\n\n // Load extended feature data when view mode or actor changes\n useEffect(() => {\n const loadExtendedData = async () => {\n if (!selectedActor) return;\n setExtendedLoading(true);\n\n try {\n // Load trajectories\n if (viewMode === 'trajectories' && aether.getTrajectories) {\n const trajData = await aether.getTrajectories(selectedActor);\n // Convert to TrajectoryData format\n const trajectoryData: TrajectoryData[] = trajData.map((t) => ({\n id: t.id,\n actor: t.actor,\n status: t.status,\n outcome: t.outcome,\n events: t.events,\n startTime: t.startTime,\n endTime: t.endTime,\n metadata: t.metadata as Record<string, unknown> | undefined,\n }));\n setTrajectories(trajectoryData);\n }\n\n // Load patterns and anomalies\n if (viewMode === 'patterns') {\n const loadTasks: Promise<void>[] = [];\n\n if (aether.detectPatterns) {\n loadTasks.push(\n aether.detectPatterns(selectedActor).then((p) => setPatterns(p))\n );\n }\n\n if (aether.findAnomalies) {\n loadTasks.push(\n aether.findAnomalies(selectedActor).then((a) => setAnomalies(a))\n );\n }\n\n if (aether.getTransitionProbabilities) {\n loadTasks.push(\n aether.getTransitionProbabilities(selectedActor).then((m) => setTransitionMatrix(m))\n );\n }\n\n await Promise.all(loadTasks);\n }\n\n // Load predictions\n if (viewMode === 'predictions' && selectedEvent && aether.predictNext) {\n const preds = await aether.predictNext(selectedEvent.id);\n setPredictions(preds);\n }\n } catch (err) {\n console.error('Failed to load extended data:', err);\n } finally {\n setExtendedLoading(false);\n }\n };\n\n loadExtendedData();\n }, [aether, viewMode, selectedActor, selectedEvent]);\n\n // Handle simulation\n const handleSimulate = useCallback(\n async (action: string, context?: Record<string, unknown>): Promise<SimulationResult> => {\n if (!aether.simulate || !selectedActor) {\n throw new Error('Simulation not available');\n }\n return aether.simulate(selectedActor, action, context);\n },\n [aether, selectedActor]\n );\n\n const handleAddMemory = useCallback(\n async (content: string, actor: string, context?: Record<string, unknown>) => {\n await aether.add({ content, actor, context });\n if (isMobile) setSidebarOpen(false);\n },\n [aether, isMobile]\n );\n\n const handleSearch = useCallback(\n async (query: string, options: SearchOptions) => {\n setLoading(true);\n setSearchQuery(query);\n try {\n const results = await aether.retrieve(query, {\n retrievalType: options.retrievalType,\n limit: options.limit,\n actor: options.actor,\n });\n setSearchResults(results);\n } catch (err) {\n console.error('Search failed:', err);\n } finally {\n setLoading(false);\n }\n },\n [aether]\n );\n\n const handleActorChange = useCallback(\n async (actor: string | null) => {\n setSelectedActor(actor);\n setLoading(true);\n try {\n if (actor) {\n const history = await aether.getHistory(actor, 50);\n setEvents(history);\n } else {\n const allEvents = aether.getAll ? await aether.getAll(100) : [];\n setEvents(allEvents);\n }\n setSearchResults(null);\n setSearchQuery('');\n } catch (err) {\n console.error('Failed to load actor history:', err);\n } finally {\n setLoading(false);\n }\n },\n [aether]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchResults(null);\n setSearchQuery('');\n }, []);\n\n const filteredEvents = useMemo(() => {\n if (searchResults) return searchResults;\n if (!selectedActor) return events;\n return events.filter((e) => e.actor === selectedActor);\n }, [events, searchResults, selectedActor]);\n\n const buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px',\n border: '1px solid var(--aether-border, #e5e5e5)',\n borderRadius: 'var(--aether-radius, 8px)',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n };\n\n const tabStyle = (isActive: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 12px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--aether-radius, 8px)',\n cursor: 'pointer',\n backgroundColor: isActive ? 'var(--aether-muted, #f5f5f5)' : 'transparent',\n color: isActive ? 'var(--aether-fg, #1a1a1a)' : 'var(--aether-muted-fg, #737373)',\n });\n\n const sidebarContent = (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <div>\n <h2 style={{ marginBottom: '12px', fontSize: '14px', fontWeight: 600 }}>Add Memory</h2>\n <AddMemoryForm onAdd={handleAddMemory} loading={loading} />\n </div>\n\n <div>\n <h2 style={{ marginBottom: '12px', fontSize: '14px', fontWeight: 600 }}>Statistics</h2>\n <StatsPanel stats={stats} loading={loading} />\n </div>\n\n {actors.length > 0 && (\n <div>\n <h2 style={{ marginBottom: '12px', fontSize: '14px', fontWeight: 600 }}>Actors</h2>\n <ActorSelector actors={actors} selectedActor={selectedActor} onSelect={handleActorChange} />\n </div>\n )}\n </div>\n );\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: 'var(--aether-muted, #f5f5f5)',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n >\n {/* Header */}\n <header\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n padding: '12px 16px',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {isMobile && (\n <button style={buttonStyle} onClick={() => setSidebarOpen(!sidebarOpen)}>\n <MenuIcon />\n </button>\n )}\n <div>\n <h1 style={{ fontSize: '18px', fontWeight: 600, margin: 0 }}>{title}</h1>\n {subtitle && (\n <p style={{ fontSize: '12px', color: 'var(--aether-muted-fg, #737373)', margin: 0, marginTop: '2px' }}>\n {subtitle}\n </p>\n )}\n </div>\n {onDisconnect && (\n <button\n style={{\n ...buttonStyle,\n padding: '6px 12px',\n fontSize: '12px',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n onClick={onDisconnect}\n >\n Disconnect\n </button>\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {onPreviewToggle && (\n <button\n style={{\n ...buttonStyle,\n gap: '6px',\n padding: '6px 12px',\n backgroundColor: previewMode ? '#fef3c7' : 'transparent',\n color: previewMode ? '#b45309' : 'var(--aether-muted-fg, #737373)',\n border: previewMode ? '1px solid #fcd34d' : '1px solid var(--aether-border, #e5e5e5)',\n }}\n onClick={() => onPreviewToggle(!previewMode)}\n >\n {previewMode ? <EyeIcon /> : <EyeOffIcon />}\n <span style={{ fontSize: '14px' }}>{previewMode ? 'Preview' : 'Live'}</span>\n </button>\n )}\n\n {connection && !previewMode && (\n <ConnectionStatus\n connected={connection.connected}\n error={connection.error}\n onReconnect={connection.onReconnect}\n />\n )}\n\n <div style={{ display: 'flex', gap: '4px', padding: '4px', backgroundColor: 'var(--aether-muted, #f5f5f5)', borderRadius: 'var(--aether-radius, 8px)', flexWrap: 'wrap' }}>\n <button style={tabStyle(viewMode === 'timeline')} onClick={() => setViewMode('timeline')}>\n <ListIcon />\n {!isMobile && <span>Timeline</span>}\n </button>\n <button style={tabStyle(viewMode === 'graph')} onClick={() => setViewMode('graph')}>\n <NetworkIcon />\n {!isMobile && <span>Graph</span>}\n </button>\n <button style={tabStyle(viewMode === 'trajectories')} onClick={() => setViewMode('trajectories')}>\n <RouteIcon />\n {!isMobile && <span>Trajectories</span>}\n </button>\n <button style={tabStyle(viewMode === 'patterns')} onClick={() => setViewMode('patterns')}>\n <ActivityIcon />\n {!isMobile && <span>Patterns</span>}\n </button>\n <button style={tabStyle(viewMode === 'predictions')} onClick={() => setViewMode('predictions')}>\n <LightbulbIcon />\n {!isMobile && <span>Predictions</span>}\n </button>\n </div>\n </div>\n </header>\n\n {/* Main content */}\n <div style={{ position: 'relative', display: 'flex', flex: 1, overflow: 'hidden' }}>\n {/* Mobile sidebar overlay */}\n {isMobile && sidebarOpen && (\n <>\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 40,\n }}\n onClick={() => setSidebarOpen(false)}\n />\n <aside\n style={{\n position: 'fixed',\n left: 0,\n top: 0,\n bottom: 0,\n width: '300px',\n maxWidth: '85vw',\n padding: '16px',\n backgroundColor: 'var(--aether-bg, #fff)',\n zIndex: 50,\n overflow: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>\n <h2 style={{ fontSize: '16px', fontWeight: 600 }}>Menu</h2>\n <button style={{ ...buttonStyle, padding: '4px' }} onClick={() => setSidebarOpen(false)}>\n <XIcon />\n </button>\n </div>\n {sidebarContent}\n </aside>\n </>\n )}\n\n {/* Desktop sidebar */}\n {!isMobile && (\n <aside\n style={{\n width: '320px',\n minWidth: '320px',\n padding: '16px',\n borderRight: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n overflow: 'auto',\n }}\n >\n {sidebarContent}\n </aside>\n )}\n\n {/* Main area */}\n <main style={{ display: 'flex', flex: 1, flexDirection: 'column', minWidth: 0, overflow: 'hidden' }}>\n {/* Search bar */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n }}\n >\n <SearchBar onSearch={handleSearch} loading={loading} />\n {searchQuery && (\n <div style={{ marginTop: '8px', display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ fontSize: '14px', color: 'var(--aether-muted-fg, #737373)' }}>\n Showing results for \"{searchQuery}\"\n </span>\n <button\n style={{ padding: '4px 8px', fontSize: '14px', color: 'var(--aether-primary, #3b82f6)', background: 'none', border: 'none', cursor: 'pointer' }}\n onClick={handleClearSearch}\n >\n Clear\n </button>\n </div>\n )}\n </div>\n\n {/* Content area */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n overflow: 'hidden',\n flexDirection: isMobile && selectedEvent && viewMode === 'timeline' ? 'column' : 'row',\n }}\n >\n {/* Main view content */}\n <div style={{ flex: 1, minWidth: 0, overflow: 'hidden', padding: '12px 16px' }}>\n {/* Timeline View */}\n {viewMode === 'timeline' && (\n filteredEvents.length === 0 ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n minHeight: '200px',\n padding: '20px',\n textAlign: 'center',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <InboxIcon />\n <p style={{ marginTop: '12px', fontSize: '14px' }}>No memories yet</p>\n <p style={{ marginTop: '4px', fontSize: '12px' }}>\n {isMobile ? 'Tap the menu to add your first memory' : 'Add your first memory using the form on the left'}\n </p>\n </div>\n ) : (\n <TimelineView\n events={filteredEvents}\n onEventClick={setSelectedEvent}\n selectedEventId={selectedEvent?.id}\n showContext\n maxHeight=\"100%\"\n />\n )\n )}\n\n {/* Graph View */}\n {viewMode === 'graph' && (\n <div style={{ height: '100%', width: '100%' }}>\n <MemoryGraphView\n events={filteredEvents}\n onNodeClick={setSelectedEvent}\n selectedEvent={selectedEvent}\n highlightActor={selectedActor ?? undefined}\n />\n </div>\n )}\n\n {/* Trajectories View */}\n {viewMode === 'trajectories' && (\n <div style={{ height: '100%', overflow: 'auto' }}>\n {!selectedActor ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: '20px',\n textAlign: 'center',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <RouteIcon />\n <p style={{ marginTop: '12px', fontSize: '14px' }}>Select an actor to view trajectories</p>\n </div>\n ) : (\n <TrajectoryView\n events={filteredEvents}\n trajectories={trajectories}\n onEventClick={setSelectedEvent}\n selectedEventId={selectedEvent?.id}\n showBoundaries\n maxHeight=\"100%\"\n />\n )}\n </div>\n )}\n\n {/* Patterns View */}\n {viewMode === 'patterns' && (\n <div style={{ height: '100%', overflow: 'auto' }}>\n {!selectedActor ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: '20px',\n textAlign: 'center',\n color: 'var(--aether-muted-fg, #737373)',\n }}\n >\n <ActivityIcon />\n <p style={{ marginTop: '12px', fontSize: '14px' }}>Select an actor to view patterns</p>\n </div>\n ) : (\n <PatternDashboard\n patterns={patterns}\n anomalies={anomalies}\n transitionMatrix={transitionMatrix ?? undefined}\n loading={extendedLoading}\n />\n )}\n </div>\n )}\n\n {/* Predictions View */}\n {viewMode === 'predictions' && (\n <div style={{ display: 'flex', height: '100%', gap: '16px' }}>\n {/* Predictions Panel */}\n <div style={{ flex: 1, overflow: 'auto' }}>\n <PredictionPanel\n predictions={predictions}\n loading={extendedLoading}\n onSimulate={aether.simulate ? handleSimulate : undefined}\n simulationEnabled={!!aether.simulate && !!selectedActor}\n maxHeight=\"100%\"\n />\n </div>\n\n {/* Anomaly Alerts Sidebar */}\n {!isMobile && anomalies.length > 0 && (\n <div\n style={{\n width: '300px',\n minWidth: '300px',\n padding: '16px',\n borderLeft: '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n overflow: 'auto',\n }}\n >\n <AnomalyAlerts\n anomalies={anomalies}\n loading={extendedLoading}\n onAnomalyClick={(anomaly) => setSelectedEvent(anomaly.event)}\n compact\n maxHeight=\"100%\"\n />\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Selected event detail */}\n {selectedEvent && viewMode === 'timeline' && (\n <aside\n style={{\n width: isMobile ? '100%' : '300px',\n minWidth: isMobile ? undefined : '300px',\n maxHeight: isMobile ? '40vh' : undefined,\n padding: '16px',\n borderTop: isMobile ? '1px solid var(--aether-border, #e5e5e5)' : 'none',\n borderLeft: isMobile ? 'none' : '1px solid var(--aether-border, #e5e5e5)',\n backgroundColor: 'var(--aether-bg, #fff)',\n overflow: 'auto',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '12px' }}>\n <h3 style={{ fontSize: '14px', fontWeight: 600 }}>Event Details</h3>\n <button style={{ ...buttonStyle, padding: '4px' }} onClick={() => setSelectedEvent(null)}>\n <XIcon />\n </button>\n </div>\n <MemoryCard event={selectedEvent} showContext />\n </aside>\n )}\n </div>\n </main>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useEffect","useRef","useState","useCallback","jsx","jsx","jsxs","useRef","useState","useCallback","useEffect","zoom","useMemo","jsx","jsxs","useMemo","events","useMemo","jsx","jsxs","colorMap","points","useState","useCallback","jsx","jsxs","useState","useCallback","useState","useMemo","jsx","jsxs","XIcon","React","useState","useMemo","jsx","jsxs","useState","useCallback","Fragment","jsx","jsxs","PlayIcon","AlertTriangleIcon","useState","useMemo","jsx","jsxs","AlertTriangleIcon","XIcon","ChevronDownIcon","getSeverityColor","formatTime","useState","useCallback","jsx","jsxs","ChevronDownIcon","ChevronUpIcon","useState","useCallback","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","Loader","Fragment","jsx","jsxs","useState","useEffect","useCallback","useMemo","Fragment","jsx","jsxs","XIcon","LightbulbIcon","useState","useEffect","useCallback","useMemo","jsxs","jsx","LightbulbIcon","Fragment","XIcon"]}
|