@@ -10,7 +10,7 @@ import {
1010 Search ,
1111 Server ,
1212} from "lucide-react" ;
13- import { useEffect , useMemo , useState , type ReactNode } from "react" ;
13+ import { useMemo , useState , type ReactNode } from "react" ;
1414import {
1515 flexRender ,
1616 getCoreRowModel ,
@@ -35,30 +35,11 @@ import {
3535 type RuntimeDashboardRow ,
3636} from "./dashboard-model" ;
3737import type { RuntimeDashboardSnapshot } from "./runtime-snapshot" ;
38- import { RUNTIME_SNAPSHOT_REFRESH_MS } from "./runtime-snapshot" ;
39- import { RuntimeTrendCharts } from "./RuntimeTrendCharts" ;
40- import type { RuntimeTrendSource } from "./RuntimeTrendCharts" ;
41- import {
42- RUNTIME_DURABLE_RANGES ,
43- type RuntimeDurableRange ,
44- type RuntimeDurableSnapshot ,
45- } from "./runtime-history" ;
46- import {
47- appendRuntimeTrendSample ,
48- RUNTIME_TREND_RANGES ,
49- RUNTIME_TREND_WINDOW_MS ,
50- runtimeTrendRange ,
51- type RuntimeTrendRange ,
52- type RuntimeTrendSample ,
53- } from "./runtime-trends" ;
38+ import { RuntimeTrendPanel , type RuntimeHistoryLoader } from "./RuntimeTrendPanel" ;
5439
5540const PAGE_SIZE = 10 ;
5641
57- export type RuntimeHistoryLoader = (
58- snapshot : RuntimeDashboardSnapshot ,
59- range : RuntimeDurableRange ,
60- signal : AbortSignal ,
61- ) => Promise < RuntimeDurableSnapshot | null > ;
42+ export type { RuntimeHistoryLoader } from "./RuntimeTrendPanel" ;
6243
6344function RuntimeMetric ( {
6445 icon,
@@ -308,68 +289,6 @@ export function RuntimeObservabilityContent({
308289} ) {
309290 const model = useMemo ( ( ) => buildRuntimeDashboardModel ( snapshot . sessions , snapshot . observations ) , [ snapshot ] ) ;
310291 const summary = model . summary ;
311- const [ trendSamples , setTrendSamples ] = useState < RuntimeTrendSample [ ] > ( ( ) => appendRuntimeTrendSample ( [ ] , snapshot ) ) ;
312- const [ selectedTrendRange , setSelectedTrendRange ] = useState < RuntimeTrendRange > ( RUNTIME_TREND_WINDOW_MS ) ;
313- const [ selectedDurableRange , setSelectedDurableRange ] = useState < RuntimeDurableRange > ( RUNTIME_DURABLE_RANGES [ 0 ] . milliseconds ) ;
314- const [ durableSnapshot , setDurableSnapshot ] = useState < RuntimeDurableSnapshot | null > ( null ) ;
315- const [ durableState , setDurableState ] = useState < "connecting" | "ready" | "unavailable" | "failed" > ( "connecting" ) ;
316- const [ durableError , setDurableError ] = useState < string | null > ( null ) ;
317- const visibleTrendSamples = useMemo (
318- ( ) => runtimeTrendRange ( trendSamples , selectedTrendRange ) ,
319- [ selectedTrendRange , trendSamples ] ,
320- ) ;
321- const source : RuntimeTrendSource = durableState === "unavailable" && durableSnapshot === null
322- ? "live"
323- : "durable" ;
324- const selectedSamples = source === "durable"
325- ? durableSnapshot ?. samples ?? [ ]
326- : visibleTrendSamples ;
327- const latestTrendSample = selectedSamples . at ( - 1 ) ;
328- const selectedRange = source === "durable" ? selectedDurableRange : selectedTrendRange ;
329- const rangeEnd = source === "durable" && durableSnapshot !== null
330- ? durableSnapshot . rangeEnd
331- : latestTrendSample ?. sampledAt ?? snapshot . loadedAt ;
332- const rangeStart = source === "durable" && durableSnapshot !== null
333- ? durableSnapshot . rangeStart
334- : rangeEnd - selectedTrendRange ;
335-
336- useEffect ( ( ) => {
337- setTrendSamples ( ( current ) => appendRuntimeTrendSample ( current , snapshot ) ) ;
338- } , [ snapshot ] ) ;
339-
340- useEffect ( ( ) => {
341- const controller = new AbortController ( ) ;
342- setDurableState ( "connecting" ) ;
343- setDurableError ( null ) ;
344- void loadRuntimeHistory ( snapshot , selectedDurableRange , controller . signal ) . then ( ( result ) => {
345- if ( controller . signal . aborted ) return ;
346- if ( result === null ) {
347- setDurableSnapshot ( null ) ;
348- setDurableState ( "unavailable" ) ;
349- return ;
350- }
351- setDurableSnapshot ( result ) ;
352- setDurableState ( "ready" ) ;
353- } ) . catch ( ( error : unknown ) => {
354- if ( controller . signal . aborted ) return ;
355- setDurableState ( "failed" ) ;
356- setDurableError ( error instanceof Error ? error . message : "Durable Runtime history request failed." ) ;
357- } ) ;
358- return ( ) => controller . abort ( ) ;
359- } , [ loadRuntimeHistory , selectedDurableRange , snapshot ] ) ;
360-
361- const rangeOptions = source === "durable" ? RUNTIME_DURABLE_RANGES : RUNTIME_TREND_RANGES ;
362- const sourceStatus = source === "durable"
363- ? durableState === "failed"
364- ? "History stale"
365- : durableState === "connecting"
366- ? "History · loading"
367- : `Durable · ${ durableSnapshot ?. resolutionSeconds ?? 0 } s`
368- : stale
369- ? "Stale · retrying"
370- : `Live · ${ RUNTIME_SNAPSHOT_REFRESH_MS / 1_000 } s` ;
371- const sourceStatusStale = source === "durable" ? durableState === "failed" : stale ;
372-
373292 return (
374293 < >
375294 < div className = "dashboard-runtime-summary" aria-label = "Runtime resource snapshot" >
@@ -379,49 +298,7 @@ export function RuntimeObservabilityContent({
379298 < RuntimeMetric icon = { < Gauge size = { 17 } /> } label = "Reported tokens" value = { formatDashboardTokens ( summary . totalTokens ) } detail = { `${ summary . tokenCoverageCount } /${ summary . sessionCount } Sessions report usage` } />
380299 </ div >
381300
382- < section className = "dashboard-runtime-live" aria-labelledby = "dashboard-runtime-live-heading" >
383- < header className = "dashboard-runtime-live-toolbar" >
384- < div >
385- < h3 id = "dashboard-runtime-live-heading" > Resource trends</ h3 >
386- < p > { source === "durable" ? "Retained samples · durable history" : "Browser-local samples · reset on reload" } </ p >
387- </ div >
388- < div className = "dashboard-runtime-live-controls" >
389- < span
390- className = { `${ sourceStatusStale ? "dashboard-runtime-live-status dashboard-runtime-live-status-stale" : "dashboard-runtime-live-status" } ${ source === "durable" ? " dashboard-runtime-live-status-durable" : "" } ` }
391- aria-label = { source === "durable"
392- ? `${ sourceStatus } ; ${ durableSnapshot ?. targetCount ?? 0 } Runtime targets`
393- : stale
394- ? "Runtime sampling refresh failed; showing retained samples"
395- : `Live Runtime sampling every ${ RUNTIME_SNAPSHOT_REFRESH_MS / 1_000 } seconds` }
396- >
397- < i aria-hidden = "true" /> { sourceStatus }
398- </ span >
399- < span className = "dashboard-runtime-sample-count" >
400- { selectedSamples . length } { source === "durable" ? selectedSamples . length === 1 ? "bucket" : "buckets" : selectedSamples . length === 1 ? "sample" : "samples" }
401- { source === "durable" && durableSnapshot ? < > · { durableSnapshot . sampleCount } /{ durableSnapshot . expectedSampleCount } observations</ > : null }
402- { latestTrendSample ? < > · < time dateTime = { new Date ( latestTrendSample . sampledAt ) . toISOString ( ) } > { new Date ( latestTrendSample . sampledAt ) . toLocaleTimeString ( [ ] , { hour : "2-digit" , minute : "2-digit" , second : "2-digit" } ) } </ time > </ > : null }
403- </ span >
404- < div className = "dashboard-runtime-range" role = "group" aria-label = { source === "durable" ? "Runtime durable range" : "Runtime live range" } >
405- { rangeOptions . map ( ( range ) => (
406- < button
407- key = { range . label }
408- type = "button"
409- aria-pressed = { selectedRange === range . milliseconds }
410- onClick = { ( ) => {
411- if ( source === "durable" ) setSelectedDurableRange ( range . milliseconds as RuntimeDurableRange ) ;
412- else setSelectedTrendRange ( range . milliseconds as RuntimeTrendRange ) ;
413- } }
414- >
415- { range . label }
416- </ button >
417- ) ) }
418- </ div >
419- </ div >
420- </ header >
421- { durableState === "failed" && durableError ? < p className = "dashboard-runtime-history-error" role = "status" > Durable history refresh failed: { durableError } </ p > : null }
422- { durableState === "unavailable" ? < p className = "dashboard-runtime-history-note" > Durable history is not configured; Live samples remain available.</ p > : null }
423- < RuntimeTrendCharts samples = { selectedSamples } source = { source } rangeStart = { rangeStart } rangeEnd = { rangeEnd } />
424- </ section >
301+ < RuntimeTrendPanel snapshot = { snapshot } stale = { stale } loadRuntimeHistory = { loadRuntimeHistory } />
425302
426303 < details className = "dashboard-runtime-explorer" >
427304 < summary >
0 commit comments