@routecraft/cli 0.6.0-canary.8 → 0.6.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tui/types.ts","../../src/tui/utils.ts","../../src/tui/hooks/use-scroll-list.ts","../../src/tui/components/panel.tsx","../../src/tui/components/dot-graph.tsx","../../src/tui/components/route-header.tsx","../../src/tui/components/table.tsx","../../src/tui/components/event-columns.tsx","../../src/tui/components/center-exchange-list.tsx","../../src/tui/components/json-format.tsx","../../src/tui/components/center-exchange-detail.tsx","../../src/tui/components/events-view.tsx","../../src/tui/components/event-detail.tsx","../../src/tui/components/exchange-deep-view.tsx","../../src/tui/components/capability-list.tsx","../../src/tui/app.tsx"],"names":["NAV_SECTIONS","ALL_NAV_ITEMS","s","truncate","str","maxLen","formatDuration","ms","statusColor","status","col","len","parseEventDetail","raw","d","exchange","duration","adapter","meta","m","keys","k","qualifier","route","err","formatDetailColumns","_eventName","parsed","fmtNum","n","adjustScrollOffset","selected","currentOffset","visibleRows","useScrollList","initialIndex","selectedIndex","setSelectedIndex","useState","scrollOffset","setScrollOffset","moveTo","useCallback","index","listLength","clamped","off","moveBy","delta","prev","next","reset","Panel","title","subtitle","color","width","flexGrow","paddingX","children","innerWidth","jsxs","Box","Fragment","Text","jsx","BRAILLE_DOTS","BRAILLE_BASE","DEFAULT_STEPS","DotGraph","values","columns","steps","label","dotHeight","data","heights","v","i","termRows","rows","tr","baseStep","segments","ci","h","bits","sr","stepLevel","char","last","RouteHeader","Table","rowKey","gap","emptyMessage","renderFullRow","gapStr","header","c","after","text","visible","remaining","row","vi","dataIndex","fullRow","resolved","cell","eventDetailColumns","accessor","cache","getColumns","ev","cols","_sel","w","selectorColumn","_row","exchangeColumns","CenterExchangeList","capabilityId","exchanges","height","activity","graphTermRows","headerRows","tableRows","ex","tokenizeLine","line","tokens","re","lastIndex","match","TOKEN_COLORS","formatJson","maxWidth","clampedMax","ColoredJsonLine","token","parseDetails","groupEventsByExchange","events","parentExchangeId","groups","childIndex","exId","key","detailColumns","indent","CenterExchangeDetail","hasExtra","eventRows","hasChildren","displayRows","group","eventsTitle","eventColumns","EventsView","EventDetail","event","routeId","exchangeId","headerHeight","jsonChrome","jsonWidth","jsonLines","_","buildSnapshotLines","snapshot","lines","ExchangeDeepView","dotColor","CapabilityList","routes","listOffset","offset","App","db","exit","useApp","stdout","useStdout","activeNav","setActiveNav","focus","setFocus","showDetail","setShowDetail","setRoutes","metrics","setMetrics","liveTraffic","setLiveTraffic","selectedRouteActivity","setSelectedRouteActivity","routeScroll","setExchanges","exchangeScroll","selectedExchange","setSelectedExchange","exchangeEvents","setExchangeEvents","setEvents","eventScroll","detailScroll","selectedEvent","setSelectedEvent","showEventDetail","setShowEventDetail","eventDetailScroll","setEventDetailScroll","showDeepView","setShowDeepView","deepViewScroll","setDeepViewScroll","exchangeSnapshot","setExchangeSnapshot","PAGE_SIZE","JUMP","leftWidth","rightWidth","centerWidth","bodyHeight","navListHeight","refresh","routeSummary","liveCols","routeCols","curRoute","useEffect","timer","selectRoute","switchNav","nav","selectedRoute","exchangeHeaderRows","exchangeTableRows","eventsTableRows","useInput","input","navByShortcut","step","detailEventRows","uniqueExchangeIds","groupCount","totalDisplayRows","rowIndex","targetEvent","parentId","gKey","groupEvents","navActive","centerActive","keymapItems","version","section","si","item","value","renderTui","dbPath","TelemetryDb","msg","render"],"mappings":"yQAOO,IAAMA,EAAAA,CAA6B,CACxC,CACE,KAAA,CAAO,CAAC,CAAE,GAAA,CAAK,eAAgB,KAAA,CAAO,cAAA,CAAgB,QAAA,CAAU,GAAI,CAAC,CACvE,CAAA,CACA,CACE,KAAA,CAAO,CACL,CAAE,GAAA,CAAK,WAAA,CAAa,KAAA,CAAO,WAAA,CAAa,QAAA,CAAU,GAAI,CAAA,CACtD,CAAE,GAAA,CAAK,QAAA,CAAU,KAAA,CAAO,QAAA,CAAU,QAAA,CAAU,GAAI,CAAA,CAChD,CAAE,GAAA,CAAK,QAAA,CAAU,KAAA,CAAO,QAAA,CAAU,QAAA,CAAU,GAAI,CAClD,CACF,CACF,CAAA,CAEaC,EAAAA,CAAgBD,EAAAA,CAAa,OAAA,CAASE,CAAAA,EAAMA,CAAAA,CAAE,KAAK,CAAA,CCpBzD,SAASC,EAAAA,CAASC,CAAAA,CAAaC,CAAAA,CAAwB,CAC5D,OAAIA,GAAU,CAAA,CAAU,EAAA,CACjBD,CAAAA,CAAI,MAAA,CAASC,CAAAA,CAASD,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAGC,CAAAA,CAAS,CAAC,CAAA,CAAI,QAAA,CAAWD,CACrE,CAEO,SAASE,CAAAA,CAAeC,EAA2B,CAExD,OADIA,CAAAA,EAAO,IAAA,EACP,CAAC,MAAA,CAAO,QAAA,CAASA,CAAE,CAAA,EAAKA,CAAAA,CAAK,CAAA,CAAU,GAAA,CACvCA,CAAAA,GAAO,CAAA,CAAU,MAAA,CACjBA,CAAAA,CAAK,IAAa,CAAA,EAAG,IAAA,CAAK,KAAA,CAAMA,CAAE,CAAC,CAAA,EAAA,CAAA,CAChC,CAAA,EAAA,CAAIA,CAAAA,CAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAClC,CAEO,SAASC,EAAAA,CAAYC,EAAwB,CAClD,OAAQA,CAAAA,EACN,KAAK,WAAA,CACL,KAAK,SAAA,CACH,OAAO,OAAA,CACT,KAAK,QAAA,CACH,OAAO,KAAA,CACT,KAAK,SAAA,CACL,KAAK,SAAA,CACH,OAAO,QAAA,CACT,QACE,OAAO,OACX,CACF,CAEO,SAASC,CAAAA,CAAIN,CAAAA,CAAaO,CAAAA,CAAiC,CAChE,OAAIA,CAAAA,GAAQ,MAAA,CAAkBP,EAC1BO,CAAAA,EAAO,CAAA,CAAU,EAAA,CACjBP,CAAAA,CAAI,MAAA,CAASO,CAAAA,CAAYP,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAGO,CAAAA,CAAM,CAAC,CAAA,CAAI,QAAA,CAC9CP,CAAAA,CAAI,MAAA,CAAOO,CAAG,CACvB,CA0BA,SAASC,EAAAA,CAAiBC,CAAAA,CAAmC,CAC3D,GAAI,CACF,IAAMC,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMD,CAAG,CAAA,CAElBE,CAAAA,CACJ,YAAA,GAAgBD,CAAAA,CAAI,GAAG,MAAA,CAAOA,CAAAA,CAAE,UAAa,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAK,EAAA,CAC3DE,CAAAA,CACJ,UAAA,GAAcF,CAAAA,CAAIR,CAAAA,CAAeQ,CAAAA,CAAE,QAAqB,EAAI,EAAA,CAG9D,GAAI,WAAA,GAAeA,CAAAA,EAAK,SAAA,GAAaA,CAAAA,CAAG,CACtC,IAAMG,CAAAA,CACJ,SAAA,GAAaH,CAAAA,CACT,CAAA,CAAA,EAAIA,CAAAA,CAAE,OAAU,CAAA,CAAA,CAAA,CAChB,WAAA,GAAeA,EACb,CAAA,CAAA,EAAIA,CAAAA,CAAE,SAAY,CAAA,CAAA,CAAA,CAClB,EAAA,CACJI,CAAAA,CAAO,EAAA,CACX,GACE,UAAA,GAAcJ,CAAAA,EACd,OAAOA,CAAAA,CAAE,QAAA,EAAgB,QAAA,EACzBA,CAAAA,CAAE,QAAA,GAAgB,KAClB,CACA,IAAMK,CAAAA,CAAIL,CAAAA,CAAE,QAAA,CACNM,CAAAA,CAAO,MAAA,CAAO,IAAA,CAAKD,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAClCC,CAAAA,CAAK,MAAA,CAAS,IAAGF,CAAAA,CAAOE,CAAAA,CAAK,GAAA,CAAKC,CAAAA,EAAM,CAAA,EAAGA,CAAC,CAAA,CAAA,EAAIF,CAAAA,CAAEE,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EACtE,CACA,OAAO,CACL,IAAA,CAAM,MAAA,CAAOP,CAAAA,CAAE,SAAY,CAAA,CAC3B,OAAA,CAAAG,CAAAA,CACA,QAAA,CAAAF,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,IAAA,CAAAE,CACF,CACF,CAGA,GAAI,SAAA,GAAaJ,CAAAA,EAAK,YAAA,GAAgBA,CAAAA,CAAG,CACvC,IAAMQ,CAAAA,CACJ,OAAA,GAAWR,CAAAA,CACP,OAAA,CACA,QAAA,GAAYA,CAAAA,CACV,CAAA,CAAA,EAAI,MAAA,CAAOA,CAAAA,CAAE,MAAS,EAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CACnC,EAAA,CACR,OAAO,CACL,IAAA,CAAM,MAAA,CAAOA,CAAAA,CAAE,OAAU,CAAA,CACzB,OAAA,CAASQ,CAAAA,CACT,QAAA,CAAAP,EACA,QAAA,CAAAC,CAAAA,CACA,IAAA,CAAM,EACR,CACF,CAGA,GAAI,OAAA,GAAWF,CAAAA,EAAK,OAAOA,CAAAA,CAAE,KAAA,EAAa,QAAA,EAAYA,CAAAA,CAAE,KAAA,GAAa,IAAA,CAAM,CACzE,IAAMS,CAAAA,CAAQT,CAAAA,CAAE,KAAA,CAIhB,OAAO,CACL,IAAA,CAAMS,CAAAA,CAAM,OAAA,EAAWA,CAAAA,CAAM,UAAA,EAAY,EAAA,EAAM,GAAA,CAC/C,OAAA,CAAS,EAAA,CACT,QAAA,CAAU,GACV,QAAA,CAAU,EAAA,CACV,IAAA,CAAM,EACR,CACF,CAGA,GAAI,UAAA,GAAcT,CAAAA,CAChB,OAAO,CACL,IAAA,CAAM,CAAA,OAAA,EAAUA,CAAAA,CAAE,QAAW,CAAA,CAAA,CAC7B,QAAS,EAAA,CACT,QAAA,CAAU,EAAA,CACV,QAAA,CAAU,EAAA,CACV,IAAA,CAAM,EACR,CAAA,CAIF,GAAI,OAAA,GAAWA,CAAAA,CAAG,CAChB,IAAMU,CAAAA,CAAMV,CAAAA,CAAE,KAAA,CAKd,OAAO,CACL,IAAA,CAJA,OAAOU,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,GAAQ,IAAA,EAAQ,SAAA,GAAaA,CAAAA,CACpD,MAAA,CAAQA,CAAAA,CAA4B,OAAO,CAAA,CAC3C,MAAA,CAAOA,CAAG,CAAA,CAGd,QAAS,EAAA,CACT,QAAA,CAAU,EAAA,CACV,QAAA,CAAU,EAAA,CACV,IAAA,CAAM,EACR,CACF,CAEA,OAAO,IACT,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CA4BO,SAASC,EAAAA,CACdC,CAAAA,CACAb,CAAAA,CACe,CACf,IAAMc,CAAAA,CAASf,EAAAA,CAAiBC,CAAG,CAAA,CACnC,OAAKc,CAAAA,EACI,CAAE,IAAA,CAAMd,CAAAA,CAAK,OAAA,CAAS,GAAI,QAAA,CAAU,EAAA,CAAI,QAAA,CAAU,EAAA,CAAI,IAAA,CAAM,EAAG,CAG1E,CA6BO,SAASe,CAAAA,CAAOC,CAAAA,CAAmB,CACxC,OAAOA,CAAAA,CAAE,cAAA,CAAe,OAAO,CACjC,CAYO,SAASC,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACQ,CACR,OAAIA,CAAAA,EAAe,CAAA,CAAUD,CAAAA,CACzBD,CAAAA,CAAWC,CAAAA,CAAsBD,CAAAA,CACjCA,CAAAA,EAAYC,CAAAA,CAAgBC,EACvBF,CAAAA,CAAWE,CAAAA,CAAc,CAAA,CAC3BD,CACT,CCnOO,SAASE,EAAAA,CAAcC,CAAAA,CAAe,CAAA,CAAoB,CAC/D,GAAM,CAACC,CAAAA,CAAeC,CAAgB,CAAA,CAAIC,QAAAA,CAASH,CAAY,CAAA,CACzD,CAACI,CAAAA,CAAcC,CAAe,CAAA,CAAIF,QAAAA,CAAS,CAAC,CAAA,CAE5CG,CAAAA,CAASC,WAAAA,CACb,CAACC,CAAAA,CAAeC,CAAAA,CAAoBX,CAAAA,GAAwB,CAC1D,IAAMY,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIF,CAAAA,CAAOC,CAAAA,CAAa,CAAC,CAAC,CAAA,CAC3DP,EAAiBQ,CAAO,CAAA,CACxBL,CAAAA,CAAiBM,CAAAA,EAAQhB,EAAAA,CAAmBe,CAAAA,CAASC,CAAAA,CAAKb,CAAW,CAAC,EACxE,CAAA,CACA,EACF,CAAA,CAEMc,CAAAA,CAASL,WAAAA,CACb,CAACM,CAAAA,CAAeJ,CAAAA,CAAoBX,CAAAA,GAAwB,CAC1DI,CAAAA,CAAkBY,CAAAA,EAAS,CACzB,IAAMC,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAOD,CAAAA,CAAOJ,EAAa,CAAC,CAAC,CAAA,CAC/D,OAAAJ,CAAAA,CAAiBM,CAAAA,EAAQhB,EAAAA,CAAmBoB,CAAAA,CAAMJ,CAAAA,CAAKb,CAAW,CAAC,CAAA,CAC5DiB,CACT,CAAC,EACH,CAAA,CACA,EACF,CAAA,CAEMC,CAAAA,CAAQT,WAAAA,CAAY,IAAM,CAC9BL,CAAAA,CAAiB,CAAC,CAAA,CAClBG,CAAAA,CAAgB,CAAC,EACnB,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CAAE,aAAA,CAAAJ,CAAAA,CAAe,YAAA,CAAAG,CAAAA,CAAc,MAAA,CAAAQ,CAAAA,CAAQ,MAAA,CAAAN,CAAAA,CAAQ,KAAA,CAAAU,CAAM,CAC9D,CChDO,SAASC,CAAAA,CAAM,CACpB,KAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,MAAAC,CAAAA,CAAQ,MAAA,CACR,KAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAW,CAAA,CACX,QAAA,CAAAC,CACF,CAAA,CAQG,CAED,IAAMC,CAAAA,CAAaJ,CAAAA,CAAQA,EAAQ,CAAA,CAAIE,CAAAA,CAAW,CAAA,CAAI,EAAA,CAEtD,OACEG,IAAAA,CAACC,GAAAA,CAAA,CACC,aAAA,CAAc,QAAA,CACd,WAAA,CAAY,OAAA,CACZ,WAAA,CAAaP,CAAAA,CACb,QAAA,CAAUG,CAAAA,CACV,MAAOF,CAAAA,CACP,QAAA,CAAUC,CAAAA,CAET,QAAA,CAAA,CAAAJ,CAAAA,EACCQ,IAAAA,CAAAE,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAF,IAAAA,CAACG,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CACP,QAAA,CAAA,CAAAX,CAAAA,CACAC,GAAYO,IAAAA,CAAAE,QAAAA,CAAA,CAAE,QAAA,CAAA,CAAA,GAAA,CAAET,CAAAA,CAAAA,CAAS,CAAA,CAAA,CAC5B,CAAA,CACAW,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAE,QAAA,CAAA,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAIJ,EAAY,CAAC,CAAC,CAAA,CAAE,CAAA,CAAA,CAC3D,CAAA,CAEDD,CAAAA,CAAAA,CACH,CAEJ,CC5BA,IAAMO,EAAAA,CAAe,CACnB,GAAA,CACA,EAAA,CACA,EAAA,CACA,CACF,CAAA,CACMC,EAAAA,CAAe,KAAA,CAQRC,EAAAA,CAA2B,CACtC,CAAE,IAAK,CAAA,CAAG,KAAA,CAAO,MAAO,CAAA,CACxB,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,OAAQ,CAAA,CAC1B,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,OAAQ,CAAA,CAC1B,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,QAAS,CAAA,CAC3B,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,QAAS,CAAA,CAC3B,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,KAAM,CAC1B,CAAA,CAcO,SAASC,EAAAA,CAAS,CACvB,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQJ,EAAAA,CACR,KAAA,CAAAK,CACF,CAAA,CAKG,CACD,IAAMC,EAAYF,CAAAA,CAAM,MAAA,CAAS,CAAA,CAG3BG,CAAAA,CACJL,CAAAA,CAAO,MAAA,EAAUC,CAAAA,CACbD,CAAAA,CAAO,KAAA,CAAMA,CAAAA,CAAO,MAAA,CAASC,CAAO,CAAA,CACpC,CACE,GAAI,IAAI,MAAMA,CAAAA,CAAUD,CAAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAC7C,GAAGA,CACL,CAAA,CAGAM,CAAAA,CAAUD,CAAAA,CAAK,GAAA,CAAKE,CAAAA,EAAM,CAC9B,GAAIA,GAAK,CAAA,CAAG,OAAO,CAAA,CACnB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIN,CAAAA,CAAM,MAAA,CAAQM,CAAAA,EAAAA,CAChC,GAAID,CAAAA,CAAIL,CAAAA,CAAMM,CAAC,CAAA,CAAG,GAAA,CAAK,OAAOA,CAAAA,CAEhC,OAAOJ,CACT,CAAC,CAAA,CAEKK,CAAAA,CAAW,IAAA,CAAK,IAAA,CAAKL,CAAAA,CAAY,CAAC,CAAA,CAGlCM,CAAAA,CAAsB,EAAC,CAC7B,IAAA,IAASC,CAAAA,CAAKF,EAAW,CAAA,CAAGE,CAAAA,EAAM,CAAA,CAAGA,CAAAA,EAAAA,CAAM,CACzC,IAAMC,CAAAA,CAAWD,CAAAA,CAAK,CAAA,CAGhBE,CAAAA,CAA8C,EAAC,CAErD,IAAA,IAASC,CAAAA,CAAK,CAAA,CAAGA,CAAAA,CAAKT,EAAK,MAAA,CAAQS,CAAAA,EAAAA,CAAM,CACvC,IAAMC,CAAAA,CAAIT,CAAAA,CAAQQ,CAAE,CAAA,CAChBE,CAAAA,CAAO,CAAA,CACP/B,CAAAA,CAAQ,EAAA,CAEZ,IAAA,IAASgC,CAAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,EAAGA,CAAAA,EAAAA,CAAM,CAC7B,IAAMC,CAAAA,CAAYN,CAAAA,CAAWK,CAAAA,CAAK,CAAA,CAClC,GAAIC,CAAAA,CAAYd,CAAAA,CAAW,MAAA,CAGhBW,CAAAA,EAAKG,CAAAA,EAAcH,CAAAA,GAAM,CAAA,EAAKG,CAAAA,GAAc,KAErDF,CAAAA,EAAQpB,EAAAA,CAAaqB,CAAE,CAAA,CAEvBhC,CAAAA,CAAQ8B,CAAAA,GAAM,CAAA,CAAIb,CAAAA,CAAM,CAAC,CAAA,CAAG,KAAA,CAAQA,CAAAA,CAAMgB,CAAS,CAAA,CAAG,KAAA,EAE1D,CAEA,IAAMC,CAAAA,CAAO,MAAA,CAAO,YAAA,CAAatB,EAAAA,CAAemB,CAAI,CAAA,CAC9CI,CAAAA,CAAOP,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CACrCO,CAAAA,EAAQA,CAAAA,CAAK,KAAA,GAAUnC,CAAAA,CACzBmC,EAAK,IAAA,EAAQD,CAAAA,CAEbN,CAAAA,CAAS,IAAA,CAAK,CAAE,IAAA,CAAMM,CAAAA,CAAM,KAAA,CAAAlC,CAAM,CAAC,EAEvC,CAEAyB,CAAAA,CAAK,IAAA,CACHf,GAAAA,CAACD,IAAAA,CAAA,CACE,QAAA,CAAAmB,CAAAA,CAAS,GAAA,CAAI,CAACjF,CAAAA,CAAG,CAAA,GAChBA,CAAAA,CAAE,KAAA,CACA+D,GAAAA,CAACD,IAAAA,CAAA,CAAa,KAAA,CAAO9D,CAAAA,CAAE,KAAA,CACpB,QAAA,CAAAA,CAAAA,CAAE,MADM,CAEX,CAAA,CAEA+D,GAAAA,CAACD,IAAAA,CAAA,CAAc,QAAA,CAAA9D,CAAAA,CAAE,IAAA,CAAA,CAAN,CAAW,CAE1B,CAAA,CAAA,CATS+E,CAUX,CACF,EACF,CAEA,OACEpB,KAAAE,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAiB,CAAAA,CACAP,CAAAA,EAASR,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAE,QAAA,CAAAS,CAAAA,CAAM,CAAA,CAAA,CAClC,CAEJ,CCxIO,SAASkB,GAAY,CAAE,KAAA,CAAApE,CAAM,CAAA,CAA4B,CAC9D,OACEsC,IAAAA,CAAAE,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAF,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,aAAA,CACQ,GAAA,CACZC,GAAAA,CAACD,KAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAAzC,CAAAA,CAAM,EAAA,CACT,CAAA,CAAA,CACF,CAAA,CACAsC,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,SAAA,CACI,GAAA,CACRC,GAAAA,CAACD,KAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAOxD,EAAAA,CAAYe,CAAAA,CAAM,MAAM,CAAA,CACvC,QAAA,CAAAA,CAAAA,CAAM,MAAA,CACT,CAAA,CACC,IAAA,CAAK,aAAA,CAAW0C,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,QAAA,CAAApC,CAAAA,CAAOL,CAAAA,CAAM,cAAc,CAAA,CAAE,CAAA,CACzD,IAAA,CAAK,SAAA,CAAQ,GAAA,CACd0C,GAAAA,CAACD,IAAAA,CAAA,CACC,IAAA,CAAI,IAAA,CACH,GAAIzC,CAAAA,CAAM,eAAA,CAAkB,CAAA,CAAI,CAAE,KAAA,CAAO,KAAe,CAAA,CAAI,EAAC,CAE7D,QAAA,CAAAK,CAAAA,CAAOL,CAAAA,CAAM,eAAe,CAAA,CAC/B,CAAA,CACC,IAAA,CAAK,WAAS,GAAA,CACf0C,GAAAA,CAACD,IAAAA,CAAA,CACC,IAAA,CAAI,IAAA,CACH,GAAIzC,CAAAA,CAAM,gBAAA,CAAmB,CAAA,CAAI,CAAE,KAAA,CAAO,QAAkB,CAAA,CAAI,EAAC,CAEjE,SAAAK,CAAAA,CAAOL,CAAAA,CAAM,gBAAgB,CAAA,CAChC,CAAA,CACC,IAAA,CAAK,OAAA,CAAK0C,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,QAAA,CAAA1D,CAAAA,CAAeiB,CAAAA,CAAM,aAAa,EAAE,CAAA,CAAA,CAC7D,CAAA,CAAA,CACF,CAEJ,CCIO,SAASqE,EAAAA,CAAS,CACvB,OAAA,CAAArB,CAAAA,CACA,IAAA,CAAAI,CAAAA,CACA,MAAA,CAAAkB,CAAAA,CACA,aAAA,CAAAzD,CAAAA,CACA,aAAAG,CAAAA,CACA,WAAA,CAAAN,CAAAA,CACA,GAAA,CAAA6D,CAAAA,CAAM,CAAA,CACN,YAAA,CAAAC,CAAAA,CAAe,SAAA,CACf,aAAA,CAAAC,CACF,CAAA,CAAkB,CAChB,IAAMC,CAAAA,CAAS,GAAA,CAAI,OAAOH,CAAG,CAAA,CAGvBI,CAAAA,CACJjC,GAAAA,CAACH,GAAAA,CAAA,CACE,QAAA,CAAAS,CAAAA,CAAQ,GAAA,CAAI,CAAC4B,CAAAA,CAAGf,CAAAA,GAAO,CAEtB,IAAMgB,CAAAA,CADShB,CAAAA,GAAOb,EAAQ,MAAA,CAAS,CAAA,CAChB,EAAA,CAAK0B,CAAAA,CAE5B,GAAIE,CAAAA,CAAE,KAAA,GAAU,MAAA,CACd,OACEtC,IAAAA,CAACE,UAAAA,CAAA,CACC,QAAA,CAAA,CAAAE,GAAAA,CAACH,GAAAA,CAAA,CAAI,SAAU,CAAA,CACb,QAAA,CAAAG,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,QAAA,CAAQ,IAAA,CAChB,QAAA,CAAAmC,CAAAA,CAAE,MAAA,CACL,CAAA,CACF,CAAA,CACCC,CAAAA,EAASnC,GAAAA,CAACD,KAAA,CAAM,QAAA,CAAAoC,CAAAA,CAAM,CAAA,CAAA,CAAA,CANVhB,CAOf,CAAA,CAIJ,IAAMiB,CAAAA,CACJF,CAAAA,CAAE,KAAA,GAAU,OAAA,CACRA,CAAAA,CAAE,MAAA,CAAO,QAAA,CAASA,CAAAA,CAAE,KAAK,EACzBzF,CAAAA,CAAIyF,CAAAA,CAAE,MAAA,CAAQA,CAAAA,CAAE,KAAK,CAAA,CAE3B,OACEtC,IAAAA,CAACE,UAAAA,CAAA,CACC,QAAA,CAAA,CAAAE,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,SAAQ,IAAA,CAChB,QAAA,CAAAqC,CAAAA,CACH,CAAA,CACCD,CAAAA,EAASnC,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAoC,CAAAA,CAAM,CAAA,CAAA,CAAA,CAJVhB,CAKf,CAEJ,CAAC,CAAA,CACH,CAAA,CAGF,GAAIT,CAAAA,CAAK,MAAA,GAAW,CAAA,CAClB,OACEd,IAAAA,CAAAE,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAmC,CAAAA,CACDjC,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAE,QAAA,CAAA+B,CAAAA,CAAa,GAC/B,CAAA,CAIJ,IAAMO,CAAAA,CAAU3B,CAAAA,CAAK,KAAA,CAAMpC,CAAAA,CAAcA,CAAAA,CAAeN,CAAW,CAAA,CAC7DsE,CAAAA,CAAY5B,CAAAA,CAAK,MAAA,CAASpC,CAAAA,CAAeN,CAAAA,CAE/C,OACE4B,IAAAA,CAAAE,SAAA,CACG,QAAA,CAAA,CAAAmC,CAAAA,CACAI,CAAAA,CAAQ,GAAA,CAAI,CAACE,CAAAA,CAAKC,CAAAA,GAAO,CACxB,IAAMC,CAAAA,CAAYnE,CAAAA,CAAekE,CAAAA,CAC3B1E,CAAAA,CAAW2E,CAAAA,GAActE,CAAAA,CAGzBuE,EAAUX,CAAAA,GAAgBQ,CAAAA,CAAKE,CAAS,CAAA,CAC9C,OAAIC,CAAAA,GAAY,MAAA,CACP1C,GAAAA,CAACH,GAAAA,CAAA,CAAkC,QAAA,CAAA6C,CAAAA,CAAAA,CAAzBd,CAAAA,CAAOW,CAAAA,CAAKE,CAAS,CAAY,EAIlDzC,GAAAA,CAACH,GAAAA,CAAA,CACE,QAAA,CAAAS,CAAAA,CAAQ,GAAA,CAAI,CAAC4B,CAAAA,CAAGf,CAAAA,GAAO,CAEtB,IAAMgB,CAAAA,CADShB,CAAAA,GAAOb,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAChB,GAAK0B,CAAAA,CACtBW,CAAAA,CAAWT,CAAAA,CAAE,KAAA,GAAU,MAAA,CAAS,MAAA,CAAYA,CAAAA,CAAE,KAAA,CAC9CU,CAAAA,CAAOV,CAAAA,CAAE,MAAA,CAAOK,CAAAA,CAAKzE,CAAAA,CAAU6E,CAAQ,CAAA,CAE7C,OAAIT,EAAE,KAAA,GAAU,MAAA,CAEZtC,IAAAA,CAACE,UAAAA,CAAA,CACC,QAAA,CAAA,CAAAE,GAAAA,CAACH,GAAAA,CAAA,CAAI,QAAA,CAAU,CAAA,CACb,QAAA,CAAAG,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAK,WAAY,QAAA,CAAA6C,CAAAA,CAAK,CAAA,CAC9B,CAAA,CACCT,CAAAA,EAASnC,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAoC,CAAAA,CAAM,CAAA,CAAA,CAAA,CAJVhB,CAKf,CAAA,CAKFvB,IAAAA,CAACE,UAAAA,CAAA,CACE,UAAA8C,CAAAA,CACAT,CAAAA,EAASnC,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAoC,CAAAA,CAAM,CAAA,CAAA,CAAA,CAFVhB,CAGf,CAEJ,CAAC,CAAA,CAAA,CAxBOS,CAAAA,CAAOW,CAAAA,CAAKE,CAAS,CAyB/B,CAEJ,CAAC,CAAA,CACDzC,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAE,QAAA,CAAAuC,CAAAA,CAAY,CAAA,CAAI,aAAA,CAAgB,GAAA,CAAI,CAAA,CAAA,CACtD,CAEJ,CCvIO,SAASO,EAAAA,CACdC,CAAAA,CACgB,CAChB,IAAMC,CAAAA,CAAQ,IAAI,OAAA,CAElB,SAASC,CAAAA,CAAWT,CAAAA,CAAmC,CACrD,IAAMU,CAAAA,CAAKH,CAAAA,CAASP,CAAG,CAAA,CACvB,GAAI,CAACU,CAAAA,CAAI,OACT,IAAIC,CAAAA,CAAOH,CAAAA,CAAM,GAAA,CAAIE,CAAE,CAAA,CACvB,OAAKC,IACHA,CAAAA,CAAO1F,EAAAA,CAAoByF,CAAAA,CAAG,SAAA,CAAWA,CAAAA,CAAG,OAAO,CAAA,CACnDF,CAAAA,CAAM,GAAA,CAAIE,CAAAA,CAAIC,CAAI,CAAA,CAAA,CAEbA,CACT,CAEA,OAAO,CACL,CACE,MAAA,CAAQ,MAAA,CACR,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,CAACX,CAAAA,CAAKY,CAAAA,CAAMC,CAAAA,GAAM,CACxB,IAAMF,CAAAA,CAAOF,CAAAA,CAAWT,CAAG,CAAA,CAC3B,OAAKW,EACElD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAIyG,CAAAA,CAAK,IAAA,CAAME,CAAC,CAAA,CAAE,CAAA,CADdpD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAI,EAAA,CAAI2G,CAAC,CAAA,CAAE,CAEtC,CACF,CAAA,CACA,CACE,MAAA,CAAQ,SAAA,CACR,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,CAACb,CAAAA,CAAKY,CAAAA,CAAMC,CAAAA,GAAM,CACxB,IAAMF,EAAOF,CAAAA,CAAWT,CAAG,CAAA,CAC3B,OAAKW,CAAAA,CACElD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAIyG,CAAAA,CAAK,OAAA,CAASE,CAAC,CAAA,CAAE,CAAA,CADjBpD,GAAAA,CAACD,KAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAI,EAAA,CAAI2G,CAAC,CAAA,CAAE,CAEtC,CACF,CAAA,CACA,CACE,MAAA,CAAQ,UAAA,CACR,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,CAACb,EAAKY,CAAAA,CAAMC,CAAAA,GAAM,CACxB,IAAMF,CAAAA,CAAOF,CAAAA,CAAWT,CAAG,CAAA,CAC3B,OAAKW,CAAAA,CACElD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAIyG,CAAAA,CAAK,SAAUE,CAAC,CAAA,CAAE,CAAA,CADlBpD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAI,EAAA,CAAI2G,CAAC,CAAA,CAAE,CAEtC,CACF,CAAA,CACA,CACE,MAAA,CAAQ,WACR,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,OAAA,CACP,MAAA,CAASb,CAAAA,EAAQ,CACf,IAAMW,CAAAA,CAAOF,CAAAA,CAAWT,CAAG,CAAA,CAC3B,OAAKW,CAAAA,CACElD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAmD,CAAAA,CAAK,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,CADtBlD,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAA,EAAA,CAAG,CAE9B,CACF,CACF,CACF,CAKO,SAASsD,EAAAA,EAAkC,CAChD,OAAO,CACL,MAAA,CAAQ,EAAA,CACR,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAACC,CAAAA,CAAMxF,CAAAA,GACbkC,GAAAA,CAACD,IAAAA,CAAA,CAAM,GAAIjC,EAAW,CAAE,KAAA,CAAO,MAAgB,CAAA,CAAI,EAAC,CAAI,IAAA,CAAMA,CAAAA,CAC3D,QAAA,CAAAA,CAAAA,CAAW,IAAA,CAAO,IAAA,CACrB,CAEJ,CACF,CCzEA,IAAMyF,EAAAA,CAA+C,CACnDF,EAAAA,EAA+B,CAC/B,CACE,MAAA,CAAQ,IAAA,CACR,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,CAACd,CAAAA,CAAKzE,IACZkC,GAAAA,CAACD,IAAAA,CAAA,CAAM,GAAIjC,CAAAA,CAAW,CAAE,KAAA,CAAO,MAAgB,CAAA,CAAI,EAAC,CAAI,IAAA,CAAMA,CAAAA,CAC3D,QAAA,CAAAyE,CAAAA,CAAI,EAAA,CACP,CAEJ,CAAA,CACA,CACE,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAACA,CAAAA,CAAKY,CAAAA,CAAMC,CAAAA,GAClBpD,GAAAA,CAACD,IAAAA,CAAA,CAAK,KAAA,CAAOxD,EAAAA,CAAYgG,EAAI,MAAM,CAAA,CAAI,QAAA,CAAA9F,CAAAA,CAAI8F,CAAAA,CAAI,MAAA,CAAQa,CAAC,CAAA,CAAE,CAE9D,CAAA,CACA,CACE,MAAA,CAAQ,UAAA,CACR,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,QACP,MAAA,CAASb,CAAAA,EAAQvC,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAA1D,CAAAA,CAAekG,CAAAA,CAAI,UAAU,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,CAAE,CACrE,CAAA,CACA,CACE,OAAQ,MAAA,CACR,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAACA,CAAAA,CAAKY,CAAAA,CAAMC,CAAAA,GAClBpD,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CACX,QAAA,CAAAtD,CAAAA,CAAI8F,CAAAA,CAAI,UAAU,OAAA,CAAQ,GAAA,CAAK,GAAG,CAAA,CAAE,KAAA,CAAM,EAAA,CAAI,EAAE,CAAA,CAAGa,CAAC,CAAA,CACvD,CAEJ,CACF,CAAA,CAEO,SAASI,EAAAA,CAAmB,CACjC,aAAAC,CAAAA,CACA,KAAA,CAAAnG,CAAAA,CACA,SAAA,CAAAoG,CAAAA,CACA,aAAA,CAAAvF,CAAAA,CACA,YAAA,CAAAG,CAAAA,CACA,KAAA,CAAAiB,CAAAA,CACA,MAAA,CAAAoE,CAAAA,CACA,KAAA,CAAArE,CAAAA,CAAQ,MAAA,CACR,SAAAsE,CACF,CAAA,CAUG,CACD,IAAMC,CAAAA,CAAgB,IAAA,CAAK,IAAA,CAAA,CAAM1D,EAAAA,CAAc,MAAA,CAAS,CAAA,EAAK,CAAC,CAAA,CACxD2D,CAAAA,CAAaxG,CAAAA,CAAQ,CAAA,CAAIuG,CAAAA,CAAgB,EAAI,CAAA,CAC7CE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAS,CAAA,CAAqBG,CAAAA,CAAY,CAAC,CAAA,CAEhE1E,CAAAA,CAAQ9B,CAAAA,CAAQ,WAAA,CAAc,CAAA,WAAA,EAAcmG,CAAY,CAAA,CAAA,CAE9D,OACE7D,KAACC,GAAAA,CAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAON,CAAAA,CAAO,QAAA,CAAU,CAAA,CACjD,QAAA,CAAA,CAAAjC,CAAAA,EACCsC,IAAAA,CAACT,CAAAA,CAAA,CAAM,KAAA,CAAOI,CAAAA,CACZ,QAAA,CAAA,CAAAS,IAAC0B,EAAAA,CAAA,CAAY,KAAA,CAAOpE,CAAAA,CAAO,CAAA,CAC3B0C,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPC,GAAAA,CAACI,EAAAA,CAAA,CACC,MAAA,CAAQwD,CAAAA,CAAWA,CAAAA,CAAS,WAAa,EAAC,CAC1C,OAAA,CAASrE,CAAAA,CAAQ,CAAA,CACjB,KAAA,CAAM,yBAAA,CACR,CAAA,CAAA,CACF,CAAA,CAEFS,GAAAA,CAACb,CAAAA,CAAA,CAAM,KAAA,CAAOC,CAAAA,CAAO,KAAA,CAAOG,CAAAA,CAAO,SAAU,CAAA,CAAG,KAAA,CAAOD,CAAAA,CACrD,QAAA,CAAAU,GAAAA,CAAC2B,EAAAA,CAAA,CACC,OAAA,CAAS4B,EAAAA,CACT,IAAA,CAAMG,CAAAA,CACN,MAAA,CAASM,CAAAA,EAAOA,CAAAA,CAAG,EAAA,CAAKA,CAAAA,CAAG,UAC3B,aAAA,CAAe7F,CAAAA,CACf,YAAA,CAAcG,CAAAA,CACd,WAAA,CAAayF,CAAAA,CACb,YAAA,CAAa,cAAA,CACf,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CC9EO,SAASE,EAAAA,CAAaC,CAAAA,CAA2B,CACtD,IAAMC,CAAAA,CAAsB,EAAC,CACvBC,EACJ,6HAAA,CACEC,CAAAA,CAAY,CAAA,CACZC,CAAAA,CAEJ,KAAA,CAAQA,CAAAA,CAAQF,CAAAA,CAAG,IAAA,CAAKF,CAAI,CAAA,IAAO,IAAA,EAE7BI,CAAAA,CAAM,KAAA,CAAQD,CAAAA,EAChBF,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAMD,CAAAA,CAAK,KAAA,CAAMG,CAAAA,CAAWC,CAAAA,CAAM,KAAK,CAAA,CAAG,IAAA,CAAM,OAAQ,CAAC,CAAA,CAGrEA,CAAAA,CAAM,CAAC,CAAA,GAAM,MAAA,EAEfH,CAAAA,CAAO,KAAK,CAAE,IAAA,CAAMG,CAAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAM,KAAM,CAAC,CAAA,CAC3CH,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,GAAA,CAAK,IAAA,CAAM,OAAQ,CAAC,CAAA,EAC/BG,CAAAA,CAAM,CAAC,CAAA,GAAM,MAAA,CACtBH,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAMG,CAAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAM,QAAS,CAAC,CAAA,CACrCA,EAAM,CAAC,CAAA,GAAM,MAAA,CACtBH,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAMG,CAAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAM,QAAS,CAAC,CAAA,CACrCA,CAAAA,CAAM,CAAC,IAAM,MAAA,CACtBH,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAMG,CAAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAM,SAAU,CAAC,CAAA,CACtCA,CAAAA,CAAM,CAAC,CAAA,GAAM,MAAA,CACtBH,EAAO,IAAA,CAAK,CAAE,IAAA,CAAMG,CAAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAM,MAAO,CAAC,CAAA,CACnCA,CAAAA,CAAM,CAAC,CAAA,GAAM,MAAA,EACtBH,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAMG,CAAAA,CAAM,CAAC,CAAA,CAAG,IAAA,CAAM,OAAQ,CAAC,CAAA,CAG/CD,CAAAA,CAAYC,CAAAA,CAAM,KAAA,CAAQA,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAA,CAIrC,OAAID,EAAYH,CAAAA,CAAK,MAAA,EACnBC,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAMD,CAAAA,CAAK,KAAA,CAAMG,CAAS,CAAA,CAAG,IAAA,CAAM,OAAQ,CAAC,CAAA,CAGrDF,CACT,CAEO,IAAMI,EAAAA,CAA0C,CACrD,GAAA,CAAK,MAAA,CACL,MAAA,CAAQ,OAAA,CACR,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,QAAA,CACT,IAAA,CAAM,KAAA,CACN,KAAA,CAAO,MACT,CAAA,CAKO,SAASC,GAAW5H,CAAAA,CAAa6H,CAAAA,CAA4B,CAClE,GAAI,CACF,IAAM/G,CAAAA,CAAS,IAAA,CAAK,MAAMd,CAAG,CAAA,CAE7B,OADe,IAAA,CAAK,SAAA,CAAUc,CAAAA,CAAQ,IAAA,CAAM,CAAC,EAC/B,KAAA,CAAM;AAAA,CAAI,EAAE,GAAA,CAAKwG,CAAAA,EAAS,CACtC,IAAMQ,CAAAA,CAAa,KAAK,GAAA,CAAI,CAAA,CAAGD,CAAQ,CAAA,CACvC,OAAOP,CAAAA,CAAK,MAAA,CAASQ,EACjBR,CAAAA,CAAK,KAAA,CAAM,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGQ,CAAAA,CAAa,CAAC,CAAC,CAAA,CAAI,SAC7CR,CACN,CAAC,CACH,CAAA,KAAQ,CACN,IAAMQ,CAAAA,CAAa,KAAK,GAAA,CAAI,CAAA,CAAGD,CAAQ,CAAA,CACvC,OAAO7H,EACJ,KAAA,CAAM;AAAA,CAAI,CAAA,CACV,GAAA,CAAKsH,CAAAA,EACJA,CAAAA,CAAK,MAAA,CAASQ,CAAAA,CACVR,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGQ,CAAAA,CAAa,CAAC,CAAC,CAAA,CAAI,QAAA,CAC7CR,CACN,CACJ,CACF,CAKO,SAASS,EAAAA,CAAgB,CAAE,IAAA,CAAAT,CAAK,CAAA,CAAqB,CAC1D,IAAMC,CAAAA,CAASF,EAAAA,CAAaC,CAAI,CAAA,CAChC,OAAIC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAUnE,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAmE,CAAAA,CAAK,CAAA,CAE1ClE,GAAAA,CAACD,IAAAA,CAAA,CACE,QAAA,CAAAoE,CAAAA,CAAO,GAAA,CAAI,CAACS,CAAAA,CAAO/D,CAAAA,GAClBb,GAAAA,CAACD,IAAAA,CAAA,CAAa,KAAA,CAAOwE,EAAAA,CAAaK,CAAAA,CAAM,IAAI,EACzC,QAAA,CAAAA,CAAAA,CAAM,IAAA,CAAA,CADE/D,CAEX,CACD,CAAA,CACH,CAEJ,CAKO,SAASgE,EAAAA,CAAajI,CAAAA,CAA6C,CACxE,GAAI,CACF,IAAMc,CAAAA,CAAkB,IAAA,CAAK,KAAA,CAAMd,CAAG,CAAA,CACtC,OACE,OAAOc,CAAAA,EAAW,QAAA,EAClBA,CAAAA,GAAW,IAAA,EACX,KAAA,CAAM,OAAA,CAAQA,CAAM,EAEb,IAAA,CAEFA,CACT,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CC7GA,SAASoH,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACgE,CAChE,IAAMC,CAAAA,CAAS,IAAI,GAAA,CAIfC,CAAAA,CAAa,CAAA,CAEjBD,CAAAA,CAAO,GAAA,CAAID,CAAAA,CAAkB,CAC3B,UAAA,CAAYA,CAAAA,CACZ,KAAA,CAAO,QAAA,CACP,MAAA,CAAQ,EACV,CAAC,CAAA,CAED,IAAA,IAAW/B,CAAAA,IAAM8B,CAAAA,CAAQ,CACvB,IAAMlI,EAAIgI,EAAAA,CAAa5B,CAAAA,CAAG,OAAO,CAAA,CAC3BkC,CAAAA,CAAOtI,CAAAA,CAAI,MAAA,CAAOA,CAAAA,CAAE,UAAA,EAAiB,EAAE,CAAA,CAAI,EAAA,CAC3CuI,CAAAA,CAAM,CAACD,GAAQA,CAAAA,GAASH,CAAAA,CAAmBA,CAAAA,CAAmBG,CAAAA,CAE/DF,CAAAA,CAAO,GAAA,CAAIG,CAAG,CAAA,GACjBF,CAAAA,EAAAA,CACAD,CAAAA,CAAO,GAAA,CAAIG,CAAAA,CAAK,CACd,UAAA,CAAYA,CAAAA,CACZ,KAAA,CAAO,CAAA,MAAA,EAASF,CAAU,CAAA,CAAA,CAC1B,MAAA,CAAQ,EACV,CAAC,CAAA,CAAA,CAEHD,CAAAA,CAAO,GAAA,CAAIG,CAAG,CAAA,CAAG,MAAA,CAAO,IAAA,CAAKnC,CAAE,EACjC,CAEA,OAAO,KAAA,CAAM,IAAA,CAAKgC,CAAAA,CAAO,MAAA,EAAQ,CACnC,CAEA,IAAMI,EAAAA,CAAyC,CAC7ChC,EAAAA,EAA2B,CAC3B,CACE,MAAA,CAAQ,MAAA,CACR,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAACd,CAAAA,CAAKY,CAAAA,CAAMC,CAAAA,GAAM,CACxB,GAAI,CAACb,CAAAA,CAAI,KAAA,CAAO,OAAOvC,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAtD,CAAAA,CAAI,EAAA,CAAI2G,CAAC,CAAA,CAAE,CAAA,CACzC,IAAMkC,CAAAA,CAAS,GAAA,CAAI,MAAA,CAAO/C,CAAAA,CAAI,MAAM,CAAA,CACpC,OACE3C,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CACX,QAAA,CAAA,CAAAuF,CAAAA,CACA/C,CAAAA,CAAI,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAK,GAAG,EAAE,KAAA,CAAM,EAAA,CAAI,EAAE,CAAA,CAAA,CACrD,CAEJ,CACF,CAAA,CACA,CACE,MAAA,CAAQ,OAAA,CACR,KAAA,CAAO,MAAA,CACP,MAAA,CAASA,CAAAA,EACFA,EAAI,KAAA,CACFvC,GAAAA,CAACD,IAAAA,CAAA,CAAK,KAAA,CAAM,MAAA,CAAQ,QAAA,CAAAwC,CAAAA,CAAI,KAAA,CAAM,SAAA,CAAU,CAAA,CADxBvC,GAAAA,CAACD,IAAAA,CAAA,EAAK,CAGjC,CAAA,CACA,GAAG8C,EAAAA,CAAgCN,CAAAA,EAAQA,CAAAA,CAAI,KAAK,CACtD,CAAA,CAEO,SAASgD,EAAAA,CAAqB,CACnC,QAAA,CAAAzI,CAAAA,CACA,MAAA,CAAAiI,CAAAA,CACA,KAAA,CAAAxF,CAAAA,CACA,MAAA,CAAAoE,CAAAA,CACA,YAAA,CAAArF,CAAAA,CACA,aAAA,CAAAH,CAAAA,CAAgB,EAAA,CAChB,KAAA,CAAAmB,CAAAA,CAAQ,MACV,CAAA,CAQG,CACD,IAAMkG,EAAW1I,CAAAA,CAAS,KAAA,CAAQ,CAAA,CAAI,CAAA,CAChC2I,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI9B,CAAAA,CAAS,CAAA,CAAqB6B,CAAAA,CAAU,CAAC,CAAA,CAE9DP,CAAAA,CAASH,EAAAA,CAAsBC,EAAQjI,CAAAA,CAAS,EAAE,CAAA,CAClD4I,CAAAA,CAAcT,CAAAA,CAAO,MAAA,CAAS,CAAA,CAE9BU,CAAAA,CAA4B,EAAC,CACnC,IAAA,IAAWC,CAAAA,IAASX,CAAAA,CAAQ,CACtBS,GACFC,CAAAA,CAAY,IAAA,CAAK,CACf,IAAA,CAAM,QAAA,CACN,IAAA,CAAM,CAAA,EAAGC,CAAAA,CAAM,KAAK,CAAA,EAAA,EAAKA,CAAAA,CAAM,UAAA,CAAW,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,IAAA,EAAOA,CAAAA,CAAM,MAAA,CAAO,MAAM,CAAA,OAAA,CAAA,CAC/E,MAAA,CAAQ,CACV,CAAC,CAAA,CAEH,IAAA,IAAW3C,CAAAA,IAAM2C,CAAAA,CAAM,MAAA,CACrBD,CAAAA,CAAY,KAAK,CACf,IAAA,CAAM,OAAA,CACN,KAAA,CAAO1C,CAAAA,CACP,MAAA,CAAQyC,CAAAA,CAAc,CAAA,CAAI,CAC5B,CAAC,EAEL,CAEA,IAAMG,CAAAA,CAAcH,EAChB,CAAA,eAAA,EAAkBT,CAAAA,CAAO,MAAM,CAAA,YAAA,EAAeF,CAAAA,CAAO,MAAM,CAAA,QAAA,CAAA,CAC3D,CAAA,gBAAA,EAAmBA,CAAAA,CAAO,MAAM,CAAA,CAAA,CAAA,CAEpC,OACEnF,IAAAA,CAACC,GAAAA,CAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAON,CAAAA,CAAO,QAAA,CAAU,CAAA,CAClD,QAAA,CAAA,CAAAK,IAAAA,CAACT,CAAAA,CAAA,CAAM,KAAA,CAAOI,CAAAA,CACZ,QAAA,CAAA,CAAAK,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,aAAA,CACQ,GAAA,CACZC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAAjD,CAAAA,CAAS,OAAA,CACZ,CAAA,CAAA,CACF,CAAA,CACA8C,KAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,WAAA,CACM,GAAA,CACVC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAA7D,EAAAA,CAASY,CAAAA,CAAS,EAAA,CAAIyC,CAAAA,CAAQ,EAAE,CAAA,CACnC,CAAA,CAAA,CACF,CAAA,CACAK,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,SAAA,CACI,GAAA,CACRC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,MAAOxD,EAAAA,CAAYO,CAAAA,CAAS,MAAM,CAAA,CAC1C,QAAA,CAAAA,CAAAA,CAAS,MAAA,CACZ,CAAA,CACCA,CAAAA,CAAS,UAAA,GAAe,IAAA,EACvB8C,IAAAA,CAACG,IAAAA,CAAA,CACE,QAAA,CAAA,CAAA,IAAA,CAAK,WAAA,CAAU,GAAA,CAChBC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,QAAA,CAAA1D,CAAAA,CAAeS,CAAAA,CAAS,UAAU,CAAA,CAAE,CAAA,CAAA,CAClD,CAAA,CAED,IAAA,CAAK,YAASkD,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,QAAA,CAAAjD,CAAAA,CAAS,SAAA,CAAU,CAAA,CAC7CA,CAAAA,CAAS,WAAA,EACR8C,IAAAA,CAACG,IAAAA,CAAA,CACE,eAAK,aAAA,CAAWC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,QAAA,CAAAjD,CAAAA,CAAS,WAAA,CAAY,CAAA,CAAA,CACpD,CAAA,CAAA,CAEJ,CAAA,CACCA,CAAAA,CAAS,KAAA,EAASA,EAAS,MAAA,GAAW,QAAA,EACrC8C,IAAAA,CAAAE,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAE,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPH,IAAAA,CAACG,IAAAA,CAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAA,CAAA,CAAA,SAAA,CAAQjD,CAAAA,CAAS,KAAA,CAAA,CAAM,CAAA,CAAA,CAC3C,CAAA,CAEDA,CAAAA,CAAS,KAAA,EAASA,CAAAA,CAAS,MAAA,GAAW,SAAA,EACrC8C,IAAAA,CAAAE,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAE,IAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPH,IAAAA,CAACG,IAAAA,CAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAA,CAAA,CAAA,UAAA,CAASjD,CAAAA,CAAS,KAAA,CAAA,CAAM,CAAA,CAAA,CAC/C,CAAA,CAAA,CAEJ,EAEAkD,GAAAA,CAACb,CAAAA,CAAA,CAAM,KAAA,CAAO0G,CAAAA,CAAa,KAAA,CAAOtG,CAAAA,CAAO,QAAA,CAAU,CAAA,CAAG,KAAA,CAAOD,CAAAA,CAC3D,QAAA,CAAAU,GAAAA,CAAC2B,EAAAA,CAAA,CACC,OAAA,CAAS0D,EAAAA,CACT,IAAA,CAAMM,CAAAA,CACN,MAAA,CAAQ,CAACpD,CAAAA,CAAK1B,CAAAA,GACZ0B,CAAAA,CAAI,IAAA,GAAS,QAAA,CACT,CAAA,EAAA,EAAK1B,CAAC,CAAA,CAAA,CACN,CAAA,EAAG0B,CAAAA,CAAI,KAAA,EAAO,EAAA,EAAMA,CAAAA,CAAI,KAAA,EAAO,SAAS,CAAA,CAAA,EAAI1B,CAAC,CAAA,CAAA,CAEnD,aAAA,CAAe1C,CAAAA,CACf,YAAA,CAAcG,CAAAA,CACd,WAAA,CAAamH,CAAAA,CACb,aAAa,yBAAA,CACb,aAAA,CAAgBlD,CAAAA,EACdA,CAAAA,CAAI,IAAA,GAAS,QAAA,CACXvC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,QAAA,CACd,QAAA,CAAAwC,EAAI,IAAA,CACP,CAAA,CACE,MAAA,CAER,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CC7LA,IAAMuD,EAAAA,CAAyC,CAC7CzC,EAAAA,EAA4B,CAC5B,CACE,MAAA,CAAQ,MAAA,CACR,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,CAACd,CAAAA,CAAKzE,CAAAA,CAAUsF,CAAAA,GACtBpD,GAAAA,CAACD,IAAAA,CAAA,CAAM,GAAIjC,CAAAA,CAAW,CAAE,KAAA,CAAO,MAAgB,CAAA,CAAI,EAAC,CAAI,IAAA,CAAMA,CAAAA,CAC3D,QAAA,CAAArB,EAAI8F,CAAAA,CAAI,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAK,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAGa,CAAC,CAAA,CACtD,CAEJ,CAAA,CACA,CACE,MAAA,CAAQ,OAAA,CACR,KAAA,CAAO,MAAA,CACP,MAAA,CAASb,CAAAA,EAAQvC,GAAAA,CAACD,IAAAA,CAAA,CAAK,KAAA,CAAM,MAAA,CAAQ,QAAA,CAAAwC,CAAAA,CAAI,SAAA,CAAU,CACrD,EACA,GAAGM,EAAAA,CAAiCN,CAAAA,EAAQA,CAAG,CACjD,CAAA,CAEO,SAASwD,EAAAA,CAAW,CACzB,MAAA,CAAAhB,CAAAA,CACA,aAAA,CAAA5G,CAAAA,CACA,YAAA,CAAAG,CAAAA,CACA,KAAA,CAAAiB,CAAAA,CACA,MAAA,CAAAoE,CAAAA,CACA,KAAA,CAAArE,CAAAA,CAAQ,MACV,CAAA,CAOG,CACD,IAAMyE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAS,CAAA,CAAoB,CAAC,CAAA,CAEzD,OACE3D,GAAAA,CAACb,CAAAA,CAAA,CACC,KAAA,CAAM,QAAA,CACN,QAAA,CAAUS,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,CAAA,GAAA,CAAEgF,EAAO,MAAA,CAAO,SAAA,CAAA,CAAO,CAAA,CAChD,KAAA,CAAOxF,CAAAA,CACP,QAAA,CAAU,CAAA,CACV,KAAA,CAAOD,CAAAA,CAEP,QAAA,CAAAU,GAAAA,CAAC2B,EAAAA,CAAA,CACC,OAAA,CAASmE,GACT,IAAA,CAAMf,CAAAA,CACN,MAAA,CAAQ,CAAC9B,CAAAA,CAAIpC,CAAAA,GACXoC,CAAAA,CAAG,EAAA,GAAO,MAAA,CAAY,MAAA,CAAOA,CAAAA,CAAG,EAAE,CAAA,CAAI,CAAA,EAAGA,CAAAA,CAAG,SAAS,CAAA,CAAA,EAAIpC,CAAC,CAAA,CAAA,CAE5D,aAAA,CAAe1C,CAAAA,CACf,YAAA,CAAcG,CAAAA,CACd,WAAA,CAAayF,CAAAA,CACb,YAAA,CAAa,yBAAA,CACf,CAAA,CACF,CAEJ,CC5DO,SAASiC,EAAAA,CAAY,CAC1B,KAAA,CAAAC,CAAAA,CACA,KAAA,CAAA1G,CAAAA,CACA,MAAA,CAAAoE,CAAAA,CACA,YAAA,CAAArF,CAAAA,CACA,KAAA,CAAAgB,CAAAA,CAAQ,MACV,CAAA,CAMG,CACD,IAAMzC,CAAAA,CAAIgI,EAAAA,CAAaoB,EAAM,OAAO,CAAA,CAC9BC,CAAAA,CACJrJ,CAAAA,EAAK,OAAOA,CAAAA,CAAE,OAAA,EAAe,QAAA,CAAWA,CAAAA,CAAE,OAAA,CAAa,MAAA,CACnDsJ,CAAAA,CACJtJ,CAAAA,EAAK,OAAOA,CAAAA,CAAE,UAAA,EAAkB,QAAA,CAAWA,CAAAA,CAAE,UAAA,CAAgB,MAAA,CAKzDuJ,CAAAA,CAAe,CAAA,EAFD,CAAA,EAAKF,CAAAA,CAAU,CAAA,CAAI,CAAA,CAAA,EAAMC,CAAAA,CAAa,CAAA,CAAI,CAAA,CAAA,CAAK,CAAA,CAAA,CAI7DE,EAAa,CAAA,CACbC,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI/G,CAAAA,CAAQ,CAAA,CAAG,EAAE,CAAA,CAClCgH,CAAAA,CAAY/B,EAAAA,CAAWyB,CAAAA,CAAM,OAAA,CAASK,CAAS,CAAA,CAC/CtI,EAAc,IAAA,CAAK,GAAA,CAAI2F,CAAAA,CAASyC,CAAAA,CAAeC,CAAAA,CAAY,CAAC,CAAA,CAC5DhE,CAAAA,CAAUkE,CAAAA,CAAU,KAAA,CAAMjI,CAAAA,CAAcA,CAAAA,CAAeN,CAAW,CAAA,CAExE,OACE4B,IAAAA,CAACC,GAAAA,CAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAON,CAAAA,CAAO,QAAA,CAAU,CAAA,CAClD,QAAA,CAAA,CAAAK,IAAAA,CAACT,CAAAA,CAAA,CAAM,KAAA,CAAOI,CAAAA,CACZ,QAAA,CAAA,CAAAK,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,UAAA,CACK,GAAA,CACTC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAAkG,CAAAA,CAAM,UACT,CAAA,CAAA,CACF,CAAA,CACCC,CAAAA,EACCtG,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,aAAA,CACQ,GAAA,CACZC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAAmG,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEDC,CAAAA,EACCvG,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,WAAA,CACM,GAAA,CACVC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,MAAM,MAAA,CACd,QAAA,CAAAoG,CAAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEFvG,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,QAAA,CACG,GAAA,CACPC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAAkG,CAAAA,CAAM,SAAA,CACT,CAAA,CAAA,CACF,CAAA,CACArG,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,QAAA,CACEC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,KAAE,QAAA,CAAAkG,CAAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAK,GAAG,CAAA,CAAE,CAAA,CAAA,CACtD,CAAA,CAAA,CACF,CAAA,CAEArG,IAAAA,CAACT,CAAAA,CAAA,CACC,KAAA,CAAM,UACN,QAAA,CACES,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,CAAA,GAAA,CACXzB,CAAAA,CAAe,CAAA,CAAE,GAAA,CAClB,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAeN,CAAAA,CAAauI,EAAU,MAAM,CAAA,CAAE,GAAA,CACvDA,CAAAA,CAAU,MAAA,CAAO,SAAA,CAAA,CACpB,CAAA,CAEF,KAAA,CAAOhH,CAAAA,CACP,QAAA,CAAU,CAAA,CACV,KAAA,CAAOD,CAAAA,CAEN,QAAA,CAAA,CAAA+C,CAAAA,CAAQ,GAAA,CAAI,CAAC6B,CAAAA,CAAMrD,CAAAA,GAClBb,GAAAA,CAAC2E,EAAAA,CAAA,CAAuC,IAAA,CAAMT,CAAAA,CAAAA,CAAxB5F,CAAAA,CAAeuC,CAAe,CACrD,CAAA,CACAwB,CAAAA,CAAQ,MAAA,CAASrE,GAChB,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQA,CAAAA,CAAcqE,CAAAA,CAAQ,MAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAACmE,CAAAA,CAAG3F,CAAAA,GAC3Db,GAAAA,CAACD,KAAA,CAAsB,QAAA,CAAA,GAAA,CAAA,CAAZ,CAAA,IAAA,EAAOc,CAAC,CAAA,CAAK,CACzB,CAAA,CAAA,CACL,CAAA,CAAA,CACF,CAEJ,CCrFA,SAAS4F,EAAAA,CACPC,CAAAA,CACAjC,CAAAA,CACU,CACV,IAAMkC,CAAAA,CAAkB,EAAC,CAEzB,OAAAA,CAAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CACpBA,CAAAA,CAAM,IAAA,CAAK,GAAGnC,EAAAA,CAAWkC,CAAAA,CAAS,OAAA,CAASjC,CAAQ,CAAC,CAAA,CACpDkC,EAAM,IAAA,CAAK,EAAE,CAAA,CACbA,CAAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CACbD,CAAAA,CAAS,IAAA,GAAS,IAAA,EACpBC,CAAAA,CAAM,IAAA,CAAK,GAAGnC,EAAAA,CAAWkC,EAAS,IAAA,CAAMjC,CAAQ,CAAC,CAAA,CAC7CiC,CAAAA,CAAS,SAAA,GACXC,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CACbA,CAAAA,CAAM,IAAA,CAAK,sCAAsC,CAAA,CAAA,EAGnDA,EAAM,IAAA,CAAK,QAAQ,CAAA,CAGdA,CACT,CAEO,SAASC,EAAAA,CAAiB,CAC/B,QAAA,CAAA9J,CAAAA,CACA,QAAA,CAAA4J,CAAAA,CACA,KAAA,CAAAnH,CAAAA,CACA,MAAA,CAAAoE,CAAAA,CACA,YAAA,CAAArF,CAAAA,CACA,KAAA,CAAAgB,CAAAA,CAAQ,MACV,CAAA,CAOG,CAKD,IAAMgH,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI/G,CAAAA,CAAQ,CAAA,CAAG,EAAE,EAClCvB,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI2F,CAAAA,CAAS,CAAA,CAAe,CAAA,CAAY,CAAC,CAAA,CAG5D4C,CAAAA,CADcG,CAAAA,GAAa,IAAA,CAE7BD,EAAAA,CAAmBC,CAAAA,CAAUJ,CAAS,CAAA,CACtC,CACE,0BAAA,CACA,EAAA,CACA,cAAA,CACA,qDACF,CAAA,CAEEjE,CAAAA,CAAUkE,CAAAA,CAAU,KAAA,CAAMjI,CAAAA,CAAcA,CAAAA,CAAeN,CAAW,CAAA,CAExE,OACE4B,IAAAA,CAACC,IAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAON,CAAAA,CAAO,QAAA,CAAU,CAAA,CAClD,QAAA,CAAA,CAAAK,IAAAA,CAACT,CAAAA,CAAA,CAAM,KAAA,CAAOI,CAAAA,CACZ,QAAA,CAAA,CAAAK,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,aAAA,CACQ,GAAA,CACZC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAAjD,CAAAA,CAAS,OAAA,CACZ,CAAA,CAAA,CACF,EACA8C,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,WAAA,CACM,GAAA,CACVC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CACd,QAAA,CAAA7D,EAAAA,CAASY,EAAS,EAAA,CAAIyC,CAAAA,CAAQ,EAAE,CAAA,CACnC,CAAA,CAAA,CACF,CAAA,CACAK,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAA,CAAA,SAAA,CACI,GAAA,CACRC,GAAAA,CAACD,IAAAA,CAAA,CAAK,KAAI,IAAA,CAAC,KAAA,CAAOxD,EAAAA,CAAYO,CAAAA,CAAS,MAAM,CAAA,CAC1C,QAAA,CAAAA,CAAAA,CAAS,MAAA,CACZ,CAAA,CACCA,CAAAA,CAAS,UAAA,GAAe,IAAA,EACvB8C,IAAAA,CAACG,IAAAA,CAAA,CACE,QAAA,CAAA,CAAA,IAAA,CAAK,WAAA,CAAU,GAAA,CAChBC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,QAAA,CAAA1D,CAAAA,CAAeS,CAAAA,CAAS,UAAU,CAAA,CAAE,CAAA,CAAA,CAClD,GAEJ,CAAA,CAAA,CACF,CAAA,CAEA8C,IAAAA,CAACT,CAAAA,CAAA,CACC,KAAA,CAAM,mBAAA,CACN,QAAA,CACES,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,CAAA,GAAA,CACXzB,EAAe,CAAA,CAAE,GAAA,CAClB,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAeN,CAAAA,CAAauI,CAAAA,CAAU,MAAM,CAAA,CAAE,GAAA,CACvDA,CAAAA,CAAU,MAAA,CAAO,SAAA,CAAA,CACpB,CAAA,CAEF,MAAOhH,CAAAA,CACP,QAAA,CAAU,CAAA,CACV,KAAA,CAAOD,CAAAA,CAEN,QAAA,CAAA,CAAA+C,CAAAA,CAAQ,GAAA,CAAI,CAAC6B,CAAAA,CAAMrD,CAAAA,GACdqD,CAAAA,GAAS,SAAA,EAAaA,CAAAA,GAAS,MAAA,CAE/BlE,GAAAA,CAACD,IAAAA,CAAA,CAA4B,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,QAAA,CACrC,QAAA,CAAAmE,CAAAA,CAAAA,CADQ5F,CAAAA,CAAeuC,CAE1B,CAAA,CAGAqD,CAAAA,CAAK,UAAA,CAAW,GAAG,EAEnBlE,GAAAA,CAACD,IAAAA,CAAA,CAA4B,QAAA,CAAQ,IAAA,CAClC,QAAA,CAAAmE,CAAAA,CAAAA,CADQ5F,CAAAA,CAAeuC,CAE1B,CAAA,CAGGb,GAAAA,CAAC2E,EAAAA,CAAA,CAAuC,IAAA,CAAMT,GAAxB5F,CAAAA,CAAeuC,CAAe,CAC5D,CAAA,CACAwB,CAAAA,CAAQ,MAAA,CAASrE,CAAAA,EAChB,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQA,CAAAA,CAAcqE,CAAAA,CAAQ,MAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAACmE,CAAAA,CAAG3F,CAAAA,GAC3Db,GAAAA,CAACD,IAAAA,CAAA,CAAsB,QAAA,CAAA,GAAA,CAAA,CAAZ,CAAA,IAAA,EAAOc,CAAC,CAAA,CAAK,CACzB,CAAA,CAAA,CACL,CAAA,CAAA,CACF,CAEJ,CChIA,SAASgG,EAAAA,CAASvJ,EAA6B,CAC7C,OAAIA,CAAAA,CAAM,eAAA,CAAkB,CAAA,CAAU,KAAA,CAClCA,CAAAA,CAAM,cAAA,CAAiB,CAAA,CAAU,OAAA,CAC9B,QACT,CAEO,SAASwJ,EAAAA,CAAe,CAC7B,MAAA,CAAAC,CAAAA,CACA,aAAA,CAAA5I,CAAAA,CACA,UAAA,CAAA6I,CAAAA,CACA,WAAA,CAAAhJ,CAAAA,CACA,KAAA,CAAAuB,CACF,CAAA,CAMG,CACD,IAAM0H,CAAAA,CAASD,CAAAA,CAEf,OACEpH,IAAAA,CAAAE,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAE,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,QAAA,CAAQ,IAAA,CAChB,QAAA,CAAA,QAAA,CAAS,MAAA,CAAOR,CAAAA,CAAQ,CAAC,CAAA,CAC5B,CAAA,CACCwH,CAAAA,CAAO,MAAA,GAAW,CAAA,CACjB/G,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,2BAAe,CAAA,CAE9BgH,CAAAA,CAAO,KAAA,CAAME,CAAAA,CAAQA,CAAAA,CAASjJ,CAAW,CAAA,CAAE,GAAA,CAAI,CAACV,CAAAA,CAAOkF,CAAAA,GAAO,CAC5D,IAAM3B,CAAAA,CAAIoG,EAASzE,CAAAA,CACnB,OACE5C,IAAAA,CAACG,IAAAA,CAAA,CAAoB,IAAA,CAAK,UAAA,CACxB,QAAA,CAAA,CAAAC,GAAAA,CAACD,IAAAA,CAAA,CACE,GAAIc,CAAAA,GAAM1C,CAAAA,CAAgB,CAAE,KAAA,CAAO,MAAgB,CAAA,CAAI,EAAC,CACzD,IAAA,CAAM0C,CAAAA,GAAM1C,CAAAA,CAEX,QAAA,CAAA0C,CAAAA,GAAM1C,CAAAA,CAAgB,IAAA,CAAO,IAAA,CAChC,CAAA,CACA6B,GAAAA,CAACD,IAAAA,CAAA,CAAK,KAAA,CAAO8G,EAAAA,CAASvJ,CAAK,CAAA,CAAI,QAAA,CAAA,SAAA,CAAU,CAAA,CACzC0C,GAAAA,CAACD,IAAAA,CAAA,CACE,GAAIc,CAAAA,GAAM1C,CAAAA,CAAgB,CAAE,MAAO,MAAgB,CAAA,CAAI,EAAC,CACzD,IAAA,CAAM0C,CAAAA,GAAM1C,CAAAA,CAEX,QAAA,CAAAjC,EAAAA,CAASoB,CAAAA,CAAM,EAAA,CAAIiC,CAAAA,CAAQ,CAAC,CAAA,CAC/B,IAbSjC,CAAAA,CAAM,EAcjB,CAEJ,CAAC,CAAA,CAEFyJ,CAAAA,CAAO,MAAA,CAAS/I,CAAAA,EACf4B,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CACX,QAAA,CAAA,CAAA5B,EAAgB,CAAA,CAAE,GAAA,CAAE4I,CAAAA,CAAO,MAAA,CAAA,CAC9B,CAAA,CAAA,CAEJ,CAEJ,CC7BA,SAASG,EAAAA,CAAI,CAAE,EAAA,CAAAC,CAAG,CAAA,CAAwB,CACxC,GAAM,CAAE,IAAA,CAAAC,CAAK,CAAA,CAAIC,MAAAA,EAAO,CAClB,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAIC,WAAU,CACvBhI,CAAAA,CAAQ+H,CAAAA,EAAQ,OAAA,EAAW,EAAA,CAC3B3D,CAAAA,CAAS2D,CAAAA,EAAQ,IAAA,EAAQ,EAAA,CAEzB,CAACE,CAAAA,CAAWC,CAAY,CAAA,CAAIpJ,QAAAA,CAAkB,cAAc,CAAA,CAC5D,CAACqJ,CAAAA,CAAOC,CAAQ,CAAA,CAAItJ,QAAAA,CAAgB,KAAK,CAAA,CACzC,CAACuJ,CAAAA,CAAYC,CAAa,CAAA,CAAIxJ,QAAAA,CAAS,KAAK,EAE5C,CAAC0I,CAAAA,CAAQe,CAAS,CAAA,CAAIzJ,QAAAA,CAAyB,EAAE,CAAA,CACjD,CAAC0J,CAAAA,CAASC,CAAU,CAAA,CAAI3J,QAAAA,CAAkB,CAC9C,WAAA,CAAa,CAAA,CACb,cAAA,CAAgB,CAAA,CAChB,kBAAA,CAAoB,CAAA,CACpB,eAAA,CAAiB,CAAA,CACjB,gBAAA,CAAkB,CAAA,CAClB,SAAA,CAAW,CAAA,CACX,aAAA,CAAe,IAAA,CACf,aAAA,CAAe,IAAA,CACf,cAAe,IAAA,CACf,aAAA,CAAe,IACjB,CAAC,CAAA,CACK,CAAC4J,CAAAA,CAAaC,CAAc,CAAA,CAAI7J,QAAAA,CAAmB,EAAE,CAAA,CACrD,CAAC8J,CAAAA,CAAuBC,CAAwB,CAAA,CAAI/J,QAAAA,CAExD,MAAS,CAAA,CACLgK,CAAAA,CAAcpK,EAAAA,EAAc,CAC5B,CAACyF,CAAAA,CAAW4E,CAAY,CAAA,CAAIjK,QAAAA,CAA2B,EAAE,EACzDkK,CAAAA,CAAiBtK,EAAAA,EAAc,CAC/B,CAACuK,CAAAA,CAAkBC,EAAmB,CAAA,CAAIpK,QAAAA,CAE9C,MAAS,CAAA,CACL,CAACqK,EAAAA,CAAgBC,EAAiB,CAAA,CAAItK,QAAAA,CAAwB,EAAE,CAAA,CAChE,CAAC0G,EAAAA,CAAQ6D,EAAS,CAAA,CAAIvK,QAAAA,CAAwB,EAAE,CAAA,CAChDwK,EAAAA,CAAc5K,EAAAA,EAAc,CAC5B6K,CAAAA,CAAe7K,IAAc,CAC7B,CAAC8K,EAAAA,CAAeC,EAAgB,CAAA,CAAI3K,QAAAA,CACxC,MACF,CAAA,CACM,CAAC4K,CAAAA,CAAiBC,EAAkB,CAAA,CAAI7K,QAAAA,CAAS,KAAK,EACtD,CAAC8K,EAAAA,CAAmBC,EAAoB,CAAA,CAAI/K,QAAAA,CAAS,CAAC,CAAA,CACtD,CAACgL,CAAAA,CAAcC,EAAe,CAAA,CAAIjL,QAAAA,CAAS,KAAK,CAAA,CAChD,CAACkL,EAAAA,CAAgBC,EAAiB,CAAA,CAAInL,QAAAA,CAAS,CAAC,CAAA,CAChD,CAACoL,EAAAA,CAAkBC,EAAmB,CAAA,CAC1CrL,QAAAA,CAAkC,IAAI,CAAA,CAClCsL,EAAAA,CAAY,EAAA,CACZC,EAAAA,CAAO,EAAA,CAGPC,EAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAMtK,CAAAA,CAAQ,GAAI,CAAA,CAAG,EAAE,CAAA,CAAG,EAAE,EAC/DuK,EAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAMvK,CAAAA,CAAQ,GAAI,CAAA,CAAG,EAAE,CAAA,CAAG,EAAE,CAAA,CAChEwK,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAIxK,CAAAA,CAAQsK,EAAAA,CAAYC,EAAAA,CAAY,EAAE,CAAA,CACzDE,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAIrG,CAAAA,CAAS,CAAA,CAAG,EAAE,CAAA,CAEpCsG,EAAAA,CAAgB,KAAK,GAAA,CAAID,CAAAA,CADT,EAAA,CACqC,CAAC,CAAA,CAEtDE,EAAAA,CAAUzL,WAAAA,CAAY,IAAM,CAChC,GAAI,CAEF,IAAM0L,CAAAA,CAAehD,CAAAA,CAAG,eAAA,EAAgB,CACxCW,CAAAA,CAAUqC,CAAY,CAAA,CACtBnC,CAAAA,CAAWb,CAAAA,CAAG,UAAA,EAAY,CAAA,CAC1B,IAAMiD,CAAAA,CAAWN,EAAAA,CAAa,CAAA,CAC9B5B,CAAAA,CAAef,CAAAA,CAAG,sBAAsBiD,CAAAA,CAAU,CAAC,CAAC,CAAA,CAGpD,IAAMC,CAAAA,CAAYN,CAAAA,CAAc,CAAA,CAC1BO,CAAAA,CAAWH,CAAAA,CAAa9B,CAAAA,CAAY,aAAa,CAAA,CAQvD,GAPIiC,GACFlC,CAAAA,CACEjB,CAAAA,CAAG,sBAAA,CAAuBmD,CAAAA,CAAS,EAAA,CAAID,CAAAA,CAAW,CAAC,CACrD,CAAA,CAIE3C,CAAAA,GAAU,QAAA,CAAU,OAExB,GAAIF,CAAAA,GAAc,eAAgB,CAChC,IAAMlK,CAAAA,CAAQ6M,CAAAA,CAAa9B,CAAAA,CAAY,aAAa,CAAA,CAChD/K,CAAAA,EACFgL,CAAAA,CAAanB,CAAAA,CAAG,mBAAA,CAAoB7J,CAAAA,CAAM,EAAA,CAAIqM,EAAS,CAAC,EAE5D,CAAA,KAAWnC,CAAAA,GAAc,WAAA,CACvBc,CAAAA,CAAanB,CAAAA,CAAG,eAAA,CAAgBwC,EAAS,CAAC,CAAA,CACjCnC,CAAAA,GAAc,QAAA,CACvBc,CAAAA,CAAanB,CAAAA,CAAG,kBAAA,CAAmBwC,EAAS,CAAC,CAAA,CACpCnC,CAAAA,GAAc,QAAA,EACvBoB,EAAAA,CAAUzB,CAAAA,CAAG,eAAA,CAAgB,CAAE,KAAA,CAAO,GAAI,CAAC,CAAC,EAEhD,CAAA,KAAQ,CAER,CACF,CAAA,CAAG,CACDA,CAAAA,CACAK,CAAAA,CACAa,CAAAA,CAAY,aAAA,CACZyB,EAAAA,CACAC,CAAAA,CACArC,CACF,CAAC,CAAA,CAED6C,SAAAA,CAAU,IAAM,CACdL,IAAQ,CACR,IAAMM,CAAAA,CAAQ,WAAA,CAAYN,EAAAA,CAAS,GAAI,CAAA,CACvC,OAAO,IAAM,CACX,aAAA,CAAcM,CAAK,EACrB,CACF,CAAA,CAAG,CAACN,EAAO,CAAC,CAAA,CAEZ,IAAMO,EAAAA,CAAchM,WAAAA,CACjBC,CAAAA,EAAkB,CACjB2J,CAAAA,CAAY,MAAA,CAAO3J,CAAAA,CAAOqI,CAAAA,CAAO,MAAA,CAAQkD,EAAa,EACtD1B,CAAAA,CAAe,KAAA,EAAM,CACrB,IAAMjL,CAAAA,CAAQyJ,CAAAA,CAAOrI,CAAK,CAAA,CACtBpB,CAAAA,EACFgL,CAAAA,CAAanB,CAAAA,CAAG,mBAAA,CAAoB7J,CAAAA,CAAM,EAAA,CAAIqM,EAAS,CAAC,EAE5D,CAAA,CACA,CAACxC,CAAAA,CAAIJ,CAAAA,CAAQsB,CAAAA,CAAaE,CAAAA,CAAgB0B,EAAa,CACzD,CAAA,CAEMS,EAAAA,CAAYjM,WAAAA,CACfkM,CAAAA,EAAiB,CAChBlD,CAAAA,CAAakD,CAAG,CAAA,CAChB9C,CAAAA,CAAc,KAAK,CAAA,CACnBqB,EAAAA,CAAmB,KAAK,CAAA,CACxBI,EAAAA,CAAgB,KAAK,CAAA,CACrB3B,CAAAA,CAAS,KAAK,CAAA,CACdY,CAAAA,CAAe,KAAA,EAAM,CACjBoC,CAAAA,GAAQ,WAAA,CACVrC,CAAAA,CAAanB,CAAAA,CAAG,eAAA,CAAgBwC,EAAS,CAAC,CAAA,CACjCgB,CAAAA,GAAQ,QAAA,CACjBrC,CAAAA,CAAanB,CAAAA,CAAG,mBAAmBwC,EAAS,CAAC,CAAA,CACpCgB,CAAAA,GAAQ,QAAA,GACjB9B,EAAAA,CAAY,KAAA,EAAM,CAClBD,EAAAA,CAAUzB,CAAAA,CAAG,eAAA,CAAgB,CAAE,KAAA,CAAO,GAAI,CAAC,CAAC,CAAA,EAEhD,CAAA,CACA,CAACA,CAAAA,CAAIoB,CAAAA,CAAgBM,EAAW,CAClC,CAAA,CAEM+B,EAAAA,CAAgB7D,CAAAA,CAAOsB,CAAAA,CAAY,aAAa,CAAA,CAIhDxE,GAAgB,IAAA,CAAK,IAAA,CAAA,CAAM1D,EAAAA,CAAc,MAAA,CAAS,CAAA,EAAK,CAAC,CAAA,CACxD0K,EAAAA,CAAqBD,EAAAA,CAAgB,CAAA,CAAI/G,EAAAA,CAAgB,CAAA,CAAI,CAAA,CAC7DiH,EAAAA,CAAoB,IAAA,CAAK,GAAA,CAC7Bd,CAAAA,CAAa,CAAA,CAAqBa,EAAAA,CAClC,CACF,CAAA,CACME,EAAAA,CAAkB,IAAA,CAAK,GAAA,CAAIf,CAAAA,CAAa,CAAA,CAAoB,CAAC,CAAA,CAEnEgB,QAAAA,CAAS,CAACC,EAAO7F,CAAAA,GAAQ,CACvB,GAAI6F,CAAAA,GAAU,GAAA,CAAK,CACjB9D,CAAAA,CAAG,KAAA,EAAM,CACTC,CAAAA,EAAK,CACL,MACF,CAGA,IAAM8D,EAAgBlP,EAAAA,CAAc,IAAA,CAAM4B,CAAAA,EAAMA,CAAAA,CAAE,QAAA,GAAaqN,CAAK,CAAA,CACpE,GAAIC,CAAAA,CAAe,CACjBR,EAAAA,CAAUQ,CAAAA,CAAc,GAAG,CAAA,CAC3B,MACF,CAGA,GAAI1D,CAAAA,GAAc,QAAA,CAAU,CAC1B,GAAIyB,CAAAA,CAAiB,CAEnB,IAAMkC,CAAAA,CAAO/F,CAAAA,CAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC3BqB,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvBgE,EAAAA,CAAsBvI,CAAAA,EAAMA,CAAAA,CAAIsK,CAAI,CAAA,CAC3BF,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9BgE,EAAAA,CAAsBvI,CAAAA,EAAM,IAAA,CAAK,IAAIA,CAAAA,CAAIsK,CAAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CACxC/F,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5C8D,EAAAA,CAAmB,KAAK,CAAA,CACxBE,EAAAA,CAAqB,CAAC,CAAA,CAAA,CAExB,MACF,CACA,GAAI1B,CAAAA,GAAU,KAAA,CACRtC,CAAAA,CAAI,MAAA,EACNuC,CAAAA,CAAS,QAAQ,CAAA,CAAA,KAEd,CACL,IAAMwD,CAAAA,CAAO/F,EAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC/B,GAAIqB,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvByD,EAAAA,CAAY,MAAA,CAAOsC,CAAAA,CAAMpG,EAAAA,CAAO,MAAA,CAAQgG,EAAe,CAAA,CAAA,KAAA,GAC9CE,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9ByD,EAAAA,CAAY,MAAA,CAAO,CAACsC,CAAAA,CAAMpG,EAAAA,CAAO,MAAA,CAAQgG,EAAe,CAAA,CAAA,KAAA,GAC/C3F,CAAAA,CAAI,MAAA,CAAQ,CACrB,IAAMnC,CAAAA,CAAK8B,EAAAA,CAAO8D,EAAAA,CAAY,aAAa,CAAA,CACvC5F,CAAAA,GACF+F,EAAAA,CAAiB/F,CAAE,CAAA,CACnBmG,EAAAA,CAAqB,CAAC,CAAA,CACtBF,EAAAA,CAAmB,IAAI,GAE3B,CAAA,KAAA,CAAW9D,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5CuC,CAAAA,CAAS,KAAK,CAAA,CACdkB,EAAAA,CAAY,KAAA,EAAM,EAEtB,CACA,MACF,CAGA,GAAIQ,CAAAA,CAAc,CAChB,IAAM8B,CAAAA,CAAO/F,CAAAA,CAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC3BqB,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvBoE,EAAAA,CAAmB3I,CAAAA,EAAMA,CAAAA,CAAIsK,CAAI,CAAA,CACxBF,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9BoE,EAAAA,CAAmB3I,CAAAA,EAAM,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAIsK,CAAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CACrC/F,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5CkE,EAAAA,CAAgB,KAAK,CAAA,CACrBE,EAAAA,CAAkB,CAAC,CAAA,CAAA,CAErB,MACF,CAGA,GAAI5B,CAAAA,EAAc,CAACqB,CAAAA,CAAiB,CAClC,IAAMzD,CAAAA,CAAWgD,CAAAA,EAAkB,KAAA,CAAQ,CAAA,CAAI,CAAA,CACzC4C,CAAAA,CAAkB,IAAA,CAAK,GAAA,CAC3BpB,EAAa,CAAA,CAAqBxE,CAAAA,CAClC,CACF,CAAA,CAEM6F,EAAAA,CAAoB,IAAI,GAAA,CAC5B3C,EAAAA,CAAe,GAAA,CAAKzF,EAAAA,EAAO,CACzB,GAAI,CACF,IAAMpG,EAAAA,CAAI,IAAA,CAAK,KAAA,CAAMoG,EAAAA,CAAG,OAAO,CAAA,CAC/B,OAAO,MAAA,CAAOpG,EAAAA,CAAE,UAAA,EAAiB,EAAE,CACrC,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CAAC,CACH,CAAA,CACMyO,EAAAA,CAAa,IAAA,CAAK,GAAA,CAAID,EAAAA,CAAkB,IAAA,CAAM,CAAC,CAAA,CAC/CvH,EAAAA,CAAawH,EAAAA,CAAa,CAAA,CAAIA,EAAAA,CAAa,EAC3CC,EAAAA,CAAmB7C,EAAAA,CAAe,MAAA,CAAS5E,EAAAA,CAC3CqH,EAAAA,CAAO/F,CAAAA,CAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC/B,GAAIqB,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvB0D,EAAa,MAAA,CAAOqC,EAAAA,CAAMI,EAAAA,CAAkBH,CAAe,CAAA,CAAA,KAAA,GAClDH,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9B0D,CAAAA,CAAa,MAAA,CAAO,CAACqC,EAAAA,CAAMI,EAAAA,CAAkBH,CAAe,CAAA,CAAA,KAAA,GACnDhG,CAAAA,CAAI,MAAA,CAAQ,CAGrB,IAAIoG,EAAAA,CAAW,CAAA,CACXC,EAAAA,CACEC,EAAAA,CAAWlD,CAAAA,EAAkB,EAAA,EAAM,EAAA,CACnCvD,EAAAA,CAAS,IAAI,GAAA,CACnBA,GAAO,GAAA,CAAIyG,EAAAA,CAAU,EAAE,CAAA,CACvB,IAAA,IAAWzI,EAAAA,IAAMyF,EAAAA,CACf,GAAI,CACF,IAAM7L,EAAAA,CAAI,IAAA,CAAK,KAAA,CAAMoG,EAAAA,CAAG,OAAO,CAAA,CACzBkC,EAAAA,CAAO,MAAA,CAAOtI,EAAAA,CAAE,UAAA,EAAiB,EAAE,CAAA,CACnC8O,EAAAA,CAAO,CAACxG,EAAAA,EAAQA,EAAAA,GAASuG,EAAAA,CAAWA,EAAAA,CAAWvG,EAAAA,CAChDF,GAAO,GAAA,CAAI0G,EAAI,CAAA,EAAG1G,EAAAA,CAAO,GAAA,CAAI0G,EAAAA,CAAM,EAAE,CAAA,CAC1C1G,EAAAA,CAAO,GAAA,CAAI0G,EAAI,CAAA,CAAG,IAAA,CAAK1I,EAAE,EAC3B,CAAA,KAAQ,CACNgC,EAAAA,CAAO,GAAA,CAAIyG,EAAQ,CAAA,CAAG,IAAA,CAAKzI,EAAE,EAC/B,CAEF,IAAMyC,EAAAA,CAAcT,EAAAA,CAAO,IAAA,CAAO,EAClC,IAAA,GAAW,EAAG2G,EAAW,CAAA,GAAK3G,EAAAA,CAAQ,CAChCS,EAAAA,EAAa8F,EAAAA,EAAAA,CACjB,IAAA,IAAWvI,EAAAA,IAAM2I,EAAAA,CACXJ,EAAAA,GAAa1C,CAAAA,CAAa,gBAC5B2C,EAAAA,CAAcxI,EAAAA,CAAAA,CAEhBuI,EAAAA,GAEJ,CACIC,EAAAA,GACFzC,EAAAA,CAAiByC,EAAW,CAAA,CAC5BrC,EAAAA,CAAqB,CAAC,CAAA,CACtBF,EAAAA,CAAmB,IAAI,CAAA,EAE3B,SAAW+B,CAAAA,GAAU,GAAA,EAAOzC,CAAAA,CAAkB,CAC5C,IAAM9B,EAAAA,CAAWS,CAAAA,CAAG,mBAAA,CAAoBqB,CAAAA,CAAiB,EAAE,CAAA,CAC3DkB,EAAAA,CAAoBhD,EAAQ,CAAA,CAC5B8C,EAAAA,CAAkB,CAAC,CAAA,CACnBF,EAAAA,CAAgB,IAAI,EACtB,CAAA,KAAA,CAAWlE,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5C0D,CAAAA,CAAa,KAAA,EAAM,CACnBjB,EAAc,KAAK,CAAA,CAAA,CAErB,MACF,CAGA,GAAID,CAAAA,EAAcqB,CAAAA,CAAiB,CACjC,IAAMkC,CAAAA,CAAO/F,CAAAA,CAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC3BqB,IAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvBgE,EAAAA,CAAsBvI,CAAAA,EAAMA,CAAAA,CAAIsK,CAAI,CAAA,CAC3BF,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9BgE,EAAAA,CAAsBvI,CAAAA,EAAM,KAAK,GAAA,CAAIA,CAAAA,CAAIsK,CAAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CACxC/F,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5C8D,EAAAA,CAAmB,KAAK,CAAA,CACxBE,EAAAA,CAAqB,CAAC,CAAA,CAAA,CAExB,MACF,CAGA,GAAI5B,CAAAA,GAAc,cAAA,EAAkBE,CAAAA,GAAU,KAAA,CAAO,CACnD,GAAIuD,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,UACvBqF,EAAAA,CAAY,IAAA,CAAK,GAAA,CAAIpC,CAAAA,CAAY,aAAA,CAAgB,CAAA,CAAGtB,CAAAA,CAAO,MAAA,CAAS,CAAC,CAAC,CAAA,CAAA,KAAA,GAC7DkE,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,QAC9BqF,EAAAA,CAAY,IAAA,CAAK,GAAA,CAAIpC,CAAAA,CAAY,aAAA,CAAgB,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,KAAA,GAC7CjD,CAAAA,CAAI,MAAA,CAAQ,CACrBuC,CAAAA,CAAS,QAAQ,EAEjB,IAAMrK,CAAAA,CAAQyJ,CAAAA,CAAOsB,CAAAA,CAAY,aAAa,CAAA,CAC1C/K,CAAAA,EACFgL,CAAAA,CAAanB,CAAAA,CAAG,mBAAA,CAAoB7J,CAAAA,CAAM,EAAE,CAAC,EAEjD,CACA,MACF,CAGA,GAAIkK,CAAAA,GAAc,cAAA,EAAkBE,CAAAA,GAAU,QAAA,CAAU,CACtD,IAAMyD,CAAAA,CAAO/F,CAAAA,CAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC/B,GAAIqB,IAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvBmD,CAAAA,CAAe,MAAA,CAAO4C,CAAAA,CAAMzH,CAAAA,CAAU,MAAA,CAAQoH,EAAiB,CAAA,CAAA,KAAA,GACtDG,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9BmD,CAAAA,CAAe,MAAA,CAAO,CAAC4C,CAAAA,CAAMzH,CAAAA,CAAU,MAAA,CAAQoH,EAAiB,CAAA,CAAA,KAAA,GACvD1F,CAAAA,CAAI,MAAA,CAAQ,CACrB,IAAMpB,CAAAA,CAAKN,CAAAA,CAAU6E,CAAAA,CAAe,aAAa,EAC7CvE,CAAAA,GACFyE,EAAAA,CAAoBzE,CAAE,CAAA,CACtB2E,EAAAA,CAAkBxB,CAAAA,CAAG,mBAAA,CAAoBnD,CAAAA,CAAG,EAAA,CAAIA,CAAAA,CAAG,aAAa,CAAC,CAAA,CACjE8E,CAAAA,CAAa,KAAA,EAAM,CACnBI,EAAAA,CAAmB,KAAK,CAAA,CACxBrB,CAAAA,CAAc,IAAI,CAAA,EAEtB,CAAA,KAAA,CAAWzC,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5CuC,CAAAA,CAAS,KAAK,CAAA,CACdY,CAAAA,CAAe,KAAA,EAAM,CAAA,CAEvB,MACF,CAGA,GAAIf,CAAAA,GAAc,WAAA,EAAeA,CAAAA,GAAc,QAAA,CAAU,CACvD,GAAIE,CAAAA,GAAU,MAERtC,CAAAA,CAAI,MAAA,GACNuC,CAAAA,CAAS,QAAQ,CAAA,CAGfW,CAAAA,CADEd,CAAAA,GAAc,WAAA,CACHL,CAAAA,CAAG,eAAA,EAAgB,CAEnBA,CAAAA,CAAG,kBAAA,EAFiB,QAKhC,CAEL,IAAMgE,CAAAA,CAAO/F,CAAAA,CAAI,IAAA,CAAOwE,EAAAA,CAAO,CAAA,CAC/B,GAAIqB,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,SAAA,CACvBmD,CAAAA,CAAe,MAAA,CAAO4C,CAAAA,CAAMzH,CAAAA,CAAU,MAAA,CAAQoH,EAAiB,CAAA,CAAA,KAAA,GACtDG,CAAAA,GAAU,GAAA,EAAO7F,CAAAA,CAAI,OAAA,CAC9BmD,CAAAA,CAAe,MAAA,CAAO,CAAC4C,CAAAA,CAAMzH,CAAAA,CAAU,MAAA,CAAQoH,EAAiB,UACvD1F,CAAAA,CAAI,MAAA,CAAQ,CACrB,IAAMpB,CAAAA,CAAKN,CAAAA,CAAU6E,CAAAA,CAAe,aAAa,CAAA,CAC7CvE,CAAAA,GACFyE,EAAAA,CAAoBzE,CAAE,CAAA,CACtB2E,EAAAA,CAAkBxB,CAAAA,CAAG,mBAAA,CAAoBnD,CAAAA,CAAG,EAAA,CAAIA,CAAAA,CAAG,aAAa,CAAC,CAAA,CACjE8E,CAAAA,CAAa,KAAA,EAAM,CACnBI,EAAAA,CAAmB,KAAK,CAAA,CACxBrB,CAAAA,CAAc,IAAI,GAEtB,CAAA,KAAA,CAAWzC,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,MAAA,IAC5CuC,CAAAA,CAAS,KAAK,CAAA,CACdY,CAAAA,CAAe,KAAA,EAAM,EAEzB,CACA,MACF,CACF,CAAC,CAAA,CAGD,IAAMsD,EAAAA,CACJrE,CAAAA,GAAc,cAAA,EAAkBE,CAAAA,GAAU,KAAA,EAAS,CAACE,CAAAA,CAChDkE,EAAAA,CAAe,CAACD,EAAAA,CAGhBE,CAAAA,CAAiD,EAAC,CACxD,OAAI1C,CAAAA,EACF0C,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,KAAA,CAAO,MAAA,CAAQ,QAAS,CAAC,CAAA,CACjDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,UAAA,CAAY,MAAA,CAAQ,SAAU,CAAC,CAAA,CACvDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,KAAA,CAAO,MAAA,CAAQ,MAAO,CAAC,GACtCrE,CAAAA,GAAU,QAAA,GACnBqE,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,KAAA,CAAO,MAAA,CAAQ,UAAW,CAAC,CAAA,CACnDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,UAAA,CAAY,MAAA,CAAQ,SAAU,CAAC,CAAA,CAAA,CAEpD1C,CAAAA,GACC3B,CAAAA,GAAU,KAAA,CACRF,CAAAA,GAAc,cAAA,EAChBuE,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,KAAA,CAAO,OAAQ,UAAW,CAAC,CAAA,CACnDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,OAAA,CAAS,MAAA,CAAQ,WAAY,CAAC,CAAA,EAEtDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,OAAA,CAAS,MAAA,CAAQ,QAAS,CAAC,CAAA,CAE5C,CAACnE,CAAAA,EAAc,CAACqB,CAAAA,EACzB8C,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,OAAA,CAAS,OAAQ,QAAS,CAAC,CAAA,CACnDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,KAAA,CAAO,MAAA,CAAQ,MAAO,CAAC,CAAA,EACtCnE,CAAAA,EAAc,CAACqB,CAAAA,EACxB8C,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,OAAA,CAAS,MAAA,CAAQ,cAAe,CAAC,CAAA,CACzDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,GAAA,CAAK,MAAA,CAAQ,UAAW,CAAC,CAAA,CACjDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,KAAA,CAAO,MAAA,CAAQ,MAAO,CAAC,CAAA,EAE/CA,CAAAA,CAAY,IAAA,CAAK,CAAE,IAAK,KAAA,CAAO,MAAA,CAAQ,MAAO,CAAC,CAAA,CAAA,CAGnDA,CAAAA,CAAY,IAAA,CAAK,CAAE,GAAA,CAAK,MAAA,CAAQ,MAAA,CAAQ,aAAc,CAAC,CAAA,CACvDA,EAAY,IAAA,CAAK,CAAE,GAAA,CAAK,GAAA,CAAK,MAAA,CAAQ,MAAO,CAAC,CAAA,CAG3CnM,IAAAA,CAACC,GAAAA,CAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAON,CAAAA,CAAO,MAAA,CAAQoE,CAAAA,CAEhD,QAAA,CAAA,CAAA/D,IAAAA,CAACC,GAAAA,CAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,CAAU,CAAA,CAAG,KAAA,CAAON,CAAAA,CAC9D,QAAA,CAAA,CAAAS,IAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,KAAA,CAAM,MAAA,CAAO,QAAA,CAAA,gBAAA,CAExB,CAAA,CACAC,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPH,IAAAA,CAACG,KAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,CAAA,GAAA,CAAEiM,GAAAA,CAAAA,CAAQ,CAAA,CAAA,CAC3B,CAAA,CAGApM,IAAAA,CAACC,GAAAA,CAAA,CAAI,aAAA,CAAc,KAAA,CAAM,KAAA,CAAON,CAAAA,CAAO,SAAU,CAAA,CAE/C,QAAA,CAAA,CAAAS,GAAAA,CAACH,GAAAA,CAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAOgK,EAAAA,CACjC,QAAA,CAAAjK,IAAAA,CAACT,CAAAA,CAAA,CACC,KAAA,CAAM,YAAA,CACN,KAAA,CAAO0M,EAAAA,CAAY,MAAA,CAAS,MAAA,CAC5B,KAAA,CAAOhC,EAAAA,CACP,QAAA,CAAU,CAAA,CAET,QAAA,CAAA,CAAA9N,EAAAA,CAAa,GAAA,CAAI,CAACkQ,CAAAA,CAASC,CAAAA,GAC1BtM,IAAAA,CAACC,IAAA,CAA8B,aAAA,CAAc,QAAA,CAC1C,QAAA,CAAA,CAAAqM,CAAAA,CAAK,CAAA,EAAKlM,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACjBkM,CAAAA,CAAQ,KAAA,EACPjM,GAAAA,CAACD,KAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,IAAA,CAAI,IAAA,CAChB,QAAA,CAAAkM,CAAAA,CAAQ,KAAA,CACX,CAAA,CAEDA,CAAAA,CAAQ,KAAA,CAAM,GAAA,CAAKE,CAAAA,EAClBvM,IAAAA,CAACG,KAAA,CACC,QAAA,CAAA,CAAAH,IAAAA,CAACG,IAAAA,CAAA,CACC,IAAA,CAAMyH,CAAAA,GAAc2E,CAAAA,CAAK,GAAA,CACxB,GAAI3E,CAAAA,GAAc2E,CAAAA,CAAK,GAAA,CACpB,CAAE,KAAA,CAAO,MAAgB,CAAA,CACzB,EAAC,CAEJ,QAAA,CAAA,CAAA3E,CAAAA,GAAc2E,CAAAA,CAAK,GAAA,CAAM,IAAA,CAAO,IAAA,CAChCA,CAAAA,CAAK,KAAA,CAAA,CACR,CAAA,CACAvM,IAAAA,CAACG,IAAAA,CAAA,CAAK,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,CAAA,IAAA,CAAGoM,CAAAA,CAAK,QAAA,CAAS,GAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAVxBA,CAAAA,CAAK,GAWhB,CACD,CAAA,CAAA,CAAA,CApBOF,CAAAA,CAAQ,KAAA,EAASC,CAqB3B,CACD,CAAA,CAEA1E,CAAAA,GAAc,cAAA,EACbxH,GAAAA,CAAC8G,EAAAA,CAAA,CACC,MAAA,CAAQC,CAAAA,CACR,aAAA,CAAesB,CAAAA,CAAY,aAAA,CAC3B,UAAA,CAAYA,CAAAA,CAAY,YAAA,CACxB,WAAA,CAAa4B,GACb,KAAA,CAAOJ,EAAAA,CAAY,CAAA,CACrB,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CAGCrC,CAAAA,GAAc,cAAA,EAAkB,CAACI,CAAAA,EAChC5H,GAAAA,CAACwD,EAAAA,CAAA,CACC,YAAA,CAAcoH,EAAAA,EAAe,EAAA,EAAM,EAAA,CACnC,KAAA,CAAOA,EAAAA,CACP,SAAA,CAAWlH,CAAAA,CACX,aAAA,CACEgE,CAAAA,GAAU,QAAA,CAAWa,CAAAA,CAAe,aAAA,CAAgB,EAAA,CAEtD,YAAA,CAAcb,CAAAA,GAAU,QAAA,CAAWa,EAAe,YAAA,CAAe,CAAA,CACjE,KAAA,CAAOwB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,KAAA,CAAO8B,EAAAA,CAAe,MAAA,CAAS,MAAA,CAC/B,QAAA,CAAU3D,CAAAA,CACZ,CAAA,CAEDX,CAAAA,GAAc,gBAAkB6B,CAAAA,EAAgBb,CAAAA,EAC/CxI,GAAAA,CAAC4G,EAAAA,CAAA,CACC,QAAA,CAAU4B,CAAAA,CACV,QAAA,CAAUiB,EAAAA,CACV,KAAA,CAAOM,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcT,GACd,KAAA,CAAM,MAAA,CACR,CAAA,CAED/B,CAAAA,GAAc,cAAA,EACbI,CAAAA,EACAY,CAAAA,EACA,CAACS,CAAAA,EACD,CAACI,CAAAA,EACCrJ,GAAAA,CAACuF,EAAAA,CAAA,CACC,QAAA,CAAUiD,CAAAA,CACV,MAAA,CAAQE,EAAAA,CACR,KAAA,CAAOqB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,aAAA,CAAelB,CAAAA,CAAa,aAAA,CAC5B,YAAA,CAAcA,CAAAA,CAAa,YAAA,CAC3B,KAAA,CAAM,MAAA,CACR,EAEHtB,CAAAA,GAAc,cAAA,EACbI,CAAAA,EACAqB,CAAAA,EACA,CAACI,CAAAA,EACDN,EAAAA,EACE/I,GAAAA,CAACgG,EAAAA,CAAA,CACC,KAAA,CAAO+C,EAAAA,CACP,KAAA,CAAOgB,CAAAA,CACP,OAAQC,CAAAA,CACR,YAAA,CAAcb,EAAAA,CACd,KAAA,CAAM,MAAA,CACR,CAAA,CAEH3B,CAAAA,GAAc,WAAA,EAAe,CAACI,CAAAA,EAC7B5H,GAAAA,CAACwD,EAAAA,CAAA,CACC,YAAA,CAAa,mBACb,SAAA,CAAWE,CAAAA,CACX,aAAA,CACEgE,CAAAA,GAAU,QAAA,CAAWa,CAAAA,CAAe,aAAA,CAAgB,EAAA,CAEtD,YAAA,CAAcb,CAAAA,GAAU,QAAA,CAAWa,CAAAA,CAAe,YAAA,CAAe,CAAA,CACjE,KAAA,CAAOwB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,KAAA,CAAOtC,CAAAA,GAAU,QAAA,CAAW,MAAA,CAAS,MAAA,CACvC,CAAA,CAEDF,CAAAA,GAAc,WAAA,EAAe6B,CAAAA,EAAgBb,CAAAA,EAC5CxI,GAAAA,CAAC4G,EAAAA,CAAA,CACC,QAAA,CAAU4B,CAAAA,CACV,QAAA,CAAUiB,EAAAA,CACV,KAAA,CAAOM,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcT,EAAAA,CACd,KAAA,CAAM,MAAA,CACR,CAAA,CAED/B,CAAAA,GAAc,aACbI,CAAAA,EACAY,CAAAA,EACA,CAACS,CAAAA,EACD,CAACI,CAAAA,EACCrJ,GAAAA,CAACuF,EAAAA,CAAA,CACC,QAAA,CAAUiD,CAAAA,CACV,MAAA,CAAQE,EAAAA,CACR,KAAA,CAAOqB,EACP,MAAA,CAAQC,CAAAA,CACR,aAAA,CAAelB,CAAAA,CAAa,aAAA,CAC5B,YAAA,CAAcA,CAAAA,CAAa,YAAA,CAC3B,KAAA,CAAM,MAAA,CACR,CAAA,CAEHtB,CAAAA,GAAc,WAAA,EACbI,CAAAA,EACAqB,CAAAA,EACA,CAACI,CAAAA,EACDN,EAAAA,EACE/I,GAAAA,CAACgG,EAAAA,CAAA,CACC,KAAA,CAAO+C,EAAAA,CACP,KAAA,CAAOgB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcb,EAAAA,CACd,KAAA,CAAM,OACR,CAAA,CAEH3B,CAAAA,GAAc,QAAA,EAAY,CAACI,CAAAA,EAC1B5H,GAAAA,CAACwD,EAAAA,CAAA,CACC,YAAA,CAAa,kBAAA,CACb,SAAA,CAAWE,CAAAA,CACX,aAAA,CACEgE,CAAAA,GAAU,QAAA,CAAWa,CAAAA,CAAe,aAAA,CAAgB,EAAA,CAEtD,YAAA,CAAcb,CAAAA,GAAU,QAAA,CAAWa,CAAAA,CAAe,YAAA,CAAe,CAAA,CACjE,KAAA,CAAOwB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,KAAA,CAAOtC,CAAAA,GAAU,SAAW,MAAA,CAAS,MAAA,CACvC,CAAA,CAEDF,CAAAA,GAAc,QAAA,EAAY6B,CAAAA,EAAgBb,CAAAA,EACzCxI,GAAAA,CAAC4G,EAAAA,CAAA,CACC,QAAA,CAAU4B,CAAAA,CACV,QAAA,CAAUiB,EAAAA,CACV,KAAA,CAAOM,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcT,EAAAA,CACd,KAAA,CAAM,MAAA,CACR,CAAA,CAED/B,CAAAA,GAAc,QAAA,EACbI,CAAAA,EACAY,CAAAA,EACA,CAACS,CAAAA,EACD,CAACI,GACCrJ,GAAAA,CAACuF,EAAAA,CAAA,CACC,QAAA,CAAUiD,CAAAA,CACV,MAAA,CAAQE,EAAAA,CACR,KAAA,CAAOqB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,aAAA,CAAelB,CAAAA,CAAa,aAAA,CAC5B,aAAcA,CAAAA,CAAa,YAAA,CAC3B,KAAA,CAAM,MAAA,CACR,CAAA,CAEHtB,CAAAA,GAAc,QAAA,EACbI,CAAAA,EACAqB,CAAAA,EACA,CAACI,CAAAA,EACDN,EAAAA,EACE/I,GAAAA,CAACgG,EAAAA,CAAA,CACC,KAAA,CAAO+C,EAAAA,CACP,KAAA,CAAOgB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcb,EAAAA,CACd,KAAA,CAAM,MAAA,CACR,CAAA,CAEH3B,CAAAA,GAAc,QAAA,EAAY,CAACyB,CAAAA,EAC1BjJ,GAAAA,CAAC+F,EAAAA,CAAA,CACC,MAAA,CAAQhB,EAAAA,CACR,aAAA,CAAe2C,CAAAA,GAAU,QAAA,CAAWmB,EAAAA,CAAY,aAAA,CAAgB,EAAA,CAChE,YAAA,CAAcnB,CAAAA,GAAU,QAAA,CAAWmB,EAAAA,CAAY,aAAe,CAAA,CAC9D,KAAA,CAAOkB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,KAAA,CAAOtC,CAAAA,GAAU,QAAA,CAAW,MAAA,CAAS,MAAA,CACvC,CAAA,CAEDF,CAAAA,GAAc,QAAA,EAAYyB,CAAAA,EAAmBF,IAC5C/I,GAAAA,CAACgG,EAAAA,CAAA,CACC,KAAA,CAAO+C,EAAAA,CACP,KAAA,CAAOgB,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,YAAA,CAAcb,EAAAA,CACd,KAAA,CAAM,MAAA,CACR,CAAA,CAIFvJ,KAACC,GAAAA,CAAA,CAAI,aAAA,CAAc,QAAA,CAAS,KAAA,CAAOiK,EAAAA,CACjC,QAAA,CAAA,CAAAlK,IAAAA,CAACT,CAAAA,CAAA,CAAM,KAAA,CAAM,SAAA,CAAU,KAAA,CAAO2K,EAAAA,CAAY,QAAA,CAAU,CAAA,CAClD,QAAA,CAAA,CAAA9J,GAAAA,CAACI,EAAAA,CAAA,CACC,MAAA,CAAQ6H,CAAAA,CACR,OAAA,CAAS6B,EAAAA,CAAa,CAAA,CACtB,KAAA,CAAO,CACL,CAAE,GAAA,CAAK,CAAA,CAAG,MAAO,MAAO,CAAA,CACxB,GAAI,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAA,CAAG,CAACtD,CAAAA,CAAG3F,CAAAA,IAAO,CACvC,GAAA,CAAA,CAAMA,EAAI,CAAA,EAAK,CAAA,CACf,KAAA,CAAO,OACT,CAAA,CAAE,CAAA,CACF,GAAI,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAA,CAAG,CAAC2F,EAAG3F,CAAAA,IAAO,CACvC,GAAA,CAAK,EAAA,CAAA,CAAMA,CAAAA,CAAI,CAAA,EAAK,EAAA,CACpB,KAAA,CAAO,QACT,CAAA,CAAE,CAAA,CACF,GAAI,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAA,CAAG,CAAC2F,CAAAA,CAAG3F,CAAAA,IAAO,CACvC,GAAA,CAAK,GAAA,CAAA,CAAOA,CAAAA,CAAI,CAAA,EAAK,EAAA,CACrB,KAAA,CAAO,KACT,CAAA,CAAE,CACJ,CAAA,CACA,KAAA,CAAM,yBAAA,CACR,CAAA,CACAb,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,YAAA,CAEpB,CAAA,CAEE,CACE,CAAC,WAAA,CAAapC,CAAAA,CAAOoK,CAAAA,CAAQ,cAAc,CAAA,CAAG,MAAM,CAAA,CACpD,CAAC,WAAA,CAAapK,CAAAA,CAAOoK,EAAQ,kBAAkB,CAAA,CAAG,OAAO,CAAA,CACzD,CACE,QAAA,CACApK,CAAAA,CAAOoK,CAAAA,CAAQ,eAAe,CAAA,CAC9BA,CAAAA,CAAQ,eAAA,CAAkB,CAAA,CAAI,KAAA,CAAQ,OACxC,CAAA,CACA,CACE,SAAA,CACApK,CAAAA,CAAOoK,CAAAA,CAAQ,gBAAgB,CAAA,CAC/BA,CAAAA,CAAQ,gBAAA,CAAmB,CAAA,CAAI,QAAA,CAAW,OAC5C,CAAA,CACA,CACE,YAAA,CACA,IAAIA,CAAAA,CAAQ,SAAA,CAAY,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACvCA,CAAAA,CAAQ,SAAA,CAAY,EAAA,CAAM,KAAA,CAAQ,OACpC,CAAA,CACA,CAAC,eAAgBpK,CAAAA,CAAOoK,CAAAA,CAAQ,WAAW,CAAA,CAAG,EAAE,CAClD,CAAA,CACA,GAAA,CAAI,CAAC,CAACvH,CAAAA,CAAO4L,CAAAA,CAAO9M,CAAK,CAAA,GACzBM,KAACC,GAAAA,CAAA,CACC,QAAA,CAAA,CAAAD,IAAAA,CAACG,IAAAA,CAAA,CAAM,QAAA,CAAA,CAAAS,CAAAA,CAAM,GAAA,CAAA,CAAC,CAAA,CACdR,GAAAA,CAACH,GAAAA,CAAA,CAAI,QAAA,CAAU,CAAA,CAAG,cAAA,CAAe,UAAA,CAC/B,QAAA,CAAAG,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,GAAIT,CAAAA,CAAQ,CAAE,KAAA,CAAAA,CAAM,CAAA,CAAI,GACjC,QAAA,CAAA8M,CAAAA,CACH,CAAA,CACF,CAAA,CAAA,CAAA,CANQ5L,CAOV,CACD,CAAA,CACDR,GAAAA,CAACD,IAAAA,CAAA,CAAK,QAAA,CAAA,GAAA,CAAC,CAAA,CACPC,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAC,QAAA,CAAQ,IAAA,CAAC,QAAA,CAAA,cAAA,CAEpB,CAAA,CAEE,CACE,CAAC,KAAA,CAAO1D,CAAAA,CAAe0L,CAAAA,CAAQ,aAAa,CAAA,CAAG,EAAE,CAAA,CACjD,CAAC,KAAA,CAAO1L,CAAAA,CAAe0L,CAAAA,CAAQ,aAAa,CAAA,CAAG,EAAE,CAAA,CACjD,CAAC,KAAA,CAAO1L,CAAAA,CAAe0L,CAAAA,CAAQ,aAAa,CAAA,CAAG,EAAE,CAAA,CACjD,CAAC,KAAA,CAAO1L,CAAAA,CAAe0L,CAAAA,CAAQ,aAAa,CAAA,CAAG,EAAE,CACnD,CAAA,CACA,GAAA,CAAI,CAAC,CAACvH,CAAAA,CAAO4L,CAAAA,CAAO9M,CAAK,IACzBM,IAAAA,CAACC,GAAAA,CAAA,CACC,QAAA,CAAA,CAAAD,IAAAA,CAACG,IAAAA,CAAA,CAAM,QAAA,CAAA,CAAAS,CAAAA,CAAM,GAAA,CAAA,CAAC,CAAA,CACdR,GAAAA,CAACH,GAAAA,CAAA,CAAI,SAAU,CAAA,CAAG,cAAA,CAAe,UAAA,CAC/B,QAAA,CAAAG,GAAAA,CAACD,IAAAA,CAAA,CAAK,IAAA,CAAI,IAAA,CAAE,GAAIT,CAAAA,CAAQ,CAAE,KAAA,CAAAA,CAAM,EAAI,EAAC,CAClC,QAAA,CAAA8M,CAAAA,CACH,CAAA,CACF,CAAA,CAAA,CAAA,CANQ5L,CAOV,CACD,CAAA,CAAA,CACH,CAAA,CAEAR,GAAAA,CAACb,CAAAA,CAAA,CAAM,KAAA,CAAM,QAAA,CAAS,KAAA,CAAO2K,EAAAA,CAC1B,QAAA,CAAAiC,CAAAA,CAAY,GAAA,CAAKI,CAAAA,EAChBvM,IAAAA,CAACC,GAAAA,CAAA,CACC,QAAA,CAAA,CAAAG,GAAAA,CAACD,IAAAA,CAAA,CAAM,QAAA,CAAAoM,CAAAA,CAAK,OAAO,CAAA,CACnBnM,GAAAA,CAACH,GAAAA,CAAA,CAAI,QAAA,CAAU,CAAA,CAAG,cAAA,CAAe,UAAA,CAC/B,QAAA,CAAAD,IAAAA,CAACG,IAAAA,CAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAA,CAAA,CAAA,GAAA,CAAEoM,CAAAA,CAAK,GAAA,CAAI,GAAA,CAAA,CAAC,CAAA,CACnC,CAAA,CAAA,CAAA,CAJQA,CAAAA,CAAK,GAKf,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEA,eAAsBE,GAAUC,CAAAA,CAA+B,CAC7D,IAAInF,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAK,MAAMoF,CAAAA,CAAY,IAAA,CAAKD,CAAM,EACpC,CAAA,MAAS/O,CAAAA,CAAK,CACZ,IAAMiP,CAAAA,CAAMjP,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAA,CAC3D,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,mCAAA,EAAsCiP,CAAG;AAAA,CAAI,CAAA,CAClE,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,SAASF,CAAM;AAAA,CAAI,CAAA,CACxC,OAAA,CAAQ,MAAA,CAAO,KAAA,CACb,CAAA;AAAA,CACF,EACA,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAGA,MADiBG,MAAAA,CAAOzM,GAAAA,CAACkH,EAAAA,CAAA,CAAI,EAAA,CAAIC,CAAAA,CAAI,CAAE,CAAA,CACxB,gBACjB","file":"app.js","sourcesContent":["export type NavItem = \"capabilities\" | \"exchanges\" | \"errors\" | \"events\";\n\nexport type NavSection = {\n label?: string;\n items: { key: NavItem; label: string; shortcut: string }[];\n};\n\nexport const NAV_SECTIONS: NavSection[] = [\n {\n items: [{ key: \"capabilities\", label: \"Capabilities\", shortcut: \"1\" }],\n },\n {\n items: [\n { key: \"exchanges\", label: \"Exchanges\", shortcut: \"2\" },\n { key: \"errors\", label: \"Errors\", shortcut: \"3\" },\n { key: \"events\", label: \"Events\", shortcut: \"4\" },\n ],\n },\n];\n\nexport const ALL_NAV_ITEMS = NAV_SECTIONS.flatMap((s) => s.items);\n\nexport interface RouteSummary {\n id: string;\n status: string;\n totalExchanges: number;\n completedExchanges: number;\n failedExchanges: number;\n droppedExchanges: number;\n avgDurationMs: number | null;\n}\n\nexport interface ExchangeRecord {\n id: string;\n routeId: string;\n contextId: string;\n correlationId: string;\n status: string;\n startedAt: string;\n completedAt: string | null;\n durationMs: number | null;\n error: string | null;\n}\n\nexport interface EventRecord {\n id?: number;\n timestamp: string;\n contextId: string;\n eventName: string;\n details: string;\n}\n\nexport interface Metrics {\n totalRoutes: number;\n totalExchanges: number;\n completedExchanges: number;\n failedExchanges: number;\n droppedExchanges: number;\n errorRate: number;\n avgDurationMs: number | null;\n p90DurationMs: number | null;\n p95DurationMs: number | null;\n p99DurationMs: number | null;\n}\n\nexport interface ExchangeSnapshot {\n headers: string;\n body: string | null;\n truncated: boolean;\n}\n\nexport interface RouteActivity {\n throughput: number[];\n recentErrors: number;\n}\n","export function truncate(str: string, maxLen: number): string {\n if (maxLen <= 0) return \"\";\n return str.length > maxLen ? str.slice(0, maxLen - 1) + \"\\u2026\" : str;\n}\n\nexport function formatDuration(ms: number | null): string {\n if (ms === null || ms === undefined) return \"-\";\n if (!Number.isFinite(ms) || ms < 0) return \"-\";\n if (ms === 0) return \"<1ms\";\n if (ms < 1000) return `${Math.round(ms)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nexport function statusColor(status: string): string {\n switch (status) {\n case \"completed\":\n case \"started\":\n return \"green\";\n case \"failed\":\n return \"red\";\n case \"stopped\":\n case \"dropped\":\n return \"yellow\";\n default:\n return \"white\";\n }\n}\n\nexport function col(str: string, len: number | undefined): string {\n if (len === undefined) return str;\n if (len <= 0) return \"\";\n if (str.length > len) return str.slice(0, len - 1) + \"\\u2026\";\n return str.padEnd(len);\n}\n\n// Fixed column widths for the Details column so fields line up across rows.\n// All event types share the same 4-column layout:\n// [col1: 10] [col2: 10] [exId: 12] [dur: 6] [extra]\n// Step events: operation (adapter) id… dur metadata\n// Exchange events: routeId (status) id… dur\nconst DET = {\n COL1: 10, // operation or routeId\n COL2: 10, // (adapter) or (err)/(reason)/(dropped)\n EX: 12, // \"789003e7 \"\n DUR: 6, // \"1ms \" \"10.0s \"\n} as const;\n\nexport interface DetailColumns {\n step: string;\n adapter: string;\n exchange: string;\n duration: string;\n meta: string;\n}\n\n/**\n * Parse a JSON event detail string into structured columns.\n * Shared normalizer used by both formatDetails and formatDetailColumns.\n */\nfunction parseEventDetail(raw: string): DetailColumns | null {\n try {\n const d = JSON.parse(raw) as Record<string, unknown>;\n\n const exchange =\n \"exchangeId\" in d ? `${String(d[\"exchangeId\"]).slice(0, 8)}` : \"\";\n const duration =\n \"duration\" in d ? formatDuration(d[\"duration\"] as number) : \"\";\n\n // Step/operation events\n if (\"operation\" in d && \"routeId\" in d) {\n const adapter =\n \"adapter\" in d\n ? `(${d[\"adapter\"]})`\n : \"adapterId\" in d\n ? `(${d[\"adapterId\"]})`\n : \"\";\n let meta = \"\";\n if (\n \"metadata\" in d &&\n typeof d[\"metadata\"] === \"object\" &&\n d[\"metadata\"] !== null\n ) {\n const m = d[\"metadata\"] as Record<string, unknown>;\n const keys = Object.keys(m).slice(0, 2);\n if (keys.length > 0) meta = keys.map((k) => `${k}=${m[k]}`).join(\" \");\n }\n return {\n step: String(d[\"operation\"]),\n adapter,\n exchange,\n duration,\n meta,\n };\n }\n\n // Exchange events\n if (\"routeId\" in d && \"exchangeId\" in d) {\n const qualifier =\n \"error\" in d\n ? \"(err)\"\n : \"reason\" in d\n ? `(${String(d[\"reason\"]).slice(0, 8)})`\n : \"\";\n return {\n step: String(d[\"routeId\"]),\n adapter: qualifier,\n exchange,\n duration,\n meta: \"\",\n };\n }\n\n // Route lifecycle events\n if (\"route\" in d && typeof d[\"route\"] === \"object\" && d[\"route\"] !== null) {\n const route = d[\"route\"] as {\n routeId?: string;\n definition?: { id?: string };\n };\n return {\n step: route.routeId ?? route.definition?.id ?? \"?\",\n adapter: \"\",\n exchange: \"\",\n duration: \"\",\n meta: \"\",\n };\n }\n\n // Plugin events\n if (\"pluginId\" in d) {\n return {\n step: `plugin=${d[\"pluginId\"]}`,\n adapter: \"\",\n exchange: \"\",\n duration: \"\",\n meta: \"\",\n };\n }\n\n // Error events\n if (\"error\" in d) {\n const err = d[\"error\"];\n const msg =\n typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: string }).message)\n : String(err);\n return {\n step: msg,\n adapter: \"\",\n exchange: \"\",\n duration: \"\",\n meta: \"\",\n };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function formatDetails(_eventName: string, raw: string): string {\n const parsed = parseEventDetail(raw);\n if (!parsed) {\n return raw.length > 100 ? raw.slice(0, 97) + \"...\" : raw;\n }\n\n // Non-columnar events (plugin, route lifecycle, error) have no exchange/duration\n if (!parsed.exchange && !parsed.duration && !parsed.adapter) {\n return parsed.step;\n }\n\n return [\n col(parsed.step, DET.COL1),\n col(parsed.adapter, DET.COL2),\n col(parsed.exchange, DET.EX),\n col(parsed.duration, DET.DUR),\n parsed.meta,\n ]\n .join(\" \")\n .trimEnd();\n}\n\n/**\n * Structured version of formatDetails that returns individual columns\n * so the component can control alignment per-column.\n */\nexport function formatDetailColumns(\n _eventName: string,\n raw: string,\n): DetailColumns {\n const parsed = parseEventDetail(raw);\n if (!parsed) {\n return { step: raw, adapter: \"\", exchange: \"\", duration: \"\", meta: \"\" };\n }\n return parsed;\n}\n\n/**\n * Render a single-line sparkline from an array of values.\n * Uses Unicode block characters (▁▂▃▄▅▆▇█).\n * Empty/zero-only input returns spaces of the same length.\n */\nexport function sparkline(values: number[]): string {\n if (values.length === 0) return \"\";\n const blocks = [\n \" \",\n \"\\u2581\",\n \"\\u2582\",\n \"\\u2583\",\n \"\\u2584\",\n \"\\u2585\",\n \"\\u2586\",\n \"\\u2587\",\n \"\\u2588\",\n ];\n const max = Math.max(...values, 1);\n return values\n .map((v) => {\n const idx = Math.max(0, Math.min(8, Math.round((v / max) * 8)));\n return blocks[Number.isFinite(idx) ? idx : 0];\n })\n .join(\"\");\n}\n\nexport function fmtNum(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\n/**\n * Adjust scroll offset so the selected item stays visible without centering.\n * The cursor moves freely within the visible window; the list only scrolls\n * when the cursor hits the top or bottom edge.\n *\n * @param selected - New selected index\n * @param currentOffset - Current scroll offset (tracked as state by the caller)\n * @param visibleRows - Number of rows visible in the list\n * @returns Updated scroll offset\n */\nexport function adjustScrollOffset(\n selected: number,\n currentOffset: number,\n visibleRows: number,\n): number {\n if (visibleRows <= 0) return currentOffset;\n if (selected < currentOffset) return selected;\n if (selected >= currentOffset + visibleRows)\n return selected - visibleRows + 1;\n return currentOffset;\n}\n","import { useState, useCallback } from \"react\";\nimport { adjustScrollOffset } from \"../utils.js\";\n\nexport interface ScrollListState {\n selectedIndex: number;\n scrollOffset: number;\n /** Move selection by delta (positive = down, negative = up). */\n moveBy: (delta: number, listLength: number, visibleRows: number) => void;\n /** Jump to an absolute index. */\n moveTo: (index: number, listLength: number, visibleRows: number) => void;\n /** Reset selection and scroll to the beginning. */\n reset: () => void;\n}\n\n/**\n * Manages a paired (selectedIndex, scrollOffset) state for scrollable lists.\n * Keeps the selected item visible without centering.\n *\n * `listLength` and `visibleRows` are passed at call time (not stored)\n * because they change every render (terminal resize, data load).\n */\nexport function useScrollList(initialIndex = 0): ScrollListState {\n const [selectedIndex, setSelectedIndex] = useState(initialIndex);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const moveTo = useCallback(\n (index: number, listLength: number, visibleRows: number) => {\n const clamped = Math.max(0, Math.min(index, listLength - 1));\n setSelectedIndex(clamped);\n setScrollOffset((off) => adjustScrollOffset(clamped, off, visibleRows));\n },\n [],\n );\n\n const moveBy = useCallback(\n (delta: number, listLength: number, visibleRows: number) => {\n setSelectedIndex((prev) => {\n const next = Math.max(0, Math.min(prev + delta, listLength - 1));\n setScrollOffset((off) => adjustScrollOffset(next, off, visibleRows));\n return next;\n });\n },\n [],\n );\n\n const reset = useCallback(() => {\n setSelectedIndex(0);\n setScrollOffset(0);\n }, []);\n\n return { selectedIndex, scrollOffset, moveBy, moveTo, reset };\n}\n","import type { ReactNode } from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport function Panel({\n title,\n subtitle,\n color = \"gray\",\n width,\n flexGrow,\n paddingX = 1,\n children,\n}: {\n title?: string;\n subtitle?: ReactNode;\n color?: string;\n width?: number;\n flexGrow?: number;\n paddingX?: number;\n children: ReactNode;\n}) {\n // Border adds 2 chars per side; padding adds paddingX per side\n const innerWidth = width ? width - 2 - paddingX * 2 : 20;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={color}\n paddingX={paddingX}\n width={width}\n flexGrow={flexGrow}\n >\n {title && (\n <>\n <Text bold>\n {title}\n {subtitle && <> {subtitle}</>}\n </Text>\n <Text dimColor>{\"\\u2500\".repeat(Math.max(innerWidth, 1))}</Text>\n </>\n )}\n {children}\n </Box>\n );\n}\n","import type { JSX } from \"react\";\nimport { Text } from \"ink\";\n\n/**\n * Braille layout: 1 bucket per character, both columns.\n *\n * Left Right\n * 0x01 0x08 sub-row 0 (top)\n * 0x02 0x10 sub-row 1\n * 0x04 0x20 sub-row 2\n * 0x40 0x80 sub-row 3 (bottom)\n *\n * Each terminal character represents 1 time bucket.\n * Both columns mirror the same data for btop-style dot density.\n * Each terminal row packs up to 4 step levels vertically.\n */\nconst BRAILLE_DOTS = [\n 0x40 | 0x80,\n 0x04 | 0x20,\n 0x02 | 0x10,\n 0x01 | 0x08,\n] as const; // bottom to top\nconst BRAILLE_BASE = 0x2800;\n\nexport interface DotStep {\n max: number;\n color: string;\n}\n\n/** Default 5-step config: gray baseline, green low, yellow mid, red high. */\nexport const DEFAULT_STEPS: DotStep[] = [\n { max: 0, color: \"gray\" },\n { max: 10, color: \"green\" },\n { max: 20, color: \"green\" },\n { max: 30, color: \"yellow\" },\n { max: 40, color: \"yellow\" },\n { max: 50, color: \"red\" },\n];\n\n/**\n * Stacked dot graph using braille characters.\n *\n * 1 bucket = 1 terminal character. Both braille columns mirror the same\n * data for btop-style dot density. Each character can stack up to 4 step\n * levels vertically.\n *\n * - 0 exchanges: gray baseline dot (bottom)\n * - 1-9 exchanges: green dot (bottom)\n * - 10-19 exchanges: two green dots stacked\n * - etc., stacking upward with per-level colors\n */\nexport function DotGraph({\n values,\n columns,\n steps = DEFAULT_STEPS,\n label,\n}: {\n values: number[];\n columns: number;\n steps?: DotStep[];\n label?: string;\n}) {\n const dotHeight = steps.length - 1;\n\n // Right-align: newest on right, pad left with zeros\n const data =\n values.length >= columns\n ? values.slice(values.length - columns)\n : [\n ...(new Array(columns - values.length).fill(0) as number[]),\n ...values,\n ];\n\n // Map each value to a step index (0 = baseline, 1..dotHeight)\n const heights = data.map((v) => {\n if (v <= 0) return 0;\n for (let i = 1; i < steps.length; i++) {\n if (v < steps[i]!.max) return i;\n }\n return dotHeight;\n });\n\n const termRows = Math.ceil(dotHeight / 4);\n\n // Build terminal rows from top to bottom\n const rows: JSX.Element[] = [];\n for (let tr = termRows - 1; tr >= 0; tr--) {\n const baseStep = tr * 4;\n\n // For each bucket, compute the braille bits and color for this terminal row\n const segments: { text: string; color: string }[] = [];\n\n for (let ci = 0; ci < data.length; ci++) {\n const h = heights[ci]!;\n let bits = 0;\n let color = \"\";\n\n for (let sr = 0; sr < 4; sr++) {\n const stepLevel = baseStep + sr + 1;\n if (stepLevel > dotHeight) break;\n\n // Show dot if height reaches this level, or baseline dot for zero values\n const on = h >= stepLevel || (h === 0 && stepLevel === 1);\n if (on) {\n bits |= BRAILLE_DOTS[sr]!;\n // Color: gray for baseline (zero), step color for data\n color = h === 0 ? steps[0]!.color : steps[stepLevel]!.color;\n }\n }\n\n const char = String.fromCharCode(BRAILLE_BASE + bits);\n const last = segments[segments.length - 1];\n if (last && last.color === color) {\n last.text += char;\n } else {\n segments.push({ text: char, color });\n }\n }\n\n rows.push(\n <Text key={tr}>\n {segments.map((s, i) =>\n s.color ? (\n <Text key={i} color={s.color}>\n {s.text}\n </Text>\n ) : (\n <Text key={i}>{s.text}</Text>\n ),\n )}\n </Text>,\n );\n }\n\n return (\n <>\n {rows}\n {label && <Text dimColor>{label}</Text>}\n </>\n );\n}\n","import { Text } from \"ink\";\nimport type { RouteSummary } from \"../types.js\";\nimport { statusColor, fmtNum, formatDuration } from \"../utils.js\";\n\nexport function RouteHeader({ route }: { route: RouteSummary }) {\n return (\n <>\n <Text>\n Capability:{\" \"}\n <Text bold color=\"cyan\">\n {route.id}\n </Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={statusColor(route.status)}>\n {route.status}\n </Text>\n {\" \"}Exchanges: <Text bold>{fmtNum(route.totalExchanges)}</Text>\n {\" \"}Errors:{\" \"}\n <Text\n bold\n {...(route.failedExchanges > 0 ? { color: \"red\" as const } : {})}\n >\n {fmtNum(route.failedExchanges)}\n </Text>\n {\" \"}Dropped:{\" \"}\n <Text\n bold\n {...(route.droppedExchanges > 0 ? { color: \"yellow\" as const } : {})}\n >\n {fmtNum(route.droppedExchanges)}\n </Text>\n {\" \"}Avg: <Text bold>{formatDuration(route.avgDurationMs)}</Text>\n </Text>\n </>\n );\n}\n","import { Fragment, type ReactNode } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { col } from \"../utils.js\";\n\nexport interface ColumnDef<T> {\n /** Header label */\n header: string;\n /** Fixed character width, or \"flex\" to fill remaining space */\n width: number | \"flex\";\n /** Text alignment. Default: \"left\" */\n align?: \"left\" | \"right\";\n /** Render cell content. `colWidth` is the resolved width for fixed columns, undefined for flex. */\n render: (\n row: T,\n selected: boolean,\n colWidth: number | undefined,\n ) => ReactNode;\n}\n\nexport interface TableProps<T> {\n columns: ColumnDef<T>[];\n data: T[];\n /** Unique key for each row */\n rowKey: (row: T, index: number) => string;\n /** Selected row index in full data array, or -1/undefined for no selection */\n selectedIndex?: number;\n /** First visible row (scroll offset) */\n scrollOffset: number;\n /** Number of visible rows */\n visibleRows: number;\n /** Gap between columns in characters. Default: 2 */\n gap?: number;\n /** Message when data is empty */\n emptyMessage?: string;\n /**\n * Optional full-row override for special rows (e.g., group headers).\n * Return undefined to use normal column rendering.\n */\n renderFullRow?: (row: T, index: number) => ReactNode | undefined;\n}\n\nexport function Table<T>({\n columns,\n data,\n rowKey,\n selectedIndex,\n scrollOffset,\n visibleRows,\n gap = 2,\n emptyMessage = \"No data\",\n renderFullRow,\n}: TableProps<T>) {\n const gapStr = \" \".repeat(gap);\n\n // Header\n const header = (\n <Box>\n {columns.map((c, ci) => {\n const isLast = ci === columns.length - 1;\n const after = isLast ? \"\" : gapStr;\n\n if (c.width === \"flex\") {\n return (\n <Fragment key={ci}>\n <Box flexGrow={1}>\n <Text bold dimColor>\n {c.header}\n </Text>\n </Box>\n {after && <Text>{after}</Text>}\n </Fragment>\n );\n }\n\n const text =\n c.align === \"right\"\n ? c.header.padStart(c.width)\n : col(c.header, c.width);\n\n return (\n <Fragment key={ci}>\n <Text bold dimColor>\n {text}\n </Text>\n {after && <Text>{after}</Text>}\n </Fragment>\n );\n })}\n </Box>\n );\n\n if (data.length === 0) {\n return (\n <>\n {header}\n <Text dimColor>{emptyMessage}</Text>\n </>\n );\n }\n\n const visible = data.slice(scrollOffset, scrollOffset + visibleRows);\n const remaining = data.length - scrollOffset - visibleRows;\n\n return (\n <>\n {header}\n {visible.map((row, vi) => {\n const dataIndex = scrollOffset + vi;\n const selected = dataIndex === selectedIndex;\n\n // Full-row override (e.g., group headers)\n const fullRow = renderFullRow?.(row, dataIndex);\n if (fullRow !== undefined) {\n return <Box key={rowKey(row, dataIndex)}>{fullRow}</Box>;\n }\n\n return (\n <Box key={rowKey(row, dataIndex)}>\n {columns.map((c, ci) => {\n const isLast = ci === columns.length - 1;\n const after = isLast ? \"\" : gapStr;\n const resolved = c.width === \"flex\" ? undefined : c.width;\n const cell = c.render(row, selected, resolved);\n\n if (c.width === \"flex\") {\n return (\n <Fragment key={ci}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate\">{cell}</Text>\n </Box>\n {after && <Text>{after}</Text>}\n </Fragment>\n );\n }\n\n return (\n <Fragment key={ci}>\n {cell}\n {after && <Text>{after}</Text>}\n </Fragment>\n );\n })}\n </Box>\n );\n })}\n <Text dimColor>{remaining > 0 ? \"\\u2193 more\" : \" \"}</Text>\n </>\n );\n}\n","import { Text } from \"ink\";\nimport type { EventRecord } from \"../types.js\";\nimport { col, formatDetailColumns, type DetailColumns } from \"../utils.js\";\nimport type { ColumnDef } from \"./table.js\";\n\n/**\n * Build the 4 standard event detail columns (Step, Adapter, Exchange, Duration).\n *\n * The accessor extracts an EventRecord from whatever row type T the table uses.\n * Returns undefined when the row has no event data (e.g., group headers).\n *\n * JSON is parsed once per row and shared across all 4 columns via a WeakMap cache.\n */\nexport function eventDetailColumns<T>(\n accessor: (row: T) => EventRecord | undefined,\n): ColumnDef<T>[] {\n const cache = new WeakMap<EventRecord, DetailColumns>();\n\n function getColumns(row: T): DetailColumns | undefined {\n const ev = accessor(row);\n if (!ev) return undefined;\n let cols = cache.get(ev);\n if (!cols) {\n cols = formatDetailColumns(ev.eventName, ev.details);\n cache.set(ev, cols);\n }\n return cols;\n }\n\n return [\n {\n header: \"Step\",\n width: 10,\n render: (row, _sel, w) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{col(\"\", w)}</Text>;\n return <Text>{col(cols.step, w)}</Text>;\n },\n },\n {\n header: \"Adapter\",\n width: 10,\n render: (row, _sel, w) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{col(\"\", w)}</Text>;\n return <Text>{col(cols.adapter, w)}</Text>;\n },\n },\n {\n header: \"Exchange\",\n width: 12,\n render: (row, _sel, w) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{col(\"\", w)}</Text>;\n return <Text>{col(cols.exchange, w)}</Text>;\n },\n },\n {\n header: \"Duration\",\n width: 8,\n align: \"right\" as const,\n render: (row) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{\"\"}</Text>;\n return <Text>{cols.duration.padStart(8)}</Text>;\n },\n },\n ];\n}\n\n/**\n * Selector column that shows \"> \" for the selected row.\n */\nexport function selectorColumn<T>(): ColumnDef<T> {\n return {\n header: \"\",\n width: 2,\n render: (_row, selected) => (\n <Text {...(selected ? { color: \"cyan\" as const } : {})} bold={selected}>\n {selected ? \"> \" : \" \"}\n </Text>\n ),\n };\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, RouteSummary, RouteActivity } from \"../types.js\";\nimport { statusColor, formatDuration, col } from \"../utils.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { Panel } from \"./panel.js\";\nimport { RouteHeader } from \"./route-header.js\";\nimport { DotGraph, DEFAULT_STEPS } from \"./dot-graph.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn } from \"./event-columns.js\";\n\nconst exchangeColumns: ColumnDef<ExchangeRecord>[] = [\n selectorColumn<ExchangeRecord>(),\n {\n header: \"ID\",\n width: \"flex\",\n render: (row, selected) => (\n <Text {...(selected ? { color: \"cyan\" as const } : {})} bold={selected}>\n {row.id}\n </Text>\n ),\n },\n {\n header: \"Status\",\n width: 9,\n render: (row, _sel, w) => (\n <Text color={statusColor(row.status)}>{col(row.status, w)}</Text>\n ),\n },\n {\n header: \"Duration\",\n width: 8,\n align: \"right\",\n render: (row) => <Text>{formatDuration(row.durationMs).padStart(8)}</Text>,\n },\n {\n header: \"Time\",\n width: 8,\n render: (row, _sel, w) => (\n <Text dimColor>\n {col(row.startedAt.replace(\"T\", \" \").slice(11, 19), w)}\n </Text>\n ),\n },\n];\n\nexport function CenterExchangeList({\n capabilityId,\n route,\n exchanges,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color = \"gray\",\n activity,\n}: {\n capabilityId: string;\n route?: RouteSummary;\n exchanges: ExchangeRecord[];\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n activity?: RouteActivity | undefined;\n}) {\n const graphTermRows = Math.ceil((DEFAULT_STEPS.length - 1) / 4);\n const headerRows = route ? 2 + graphTermRows + 2 : 0;\n const tableRows = Math.max(height - PANEL_TABLE_CHROME - headerRows, 3);\n\n const title = route ? \"EXCHANGES\" : `EXCHANGES: ${capabilityId}`;\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n {route && (\n <Panel width={width}>\n <RouteHeader route={route} />\n <Text> </Text>\n <DotGraph\n values={activity ? activity.throughput : []}\n columns={width - 4}\n label=\"Exchanges per 5s bucket\"\n />\n </Panel>\n )}\n <Panel title={title} width={width} flexGrow={1} color={color}>\n <Table\n columns={exchangeColumns}\n data={exchanges}\n rowKey={(ex) => ex.id + ex.contextId}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No exchanges\"\n />\n </Panel>\n </Box>\n );\n}\n","import { Text } from \"ink\";\n\n/** Token types for JSON syntax coloring. */\nexport type TokenType =\n | \"key\"\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"null\"\n | \"brace\";\n\nexport interface JsonToken {\n text: string;\n type: TokenType;\n}\n\n/**\n * Tokenize a single line of pretty-printed JSON into colored segments.\n * Handles: keys, string values, numbers, booleans, null, and structural chars.\n */\nexport function tokenizeLine(line: string): JsonToken[] {\n const tokens: JsonToken[] = [];\n const re =\n /(\"(?:[^\"\\\\]|\\\\.)*\")\\s*:|(\"(?:[^\"\\\\]|\\\\.)*\")|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b)|(\\bnull\\b)|([{}[\\],:])/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(line)) !== null) {\n // Plain text before this match (whitespace / indent)\n if (match.index > lastIndex) {\n tokens.push({ text: line.slice(lastIndex, match.index), type: \"brace\" });\n }\n\n if (match[1] !== undefined) {\n // Key (the colon is part of the regex but we split it out)\n tokens.push({ text: match[1], type: \"key\" });\n tokens.push({ text: \":\", type: \"brace\" });\n } else if (match[2] !== undefined) {\n tokens.push({ text: match[2], type: \"string\" });\n } else if (match[3] !== undefined) {\n tokens.push({ text: match[3], type: \"number\" });\n } else if (match[4] !== undefined) {\n tokens.push({ text: match[4], type: \"boolean\" });\n } else if (match[5] !== undefined) {\n tokens.push({ text: match[5], type: \"null\" });\n } else if (match[6] !== undefined) {\n tokens.push({ text: match[6], type: \"brace\" });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Trailing text\n if (lastIndex < line.length) {\n tokens.push({ text: line.slice(lastIndex), type: \"brace\" });\n }\n\n return tokens;\n}\n\nexport const TOKEN_COLORS: Record<TokenType, string> = {\n key: \"cyan\",\n string: \"green\",\n number: \"yellow\",\n boolean: \"yellow\",\n null: \"red\",\n brace: \"gray\",\n};\n\n/**\n * Parse a JSON string into pretty-printed lines, truncating long lines.\n */\nexport function formatJson(raw: string, maxWidth: number): string[] {\n try {\n const parsed = JSON.parse(raw) as unknown;\n const pretty = JSON.stringify(parsed, null, 2);\n return pretty.split(\"\\n\").map((line) => {\n const clampedMax = Math.max(1, maxWidth);\n return line.length > clampedMax\n ? line.slice(0, Math.max(0, clampedMax - 1)) + \"\\u2026\"\n : line;\n });\n } catch {\n const clampedMax = Math.max(1, maxWidth);\n return raw\n .split(\"\\n\")\n .map((line) =>\n line.length > clampedMax\n ? line.slice(0, Math.max(0, clampedMax - 1)) + \"\\u2026\"\n : line,\n );\n }\n}\n\n/**\n * Render a single line of JSON with syntax coloring.\n */\nexport function ColoredJsonLine({ line }: { line: string }) {\n const tokens = tokenizeLine(line);\n if (tokens.length === 0) return <Text>{line}</Text>;\n return (\n <Text>\n {tokens.map((token, i) => (\n <Text key={i} color={TOKEN_COLORS[token.type]}>\n {token.text}\n </Text>\n ))}\n </Text>\n );\n}\n\n/**\n * Safely parse a JSON details string.\n */\nexport function parseDetails(raw: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n return null;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, EventRecord } from \"../types.js\";\nimport { statusColor, formatDuration, col, truncate } from \"../utils.js\";\nimport { DETAIL_INFO_CHROME } from \"../layout.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn, eventDetailColumns } from \"./event-columns.js\";\nimport { parseDetails } from \"./json-format.js\";\n\ntype DisplayRow = {\n type: \"header\" | \"event\";\n text?: string;\n event?: EventRecord;\n indent: number;\n};\n\n/**\n * Group events by exchangeId to show parent/child flow.\n */\nfunction groupEventsByExchange(\n events: EventRecord[],\n parentExchangeId: string,\n): { exchangeId: string; label: string; events: EventRecord[] }[] {\n const groups = new Map<\n string,\n { exchangeId: string; label: string; events: EventRecord[] }\n >();\n let childIndex = 0;\n\n groups.set(parentExchangeId, {\n exchangeId: parentExchangeId,\n label: \"parent\",\n events: [],\n });\n\n for (const ev of events) {\n const d = parseDetails(ev.details);\n const exId = d ? String(d[\"exchangeId\"] ?? \"\") : \"\";\n const key = !exId || exId === parentExchangeId ? parentExchangeId : exId;\n\n if (!groups.has(key)) {\n childIndex++;\n groups.set(key, {\n exchangeId: key,\n label: `child ${childIndex}`,\n events: [],\n });\n }\n groups.get(key)!.events.push(ev);\n }\n\n return Array.from(groups.values());\n}\n\nconst detailColumns: ColumnDef<DisplayRow>[] = [\n selectorColumn<DisplayRow>(),\n {\n header: \"Time\",\n width: 8,\n render: (row, _sel, w) => {\n if (!row.event) return <Text>{col(\"\", w)}</Text>;\n const indent = \" \".repeat(row.indent);\n return (\n <Text dimColor>\n {indent}\n {row.event.timestamp.replace(\"T\", \" \").slice(11, 19)}\n </Text>\n );\n },\n },\n {\n header: \"Event\",\n width: \"flex\",\n render: (row) => {\n if (!row.event) return <Text />;\n return <Text color=\"cyan\">{row.event.eventName}</Text>;\n },\n },\n ...eventDetailColumns<DisplayRow>((row) => row.event),\n];\n\nexport function CenterExchangeDetail({\n exchange,\n events,\n width,\n height,\n scrollOffset,\n selectedIndex = -1,\n color = \"gray\",\n}: {\n exchange: ExchangeRecord;\n events: EventRecord[];\n width: number;\n height: number;\n scrollOffset: number;\n selectedIndex?: number;\n color?: string;\n}) {\n const hasExtra = exchange.error ? 2 : 0;\n const eventRows = Math.max(height - DETAIL_INFO_CHROME - hasExtra, 3);\n\n const groups = groupEventsByExchange(events, exchange.id);\n const hasChildren = groups.length > 1;\n\n const displayRows: DisplayRow[] = [];\n for (const group of groups) {\n if (hasChildren) {\n displayRows.push({\n type: \"header\",\n text: `${group.label} (${group.exchangeId.slice(0, 8)}) - ${group.events.length} events`,\n indent: 0,\n });\n }\n for (const ev of group.events) {\n displayRows.push({\n type: \"event\",\n event: ev,\n indent: hasChildren ? 2 : 0,\n });\n }\n }\n\n const eventsTitle = hasChildren\n ? `EXCHANGE FLOW (${groups.length} exchanges, ${events.length} events)`\n : `RELATED EVENTS (${events.length})`;\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Capability:{\" \"}\n <Text bold color=\"cyan\">\n {exchange.routeId}\n </Text>\n </Text>\n <Text>\n Exchange:{\" \"}\n <Text bold color=\"cyan\">\n {truncate(exchange.id, width - 14)}\n </Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={statusColor(exchange.status)}>\n {exchange.status}\n </Text>\n {exchange.durationMs !== null && (\n <Text>\n {\" \"}Duration:{\" \"}\n <Text bold>{formatDuration(exchange.durationMs)}</Text>\n </Text>\n )}\n {\" \"}Started: <Text bold>{exchange.startedAt}</Text>\n {exchange.completedAt && (\n <Text>\n {\" \"}Completed: <Text bold>{exchange.completedAt}</Text>\n </Text>\n )}\n </Text>\n {exchange.error && exchange.status === \"failed\" && (\n <>\n <Text> </Text>\n <Text color=\"red\">Error: {exchange.error}</Text>\n </>\n )}\n {exchange.error && exchange.status === \"dropped\" && (\n <>\n <Text> </Text>\n <Text color=\"yellow\">Reason: {exchange.error}</Text>\n </>\n )}\n </Panel>\n\n <Panel title={eventsTitle} width={width} flexGrow={1} color={color}>\n <Table\n columns={detailColumns}\n data={displayRows}\n rowKey={(row, i) =>\n row.type === \"header\"\n ? `h-${i}`\n : `${row.event?.id ?? row.event?.timestamp}-${i}`\n }\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={eventRows}\n emptyMessage=\"No related events found\"\n renderFullRow={(row) =>\n row.type === \"header\" ? (\n <Text bold color=\"yellow\">\n {row.text}\n </Text>\n ) : undefined\n }\n />\n </Panel>\n </Box>\n );\n}\n","import { Text } from \"ink\";\nimport type { EventRecord } from \"../types.js\";\nimport { col } from \"../utils.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn, eventDetailColumns } from \"./event-columns.js\";\n\nconst eventColumns: ColumnDef<EventRecord>[] = [\n selectorColumn<EventRecord>(),\n {\n header: \"Time\",\n width: 19,\n render: (row, selected, w) => (\n <Text {...(selected ? { color: \"cyan\" as const } : {})} bold={selected}>\n {col(row.timestamp.replace(\"T\", \" \").slice(0, 19), w)}\n </Text>\n ),\n },\n {\n header: \"Event\",\n width: \"flex\",\n render: (row) => <Text color=\"cyan\">{row.eventName}</Text>,\n },\n ...eventDetailColumns<EventRecord>((row) => row),\n];\n\nexport function EventsView({\n events,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color = \"gray\",\n}: {\n events: EventRecord[];\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n}) {\n const tableRows = Math.max(height - PANEL_TABLE_CHROME, 5);\n\n return (\n <Panel\n title=\"EVENTS\"\n subtitle={<Text dimColor>({events.length} total)</Text>}\n width={width}\n flexGrow={1}\n color={color}\n >\n <Table\n columns={eventColumns}\n data={events}\n rowKey={(ev, i) =>\n ev.id !== undefined ? String(ev.id) : `${ev.timestamp}-${i}`\n }\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No events recorded yet.\"\n />\n </Panel>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { EventRecord } from \"../types.js\";\nimport { Panel } from \"./panel.js\";\nimport { formatJson, ColoredJsonLine, parseDetails } from \"./json-format.js\";\n\nexport function EventDetail({\n event,\n width,\n height,\n scrollOffset,\n color = \"cyan\",\n}: {\n event: EventRecord;\n width: number;\n height: number;\n scrollOffset: number;\n color?: string;\n}) {\n const d = parseDetails(event.details);\n const routeId =\n d && typeof d[\"routeId\"] === \"string\" ? d[\"routeId\"] : undefined;\n const exchangeId =\n d && typeof d[\"exchangeId\"] === \"string\" ? d[\"exchangeId\"] : undefined;\n\n // Header lines: context (always) + capability + exchange + event + time\n const headerLines = 1 + (routeId ? 1 : 0) + (exchangeId ? 1 : 0) + 2;\n // Top panel: border (2) + content lines\n const headerHeight = 2 + headerLines;\n // Bottom panel: border (2) + title/separator (2) + footer (1) = 5\n const jsonChrome = 5;\n const jsonWidth = Math.max(width - 6, 20);\n const jsonLines = formatJson(event.details, jsonWidth);\n const visibleRows = Math.max(height - headerHeight - jsonChrome, 3);\n const visible = jsonLines.slice(scrollOffset, scrollOffset + visibleRows);\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Context:{\" \"}\n <Text bold color=\"cyan\">\n {event.contextId}\n </Text>\n </Text>\n {routeId && (\n <Text>\n Capability:{\" \"}\n <Text bold color=\"cyan\">\n {routeId}\n </Text>\n </Text>\n )}\n {exchangeId && (\n <Text>\n Exchange:{\" \"}\n <Text bold color=\"cyan\">\n {exchangeId}\n </Text>\n </Text>\n )}\n <Text>\n Event:{\" \"}\n <Text bold color=\"cyan\">\n {event.eventName}\n </Text>\n </Text>\n <Text>\n Time: <Text bold>{event.timestamp.replace(\"T\", \" \")}</Text>\n </Text>\n </Panel>\n\n <Panel\n title=\"DETAILS\"\n subtitle={\n <Text dimColor>\n ({scrollOffset + 1}-\n {Math.min(scrollOffset + visibleRows, jsonLines.length)}/\n {jsonLines.length} lines)\n </Text>\n }\n width={width}\n flexGrow={1}\n color={color}\n >\n {visible.map((line, i) => (\n <ColoredJsonLine key={scrollOffset + i} line={line} />\n ))}\n {visible.length < visibleRows &&\n Array.from({ length: visibleRows - visible.length }).map((_, i) => (\n <Text key={`pad-${i}`}> </Text>\n ))}\n </Panel>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, ExchangeSnapshot } from \"../types.js\";\nimport { statusColor, formatDuration, truncate } from \"../utils.js\";\nimport { Panel } from \"./panel.js\";\nimport { formatJson, ColoredJsonLine } from \"./json-format.js\";\n\n/**\n * Build the scrollable lines for the deep view: headers + body sections.\n */\nfunction buildSnapshotLines(\n snapshot: ExchangeSnapshot,\n maxWidth: number,\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"HEADERS\");\n lines.push(...formatJson(snapshot.headers, maxWidth));\n lines.push(\"\");\n lines.push(\"BODY\");\n if (snapshot.body !== null) {\n lines.push(...formatJson(snapshot.body, maxWidth));\n if (snapshot.truncated) {\n lines.push(\"\");\n lines.push(\"[Body truncated to configured limit]\");\n }\n } else {\n lines.push(\"[null]\");\n }\n\n return lines;\n}\n\nexport function ExchangeDeepView({\n exchange,\n snapshot,\n width,\n height,\n scrollOffset,\n color = \"cyan\",\n}: {\n exchange: ExchangeRecord;\n snapshot: ExchangeSnapshot | null;\n width: number;\n height: number;\n scrollOffset: number;\n color?: string;\n}) {\n // Header panel: border (2) + content (3 lines: capability + exchange + status)\n const headerHeight = 5;\n // JSON panel chrome: border (2) + title (1) + separator (1) + footer (1)\n const jsonChrome = 5;\n const jsonWidth = Math.max(width - 6, 20);\n const visibleRows = Math.max(height - headerHeight - jsonChrome, 3);\n\n const hasSnapshot = snapshot !== null;\n const jsonLines = hasSnapshot\n ? buildSnapshotLines(snapshot, jsonWidth)\n : [\n \"[Snapshots not captured]\",\n \"\",\n \"Enable with:\",\n \" telemetry({ sqlite: { captureSnapshots: true } })\",\n ];\n\n const visible = jsonLines.slice(scrollOffset, scrollOffset + visibleRows);\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Capability:{\" \"}\n <Text bold color=\"cyan\">\n {exchange.routeId}\n </Text>\n </Text>\n <Text>\n Exchange:{\" \"}\n <Text bold color=\"cyan\">\n {truncate(exchange.id, width - 14)}\n </Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={statusColor(exchange.status)}>\n {exchange.status}\n </Text>\n {exchange.durationMs !== null && (\n <Text>\n {\" \"}Duration:{\" \"}\n <Text bold>{formatDuration(exchange.durationMs)}</Text>\n </Text>\n )}\n </Text>\n </Panel>\n\n <Panel\n title=\"EXCHANGE SNAPSHOT\"\n subtitle={\n <Text dimColor>\n ({scrollOffset + 1}-\n {Math.min(scrollOffset + visibleRows, jsonLines.length)}/\n {jsonLines.length} lines)\n </Text>\n }\n width={width}\n flexGrow={1}\n color={color}\n >\n {visible.map((line, i) => {\n if (line === \"HEADERS\" || line === \"BODY\") {\n return (\n <Text key={scrollOffset + i} bold color=\"yellow\">\n {line}\n </Text>\n );\n }\n if (line.startsWith(\"[\")) {\n return (\n <Text key={scrollOffset + i} dimColor>\n {line}\n </Text>\n );\n }\n return <ColoredJsonLine key={scrollOffset + i} line={line} />;\n })}\n {visible.length < visibleRows &&\n Array.from({ length: visibleRows - visible.length }).map((_, i) => (\n <Text key={`pad-${i}`}> </Text>\n ))}\n </Panel>\n </Box>\n );\n}\n","import { Text } from \"ink\";\nimport type { RouteSummary } from \"../types.js\";\nimport { truncate } from \"../utils.js\";\n\nfunction dotColor(route: RouteSummary): string {\n if (route.failedExchanges > 0) return \"red\";\n if (route.totalExchanges > 0) return \"green\";\n return \"yellow\";\n}\n\nexport function CapabilityList({\n routes,\n selectedIndex,\n listOffset,\n visibleRows,\n width,\n}: {\n routes: RouteSummary[];\n selectedIndex: number;\n listOffset: number;\n visibleRows: number;\n width: number;\n}) {\n const offset = listOffset;\n\n return (\n <>\n <Text> </Text>\n <Text bold dimColor>\n {\"\\u2500\".repeat(width + 2)}\n </Text>\n {routes.length === 0 ? (\n <Text dimColor>No capabilities</Text>\n ) : (\n routes.slice(offset, offset + visibleRows).map((route, vi) => {\n const i = offset + vi;\n return (\n <Text key={route.id} wrap=\"truncate\">\n <Text\n {...(i === selectedIndex ? { color: \"cyan\" as const } : {})}\n bold={i === selectedIndex}\n >\n {i === selectedIndex ? \"> \" : \" \"}\n </Text>\n <Text color={dotColor(route)}>{\"\\u25CF \"}</Text>\n <Text\n {...(i === selectedIndex ? { color: \"cyan\" as const } : {})}\n bold={i === selectedIndex}\n >\n {truncate(route.id, width - 2)}\n </Text>\n </Text>\n );\n })\n )}\n {routes.length > visibleRows && (\n <Text dimColor>\n {selectedIndex + 1}/{routes.length}\n </Text>\n )}\n </>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { render, Box, Text, useInput, useApp, useStdout } from \"ink\";\nimport { TelemetryDb } from \"./db.js\";\nimport type {\n NavItem,\n RouteSummary,\n ExchangeRecord,\n ExchangeSnapshot,\n EventRecord,\n Metrics,\n RouteActivity,\n} from \"./types.js\";\nimport { NAV_SECTIONS, ALL_NAV_ITEMS } from \"./types.js\";\nimport { fmtNum, formatDuration } from \"./utils.js\";\nimport { useScrollList } from \"./hooks/use-scroll-list.js\";\nimport { PANEL_TABLE_CHROME, DETAIL_INFO_CHROME, NAV_JUMP } from \"./layout.js\";\nimport { Panel } from \"./components/panel.js\";\nimport { DotGraph, DEFAULT_STEPS } from \"./components/dot-graph.js\";\nimport { CenterExchangeList } from \"./components/center-exchange-list.js\";\nimport { CenterExchangeDetail } from \"./components/center-exchange-detail.js\";\nimport { EventsView } from \"./components/events-view.js\";\nimport { EventDetail } from \"./components/event-detail.js\";\nimport { ExchangeDeepView } from \"./components/exchange-deep-view.js\";\nimport { CapabilityList } from \"./components/capability-list.js\";\nimport { version } from \"../../package.json\";\n\n/**\n * Focus tracks which panel owns the cursor.\n * - \"nav\": left panel (route list / nav items)\n * - \"center\": center panel (exchange list, events, detail)\n */\ntype Focus = \"nav\" | \"center\";\n\nfunction App({ db }: { db: TelemetryDb }) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const width = stdout?.columns ?? 80;\n const height = stdout?.rows ?? 24;\n\n const [activeNav, setActiveNav] = useState<NavItem>(\"capabilities\");\n const [focus, setFocus] = useState<Focus>(\"nav\");\n const [showDetail, setShowDetail] = useState(false);\n\n const [routes, setRoutes] = useState<RouteSummary[]>([]);\n const [metrics, setMetrics] = useState<Metrics>({\n totalRoutes: 0,\n totalExchanges: 0,\n completedExchanges: 0,\n failedExchanges: 0,\n droppedExchanges: 0,\n errorRate: 0,\n avgDurationMs: null,\n p90DurationMs: null,\n p95DurationMs: null,\n p99DurationMs: null,\n });\n const [liveTraffic, setLiveTraffic] = useState<number[]>([]);\n const [selectedRouteActivity, setSelectedRouteActivity] = useState<\n RouteActivity | undefined\n >(undefined);\n const routeScroll = useScrollList();\n const [exchanges, setExchanges] = useState<ExchangeRecord[]>([]);\n const exchangeScroll = useScrollList();\n const [selectedExchange, setSelectedExchange] = useState<\n ExchangeRecord | undefined\n >(undefined);\n const [exchangeEvents, setExchangeEvents] = useState<EventRecord[]>([]);\n const [events, setEvents] = useState<EventRecord[]>([]);\n const eventScroll = useScrollList();\n const detailScroll = useScrollList();\n const [selectedEvent, setSelectedEvent] = useState<EventRecord | undefined>(\n undefined,\n );\n const [showEventDetail, setShowEventDetail] = useState(false);\n const [eventDetailScroll, setEventDetailScroll] = useState(0);\n const [showDeepView, setShowDeepView] = useState(false);\n const [deepViewScroll, setDeepViewScroll] = useState(0);\n const [exchangeSnapshot, setExchangeSnapshot] =\n useState<ExchangeSnapshot | null>(null);\n const PAGE_SIZE = 50;\n const JUMP = NAV_JUMP;\n\n // Layout dimensions (needed by both refresh and render)\n const leftWidth = Math.max(Math.min(Math.floor(width * 0.18), 26), 16);\n const rightWidth = Math.max(Math.min(Math.floor(width * 0.22), 30), 20);\n const centerWidth = Math.max(width - leftWidth - rightWidth, 30);\n const bodyHeight = Math.max(height - 5, 10);\n const navHeaderRows = 10;\n const navListHeight = Math.max(bodyHeight - navHeaderRows, 3);\n\n const refresh = useCallback(() => {\n try {\n // Always refresh: routes, metrics, graphs\n const routeSummary = db.getRouteSummary();\n setRoutes(routeSummary);\n setMetrics(db.getMetrics());\n const liveCols = rightWidth - 4;\n setLiveTraffic(db.getLiveTrafficBuckets(liveCols, 5));\n\n // Only load activity for the currently selected route\n const routeCols = centerWidth - 4;\n const curRoute = routeSummary[routeScroll.selectedIndex];\n if (curRoute) {\n setSelectedRouteActivity(\n db.getSingleRouteActivity(curRoute.id, routeCols, 5),\n );\n }\n\n // Skip list refresh when cursor is active (user is browsing)\n if (focus === \"center\") return;\n\n if (activeNav === \"capabilities\") {\n const route = routeSummary[routeScroll.selectedIndex];\n if (route) {\n setExchanges(db.getExchangesByRoute(route.id, PAGE_SIZE));\n }\n } else if (activeNav === \"exchanges\") {\n setExchanges(db.getAllExchanges(PAGE_SIZE));\n } else if (activeNav === \"errors\") {\n setExchanges(db.getFailedExchanges(PAGE_SIZE));\n } else if (activeNav === \"events\") {\n setEvents(db.getRecentEvents({ limit: 200 }));\n }\n } catch {\n // Database may be temporarily locked\n }\n }, [\n db,\n activeNav,\n routeScroll.selectedIndex,\n rightWidth,\n centerWidth,\n focus,\n ]);\n\n useEffect(() => {\n refresh();\n const timer = setInterval(refresh, 2000);\n return () => {\n clearInterval(timer);\n };\n }, [refresh]);\n\n const selectRoute = useCallback(\n (index: number) => {\n routeScroll.moveTo(index, routes.length, navListHeight);\n exchangeScroll.reset();\n const route = routes[index];\n if (route) {\n setExchanges(db.getExchangesByRoute(route.id, PAGE_SIZE));\n }\n },\n [db, routes, routeScroll, exchangeScroll, navListHeight],\n );\n\n const switchNav = useCallback(\n (nav: NavItem) => {\n setActiveNav(nav);\n setShowDetail(false);\n setShowEventDetail(false);\n setShowDeepView(false);\n setFocus(\"nav\");\n exchangeScroll.reset();\n if (nav === \"exchanges\") {\n setExchanges(db.getAllExchanges(PAGE_SIZE));\n } else if (nav === \"errors\") {\n setExchanges(db.getFailedExchanges(PAGE_SIZE));\n } else if (nav === \"events\") {\n eventScroll.reset();\n setEvents(db.getRecentEvents({ limit: 200 }));\n }\n },\n [db, exchangeScroll, eventScroll],\n );\n\n const selectedRoute = routes[routeScroll.selectedIndex];\n\n // Visible row counts mirror the view components\n // Must match CenterExchangeList: 2 (capability + stats) + graphTermRows + 2 (label + spacer)\n const graphTermRows = Math.ceil((DEFAULT_STEPS.length - 1) / 4);\n const exchangeHeaderRows = selectedRoute ? 2 + graphTermRows + 2 : 0;\n const exchangeTableRows = Math.max(\n bodyHeight - PANEL_TABLE_CHROME - exchangeHeaderRows,\n 3,\n );\n const eventsTableRows = Math.max(bodyHeight - PANEL_TABLE_CHROME, 5);\n\n useInput((input, key) => {\n if (input === \"q\") {\n db.close();\n exit();\n return;\n }\n\n // Number shortcuts to switch nav (always available)\n const navByShortcut = ALL_NAV_ITEMS.find((n) => n.shortcut === input);\n if (navByShortcut) {\n switchNav(navByShortcut.key);\n return;\n }\n\n // Events view: overview -> browse -> detail\n if (activeNav === \"events\") {\n if (showEventDetail) {\n // Detail view: scroll JSON, Esc to go back to list\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n setEventDetailScroll((i) => i + step);\n } else if (input === \"k\" || key.upArrow) {\n setEventDetailScroll((i) => Math.max(i - step, 0));\n } else if (key.escape || key.backspace || key.delete) {\n setShowEventDetail(false);\n setEventDetailScroll(0);\n }\n return;\n }\n if (focus === \"nav\") {\n if (key.return) {\n setFocus(\"center\");\n }\n } else {\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n eventScroll.moveBy(step, events.length, eventsTableRows);\n } else if (input === \"k\" || key.upArrow) {\n eventScroll.moveBy(-step, events.length, eventsTableRows);\n } else if (key.return) {\n const ev = events[eventScroll.selectedIndex];\n if (ev) {\n setSelectedEvent(ev);\n setEventDetailScroll(0);\n setShowEventDetail(true);\n }\n } else if (key.escape || key.backspace || key.delete) {\n setFocus(\"nav\");\n eventScroll.reset();\n }\n }\n return;\n }\n\n // Exchange deep view: scrollable JSON of headers + body\n if (showDeepView) {\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n setDeepViewScroll((i) => i + step);\n } else if (input === \"k\" || key.upArrow) {\n setDeepViewScroll((i) => Math.max(i - step, 0));\n } else if (key.escape || key.backspace || key.delete) {\n setShowDeepView(false);\n setDeepViewScroll(0);\n }\n return;\n }\n\n // Exchange detail (any nav)\n if (showDetail && !showEventDetail) {\n const hasExtra = selectedExchange?.error ? 2 : 0;\n const detailEventRows = Math.max(\n bodyHeight - DETAIL_INFO_CHROME - hasExtra,\n 3,\n );\n // Count group headers: when events span multiple exchanges, each group gets a header row\n const uniqueExchangeIds = new Set(\n exchangeEvents.map((ev) => {\n try {\n const d = JSON.parse(ev.details) as Record<string, unknown>;\n return String(d[\"exchangeId\"] ?? \"\");\n } catch {\n return \"\";\n }\n }),\n );\n const groupCount = Math.max(uniqueExchangeIds.size, 1);\n const headerRows = groupCount > 1 ? groupCount : 0;\n const totalDisplayRows = exchangeEvents.length + headerRows;\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n detailScroll.moveBy(step, totalDisplayRows, detailEventRows);\n } else if (input === \"k\" || key.upArrow) {\n detailScroll.moveBy(-step, totalDisplayRows, detailEventRows);\n } else if (key.return) {\n // Resolve the selected display row to an EventRecord (skip headers)\n // Build the same display row list the component builds\n let rowIndex = 0;\n let targetEvent: EventRecord | undefined;\n const parentId = selectedExchange?.id ?? \"\";\n const groups = new Map<string, EventRecord[]>();\n groups.set(parentId, []);\n for (const ev of exchangeEvents) {\n try {\n const d = JSON.parse(ev.details) as Record<string, unknown>;\n const exId = String(d[\"exchangeId\"] ?? \"\");\n const gKey = !exId || exId === parentId ? parentId : exId;\n if (!groups.has(gKey)) groups.set(gKey, []);\n groups.get(gKey)!.push(ev);\n } catch {\n groups.get(parentId)!.push(ev);\n }\n }\n const hasChildren = groups.size > 1;\n for (const [, groupEvents] of groups) {\n if (hasChildren) rowIndex++; // header row\n for (const ev of groupEvents) {\n if (rowIndex === detailScroll.selectedIndex) {\n targetEvent = ev;\n }\n rowIndex++;\n }\n }\n if (targetEvent) {\n setSelectedEvent(targetEvent);\n setEventDetailScroll(0);\n setShowEventDetail(true);\n }\n } else if (input === \"e\" && selectedExchange) {\n const snapshot = db.getExchangeSnapshot(selectedExchange.id);\n setExchangeSnapshot(snapshot);\n setDeepViewScroll(0);\n setShowDeepView(true);\n } else if (key.escape || key.backspace || key.delete) {\n detailScroll.reset();\n setShowDetail(false);\n }\n return;\n }\n\n // Event detail from exchange detail: Esc goes back to exchange detail\n if (showDetail && showEventDetail) {\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n setEventDetailScroll((i) => i + step);\n } else if (input === \"k\" || key.upArrow) {\n setEventDetailScroll((i) => Math.max(i - step, 0));\n } else if (key.escape || key.backspace || key.delete) {\n setShowEventDetail(false);\n setEventDetailScroll(0);\n }\n return;\n }\n\n // Capabilities: nav focus (left panel)\n if (activeNav === \"capabilities\" && focus === \"nav\") {\n if (input === \"j\" || key.downArrow) {\n selectRoute(Math.min(routeScroll.selectedIndex + 1, routes.length - 1));\n } else if (input === \"k\" || key.upArrow) {\n selectRoute(Math.max(routeScroll.selectedIndex - 1, 0));\n } else if (key.return) {\n setFocus(\"center\");\n // Load all exchanges for browsing (auto-refresh uses PAGE_SIZE)\n const route = routes[routeScroll.selectedIndex];\n if (route) {\n setExchanges(db.getExchangesByRoute(route.id));\n }\n }\n return;\n }\n\n // Capabilities: center focus (exchange list)\n if (activeNav === \"capabilities\" && focus === \"center\") {\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n exchangeScroll.moveBy(step, exchanges.length, exchangeTableRows);\n } else if (input === \"k\" || key.upArrow) {\n exchangeScroll.moveBy(-step, exchanges.length, exchangeTableRows);\n } else if (key.return) {\n const ex = exchanges[exchangeScroll.selectedIndex];\n if (ex) {\n setSelectedExchange(ex);\n setExchangeEvents(db.getEventsByExchange(ex.id, ex.correlationId));\n detailScroll.reset();\n setShowEventDetail(false);\n setShowDetail(true);\n }\n } else if (key.escape || key.backspace || key.delete) {\n setFocus(\"nav\");\n exchangeScroll.reset();\n }\n return;\n }\n\n // Exchanges / Errors: overview (nav focus) or browsing (center focus)\n if (activeNav === \"exchanges\" || activeNav === \"errors\") {\n if (focus === \"nav\") {\n // Overview mode: Enter to freeze and browse\n if (key.return) {\n setFocus(\"center\");\n // Load full data set for browsing\n if (activeNav === \"exchanges\") {\n setExchanges(db.getAllExchanges());\n } else {\n setExchanges(db.getFailedExchanges());\n }\n }\n } else {\n // Browsing mode: navigate with pointer\n const step = key.ctrl ? JUMP : 1;\n if (input === \"j\" || key.downArrow) {\n exchangeScroll.moveBy(step, exchanges.length, exchangeTableRows);\n } else if (input === \"k\" || key.upArrow) {\n exchangeScroll.moveBy(-step, exchanges.length, exchangeTableRows);\n } else if (key.return) {\n const ex = exchanges[exchangeScroll.selectedIndex];\n if (ex) {\n setSelectedExchange(ex);\n setExchangeEvents(db.getEventsByExchange(ex.id, ex.correlationId));\n detailScroll.reset();\n setShowEventDetail(false);\n setShowDetail(true);\n }\n } else if (key.escape || key.backspace || key.delete) {\n setFocus(\"nav\");\n exchangeScroll.reset();\n }\n }\n return;\n }\n });\n\n // Determine which panel is active for border highlighting\n const navActive =\n activeNav === \"capabilities\" && focus === \"nav\" && !showDetail;\n const centerActive = !navActive;\n\n // Keymap items based on context\n const keymapItems: { key: string; action: string }[] = [];\n if (showDeepView) {\n keymapItems.push({ key: \"j/k\", action: \"Scroll\" });\n keymapItems.push({ key: \"Ctrl+j/k\", action: \"Jump 10\" });\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else if (focus === \"center\") {\n keymapItems.push({ key: \"j/k\", action: \"Navigate\" });\n keymapItems.push({ key: \"Ctrl+j/k\", action: \"Jump 10\" });\n }\n if (!showDeepView) {\n if (focus === \"nav\") {\n if (activeNav === \"capabilities\") {\n keymapItems.push({ key: \"j/k\", action: \"Navigate\" });\n keymapItems.push({ key: \"Enter\", action: \"Exchanges\" });\n } else {\n keymapItems.push({ key: \"Enter\", action: \"Browse\" });\n }\n } else if (!showDetail && !showEventDetail) {\n keymapItems.push({ key: \"Enter\", action: \"Detail\" });\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else if (showDetail && !showEventDetail) {\n keymapItems.push({ key: \"Enter\", action: \"Event detail\" });\n keymapItems.push({ key: \"e\", action: \"Snapshot\" });\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else {\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n }\n }\n keymapItems.push({ key: \"1..4\", action: \"Switch view\" });\n keymapItems.push({ key: \"q\", action: \"Quit\" });\n\n return (\n <Box flexDirection=\"column\" width={width} height={height}>\n {/* Title bar */}\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1} width={width}>\n <Text bold color=\"cyan\">\n ROUTECRAFT TUI\n </Text>\n <Text> </Text>\n <Text dimColor>v{version}</Text>\n </Box>\n\n {/* 3-column body */}\n <Box flexDirection=\"row\" width={width} flexGrow={1}>\n {/* Left column: Navigation (top) + Keymap (bottom) */}\n <Box flexDirection=\"column\" width={leftWidth}>\n <Panel\n title=\"NAVIGATION\"\n color={navActive ? \"cyan\" : \"gray\"}\n width={leftWidth}\n flexGrow={1}\n >\n {NAV_SECTIONS.map((section, si) => (\n <Box key={section.label ?? si} flexDirection=\"column\">\n {si > 0 && <Text> </Text>}\n {section.label && (\n <Text dimColor bold>\n {section.label}\n </Text>\n )}\n {section.items.map((item) => (\n <Text key={item.key}>\n <Text\n bold={activeNav === item.key}\n {...(activeNav === item.key\n ? { color: \"cyan\" as const }\n : {})}\n >\n {activeNav === item.key ? \"> \" : \" \"}\n {item.label}\n </Text>\n <Text dimColor> ({item.shortcut})</Text>\n </Text>\n ))}\n </Box>\n ))}\n\n {activeNav === \"capabilities\" && (\n <CapabilityList\n routes={routes}\n selectedIndex={routeScroll.selectedIndex}\n listOffset={routeScroll.scrollOffset}\n visibleRows={navListHeight}\n width={leftWidth - 6}\n />\n )}\n </Panel>\n </Box>\n\n {/* Center */}\n {activeNav === \"capabilities\" && !showDetail && (\n <CenterExchangeList\n capabilityId={selectedRoute?.id ?? \"\"}\n route={selectedRoute}\n exchanges={exchanges}\n selectedIndex={\n focus === \"center\" ? exchangeScroll.selectedIndex : -1\n }\n scrollOffset={focus === \"center\" ? exchangeScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={centerActive ? \"cyan\" : \"gray\"}\n activity={selectedRouteActivity}\n />\n )}\n {activeNav === \"capabilities\" && showDeepView && selectedExchange && (\n <ExchangeDeepView\n exchange={selectedExchange}\n snapshot={exchangeSnapshot}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={deepViewScroll}\n color=\"cyan\"\n />\n )}\n {activeNav === \"capabilities\" &&\n showDetail &&\n selectedExchange &&\n !showEventDetail &&\n !showDeepView && (\n <CenterExchangeDetail\n exchange={selectedExchange}\n events={exchangeEvents}\n width={centerWidth}\n height={bodyHeight}\n selectedIndex={detailScroll.selectedIndex}\n scrollOffset={detailScroll.scrollOffset}\n color=\"cyan\"\n />\n )}\n {activeNav === \"capabilities\" &&\n showDetail &&\n showEventDetail &&\n !showDeepView &&\n selectedEvent && (\n <EventDetail\n event={selectedEvent}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={eventDetailScroll}\n color=\"cyan\"\n />\n )}\n {activeNav === \"exchanges\" && !showDetail && (\n <CenterExchangeList\n capabilityId=\"All Capabilities\"\n exchanges={exchanges}\n selectedIndex={\n focus === \"center\" ? exchangeScroll.selectedIndex : -1\n }\n scrollOffset={focus === \"center\" ? exchangeScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={focus === \"center\" ? \"cyan\" : \"gray\"}\n />\n )}\n {activeNav === \"exchanges\" && showDeepView && selectedExchange && (\n <ExchangeDeepView\n exchange={selectedExchange}\n snapshot={exchangeSnapshot}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={deepViewScroll}\n color=\"cyan\"\n />\n )}\n {activeNav === \"exchanges\" &&\n showDetail &&\n selectedExchange &&\n !showEventDetail &&\n !showDeepView && (\n <CenterExchangeDetail\n exchange={selectedExchange}\n events={exchangeEvents}\n width={centerWidth}\n height={bodyHeight}\n selectedIndex={detailScroll.selectedIndex}\n scrollOffset={detailScroll.scrollOffset}\n color=\"cyan\"\n />\n )}\n {activeNav === \"exchanges\" &&\n showDetail &&\n showEventDetail &&\n !showDeepView &&\n selectedEvent && (\n <EventDetail\n event={selectedEvent}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={eventDetailScroll}\n color=\"cyan\"\n />\n )}\n {activeNav === \"errors\" && !showDetail && (\n <CenterExchangeList\n capabilityId=\"Failed Exchanges\"\n exchanges={exchanges}\n selectedIndex={\n focus === \"center\" ? exchangeScroll.selectedIndex : -1\n }\n scrollOffset={focus === \"center\" ? exchangeScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={focus === \"center\" ? \"cyan\" : \"gray\"}\n />\n )}\n {activeNav === \"errors\" && showDeepView && selectedExchange && (\n <ExchangeDeepView\n exchange={selectedExchange}\n snapshot={exchangeSnapshot}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={deepViewScroll}\n color=\"cyan\"\n />\n )}\n {activeNav === \"errors\" &&\n showDetail &&\n selectedExchange &&\n !showEventDetail &&\n !showDeepView && (\n <CenterExchangeDetail\n exchange={selectedExchange}\n events={exchangeEvents}\n width={centerWidth}\n height={bodyHeight}\n selectedIndex={detailScroll.selectedIndex}\n scrollOffset={detailScroll.scrollOffset}\n color=\"cyan\"\n />\n )}\n {activeNav === \"errors\" &&\n showDetail &&\n showEventDetail &&\n !showDeepView &&\n selectedEvent && (\n <EventDetail\n event={selectedEvent}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={eventDetailScroll}\n color=\"cyan\"\n />\n )}\n {activeNav === \"events\" && !showEventDetail && (\n <EventsView\n events={events}\n selectedIndex={focus === \"center\" ? eventScroll.selectedIndex : -1}\n scrollOffset={focus === \"center\" ? eventScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={focus === \"center\" ? \"cyan\" : \"gray\"}\n />\n )}\n {activeNav === \"events\" && showEventDetail && selectedEvent && (\n <EventDetail\n event={selectedEvent}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={eventDetailScroll}\n color=\"cyan\"\n />\n )}\n\n {/* Right: Metrics + Keymap */}\n <Box flexDirection=\"column\" width={rightWidth}>\n <Panel title=\"METRICS\" width={rightWidth} flexGrow={1}>\n <DotGraph\n values={liveTraffic}\n columns={rightWidth - 4}\n steps={[\n { max: 0, color: \"gray\" },\n ...(Array.from({ length: 7 }, (_, i) => ({\n max: (i + 1) * 5,\n color: \"green\",\n })) as { max: number; color: string }[]),\n ...(Array.from({ length: 7 }, (_, i) => ({\n max: 35 + (i + 1) * 10,\n color: \"yellow\",\n })) as { max: number; color: string }[]),\n ...(Array.from({ length: 6 }, (_, i) => ({\n max: 105 + (i + 1) * 25,\n color: \"red\",\n })) as { max: number; color: string }[]),\n ]}\n label=\"Exchanges per 5s bucket\"\n />\n <Text> </Text>\n <Text bold dimColor>\n THROUGHPUT\n </Text>\n {(\n [\n [\"Exchanges\", fmtNum(metrics.totalExchanges), \"cyan\"],\n [\"Completed\", fmtNum(metrics.completedExchanges), \"green\"],\n [\n \"Errors\",\n fmtNum(metrics.failedExchanges),\n metrics.failedExchanges > 0 ? \"red\" : \"green\",\n ],\n [\n \"Dropped\",\n fmtNum(metrics.droppedExchanges),\n metrics.droppedExchanges > 0 ? \"yellow\" : \"green\",\n ],\n [\n \"Error Rate\",\n `${(metrics.errorRate * 100).toFixed(1)}%`,\n metrics.errorRate > 0.1 ? \"red\" : \"green\",\n ],\n [\"Capabilities\", fmtNum(metrics.totalRoutes), \"\"],\n ] as [string, string, string][]\n ).map(([label, value, color]) => (\n <Box key={label}>\n <Text>{label}:</Text>\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text bold {...(color ? { color } : {})}>\n {value}\n </Text>\n </Box>\n </Box>\n ))}\n <Text> </Text>\n <Text bold dimColor>\n LATENCY (5m)\n </Text>\n {(\n [\n [\"Avg\", formatDuration(metrics.avgDurationMs), \"\"],\n [\"p90\", formatDuration(metrics.p90DurationMs), \"\"],\n [\"p95\", formatDuration(metrics.p95DurationMs), \"\"],\n [\"p99\", formatDuration(metrics.p99DurationMs), \"\"],\n ] as [string, string, string][]\n ).map(([label, value, color]) => (\n <Box key={label}>\n <Text>{label}:</Text>\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text bold {...(color ? { color } : {})}>\n {value}\n </Text>\n </Box>\n </Box>\n ))}\n </Panel>\n\n <Panel title=\"KEYMAP\" width={rightWidth}>\n {keymapItems.map((item) => (\n <Box key={item.key}>\n <Text>{item.action}</Text>\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text color=\"yellow\">[{item.key}]</Text>\n </Box>\n </Box>\n ))}\n </Panel>\n </Box>\n </Box>\n </Box>\n );\n}\n\nexport async function renderTui(dbPath: string): Promise<void> {\n let db: TelemetryDb;\n try {\n db = await TelemetryDb.open(dbPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Failed to open telemetry database: ${msg}\\n`);\n process.stderr.write(`Path: ${dbPath}\\n`);\n process.stderr.write(\n \"Make sure you have a running Routecraft context with telemetry() enabled.\\n\",\n );\n process.exit(1);\n }\n\n const instance = render(<App db={db} />);\n await instance.waitUntilExit();\n}\n"]}
1
+ {"version":3,"sources":["../../src/tui/types.ts","../../src/tui/utils.ts","../../src/tui/hooks/use-scroll-list.ts","../../src/tui/theme.ts","../../src/tui/components/panel.tsx","../../src/tui/components/dot-graph.tsx","../../src/tui/components/route-header.tsx","../../src/tui/components/table.tsx","../../src/tui/components/event-columns.tsx","../../src/tui/components/center-exchange-list.tsx","../../src/tui/components/json-format.tsx","../../src/tui/components/center-exchange-detail.tsx","../../src/tui/components/events-view.tsx","../../src/tui/components/event-detail.tsx","../../src/tui/components/exchange-deep-view.tsx","../../src/tui/components/nav-list.tsx","../../src/tui/components/agent-run-list.tsx","../../src/tui/components/agent-run-detail.tsx","../../src/tui/components/tool-call-list.tsx","../../src/tui/components/tool-call-detail.tsx","../../src/tui/app.tsx"],"names":["NAV_SECTIONS","ALL_NAV_ITEMS","s","truncate","str","maxLen","formatDuration","ms","statusColor","status","fmtTokens","n","fmtNum","toolStatusColor","col","len","parseEventDetail","raw","d","exchange","duration","adapter","meta","m","keys","k","qualifier","route","err","formatDetailColumns","_eventName","parsed","adjustScrollOffset","selected","currentOffset","visibleRows","useScrollList","initialIndex","selectedIndex","setSelectedIndex","useState","scrollOffset","setScrollOffset","moveTo","useCallback","index","listLength","clamped","off","moveBy","delta","prev","next","reset","theme","selectedProps","Panel","title","subtitle","color","width","flexGrow","paddingX","children","innerWidth","jsxs","Box","Fragment","Text","jsx","BRAILLE_DOTS","BRAILLE_BASE","DEFAULT_STEPS","DotGraph","values","columns","steps","label","dotHeight","data","heights","v","i","termRows","rows","tr","baseStep","segments","ci","bits","sr","stepLevel","char","last","RouteHeader","Table","rowKey","gap","emptyMessage","renderFullRow","gapStr","header","c","after","text","visible","remaining","row","vi","dataIndex","fullRow","resolved","cell","eventDetailColumns","accessor","include","cache","getColumns","ev","cols","_sel","w","selectorColumn","_row","exchangeColumns","CenterExchangeList","capabilityId","exchanges","height","activity","titleOverride","graphTermRows","headerRows","tableRows","ex","tokenizeLine","line","tokens","re","lastIndex","match","TOKEN_COLORS","formatJson","maxWidth","clampedMax","ColoredJsonLine","token","parseDetails","groupEventsByExchange","events","parentExchangeId","groups","childIndex","exId","key","buildDetailColumns","indent","CenterExchangeDetail","hasExtra","eventRows","detailColumns","useMemo","hasChildren","displayRows","group","eventsTitle","buildEventColumns","EventsView","eventColumns","EventDetail","event","routeId","exchangeId","headerHeight","jsonChrome","jsonWidth","jsonLines","offset","_","buildSnapshotLines","snapshot","lines","ExchangeDeepView","NavList","items","itemKey","dotColor","emptyText","listOffset","item","AgentRunList","agentKey","runs","infos","showTime","total","toolCallColumns","AgentRunDetail","run","info","toolCalls","buildCallColumns","ToolCallList","toolName","calls","buildLines","call","ToolCallDetail","routeDot","agentDot","agent","toolDot","tool","METRIC_LADDER","metricSteps","levels","picked","idx","JSON_VIEWS","buildEventGroups","parentId","gKey","countDisplayRows","App","db","exit","useApp","stdout","useStdout","activeNav","setActiveNav","stack","setStack","current","routes","setRoutes","metrics","setMetrics","liveTraffic","setLiveTraffic","selectedRouteActivity","setSelectedRouteActivity","routeScroll","setExchanges","exchangeScroll","selectedExchange","setSelectedExchange","exchangeEvents","setExchangeEvents","setEvents","eventScroll","detailScroll","selectedEvent","setSelectedEvent","jsonScroll","setJsonScroll","exchangeSnapshot","setExchangeSnapshot","agents","setAgents","agentScroll","selectedRun","setSelectedRun","agentRunInfo","setAgentRunInfo","agentRunInfos","setAgentRunInfos","agentRunToolCalls","setAgentRunToolCalls","agentRunScroll","filter","setFilter","filterTyping","setFilterTyping","follow","setFollow","tools","setTools","toolScroll","setToolCalls","toolCallScroll","selectedToolCall","setSelectedToolCall","PAGE_SIZE","JUMP","push","view","pop","leftWidth","rightWidth","centerWidth","bodyHeight","navListHeight","metricsGraphLevels","runToolRows","openExchangeId","openExchangeCorr","openRunId","openCallId","openCallTool","selAgentKey","selAgentSource","selToolName","loadAgentRuns","limit","r","refresh","routeSummary","liveCols","routeCols","curRoute","agentsList","toolsList","top","fresh","evs","freshRun","freshCall","useEffect","timer","selectRoute","selectAgent","selectTool","switchNav","nav","list","filterQuery","filterMatch","fields","f","visibleExchanges","visibleToolCalls","visibleEvents","resetBrowseScrolls","selectedRoute","selectedAgent","selectedTool","exchangeHeaderRows","exchangeTableRows","eventsTableRows","plainTableRows","openExchange","openExchangeForCall","useInput","input","navByShortcut","step","down","up","back","detailEventRows","totalDisplayRows","rowIndex","targetEvent","groupEvents","navActive","browsing","keymapItems","crumbs","tabLabel","center","version","crumb","section","si","a","t","value","renderTui","dbPath","TelemetryDb","msg","render"],"mappings":"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","file":"app.js","sourcesContent":["export type NavItem =\n \"capabilities\" | \"agents\" | \"tools\" | \"exchanges\" | \"errors\" | \"events\";\n\nexport type NavSection = {\n label?: string;\n items: { key: NavItem; label: string; shortcut: string }[];\n};\n\nexport const NAV_SECTIONS: NavSection[] = [\n {\n items: [{ key: \"capabilities\", label: \"Capabilities\", shortcut: \"1\" }],\n },\n {\n items: [\n { key: \"agents\", label: \"Agents\", shortcut: \"2\" },\n { key: \"tools\", label: \"Tools\", shortcut: \"3\" },\n ],\n },\n {\n items: [\n { key: \"exchanges\", label: \"Exchanges\", shortcut: \"4\" },\n { key: \"errors\", label: \"Errors\", shortcut: \"5\" },\n { key: \"events\", label: \"Events\", shortcut: \"6\" },\n ],\n },\n];\n\nexport const ALL_NAV_ITEMS = NAV_SECTIONS.flatMap((s) => s.items);\n\nexport interface RouteSummary {\n id: string;\n status: string;\n totalExchanges: number;\n completedExchanges: number;\n failedExchanges: number;\n droppedExchanges: number;\n avgDurationMs: number | null;\n}\n\nexport interface ExchangeRecord {\n id: string;\n routeId: string;\n contextId: string;\n correlationId: string;\n status: string;\n startedAt: string;\n completedAt: string | null;\n durationMs: number | null;\n error: string | null;\n}\n\nexport interface EventRecord {\n id?: number;\n timestamp: string;\n contextId: string;\n eventName: string;\n details: string;\n}\n\nexport interface Metrics {\n totalRoutes: number;\n totalExchanges: number;\n completedExchanges: number;\n failedExchanges: number;\n droppedExchanges: number;\n errorRate: number;\n avgDurationMs: number | null;\n p90DurationMs: number | null;\n p95DurationMs: number | null;\n p99DurationMs: number | null;\n}\n\nexport interface ExchangeSnapshot {\n headers: string;\n body: string | null;\n truncated: boolean;\n}\n\nexport interface RouteActivity {\n throughput: number[];\n recentErrors: number;\n}\n\n/**\n * A summary row for the Agents tab. `key` is the registered agent id for\n * by-name agents, or the dispatching route id for inline agents.\n */\nexport interface AgentSummary {\n key: string;\n source: \"registered\" | \"inline\";\n model: string | null;\n description: string | null;\n runCount: number;\n errorCount: number;\n totalTokens: number;\n lastRunAt: string | null;\n}\n\n/** A summary row for the Tools tab. */\nexport interface ToolSummary {\n name: string;\n source: \"registered\" | \"observed\";\n callCount: number;\n errorCount: number;\n lastCalledAt: string | null;\n}\n\n/** Per-run agent detail, keyed by the dispatching exchange. */\nexport interface AgentRunInfo {\n exchangeId: string;\n model: string | null;\n finishReason: string | null;\n inputTokens: number | null;\n outputTokens: number | null;\n totalTokens: number | null;\n status: \"running\" | \"finished\" | \"error\";\n}\n\n/**\n * A single tool invocation, correlating the invoked/result/error events\n * for one `toolCallId`. `input`/`output`/`error` are only populated when\n * telemetry snapshot capture was enabled; `errorName` is the always\n * persisted, non-sensitive error class.\n */\nexport interface ToolCallRow {\n toolCallId: string;\n toolName: string;\n routeId: string;\n exchangeId: string;\n agentName: string | null;\n status: \"invoked\" | \"result\" | \"error\";\n durationMs: number | null;\n timestamp: string;\n hasInput: boolean;\n hasOutput: boolean;\n input: string | null;\n output: string | null;\n error: string | null;\n errorName: string | null;\n}\n","export function truncate(str: string, maxLen: number): string {\n if (maxLen <= 0) return \"\";\n return str.length > maxLen ? str.slice(0, maxLen - 1) + \"\\u2026\" : str;\n}\n\nexport function formatDuration(ms: number | null): string {\n if (ms === null || ms === undefined) return \"-\";\n if (!Number.isFinite(ms) || ms < 0) return \"-\";\n if (ms === 0) return \"<1ms\";\n if (ms < 1000) return `${Math.round(ms)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nexport function statusColor(status: string): string {\n switch (status) {\n case \"completed\":\n case \"started\":\n case \"finished\":\n case \"running\":\n return \"green\";\n case \"failed\":\n case \"error\":\n return \"red\";\n case \"stopped\":\n case \"dropped\":\n return \"yellow\";\n default:\n return \"white\";\n }\n}\n\n/**\n * Compact number for fixed-width token columns (6 chars): plain\n * thousands-separated up to 99,999, then 123k / 1.2M so large counts\n * cannot overflow the column and push the row out of alignment.\n */\nexport function fmtTokens(n: number): string {\n if (n < 100_000) return fmtNum(n);\n if (n < 1_000_000) return `${Math.round(n / 1_000)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\n/** Semantic color for a correlated tool-call status. */\nexport function toolStatusColor(\n status: \"invoked\" | \"result\" | \"error\",\n): string {\n switch (status) {\n case \"result\":\n return \"green\";\n case \"error\":\n return \"red\";\n default:\n return \"yellow\";\n }\n}\n\nexport function col(str: string, len: number | undefined): string {\n if (len === undefined) return str;\n if (len <= 0) return \"\";\n if (str.length > len) return str.slice(0, len - 1) + \"\\u2026\";\n return str.padEnd(len);\n}\n\n// Fixed column widths for the Details column so fields line up across rows.\n// All event types share the same 4-column layout:\n// [col1: 10] [col2: 10] [exId: 12] [dur: 6] [extra]\n// Step events: operation (adapter) id… dur metadata\n// Exchange events: routeId (status) id… dur\nconst DET = {\n COL1: 10, // operation or routeId\n COL2: 10, // (adapter) or (err)/(reason)/(dropped)\n EX: 12, // \"789003e7 \"\n DUR: 6, // \"1ms \" \"10.0s \"\n} as const;\n\nexport interface DetailColumns {\n step: string;\n adapter: string;\n exchange: string;\n duration: string;\n meta: string;\n}\n\n/**\n * Parse a JSON event detail string into structured columns.\n * Shared normalizer used by both formatDetails and formatDetailColumns.\n */\nfunction parseEventDetail(raw: string): DetailColumns | null {\n try {\n const d = JSON.parse(raw) as Record<string, unknown>;\n\n const exchange =\n \"exchangeId\" in d ? `${String(d[\"exchangeId\"]).slice(0, 8)}` : \"\";\n const duration =\n \"duration\" in d ? formatDuration(d[\"duration\"] as number) : \"\";\n\n // Step/operation events\n if (\"operation\" in d && \"routeId\" in d) {\n const adapter =\n \"adapter\" in d\n ? `(${d[\"adapter\"]})`\n : \"adapterId\" in d\n ? `(${d[\"adapterId\"]})`\n : \"\";\n let meta = \"\";\n if (\n \"metadata\" in d &&\n typeof d[\"metadata\"] === \"object\" &&\n d[\"metadata\"] !== null\n ) {\n const m = d[\"metadata\"] as Record<string, unknown>;\n const keys = Object.keys(m).slice(0, 2);\n if (keys.length > 0) meta = keys.map((k) => `${k}=${m[k]}`).join(\" \");\n }\n return {\n step: String(d[\"operation\"]),\n adapter,\n exchange,\n duration,\n meta,\n };\n }\n\n // Exchange events\n if (\"routeId\" in d && \"exchangeId\" in d) {\n const qualifier =\n \"error\" in d\n ? \"(err)\"\n : \"reason\" in d\n ? `(${String(d[\"reason\"]).slice(0, 8)})`\n : \"\";\n return {\n step: String(d[\"routeId\"]),\n adapter: qualifier,\n exchange,\n duration,\n meta: \"\",\n };\n }\n\n // Route lifecycle events\n if (\"route\" in d && typeof d[\"route\"] === \"object\" && d[\"route\"] !== null) {\n const route = d[\"route\"] as {\n routeId?: string;\n definition?: { id?: string };\n };\n return {\n step: route.routeId ?? route.definition?.id ?? \"?\",\n adapter: \"\",\n exchange: \"\",\n duration: \"\",\n meta: \"\",\n };\n }\n\n // Plugin events\n if (\"pluginId\" in d) {\n return {\n step: `plugin=${d[\"pluginId\"]}`,\n adapter: \"\",\n exchange: \"\",\n duration: \"\",\n meta: \"\",\n };\n }\n\n // Error events\n if (\"error\" in d) {\n const err = d[\"error\"];\n const msg =\n typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: string }).message)\n : String(err);\n return {\n step: msg,\n adapter: \"\",\n exchange: \"\",\n duration: \"\",\n meta: \"\",\n };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function formatDetails(_eventName: string, raw: string): string {\n const parsed = parseEventDetail(raw);\n if (!parsed) {\n return raw.length > 100 ? raw.slice(0, 97) + \"...\" : raw;\n }\n\n // Non-columnar events (plugin, route lifecycle, error) have no exchange/duration\n if (!parsed.exchange && !parsed.duration && !parsed.adapter) {\n return parsed.step;\n }\n\n return [\n col(parsed.step, DET.COL1),\n col(parsed.adapter, DET.COL2),\n col(parsed.exchange, DET.EX),\n col(parsed.duration, DET.DUR),\n parsed.meta,\n ]\n .join(\" \")\n .trimEnd();\n}\n\n/**\n * Structured version of formatDetails that returns individual columns\n * so the component can control alignment per-column.\n */\nexport function formatDetailColumns(\n _eventName: string,\n raw: string,\n): DetailColumns {\n const parsed = parseEventDetail(raw);\n if (!parsed) {\n return { step: raw, adapter: \"\", exchange: \"\", duration: \"\", meta: \"\" };\n }\n return parsed;\n}\n\n/**\n * Render a single-line sparkline from an array of values.\n * Uses Unicode block characters (▁▂▃▄▅▆▇█).\n * Empty/zero-only input returns spaces of the same length.\n */\nexport function sparkline(values: number[]): string {\n if (values.length === 0) return \"\";\n const blocks = [\n \" \",\n \"\\u2581\",\n \"\\u2582\",\n \"\\u2583\",\n \"\\u2584\",\n \"\\u2585\",\n \"\\u2586\",\n \"\\u2587\",\n \"\\u2588\",\n ];\n const max = Math.max(...values, 1);\n return values\n .map((v) => {\n const idx = Math.max(0, Math.min(8, Math.round((v / max) * 8)));\n return blocks[Number.isFinite(idx) ? idx : 0];\n })\n .join(\"\");\n}\n\nexport function fmtNum(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\n/**\n * Adjust scroll offset so the selected item stays visible without centering.\n * The cursor moves freely within the visible window; the list only scrolls\n * when the cursor hits the top or bottom edge.\n *\n * @param selected - New selected index\n * @param currentOffset - Current scroll offset (tracked as state by the caller)\n * @param visibleRows - Number of rows visible in the list\n * @returns Updated scroll offset\n */\nexport function adjustScrollOffset(\n selected: number,\n currentOffset: number,\n visibleRows: number,\n): number {\n if (visibleRows <= 0) return currentOffset;\n if (selected < currentOffset) return selected;\n if (selected >= currentOffset + visibleRows)\n return selected - visibleRows + 1;\n return currentOffset;\n}\n","import { useState, useCallback } from \"react\";\nimport { adjustScrollOffset } from \"../utils.js\";\n\nexport interface ScrollListState {\n selectedIndex: number;\n scrollOffset: number;\n /** Move selection by delta (positive = down, negative = up). */\n moveBy: (delta: number, listLength: number, visibleRows: number) => void;\n /** Jump to an absolute index. */\n moveTo: (index: number, listLength: number, visibleRows: number) => void;\n /** Reset selection and scroll to the beginning. */\n reset: () => void;\n}\n\n/**\n * Manages a paired (selectedIndex, scrollOffset) state for scrollable lists.\n * Keeps the selected item visible without centering.\n *\n * `listLength` and `visibleRows` are passed at call time (not stored)\n * because they change every render (terminal resize, data load).\n */\nexport function useScrollList(initialIndex = 0): ScrollListState {\n const [selectedIndex, setSelectedIndex] = useState(initialIndex);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const moveTo = useCallback(\n (index: number, listLength: number, visibleRows: number) => {\n const clamped = Math.max(0, Math.min(index, listLength - 1));\n setSelectedIndex(clamped);\n setScrollOffset((off) => adjustScrollOffset(clamped, off, visibleRows));\n },\n [],\n );\n\n const moveBy = useCallback(\n (delta: number, listLength: number, visibleRows: number) => {\n setSelectedIndex((prev) => {\n const next = Math.max(0, Math.min(prev + delta, listLength - 1));\n setScrollOffset((off) => adjustScrollOffset(next, off, visibleRows));\n return next;\n });\n },\n [],\n );\n\n const reset = useCallback(() => {\n setSelectedIndex(0);\n setScrollOffset(0);\n }, []);\n\n return { selectedIndex, scrollOffset, moveBy, moveTo, reset };\n}\n","/**\n * Routecraft brand theme for the TUI.\n *\n * Mirrors the site's three-family palette (paper / ink / cobalt) and its\n * core rule: cobalt is the only accent and appears only on focus, selection\n * and active states; status colors are semantic; everything else is\n * neutral. The hex values are the dark-mode re-tone of the cobalt scale\n * from the brand book (tuned for dark grounds, which terminals are).\n * Terminals without truecolor support downgrade them to the nearest ANSI\n * color automatically.\n */\nexport const theme = {\n /** Cobalt 500 (dark re-tone). Focus borders, selection, active nav. */\n accent: \"#7482ff\",\n /** Cobalt 600 (dark re-tone). Secondary accent: values, key hints. */\n accentSoft: \"#9ea8fd\",\n /** Healthy / completed. */\n success: \"green\",\n /** Failures. */\n error: \"red\",\n /** Warnings, pending, registered-but-idle. */\n warn: \"yellow\",\n /** Hairlines, inactive panel borders, secondary text. */\n muted: \"gray\",\n} as const;\n\n/**\n * Spread props for a selected list row or nav item: accent + bold,\n * nothing at rest (the brand keeps cobalt off resting elements).\n */\nexport function selectedProps(selected: boolean): {\n color?: string;\n bold?: boolean;\n} {\n return selected ? { color: theme.accent, bold: true } : {};\n}\n","import type { ReactNode } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { theme } from \"../theme.js\";\n\nexport function Panel({\n title,\n subtitle,\n color = theme.muted,\n width,\n flexGrow,\n paddingX = 1,\n children,\n}: {\n title?: string;\n subtitle?: ReactNode;\n color?: string;\n width?: number;\n flexGrow?: number;\n paddingX?: number;\n children: ReactNode;\n}) {\n // Border adds 2 chars per side; padding adds paddingX per side\n const innerWidth = width ? width - 2 - paddingX * 2 : 20;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={color}\n paddingX={paddingX}\n width={width}\n flexGrow={flexGrow}\n >\n {title && (\n <>\n {/* Uppercase muted labels mirror the site's mono-label treatment;\n focus is conveyed by the border accent, not the title. */}\n <Text bold dimColor>\n {title}\n {subtitle && <> {subtitle}</>}\n </Text>\n <Text dimColor>{\"─\".repeat(Math.max(innerWidth, 1))}</Text>\n </>\n )}\n {children}\n </Box>\n );\n}\n","import type { JSX } from \"react\";\nimport { Text } from \"ink\";\n\n/**\n * Braille layout: 1 bucket per character, both columns.\n *\n * Left Right\n * 0x01 0x08 sub-row 0 (top)\n * 0x02 0x10 sub-row 1\n * 0x04 0x20 sub-row 2\n * 0x40 0x80 sub-row 3 (bottom)\n *\n * Each terminal character represents 1 time bucket.\n * Both columns mirror the same data for btop-style dot density.\n * Each terminal row packs up to 4 step levels vertically.\n */\nconst BRAILLE_DOTS = [\n 0x40 | 0x80,\n 0x04 | 0x20,\n 0x02 | 0x10,\n 0x01 | 0x08,\n] as const; // bottom to top\nconst BRAILLE_BASE = 0x2800;\n\nexport interface DotStep {\n max: number;\n color: string;\n}\n\n/** Default 5-step config: gray baseline, green low, yellow mid, red high. */\nexport const DEFAULT_STEPS: DotStep[] = [\n { max: 0, color: \"gray\" },\n { max: 10, color: \"green\" },\n { max: 20, color: \"green\" },\n { max: 30, color: \"yellow\" },\n { max: 40, color: \"yellow\" },\n { max: 50, color: \"red\" },\n];\n\n/**\n * Stacked dot graph using braille characters.\n *\n * 1 bucket = 1 terminal character. Both braille columns mirror the same\n * data for btop-style dot density. Each character can stack up to 4 step\n * levels vertically.\n *\n * - 0 exchanges: gray baseline dot (bottom)\n * - 1-9 exchanges: green dot (bottom)\n * - 10-19 exchanges: two green dots stacked\n * - etc., stacking upward with per-level colors\n */\nexport function DotGraph({\n values,\n columns,\n steps = DEFAULT_STEPS,\n label,\n}: {\n values: number[];\n columns: number;\n steps?: DotStep[];\n label?: string;\n}) {\n const dotHeight = steps.length - 1;\n\n // Right-align: newest on right, pad left with zeros\n const data =\n values.length >= columns\n ? values.slice(values.length - columns)\n : [\n ...(new Array(columns - values.length).fill(0) as number[]),\n ...values,\n ];\n\n // Map each value to a step index (0 = baseline, 1..dotHeight)\n const heights = data.map((v) => {\n if (v <= 0) return 0;\n for (let i = 1; i < steps.length; i++) {\n if (v < steps[i]!.max) return i;\n }\n return dotHeight;\n });\n\n const termRows = Math.ceil(dotHeight / 4);\n\n // Build terminal rows from top to bottom\n const rows: JSX.Element[] = [];\n for (let tr = termRows - 1; tr >= 0; tr--) {\n const baseStep = tr * 4;\n\n // For each bucket, compute the braille bits and color for this terminal row\n const segments: { text: string; color: string }[] = [];\n\n for (let ci = 0; ci < data.length; ci++) {\n const h = heights[ci]!;\n let bits = 0;\n let color = \"\";\n\n for (let sr = 0; sr < 4; sr++) {\n const stepLevel = baseStep + sr + 1;\n if (stepLevel > dotHeight) break;\n\n // Show dot if height reaches this level, or baseline dot for zero values\n const on = h >= stepLevel || (h === 0 && stepLevel === 1);\n if (on) {\n bits |= BRAILLE_DOTS[sr]!;\n // Color: gray for baseline (zero), step color for data\n color = h === 0 ? steps[0]!.color : steps[stepLevel]!.color;\n }\n }\n\n const char = String.fromCharCode(BRAILLE_BASE + bits);\n const last = segments[segments.length - 1];\n if (last && last.color === color) {\n last.text += char;\n } else {\n segments.push({ text: char, color });\n }\n }\n\n rows.push(\n <Text key={tr}>\n {segments.map((s, i) =>\n s.color ? (\n <Text key={i} color={s.color}>\n {s.text}\n </Text>\n ) : (\n <Text key={i}>{s.text}</Text>\n ),\n )}\n </Text>,\n );\n }\n\n return (\n <>\n {rows}\n {label && (\n <Text dimColor wrap=\"truncate\">\n {label}\n </Text>\n )}\n </>\n );\n}\n","import { Text } from \"ink\";\nimport type { RouteSummary } from \"../types.js\";\nimport { statusColor, fmtNum, formatDuration } from \"../utils.js\";\nimport { theme } from \"../theme.js\";\n\nexport function RouteHeader({ route }: { route: RouteSummary }) {\n return (\n <>\n <Text wrap=\"truncate\">\n Capability:{\" \"}\n <Text bold color={theme.accent}>\n {route.id}\n </Text>\n </Text>\n {/* One line, truncated: wrapping would push the capability line out\n of the fixed-height header panel on narrow terminals. */}\n <Text wrap=\"truncate\">\n Status:{\" \"}\n <Text bold color={statusColor(route.status)}>\n {route.status}\n </Text>\n {\" \"}Exchanges: <Text bold>{fmtNum(route.totalExchanges)}</Text>\n {\" \"}Errors:{\" \"}\n <Text\n bold\n {...(route.failedExchanges > 0 ? { color: \"red\" as const } : {})}\n >\n {fmtNum(route.failedExchanges)}\n </Text>\n {\" \"}Dropped:{\" \"}\n <Text\n bold\n {...(route.droppedExchanges > 0 ? { color: \"yellow\" as const } : {})}\n >\n {fmtNum(route.droppedExchanges)}\n </Text>\n {\" \"}Avg: <Text bold>{formatDuration(route.avgDurationMs)}</Text>\n </Text>\n </>\n );\n}\n","import { Fragment, type ReactNode } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { col } from \"../utils.js\";\n\nexport interface ColumnDef<T> {\n /** Header label */\n header: string;\n /** Fixed character width, or \"flex\" to fill remaining space */\n width: number | \"flex\";\n /** Text alignment. Default: \"left\" */\n align?: \"left\" | \"right\";\n /** Render cell content. `colWidth` is the resolved width for fixed columns, undefined for flex. */\n render: (\n row: T,\n selected: boolean,\n colWidth: number | undefined,\n ) => ReactNode;\n}\n\nexport interface TableProps<T> {\n columns: ColumnDef<T>[];\n data: T[];\n /** Unique key for each row */\n rowKey: (row: T, index: number) => string;\n /** Selected row index in full data array, or -1/undefined for no selection */\n selectedIndex?: number;\n /** First visible row (scroll offset) */\n scrollOffset: number;\n /** Number of visible rows */\n visibleRows: number;\n /** Gap between columns in characters. Default: 2 */\n gap?: number;\n /** Message when data is empty */\n emptyMessage?: string;\n /**\n * Optional full-row override for special rows (e.g., group headers).\n * Return undefined to use normal column rendering.\n */\n renderFullRow?: (row: T, index: number) => ReactNode | undefined;\n}\n\nexport function Table<T>({\n columns,\n data,\n rowKey,\n selectedIndex,\n scrollOffset,\n visibleRows,\n gap = 2,\n emptyMessage = \"No data\",\n renderFullRow,\n}: TableProps<T>) {\n const gapStr = \" \".repeat(gap);\n\n // Header\n const header = (\n <Box>\n {columns.map((c, ci) => {\n const isLast = ci === columns.length - 1;\n const after = isLast ? \"\" : gapStr;\n\n if (c.width === \"flex\") {\n return (\n <Fragment key={ci}>\n {/* flexBasis 0 so the column takes the remaining space\n rather than demanding its content width; otherwise long\n content squeezes the fixed cells and wraps the row. */}\n <Box flexGrow={1} flexBasis={0} minWidth={0}>\n <Text bold dimColor wrap=\"truncate\">\n {c.header}\n </Text>\n </Box>\n {after && (\n <Box flexShrink={0}>\n <Text>{after}</Text>\n </Box>\n )}\n </Fragment>\n );\n }\n\n const text =\n c.align === \"right\"\n ? c.header.padStart(c.width)\n : col(c.header, c.width);\n\n return (\n <Box key={ci} flexShrink={0}>\n <Text bold dimColor>\n {text}\n </Text>\n {after && <Text>{after}</Text>}\n </Box>\n );\n })}\n </Box>\n );\n\n if (data.length === 0) {\n return (\n <>\n {header}\n <Text dimColor>{emptyMessage}</Text>\n </>\n );\n }\n\n const visible = data.slice(scrollOffset, scrollOffset + visibleRows);\n const remaining = data.length - scrollOffset - visibleRows;\n\n return (\n <>\n {header}\n {visible.map((row, vi) => {\n const dataIndex = scrollOffset + vi;\n const selected = dataIndex === selectedIndex;\n\n // Full-row override (e.g., group headers)\n const fullRow = renderFullRow?.(row, dataIndex);\n if (fullRow !== undefined) {\n return <Box key={rowKey(row, dataIndex)}>{fullRow}</Box>;\n }\n\n return (\n <Box key={rowKey(row, dataIndex)}>\n {columns.map((c, ci) => {\n const isLast = ci === columns.length - 1;\n const after = isLast ? \"\" : gapStr;\n const resolved = c.width === \"flex\" ? undefined : c.width;\n const cell = c.render(row, selected, resolved);\n\n if (c.width === \"flex\") {\n return (\n <Fragment key={ci}>\n {/* See the header note: flexBasis 0 keeps long flex\n content from squeezing fixed cells into wrapping. */}\n <Box flexGrow={1} flexBasis={0} minWidth={0}>\n <Text wrap=\"truncate\">{cell}</Text>\n </Box>\n {after && (\n <Box flexShrink={0}>\n <Text>{after}</Text>\n </Box>\n )}\n </Fragment>\n );\n }\n\n return (\n <Box key={ci} flexShrink={0}>\n {cell}\n {after && <Text>{after}</Text>}\n </Box>\n );\n })}\n </Box>\n );\n })}\n <Text dimColor>{remaining > 0 ? \"\\u2193 more\" : \" \"}</Text>\n </>\n );\n}\n","import { Text } from \"ink\";\nimport type { EventRecord } from \"../types.js\";\nimport { col, formatDetailColumns, type DetailColumns } from \"../utils.js\";\nimport { selectedProps } from \"../theme.js\";\nimport type { ColumnDef } from \"./table.js\";\n\n/**\n * Build the standard event detail columns (Step, Adapter, Exchange,\n * Duration).\n *\n * The accessor extracts an EventRecord from whatever row type T the table\n * uses. Returns undefined when the row has no event data (e.g., group\n * headers). `include` lets narrow panes shed the Adapter and Exchange\n * columns so the remaining columns and the flex event name keep their\n * width instead of overflowing the row.\n *\n * JSON is parsed once per row and shared across all columns via a WeakMap cache.\n */\nexport function eventDetailColumns<T>(\n accessor: (row: T) => EventRecord | undefined,\n include: { adapter?: boolean; exchange?: boolean } = {\n adapter: true,\n exchange: true,\n },\n): ColumnDef<T>[] {\n const cache = new WeakMap<EventRecord, DetailColumns>();\n\n function getColumns(row: T): DetailColumns | undefined {\n const ev = accessor(row);\n if (!ev) return undefined;\n let cols = cache.get(ev);\n if (!cols) {\n cols = formatDetailColumns(ev.eventName, ev.details);\n cache.set(ev, cols);\n }\n return cols;\n }\n\n return [\n {\n header: \"Step\",\n width: 10,\n render: (row, _sel, w) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{col(\"\", w)}</Text>;\n return <Text>{col(cols.step, w)}</Text>;\n },\n },\n ...(include.adapter\n ? [\n {\n header: \"Adapter\",\n width: 10,\n render: (row, _sel, w) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{col(\"\", w)}</Text>;\n return <Text>{col(cols.adapter, w)}</Text>;\n },\n } satisfies ColumnDef<T>,\n ]\n : []),\n ...(include.exchange\n ? [\n {\n header: \"Exchange\",\n width: 12,\n render: (row, _sel, w) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{col(\"\", w)}</Text>;\n return <Text>{col(cols.exchange, w)}</Text>;\n },\n } satisfies ColumnDef<T>,\n ]\n : []),\n {\n header: \"Duration\",\n width: 8,\n align: \"right\" as const,\n render: (row) => {\n const cols = getColumns(row);\n if (!cols) return <Text>{\"\"}</Text>;\n return <Text>{cols.duration.padStart(8)}</Text>;\n },\n },\n ];\n}\n\n/**\n * Selector column that shows \"> \" for the selected row.\n */\nexport function selectorColumn<T>(): ColumnDef<T> {\n return {\n header: \"\",\n width: 2,\n render: (_row, selected) => (\n <Text {...selectedProps(selected)}>{selected ? \"> \" : \" \"}</Text>\n ),\n };\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, RouteSummary, RouteActivity } from \"../types.js\";\nimport { statusColor, formatDuration, col } from \"../utils.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { theme, selectedProps } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { RouteHeader } from \"./route-header.js\";\nimport { DotGraph, DEFAULT_STEPS } from \"./dot-graph.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn } from \"./event-columns.js\";\n\nconst exchangeColumns: ColumnDef<ExchangeRecord>[] = [\n selectorColumn<ExchangeRecord>(),\n {\n header: \"ID\",\n width: \"flex\",\n render: (row, selected) => (\n <Text {...selectedProps(selected)}>{row.id}</Text>\n ),\n },\n {\n header: \"Status\",\n width: 9,\n render: (row, _sel, w) => (\n <Text color={statusColor(row.status)}>{col(row.status, w)}</Text>\n ),\n },\n {\n header: \"Duration\",\n width: 8,\n align: \"right\",\n render: (row) => <Text>{formatDuration(row.durationMs).padStart(8)}</Text>,\n },\n {\n header: \"Time\",\n width: 8,\n render: (row, _sel, w) => (\n <Text dimColor>\n {col(row.startedAt.replace(\"T\", \" \").slice(11, 19), w)}\n </Text>\n ),\n },\n];\n\nexport function CenterExchangeList({\n capabilityId,\n route,\n exchanges,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color = theme.muted,\n activity,\n title: titleOverride,\n}: {\n capabilityId: string;\n route?: RouteSummary;\n exchanges: ExchangeRecord[];\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n activity?: RouteActivity | undefined;\n /** Override the computed panel title (e.g. for agent runs). */\n title?: string;\n}) {\n const graphTermRows = Math.ceil((DEFAULT_STEPS.length - 1) / 4);\n const headerRows = route ? 2 + graphTermRows + 2 : 0;\n const tableRows = Math.max(height - PANEL_TABLE_CHROME - headerRows, 3);\n\n const title =\n titleOverride ?? (route ? \"EXCHANGES\" : `EXCHANGES: ${capabilityId}`);\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n {route && (\n <Panel width={width}>\n <RouteHeader route={route} />\n <Text> </Text>\n <DotGraph\n values={activity ? activity.throughput : []}\n columns={width - 4}\n label=\"Exchanges per 5s bucket\"\n />\n </Panel>\n )}\n <Panel title={title} width={width} flexGrow={1} color={color}>\n <Table\n columns={exchangeColumns}\n data={exchanges}\n rowKey={(ex) => `${ex.id}:${ex.contextId}`}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No exchanges\"\n />\n </Panel>\n </Box>\n );\n}\n","import { Text } from \"ink\";\nimport { theme } from \"../theme.js\";\n\n/** Token types for JSON syntax coloring. */\nexport type TokenType =\n \"key\" | \"string\" | \"number\" | \"boolean\" | \"null\" | \"brace\";\n\nexport interface JsonToken {\n text: string;\n type: TokenType;\n}\n\n/**\n * Tokenize a single line of pretty-printed JSON into colored segments.\n * Handles: keys, string values, numbers, booleans, null, and structural chars.\n */\nexport function tokenizeLine(line: string): JsonToken[] {\n const tokens: JsonToken[] = [];\n const re =\n /(\"(?:[^\"\\\\]|\\\\.)*\")\\s*:|(\"(?:[^\"\\\\]|\\\\.)*\")|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b)|(\\bnull\\b)|([{}[\\],:])/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(line)) !== null) {\n // Plain text before this match (whitespace / indent)\n if (match.index > lastIndex) {\n tokens.push({ text: line.slice(lastIndex, match.index), type: \"brace\" });\n }\n\n if (match[1] !== undefined) {\n // Key (the colon is part of the regex but we split it out)\n tokens.push({ text: match[1], type: \"key\" });\n tokens.push({ text: \":\", type: \"brace\" });\n } else if (match[2] !== undefined) {\n tokens.push({ text: match[2], type: \"string\" });\n } else if (match[3] !== undefined) {\n tokens.push({ text: match[3], type: \"number\" });\n } else if (match[4] !== undefined) {\n tokens.push({ text: match[4], type: \"boolean\" });\n } else if (match[5] !== undefined) {\n tokens.push({ text: match[5], type: \"null\" });\n } else if (match[6] !== undefined) {\n tokens.push({ text: match[6], type: \"brace\" });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Trailing text\n if (lastIndex < line.length) {\n tokens.push({ text: line.slice(lastIndex), type: \"brace\" });\n }\n\n return tokens;\n}\n\n// Mirrors the site's code-block treatment: keys carry the ink (plain\n// text) weight, string values take the cobalt accent, punctuation\n// recedes; numbers/booleans stay warm and null reads as a warning.\nexport const TOKEN_COLORS: Record<TokenType, string> = {\n key: \"white\",\n string: theme.accentSoft,\n number: theme.warn,\n boolean: theme.warn,\n null: theme.error,\n brace: theme.muted,\n};\n\n/**\n * Parse a JSON string into pretty-printed lines, truncating long lines.\n */\nexport function formatJson(raw: string, maxWidth: number): string[] {\n try {\n const parsed = JSON.parse(raw) as unknown;\n const pretty = JSON.stringify(parsed, null, 2);\n return pretty.split(\"\\n\").map((line) => {\n const clampedMax = Math.max(1, maxWidth);\n return line.length > clampedMax\n ? line.slice(0, Math.max(0, clampedMax - 1)) + \"\\u2026\"\n : line;\n });\n } catch {\n const clampedMax = Math.max(1, maxWidth);\n return raw\n .split(\"\\n\")\n .map((line) =>\n line.length > clampedMax\n ? line.slice(0, Math.max(0, clampedMax - 1)) + \"\\u2026\"\n : line,\n );\n }\n}\n\n/**\n * Render a single line of JSON with syntax coloring.\n */\nexport function ColoredJsonLine({ line }: { line: string }) {\n const tokens = tokenizeLine(line);\n if (tokens.length === 0) return <Text>{line}</Text>;\n return (\n <Text>\n {tokens.map((token, i) => (\n <Text key={i} color={TOKEN_COLORS[token.type]}>\n {token.text}\n </Text>\n ))}\n </Text>\n );\n}\n\n/**\n * Safely parse a JSON details string.\n */\nexport function parseDetails(raw: string): Record<string, unknown> | null {\n try {\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n return null;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","import { useMemo } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ExchangeRecord, EventRecord } from \"../types.js\";\nimport { statusColor, formatDuration, col, truncate } from \"../utils.js\";\nimport { DETAIL_INFO_CHROME } from \"../layout.js\";\nimport { theme } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn, eventDetailColumns } from \"./event-columns.js\";\nimport { parseDetails } from \"./json-format.js\";\n\ntype DisplayRow = {\n type: \"header\" | \"event\";\n text?: string;\n event?: EventRecord;\n indent: number;\n};\n\n/**\n * Group events by exchangeId to show parent/child flow.\n */\nfunction groupEventsByExchange(\n events: EventRecord[],\n parentExchangeId: string,\n): { exchangeId: string; label: string; events: EventRecord[] }[] {\n const groups = new Map<\n string,\n { exchangeId: string; label: string; events: EventRecord[] }\n >();\n let childIndex = 0;\n\n groups.set(parentExchangeId, {\n exchangeId: parentExchangeId,\n label: \"parent\",\n events: [],\n });\n\n for (const ev of events) {\n const d = parseDetails(ev.details);\n const exId = d ? String(d[\"exchangeId\"] ?? \"\") : \"\";\n const key = !exId || exId === parentExchangeId ? parentExchangeId : exId;\n\n if (!groups.has(key)) {\n childIndex++;\n groups.set(key, {\n exchangeId: key,\n label: `child ${childIndex}`,\n events: [],\n });\n }\n groups.get(key)!.events.push(ev);\n }\n\n return Array.from(groups.values());\n}\n\n/**\n * Width-aware column set: narrow panes shed the Adapter and Exchange\n * detail columns so the flex event name keeps a useful width instead of\n * the row over-filling and clipping.\n */\nfunction buildDetailColumns(innerWidth: number): ColumnDef<DisplayRow>[] {\n return [\n selectorColumn<DisplayRow>(),\n {\n header: \"Time\",\n width: 10,\n render: (row, _sel, w) => {\n if (!row.event) return <Text>{col(\"\", w)}</Text>;\n const indent = \" \".repeat(row.indent);\n // col() bounds indent + time to the column so an indented child\n // row cannot push the rest of the row into wrapping.\n return (\n <Text dimColor>\n {col(\n indent + row.event.timestamp.replace(\"T\", \" \").slice(11, 19),\n w,\n )}\n </Text>\n );\n },\n },\n {\n header: \"Event\",\n width: \"flex\",\n render: (row) => {\n if (!row.event) return <Text />;\n return <Text>{row.event.eventName}</Text>;\n },\n },\n ...eventDetailColumns<DisplayRow>((row) => row.event, {\n adapter: innerWidth >= 80,\n exchange: innerWidth >= 68,\n }),\n ];\n}\n\nexport function CenterExchangeDetail({\n exchange,\n events,\n width,\n height,\n scrollOffset,\n selectedIndex = -1,\n color = theme.muted,\n}: {\n exchange: ExchangeRecord;\n events: EventRecord[];\n width: number;\n height: number;\n scrollOffset: number;\n selectedIndex?: number;\n color?: string;\n}) {\n const hasExtra = exchange.error ? 2 : 0;\n const eventRows = Math.max(height - DETAIL_INFO_CHROME - hasExtra, 3);\n // Memoized per width: rebuilding every render would discard the\n // per-row parse cache inside eventDetailColumns.\n const detailColumns = useMemo(() => buildDetailColumns(width - 4), [width]);\n\n const groups = groupEventsByExchange(events, exchange.id);\n const hasChildren = groups.length > 1;\n\n const displayRows: DisplayRow[] = [];\n for (const group of groups) {\n if (hasChildren) {\n displayRows.push({\n type: \"header\",\n text: `${group.label} (${group.exchangeId.slice(0, 8)}) - ${group.events.length} events`,\n indent: 0,\n });\n }\n for (const ev of group.events) {\n displayRows.push({\n type: \"event\",\n event: ev,\n indent: hasChildren ? 2 : 0,\n });\n }\n }\n\n const eventsTitle = hasChildren\n ? `EXCHANGE FLOW (${groups.length} exchanges, ${events.length} events)`\n : `RELATED EVENTS (${events.length})`;\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Capability:{\" \"}\n <Text bold color={theme.accent}>\n {exchange.routeId}\n </Text>\n </Text>\n <Text>\n Exchange:{\" \"}\n <Text bold color={theme.accent}>\n {truncate(exchange.id, width - 14)}\n </Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={statusColor(exchange.status)}>\n {exchange.status}\n </Text>\n {exchange.durationMs !== null && (\n <Text>\n {\" \"}Duration:{\" \"}\n <Text bold>{formatDuration(exchange.durationMs)}</Text>\n </Text>\n )}\n {\" \"}Started: <Text bold>{exchange.startedAt}</Text>\n {exchange.completedAt && (\n <Text>\n {\" \"}Completed: <Text bold>{exchange.completedAt}</Text>\n </Text>\n )}\n </Text>\n {exchange.error && exchange.status === \"failed\" && (\n <>\n <Text> </Text>\n <Text color=\"red\">Error: {exchange.error}</Text>\n </>\n )}\n {exchange.error && exchange.status === \"dropped\" && (\n <>\n <Text> </Text>\n <Text color=\"yellow\">Reason: {exchange.error}</Text>\n </>\n )}\n </Panel>\n\n <Panel title={eventsTitle} width={width} flexGrow={1} color={color}>\n <Table\n columns={detailColumns}\n data={displayRows}\n rowKey={(row, i) =>\n row.type === \"header\"\n ? `h-${i}`\n : `${row.event?.id ?? row.event?.timestamp}-${i}`\n }\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={eventRows}\n emptyMessage=\"No related events found\"\n renderFullRow={(row) =>\n row.type === \"header\" ? (\n <Text bold color={theme.accent}>\n {row.text}\n </Text>\n ) : undefined\n }\n />\n </Panel>\n </Box>\n );\n}\n","import { useMemo } from \"react\";\nimport { Text } from \"ink\";\nimport type { EventRecord } from \"../types.js\";\nimport { col } from \"../utils.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { theme, selectedProps } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn, eventDetailColumns } from \"./event-columns.js\";\n\n/**\n * Width-aware column set: narrow panes shed the Adapter and Exchange\n * detail columns so the flex event name keeps a useful width.\n */\nfunction buildEventColumns(innerWidth: number): ColumnDef<EventRecord>[] {\n return [\n selectorColumn<EventRecord>(),\n {\n // Date is omitted: the stream is recent by construction and the\n // full date starved the flex event-name column at common widths.\n header: \"Time\",\n width: 8,\n render: (row, selected, w) => (\n <Text {...selectedProps(selected)}>\n {col(row.timestamp.replace(\"T\", \" \").slice(11, 19), w)}\n </Text>\n ),\n },\n {\n header: \"Event\",\n width: \"flex\",\n render: (row) => <Text>{row.eventName}</Text>,\n },\n ...eventDetailColumns<EventRecord>((row) => row, {\n adapter: innerWidth >= 80,\n exchange: innerWidth >= 68,\n }),\n ];\n}\n\nexport function EventsView({\n events,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color = theme.muted,\n}: {\n events: EventRecord[];\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n}) {\n const tableRows = Math.max(height - PANEL_TABLE_CHROME, 5);\n // Memoized per width: rebuilding every render would discard the\n // per-row parse cache inside eventDetailColumns.\n const eventColumns = useMemo(() => buildEventColumns(width - 4), [width]);\n\n return (\n <Panel\n title=\"EVENTS\"\n subtitle={<Text dimColor>({events.length} total)</Text>}\n width={width}\n flexGrow={1}\n color={color}\n >\n <Table\n columns={eventColumns}\n data={events}\n rowKey={(ev, i) =>\n ev.id !== undefined ? String(ev.id) : `${ev.timestamp}-${i}`\n }\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No events recorded yet.\"\n />\n </Panel>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { EventRecord } from \"../types.js\";\nimport { theme } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { formatJson, ColoredJsonLine, parseDetails } from \"./json-format.js\";\n\nexport function EventDetail({\n event,\n width,\n height,\n scrollOffset,\n color = theme.accent,\n}: {\n event: EventRecord;\n width: number;\n height: number;\n scrollOffset: number;\n color?: string;\n}) {\n const d = parseDetails(event.details);\n const routeId =\n d && typeof d[\"routeId\"] === \"string\" ? d[\"routeId\"] : undefined;\n const exchangeId =\n d && typeof d[\"exchangeId\"] === \"string\" ? d[\"exchangeId\"] : undefined;\n\n // Header lines: context (always) + capability + exchange + event + time\n const headerLines = 1 + (routeId ? 1 : 0) + (exchangeId ? 1 : 0) + 2;\n // Top panel: border (2) + content lines\n const headerHeight = 2 + headerLines;\n // Bottom panel: border (2) + title/separator (2) + footer (1) = 5\n const jsonChrome = 5;\n const jsonWidth = Math.max(width - 6, 20);\n const jsonLines = formatJson(event.details, jsonWidth);\n const visibleRows = Math.max(height - headerHeight - jsonChrome, 3);\n // Clamp so overscrolling past the last line cannot blank the panel or\n // report an out-of-range line window.\n const offset = Math.max(\n 0,\n Math.min(scrollOffset, Math.max(jsonLines.length - visibleRows, 0)),\n );\n const visible = jsonLines.slice(offset, offset + visibleRows);\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Context:{\" \"}\n <Text bold color={theme.accent}>\n {event.contextId}\n </Text>\n </Text>\n {routeId && (\n <Text>\n Capability:{\" \"}\n <Text bold color={theme.accent}>\n {routeId}\n </Text>\n </Text>\n )}\n {exchangeId && (\n <Text>\n Exchange:{\" \"}\n <Text bold color={theme.accent}>\n {exchangeId}\n </Text>\n </Text>\n )}\n <Text>\n Event:{\" \"}\n <Text bold color={theme.accent}>\n {event.eventName}\n </Text>\n </Text>\n <Text>\n Time: <Text bold>{event.timestamp.replace(\"T\", \" \")}</Text>\n </Text>\n </Panel>\n\n <Panel\n title=\"DETAILS\"\n subtitle={\n <Text dimColor>\n ({offset + 1}-{Math.min(offset + visibleRows, jsonLines.length)}/\n {jsonLines.length} lines)\n </Text>\n }\n width={width}\n flexGrow={1}\n color={color}\n >\n {visible.map((line, i) => (\n <ColoredJsonLine key={offset + i} line={line} />\n ))}\n {visible.length < visibleRows &&\n Array.from({ length: visibleRows - visible.length }).map((_, i) => (\n <Text key={`pad-${i}`}> </Text>\n ))}\n </Panel>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, ExchangeSnapshot } from \"../types.js\";\nimport { statusColor, formatDuration, truncate } from \"../utils.js\";\nimport { theme } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { formatJson, ColoredJsonLine } from \"./json-format.js\";\n\n/**\n * Build the scrollable lines for the deep view: headers + body sections.\n */\nfunction buildSnapshotLines(\n snapshot: ExchangeSnapshot,\n maxWidth: number,\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"HEADERS\");\n lines.push(...formatJson(snapshot.headers, maxWidth));\n lines.push(\"\");\n lines.push(\"BODY\");\n if (snapshot.body !== null) {\n lines.push(...formatJson(snapshot.body, maxWidth));\n if (snapshot.truncated) {\n lines.push(\"\");\n lines.push(\"[Body truncated to configured limit]\");\n }\n } else {\n lines.push(\"[null]\");\n }\n\n return lines;\n}\n\nexport function ExchangeDeepView({\n exchange,\n snapshot,\n width,\n height,\n scrollOffset,\n color = theme.accent,\n}: {\n exchange: ExchangeRecord;\n snapshot: ExchangeSnapshot | null;\n width: number;\n height: number;\n scrollOffset: number;\n color?: string;\n}) {\n // Header panel: border (2) + content (3 lines: capability + exchange + status)\n const headerHeight = 5;\n // JSON panel chrome: border (2) + title (1) + separator (1) + footer (1)\n const jsonChrome = 5;\n const jsonWidth = Math.max(width - 6, 20);\n const visibleRows = Math.max(height - headerHeight - jsonChrome, 3);\n\n const hasSnapshot = snapshot !== null;\n const jsonLines = hasSnapshot\n ? buildSnapshotLines(snapshot, jsonWidth)\n : [\n \"[Snapshots not captured]\",\n \"\",\n \"Enable with:\",\n \" telemetry({ sqlite: { captureSnapshots: true } })\",\n ];\n\n // Clamp so overscrolling past the last line cannot blank the panel or\n // report an out-of-range line window.\n const offset = Math.max(\n 0,\n Math.min(scrollOffset, Math.max(jsonLines.length - visibleRows, 0)),\n );\n const visible = jsonLines.slice(offset, offset + visibleRows);\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Capability:{\" \"}\n <Text bold color={theme.accent}>\n {exchange.routeId}\n </Text>\n </Text>\n <Text>\n Exchange:{\" \"}\n <Text bold color={theme.accent}>\n {truncate(exchange.id, width - 14)}\n </Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={statusColor(exchange.status)}>\n {exchange.status}\n </Text>\n {exchange.durationMs !== null && (\n <Text>\n {\" \"}Duration:{\" \"}\n <Text bold>{formatDuration(exchange.durationMs)}</Text>\n </Text>\n )}\n </Text>\n </Panel>\n\n <Panel\n title=\"EXCHANGE SNAPSHOT\"\n subtitle={\n <Text dimColor>\n ({offset + 1}-{Math.min(offset + visibleRows, jsonLines.length)}/\n {jsonLines.length} lines)\n </Text>\n }\n width={width}\n flexGrow={1}\n color={color}\n >\n {visible.map((line, i) => {\n if (line === \"HEADERS\" || line === \"BODY\") {\n return (\n <Text key={offset + i} bold color={theme.accent}>\n {line}\n </Text>\n );\n }\n if (line.startsWith(\"[\")) {\n return (\n <Text key={offset + i} dimColor>\n {line}\n </Text>\n );\n }\n return <ColoredJsonLine key={offset + i} line={line} />;\n })}\n {visible.length < visibleRows &&\n Array.from({ length: visibleRows - visible.length }).map((_, i) => (\n <Text key={`pad-${i}`}> </Text>\n ))}\n </Panel>\n </Box>\n );\n}\n","import { Text } from \"ink\";\nimport { truncate } from \"../utils.js\";\nimport { selectedProps } from \"../theme.js\";\n\n/**\n * Generic left-nav list used by the Capabilities, Agents and Tools tabs:\n * a status dot, a truncated label, a cursor on the selected row and a\n * position indicator when the list overflows the visible window.\n */\nexport function NavList<T>({\n items,\n itemKey,\n label,\n dotColor,\n emptyText,\n selectedIndex,\n listOffset,\n visibleRows,\n width,\n}: {\n items: T[];\n itemKey: (item: T) => string;\n label: (item: T) => string;\n dotColor: (item: T) => string;\n emptyText: string;\n selectedIndex: number;\n listOffset: number;\n visibleRows: number;\n width: number;\n}) {\n // Clamp so a shrunken list cannot scroll the window past its end and\n // render an empty pane despite having items.\n const offset = Math.max(\n 0,\n Math.min(listOffset, Math.max(items.length - visibleRows, 0)),\n );\n\n return (\n <>\n <Text> </Text>\n <Text bold dimColor>\n {\"─\".repeat(width + 2)}\n </Text>\n {items.length === 0 ? (\n <Text dimColor>{emptyText}</Text>\n ) : (\n items.slice(offset, offset + visibleRows).map((item, vi) => {\n const i = offset + vi;\n const selected = i === selectedIndex;\n return (\n <Text key={itemKey(item)} wrap=\"truncate\">\n <Text {...selectedProps(selected)}>{selected ? \"> \" : \" \"}</Text>\n <Text color={dotColor(item)}>{\"● \"}</Text>\n <Text {...selectedProps(selected)}>\n {truncate(label(item), width - 2)}\n </Text>\n </Text>\n );\n })\n )}\n {items.length > visibleRows && (\n <Text dimColor>\n {selectedIndex + 1}/{items.length}\n </Text>\n )}\n </>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, AgentRunInfo } from \"../types.js\";\nimport { statusColor, formatDuration, col, fmtTokens } from \"../utils.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { selectedProps } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn } from \"./event-columns.js\";\n\n/**\n * Center view for the Agents tab: the agent's runs with the per-run\n * model and token usage surfaced at list level, so a run does not have\n * to be opened just to see what it cost. Run id and model share the\n * flexible space; the Time column only appears when the pane is wide\n * enough to keep single-line rows.\n */\nexport function AgentRunList({\n agentKey,\n runs,\n infos,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color,\n}: {\n agentKey: string;\n runs: ExchangeRecord[];\n infos: Map<string, AgentRunInfo>;\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n}) {\n const tableRows = Math.max(height - PANEL_TABLE_CHROME, 3);\n const title = agentKey ? `RUNS: ${agentKey}` : \"RUNS\";\n // Panel chrome is 4 (borders + padding); fixed columns + gaps consume\n // ~35, so reserve the Time column for panes that leave the two flex\n // columns at least ~10 characters each.\n const showTime = width - 4 >= 66;\n\n const columns: ColumnDef<ExchangeRecord>[] = [\n selectorColumn<ExchangeRecord>(),\n {\n header: \"Run\",\n width: \"flex\",\n render: (row, selected) => (\n <Text {...selectedProps(selected)}>{row.id}</Text>\n ),\n },\n {\n header: \"Status\",\n width: 9,\n render: (row, _sel, w) => {\n const status = infos.get(row.id)?.status ?? row.status;\n return <Text color={statusColor(status)}>{col(status, w)}</Text>;\n },\n },\n {\n header: \"Model\",\n width: \"flex\",\n render: (row) => <Text dimColor>{infos.get(row.id)?.model ?? \"-\"}</Text>,\n },\n {\n header: \"Tokens\",\n width: 6,\n align: \"right\",\n render: (row) => {\n const total = infos.get(row.id)?.totalTokens;\n return (\n <Text>\n {(total !== null && total !== undefined\n ? fmtTokens(total)\n : \"-\"\n ).padStart(6)}\n </Text>\n );\n },\n },\n {\n header: \"Duration\",\n width: 8,\n align: \"right\",\n render: (row) => (\n <Text>{formatDuration(row.durationMs).padStart(8)}</Text>\n ),\n },\n ...(showTime\n ? [\n {\n header: \"Time\",\n width: 8,\n render: (row, _sel, w) => (\n <Text dimColor>\n {col(row.startedAt.replace(\"T\", \" \").slice(11, 19), w)}\n </Text>\n ),\n } satisfies ColumnDef<ExchangeRecord>,\n ]\n : []),\n ];\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel\n title={title}\n width={width}\n flexGrow={1}\n {...(color ? { color } : {})}\n >\n <Table\n columns={columns}\n data={runs}\n rowKey={(ex) => `${ex.id}:${ex.contextId}`}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No runs\"\n />\n </Panel>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { ExchangeRecord, AgentRunInfo, ToolCallRow } from \"../types.js\";\nimport { statusColor, formatDuration, col, toolStatusColor } from \"../utils.js\";\nimport { theme, selectedProps } from \"../theme.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn } from \"./event-columns.js\";\n\nconst toolCallColumns: ColumnDef<ToolCallRow>[] = [\n selectorColumn<ToolCallRow>(),\n {\n header: \"Tool\",\n width: \"flex\",\n render: (row, selected) => (\n <Text {...selectedProps(selected)}>{row.toolName}</Text>\n ),\n },\n {\n header: \"Status\",\n width: 8,\n render: (row, _sel, w) => (\n <Text color={toolStatusColor(row.status)}>{col(row.status, w)}</Text>\n ),\n },\n {\n header: \"I/O\",\n width: 3,\n render: (row) => (\n <Text dimColor>\n {(row.hasInput ? \"i\" : \"-\") + (row.hasOutput ? \"o\" : \"-\")}\n </Text>\n ),\n },\n {\n header: \"Duration\",\n width: 8,\n align: \"right\",\n render: (row) => <Text>{formatDuration(row.durationMs).padStart(8)}</Text>,\n },\n];\n\n/**\n * Detail view for a single agent run (one dispatching exchange): model,\n * token usage and finish reason, plus the ordered tool-call timeline. The\n * tool input/output themselves open in {@link ToolCallDetail}.\n */\nexport function AgentRunDetail({\n agentKey,\n run,\n info,\n toolCalls,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color = theme.accent,\n}: {\n agentKey: string;\n run: ExchangeRecord;\n info: AgentRunInfo | null;\n toolCalls: ToolCallRow[];\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n}) {\n // Header panel: border (2) + 4 content lines.\n const headerHeight = 6;\n const tableRows = Math.max(height - headerHeight - PANEL_TABLE_CHROME, 3);\n\n const tokens =\n info && (info.inputTokens !== null || info.outputTokens !== null)\n ? `${info.inputTokens ?? \"?\"} in / ${info.outputTokens ?? \"?\"} out` +\n (info.totalTokens !== null ? ` (${info.totalTokens} total)` : \"\")\n : info && info.totalTokens !== null\n ? `${info.totalTokens} total`\n : \"-\";\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Agent:{\" \"}\n <Text bold color={theme.accent}>\n {agentKey}\n </Text>\n </Text>\n <Text>\n Model: <Text bold>{info?.model ?? \"-\"}</Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={statusColor(info?.status ?? run.status)}>\n {info?.status ?? run.status}\n </Text>\n {info?.finishReason && (\n <Text>\n {\" \"}Finish: <Text bold>{info.finishReason}</Text>\n </Text>\n )}\n </Text>\n <Text>\n Tokens: <Text bold>{tokens}</Text>\n </Text>\n </Panel>\n\n <Panel title=\"TOOL CALLS\" width={width} flexGrow={1} color={color}>\n <Table\n columns={toolCallColumns}\n data={toolCalls}\n rowKey={(c) => c.toolCallId}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No tool calls\"\n />\n </Panel>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { ToolCallRow } from \"../types.js\";\nimport { formatDuration, col, toolStatusColor } from \"../utils.js\";\nimport { theme, selectedProps } from \"../theme.js\";\nimport { PANEL_TABLE_CHROME } from \"../layout.js\";\nimport { Panel } from \"./panel.js\";\nimport { Table, type ColumnDef } from \"./table.js\";\nimport { selectorColumn } from \"./event-columns.js\";\n\n/**\n * Width-aware column set: every call belongs to one exchange (and, when\n * dispatched by an agent, one agent), so both associations show as\n * columns; narrow panes shed Agent first, then Time.\n */\nfunction buildCallColumns(innerWidth: number): ColumnDef<ToolCallRow>[] {\n return [\n selectorColumn<ToolCallRow>(),\n {\n header: \"Route\",\n width: \"flex\",\n render: (row, selected) => (\n <Text {...selectedProps(selected)}>{row.routeId || \"-\"}</Text>\n ),\n },\n ...(innerWidth >= 68\n ? [\n {\n header: \"Agent\",\n width: 12,\n render: (row, _sel, w) => (\n <Text dimColor>{col(row.agentName ?? \"-\", w)}</Text>\n ),\n } satisfies ColumnDef<ToolCallRow>,\n ]\n : []),\n {\n header: \"Status\",\n width: 8,\n render: (row, _sel, w) => (\n <Text color={toolStatusColor(row.status)}>{col(row.status, w)}</Text>\n ),\n },\n {\n header: \"Exchange\",\n width: 12,\n render: (row, _sel, w) => (\n <Text dimColor>{col(row.exchangeId.slice(0, 8), w)}</Text>\n ),\n },\n {\n header: \"Duration\",\n width: 8,\n align: \"right\",\n render: (row) => (\n <Text>{formatDuration(row.durationMs).padStart(8)}</Text>\n ),\n },\n ...(innerWidth >= 82\n ? [\n {\n header: \"Time\",\n width: 8,\n render: (row, _sel, w) => (\n <Text dimColor>{col(row.timestamp.slice(11, 19), w)}</Text>\n ),\n } satisfies ColumnDef<ToolCallRow>,\n ]\n : []),\n ];\n}\n\n/**\n * Center view for the Tools tab: the invocation history for one tool.\n */\nexport function ToolCallList({\n toolName,\n calls,\n selectedIndex,\n scrollOffset,\n width,\n height,\n color = theme.muted,\n}: {\n toolName: string;\n calls: ToolCallRow[];\n selectedIndex: number;\n scrollOffset: number;\n width: number;\n height: number;\n color?: string;\n}) {\n const tableRows = Math.max(height - PANEL_TABLE_CHROME, 3);\n const title = toolName ? `TOOL CALLS: ${toolName}` : \"TOOL CALLS\";\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel title={title} width={width} flexGrow={1} color={color}>\n <Table\n columns={buildCallColumns(width - 4)}\n data={calls}\n rowKey={(c) => c.toolCallId}\n selectedIndex={selectedIndex}\n scrollOffset={scrollOffset}\n visibleRows={tableRows}\n emptyMessage=\"No tool calls\"\n />\n </Panel>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport type { ToolCallRow } from \"../types.js\";\nimport { formatDuration, truncate, toolStatusColor } from \"../utils.js\";\nimport { theme } from \"../theme.js\";\nimport { Panel } from \"./panel.js\";\nimport { formatJson, ColoredJsonLine } from \"./json-format.js\";\n\n/**\n * Build the scrollable lines for a tool call: input, output and error\n * sections. Sensitive payloads are only present when telemetry snapshot\n * capture was enabled at the time of the call.\n */\nfunction buildLines(call: ToolCallRow, maxWidth: number): string[] {\n const lines: string[] = [];\n\n lines.push(\"INPUT\");\n if (call.hasInput && call.input !== null) {\n lines.push(...formatJson(call.input, maxWidth));\n } else {\n lines.push(\"[Not captured - enable snapshots]\");\n }\n lines.push(\"\");\n lines.push(\"OUTPUT\");\n if (call.status === \"invoked\") {\n lines.push(\"[Pending - tool still running or not recorded]\");\n } else if (call.hasOutput && call.output !== null) {\n lines.push(...formatJson(call.output, maxWidth));\n } else if (call.status === \"error\") {\n lines.push(\"[No output - call errored]\");\n } else {\n lines.push(\"[Not captured - enable snapshots]\");\n }\n if (call.status === \"error\") {\n lines.push(\"\");\n lines.push(\"ERROR\");\n if (call.error !== null) {\n lines.push(...formatJson(call.error, maxWidth));\n } else {\n // Only the non-sensitive error class is persisted when snapshot\n // capture is off (the message can echo the tool input).\n lines.push(\n `[${call.errorName ?? \"Error\"} - enable snapshots for details]`,\n );\n }\n } else if (call.error !== null) {\n lines.push(\"\");\n lines.push(\"ERROR\");\n lines.push(...formatJson(call.error, maxWidth));\n }\n\n return lines;\n}\n\n/**\n * Scrollable detail view of one tool call's input/output/error, reusing\n * the JSON renderer from {@link ExchangeDeepView}.\n */\nexport function ToolCallDetail({\n call,\n width,\n height,\n scrollOffset,\n color = theme.accent,\n}: {\n call: ToolCallRow;\n width: number;\n height: number;\n scrollOffset: number;\n color?: string;\n}) {\n const headerHeight = 5;\n const jsonChrome = 5;\n const jsonWidth = Math.max(width - 6, 20);\n const visibleRows = Math.max(height - headerHeight - jsonChrome, 3);\n\n const jsonLines = buildLines(call, jsonWidth);\n // Clamp so overscrolling past the last line cannot blank the panel or\n // report an out-of-range line window.\n const offset = Math.max(\n 0,\n Math.min(scrollOffset, Math.max(jsonLines.length - visibleRows, 0)),\n );\n const visible = jsonLines.slice(offset, offset + visibleRows);\n\n return (\n <Box flexDirection=\"column\" width={width} flexGrow={1}>\n <Panel width={width}>\n <Text>\n Tool:{\" \"}\n <Text bold color={theme.accent}>\n {truncate(call.toolName, width - 10)}\n </Text>\n </Text>\n <Text>\n Exchange:{\" \"}\n <Text bold color={theme.accent}>\n {truncate(call.exchangeId, width - 14)}\n </Text>\n </Text>\n <Text>\n Status:{\" \"}\n <Text bold color={toolStatusColor(call.status)}>\n {call.status}\n </Text>\n {call.durationMs !== null && (\n <Text>\n {\" \"}Duration:{\" \"}\n <Text bold>{formatDuration(call.durationMs)}</Text>\n </Text>\n )}\n </Text>\n </Panel>\n\n <Panel\n title=\"TOOL CALL\"\n subtitle={\n <Text dimColor>\n ({offset + 1}-{Math.min(offset + visibleRows, jsonLines.length)}/\n {jsonLines.length} lines)\n </Text>\n }\n width={width}\n flexGrow={1}\n color={color}\n >\n {visible.map((line, i) => {\n if (line === \"INPUT\" || line === \"OUTPUT\" || line === \"ERROR\") {\n return (\n <Text key={offset + i} bold color={theme.accent}>\n {line}\n </Text>\n );\n }\n if (line.startsWith(\"[\")) {\n return (\n <Text key={offset + i} dimColor>\n {line}\n </Text>\n );\n }\n return <ColoredJsonLine key={offset + i} line={line} />;\n })}\n {visible.length < visibleRows &&\n Array.from({ length: visibleRows - visible.length }).map((_, i) => (\n <Text key={`pad-${i}`}> </Text>\n ))}\n </Panel>\n </Box>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { render, Box, Text, useInput, useApp, useStdout } from \"ink\";\nimport { TelemetryDb } from \"./db.js\";\nimport type {\n NavItem,\n RouteSummary,\n ExchangeRecord,\n ExchangeSnapshot,\n EventRecord,\n Metrics,\n RouteActivity,\n AgentSummary,\n ToolSummary,\n AgentRunInfo,\n ToolCallRow,\n} from \"./types.js\";\nimport { NAV_SECTIONS, ALL_NAV_ITEMS } from \"./types.js\";\nimport { fmtNum, formatDuration } from \"./utils.js\";\nimport { useScrollList } from \"./hooks/use-scroll-list.js\";\nimport { PANEL_TABLE_CHROME, DETAIL_INFO_CHROME, NAV_JUMP } from \"./layout.js\";\nimport { Panel } from \"./components/panel.js\";\nimport { DotGraph, DEFAULT_STEPS } from \"./components/dot-graph.js\";\nimport { CenterExchangeList } from \"./components/center-exchange-list.js\";\nimport { CenterExchangeDetail } from \"./components/center-exchange-detail.js\";\nimport { EventsView } from \"./components/events-view.js\";\nimport { EventDetail } from \"./components/event-detail.js\";\nimport { ExchangeDeepView } from \"./components/exchange-deep-view.js\";\nimport { NavList } from \"./components/nav-list.js\";\nimport { AgentRunList } from \"./components/agent-run-list.js\";\nimport { AgentRunDetail } from \"./components/agent-run-detail.js\";\nimport { ToolCallList } from \"./components/tool-call-list.js\";\nimport { ToolCallDetail } from \"./components/tool-call-detail.js\";\nimport { theme, selectedProps } from \"./theme.js\";\nimport { version } from \"../../package.json\";\n\n/** Status dot for a capability in the left nav. */\nfunction routeDot(route: RouteSummary): string {\n if (route.failedExchanges > 0) return theme.error;\n if (route.totalExchanges > 0) return theme.success;\n return theme.warn;\n}\n\n/** Status dot for an agent: red on errors, green once run, yellow when idle. */\nfunction agentDot(agent: AgentSummary): string {\n if (agent.errorCount > 0) return theme.error;\n if (agent.runCount > 0) return theme.success;\n return theme.warn;\n}\n\n/** Status dot for a tool: red on errors, green once called, yellow when idle. */\nfunction toolDot(tool: ToolSummary): string {\n if (tool.errorCount > 0) return theme.error;\n if (tool.callCount > 0) return theme.success;\n return theme.warn;\n}\n\n/**\n * Full 20-level threshold ladder for the metrics traffic graph: green for\n * low volume, yellow for mid, red for high.\n */\nconst METRIC_LADDER: { max: number; color: string }[] = [\n ...Array.from({ length: 7 }, (_, i) => ({\n max: (i + 1) * 5,\n color: \"green\",\n })),\n ...Array.from({ length: 7 }, (_, i) => ({\n max: 35 + (i + 1) * 10,\n color: \"yellow\",\n })),\n ...Array.from({ length: 6 }, (_, i) => ({\n max: 105 + (i + 1) * 25,\n color: \"red\",\n })),\n];\n\n/**\n * Sample `levels` thresholds evenly from the ladder so the graph can\n * shrink to the rows the metrics panel has available (4 levels = 1\n * terminal row of braille).\n */\nfunction metricSteps(levels: number): { max: number; color: string }[] {\n const picked = Array.from({ length: levels }, (_, i) => {\n const idx = Math.min(\n Math.ceil(((i + 1) * METRIC_LADDER.length) / levels) - 1,\n METRIC_LADDER.length - 1,\n );\n return METRIC_LADDER[idx]!;\n });\n return [{ max: 0, color: \"gray\" }, ...picked];\n}\n\n/**\n * One level of drill-down above the tab root.\n *\n * The TUI's navigation is an explicit stack: the tab root (empty stack)\n * means the left nav owns the cursor; \"browse\" means the center list owns\n * it; the detail views push on top of that. Enter pushes, Esc pops, and\n * the top of the stack alone decides both key handling and what the\n * center pane renders, so a view can never be in two states at once.\n *\n * - \"browse\": center list (exchanges, runs, tool calls, events)\n * - \"exchange\": one exchange with its related events\n * - \"event\": scrollable JSON of one event\n * - \"snapshot\": scrollable JSON of an exchange's headers/body snapshot\n * - \"agent-run\": one agent run (model, tokens, tool-call timeline)\n * - \"tool-call\": scrollable JSON of one tool call's input/output\n */\ntype ViewKind =\n \"browse\" | \"exchange\" | \"event\" | \"snapshot\" | \"agent-run\" | \"tool-call\";\n\n/** Views whose body is a scrollable JSON document. */\nconst JSON_VIEWS: ReadonlySet<ViewKind> = new Set([\n \"event\",\n \"snapshot\",\n \"tool-call\",\n]);\n\n/**\n * Group an exchange's related events by exchangeId (parent first),\n * mirroring the display rows CenterExchangeDetail builds. Shared by the\n * input handler (resolving the cursor row back to an event) and the\n * live refresh (pinning follow mode to the newest row), so the two can\n * never disagree about row positions.\n */\nfunction buildEventGroups(\n events: EventRecord[],\n parentId: string,\n): Map<string, EventRecord[]> {\n const groups = new Map<string, EventRecord[]>();\n groups.set(parentId, []);\n for (const ev of events) {\n try {\n const d = JSON.parse(ev.details) as Record<string, unknown>;\n const exId = String(d[\"exchangeId\"] ?? \"\");\n const gKey = !exId || exId === parentId ? parentId : exId;\n if (!groups.has(gKey)) groups.set(gKey, []);\n groups.get(gKey)!.push(ev);\n } catch {\n groups.get(parentId)!.push(ev);\n }\n }\n return groups;\n}\n\n/**\n * Number of display rows in the exchange detail: every event plus one\n * header row per group when the events span multiple exchanges.\n */\nfunction countDisplayRows(events: EventRecord[], parentId: string): number {\n const groups = buildEventGroups(events, parentId);\n return events.length + (groups.size > 1 ? groups.size : 0);\n}\n\n/**\n * Root TUI component. Exported for tests; not part of the public CLI\n * surface.\n *\n * @internal\n */\nexport function App({ db }: { db: TelemetryDb }) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const width = stdout?.columns ?? 80;\n const height = stdout?.rows ?? 24;\n\n const [activeNav, setActiveNav] = useState<NavItem>(\"capabilities\");\n const [stack, setStack] = useState<ViewKind[]>([]);\n const current: ViewKind | \"root\" = stack.at(-1) ?? \"root\";\n\n const [routes, setRoutes] = useState<RouteSummary[]>([]);\n const [metrics, setMetrics] = useState<Metrics>({\n totalRoutes: 0,\n totalExchanges: 0,\n completedExchanges: 0,\n failedExchanges: 0,\n droppedExchanges: 0,\n errorRate: 0,\n avgDurationMs: null,\n p90DurationMs: null,\n p95DurationMs: null,\n p99DurationMs: null,\n });\n const [liveTraffic, setLiveTraffic] = useState<number[]>([]);\n const [selectedRouteActivity, setSelectedRouteActivity] = useState<\n RouteActivity | undefined\n >(undefined);\n const routeScroll = useScrollList();\n const [exchanges, setExchanges] = useState<ExchangeRecord[]>([]);\n const exchangeScroll = useScrollList();\n const [selectedExchange, setSelectedExchange] = useState<\n ExchangeRecord | undefined\n >(undefined);\n const [exchangeEvents, setExchangeEvents] = useState<EventRecord[]>([]);\n const [events, setEvents] = useState<EventRecord[]>([]);\n const eventScroll = useScrollList();\n const detailScroll = useScrollList();\n const [selectedEvent, setSelectedEvent] = useState<EventRecord | undefined>(\n undefined,\n );\n /** Shared scroll offset for the JSON views (only one is open at a time). */\n const [jsonScroll, setJsonScroll] = useState(0);\n const [exchangeSnapshot, setExchangeSnapshot] =\n useState<ExchangeSnapshot | null>(null);\n\n // Agents tab state\n const [agents, setAgents] = useState<AgentSummary[]>([]);\n const agentScroll = useScrollList();\n const [selectedRun, setSelectedRun] = useState<ExchangeRecord | undefined>(\n undefined,\n );\n const [agentRunInfo, setAgentRunInfo] = useState<AgentRunInfo | null>(null);\n const [agentRunInfos, setAgentRunInfos] = useState<Map<string, AgentRunInfo>>(\n new Map(),\n );\n const [agentRunToolCalls, setAgentRunToolCalls] = useState<ToolCallRow[]>([]);\n const agentRunScroll = useScrollList();\n\n // List filter (`/` in a browse list) and follow mode (`f`)\n const [filter, setFilter] = useState(\"\");\n const [filterTyping, setFilterTyping] = useState(false);\n const [follow, setFollow] = useState(false);\n\n // Tools tab state\n const [tools, setTools] = useState<ToolSummary[]>([]);\n const toolScroll = useScrollList();\n const [toolCalls, setToolCalls] = useState<ToolCallRow[]>([]);\n const toolCallScroll = useScrollList();\n const [selectedToolCall, setSelectedToolCall] = useState<\n ToolCallRow | undefined\n >(undefined);\n\n const PAGE_SIZE = 50;\n const JUMP = NAV_JUMP;\n\n const push = useCallback((view: ViewKind) => {\n setStack((s) => [...s, view]);\n setJsonScroll(0);\n }, []);\n\n const pop = useCallback(() => {\n setStack((s) => s.slice(0, -1));\n setJsonScroll(0);\n }, []);\n\n // Layout dimensions (needed by both refresh and render)\n const leftWidth = Math.max(Math.min(Math.floor(width * 0.18), 26), 16);\n const rightWidth = Math.max(Math.min(Math.floor(width * 0.22), 30), 20);\n const centerWidth = Math.max(width - leftWidth - rightWidth, 30);\n // 1 header line + 1 footer line + 2 rows of slack.\n const bodyHeight = Math.max(height - 4, 10);\n const navHeaderRows = 10;\n const navListHeight = Math.max(bodyHeight - navHeaderRows, 3);\n // Metrics panel fixed rows: 2 border + 2 title/sep + 1 graph label +\n // 2 blanks + 1 THROUGHPUT + 6 rows + 1 LATENCY + 4 rows = 19. Whatever\n // is left can hold braille graph rows (4 levels per row, 1..5 rows).\n const metricsGraphLevels = Math.max(Math.min(bodyHeight - 19, 5), 1) * 4;\n // Tool-call timeline inside the agent-run detail (header is 6 rows).\n // Defined here (not with the other table row counts) because the live\n // refresh also needs it to pin follow mode to the newest call.\n const runToolRows = Math.max(bodyHeight - 6 - PANEL_TABLE_CHROME, 3);\n\n // Identity of any open detail views, as primitives, so the polling\n // callback does not need the selected objects themselves as deps\n // (those are replaced with fresh instances every poll, which would\n // recreate the interval each tick).\n const openExchangeId = stack.includes(\"exchange\")\n ? selectedExchange?.id\n : undefined;\n const openExchangeCorr = stack.includes(\"exchange\")\n ? selectedExchange?.correlationId\n : undefined;\n const openRunId = stack.includes(\"agent-run\") ? selectedRun?.id : undefined;\n const openCallId =\n current === \"tool-call\" ? selectedToolCall?.toolCallId : undefined;\n const openCallTool =\n current === \"tool-call\" ? selectedToolCall?.toolName : undefined;\n // Selected nav-list identities as primitives, for the same reason.\n const selAgentKey = agents[agentScroll.selectedIndex]?.key;\n const selAgentSource = agents[agentScroll.selectedIndex]?.source;\n const selToolName = tools[toolScroll.selectedIndex]?.name;\n\n /**\n * Load an agent's runs plus the per-run info (model, tokens) the runs\n * list renders as columns.\n */\n const loadAgentRuns = useCallback(\n (\n agent: { key: string; source: \"registered\" | \"inline\" } | undefined,\n limit?: number,\n ) => {\n if (!agent) {\n setExchanges([]);\n setAgentRunInfos(new Map());\n return;\n }\n const runs =\n limit !== undefined\n ? db.getAgentRuns(agent.key, agent.source, limit)\n : db.getAgentRuns(agent.key, agent.source);\n setExchanges(runs);\n setAgentRunInfos(db.getAgentRunInfos(runs.map((r) => r.id)));\n },\n [db],\n );\n\n const refresh = useCallback(() => {\n try {\n // Always refresh: routes, metrics, graphs\n const routeSummary = db.getRouteSummary();\n setRoutes(routeSummary);\n setMetrics(db.getMetrics());\n const liveCols = rightWidth - 4;\n setLiveTraffic(db.getLiveTrafficBuckets(liveCols, 5));\n\n // Only load activity for the currently selected route\n const routeCols = centerWidth - 4;\n const curRoute = routeSummary[routeScroll.selectedIndex];\n if (curRoute) {\n setSelectedRouteActivity(\n db.getSingleRouteActivity(curRoute.id, routeCols, 5),\n );\n }\n\n // Agent/tool nav lists refresh at the tab root so newly-registered\n // or newly-run agents and tools appear without re-entering the tab.\n // While drilled in they stay frozen: the lists are sorted by recent\n // activity, so a live resort would move the index-based selection\n // to a different agent under the open drill-down.\n let agentsList: AgentSummary[] | undefined;\n let toolsList: ToolSummary[] | undefined;\n if (stack.length === 0) {\n if (activeNav === \"agents\") {\n agentsList = db.getAgents();\n setAgents(agentsList);\n } else if (activeNav === \"tools\") {\n toolsList = db.getTools();\n setTools(toolsList);\n }\n }\n\n // Detail views stay live: the open exchange / agent run re-reads\n // its events and tool calls every poll. New rows only append, so\n // the cursor keeps its position; with follow on, the cursor pins\n // to the newest row instead.\n const top = stack.at(-1);\n if (openExchangeId) {\n const fresh = db.getExchangeById(openExchangeId);\n if (fresh) setSelectedExchange(fresh);\n const evs = db.getEventsByExchange(\n openExchangeId,\n openExchangeCorr ?? \"\",\n );\n setExchangeEvents(evs);\n if (follow && top === \"exchange\") {\n const hasExtra = fresh?.error ? 2 : 0;\n const rows = Math.max(bodyHeight - DETAIL_INFO_CHROME - hasExtra, 3);\n const total = countDisplayRows(evs, openExchangeId);\n detailScroll.moveTo(total - 1, total, rows);\n }\n }\n if (openRunId) {\n const freshRun = db.getExchangeById(openRunId);\n if (freshRun) setSelectedRun(freshRun);\n setAgentRunInfo(db.getAgentRunInfo(openRunId));\n const calls = db.getAgentRunToolCalls(openRunId);\n setAgentRunToolCalls(calls);\n if (follow && top === \"agent-run\") {\n agentRunScroll.moveTo(calls.length - 1, calls.length, runToolRows);\n }\n // An open tool-call document refreshes in place (e.g. a pending\n // call gains its output when the result event lands).\n if (openCallId) {\n const freshCall = calls.find((c) => c.toolCallId === openCallId);\n if (freshCall) setSelectedToolCall(freshCall);\n }\n } else if (openCallId && openCallTool) {\n // Tool-call opened from the Tools tab (no agent run on the stack)\n const freshCall = db\n .getToolCalls(openCallTool)\n .find((c) => c.toolCallId === openCallId);\n if (freshCall) setSelectedToolCall(freshCall);\n }\n\n // Browse lists stay frozen while the user is in them, unless\n // follow mode keeps the active browse list tailing.\n if (stack.length > 0) {\n const following = follow && top === \"browse\";\n if (!following) return;\n }\n\n if (activeNav === \"capabilities\") {\n const route = routeSummary[routeScroll.selectedIndex];\n if (route) {\n setExchanges(db.getExchangesByRoute(route.id, PAGE_SIZE));\n }\n } else if (activeNav === \"agents\") {\n const agent = agentsList\n ? agentsList[agentScroll.selectedIndex]\n : selAgentKey && selAgentSource\n ? { key: selAgentKey, source: selAgentSource }\n : undefined;\n loadAgentRuns(agent, PAGE_SIZE);\n } else if (activeNav === \"tools\") {\n const toolName = toolsList\n ? toolsList[toolScroll.selectedIndex]?.name\n : selToolName;\n setToolCalls(toolName ? db.getToolCalls(toolName) : []);\n } else if (activeNav === \"exchanges\") {\n setExchanges(db.getAllExchanges(PAGE_SIZE));\n } else if (activeNav === \"errors\") {\n setExchanges(db.getFailedExchanges(PAGE_SIZE));\n } else if (activeNav === \"events\") {\n setEvents(db.getRecentEvents({ limit: 200 }));\n }\n } catch {\n // Database may be temporarily locked\n }\n }, [\n db,\n activeNav,\n routeScroll.selectedIndex,\n agentScroll.selectedIndex,\n toolScroll.selectedIndex,\n rightWidth,\n centerWidth,\n bodyHeight,\n runToolRows,\n stack,\n follow,\n loadAgentRuns,\n openExchangeId,\n openExchangeCorr,\n openRunId,\n openCallId,\n openCallTool,\n selAgentKey,\n selAgentSource,\n selToolName,\n detailScroll.moveTo,\n agentRunScroll.moveTo,\n ]);\n\n useEffect(() => {\n refresh();\n const timer = setInterval(refresh, 2000);\n return () => {\n clearInterval(timer);\n };\n }, [refresh]);\n\n const selectRoute = useCallback(\n (index: number) => {\n routeScroll.moveTo(index, routes.length, navListHeight);\n exchangeScroll.reset();\n const route = routes[index];\n if (route) {\n setExchanges(db.getExchangesByRoute(route.id, PAGE_SIZE));\n }\n },\n [db, routes, routeScroll, exchangeScroll, navListHeight],\n );\n\n const selectAgent = useCallback(\n (index: number) => {\n agentScroll.moveTo(index, agents.length, navListHeight);\n exchangeScroll.reset();\n loadAgentRuns(agents[index], PAGE_SIZE);\n },\n [agents, agentScroll, exchangeScroll, navListHeight, loadAgentRuns],\n );\n\n const selectTool = useCallback(\n (index: number) => {\n toolScroll.moveTo(index, tools.length, navListHeight);\n toolCallScroll.reset();\n const tool = tools[index];\n if (tool) {\n setToolCalls(db.getToolCalls(tool.name));\n }\n },\n [db, tools, toolScroll, toolCallScroll, navListHeight],\n );\n\n const switchNav = useCallback(\n (nav: NavItem) => {\n setActiveNav(nav);\n setStack([]);\n setJsonScroll(0);\n setFilter(\"\");\n setFilterTyping(false);\n setFollow(false);\n exchangeScroll.reset();\n if (nav === \"agents\") {\n agentScroll.reset();\n const list = db.getAgents();\n setAgents(list);\n loadAgentRuns(list[0], PAGE_SIZE);\n } else if (nav === \"tools\") {\n toolScroll.reset();\n toolCallScroll.reset();\n const list = db.getTools();\n setTools(list);\n const tool = list[0];\n setToolCalls(tool ? db.getToolCalls(tool.name) : []);\n } else if (nav === \"exchanges\") {\n setExchanges(db.getAllExchanges(PAGE_SIZE));\n } else if (nav === \"errors\") {\n setExchanges(db.getFailedExchanges(PAGE_SIZE));\n } else if (nav === \"events\") {\n eventScroll.reset();\n setEvents(db.getRecentEvents({ limit: 200 }));\n }\n },\n [\n db,\n exchangeScroll,\n eventScroll,\n agentScroll,\n toolScroll,\n toolCallScroll,\n loadAgentRuns,\n ],\n );\n\n // Client-side `/` filter over the active browse list. The lists are\n // frozen while browsing (unless follow mode reloads them), so the\n // filter only has to run over what is already in memory.\n const filterQuery = filter.trim().toLowerCase();\n const filterMatch = (...fields: Array<string | null>): boolean =>\n filterQuery === \"\" ||\n fields.some((f) => f !== null && f.toLowerCase().includes(filterQuery));\n const visibleExchanges = filterQuery\n ? exchanges.filter((ex) => filterMatch(ex.id, ex.routeId, ex.status))\n : exchanges;\n const visibleToolCalls = filterQuery\n ? toolCalls.filter((c) =>\n filterMatch(c.toolName, c.routeId, c.exchangeId, c.status),\n )\n : toolCalls;\n const visibleEvents = filterQuery\n ? events.filter((ev) => filterMatch(ev.eventName, ev.details))\n : events;\n\n /** Reset browse-list cursors after the filter narrows the data. */\n const resetBrowseScrolls = useCallback(() => {\n exchangeScroll.reset();\n toolCallScroll.reset();\n eventScroll.reset();\n }, [exchangeScroll, toolCallScroll, eventScroll]);\n\n const selectedRoute = routes[routeScroll.selectedIndex];\n const selectedAgent = agents[agentScroll.selectedIndex];\n const selectedTool = tools[toolScroll.selectedIndex];\n\n // Visible row counts mirror the view components\n // Must match CenterExchangeList: 2 (capability + stats) + graphTermRows + 2 (label + spacer)\n const graphTermRows = Math.ceil((DEFAULT_STEPS.length - 1) / 4);\n const exchangeHeaderRows = selectedRoute ? 2 + graphTermRows + 2 : 0;\n const exchangeTableRows = Math.max(\n bodyHeight - PANEL_TABLE_CHROME - exchangeHeaderRows,\n 3,\n );\n const eventsTableRows = Math.max(bodyHeight - PANEL_TABLE_CHROME, 5);\n // Plain (header-less) center tables: agent runs and tool-call lists.\n const plainTableRows = Math.max(bodyHeight - PANEL_TABLE_CHROME, 3);\n\n /**\n * Open the exchange detail for the given exchange. A still-running\n * exchange opens with follow on so new events tail in live.\n */\n const openExchange = useCallback(\n (ex: ExchangeRecord) => {\n setSelectedExchange(ex);\n setExchangeEvents(db.getEventsByExchange(ex.id, ex.correlationId));\n detailScroll.reset();\n setFollow(ex.status === \"started\");\n push(\"exchange\");\n },\n [db, detailScroll, push],\n );\n\n /**\n * Open the exchange a tool call ran in. Synthesizes a minimal record\n * when the dispatching exchange was not separately recorded (mirrors\n * getAgentRuns), so the jump always lands somewhere useful.\n */\n const openExchangeForCall = useCallback(\n (call: ToolCallRow) => {\n if (!call.exchangeId) return;\n const ex = db.getExchangeById(call.exchangeId) ?? {\n id: call.exchangeId,\n routeId: call.routeId,\n contextId: \"\",\n correlationId: \"\",\n status: \"started\",\n startedAt: call.timestamp,\n completedAt: null,\n durationMs: null,\n error: null,\n };\n openExchange(ex);\n },\n [db, openExchange],\n );\n\n useInput((input, key) => {\n // Filter typing mode captures all printable input\n if (filterTyping) {\n if (key.return) {\n setFilterTyping(false);\n } else if (key.escape) {\n setFilterTyping(false);\n setFilter(\"\");\n resetBrowseScrolls();\n } else if (key.backspace || key.delete) {\n setFilter((f) => f.slice(0, -1));\n resetBrowseScrolls();\n } else if (input && !key.ctrl && !key.meta) {\n setFilter((f) => f + input);\n resetBrowseScrolls();\n }\n return;\n }\n\n if (input === \"q\") {\n db.close();\n exit();\n return;\n }\n\n // Number shortcuts to switch nav (always available)\n const navByShortcut = ALL_NAV_ITEMS.find((n) => n.shortcut === input);\n if (navByShortcut) {\n switchNav(navByShortcut.key);\n return;\n }\n\n const step = key.ctrl ? JUMP : 1;\n const down = input === \"j\" || key.downArrow;\n const up = input === \"k\" || key.upArrow;\n const back = key.escape || key.backspace || key.delete;\n\n // Browse-list chrome shared by every tab: filter, follow, leave\n if (current === \"browse\") {\n if (input === \"/\") {\n setFilterTyping(true);\n return;\n }\n if (input === \"f\") {\n setFollow((v) => !v);\n return;\n }\n // Moving the cursor freezes the list again\n if ((down || up) && follow) setFollow(false);\n if (back) {\n pop();\n setFilter(\"\");\n setFollow(false);\n resetBrowseScrolls();\n return;\n }\n }\n\n // JSON document views: scroll, Esc pops\n if (current !== \"root\" && JSON_VIEWS.has(current)) {\n if (input === \"x\" && current === \"tool-call\" && selectedToolCall) {\n openExchangeForCall(selectedToolCall);\n return;\n }\n if (down) {\n setJsonScroll((i) => i + step);\n } else if (up) {\n setJsonScroll((i) => Math.max(i - step, 0));\n } else if (back) {\n pop();\n }\n return;\n }\n\n // Agent-run detail: browse the live tool-call timeline\n if (current === \"agent-run\") {\n if (input === \"f\") {\n setFollow((v) => !v);\n return;\n }\n if (input === \"x\" && selectedRun) {\n // A run is one exchange: jump to its exchange detail (related\n // events; `e` from there opens the body/headers snapshot).\n openExchange(selectedRun);\n return;\n }\n if ((down || up) && follow) setFollow(false);\n if (down) {\n agentRunScroll.moveBy(step, agentRunToolCalls.length, runToolRows);\n } else if (up) {\n agentRunScroll.moveBy(-step, agentRunToolCalls.length, runToolRows);\n } else if (key.return) {\n const call = agentRunToolCalls[agentRunScroll.selectedIndex];\n if (call) {\n setSelectedToolCall(call);\n push(\"tool-call\");\n }\n } else if (back) {\n pop();\n setFollow(false);\n agentRunScroll.reset();\n }\n return;\n }\n\n // Exchange detail: browse the live related-events list, open one,\n // or the snapshot\n if (current === \"exchange\") {\n if (input === \"f\") {\n setFollow((v) => !v);\n return;\n }\n if ((down || up) && follow) setFollow(false);\n const hasExtra = selectedExchange?.error ? 2 : 0;\n const detailEventRows = Math.max(\n bodyHeight - DETAIL_INFO_CHROME - hasExtra,\n 3,\n );\n const parentId = selectedExchange?.id ?? \"\";\n const totalDisplayRows = countDisplayRows(exchangeEvents, parentId);\n if (down) {\n detailScroll.moveBy(step, totalDisplayRows, detailEventRows);\n } else if (up) {\n detailScroll.moveBy(-step, totalDisplayRows, detailEventRows);\n } else if (key.return) {\n // Resolve the selected display row to an EventRecord (group\n // headers occupy rows when events span multiple exchanges)\n let rowIndex = 0;\n let targetEvent: EventRecord | undefined;\n const groups = buildEventGroups(exchangeEvents, parentId);\n const hasChildren = groups.size > 1;\n for (const [, groupEvents] of groups) {\n if (hasChildren) rowIndex++; // header row\n for (const ev of groupEvents) {\n if (rowIndex === detailScroll.selectedIndex) {\n targetEvent = ev;\n }\n rowIndex++;\n }\n }\n if (targetEvent) {\n setSelectedEvent(targetEvent);\n push(\"event\");\n }\n } else if (input === \"e\" && selectedExchange) {\n const snapshot = db.getExchangeSnapshot(selectedExchange.id);\n setExchangeSnapshot(snapshot);\n push(\"snapshot\");\n } else if (back) {\n detailScroll.reset();\n setFollow(false);\n pop();\n }\n return;\n }\n\n // Tab roots and browse lists\n if (activeNav === \"events\") {\n if (current === \"root\") {\n if (key.return) push(\"browse\");\n return;\n }\n if (down) {\n eventScroll.moveBy(step, visibleEvents.length, eventsTableRows);\n } else if (up) {\n eventScroll.moveBy(-step, visibleEvents.length, eventsTableRows);\n } else if (key.return) {\n const ev = visibleEvents[eventScroll.selectedIndex];\n if (ev) {\n setSelectedEvent(ev);\n push(\"event\");\n }\n }\n return;\n }\n\n if (activeNav === \"agents\") {\n if (current === \"root\") {\n if (down) {\n selectAgent(\n Math.min(agentScroll.selectedIndex + 1, agents.length - 1),\n );\n } else if (up) {\n selectAgent(Math.max(agentScroll.selectedIndex - 1, 0));\n } else if (key.return) {\n push(\"browse\");\n loadAgentRuns(agents[agentScroll.selectedIndex]);\n }\n return;\n }\n // Browse the agent's runs\n if (down) {\n exchangeScroll.moveBy(step, visibleExchanges.length, plainTableRows);\n } else if (up) {\n exchangeScroll.moveBy(-step, visibleExchanges.length, plainTableRows);\n } else if (key.return) {\n const ex = visibleExchanges[exchangeScroll.selectedIndex];\n if (ex) {\n setSelectedRun(ex);\n const info = db.getAgentRunInfo(ex.id);\n setAgentRunInfo(info);\n setAgentRunToolCalls(db.getAgentRunToolCalls(ex.id));\n agentRunScroll.reset();\n // A run still in flight opens with follow on so the tool-call\n // timeline tails live while the agent works.\n setFollow(ex.status === \"started\" || info?.status === \"running\");\n push(\"agent-run\");\n }\n } else if (input === \"x\") {\n // A run is one exchange: open its exchange detail directly\n const ex = visibleExchanges[exchangeScroll.selectedIndex];\n if (ex) openExchange(ex);\n }\n return;\n }\n\n if (activeNav === \"tools\") {\n if (current === \"root\") {\n if (down) {\n selectTool(Math.min(toolScroll.selectedIndex + 1, tools.length - 1));\n } else if (up) {\n selectTool(Math.max(toolScroll.selectedIndex - 1, 0));\n } else if (key.return) {\n push(\"browse\");\n const tool = tools[toolScroll.selectedIndex];\n if (tool) {\n setToolCalls(db.getToolCalls(tool.name));\n }\n }\n return;\n }\n // Browse the selected tool's calls\n if (down) {\n toolCallScroll.moveBy(step, visibleToolCalls.length, plainTableRows);\n } else if (up) {\n toolCallScroll.moveBy(-step, visibleToolCalls.length, plainTableRows);\n } else if (key.return) {\n const call = visibleToolCalls[toolCallScroll.selectedIndex];\n if (call) {\n setSelectedToolCall(call);\n push(\"tool-call\");\n }\n } else if (input === \"x\") {\n // Jump to the exchange this call ran in\n const call = visibleToolCalls[toolCallScroll.selectedIndex];\n if (call) openExchangeForCall(call);\n }\n return;\n }\n\n // Capabilities / Exchanges / Errors: exchange lists\n if (current === \"root\") {\n if (activeNav === \"capabilities\") {\n if (down) {\n selectRoute(\n Math.min(routeScroll.selectedIndex + 1, routes.length - 1),\n );\n } else if (up) {\n selectRoute(Math.max(routeScroll.selectedIndex - 1, 0));\n } else if (key.return) {\n push(\"browse\");\n // Load all exchanges for browsing (auto-refresh uses PAGE_SIZE)\n const route = routes[routeScroll.selectedIndex];\n if (route) {\n setExchanges(db.getExchangesByRoute(route.id));\n }\n }\n } else if (key.return) {\n push(\"browse\");\n // Load full data set for browsing\n if (activeNav === \"exchanges\") {\n setExchanges(db.getAllExchanges());\n } else {\n setExchanges(db.getFailedExchanges());\n }\n }\n return;\n }\n // Browse the exchange list\n if (down) {\n exchangeScroll.moveBy(step, visibleExchanges.length, exchangeTableRows);\n } else if (up) {\n exchangeScroll.moveBy(-step, visibleExchanges.length, exchangeTableRows);\n } else if (key.return) {\n const ex = visibleExchanges[exchangeScroll.selectedIndex];\n if (ex) openExchange(ex);\n }\n });\n\n // Left panel owns the cursor when a tab with a nav list is at its root\n const navActive =\n (activeNav === \"capabilities\" ||\n activeNav === \"agents\" ||\n activeNav === \"tools\") &&\n current === \"root\";\n const browsing = current === \"browse\";\n\n // Contextual key hints for the footer\n const keymapItems: { key: string; action: string }[] = [];\n if (current !== \"root\" && JSON_VIEWS.has(current)) {\n keymapItems.push({ key: \"j/k\", action: \"Scroll\" });\n keymapItems.push({ key: \"C-j/k\", action: \"Jump\" });\n if (current === \"tool-call\") {\n keymapItems.push({ key: \"x\", action: \"Exchange\" });\n }\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else if (current === \"agent-run\") {\n keymapItems.push({ key: \"j/k\", action: \"Navigate\" });\n keymapItems.push({ key: \"Enter\", action: \"Tool I/O\" });\n keymapItems.push({ key: \"x\", action: \"Exchange\" });\n keymapItems.push({ key: \"f\", action: \"Follow\" });\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else if (current === \"exchange\") {\n keymapItems.push({ key: \"j/k\", action: \"Navigate\" });\n keymapItems.push({ key: \"Enter\", action: \"Event\" });\n keymapItems.push({ key: \"e\", action: \"Snapshot\" });\n keymapItems.push({ key: \"f\", action: \"Follow\" });\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else if (browsing) {\n keymapItems.push({ key: \"j/k\", action: \"Navigate\" });\n keymapItems.push({ key: \"C-j/k\", action: \"Jump\" });\n keymapItems.push({ key: \"Enter\", action: \"Detail\" });\n if (activeNav === \"agents\" || activeNav === \"tools\") {\n keymapItems.push({ key: \"x\", action: \"Exchange\" });\n }\n keymapItems.push({ key: \"/\", action: \"Filter\" });\n keymapItems.push({ key: \"f\", action: \"Follow\" });\n keymapItems.push({ key: \"Esc\", action: \"Back\" });\n } else {\n keymapItems.push({ key: \"j/k\", action: \"Navigate\" });\n if (activeNav === \"capabilities\") {\n keymapItems.push({ key: \"Enter\", action: \"Exchanges\" });\n } else if (activeNav === \"agents\") {\n keymapItems.push({ key: \"Enter\", action: \"Runs\" });\n } else if (activeNav === \"tools\") {\n keymapItems.push({ key: \"Enter\", action: \"Calls\" });\n } else {\n keymapItems.push({ key: \"Enter\", action: \"Browse\" });\n }\n }\n keymapItems.push({ key: \"1-6\", action: \"View\" });\n keymapItems.push({ key: \"q\", action: \"Quit\" });\n\n // Breadcrumb: where am I in the drill-down?\n const crumbs: string[] = [];\n {\n const tabLabel =\n ALL_NAV_ITEMS.find((n) => n.key === activeNav)?.label ?? activeNav;\n crumbs.push(tabLabel);\n if (stack.length > 0) {\n if (activeNav === \"capabilities\" && selectedRoute) {\n crumbs.push(selectedRoute.id);\n } else if (activeNav === \"agents\" && selectedAgent) {\n crumbs.push(selectedAgent.key);\n } else if (activeNav === \"tools\" && selectedTool) {\n crumbs.push(selectedTool.name);\n }\n }\n for (const view of stack) {\n if (view === \"exchange\" && selectedExchange) {\n crumbs.push(selectedExchange.id.slice(0, 8));\n } else if (view === \"agent-run\" && selectedRun) {\n crumbs.push(`run ${selectedRun.id.slice(0, 8)}`);\n } else if (view === \"tool-call\" && selectedToolCall) {\n crumbs.push(selectedToolCall.toolName);\n } else if (view === \"event\" && selectedEvent) {\n crumbs.push(selectedEvent.eventName);\n } else if (view === \"snapshot\") {\n crumbs.push(\"snapshot\");\n }\n }\n }\n\n // Center pane: the top of the stack decides, independent of the tab\n let center: ReactNode;\n if (current === \"event\" && selectedEvent) {\n center = (\n <EventDetail\n event={selectedEvent}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={jsonScroll}\n />\n );\n } else if (current === \"snapshot\" && selectedExchange) {\n center = (\n <ExchangeDeepView\n exchange={selectedExchange}\n snapshot={exchangeSnapshot}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={jsonScroll}\n />\n );\n } else if (current === \"tool-call\" && selectedToolCall) {\n center = (\n <ToolCallDetail\n call={selectedToolCall}\n width={centerWidth}\n height={bodyHeight}\n scrollOffset={jsonScroll}\n />\n );\n } else if (current === \"agent-run\" && selectedRun) {\n center = (\n <AgentRunDetail\n agentKey={selectedAgent?.key ?? \"\"}\n run={selectedRun}\n info={agentRunInfo}\n toolCalls={agentRunToolCalls}\n selectedIndex={agentRunScroll.selectedIndex}\n scrollOffset={agentRunScroll.scrollOffset}\n width={centerWidth}\n height={bodyHeight}\n />\n );\n } else if (current === \"exchange\" && selectedExchange) {\n center = (\n <CenterExchangeDetail\n exchange={selectedExchange}\n events={exchangeEvents}\n width={centerWidth}\n height={bodyHeight}\n selectedIndex={detailScroll.selectedIndex}\n scrollOffset={detailScroll.scrollOffset}\n color={theme.accent}\n />\n );\n } else if (activeNav === \"events\") {\n center = (\n <EventsView\n events={visibleEvents}\n selectedIndex={browsing ? eventScroll.selectedIndex : -1}\n scrollOffset={browsing ? eventScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={browsing ? theme.accent : theme.muted}\n />\n );\n } else if (activeNav === \"agents\") {\n center = (\n <AgentRunList\n agentKey={selectedAgent?.key ?? \"\"}\n runs={visibleExchanges}\n infos={agentRunInfos}\n selectedIndex={browsing ? exchangeScroll.selectedIndex : -1}\n scrollOffset={browsing ? exchangeScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={browsing ? theme.accent : theme.muted}\n />\n );\n } else if (activeNav === \"tools\") {\n center = (\n <ToolCallList\n toolName={selectedTool?.name ?? \"\"}\n calls={visibleToolCalls}\n selectedIndex={browsing ? toolCallScroll.selectedIndex : -1}\n scrollOffset={browsing ? toolCallScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={browsing ? theme.accent : theme.muted}\n />\n );\n } else {\n center = (\n <CenterExchangeList\n capabilityId={\n activeNav === \"capabilities\"\n ? (selectedRoute?.id ?? \"\")\n : activeNav === \"exchanges\"\n ? \"All Capabilities\"\n : \"Failed Exchanges\"\n }\n {...(activeNav === \"capabilities\" && selectedRoute\n ? { route: selectedRoute }\n : {})}\n activity={\n activeNav === \"capabilities\" ? selectedRouteActivity : undefined\n }\n exchanges={visibleExchanges}\n selectedIndex={browsing ? exchangeScroll.selectedIndex : -1}\n scrollOffset={browsing ? exchangeScroll.scrollOffset : 0}\n width={centerWidth}\n height={bodyHeight}\n color={browsing ? theme.accent : theme.muted}\n />\n );\n }\n\n return (\n <Box flexDirection=\"column\" width={width} height={height}>\n {/* Header: wordmark + product term + breadcrumb, single line (brand:\n the wordmark is never all-capped; cobalt stays reserved for\n active states). */}\n <Box paddingX={1} width={width}>\n <Text bold>Routecraft</Text>\n <Text dimColor>\n {\" \"}craft tui{\" \"}v{version}\n </Text>\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text wrap=\"truncate\">\n {crumbs.map((crumb, i) => (\n <Text key={`${crumb}-${i}`}>\n {i > 0 && <Text dimColor> › </Text>}\n <Text\n {...(i === crumbs.length - 1 && crumbs.length > 1\n ? { color: theme.accent }\n : { dimColor: true })}\n >\n {crumb}\n </Text>\n </Text>\n ))}\n </Text>\n </Box>\n </Box>\n\n {/* 3-column body */}\n <Box flexDirection=\"row\" width={width} flexGrow={1}>\n {/* Left: navigation */}\n <Box flexDirection=\"column\" width={leftWidth}>\n <Panel\n title=\"NAVIGATION\"\n color={navActive ? theme.accent : theme.muted}\n width={leftWidth}\n flexGrow={1}\n >\n {NAV_SECTIONS.map((section, si) => (\n <Box key={section.label ?? si} flexDirection=\"column\">\n {si > 0 && <Text> </Text>}\n {section.label && (\n <Text dimColor bold>\n {section.label}\n </Text>\n )}\n {section.items.map((item) => (\n <Text key={item.key} wrap=\"truncate\">\n <Text {...selectedProps(activeNav === item.key)}>\n {activeNav === item.key ? \"> \" : \" \"}\n {item.label}\n </Text>\n <Text dimColor> ({item.shortcut})</Text>\n {item.key === \"errors\" && metrics.failedExchanges > 0 && (\n <Text color={theme.error}>\n {\" \"}\n {fmtNum(metrics.failedExchanges)}\n </Text>\n )}\n </Text>\n ))}\n </Box>\n ))}\n\n {activeNav === \"capabilities\" && (\n <NavList\n items={routes}\n itemKey={(r) => r.id}\n label={(r) => r.id}\n dotColor={routeDot}\n emptyText=\"No capabilities\"\n selectedIndex={routeScroll.selectedIndex}\n listOffset={routeScroll.scrollOffset}\n visibleRows={navListHeight}\n width={leftWidth - 6}\n />\n )}\n {activeNav === \"agents\" && (\n <NavList\n items={agents}\n itemKey={(a) => a.key}\n label={(a) => a.key}\n dotColor={agentDot}\n emptyText=\"No agents\"\n selectedIndex={agentScroll.selectedIndex}\n listOffset={agentScroll.scrollOffset}\n visibleRows={navListHeight}\n width={leftWidth - 6}\n />\n )}\n {activeNav === \"tools\" && (\n <NavList\n items={tools}\n itemKey={(t) => t.name}\n label={(t) => t.name}\n dotColor={toolDot}\n emptyText=\"No tools\"\n selectedIndex={toolScroll.selectedIndex}\n listOffset={toolScroll.scrollOffset}\n visibleRows={navListHeight}\n width={leftWidth - 6}\n />\n )}\n </Panel>\n </Box>\n\n {/* Center */}\n {center}\n\n {/* Right: metrics */}\n <Box flexDirection=\"column\" width={rightWidth}>\n <Panel title=\"METRICS\" width={rightWidth} flexGrow={1}>\n <DotGraph\n values={liveTraffic}\n columns={rightWidth - 4}\n steps={metricSteps(metricsGraphLevels)}\n label=\"Exchanges per 5s bucket\"\n />\n <Text> </Text>\n <Text bold dimColor>\n THROUGHPUT\n </Text>\n {(\n [\n [\"Exchanges\", fmtNum(metrics.totalExchanges), theme.accent],\n [\"Completed\", fmtNum(metrics.completedExchanges), \"green\"],\n [\n \"Errors\",\n fmtNum(metrics.failedExchanges),\n metrics.failedExchanges > 0 ? \"red\" : \"green\",\n ],\n [\n \"Dropped\",\n fmtNum(metrics.droppedExchanges),\n metrics.droppedExchanges > 0 ? \"yellow\" : \"green\",\n ],\n [\n \"Error Rate\",\n `${(metrics.errorRate * 100).toFixed(1)}%`,\n metrics.errorRate > 0.1 ? \"red\" : \"green\",\n ],\n [\"Capabilities\", fmtNum(metrics.totalRoutes), \"\"],\n ] as [string, string, string][]\n ).map(([label, value, color]) => (\n <Box key={label}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate\">{label}:</Text>\n </Box>\n <Text bold {...(color ? { color } : {})}>\n {value}\n </Text>\n </Box>\n ))}\n <Text> </Text>\n <Text bold dimColor>\n LATENCY (5m)\n </Text>\n {(\n [\n [\"Avg\", formatDuration(metrics.avgDurationMs), \"\"],\n [\"p90\", formatDuration(metrics.p90DurationMs), \"\"],\n [\"p95\", formatDuration(metrics.p95DurationMs), \"\"],\n [\"p99\", formatDuration(metrics.p99DurationMs), \"\"],\n ] as [string, string, string][]\n ).map(([label, value, color]) => (\n <Box key={label}>\n <Box flexGrow={1}>\n <Text wrap=\"truncate\">{label}:</Text>\n </Box>\n <Text bold {...(color ? { color } : {})}>\n {value}\n </Text>\n </Box>\n ))}\n </Panel>\n </Box>\n </Box>\n\n {/* Footer: filter/follow state + contextual key hints */}\n <Box paddingX={1} width={width}>\n <Text wrap=\"truncate\">\n {(filterTyping || filter !== \"\") && (\n <Text color={theme.accent}>\n /{filter}\n {filterTyping ? \"▏\" : \"\"}\n {\" \"}\n </Text>\n )}\n {follow && <Text color={theme.success}>● follow{\" \"}</Text>}\n {keymapItems.map((item, i) => (\n <Text key={item.key}>\n {i > 0 && <Text>{\" \"}</Text>}\n <Text color={theme.accentSoft}>{item.key}</Text>\n <Text dimColor> {item.action}</Text>\n </Text>\n ))}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport async function renderTui(dbPath: string): Promise<void> {\n let db: TelemetryDb;\n try {\n db = await TelemetryDb.open(dbPath);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Failed to open telemetry database: ${msg}\\n`);\n process.stderr.write(`Path: ${dbPath}\\n`);\n process.stderr.write(\n \"Make sure you have a running Routecraft context with telemetry() enabled.\\n\",\n );\n process.exit(1);\n }\n\n const instance = render(<App db={db} />);\n await instance.waitUntilExit();\n}\n"]}