aether-react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +159 -0
- package/dist/index.js +2056 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "aether-react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React visualization components for Aether Memory Framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./styles.css": "./dist/styles.css"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"d3": "^7.8.0",
|
|
20
|
+
"aether-core": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"react": "^18.0.0",
|
|
24
|
+
"react-dom": "^18.0.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/d3": "^7.4.0",
|
|
28
|
+
"@types/node": "^20.10.0",
|
|
29
|
+
"@types/react": "^18.2.0",
|
|
30
|
+
"@types/react-dom": "^18.2.0",
|
|
31
|
+
"react": "^18.2.0",
|
|
32
|
+
"react-dom": "^18.2.0",
|
|
33
|
+
"tsup": "^8.0.0",
|
|
34
|
+
"typescript": "^5.3.0"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"aether",
|
|
44
|
+
"react",
|
|
45
|
+
"visualization",
|
|
46
|
+
"d3",
|
|
47
|
+
"graph",
|
|
48
|
+
"timeline"
|
|
49
|
+
],
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsup",
|
|
53
|
+
"dev": "tsup --watch",
|
|
54
|
+
"typecheck": "tsc --noEmit",
|
|
55
|
+
"clean": "rm -rf dist .turbo"
|
|
56
|
+
}
|
|
57
|
+
}
|