@mastra/playground-ui 38.1.0-alpha.4 → 39.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.
Files changed (93) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/dist/components/PropertyFilter.cjs.js +1 -1
  3. package/dist/components/PropertyFilter.es.js +2 -2
  4. package/dist/domains/logs/components/log-details-view.cjs.js +18 -24
  5. package/dist/domains/logs/components/log-details-view.cjs.js.map +1 -1
  6. package/dist/domains/logs/components/log-details-view.es.js +18 -24
  7. package/dist/domains/logs/components/log-details-view.es.js.map +1 -1
  8. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  9. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  10. package/dist/domains/logs/hooks/use-logs-list-navigation.cjs.js +2 -0
  11. package/dist/domains/logs/hooks/use-logs-list-navigation.cjs.js.map +1 -1
  12. package/dist/domains/logs/hooks/use-logs-list-navigation.es.js +2 -0
  13. package/dist/domains/logs/hooks/use-logs-list-navigation.es.js.map +1 -1
  14. package/dist/domains/memory/components/flame-graph.cjs.js +23 -14
  15. package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
  16. package/dist/domains/memory/components/flame-graph.es.js +23 -14
  17. package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
  18. package/dist/domains/memory/hooks/use-memory-status.cjs.js +3 -4
  19. package/dist/domains/memory/hooks/use-memory-status.cjs.js.map +1 -1
  20. package/dist/domains/memory/hooks/use-memory-status.es.js +4 -5
  21. package/dist/domains/memory/hooks/use-memory-status.es.js.map +1 -1
  22. package/dist/domains/memory/hooks/use-memory-thread-messages.cjs.js +1 -2
  23. package/dist/domains/memory/hooks/use-memory-thread-messages.cjs.js.map +1 -1
  24. package/dist/domains/memory/hooks/use-memory-thread-messages.es.js +2 -3
  25. package/dist/domains/memory/hooks/use-memory-thread-messages.es.js.map +1 -1
  26. package/dist/domains/memory/hooks/use-observational-memory.cjs.js +2 -3
  27. package/dist/domains/memory/hooks/use-observational-memory.cjs.js.map +1 -1
  28. package/dist/domains/memory/hooks/use-observational-memory.es.js +3 -4
  29. package/dist/domains/memory/hooks/use-observational-memory.es.js.map +1 -1
  30. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
  31. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
  32. package/dist/domains/metrics/hooks/use-metrics.cjs.js +1 -1
  33. package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
  34. package/dist/domains/metrics/hooks/use-metrics.es.js +1 -1
  35. package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
  36. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js +9 -6
  37. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js.map +1 -1
  38. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js +9 -6
  39. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js.map +1 -1
  40. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js +3 -8
  41. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js.map +1 -1
  42. package/dist/domains/metrics/hooks/use-scores-metrics.es.js +3 -8
  43. package/dist/domains/metrics/hooks/use-scores-metrics.es.js.map +1 -1
  44. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.cjs.js +2 -6
  45. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.cjs.js.map +1 -1
  46. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.es.js +2 -6
  47. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.es.js.map +1 -1
  48. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.cjs.js +2 -4
  49. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.cjs.js.map +1 -1
  50. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.es.js +2 -4
  51. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.es.js.map +1 -1
  52. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.cjs.js +2 -4
  53. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.cjs.js.map +1 -1
  54. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.es.js +2 -4
  55. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.es.js.map +1 -1
  56. package/dist/domains/metrics/hooks/use-trace-volume-metrics.cjs.js +4 -6
  57. package/dist/domains/metrics/hooks/use-trace-volume-metrics.cjs.js.map +1 -1
  58. package/dist/domains/metrics/hooks/use-trace-volume-metrics.es.js +2 -4
  59. package/dist/domains/metrics/hooks/use-trace-volume-metrics.es.js.map +1 -1
  60. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +2 -0
  61. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
  62. package/dist/domains/traces/components/format-hierarchical-spans.es.js +2 -0
  63. package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
  64. package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -1
  65. package/dist/domains/traces/components/traces-toolbar.es.js +1 -1
  66. package/dist/domains/traces/hooks/use-traces.cjs.js +3 -11
  67. package/dist/domains/traces/hooks/use-traces.cjs.js.map +1 -1
  68. package/dist/domains/traces/hooks/use-traces.es.js +3 -11
  69. package/dist/domains/traces/hooks/use-traces.es.js.map +1 -1
  70. package/dist/ee/signals/hooks/use-entity-learning-config.cjs.js +11 -3
  71. package/dist/ee/signals/hooks/use-entity-learning-config.cjs.js.map +1 -1
  72. package/dist/ee/signals/hooks/use-entity-learning-config.es.js +11 -3
  73. package/dist/ee/signals/hooks/use-entity-learning-config.es.js.map +1 -1
  74. package/dist/ee/signals/services/entity-learning-service.cjs.js +5 -8
  75. package/dist/ee/signals/services/entity-learning-service.cjs.js.map +1 -1
  76. package/dist/ee/signals/services/entity-learning-service.es.js +5 -8
  77. package/dist/ee/signals/services/entity-learning-service.es.js.map +1 -1
  78. package/dist/map-CGEv7zQW.cjs +12 -0
  79. package/dist/map-CGEv7zQW.cjs.map +1 -0
  80. package/dist/map-DBJibfZS.js +10 -0
  81. package/dist/map-DBJibfZS.js.map +1 -0
  82. package/dist/{property-filter-applied-Ec6BkYiN.cjs → property-filter-applied-DnpJ1vFe.cjs} +6 -6
  83. package/dist/property-filter-applied-DnpJ1vFe.cjs.map +1 -0
  84. package/dist/{property-filter-applied-B3T9NrP5.js → property-filter-applied-EnHVqWEV.js} +6 -6
  85. package/dist/property-filter-applied-EnHVqWEV.js.map +1 -0
  86. package/dist/src/domains/memory/hooks/use-memory-status.d.ts +1 -1
  87. package/dist/src/domains/memory/hooks/use-memory-thread-messages.d.ts +1 -1
  88. package/dist/src/domains/memory/hooks/use-observational-memory.d.ts +1 -1
  89. package/dist/src/ee/signals/services/entity-learning-service.d.ts +14 -4
  90. package/dist/src/lib/map.d.ts +1 -0
  91. package/package.json +8 -8
  92. package/dist/property-filter-applied-B3T9NrP5.js.map +0 -1
  93. package/dist/property-filter-applied-Ec6BkYiN.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flame-graph.cjs.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, toT, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction toContextData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const fromRecords = records.map(r => ({\n ts: String(getObservationTimestamp(r)),\n pendingMessageTokens: r.pendingMessageTokens,\n }));\n const fromMarkers = markers\n .filter(m => m.pendingTokens != null)\n .map(m => ({\n ts: m.timestamp,\n pendingMessageTokens: m.pendingTokens!,\n }));\n return [...fromRecords, ...fromMarkers]\n .sort((a, b) => a.ts.localeCompare(b.ts))\n .map(d => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));\n}\n\nfunction toActiveObservationData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const points = [\n ...records.map(record => ({\n ts: String(getObservationTimestamp(record)),\n observationTokenCount: record.observationTokenCount,\n })),\n ...markers\n .filter(marker => marker.type === 'status' && marker.observationTokens != null)\n .map(marker => ({\n ts: marker.timestamp,\n observationTokenCount: marker.observationTokens!,\n })),\n ].sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(runningTotal, point.observationTokenCount);\n return { t: toT(point.ts, domain), observationTokenCount: runningTotal };\n });\n}\n\nfunction toBufferedObservationData(markers: ExtractedOmMarker[], domain: TDomain) {\n const points = markers\n .filter(\n marker => marker.observationTokens != null && (marker.type === 'buffering-end' || marker.type === 'activation'),\n )\n .map(marker => ({\n ts: marker.timestamp,\n bufferedObservationTokenCount:\n marker.type === 'activation' ? -marker.observationTokens! : marker.observationTokens!,\n }))\n .sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);\n return { t: toT(point.ts, domain), bufferedObservationTokenCount: runningTotal };\n });\n}\n\nfunction toEventData(records: OMHistoryRecord[], domain: TDomain) {\n return [...records]\n .sort((a, b) => String(getObservationTimestamp(a)).localeCompare(String(getObservationTimestamp(b))))\n .map(r => ({ t: toT(String(getObservationTimestamp(r)), domain), event: 1 }));\n}\n\nfunction toMessageData(messages: MemoryMessage[], domain: TDomain) {\n return [...messages]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map(m => ({\n t: toT(new Date(m.createdAt).toISOString(), domain),\n event: 1,\n role: m.role,\n }));\n}\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-ui-xs text-icon3\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className=\"flex flex-col gap-0.5 rounded border border-border1 bg-surface3 px-2 py-1.5 font-mono text-ui-xs shadow\">\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">time</span>\n <span className=\"text-neutral6\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">{entry.name}</span>\n <span className=\"text-neutral6\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"rounded border border-border1 bg-surface3 px-2 py-1 font-mono text-ui-xs shadow\">\n {time && <span className=\"text-neutral6\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const maxValue = Math.max(0, ...data.map(d => Number(d[dataKey]) || 0));\n const yMax = threshold != null ? Math.max(maxValue, threshold) : undefined;\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const areaValueByTime = new Map(areaData.map(point => [point.t, Number(point[areaDataKey] ?? 0)]));\n const eventsByTime = eventData.reduce<Map<number, Array<(typeof eventData)[number]>>>((acc, event) => {\n const bucket = acc.get(event.t);\n if (bucket) {\n bucket.push(event);\n } else {\n acc.set(event.t, [event]);\n }\n return acc;\n }, new Map());\n const allTimes = Array.from(new Set([...areaValueByTime.keys(), ...eventsByTime.keys()])).sort((a, b) => a - b);\n\n let lastAreaValue = 0;\n const combinedData: Array<Record<string, unknown> & { t: number }> = [];\n for (const time of allTimes) {\n const nextAreaValue = areaValueByTime.get(time);\n if (nextAreaValue != null) {\n lastAreaValue = nextAreaValue;\n }\n\n const bucket = eventsByTime.get(time);\n if (bucket && bucket.length > 0) {\n for (const event of bucket) {\n combinedData.push({ ...event, t: time, [areaDataKey]: lastAreaValue });\n }\n } else {\n combinedData.push({ t: time, [areaDataKey]: lastAreaValue });\n }\n }\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const label = state?.activeLabel;\n if (label != null && onSelectT) onSelectT(Number(label));\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) => {\n const dotPayload = props.payload as { event?: number } | undefined;\n if (!dotPayload?.event) return <></>;\n return <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />;\n }}\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border1/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border1/50 pl-3\">\n <p className=\"text-ui-xs font-medium text-icon3\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div className=\"absolute inset-y-0 left-0 bg-surface2/60\" style={{ width: `${leftPercent}%` }} />\n <div\n className=\"absolute inset-y-0 border-y border-border1/30 bg-neutral6/5\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div className=\"absolute inset-y-0 right-0 bg-surface2/60\" style={{ width: `${100 - rightPercent}%` }} />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pb-2 pr-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n"],"names":["toT","jsxs","jsx","formatTimeDisplay","tToTimestamp","ResponsiveContainer","AreaChart","XAxis","YAxis","Tooltip","Area","ReferenceLine","ScatterChart","Scatter","ComposedChart","label","Fragment","useRef","useCallback","useEffect","Button","RotateCcw","tToTimestampMs","useState","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"flame-graph.cjs.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, toT, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction toContextData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const fromRecords = records.map(r => ({\n ts: String(getObservationTimestamp(r)),\n pendingMessageTokens: r.pendingMessageTokens,\n }));\n const fromMarkers = markers.flatMap(m => {\n if (m.pendingTokens == null) return [];\n return {\n ts: m.timestamp,\n pendingMessageTokens: m.pendingTokens,\n };\n });\n return [...fromRecords, ...fromMarkers]\n .sort((a, b) => a.ts.localeCompare(b.ts))\n .map(d => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));\n}\n\nfunction toActiveObservationData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const points = [\n ...records.map(record => ({\n ts: String(getObservationTimestamp(record)),\n observationTokenCount: record.observationTokenCount,\n })),\n ...markers.flatMap(marker => {\n if (marker.type !== 'status' || marker.observationTokens == null) return [];\n return {\n ts: marker.timestamp,\n observationTokenCount: marker.observationTokens,\n };\n }),\n ].sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(runningTotal, point.observationTokenCount);\n return { t: toT(point.ts, domain), observationTokenCount: runningTotal };\n });\n}\n\nfunction toBufferedObservationData(markers: ExtractedOmMarker[], domain: TDomain) {\n const points = markers\n .flatMap(marker => {\n if (marker.observationTokens == null || (marker.type !== 'buffering-end' && marker.type !== 'activation')) {\n return [];\n }\n return {\n ts: marker.timestamp,\n bufferedObservationTokenCount:\n marker.type === 'activation' ? -marker.observationTokens : marker.observationTokens,\n };\n })\n .sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);\n return { t: toT(point.ts, domain), bufferedObservationTokenCount: runningTotal };\n });\n}\n\nfunction toEventData(records: OMHistoryRecord[], domain: TDomain) {\n return [...records]\n .sort((a, b) => String(getObservationTimestamp(a)).localeCompare(String(getObservationTimestamp(b))))\n .map(r => ({ t: toT(String(getObservationTimestamp(r)), domain), event: 1 }));\n}\n\nfunction toMessageData(messages: MemoryMessage[], domain: TDomain) {\n return [...messages]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map(m => ({\n t: toT(new Date(m.createdAt).toISOString(), domain),\n event: 1,\n role: m.role,\n }));\n}\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-ui-xs text-icon3\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className=\"flex flex-col gap-0.5 rounded border border-border1 bg-surface3 px-2 py-1.5 font-mono text-ui-xs shadow\">\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">time</span>\n <span className=\"text-neutral6\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">{entry.name}</span>\n <span className=\"text-neutral6\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"rounded border border-border1 bg-surface3 px-2 py-1 font-mono text-ui-xs shadow\">\n {time && <span className=\"text-neutral6\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const maxValue = Math.max(0, ...data.map(d => Number(d[dataKey]) || 0));\n const yMax = threshold != null ? Math.max(maxValue, threshold) : undefined;\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const areaValueByTime = new Map(areaData.map(point => [point.t, Number(point[areaDataKey] ?? 0)]));\n const eventsByTime = eventData.reduce<Map<number, Array<(typeof eventData)[number]>>>((acc, event) => {\n const bucket = acc.get(event.t);\n if (bucket) {\n bucket.push(event);\n } else {\n acc.set(event.t, [event]);\n }\n return acc;\n }, new Map());\n const allTimes = Array.from(new Set([...areaValueByTime.keys(), ...eventsByTime.keys()])).sort((a, b) => a - b);\n\n let lastAreaValue = 0;\n const combinedData: Array<Record<string, unknown> & { t: number }> = [];\n for (const time of allTimes) {\n const nextAreaValue = areaValueByTime.get(time);\n if (nextAreaValue != null) {\n lastAreaValue = nextAreaValue;\n }\n\n const bucket = eventsByTime.get(time);\n if (bucket && bucket.length > 0) {\n for (const event of bucket) {\n combinedData.push({ ...event, t: time, [areaDataKey]: lastAreaValue });\n }\n } else {\n combinedData.push({ t: time, [areaDataKey]: lastAreaValue });\n }\n }\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const label = state?.activeLabel;\n if (label != null && onSelectT) onSelectT(Number(label));\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) => {\n const dotPayload = props.payload as { event?: number } | undefined;\n if (!dotPayload?.event) return <></>;\n return <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />;\n }}\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border1/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border1/50 pl-3\">\n <p className=\"text-ui-xs font-medium text-icon3\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div className=\"absolute inset-y-0 left-0 bg-surface2/60\" style={{ width: `${leftPercent}%` }} />\n <div\n className=\"absolute inset-y-0 border-y border-border1/30 bg-neutral6/5\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div className=\"absolute inset-y-0 right-0 bg-surface2/60\" style={{ width: `${100 - rightPercent}%` }} />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pb-2 pr-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n"],"names":["toT","jsxs","jsx","formatTimeDisplay","tToTimestamp","ResponsiveContainer","AreaChart","XAxis","YAxis","Tooltip","Area","ReferenceLine","ScatterChart","Scatter","ComposedChart","label","Fragment","useRef","useCallback","useEffect","Button","RotateCcw","tToTimestampMs","useState","useMemo"],"mappings":"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"}
@@ -18,10 +18,13 @@ function toContextData(records, markers, domain) {
18
18
  ts: String(getObservationTimestamp(r)),
19
19
  pendingMessageTokens: r.pendingMessageTokens
20
20
  }));
21
- const fromMarkers = markers.filter((m) => m.pendingTokens != null).map((m) => ({
22
- ts: m.timestamp,
23
- pendingMessageTokens: m.pendingTokens
24
- }));
21
+ const fromMarkers = markers.flatMap((m) => {
22
+ if (m.pendingTokens == null) return [];
23
+ return {
24
+ ts: m.timestamp,
25
+ pendingMessageTokens: m.pendingTokens
26
+ };
27
+ });
25
28
  return [...fromRecords, ...fromMarkers].sort((a, b) => a.ts.localeCompare(b.ts)).map((d) => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));
26
29
  }
27
30
  function toActiveObservationData(records, markers, domain) {
@@ -30,10 +33,13 @@ function toActiveObservationData(records, markers, domain) {
30
33
  ts: String(getObservationTimestamp(record)),
31
34
  observationTokenCount: record.observationTokenCount
32
35
  })),
33
- ...markers.filter((marker) => marker.type === "status" && marker.observationTokens != null).map((marker) => ({
34
- ts: marker.timestamp,
35
- observationTokenCount: marker.observationTokens
36
- }))
36
+ ...markers.flatMap((marker) => {
37
+ if (marker.type !== "status" || marker.observationTokens == null) return [];
38
+ return {
39
+ ts: marker.timestamp,
40
+ observationTokenCount: marker.observationTokens
41
+ };
42
+ })
37
43
  ].sort((a, b) => a.ts.localeCompare(b.ts));
38
44
  let runningTotal = 0;
39
45
  return points.map((point) => {
@@ -42,12 +48,15 @@ function toActiveObservationData(records, markers, domain) {
42
48
  });
43
49
  }
44
50
  function toBufferedObservationData(markers, domain) {
45
- const points = markers.filter(
46
- (marker) => marker.observationTokens != null && (marker.type === "buffering-end" || marker.type === "activation")
47
- ).map((marker) => ({
48
- ts: marker.timestamp,
49
- bufferedObservationTokenCount: marker.type === "activation" ? -marker.observationTokens : marker.observationTokens
50
- })).sort((a, b) => a.ts.localeCompare(b.ts));
51
+ const points = markers.flatMap((marker) => {
52
+ if (marker.observationTokens == null || marker.type !== "buffering-end" && marker.type !== "activation") {
53
+ return [];
54
+ }
55
+ return {
56
+ ts: marker.timestamp,
57
+ bufferedObservationTokenCount: marker.type === "activation" ? -marker.observationTokens : marker.observationTokens
58
+ };
59
+ }).sort((a, b) => a.ts.localeCompare(b.ts));
51
60
  let runningTotal = 0;
52
61
  return points.map((point) => {
53
62
  runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);
@@ -1 +1 @@
1
- {"version":3,"file":"flame-graph.es.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, toT, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction toContextData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const fromRecords = records.map(r => ({\n ts: String(getObservationTimestamp(r)),\n pendingMessageTokens: r.pendingMessageTokens,\n }));\n const fromMarkers = markers\n .filter(m => m.pendingTokens != null)\n .map(m => ({\n ts: m.timestamp,\n pendingMessageTokens: m.pendingTokens!,\n }));\n return [...fromRecords, ...fromMarkers]\n .sort((a, b) => a.ts.localeCompare(b.ts))\n .map(d => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));\n}\n\nfunction toActiveObservationData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const points = [\n ...records.map(record => ({\n ts: String(getObservationTimestamp(record)),\n observationTokenCount: record.observationTokenCount,\n })),\n ...markers\n .filter(marker => marker.type === 'status' && marker.observationTokens != null)\n .map(marker => ({\n ts: marker.timestamp,\n observationTokenCount: marker.observationTokens!,\n })),\n ].sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(runningTotal, point.observationTokenCount);\n return { t: toT(point.ts, domain), observationTokenCount: runningTotal };\n });\n}\n\nfunction toBufferedObservationData(markers: ExtractedOmMarker[], domain: TDomain) {\n const points = markers\n .filter(\n marker => marker.observationTokens != null && (marker.type === 'buffering-end' || marker.type === 'activation'),\n )\n .map(marker => ({\n ts: marker.timestamp,\n bufferedObservationTokenCount:\n marker.type === 'activation' ? -marker.observationTokens! : marker.observationTokens!,\n }))\n .sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);\n return { t: toT(point.ts, domain), bufferedObservationTokenCount: runningTotal };\n });\n}\n\nfunction toEventData(records: OMHistoryRecord[], domain: TDomain) {\n return [...records]\n .sort((a, b) => String(getObservationTimestamp(a)).localeCompare(String(getObservationTimestamp(b))))\n .map(r => ({ t: toT(String(getObservationTimestamp(r)), domain), event: 1 }));\n}\n\nfunction toMessageData(messages: MemoryMessage[], domain: TDomain) {\n return [...messages]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map(m => ({\n t: toT(new Date(m.createdAt).toISOString(), domain),\n event: 1,\n role: m.role,\n }));\n}\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-ui-xs text-icon3\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className=\"flex flex-col gap-0.5 rounded border border-border1 bg-surface3 px-2 py-1.5 font-mono text-ui-xs shadow\">\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">time</span>\n <span className=\"text-neutral6\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">{entry.name}</span>\n <span className=\"text-neutral6\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"rounded border border-border1 bg-surface3 px-2 py-1 font-mono text-ui-xs shadow\">\n {time && <span className=\"text-neutral6\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const maxValue = Math.max(0, ...data.map(d => Number(d[dataKey]) || 0));\n const yMax = threshold != null ? Math.max(maxValue, threshold) : undefined;\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const areaValueByTime = new Map(areaData.map(point => [point.t, Number(point[areaDataKey] ?? 0)]));\n const eventsByTime = eventData.reduce<Map<number, Array<(typeof eventData)[number]>>>((acc, event) => {\n const bucket = acc.get(event.t);\n if (bucket) {\n bucket.push(event);\n } else {\n acc.set(event.t, [event]);\n }\n return acc;\n }, new Map());\n const allTimes = Array.from(new Set([...areaValueByTime.keys(), ...eventsByTime.keys()])).sort((a, b) => a - b);\n\n let lastAreaValue = 0;\n const combinedData: Array<Record<string, unknown> & { t: number }> = [];\n for (const time of allTimes) {\n const nextAreaValue = areaValueByTime.get(time);\n if (nextAreaValue != null) {\n lastAreaValue = nextAreaValue;\n }\n\n const bucket = eventsByTime.get(time);\n if (bucket && bucket.length > 0) {\n for (const event of bucket) {\n combinedData.push({ ...event, t: time, [areaDataKey]: lastAreaValue });\n }\n } else {\n combinedData.push({ t: time, [areaDataKey]: lastAreaValue });\n }\n }\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const label = state?.activeLabel;\n if (label != null && onSelectT) onSelectT(Number(label));\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) => {\n const dotPayload = props.payload as { event?: number } | undefined;\n if (!dotPayload?.event) return <></>;\n return <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />;\n }}\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border1/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border1/50 pl-3\">\n <p className=\"text-ui-xs font-medium text-icon3\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div className=\"absolute inset-y-0 left-0 bg-surface2/60\" style={{ width: `${leftPercent}%` }} />\n <div\n className=\"absolute inset-y-0 border-y border-border1/30 bg-neutral6/5\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div className=\"absolute inset-y-0 right-0 bg-surface2/60\" style={{ width: `${100 - rightPercent}%` }} />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pb-2 pr-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n"],"names":["label"],"mappings":"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"}
1
+ {"version":3,"file":"flame-graph.es.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, toT, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction toContextData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const fromRecords = records.map(r => ({\n ts: String(getObservationTimestamp(r)),\n pendingMessageTokens: r.pendingMessageTokens,\n }));\n const fromMarkers = markers.flatMap(m => {\n if (m.pendingTokens == null) return [];\n return {\n ts: m.timestamp,\n pendingMessageTokens: m.pendingTokens,\n };\n });\n return [...fromRecords, ...fromMarkers]\n .sort((a, b) => a.ts.localeCompare(b.ts))\n .map(d => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));\n}\n\nfunction toActiveObservationData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const points = [\n ...records.map(record => ({\n ts: String(getObservationTimestamp(record)),\n observationTokenCount: record.observationTokenCount,\n })),\n ...markers.flatMap(marker => {\n if (marker.type !== 'status' || marker.observationTokens == null) return [];\n return {\n ts: marker.timestamp,\n observationTokenCount: marker.observationTokens,\n };\n }),\n ].sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(runningTotal, point.observationTokenCount);\n return { t: toT(point.ts, domain), observationTokenCount: runningTotal };\n });\n}\n\nfunction toBufferedObservationData(markers: ExtractedOmMarker[], domain: TDomain) {\n const points = markers\n .flatMap(marker => {\n if (marker.observationTokens == null || (marker.type !== 'buffering-end' && marker.type !== 'activation')) {\n return [];\n }\n return {\n ts: marker.timestamp,\n bufferedObservationTokenCount:\n marker.type === 'activation' ? -marker.observationTokens : marker.observationTokens,\n };\n })\n .sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);\n return { t: toT(point.ts, domain), bufferedObservationTokenCount: runningTotal };\n });\n}\n\nfunction toEventData(records: OMHistoryRecord[], domain: TDomain) {\n return [...records]\n .sort((a, b) => String(getObservationTimestamp(a)).localeCompare(String(getObservationTimestamp(b))))\n .map(r => ({ t: toT(String(getObservationTimestamp(r)), domain), event: 1 }));\n}\n\nfunction toMessageData(messages: MemoryMessage[], domain: TDomain) {\n return [...messages]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map(m => ({\n t: toT(new Date(m.createdAt).toISOString(), domain),\n event: 1,\n role: m.role,\n }));\n}\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-ui-xs text-icon3\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className=\"flex flex-col gap-0.5 rounded border border-border1 bg-surface3 px-2 py-1.5 font-mono text-ui-xs shadow\">\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">time</span>\n <span className=\"text-neutral6\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">{entry.name}</span>\n <span className=\"text-neutral6\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"rounded border border-border1 bg-surface3 px-2 py-1 font-mono text-ui-xs shadow\">\n {time && <span className=\"text-neutral6\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const maxValue = Math.max(0, ...data.map(d => Number(d[dataKey]) || 0));\n const yMax = threshold != null ? Math.max(maxValue, threshold) : undefined;\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const areaValueByTime = new Map(areaData.map(point => [point.t, Number(point[areaDataKey] ?? 0)]));\n const eventsByTime = eventData.reduce<Map<number, Array<(typeof eventData)[number]>>>((acc, event) => {\n const bucket = acc.get(event.t);\n if (bucket) {\n bucket.push(event);\n } else {\n acc.set(event.t, [event]);\n }\n return acc;\n }, new Map());\n const allTimes = Array.from(new Set([...areaValueByTime.keys(), ...eventsByTime.keys()])).sort((a, b) => a - b);\n\n let lastAreaValue = 0;\n const combinedData: Array<Record<string, unknown> & { t: number }> = [];\n for (const time of allTimes) {\n const nextAreaValue = areaValueByTime.get(time);\n if (nextAreaValue != null) {\n lastAreaValue = nextAreaValue;\n }\n\n const bucket = eventsByTime.get(time);\n if (bucket && bucket.length > 0) {\n for (const event of bucket) {\n combinedData.push({ ...event, t: time, [areaDataKey]: lastAreaValue });\n }\n } else {\n combinedData.push({ t: time, [areaDataKey]: lastAreaValue });\n }\n }\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const label = state?.activeLabel;\n if (label != null && onSelectT) onSelectT(Number(label));\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) => {\n const dotPayload = props.payload as { event?: number } | undefined;\n if (!dotPayload?.event) return <></>;\n return <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />;\n }}\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border1/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border1/50 pl-3\">\n <p className=\"text-ui-xs font-medium text-icon3\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div className=\"absolute inset-y-0 left-0 bg-surface2/60\" style={{ width: `${leftPercent}%` }} />\n <div\n className=\"absolute inset-y-0 border-y border-border1/30 bg-neutral6/5\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div className=\"absolute inset-y-0 right-0 bg-surface2/60\" style={{ width: `${100 - rightPercent}%` }} />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pb-2 pr-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n"],"names":["label"],"mappings":"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"}
@@ -5,15 +5,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const react = require('@mastra/react');
6
6
  const reactQuery = require('@tanstack/react-query');
7
7
 
8
- const memoryStatusQueryKey = (agentId, threadId) => ["memory", "status", agentId, threadId ?? ""];
8
+ const memoryStatusQueryKey = (agentId, threadId) => ["memory", "status", agentId, threadId];
9
9
  function useMemoryStatus(agentId, threadId) {
10
10
  const client = react.useMastraClient();
11
11
  return reactQuery.useQuery({
12
12
  queryKey: memoryStatusQueryKey(agentId, threadId),
13
- queryFn: () => client.getMemoryStatus(agentId, void 0, {
13
+ queryFn: agentId ? () => client.getMemoryStatus(agentId, void 0, {
14
14
  threadId
15
- }),
16
- enabled: !!agentId
15
+ }) : reactQuery.skipToken
17
16
  });
18
17
  }
19
18
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-memory-status.cjs.js","sources":["../../../../src/domains/memory/hooks/use-memory-status.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryStatusQueryKey = (agentId: string, threadId?: string) =>\n ['memory', 'status', agentId, threadId ?? ''] as const;\n\nexport function useMemoryStatus(agentId: string | undefined, threadId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: memoryStatusQueryKey(agentId!, threadId),\n queryFn: () =>\n client.getMemoryStatus(agentId!, undefined, {\n threadId,\n }),\n enabled: !!agentId,\n });\n}\n"],"names":["useMastraClient","useQuery"],"mappings":";;;;;;;AAGO,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAAiB,QAAA,KACpD,CAAC,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,EAAE;AAEvC,SAAS,eAAA,CAAgB,SAA6B,QAAA,EAAmB;AAC9E,EAAA,MAAM,SAASA,qBAAA,EAAgB;AAE/B,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,oBAAA,CAAqB,OAAA,EAAU,QAAQ,CAAA;AAAA,IACjD,OAAA,EAAS,MACP,MAAA,CAAO,eAAA,CAAgB,SAAU,MAAA,EAAW;AAAA,MAC1C;AAAA,KACD,CAAA;AAAA,IACH,OAAA,EAAS,CAAC,CAAC;AAAA,GACZ,CAAA;AACH;;;;;"}
1
+ {"version":3,"file":"use-memory-status.cjs.js","sources":["../../../../src/domains/memory/hooks/use-memory-status.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { skipToken, useQuery } from '@tanstack/react-query';\n\nexport const memoryStatusQueryKey = (agentId: string | undefined, threadId?: string) =>\n ['memory', 'status', agentId, threadId] as const;\n\nexport function useMemoryStatus(agentId: string | undefined, threadId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: memoryStatusQueryKey(agentId, threadId),\n queryFn: agentId\n ? () =>\n client.getMemoryStatus(agentId, undefined, {\n threadId,\n })\n : skipToken,\n });\n}\n"],"names":["useMastraClient","useQuery","skipToken"],"mappings":";;;;;;;AAGO,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAA6B,QAAA,KAChE,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ;AAEjC,SAAS,eAAA,CAAgB,SAA6B,QAAA,EAAmB;AAC9E,EAAA,MAAM,SAASA,qBAAA,EAAgB;AAE/B,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,oBAAA,CAAqB,OAAA,EAAS,QAAQ,CAAA;AAAA,IAChD,SAAS,OAAA,GACL,MACE,MAAA,CAAO,eAAA,CAAgB,SAAS,MAAA,EAAW;AAAA,MACzC;AAAA,KACD,CAAA,GACHC;AAAA,GACL,CAAA;AACH;;;;;"}
@@ -1,15 +1,14 @@
1
1
  import { useMastraClient } from '@mastra/react';
2
- import { useQuery } from '@tanstack/react-query';
2
+ import { useQuery, skipToken } from '@tanstack/react-query';
3
3
 
4
- const memoryStatusQueryKey = (agentId, threadId) => ["memory", "status", agentId, threadId ?? ""];
4
+ const memoryStatusQueryKey = (agentId, threadId) => ["memory", "status", agentId, threadId];
5
5
  function useMemoryStatus(agentId, threadId) {
6
6
  const client = useMastraClient();
7
7
  return useQuery({
8
8
  queryKey: memoryStatusQueryKey(agentId, threadId),
9
- queryFn: () => client.getMemoryStatus(agentId, void 0, {
9
+ queryFn: agentId ? () => client.getMemoryStatus(agentId, void 0, {
10
10
  threadId
11
- }),
12
- enabled: !!agentId
11
+ }) : skipToken
13
12
  });
14
13
  }
15
14
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-memory-status.es.js","sources":["../../../../src/domains/memory/hooks/use-memory-status.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryStatusQueryKey = (agentId: string, threadId?: string) =>\n ['memory', 'status', agentId, threadId ?? ''] as const;\n\nexport function useMemoryStatus(agentId: string | undefined, threadId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: memoryStatusQueryKey(agentId!, threadId),\n queryFn: () =>\n client.getMemoryStatus(agentId!, undefined, {\n threadId,\n }),\n enabled: !!agentId,\n });\n}\n"],"names":[],"mappings":";;;AAGO,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAAiB,QAAA,KACpD,CAAC,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,EAAE;AAEvC,SAAS,eAAA,CAAgB,SAA6B,QAAA,EAAmB;AAC9E,EAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,oBAAA,CAAqB,OAAA,EAAU,QAAQ,CAAA;AAAA,IACjD,OAAA,EAAS,MACP,MAAA,CAAO,eAAA,CAAgB,SAAU,MAAA,EAAW;AAAA,MAC1C;AAAA,KACD,CAAA;AAAA,IACH,OAAA,EAAS,CAAC,CAAC;AAAA,GACZ,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"use-memory-status.es.js","sources":["../../../../src/domains/memory/hooks/use-memory-status.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { skipToken, useQuery } from '@tanstack/react-query';\n\nexport const memoryStatusQueryKey = (agentId: string | undefined, threadId?: string) =>\n ['memory', 'status', agentId, threadId] as const;\n\nexport function useMemoryStatus(agentId: string | undefined, threadId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: memoryStatusQueryKey(agentId, threadId),\n queryFn: agentId\n ? () =>\n client.getMemoryStatus(agentId, undefined, {\n threadId,\n })\n : skipToken,\n });\n}\n"],"names":[],"mappings":";;;AAGO,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAA6B,QAAA,KAChE,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ;AAEjC,SAAS,eAAA,CAAgB,SAA6B,QAAA,EAAmB;AAC9E,EAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,oBAAA,CAAqB,OAAA,EAAS,QAAQ,CAAA;AAAA,IAChD,SAAS,OAAA,GACL,MACE,MAAA,CAAO,eAAA,CAAgB,SAAS,MAAA,EAAW;AAAA,MACzC;AAAA,KACD,CAAA,GACH;AAAA,GACL,CAAA;AACH;;;;"}
@@ -12,8 +12,7 @@ function useMemoryThreadMessages(threadId, opts) {
12
12
  const perPage = opts?.perPage ?? 100;
13
13
  return reactQuery.useQuery({
14
14
  queryKey: memoryThreadMessagesQueryKey(threadId, page),
15
- queryFn: () => client.getMemoryThread({ threadId }).listMessages({ page, perPage }),
16
- enabled: !!threadId
15
+ queryFn: threadId ? () => client.getMemoryThread({ threadId }).listMessages({ page, perPage }) : reactQuery.skipToken
17
16
  });
18
17
  }
19
18
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-memory-thread-messages.cjs.js","sources":["../../../../src/domains/memory/hooks/use-memory-thread-messages.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryThreadMessagesQueryKey = (threadId: string, page?: number) =>\n ['memory', 'thread', threadId, 'messages', page ?? 0] as const;\n\nexport function useMemoryThreadMessages(threadId: string | undefined, opts?: { page?: number; perPage?: number }) {\n const client = useMastraClient();\n const page = opts?.page ?? 0;\n const perPage = opts?.perPage ?? 100;\n\n return useQuery({\n queryKey: memoryThreadMessagesQueryKey(threadId!, page),\n queryFn: () => client.getMemoryThread({ threadId: threadId! }).listMessages({ page, perPage }),\n enabled: !!threadId,\n });\n}\n"],"names":["useMastraClient","useQuery"],"mappings":";;;;;;;AAGO,MAAM,4BAAA,GAA+B,CAAC,QAAA,EAAkB,IAAA,KAC7D,CAAC,UAAU,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,IAAA,IAAQ,CAAC;AAE/C,SAAS,uBAAA,CAAwB,UAA8B,IAAA,EAA4C;AAChH,EAAA,MAAM,SAASA,qBAAA,EAAgB;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,GAAA;AAEjC,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,4BAAA,CAA6B,QAAA,EAAW,IAAI,CAAA;AAAA,IACtD,OAAA,EAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,QAAA,EAAqB,CAAA,CAAE,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC7F,OAAA,EAAS,CAAC,CAAC;AAAA,GACZ,CAAA;AACH;;;;;"}
1
+ {"version":3,"file":"use-memory-thread-messages.cjs.js","sources":["../../../../src/domains/memory/hooks/use-memory-thread-messages.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { skipToken, useQuery } from '@tanstack/react-query';\n\nexport const memoryThreadMessagesQueryKey = (threadId: string | undefined, page?: number) =>\n ['memory', 'thread', threadId, 'messages', page ?? 0] as const;\n\nexport function useMemoryThreadMessages(threadId: string | undefined, opts?: { page?: number; perPage?: number }) {\n const client = useMastraClient();\n const page = opts?.page ?? 0;\n const perPage = opts?.perPage ?? 100;\n\n return useQuery({\n queryKey: memoryThreadMessagesQueryKey(threadId, page),\n queryFn: threadId ? () => client.getMemoryThread({ threadId }).listMessages({ page, perPage }) : skipToken,\n });\n}\n"],"names":["useMastraClient","useQuery","skipToken"],"mappings":";;;;;;;AAGO,MAAM,4BAAA,GAA+B,CAAC,QAAA,EAA8B,IAAA,KACzE,CAAC,UAAU,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,IAAA,IAAQ,CAAC;AAE/C,SAAS,uBAAA,CAAwB,UAA8B,IAAA,EAA4C;AAChH,EAAA,MAAM,SAASA,qBAAA,EAAgB;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,GAAA;AAEjC,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,4BAAA,CAA6B,QAAA,EAAU,IAAI,CAAA;AAAA,IACrD,OAAA,EAAS,QAAA,GAAW,MAAM,MAAA,CAAO,gBAAgB,EAAE,QAAA,EAAU,CAAA,CAAE,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,GAAIC;AAAA,GAClG,CAAA;AACH;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { useMastraClient } from '@mastra/react';
2
- import { useQuery } from '@tanstack/react-query';
2
+ import { useQuery, skipToken } from '@tanstack/react-query';
3
3
 
4
4
  const memoryThreadMessagesQueryKey = (threadId, page) => ["memory", "thread", threadId, "messages", page ?? 0];
5
5
  function useMemoryThreadMessages(threadId, opts) {
@@ -8,8 +8,7 @@ function useMemoryThreadMessages(threadId, opts) {
8
8
  const perPage = opts?.perPage ?? 100;
9
9
  return useQuery({
10
10
  queryKey: memoryThreadMessagesQueryKey(threadId, page),
11
- queryFn: () => client.getMemoryThread({ threadId }).listMessages({ page, perPage }),
12
- enabled: !!threadId
11
+ queryFn: threadId ? () => client.getMemoryThread({ threadId }).listMessages({ page, perPage }) : skipToken
13
12
  });
14
13
  }
15
14