@vreko/cli 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +45 -0
- package/dist/CeremonyView-LQS7FTMK.js +134 -0
- package/dist/CeremonyView-LQS7FTMK.js.map +1 -0
- package/dist/InitApp-7K5DTYSW.js +1479 -0
- package/dist/InitApp-7K5DTYSW.js.map +1 -0
- package/dist/SkippedTestDetector-PJSKSOZR.js +7 -0
- package/dist/SkippedTestDetector-PJSKSOZR.js.map +1 -0
- package/dist/TuiApp-FX23XQBK.js +8 -0
- package/dist/TuiApp-FX23XQBK.js.map +1 -0
- package/dist/analysis-ABEO6RTN.js +8 -0
- package/dist/analysis-ABEO6RTN.js.map +1 -0
- package/dist/auth-XNBEBNPY.js +7669 -0
- package/dist/auth-XNBEBNPY.js.map +1 -0
- package/dist/ceremony-M7CXVBVA.js +45 -0
- package/dist/ceremony-M7CXVBVA.js.map +1 -0
- package/dist/chunk-A3QSZJPD.js +3147 -0
- package/dist/chunk-A3QSZJPD.js.map +1 -0
- package/dist/chunk-ASGZ5B6C.js +3969 -0
- package/dist/chunk-ASGZ5B6C.js.map +1 -0
- package/dist/chunk-DMXC2JTC.js +58 -0
- package/dist/chunk-DMXC2JTC.js.map +1 -0
- package/dist/chunk-EEBSK2IH.js +161 -0
- package/dist/chunk-EEBSK2IH.js.map +1 -0
- package/dist/chunk-EWOJGXRX.js +22 -0
- package/dist/chunk-EWOJGXRX.js.map +1 -0
- package/dist/chunk-F7GEJLP7.js +2389 -0
- package/dist/chunk-F7GEJLP7.js.map +1 -0
- package/dist/chunk-GOYL3F4T.js +605 -0
- package/dist/chunk-GOYL3F4T.js.map +1 -0
- package/dist/chunk-GRMRYWYS.js +17 -0
- package/dist/chunk-GRMRYWYS.js.map +1 -0
- package/dist/chunk-GSUGROXB.js +1951 -0
- package/dist/chunk-GSUGROXB.js.map +1 -0
- package/dist/chunk-H7773ONB.js +50 -0
- package/dist/chunk-H7773ONB.js.map +1 -0
- package/dist/chunk-HFQHU5LC.js +445 -0
- package/dist/chunk-HFQHU5LC.js.map +1 -0
- package/dist/chunk-IVHUBLJD.js +318 -0
- package/dist/chunk-IVHUBLJD.js.map +1 -0
- package/dist/chunk-KJWKY4L4.js +14 -0
- package/dist/chunk-KJWKY4L4.js.map +1 -0
- package/dist/chunk-MJVY2XUN.js +1793 -0
- package/dist/chunk-MJVY2XUN.js.map +1 -0
- package/dist/chunk-QWZVCJII.js +1797 -0
- package/dist/chunk-QWZVCJII.js.map +1 -0
- package/dist/chunk-VTSNRV3V.js +3237 -0
- package/dist/chunk-VTSNRV3V.js.map +1 -0
- package/dist/chunk-W5B4GTXR.js +1466 -0
- package/dist/chunk-W5B4GTXR.js.map +1 -0
- package/dist/chunk-WZEZLVOW.js +4995 -0
- package/dist/chunk-WZEZLVOW.js.map +1 -0
- package/dist/chunk-YPTTIXKC.js +199 -0
- package/dist/chunk-YPTTIXKC.js.map +1 -0
- package/dist/chunk-Z55UGM6X.js +6360 -0
- package/dist/chunk-Z55UGM6X.js.map +1 -0
- package/dist/chunk-ZIIRQODJ.js +110 -0
- package/dist/chunk-ZIIRQODJ.js.map +1 -0
- package/dist/chunk-ZSUQ4FMB.js +77 -0
- package/dist/chunk-ZSUQ4FMB.js.map +1 -0
- package/dist/client-JMTSZS3V.js +10 -0
- package/dist/client-JMTSZS3V.js.map +1 -0
- package/dist/deprecated-snap.js +19 -0
- package/dist/deprecated-snap.js.map +1 -0
- package/dist/dist-2KWBZFLA.js +14 -0
- package/dist/dist-2KWBZFLA.js.map +1 -0
- package/dist/dist-5ZYKNNU3.js +7 -0
- package/dist/dist-5ZYKNNU3.js.map +1 -0
- package/dist/dist-CP3RFHPI.js +11 -0
- package/dist/dist-CP3RFHPI.js.map +1 -0
- package/dist/gecko-53ITAGG6.js +56 -0
- package/dist/gecko-53ITAGG6.js.map +1 -0
- package/dist/guards-QAFC64NO.js +7 -0
- package/dist/guards-QAFC64NO.js.map +1 -0
- package/dist/index.js +57785 -0
- package/dist/index.js.map +1 -0
- package/dist/init-command-246JIVXM.js +7 -0
- package/dist/init-command-246JIVXM.js.map +1 -0
- package/dist/init-core-KAI7LCXZ.js +12 -0
- package/dist/init-core-KAI7LCXZ.js.map +1 -0
- package/dist/init-scan-RZNYDTUV.js +1919 -0
- package/dist/init-scan-RZNYDTUV.js.map +1 -0
- package/dist/local-service-adapter-6KNN6WQL.js +8 -0
- package/dist/local-service-adapter-6KNN6WQL.js.map +1 -0
- package/dist/secure-credentials-JXWAQLS2.js +306 -0
- package/dist/secure-credentials-JXWAQLS2.js.map +1 -0
- package/dist/tui-TPJPUS2R.js +111 -0
- package/dist/tui-TPJPUS2R.js.map +1 -0
- package/dist/vreko-dir-O3RLG7PI.js +8 -0
- package/dist/vreko-dir-O3RLG7PI.js.map +1 -0
- package/package.json +132 -0
- package/scripts/check-banned-words.ts +152 -0
- package/scripts/hooks/posttooluse-file-notify.sh +108 -0
- package/scripts/hooks/pretooluse-fragile-guard.sh +82 -0
- package/scripts/post-install-notice.js +24 -0
- package/scripts/postinstall.mjs +84 -0
- package/scripts/preuninstall.mjs +34 -0
- package/scripts/verify-jsx-transform.mjs +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/ink-theme.tsx","../src/ui/tui/InkErrorBoundary.tsx","../src/ui/brand.tsx","../src/ui/tui/hooks/useDaemonPolling.ts","../src/ui/tui/hooks/useSlowPolling.ts","../src/ui/tui/panels/DashboardPanel.tsx","../src/ui/tui/panels/LearningsPanel.tsx","../src/ui/tui/panels/SessionPanel.tsx","../src/ui/tui/panels/SnapshotPanel.tsx","../src/ui/tui/panels/StatusPanel.tsx","../src/ui/tui/TabBar.tsx","../src/ui/tui/TuiApp.tsx"],"names":["vrekoTheme","extendTheme","defaultTheme","components","Spinner","styles","frame","color","BRAND_COLORS","primary","Badge","container","borderColor","undefined","ProgressBar","filled","VrekoTheme","children","ThemeProvider","theme","InkErrorBoundary","React","Component","props","state","hasError","error","getDerivedStateFromError","componentDidCatch","info","Sentry","captureException","extra","componentStack","panel","render","_jsx","Box","_jsxs","Text","BRAND_GREEN","DARK","WHITE","SUBTLE","GeckoGlyph","backgroundColor","VrekoHeader","version","variant","subtitle","flexDirection","marginBottom","useDaemonPolling","client","intervalMs","daemon","setDaemon","useState","setError","useEffect","cancelled","formatUptime","ms","s","Math","floor","m","h","d","poll","status","pid","uptime","connections","memoryMB","round","memoryUsage","heapUsed","err","Error","message","String","id","setInterval","clearInterval","INITIAL","snapshots","count","latestAt","learnings","momentum","useSlowPolling","setState","lastGoodRef","useRef","cwd","process","lg","current","snapshotCount","learningCount","momentumData","errors","snap","snapshot","list","limit","orderBy","orderDir","totalCount","createdAt","push","learn","learning","workspace","total","mom","fileCount","averageScore","length","join","formatTimeAgo","ts","diffMs","Date","now","getTime","mins","hours","DashboardPanel","daemonError","slowError","columns","stdout","daemonVersion","isConnected","paddingX","Alert","gap","minWidth","bold","underline","_Fragment","dimColor","label","value","marginTop","LearningsPanel","setLearnings","setTotal","isLoading","setIsLoading","filter","setFilter","showFilterMenu","setShowFilterMenu","hasStarted","load","result","items","map","l","type","trigger","action","useInput","input","v","filtered","filterOptions","Select","options","onChange","UnorderedList","slice","i","Item","formatSessionDuration","startedAt","SessionCard","session","borderStyle","toLocaleTimeString","SessionUnavailableNotice","show","useSessionLoader","setSession","sessionUnavailable","setSessionUnavailable","response","workspacePath","currentSession","msg","includes","useSessionActions","viewMode","setViewMode","statusMessage","setStatusMessage","isMountedRef","handleAction","start","end","sessionId","SessionPanel","sessionActions","formatSnapshotDate","toLocaleString","month","day","hour","minute","SnapshotPanel","setSnapshots","setTotalCount","selectedId","setSelectedId","actionResult","setActionResult","page","setPage","PAGE_SIZE","cursor","relativePath","filePath","prev","snapshotOptions","actionOptions","handleSnapshotSelect","p","restore","snapshotId","createBackup","dryRun","diff","baseSnapshotId","contextLines","format","stats","additions","deletions","filesChanged","delete","snapshotIds","visibleOptionCount","marginY","startsWith","StatusPanel","LABELS","dashboard","PANELS","TabBar","active","narrow","TuiApp","initialPanel","statusFocus","exit","useApp","activePanel","setActivePanel","close","key","ctrl","rightArrow","idx","indexOf","leftArrow"],"mappings":";;;;;;;;;;AAkBO,IAAMA,UAAAA,GAAaC,YAAYC,YAAAA,EAAc;EACnDC,UAAAA,EAAY;IACXC,OAAAA,EAAS;MACRC,MAAAA,EAAQ;AACPC,QAAAA,KAAAA,kBAAO,MAAA,CAAA,OAAkB;AAAEC,UAAAA,KAAAA,EAAOC,YAAAA,CAAaC;SAAQ,CAAA,EAAhD,OAAA;AACR;AACD,KAAA;IACAC,KAAAA,EAAO;MACNL,MAAAA,EAAQ;QACPM,SAAAA,kBAAW,MAAA,CAAA,CAAC,EAAEJ,KAAAA,EAAK,MAAqC;UACvDK,WAAAA,EAAaL,KAAAA,KAAU,OAAA,GAAUC,YAAAA,CAAaC,OAAAA,GAAUI;SACzD,CAAA,EAFW,WAAA;AAGZ;AACD,KAAA;IACAC,WAAAA,EAAa;MACZT,MAAAA,EAAQ;AACPU,QAAAA,MAAAA,kBAAQ,MAAA,CAAA,OAAkB;AAAER,UAAAA,KAAAA,EAAOC,YAAAA,CAAaC;SAAQ,CAAA,EAAhD,QAAA;AACT;AACD;AACD;AACD,CAAA,CAAA;AAGO,SAASO,UAAAA,CAAW,EAAEC,QAAAA,EAAQ,EAAiC;AACrE,EAAA,2BAAQC,aAAAA,EAAAA;IAAcC,KAAAA,EAAOnB,UAAAA;;;AAC9B;AAFgBgB,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;ACdT,IAAMI,gBAAAA,GAAN,cAA+BC,KAAAA,CAAMC,SAAAA,CAAS;AAAA,EAAA;;;AACpD,EAAA,WAAA,CAAYC,KAAAA,EAAc;AACzB,IAAA,KAAA,CAAMA,KAAAA,CAAAA;AACN,IAAA,IAAA,CAAKC,KAAAA,GAAQ;MAAEC,QAAAA,EAAU,KAAA;MAAOC,KAAAA,EAAO;AAAK,KAAA;AAC7C,EAAA;AAEA,EAAA,OAAOC,yBAAyBD,KAAAA,EAAqB;AACpD,IAAA,OAAO;MAAED,QAAAA,EAAU,IAAA;AAAMC,MAAAA;AAAM,KAAA;AAChC,EAAA;AAEAE,EAAAA,iBAAAA,CAAkBF,OAAcG,IAAAA,EAA6B;AAC5DC,IAAOC,wBAAiBL,KAAAA,EAAO;MAC9BM,KAAAA,EAAO;AAAEC,QAAAA,cAAAA,EAAgBJ,IAAAA,CAAKI,cAAAA;AAAgBC,QAAAA,KAAAA,EAAO,KAAKX,KAAAA,CAAMW;AAAM;KACvE,CAAA;AACD,EAAA;EAEAC,MAAAA,GAAS;AACR,IAAA,IAAI,IAAA,CAAKX,MAAMC,QAAAA,EAAU;AACxB,MAAA,uBACCW,IAACC,GAAAA,EAAAA;AACA,QAAA,QAAA,kBAAAC,IAAA,CAACC,IAAAA,EAAAA;UAAKhC,KAAAA,EAAM,KAAA;;AACV,YAAA,QAAA;AAAI,YAAA,GAAA;AAAE,YAAA,IAAA,CAAKgB,KAAAA,CAAMW,KAAAA;AAAM,YAAA;;;;AAI5B,IAAA;AACA,IAAA,OAAO,KAAKX,KAAAA,CAAMN,QAAAA;AACnB,EAAA;AACD,CAAA;ACrDA,IAAMuB,WAAAA,GAAc,SAAA;AACpB,IAAMC,IAAAA,GAAO,SAAA;AACb,IAAMC,KAAAA,GAAQ,SAAA;AACd,IAAMC,MAAAA,GAAS,SAAA;AAGf,SAASC,UAAAA,GAAAA;AACR,EAAA,uBACCN,KAACC,IAAAA,EAAAA;;AACA,sBAAAH,IAACG,IAAAA,EAAAA;QAAKhC,KAAAA,EAAOiC,WAAAA;AAAa,QAAA,QAAA,EAAA;;AAC1B,sBAAAJ,IAACG,IAAAA,EAAAA;QAAKhC,KAAAA,EAAOkC,IAAAA;QAAMI,eAAAA,EAAiBL,WAAAA;AAAa,QAAA,QAAA,EAAA;;AAGjD,sBAAAJ,IAACG,IAAAA,EAAAA;QAAKhC,KAAAA,EAAOiC,WAAAA;AAAa,QAAA,QAAA,EAAA;;;;AAG7B;AAVSI,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAkBF,SAASE,YAAY,EAAEC,OAAAA,EAASC,UAAU,SAAA,EAAWC,QAAAA,GAAW,0BAAwB,EAAe;AAC7G,EAAA,IAAID,YAAY,UAAA,EAAY;AAC3B,IAAA,uBACCV,KAACD,GAAAA,EAAAA;MAAIa,aAAAA,EAAc,QAAA;MAASC,YAAAA,EAAc,CAAA;;AACzC,wBAAAb,KAACC,IAAAA,EAAAA;;4BACAH,GAAAA,CAACQ,UAAAA,EAAAA,EAAAA,CAAAA;AACD,4BAAAR,IAACG,IAAAA,EAAAA;cAAKhC,KAAAA,EAAOmC,KAAAA;AAAO,cAAA,QAAA,EAAA;;AACpB,4BAAAJ,KAACC,IAAAA,EAAAA;cAAKhC,KAAAA,EAAOoC,MAAAA;;AAAQ,gBAAA,IAAA;AAAGI,gBAAAA;;;;;AAEzB,wBAAAX,IAACG,IAAAA,EAAAA;AACA,UAAA,QAAA,kBAAAD,KAACC,IAAAA,EAAAA;YAAKhC,KAAAA,EAAOoC,MAAAA;;AAAQ,cAAA,GAAA;AAAEM,cAAAA;;;;;;AAI3B,EAAA;AACA,EAAA,uBACCX,KAACD,GAAAA,EAAAA;IAAIc,YAAAA,EAAc,CAAA;;sBAClBf,GAAAA,CAACQ,UAAAA,EAAAA,EAAAA,CAAAA;AACD,sBAAAR,IAACG,IAAAA,EAAAA;QAAKhC,KAAAA,EAAOmC,KAAAA;AAAO,QAAA,QAAA,EAAA;;AACpB,sBAAAJ,KAACC,IAAAA,EAAAA;QAAKhC,KAAAA,EAAOoC,MAAAA;;AAAQ,UAAA,IAAA;AAAGI,UAAAA;;;;;AAG3B;AAtBgBD,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;ACRT,SAASM,gBAAAA,CACfC,MAAAA,EACAC,UAAAA,GAAa,GAAA,EAAI;AAEjB,EAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAAA,GAAaC,SAA6B,IAAA,CAAA;AACzD,EAAA,MAAM,CAAC/B,KAAAA,EAAOgC,QAAAA,CAAAA,GAAYD,SAAwB,IAAA,CAAA;AAElDE,EAAAA,SAAAA,CAAU,MAAA;AACT,IAAA,IAAIC,SAAAA,GAAY,KAAA;AAEhB,IAAA,SAASC,aAAaC,EAAAA,EAAU;AAC/B,MAAA,MAAMC,CAAAA,GAAIC,IAAAA,CAAKC,KAAAA,CAAMH,EAAAA,GAAK,GAAA,CAAA;AAC1B,MAAA,MAAMI,CAAAA,GAAIF,IAAAA,CAAKC,KAAAA,CAAMF,CAAAA,GAAI,EAAA,CAAA;AACzB,MAAA,MAAMI,CAAAA,GAAIH,IAAAA,CAAKC,KAAAA,CAAMC,CAAAA,GAAI,EAAA,CAAA;AACzB,MAAA,MAAME,CAAAA,GAAIJ,IAAAA,CAAKC,KAAAA,CAAME,CAAAA,GAAI,EAAA,CAAA;AACzB,MAAA,IAAIC,IAAI,CAAA,EAAG;AACV,QAAA,OAAO,CAAA,EAAGA,CAAAA,CAAAA,EAAAA,EAAMD,CAAAA,GAAI,EAAA,CAAA,CAAA,CAAA;AACrB,MAAA;AACA,MAAA,IAAIA,IAAI,CAAA,EAAG;AACV,QAAA,OAAO,CAAA,EAAGA,CAAAA,CAAAA,EAAAA,EAAMD,CAAAA,GAAI,EAAA,CAAA,CAAA,CAAA;AACrB,MAAA;AACA,MAAA,IAAIA,IAAI,CAAA,EAAG;AACV,QAAA,OAAO,CAAA,EAAGA,CAAAA,CAAAA,EAAAA,EAAMH,CAAAA,GAAI,EAAA,CAAA,CAAA,CAAA;AACrB,MAAA;AACA,MAAA,OAAO,GAAGA,CAAAA,CAAAA,CAAAA,CAAAA;AACX,IAAA;AAfSF,IAAAA,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAiBT,IAAA,MAAMQ,uBAAO,MAAA,CAAA,YAAA;AACZ,MAAA,IAAI;AACH,QAAA,MAAMC,MAAAA,GAAS,MAAMjB,MAAAA,CAAOE,MAAAA,CAAOe,MAAAA,EAAM;AACzC,QAAA,IAAIV,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACAJ,QAAAA,SAAAA,CAAU;AACTe,UAAAA,GAAAA,EAAKD,MAAAA,CAAOC,GAAAA;AACZxB,UAAAA,OAAAA,EAASuB,MAAAA,CAAOvB,OAAAA;UAChByB,MAAAA,EAAQX,YAAAA,CAAaS,OAAOE,MAAM,CAAA;AAClCC,UAAAA,WAAAA,EAAaH,MAAAA,CAAOG,WAAAA;AACpBC,UAAAA,QAAAA,EAAUV,KAAKW,KAAAA,CAAML,MAAAA,CAAOM,WAAAA,CAAYC,QAAAA,IAAY,OAAO,IAAA,CAAG;SAC/D,CAAA;AACAnB,QAAAA,QAAAA,CAAS,IAAA,CAAA;AACV,MAAA,CAAA,CAAA,OAASoB,GAAAA,EAAK;AACb,QAAA,IAAIlB,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACAJ,QAAAA,SAAAA,CAAU,IAAA,CAAA;AACVE,QAAAA,QAAAA,CAASoB,eAAeC,KAAAA,GAAQD,GAAAA,CAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;AACtD,MAAA;IACD,CAAA,EArBa,MAAA,CAAA;AAuBbT,IAAAA,IAAAA,EAAAA;AACA,IAAA,MAAMa,EAAAA,GAAKC,WAAAA,CAAYd,IAAAA,EAAMf,UAAAA,CAAAA;AAC7B,IAAA,OAAO,MAAA;AACNM,MAAAA,SAAAA,GAAY,IAAA;AACZwB,MAAAA,aAAAA,CAAcF,EAAAA,CAAAA;AACf,IAAA,CAAA;EACD,CAAA,EAAG;AAAC7B,IAAAA,MAAAA;AAAQC,IAAAA;AAAW,GAAA,CAAA;AAEvB,EAAA,OAAO;AAAEC,IAAAA,MAAAA;AAAQ7B,IAAAA;AAAM,GAAA;AACxB;AA3DgB0B,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;ACAhB,IAAMiC,OAAAA,GAAyB;EAC9BC,SAAAA,EAAW;IAAEC,KAAAA,EAAO,CAAA;IAAGC,QAAAA,EAAU;AAAK,GAAA;EACtCC,SAAAA,EAAW;IAAEF,KAAAA,EAAO;AAAE,GAAA;EACtBG,QAAAA,EAAU,IAAA;EACVhE,KAAAA,EAAO;AACR,CAAA;AAEO,SAASiE,cAAAA,CAAetC,MAAAA,EAA0BC,UAAAA,GAAa,GAAA,EAAK;AAC1E,EAAA,MAAM,CAAC9B,KAAAA,EAAOoE,QAAAA,CAAAA,GAAYnC,SAAwB4B,OAAAA,CAAAA;AAGlD,EAAA,MAAMQ,cAAcC,MAAAA,CAAO;AAC1BR,IAAAA,SAAAA,EAAWD,OAAAA,CAAQC,SAAAA;AACnBG,IAAAA,SAAAA,EAAWJ,OAAAA,CAAQI,SAAAA;AACnBC,IAAAA,QAAAA,EAAUL,OAAAA,CAAQK;GACnB,CAAA;AAEA/B,EAAAA,UAAU,MAAA;AACT,IAAA,IAAIC,SAAAA,GAAY,KAAA;AAChB,IAAA,MAAMmC,GAAAA,GAAMC,QAAQD,GAAAA,EAAG;AAEvB,IAAA,MAAM1B,uBAAO,MAAA,CAAA,YAAA;AACZ,MAAA,MAAM4B,KAAKJ,WAAAA,CAAYK,OAAAA;AACvB,MAAA,IAAIC,aAAAA,GAAgBF,GAAGX,SAAAA,CAAUC,KAAAA;AACjC,MAAA,IAAIC,QAAAA,GAAWS,GAAGX,SAAAA,CAAUE,QAAAA;AAC5B,MAAA,IAAIY,aAAAA,GAAgBH,GAAGR,SAAAA,CAAUF,KAAAA;AACjC,MAAA,IAAIc,eAAeJ,EAAAA,CAAGP,QAAAA;AACtB,MAAA,MAAMY,SAAmB,EAAA;AAEzB,MAAA,IAAI;AACH,QAAA,MAAMC,IAAAA,GAAO,MAAMlD,MAAAA,CAAOmD,QAAAA,CAASC,IAAAA,CAAK;UAAEC,KAAAA,EAAO,CAAA;UAAGC,OAAAA,EAAS,WAAA;UAAaC,QAAAA,EAAU;SAAO,CAAA;AAC3FT,QAAAA,aAAAA,GAAgBI,KAAKM,UAAAA,IAAc,CAAA;AACnCrB,QAAAA,QAAAA,GAAWe,IAAAA,CAAKjB,SAAAA,CAAU,CAAA,CAAA,EAAIwB,SAAAA,IAAa,IAAA;AAC5C,MAAA,CAAA,CAAA,OAAShC,GAAAA,EAAK;AACbwB,QAAAA,MAAAA,CAAOS,IAAAA,CAAK,cAAcjC,GAAAA,YAAeC,KAAAA,GAAQD,IAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA,CAAM,CAAA;AAC7E,MAAA;AAEA,MAAA,IAAI;AACH,QAAA,MAAMkC,KAAAA,GAAQ,MAAM3D,MAAAA,CAAO4D,QAAAA,CAASR,IAAAA,CAAK;UAAES,SAAAA,EAAWnB,GAAAA;UAAKW,KAAAA,EAAO;SAAE,CAAA;AACpEN,QAAAA,aAAAA,GAAgBY,KAAAA,CAAMG,KAAAA;AACvB,MAAA,CAAA,CAAA,OAASrC,GAAAA,EAAK;AACbwB,QAAAA,MAAAA,CAAOS,IAAAA,CAAK,cAAcjC,GAAAA,YAAeC,KAAAA,GAAQD,IAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA,CAAM,CAAA;AAC7E,MAAA;AAEA,MAAA,IAAI;AACH,QAAA,MAAMsC,GAAAA,GAAM,MAAM/D,MAAAA,CAAOqC,QAAAA,CAASpB,MAAAA,CAAO;UAAE4C,SAAAA,EAAWnB;SAAI,CAAA;AAC1DM,QAAAA,YAAAA,GAAe;AAAEgB,UAAAA,SAAAA,EAAWD,GAAAA,CAAIC,SAAAA;AAAWC,UAAAA,YAAAA,EAAcF,GAAAA,CAAIE;AAAa,SAAA;AAC3E,MAAA,CAAA,CAAA,OAASxC,GAAAA,EAAK;AACbwB,QAAAA,MAAAA,CAAOS,IAAAA,CAAK,aAAajC,GAAAA,YAAeC,KAAAA,GAAQD,IAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA,CAAM,CAAA;AAC5E,MAAA;AAEA,MAAA,IAAIlB,SAAAA,EAAW;AACd,QAAA;AACD,MAAA;AAEAiC,MAAAA,WAAAA,CAAYK,OAAAA,GAAU;QACrBZ,SAAAA,EAAW;UAAEC,KAAAA,EAAOY,aAAAA;AAAeX,UAAAA;AAAS,SAAA;QAC5CC,SAAAA,EAAW;UAAEF,KAAAA,EAAOa;AAAc,SAAA;QAClCV,QAAAA,EAAUW;AACX,OAAA;AAEAT,MAAAA,QAAAA,CAAS;QACRN,SAAAA,EAAW;UAAEC,KAAAA,EAAOY,aAAAA;AAAeX,UAAAA;AAAS,SAAA;QAC5CC,SAAAA,EAAW;UAAEF,KAAAA,EAAOa;AAAc,SAAA;QAClCV,QAAAA,EAAUW,YAAAA;AACV3E,QAAAA,KAAAA,EAAO4E,OAAOiB,MAAAA,GAAS,CAAA,GAAIjB,MAAAA,CAAOkB,IAAAA,CAAK,IAAA,CAAA,GAAQ;OAChD,CAAA;IACD,CAAA,EA9Ca,MAAA,CAAA;AAgDbnD,IAAAA,IAAAA,EAAAA;AACA,IAAA,MAAMa,EAAAA,GAAKC,WAAAA,CAAYd,IAAAA,EAAMf,UAAAA,CAAAA;AAC7B,IAAA,OAAO,MAAA;AACNM,MAAAA,SAAAA,GAAY,IAAA;AACZwB,MAAAA,aAAAA,CAAcF,EAAAA,CAAAA;AACf,IAAA,CAAA;EACD,CAAA,EAAG;AAAC7B,IAAAA,MAAAA;AAAQC,IAAAA;AAAW,GAAA,CAAA;AAEvB,EAAA,OAAO9B,KAAAA;AACR;AAvEgBmE,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;;;ACHhB,SAAS8B,cAAcC,EAAAA,EAAiB;AACvC,EAAA,IAAI,CAACA,EAAAA,EAAI;AACR,IAAA,OAAO,OAAA;AACR,EAAA;AACA,EAAA,MAAMC,MAAAA,GAASC,KAAKC,GAAAA,EAAG,GAAK,IAAID,IAAAA,CAAKF,EAAAA,EAAII,OAAAA,EAAO;AAChD,EAAA,MAAMC,IAAAA,GAAO/D,IAAAA,CAAKC,KAAAA,CAAM0D,MAAAA,GAAS,GAAA,CAAA;AACjC,EAAA,IAAII,OAAO,CAAA,EAAG;AACb,IAAA,OAAO,UAAA;AACR,EAAA;AACA,EAAA,IAAIA,OAAO,EAAA,EAAI;AACd,IAAA,OAAO,GAAGA,IAAAA,CAAAA,KAAAA,CAAAA;AACX,EAAA;AACA,EAAA,MAAMC,KAAAA,GAAQhE,IAAAA,CAAKC,KAAAA,CAAM8D,IAAAA,GAAO,EAAA,CAAA;AAChC,EAAA,IAAIC,QAAQ,EAAA,EAAI;AACf,IAAA,OAAO,GAAGA,KAAAA,CAAAA,KAAAA,CAAAA;AACX,EAAA;AACA,EAAA,OAAO,CAAA,EAAGhE,IAAAA,CAAKC,KAAAA,CAAM+D,KAAAA,GAAQ,EAAA,CAAA,CAAA,KAAA,CAAA;AAC9B;AAjBSP,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAmBF,SAASQ,cAAAA,CAAe,EAAE5E,MAAAA,EAAM,EAAuB;AAC7D,EAAA,MAAM,EAAEE,MAAAA,EAAQ7B,KAAAA,EAAOwG,aAAW,GAAK9E,gBAAAA,CAAiBC,QAAQ,GAAA,CAAA;AAChE,EAAA,MAAM,EAAEiC,WAAWG,SAAAA,EAAWC,QAAAA,EAAUhE,OAAOyG,SAAAA,EAAS,GAAKxC,cAAAA,CAAetC,MAAAA,EAAQ,GAAA,CAAA;AAEpF,EAAA,MAAM+E,OAAAA,GAAUpC,OAAAA,CAAQqC,MAAAA,CAAOD,OAAAA,IAAW,EAAA;AAC1C,EAAA,MAAME,aAAAA,GAAgB/E,QAAQR,OAAAA,IAAW,KAAA;AACzC,EAAA,MAAMwF,cAAchF,MAAAA,KAAW,IAAA;AAC/B,EAAA,MAAM7B,QAAQwG,WAAAA,IAAeC,SAAAA;AAE7B,EAAA,uBACC7F,KAACD,GAAAA,EAAAA;IAAIa,aAAAA,EAAc,QAAA;IAASsF,QAAAA,EAAU,CAAA;;AACrC,sBAAApG,IAACU,WAAAA,EAAAA;QAAYC,OAAAA,EAASuF;;AAGtB,sBAAAlG,IAACC,GAAAA,EAAAA;QAAIc,YAAAA,EAAc,CAAA;AAClB,QAAA,QAAA,kBAAAf,IAAC1B,KAAAA,EAAAA;AAAMH,UAAAA,KAAAA,EAAOgI,cAAc,OAAA,GAAU,KAAA;AACpCA,UAAAA,QAAAA,EAAAA,WAAAA,GAAc,kBAAA,GAAqB;;;MAKrC7G,KAAAA,oBACAU,IAACC,GAAAA,EAAAA;QAAIc,YAAAA,EAAc,CAAA;AAClB,QAAA,QAAA,kBAAAf,IAACqG,KAAAA,EAAAA;UAAMzF,OAAAA,EAAQ,OAAA;AAAStB,UAAAA,QAAAA,EAAAA;;;AAK1B,sBAAAY,KAACD,GAAAA,EAAAA;QAAIa,aAAAA,EAAekF,OAAAA,IAAW,MAAM,KAAA,GAAQ,QAAA;QAAUM,GAAAA,EAAK,CAAA;;AAE3D,0BAAApG,KAACD,GAAAA,EAAAA;YAAIa,aAAAA,EAAc,QAAA;YAASyF,QAAAA,EAAU,EAAA;;AACrC,8BAAAvG,IAACG,IAAAA,EAAAA;gBAAKqG,IAAAA,EAAI,IAAA;gBAACC,SAAAA,EAAS,IAAA;AAAC,gBAAA,QAAA,EAAA;;cAGpBtF,MAAAA,mBACAjB,KAAAwG,QAAA,EAAA;;AACC,kCAAAxG,KAACC,IAAAA,EAAAA;;AAAK,sBAAA,MAAA;AACD,sCAAAH,IAACG,IAAAA,EAAAA;AAAKhC,wBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;kCAAU8C,MAAAA,CAAOgB;;;;AAEhD,kCAAAjC,KAACC,IAAAA,EAAAA;;AAAK,sBAAA,SAAA;AACE,sCAAAH,IAACG,IAAAA,EAAAA;AAAKhC,wBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;kCAAU8C,MAAAA,CAAOiB;;;;AAEnD,kCAAAlC,KAACC,IAAAA,EAAAA;;AAAK,sBAAA,SAAA;AACE,sCAAAD,KAACC,IAAAA,EAAAA;wBAAKwG,QAAAA,EAAQ,IAAA;;0BAAExF,MAAAA,CAAOmB,QAAAA;AAAS,0BAAA;;;;;AAExC,kCAAApC,KAACC,IAAAA,EAAAA;;AAAK,sBAAA,QAAA;AACC,sCAAAH,IAACG,IAAAA,EAAAA;wBAAKwG,QAAAA,EAAQ,IAAA;kCAAExF,MAAAA,CAAOkB;;;;;AAI/B,eAAA,CAAA,mBAAArC,IAAChC,OAAAA,EAAAA;gBAAQ4I,KAAAA,EAAM;;;;AAKjB,0BAAA1G,KAACD,GAAAA,EAAAA;YAAIa,aAAAA,EAAc,QAAA;YAASyF,QAAAA,EAAU,EAAA;;AACrC,8BAAAvG,IAACG,IAAAA,EAAAA;gBAAKqG,IAAAA,EAAI,IAAA;gBAACC,SAAAA,EAAS,IAAA;AAAC,gBAAA,QAAA,EAAA;;AAGrB,8BAAAvG,KAACC,IAAAA,EAAAA;;AAAK,kBAAA,YAAA;AACK,kCAAAH,IAACG,IAAAA,EAAAA;AAAKhC,oBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;8BAAU6E,SAAAA,CAAUC;;;;AAEzD,8BAAAjD,KAACC,IAAAA,EAAAA;;AAAK,kBAAA,YAAA;AACK,kCAAAH,IAACG,IAAAA,EAAAA;oBAAKwG,QAAAA,EAAQ,IAAA;AAAEtB,oBAAAA,QAAAA,EAAAA,aAAAA,CAAcnC,UAAUE,QAAQ;;;;AAE3D,8BAAAlD,KAACC,IAAAA,EAAAA;;AAAK,kBAAA,YAAA;AACK,kCAAAH,IAACG,IAAAA,EAAAA;AAAKhC,oBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;8BAAUgF,SAAAA,CAAUF;;;;;;AAK1D,0BAAAjD,KAACD,GAAAA,EAAAA;YAAIa,aAAAA,EAAc,QAAA;YAASyF,QAAAA,EAAU,EAAA;;AACrC,8BAAAvG,IAACG,IAAAA,EAAAA;gBAAKqG,IAAAA,EAAI,IAAA;gBAACC,SAAAA,EAAS,IAAA;AAAC,gBAAA,QAAA,EAAA;;cAGpBnD,QAAAA,mBACApD,KAAAwG,QAAA,EAAA;;AACC,kCAAAxG,KAACC,IAAAA,EAAAA;;AAAK,sBAAA,gBAAA;AACS,sCAAAH,IAACG,IAAAA,EAAAA;wBAAKwG,QAAAA,EAAQ,IAAA;kCAAErD,QAAAA,CAAS2B;;;;AAExC,kCAAA/E,KAACD,GAAAA,EAAAA;;AACA,sCAAAD,IAACG,IAAAA,EAAAA;AAAK,wBAAA,QAAA,EAAA;;AACN,sCAAAH,IAACtB,WAAAA,EAAAA;AAAYmI,wBAAAA,KAAAA,EAAOjF,IAAAA,CAAKW,KAAAA,CAAMe,QAAAA,CAAS4B,YAAAA,GAAe,GAAA;;AACvD,sCAAAhF,KAACC,IAAAA,EAAAA;;AACC,0BAAA,GAAA;AACD,0CAAAD,KAACC,IAAAA,EAAAA;4BAAKwG,QAAAA,EAAQ,IAAA;;8BAAE/E,IAAAA,CAAKW,KAAAA,CAAMe,QAAAA,CAAS4B,YAAAA,GAAe,GAAA,CAAA;AAAK,8BAAA;;;;;;;;AAK3D,eAAA,CAAA,mBAAAlF,IAACG,IAAAA,EAAAA;gBAAKwG,QAAAA,EAAQ,IAAA;AAAC,gBAAA,QAAA,EAAA;;;;;;AAMlB,sBAAA3G,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;;;AAInB;AArGgBd,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;ACNT,SAASkB,cAAAA,CAAe,EAAE9F,MAAAA,EAAM,EAAuB;AAC7D,EAAA,MAAM,CAACoC,SAAAA,EAAW2D,YAAAA,CAAAA,GAAgB3F,QAAAA,CAAyB,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC0D,KAAAA,EAAOkC,QAAAA,CAAAA,GAAY5F,SAAS,CAAA,CAAA;AACnC,EAAA,MAAM,CAAC6F,SAAAA,EAAWC,YAAAA,CAAAA,GAAgB9F,SAAS,IAAA,CAAA;AAC3C,EAAA,MAAM,CAAC/B,KAAAA,EAAOgC,QAAAA,CAAAA,GAAYD,SAAwB,IAAA,CAAA;AAClD,EAAA,MAAM,CAAC+F,MAAAA,EAAQC,SAAAA,CAAAA,GAAahG,SAAqB,KAAA,CAAA;AACjD,EAAA,MAAM,CAACiG,cAAAA,EAAgBC,iBAAAA,CAAAA,GAAqBlG,SAAS,KAAA,CAAA;AACrD,EAAA,MAAMmG,UAAAA,GAAa9D,OAAO,KAAA,CAAA;AAE1BnC,EAAAA,UAAU,MAAA;AACT,IAAA,IAAIiG,WAAW1D,OAAAA,EAAS;AACvB,MAAA;AACD,IAAA;AACA0D,IAAAA,UAAAA,CAAW1D,OAAAA,GAAU,IAAA;AACrB,IAAA,IAAItC,SAAAA,GAAY,KAAA;AAChB,IAAA,MAAMmC,GAAAA,GAAMC,QAAQD,GAAAA,EAAG;AAEvB,IAAA,MAAM8D,uBAAO,MAAA,CAAA,YAAA;AACZN,MAAAA,YAAAA,CAAa,IAAA,CAAA;AACb,MAAA,IAAI;AACH,QAAA,MAAMO,MAAAA,GAAS,MAAMzG,MAAAA,CAAO4D,QAAAA,CAASR,IAAAA,CAAK;UACzCS,SAAAA,EAAWnB,GAAAA;UACXW,KAAAA,EAAO;SACR,CAAA;AACA,QAAA,IAAI9C,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACA,QAAA,MAAMmG,KAAAA,GAAwBD,MAAAA,CAAOrE,SAAAA,CAAUuE,GAAAA,CAAI,CAACC,CAAAA,MAAO;AAC1DC,UAAAA,IAAAA,EAAMD,CAAAA,CAAEC,IAAAA;AACRC,UAAAA,OAAAA,EAASF,CAAAA,CAAEE,OAAAA;AACXC,UAAAA,MAAAA,EAAQH,CAAAA,CAAEG;SACX,CAAA,CAAA;AACAhB,QAAAA,YAAAA,CAAaW,KAAAA,CAAAA;AACbV,QAAAA,QAAAA,CAASS,OAAO3C,KAAK,CAAA;AACrBzD,QAAAA,QAAAA,CAAS,IAAA,CAAA;AACV,MAAA,CAAA,CAAA,OAASoB,GAAAA,EAAK;AACb,QAAA,IAAIlB,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACAF,QAAAA,QAAAA,CAASoB,eAAeC,KAAAA,GAAQD,GAAAA,CAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;MACtD,CAAA,SAAA;AACC,QAAA,IAAI,CAAClB,SAAAA,EAAW;AACf2F,UAAAA,YAAAA,CAAa,KAAA,CAAA;AACd,QAAA;AACD,MAAA;IACD,CAAA,EA5Ba,MAAA,CAAA;AA8BbM,IAAAA,IAAAA,EAAAA;AACA,IAAA,OAAO,MAAA;AACNjG,MAAAA,SAAAA,GAAY,IAAA;AACb,IAAA,CAAA;EACD,CAAA,EAAG;AAACP,IAAAA;AAAO,GAAA,CAAA;AAGXgH,EAAAA,QAAAA,CAAS,CAACC,KAAAA,KAAAA;AACT,IAAA,IAAIA,UAAU,GAAA,EAAK;AAClBX,MAAAA,iBAAAA,CAAkB,CAACY,CAAAA,KAAM,CAACA,CAAAA,CAAAA;AAC3B,IAAA;EACD,CAAA,CAAA;AAEA,EAAA,MAAMC,QAAAA,GAAW/E,SAAAA,CAAU+D,MAAAA,CAAO,CAACS,CAAAA,KAAAA;AAClC,IAAA,IAAIT,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO,IAAA;AACR,IAAA;AAEA,IAAA,OAAOS,CAAAA,CAAEG,OAAO7C,MAAAA,GAAS,CAAA;EAC1B,CAAA,CAAA;AAEA,EAAA,MAAMkD,aAAAA,GAA6D;AAClE,IAAA;MAAEzB,KAAAA,EAAO,eAAA;MAAiBC,KAAAA,EAAO;AAAM,KAAA;AACvC,IAAA;MAAED,KAAAA,EAAO,kBAAA;MAAoBC,KAAAA,EAAO;AAAS;;AAG9C,EAAA,uBACC3G,KAACD,GAAAA,EAAAA;IAAIa,aAAAA,EAAc,QAAA;IAASsF,QAAAA,EAAU,CAAA;;AACrC,sBAAAlG,KAACD,GAAAA,EAAAA;QAAIqG,GAAAA,EAAK,CAAA;QAAGvF,YAAAA,EAAc,CAAA;;AAC1B,0BAAAb,KAACC,IAAAA,EAAAA;YAAKqG,IAAAA,EAAI,IAAA;;AAAC,cAAA,aAAA;AAAYzB,cAAAA,KAAAA;AAAM,cAAA;;;AAC7B,0BAAA7E,KAACC,IAAAA,EAAAA;YAAKwG,QAAAA,EAAQ,IAAA;;AAAC,cAAA,cAAA;AAAaS,cAAAA,MAAAA;AAAO,cAAA;;;;;MAGnC9H,KAAAA,oBACAU,IAACC,GAAAA,EAAAA;QAAIc,YAAAA,EAAc,CAAA;AAClB,QAAA,QAAA,kBAAAf,IAACqG,KAAAA,EAAAA;UAAMzF,OAAAA,EAAQ,OAAA;AAAStB,UAAAA,QAAAA,EAAAA;;;MAIzB4H,SAAAA,oBAAalH,IAAChC,OAAAA,EAAAA;QAAQ4I,KAAAA,EAAM;;MAE5B,CAACM,SAAAA,IAAa7D,UAAU8B,MAAAA,KAAW,CAAA,IAAK,CAAC7F,KAAAA,oBACzCU,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;MAMhBW,cAAAA,mBACApH,KAACD,GAAAA,EAAAA;QAAIa,aAAAA,EAAc,QAAA;QAASC,YAAAA,EAAc,CAAA;;AACzC,0BAAAf,IAACG,IAAAA,EAAAA;AAAK,YAAA,QAAA,EAAA;;AACN,0BAAAH,IAACsI,MAAAA,EAAAA;YACAC,OAAAA,EAASF,aAAAA;AACTG,YAAAA,QAAAA,0BAAWL,CAAAA,KAAAA;AACVd,cAAAA,SAAAA,CAAUc,CAAAA,CAAAA;AACVZ,cAAAA,iBAAAA,CAAkB,KAAA,CAAA;YACnB,CAAA,EAHU,UAAA;;;AAOZ,OAAA,CAAA,GAAA,CAACL,aACDkB,QAAAA,CAASjD,MAAAA,GAAS,CAAA,oBACjBjF,KAACuI,aAAAA,EAAAA;;AACCL,UAAAA,QAAAA,CAASM,MAAM,CAAA,EAAG,EAAA,CAAA,CAAId,GAAAA,CAAI,CAACC,CAAAA,EAAGc,CAAAA;;4BAE9B3I,GAAAA,CAACyI,cAAcG,IAAAA,EAAI;AAClB,cAAA,QAAA,kBAAA1I,KAACC,IAAAA,EAAAA;;AACA,kCAAAH,IAACG,IAAAA,EAAAA;oBAAKqG,IAAAA,EAAI,IAAA;8BAAEqB,CAAAA,CAAEC;;AACd,kCAAA5H,KAACC,IAAAA,EAAAA;oBAAKwG,QAAAA,EAAQ,IAAA;;AACZ,sBAAA,GAAA;AAAI,sBAAA,IAAA;sBACFkB,CAAAA,CAAEE,OAAAA,CAAQ5C,MAAAA,GAAS,EAAA,GAAK,CAAA,EAAG0C,CAAAA,CAAEE,OAAAA,CAAQW,KAAAA,CAAM,CAAA,EAAG,EAAA,CAAA,CAAA,MAAA,CAAA,GAASb,CAAAA,CAAEE;;;;;AALtC,aAAA,EAAA,CAAA,EAAGF,CAAAA,CAAEC,IAAI,CAAA,CAAA,EAAIa,CAAAA,CAAAA,CAAG;AAAA,WAAA,CAAA;AAUzCP,UAAAA,QAAAA,CAASjD,MAAAA,GAAS,EAAA,oBAClBnF,GAAAA,CAACyI,cAAcG,IAAAA,EAAI;AAClB,YAAA,QAAA,kBAAA1I,KAACC,IAAAA,EAAAA;cAAKwG,QAAAA,EAAQ,IAAA;;AAAC,gBAAA,SAAA;AAAQyB,gBAAAA,QAAAA,CAASjD,MAAAA,GAAS,EAAA;AAAG,gBAAA;;;;;;AAOjD,sBAAAnF,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;;;AAInB;AAzIgBI,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;ACIhB,SAAS8B,sBAAsBC,SAAAA,EAAiB;AAC/C,EAAA,MAAMvD,MAAAA,GAASC,KAAKC,GAAAA,EAAG,GAAK,IAAID,IAAAA,CAAKsD,SAAAA,EAAWpD,OAAAA,EAAO;AACvD,EAAA,MAAMC,IAAAA,GAAO/D,IAAAA,CAAKC,KAAAA,CAAM0D,MAAAA,GAAS,GAAA,CAAA;AACjC,EAAA,MAAMK,KAAAA,GAAQhE,IAAAA,CAAKC,KAAAA,CAAM8D,IAAAA,GAAO,EAAA,CAAA;AAChC,EAAA,IAAIC,QAAQ,CAAA,EAAG;AACd,IAAA,OAAO,CAAA,EAAGA,KAAAA,CAAAA,EAAAA,EAAUD,IAAAA,GAAO,EAAA,CAAA,CAAA,CAAA;AAC5B,EAAA;AACA,EAAA,OAAO,GAAGA,IAAAA,CAAAA,CAAAA,CAAAA;AACX;AARSkD,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AAkBT,SAASE,WAAAA,CAAY,EAAEC,OAAAA,EAAO,EAAoB;AACjD,EAAA,uBACC9I,KAACD,GAAAA,EAAAA;IAAIa,aAAAA,EAAc,QAAA;IAASmI,WAAAA,EAAY,OAAA;IAAQ7C,QAAAA,EAAU,CAAA;IAAGrF,YAAAA,EAAc,CAAA;;AAC1E,sBAAAb,KAACC,IAAAA,EAAAA;;AAAK,UAAA,KAAA;AACF,0BAAAD,KAACC,IAAAA,EAAAA;YAAKqG,IAAAA,EAAI,IAAA;;cAAEwC,OAAAA,CAAQlG,EAAAA,CAAG4F,KAAAA,CAAM,CAAA,EAAG,EAAA,CAAA;AAAI,cAAA;;;;;AAExC,sBAAAxI,KAACC,IAAAA,EAAAA;;AAAK,UAAA,WAAA;AACI,0BAAAH,IAACG,IAAAA,EAAAA;AAAKhC,YAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;AAAUwK,YAAAA,QAAAA,EAAAA,qBAAAA,CAAsBG,QAAQF,SAAS;;;;AAGrF,sBAAA5I,KAACC,IAAAA,EAAAA;;AAAK,UAAA,UAAA;AACG,0BAAAH,IAACG,IAAAA,EAAAA;YAAKwG,QAAAA,EAAQ,IAAA;AAAE,YAAA,QAAA,EAAA,IAAInB,IAAAA,CAAKwD,OAAAA,CAAQF,SAAS,CAAA,CAAEI,kBAAAA;;;;;;AAIxD;AAfSH,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAqBT,SAASI,wBAAAA,CAAyB,EAAEC,IAAAA,EAAI,EAAiC;AACxE,EAAA,IAAI,CAACA,IAAAA,EAAM;AACV,IAAA,OAAO,IAAA;AACR,EAAA;AACA,EAAA,uBACClJ,KAACD,GAAAA,EAAAA;IAAI6G,SAAAA,EAAW,CAAA;IAAGhG,aAAAA,EAAc,QAAA;;AAChC,sBAAAd,IAACG,IAAAA,EAAAA;QAAKwG,QAAAA,EAAQ,IAAA;AAAC,QAAA,QAAA,EAAA;;AACf,sBAAA3G,IAACG,IAAAA,EAAAA;QAAKwG,QAAAA,EAAQ,IAAA;AAAC,QAAA,QAAA,EAAA;;AACf,sBAAA3G,IAACG,IAAAA,EAAAA;QAAKwG,QAAAA,EAAQ,IAAA;AAAC,QAAA,QAAA,EAAA;;;;AAGlB;AAXSwC,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AA0BT,SAASE,gBAAAA,CAAiBpI,QAA0B0C,GAAAA,EAAW;AAC9D,EAAA,MAAM,CAACqF,OAAAA,EAASM,UAAAA,CAAAA,GAAcjI,SAA6B,IAAA,CAAA;AAC3D,EAAA,MAAM,CAAC6F,SAAAA,EAAWC,YAAAA,CAAAA,GAAgB9F,SAAS,IAAA,CAAA;AAC3C,EAAA,MAAM,CAAC/B,KAAAA,EAAOgC,QAAAA,CAAAA,GAAYD,SAAwB,IAAA,CAAA;AAClD,EAAA,MAAM,CAACkI,kBAAAA,EAAoBC,qBAAAA,CAAAA,GAAyBnI,SAAS,KAAA,CAAA;AAE7DE,EAAAA,UAAU,MAAA;AACT,IAAA,IAAIC,SAAAA,GAAY,KAAA;AAChB,IAAA,MAAMiG,uBAAO,MAAA,CAAA,YAAA;AACZN,MAAAA,YAAAA,CAAa,IAAA,CAAA;AACb,MAAA,IAAI;AACH,QAAA,MAAMsC,QAAAA,GAAW,MAAMxI,MAAAA,CAAO+H,OAAAA,CAAQlF,OAAAA,CAAQ;UAAE4F,aAAAA,EAAe/F;SAAI,CAAA;AACnE,QAAA,IAAInC,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AAEA,QAAA,MAAMmI,cAAAA,GACLF,YAAY,OAAOA,QAAAA,KAAa,YAAY,SAAA,IAAaA,QAAAA,GACrDA,SAAuCT,OAAAA,GACxCS,QAAAA;AACJ,QAAA,IAAIE,cAAAA,EAAgB;AACnBL,UAAAA,UAAAA,CAAW;AACVxG,YAAAA,EAAAA,EAAI6G,cAAAA,CAAe7G,EAAAA;AACnBgG,YAAAA,SAAAA,EAAWa,cAAAA,CAAeb;WAC3B,CAAA;QACD,CAAA,MAAO;AACNQ,UAAAA,UAAAA,CAAW,IAAA,CAAA;AACZ,QAAA;AACD,MAAA,CAAA,CAAA,OAAS5G,GAAAA,EAAK;AACb,QAAA,IAAIlB,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACA,QAAA,MAAMoI,MAAMlH,GAAAA,YAAeC,KAAAA,GAAQD,GAAAA,CAAIE,OAAAA,GAAUC,OAAOH,GAAAA,CAAAA;AAExD,QAAA,IAAIkH,GAAAA,CAAIC,QAAAA,CAAS,WAAA,CAAA,IAAgBD,GAAAA,CAAIC,QAAAA,CAAS,iBAAA,CAAA,IAAsBD,GAAAA,CAAIC,QAAAA,CAAS,QAAA,CAAA,EAAW;AAC3FL,UAAAA,qBAAAA,CAAsB,IAAA,CAAA;QACvB,CAAA,MAAO;AACNlI,UAAAA,QAAAA,CAASsI,GAAAA,CAAAA;AACV,QAAA;MACD,CAAA,SAAA;AACC,QAAA,IAAI,CAACpI,SAAAA,EAAW;AACf2F,UAAAA,YAAAA,CAAa,KAAA,CAAA;AACd,QAAA;AACD,MAAA;IACD,CAAA,EApCa,MAAA,CAAA;AAqCbM,IAAAA,IAAAA,EAAAA;AACA,IAAA,OAAO,MAAA;AACNjG,MAAAA,SAAAA,GAAY,IAAA;AACb,IAAA,CAAA;EACD,CAAA,EAAG;AAACP,IAAAA,MAAAA;AAAQ0C,IAAAA;AAAI,GAAA,CAAA;AAEhB,EAAA,OAAO;AAAEqF,IAAAA,OAAAA;AAASM,IAAAA,UAAAA;AAAYpC,IAAAA,SAAAA;AAAW5H,IAAAA,KAAAA;AAAOgC,IAAAA,QAAAA;AAAUiI,IAAAA;AAAmB,GAAA;AAC9E;AApDSF,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAgET,SAASS,iBAAAA,CACR7I,MAAAA,EACA0C,GAAAA,EACAqF,OAAAA,EACAM,YACAhI,QAAAA,EAAoC;AAEpC,EAAA,MAAM,CAACyI,QAAAA,EAAUC,WAAAA,CAAAA,GAAe3I,SAA0B,UAAA,CAAA;AAC1D,EAAA,MAAM,CAAC4I,aAAAA,EAAeC,gBAAAA,CAAAA,GAAoB7I,SAAwB,IAAA,CAAA;AAClE,EAAA,MAAM8I,YAAAA,GAAezG,OAAO,IAAA,CAAA;AAE5BnC,EAAAA,UAAU,MAAA;AACT4I,IAAAA,YAAAA,CAAarG,OAAAA,GAAU,IAAA;AACvB,IAAA,OAAO,MAAA;AACNqG,MAAAA,YAAAA,CAAarG,OAAAA,GAAU,KAAA;AACxB,IAAA,CAAA;AACD,EAAA,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMsG,YAAAA,iCAAsBpC,MAAAA,KAAAA;AAC3B,IAAA,IAAIA,WAAW,MAAA,EAAQ;AACtBgC,MAAAA,WAAAA,CAAY,UAAA,CAAA;AACZ,MAAA;AACD,IAAA;AACAA,IAAAA,WAAAA,CAAY,SAAA,CAAA;AACZ,IAAA,IAAIhC,WAAW,OAAA,EAAS;AACvB,MAAA,IAAI;AACH,QAAA,MAAMN,MAAAA,GAAS,MAAMzG,MAAAA,CAAO+H,OAAAA,CAAQqB,KAAAA,CAAM;UAAEX,aAAAA,EAAe/F;SAAI,CAAA;AAC/D,QAAA,IAAI,CAACwG,aAAarG,OAAAA,EAAS;AAC1B,UAAA;AACD,QAAA;AACA,QAAA,IAAI4D,QAAQ5E,EAAAA,EAAI;AACfwG,UAAAA,UAAAA,CAAW;AAAExG,YAAAA,EAAAA,EAAI4E,MAAAA,CAAO5E,EAAAA;AAAIgG,YAAAA,SAAAA,EAAWpB,MAAAA,CAAOoB;WAAU,CAAA;AACxDoB,UAAAA,gBAAAA,CAAiB,kBAAA,CAAA;AAClB,QAAA;AACD,MAAA,CAAA,CAAA,OAASxH,GAAAA,EAAK;AACb,QAAA,IAAI,CAACyH,aAAarG,OAAAA,EAAS;AAC1B,UAAA;AACD,QAAA;AACAxC,QAAAA,QAAAA,CAASoB,eAAeC,KAAAA,GAAQD,GAAAA,CAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;MACtD,CAAA,SAAA;AACC,QAAA,IAAIyH,aAAarG,OAAAA,EAAS;AACzBkG,UAAAA,WAAAA,CAAY,UAAA,CAAA;AACb,QAAA;AACD,MAAA;AACD,IAAA;AACA,IAAA,IAAIhC,MAAAA,KAAW,SAASgB,OAAAA,EAAS;AAChC,MAAA,IAAI;AACH,QAAA,MAAM/H,MAAAA,CAAO+H,QAAQsB,GAAAA,CAAI;AAAEC,UAAAA,SAAAA,EAAWvB,OAAAA,CAAQlG;SAAG,CAAA;AACjD,QAAA,IAAI,CAACqH,aAAarG,OAAAA,EAAS;AAC1B,UAAA;AACD,QAAA;AACAwF,QAAAA,UAAAA,CAAW,IAAA,CAAA;AACXY,QAAAA,gBAAAA,CAAiB,kEAAA,CAAA;AAClB,MAAA,CAAA,CAAA,OAASxH,GAAAA,EAAK;AACb,QAAA,IAAI,CAACyH,aAAarG,OAAAA,EAAS;AAC1B,UAAA;AACD,QAAA;AACAxC,QAAAA,QAAAA,CAASoB,eAAeC,KAAAA,GAAQD,GAAAA,CAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;MACtD,CAAA,SAAA;AACC,QAAA,IAAIyH,aAAarG,OAAAA,EAAS;AACzBkG,UAAAA,WAAAA,CAAY,UAAA,CAAA;AACb,QAAA;AACD,MAAA;AACD,IAAA;EACD,CAAA,EA9CqB,cAAA,CAAA;AAgDrB,EAAA,OAAO;AAAED,IAAAA,QAAAA;AAAUE,IAAAA,aAAAA;AAAeG,IAAAA;AAAa,GAAA;AAChD;AAnESN,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAyEF,SAASU,YAAAA,CAAa,EAAEvJ,MAAAA,EAAM,EAAqB;AACzD,EAAA,MAAM0C,GAAAA,GAAMC,QAAQD,GAAAA,EAAG;AACvB,EAAA,MAAM,EAAEqF,OAAAA,EAASM,UAAAA,EAAYpC,SAAAA,EAAW5H,KAAAA,EAAOgC,UAAUiI,kBAAAA,EAAkB,GAAKF,gBAAAA,CAAiBpI,MAAAA,EAAQ0C,GAAAA,CAAAA;AACzG,EAAA,MAAM,EAAEoG,QAAAA,EAAUE,aAAAA,EAAeG,YAAAA,EAAY,GAAKN,kBAAkB7I,MAAAA,EAAQ0C,GAAAA,EAAKqF,OAAAA,EAASM,UAAAA,EAAYhI,QAAAA,CAAAA;AAEtG,EAAA,MAAMmJ,iBAAiBzB,OAAAA,GACpB;AACA,IAAA;MAAEpC,KAAAA,EAAO,+BAAA;MAAiCC,KAAAA,EAAO;AAAM,KAAA;AACvD,IAAA;MAAED,KAAAA,EAAO,WAAA;MAAaC,KAAAA,EAAO;AAAO;AAEpC,GAAA,GAAA;AACA,IAAA;MAAED,KAAAA,EAAO,mBAAA;MAAqBC,KAAAA,EAAO;AAAQ,KAAA;AAC7C,IAAA;MAAED,KAAAA,EAAO,WAAA;MAAaC,KAAAA,EAAO;AAAO;;AAGvC,EAAA,uBACC3G,KAACD,GAAAA,EAAAA;IAAIa,aAAAA,EAAc,QAAA;IAASsF,QAAAA,EAAU,CAAA;;AACrC,sBAAApG,IAACG,IAAAA,EAAAA;QAAKqG,IAAAA,EAAI,IAAA;AAAC,QAAA,QAAA,EAAA;;MAEVU,SAAAA,oBAAalH,IAAChC,OAAAA,EAAAA;QAAQ4I,KAAAA,EAAM;;AAE7B,sBAAA5G,IAACmJ,wBAAAA,EAAAA;QAAyBC,IAAAA,EAAMG;;MAE/BjK,KAAAA,oBACAU,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACqG,KAAAA,EAAAA;UAAMzF,OAAAA,EAAQ,OAAA;AAAStB,UAAAA,QAAAA,EAAAA;;;AAIzB2K,MAAAA,aAAAA,IAAiB,CAAC3K,KAAAA,oBAClBU,GAAAA,CAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACqG,KAAAA,EAAAA;UAAMzF,OAAAA,EAAQ,SAAA;AAAWqJ,UAAAA,QAAAA,EAAAA;;;AAI3B,MAAA,CAAC/C,SAAAA,IAAa,CAACqC,kBAAAA,oBACfrJ,KAACD,GAAAA,EAAAA;QAAIa,aAAAA,EAAc,QAAA;QAASgG,SAAAA,EAAW,CAAA;;UACrCkC,OAAAA,mBACAhJ,IAAC+I,WAAAA,EAAAA;AAAYC,YAAAA;AAEb,WAAA,CAAA,mBAAAhJ,IAACC,GAAAA,EAAAA;YAAIc,YAAAA,EAAc,CAAA;AAClB,YAAA,QAAA,kBAAAf,IAACG,IAAAA,EAAAA;cAAKwG,QAAAA,EAAQ,IAAA;AAAC,cAAA,QAAA,EAAA;;;UAGhBoD,QAAAA,KAAa,SAAA,mBACb/J,GAAAA,CAAChC,OAAAA,EAAAA;YAAQ4I,KAAAA,EAAM;AAEf,WAAA,CAAA,mBAAA5G,IAACsI,MAAAA,EAAAA;YAAOC,OAAAA,EAASkC,cAAAA;YAAgBjC,QAAAA,EAAU4B;;;;AAK9C,sBAAApK,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;;;AAInB;AAzDgB6D,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AC3MhB,SAASE,mBAAmBpF,EAAAA,EAAU;AACrC,EAAA,MAAMtD,CAAAA,GAAI,IAAIwD,IAAAA,CAAKF,EAAAA,CAAAA;AACnB,EAAA,OAAOtD,CAAAA,CAAE2I,eAAe,OAAA,EAAS;IAChCC,KAAAA,EAAO,OAAA;IACPC,GAAAA,EAAK,SAAA;IACLC,IAAAA,EAAM,SAAA;IACNC,MAAAA,EAAQ;GACT,CAAA;AACD;AARSL,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAcF,SAASM,aAAAA,CAAc,EAAE/J,MAAAA,EAAM,EAAsB;AAC3D,EAAA,MAAM,CAACiC,SAAAA,EAAW+H,YAAAA,CAAAA,GAAgB5J,QAAAA,CAAyB,EAAE,CAAA;AAC7D,EAAA,MAAM,CAACoD,UAAAA,EAAYyG,aAAAA,CAAAA,GAAiB7J,SAAS,CAAA,CAAA;AAC7C,EAAA,MAAM,CAAC6F,SAAAA,EAAWC,YAAAA,CAAAA,GAAgB9F,SAAS,IAAA,CAAA;AAC3C,EAAA,MAAM,CAAC/B,KAAAA,EAAOgC,QAAAA,CAAAA,GAAYD,SAAwB,IAAA,CAAA;AAClD,EAAA,MAAM,CAAC0I,QAAAA,EAAUC,WAAAA,CAAAA,GAAe3I,SAAmB,MAAA,CAAA;AACnD,EAAA,MAAM,CAAC8J,UAAAA,EAAYC,aAAAA,CAAAA,GAAiB/J,SAAwB,IAAA,CAAA;AAC5D,EAAA,MAAM,CAACgK,YAAAA,EAAcC,eAAAA,CAAAA,GAAmBjK,SAAwB,IAAA,CAAA;AAChE,EAAA,MAAM,CAACkK,IAAAA,EAAMC,OAAAA,CAAAA,GAAWnK,SAAS,CAAA,CAAA;AACjC,EAAA,MAAMmG,UAAAA,GAAa9D,OAAO,KAAA,CAAA;AAE1B,EAAA,MAAM+H,SAAAA,GAAY,EAAA;AAGlBlK,EAAAA,UAAU,MAAA;AACT,IAAA,IAAIiG,UAAAA,CAAW1D,OAAAA,IAAWyH,IAAAA,KAAS,CAAA,EAAG;AACrC,MAAA;AACD,IAAA;AACA/D,IAAAA,UAAAA,CAAW1D,OAAAA,GAAU,IAAA;AACrB,IAAA,IAAItC,SAAAA,GAAY,KAAA;AAEhB,IAAA,MAAMiG,uBAAO,MAAA,CAAA,YAAA;AACZN,MAAAA,YAAAA,CAAa,IAAA,CAAA;AACb,MAAA,IAAI;AACH,QAAA,MAAMO,MAAAA,GAAS,MAAMzG,MAAAA,CAAOmD,QAAAA,CAASC,IAAAA,CAAK;UACzCC,KAAAA,EAAOmH,SAAAA;AACPC,UAAAA,MAAAA,EAAQH,IAAAA,GAAO,CAAA,GAAI1I,MAAAA,CAAO0I,IAAAA,GAAOE,SAAAA,CAAAA,GAAahN,KAAAA,CAAAA;UAC9C8F,OAAAA,EAAS,WAAA;UACTC,QAAAA,EAAU;SACX,CAAA;AACA,QAAA,IAAIhD,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACA,QAAA,MAAMmG,KAAAA,GAAwBD,MAAAA,CAAOxE,SAAAA,CAAU0E,GAAAA,CAAI,CAACjG,CAAAA,MAAO;AAC1DmB,UAAAA,EAAAA,EAAInB,CAAAA,CAAEmB,EAAAA;AACN6I,UAAAA,YAAAA,EAAchK,CAAAA,CAAEgK,YAAAA;AAChBC,UAAAA,QAAAA,EAAUjK,CAAAA,CAAEiK,QAAAA;AACZ7D,UAAAA,OAAAA,EAASpG,CAAAA,CAAEoG,OAAAA;AACXrD,UAAAA,SAAAA,EAAW/C,CAAAA,CAAE+C;SACd,CAAA,CAAA;AACAuG,QAAAA,YAAAA,CAAa,CAACY,IAAAA,KAAUN,IAAAA,KAAS,CAAA,GAAI5D,KAAAA,GAAQ;AAAIkE,UAAAA,GAAAA,IAAAA;AAASlE,UAAAA,GAAAA;AAAM,SAAA,CAAA;AAChEuD,QAAAA,aAAAA,CAAcxD,MAAAA,CAAOjD,UAAAA,IAAciD,MAAAA,CAAOxE,SAAAA,CAAUiC,MAAM,CAAA;AAC1D7D,QAAAA,QAAAA,CAAS,IAAA,CAAA;AACV,MAAA,CAAA,CAAA,OAASoB,GAAAA,EAAK;AACb,QAAA,IAAIlB,SAAAA,EAAW;AACd,UAAA;AACD,QAAA;AACAF,QAAAA,QAAAA,CAASoB,eAAeC,KAAAA,GAAQD,GAAAA,CAAIE,OAAAA,GAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;MACtD,CAAA,SAAA;AACC,QAAA,IAAI,CAAClB,SAAAA,EAAW;AACf2F,UAAAA,YAAAA,CAAa,KAAA,CAAA;AACd,QAAA;AACD,MAAA;IACD,CAAA,EAhCa,MAAA,CAAA;AAkCbM,IAAAA,IAAAA,EAAAA;AACA,IAAA,OAAO,MAAA;AACNjG,MAAAA,SAAAA,GAAY,IAAA;AACb,IAAA,CAAA;EACD,CAAA,EAAG;AAACP,IAAAA,MAAAA;AAAQsK,IAAAA;AAAK,GAAA,CAAA;AAGjB,EAAA,MAAMO,eAAAA,GAAkB;OACpB5I,SAAAA,CAAU0E,GAAAA,CAAI,CAACjG,CAAAA,MAAO;MACxBiF,KAAAA,EAAO,CAAA,EAAG8D,kBAAAA,CAAmB/I,CAAAA,CAAE+C,SAAS,CAAA,MAAO/C,CAAAA,CAAEoG,OAAO,CAAA,GAAA,EAAMpG,CAAAA,CAAEgK,YAAY,CAAA,CAAA;AAC5E9E,MAAAA,KAAAA,EAAOlF,CAAAA,CAAEmB;KACV,CAAA,CAAA;AACII,IAAAA,GAAAA,SAAAA,CAAUiC,SAASV,UAAAA,GACpB;AAAC,MAAA;QAAEmC,KAAAA,EAAO,CAAA,WAAA,EAAcnC,UAAAA,GAAavB,SAAAA,CAAUiC,MAAM,CAAA,WAAA,CAAA;QAAe0B,KAAAA,EAAO;AAAgB;QAC3F;;AAIJ,EAAA,MAAMkF,aAAAA,GAAgB;AACrB,IAAA;MAAEnF,KAAAA,EAAO,uBAAA;MAAyBC,KAAAA,EAAO;AAAU,KAAA;AACnD,IAAA;MAAED,KAAAA,EAAO,2BAAA;MAA6BC,KAAAA,EAAO;AAAO,KAAA;AACpD,IAAA;MAAED,KAAAA,EAAO,iBAAA;MAAmBC,KAAAA,EAAO;AAAS,KAAA;AAC5C,IAAA;MAAED,KAAAA,EAAO,cAAA;MAAgBC,KAAAA,EAAO;AAAO;;AAGxC,EAAA,MAAMmF,oBAAAA,2BAAwBnF,KAAAA,KAAAA;AAC7B,IAAA,IAAIA,UAAU,eAAA,EAAiB;AAC9B2E,MAAAA,OAAAA,CAAQ,CAACS,CAAAA,KAAMA,CAAAA,GAAI,CAAA,CAAA;AACnB,MAAA;AACD,IAAA;AACAb,IAAAA,aAAAA,CAAcvE,KAAAA,CAAAA;AACdmD,IAAAA,WAAAA,CAAY,QAAA,CAAA;AACZsB,IAAAA,eAAAA,CAAgB,IAAA,CAAA;EACjB,CAAA,EAR6B,sBAAA,CAAA;AAU7B,EAAA,MAAMlB,YAAAA,iCAAsBpC,MAAAA,KAAAA;AAC3B,IAAA,IAAIA,WAAW,MAAA,EAAQ;AACtBgC,MAAAA,WAAAA,CAAY,MAAA,CAAA;AACZoB,MAAAA,aAAAA,CAAc,IAAA,CAAA;AACd,MAAA;AACD,IAAA;AACA,IAAA,IAAI,CAACD,UAAAA,EAAY;AAChB,MAAA;AACD,IAAA;AAEAG,IAAAA,eAAAA,CAAgB,IAAA,CAAA;AAChB,IAAA,IAAI;AACH,MAAA,QAAQtD,MAAAA;AACP,QAAA,KAAK,SAAA,EAAW;AACf,UAAA,MAAM/G,MAAAA,CAAOmD,SAAS8H,OAAAA,CAAQ;YAAEC,UAAAA,EAAYhB,UAAAA;YAAYiB,YAAAA,EAAc,IAAA;YAAMC,MAAAA,EAAQ;WAAM,CAAA;AAC1Ff,UAAAA,eAAAA,CAAgB,iCAAA,CAAA;AAChB,UAAA;AACD,QAAA;AACA,QAAA,KAAK,MAAA,EAAQ;AACZ,UAAA,MAAM5D,MAAAA,GAAS,MAAMzG,MAAAA,CAAOmD,QAAAA,CAASkI,IAAAA,CAAK;YACzCC,cAAAA,EAAgBpB,UAAAA;YAChBqB,YAAAA,EAAc,CAAA;YACdC,MAAAA,EAAQ;WACT,CAAA;AACA,UAAA,MAAMC,QAAQhF,MAAAA,CAAOgF,KAAAA;AACrBpB,UAAAA,eAAAA,CACC,CAAA,OAAA,EAAUoB,MAAMC,SAAS,CAAA,EAAA,EAAKD,MAAME,SAAS,CAAA,QAAA,EAAWF,KAAAA,CAAMG,YAAY,CAAA,QAAA,CAAU,CAAA;AAErF,UAAA;AACD,QAAA;AACA,QAAA,KAAK,QAAA,EAAU;AACd,UAAA,MAAM5L,MAAAA,CAAOmD,SAAS0I,MAAAA,CAAO;YAAEC,WAAAA,EAAa;AAAC5B,cAAAA;;YAAakB,MAAAA,EAAQ;WAAM,CAAA;AACxEf,UAAAA,eAAAA,CAAgB,mBAAA,CAAA;AAEhB9D,UAAAA,UAAAA,CAAW1D,OAAAA,GAAU,KAAA;AACrB0H,UAAAA,OAAAA,CAAQ,CAAA,CAAA;AACRP,UAAAA,YAAAA,CAAa,EAAE,CAAA;AACfjB,UAAAA,WAAAA,CAAY,MAAA,CAAA;AACZ,UAAA;AACD,QAAA;AACD;AACD,IAAA,CAAA,CAAA,OAAStH,GAAAA,EAAK;AACb4I,MAAAA,eAAAA,CAAgB,CAAA,OAAA,EAAU5I,eAAeC,KAAAA,GAAQD,GAAAA,CAAIE,UAAUC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA,CAAM,CAAA;AAC7E,IAAA;EACD,CAAA,EA5CqB,cAAA,CAAA;AA8CrB,EAAA,uBACCxC,KAACD,GAAAA,EAAAA;IAAIa,aAAAA,EAAc,QAAA;IAASsF,QAAAA,EAAU,CAAA;;AACrC,sBAAAlG,KAACC,IAAAA,EAAAA;QAAKqG,IAAAA,EAAI,IAAA;;AAAC,UAAA,aAAA;AAAY/B,UAAAA,UAAAA;AAAW,UAAA;;;MAEjCnF,KAAAA,oBACAU,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACqG,KAAAA,EAAAA;UAAMzF,OAAAA,EAAQ,OAAA;AAAStB,UAAAA,QAAAA,EAAAA;;;AAIzB4H,MAAAA,SAAAA,IAAahE,SAAAA,CAAUiC,MAAAA,KAAW,CAAA,oBAAKnF,IAAChC,OAAAA,EAAAA;QAAQ4I,KAAAA,EAAM;;MAEtD,CAACM,SAAAA,IAAahE,UAAUiC,MAAAA,KAAW,CAAA,IAAK,CAAC7F,KAAAA,oBACzCU,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;AAIhBoD,MAAAA,QAAAA,KAAa,UAAU+B,eAAAA,CAAgB3G,MAAAA,GAAS,CAAA,oBAChDjF,KAACD,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;QAAGhG,aAAAA,EAAc,QAAA;;AAChC,0BAAAd,IAACG,IAAAA,EAAAA;YAAKwG,QAAAA,EAAQ,IAAA;AAAC,YAAA,QAAA,EAAA;;AACf,0BAAA3G,IAACsI,MAAAA,EAAAA;YAAOC,OAAAA,EAASuD,eAAAA;YAAiBtD,QAAAA,EAAUwD,oBAAAA;YAAsBgB,kBAAAA,EAAoB;;;;AAIvFjD,MAAAA,QAAAA,KAAa,QAAA,IAAYoB,UAAAA,oBACzBjL,IAAAA,CAACD,GAAAA,EAAAA;QAAIa,aAAAA,EAAc,QAAA;QAASgG,SAAAA,EAAW,CAAA;;AACtC,0BAAA5G,KAACC,IAAAA,EAAAA;;AAAK,cAAA,YAAA;AACK,8BAAAH,IAACG,IAAAA,EAAAA;gBAAKqG,IAAAA,EAAI,IAAA;0BAAE2E,UAAAA,CAAWzC,KAAAA,CAAM,GAAG,CAAA;;;;UAE1C2C,YAAAA,oBACArL,IAACC,GAAAA,EAAAA;YAAIgN,OAAAA,EAAS,CAAA;AACb,YAAA,QAAA,kBAAAjN,IAACqG,KAAAA,EAAAA;AAAMzF,cAAAA,OAAAA,EAASyK,YAAAA,CAAa6B,UAAAA,CAAW,OAAA,CAAA,GAAW,OAAA,GAAU,SAAA;AAC3D7B,cAAAA,QAAAA,EAAAA;;;AAIJ,0BAAArL,IAACsI,MAAAA,EAAAA;YAAOC,OAAAA,EAASwD,aAAAA;YAAevD,QAAAA,EAAU4B;;;;AAI5C,sBAAApK,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;;;AAInB;AAtLgBqE,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AC/BT,SAASmC,WAAAA,CAAY,EAAElM,MAAAA,EAAM,EAAoB;AACvD,EAAA,MAAM,EAAEE,MAAAA,EAAQ7B,KAAAA,EAAOwG,aAAW,GAAK9E,gBAAAA,CAAiBC,QAAQ,GAAA,CAAA;AAChE,EAAA,MAAM,EAAEiC,WAAWG,SAAAA,EAAWC,QAAAA,EAAUhE,OAAOyG,SAAAA,EAAS,GAAKxC,cAAAA,CAAetC,MAAAA,EAAQ,GAAA,CAAA;AAEpF,EAAA,MAAMkF,cAAchF,MAAAA,KAAW,IAAA;AAC/B,EAAA,MAAM7B,QAAQwG,WAAAA,IAAeC,SAAAA;AAC7B,EAAA,MAAMG,aAAAA,GAAgB/E,QAAQR,OAAAA,IAAW,KAAA;AAEzC,EAAA,uBACCT,KAACD,GAAAA,EAAAA;IAAIa,aAAAA,EAAc,QAAA;IAASsF,QAAAA,EAAU,CAAA;;AACrC,sBAAApG,IAACU,WAAAA,EAAAA;QAAYC,OAAAA,EAASuF,aAAAA;QAAerF,QAAAA,EAAS;;AAG9C,sBAAAb,IAACC,GAAAA,EAAAA;QAAIc,YAAAA,EAAc,CAAA;AAClB,QAAA,QAAA,kBAAAf,IAAC1B,KAAAA,EAAAA;AAAMH,UAAAA,KAAAA,EAAOgI,cAAc,OAAA,GAAU,KAAA;oBACpCA,WAAAA,GACE,CAAA,QAAA,EAAWD,aAAAA,CAAAA,MAAAA,EAAsB/E,MAAAA,EAAQgB,GAAAA,CAAAA,SAAAA,EAAehB,MAAAA,EAAQiB,MAAAA,CAAAA,CAAAA,GAChE;;;MAIJ9C,KAAAA,oBACAU,IAACC,GAAAA,EAAAA;QAAIc,YAAAA,EAAc,CAAA;AAClB,QAAA,QAAA,kBAAAf,IAACqG,KAAAA,EAAAA;UAAMzF,OAAAA,EAAQ,SAAA;AAAWtB,UAAAA,QAAAA,EAAAA;;;AAK5B,sBAAAY,KAACD,GAAAA,EAAAA;QAAIa,aAAAA,EAAc,QAAA;QAASmI,WAAAA,EAAY,OAAA;QAAQ7C,QAAAA,EAAU,CAAA;QAAGrF,YAAAA,EAAc,CAAA;;AAC1E,0BAAAf,IAACG,IAAAA,EAAAA;YAAKqG,IAAAA,EAAI,IAAA;AAAC,YAAA,QAAA,EAAA;;AACX,0BAAAtG,KAACC,IAAAA,EAAAA;;AAAK,cAAA,YAAA;AACK,8BAAAH,IAACG,IAAAA,EAAAA;AAAKhC,gBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;0BAAU6E,SAAAA,CAAUC;;;;AAEzD,0BAAAjD,KAACC,IAAAA,EAAAA;;AAAK,cAAA,YAAA;AACK,8BAAAH,IAACG,IAAAA,EAAAA;AAAKhC,gBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;0BAAUgF,SAAAA,CAAUF;;;;AAEzD,0BAAAjD,KAACC,IAAAA,EAAAA;;AAAK,cAAA,UAAA;AACI,cAAA,GAAA;AACT,8BAAAH,IAACG,IAAAA,EAAAA;gBAAKwG,QAAAA,EAAQ,IAAA;AAAErD,gBAAAA,QAAAA,EAAAA,QAAAA,GAAW,GAAG1B,IAAAA,CAAKW,KAAAA,CAAMe,SAAS4B,YAAAA,GAAe,GAAA,CAAA,CAAA,CAAA,CAAA,GAAU;;;;AAE5E,0BAAAhF,KAACC,IAAAA,EAAAA;;AAAK,cAAA,YAAA;AACM,cAAA,GAAA;cACVgG,WAAAA,mBACAnG,IAACG,IAAAA,EAAAA;AAAKhC,gBAAAA,KAAAA,EAAOC,YAAAA,CAAaC,OAAAA;AAAS,gBAAA,QAAA,EAAA;AAEnC,eAAA,CAAA,mBAAA2B,IAACG,IAAAA,EAAAA;AAAKhC,gBAAAA,KAAAA,EAAOC,YAAAA,CAAakB,KAAAA;AAAO,gBAAA,QAAA,EAAA;;;;;;MAKnC,CAAC6B,MAAAA,oBAAUnB,GAAAA,CAAChC,OAAAA,EAAAA;QAAQ4I,KAAAA,EAAM;;AAE3B,sBAAA5G,IAACC,GAAAA,EAAAA;QAAI6G,SAAAA,EAAW,CAAA;AACf,QAAA,QAAA,kBAAA9G,IAACG,IAAAA,EAAAA;UAAKwG,QAAAA,EAAQ,IAAA;AAAC,UAAA,QAAA,EAAA;;;;;AAInB;AAzDgBwG,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;ACXhB,IAAMC,MAAAA,GAAyD;EAC9DC,SAAAA,EAAW;AAAC,IAAA,eAAA;AAAiB,IAAA;;EAC7BrE,OAAAA,EAAS;AAAC,IAAA,aAAA;AAAe,IAAA;;EACzB9F,SAAAA,EAAW;AAAC,IAAA,eAAA;AAAiB,IAAA;;EAC7BG,SAAAA,EAAW;AAAC,IAAA,eAAA;AAAiB,IAAA;;AAC9B,CAAA;AAEA,IAAMiK,MAAAA,GAAoB;AAAC,EAAA,WAAA;AAAa,EAAA,SAAA;AAAW,EAAA,WAAA;AAAa,EAAA;;AAMzD,SAASC,MAAAA,CAAO,EAAEC,MAAAA,EAAM,EAAe;AAC7C,EAAA,MAAMxH,OAAAA,GAAUpC,OAAAA,CAAQqC,MAAAA,CAAOD,OAAAA,IAAW,EAAA;AAC1C,EAAA,MAAMyH,SAASzH,OAAAA,GAAU,EAAA;AACzB,EAAA,uBACC9F,KAACD,GAAAA,EAAAA;IACAqG,GAAAA,EAAK,CAAA;IACLvF,YAAAA,EAAc,CAAA;IACdkI,WAAAA,EAAY,QAAA;IACZzK,WAAAA,EAAY,SAAA;IACZ4H,QAAAA,EAAU,CAAA;;AAETkH,MAAAA,MAAAA,CAAO1F,GAAAA,CAAI,CAACqE,CAAAA,qBACZjM,IAACG,IAAAA,EAAAA;QAEAhC,KAAAA,EAAO8N,CAAAA,KAAMuB,SAAS,SAAA,GAAY/O,MAAAA;AAClC+H,QAAAA,IAAAA,EAAMyF,CAAAA,KAAMuB,MAAAA;AACZ7G,QAAAA,QAAAA,EAAUsF,CAAAA,KAAMuB,MAAAA;kBAEfC,MAAAA,GAASL,MAAAA,CAAOnB,CAAAA,CAAAA,CAAG,CAAA,IAAKmB,MAAAA,CAAOnB,CAAAA,EAAG,CAAA;AAL9BA,OAAAA,EAAAA,CAAAA,CAAAA,CAAAA;AAQP,sBAAAjM,IAACG,IAAAA,EAAAA;QAAKwG,QAAAA,EAAQ,IAAA;AAAC,QAAA,QAAA,EAAA;;;;AAGlB;AAxBgB4G,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;;;ACKhB,IAAMD,OAAAA,GAAoB;AAAC,EAAA,WAAA;AAAa,EAAA,SAAA;AAAW,EAAA,WAAA;AAAa,EAAA;;AAazD,SAASI,OAAO,EAAEzM,MAAAA,EAAQ0M,eAAe,WAAA,EAAaC,WAAAA,GAAc,OAAK,EAAe;AAC9F,EAAA,MAAM,EAAEC,IAAAA,EAAI,GAAKC,MAAAA,EAAAA;AACjB,EAAA,MAAM,CAACC,WAAAA,EAAaC,cAAAA,CAAAA,GAAkB3M,SAAkBsM,YAAAA,CAAAA;AAExDpM,EAAAA,UAAU,MAAA;AACT,IAAA,OAAO,MAAA;AACNN,MAAAA,MAAAA,CAAOgN,KAAAA,EAAK;AACb,IAAA,CAAA;EACD,CAAA,EAAG;AAAChN,IAAAA;AAAO,GAAA,CAAA;AAEXgH,EAAAA,QAAAA,CAAS,CAACC,KAAAA,EAAOgG,GAAAA,KAAAA;AAEhB,IAAA,IAAIhG,KAAAA,KAAU,GAAA,IAAQgG,GAAAA,CAAIC,IAAAA,IAAQjG,UAAU,GAAA,EAAM;AACjD2F,MAAAA,IAAAA,EAAAA;AACA,MAAA;AACD,IAAA;AAEA,IAAA,IAAI3F,UAAU,GAAA,EAAK;AAClB8F,MAAAA,cAAAA,CAAe,WAAA,CAAA;AACf,MAAA;AACD,IAAA;AACA,IAAA,IAAI9F,UAAU,GAAA,EAAK;AAClB8F,MAAAA,cAAAA,CAAe,SAAA,CAAA;AACf,MAAA;AACD,IAAA;AACA,IAAA,IAAI9F,UAAU,GAAA,EAAK;AAClB8F,MAAAA,cAAAA,CAAe,WAAA,CAAA;AACf,MAAA;AACD,IAAA;AACA,IAAA,IAAI9F,UAAU,GAAA,EAAK;AAClB8F,MAAAA,cAAAA,CAAe,WAAA,CAAA;AACf,MAAA;AACD,IAAA;AAEA,IAAA,IAAIE,IAAIE,UAAAA,EAAY;AACnB,MAAA,MAAMC,GAAAA,GAAMf,OAAAA,CAAOgB,OAAAA,CAAQP,WAAAA,CAAAA;AAC3BC,MAAAA,cAAAA,CAAeV,OAAAA,CAAAA,CAAQe,GAAAA,GAAM,CAAA,IAAKf,OAAAA,CAAOnI,MAAM,CAAC,CAAA;AAChD,MAAA;AACD,IAAA;AACA,IAAA,IAAI+I,IAAIK,SAAAA,EAAW;AAClB,MAAA,MAAMF,GAAAA,GAAMf,OAAAA,CAAOgB,OAAAA,CAAQP,WAAAA,CAAAA;AAC3BC,MAAAA,cAAAA,CAAeV,SAAQe,GAAAA,GAAM,CAAA,GAAIf,QAAOnI,MAAAA,IAAUmI,OAAAA,CAAOnI,MAAM,CAAC,CAAA;AACjE,IAAA;EACD,CAAA,CAAA;AAEA,EAAA,uBACCnF,IAACpB,UAAAA,EAAAA;AACA,IAAA,QAAA,kBAAAsB,KAACD,GAAAA,EAAAA;MAAIa,aAAAA,EAAc,QAAA;;AAClB,wBAAAd,IAACuN,MAAAA,EAAAA;UAAOC,MAAAA,EAAQO;;QACfA,WAAAA,KAAgB,WAAA,oBAChB/N,GAAAA,CAAChB,gBAAAA,EAAAA;UAAiBc,KAAAA,EAAM,WAAA;oBACtB8N,WAAAA,mBAAc5N,IAACmN,WAAAA,EAAAA;AAAYlM,YAAAA;AAAqB,WAAA,CAAA,mBAAAjB,IAAC6F,cAAAA,EAAAA;AAAe5E,YAAAA;;;QAGlE8M,WAAAA,KAAgB,SAAA,oBAChB/N,GAAAA,CAAChB,gBAAAA,EAAAA;UAAiBc,KAAAA,EAAM,SAAA;AACvB,UAAA,QAAA,kBAAAE,IAACwK,YAAAA,EAAAA;AAAavJ,YAAAA;;;QAGf8M,WAAAA,KAAgB,WAAA,oBAChB/N,GAAAA,CAAChB,gBAAAA,EAAAA;UAAiBc,KAAAA,EAAM,WAAA;AACvB,UAAA,QAAA,kBAAAE,IAACgL,aAAAA,EAAAA;AAAc/J,YAAAA;;;QAGhB8M,WAAAA,KAAgB,WAAA,oBAChB/N,GAAAA,CAAChB,gBAAAA,EAAAA;UAAiBc,KAAAA,EAAM,WAAA;AACvB,UAAA,QAAA,kBAAAE,IAAC+G,cAAAA,EAAAA;AAAe9F,YAAAA;;;;;;AAMtB;AAxEgByM,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA","file":"chunk-W5B4GTXR.js","sourcesContent":["/**\n * @inkjs/ui Theme Provider - Vreko Brand\n *\n * Extends the @inkjs/ui defaultTheme with Vreko brand colors (#4ADE80). // brand-color-allowed\n * All Ink views should be wrapped in <VrekoTheme> to get consistent styling.\n *\n * IMPORTANT: Colors must flow through theme.ts → ink-theme.tsx.\n * Never hardcode hex values in component files - use BRAND_COLORS from theme.ts.\n *\n * @module ui/ink-theme\n */\n\nimport { defaultTheme, extendTheme, ThemeProvider } from \"@inkjs/ui\";\nimport type { BoxProps, TextProps } from \"ink\";\nimport type React from \"react\";\nimport { BRAND_COLORS } from \"./theme.js\";\n\n/** Vreko-branded @inkjs/ui theme */\nexport const vrekoTheme = extendTheme(defaultTheme, {\n\tcomponents: {\n\t\tSpinner: {\n\t\t\tstyles: {\n\t\t\t\tframe: (): TextProps => ({ color: BRAND_COLORS.primary }),\n\t\t\t},\n\t\t},\n\t\tBadge: {\n\t\t\tstyles: {\n\t\t\t\tcontainer: ({ color }: { color: string }): BoxProps => ({\n\t\t\t\t\tborderColor: color === \"green\" ? BRAND_COLORS.primary : undefined,\n\t\t\t\t}),\n\t\t\t},\n\t\t},\n\t\tProgressBar: {\n\t\t\tstyles: {\n\t\t\t\tfilled: (): TextProps => ({ color: BRAND_COLORS.primary }),\n\t\t\t},\n\t\t},\n\t},\n});\n\n/** Wrap any Ink view in this component to apply the Vreko brand theme. */\nexport function VrekoTheme({ children }: { children: React.ReactNode }) {\n\treturn <ThemeProvider theme={vrekoTheme}>{children}</ThemeProvider>;\n}\n","/**\n * InkErrorBoundary - per-panel React error boundary for the Vreko TUI.\n *\n * Each TUI panel is wrapped in this boundary so a single panel crash never\n * propagates to sibling panels or root. Ink does not provide error boundaries\n * natively - the React class component pattern is required.\n *\n * On error: renders a red inline message and captures to Sentry.\n * Pattern: spec §G - per-panel error boundaries\n *\n * @module ui/tui/InkErrorBoundary\n */\nimport * as Sentry from \"@sentry/node\";\nimport { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { PanelId } from \"./TuiApp.js\";\n\ninterface Props {\n\tpanel: PanelId;\n\tchildren: React.ReactNode;\n}\n\ninterface State {\n\thasError: boolean;\n\terror: Error | null;\n}\n\nexport class InkErrorBoundary extends React.Component<Props, State> {\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): State {\n\t\treturn { hasError: true, error };\n\t}\n\n\tcomponentDidCatch(error: Error, info: React.ErrorInfo): void {\n\t\tSentry.captureException(error, {\n\t\t\textra: { componentStack: info.componentStack, panel: this.props.panel },\n\t\t});\n\t}\n\n\trender() {\n\t\tif (this.state.hasError) {\n\t\t\treturn (\n\t\t\t\t<Box>\n\t\t\t\t\t<Text color=\"red\">\n\t\t\t\t\t\t{\"⚠\"} {this.props.panel} panel error - data unavailable\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t);\n\t\t}\n\t\treturn this.props.children;\n\t}\n}\n","import { Box, Text } from \"ink\";\n\nconst BRAND_GREEN = \"#4ADE80\"; // brand-color-allowed\nconst DARK = \"#0F172A\"; // brand-color-allowed\nconst WHITE = \"#F8FAFC\"; // brand-color-allowed\nconst SUBTLE = \"#64748B\"; // brand-color-allowed\nconst DIM_GREEN = \"#22C55E\"; // brand-color-allowed\n\nfunction GeckoGlyph() {\n\treturn (\n\t\t<Text>\n\t\t\t<Text color={BRAND_GREEN}>▰</Text>\n\t\t\t<Text color={DARK} backgroundColor={BRAND_GREEN}>\n\t\t\t\t●\n\t\t\t</Text>\n\t\t\t<Text color={BRAND_GREEN}>▸</Text>\n\t\t</Text>\n\t);\n}\n\ninterface HeaderProps {\n\tversion: string;\n\tvariant?: \"default\" | \"ceremony\";\n\tsubtitle?: string;\n}\n\nexport function VrekoHeader({ version, variant = \"default\", subtitle = \"developer intelligence\" }: HeaderProps) {\n\tif (variant === \"ceremony\") {\n\t\treturn (\n\t\t\t<Box flexDirection=\"column\" marginBottom={1}>\n\t\t\t\t<Text>\n\t\t\t\t\t<GeckoGlyph />\n\t\t\t\t\t<Text color={WHITE}> vreko</Text>\n\t\t\t\t\t<Text color={SUBTLE}> v{version}</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\t<Text color={SUBTLE}> {subtitle}</Text>\n\t\t\t\t</Text>\n\t\t\t</Box>\n\t\t);\n\t}\n\treturn (\n\t\t<Box marginBottom={1}>\n\t\t\t<GeckoGlyph />\n\t\t\t<Text color={WHITE}> vreko</Text>\n\t\t\t<Text color={SUBTLE}> v{version}</Text>\n\t\t</Box>\n\t);\n}\n\ninterface CeremonyFooterProps {\n\tpatternsLearned: number;\n\tpitfallsAvoided: number;\n\tsmarterPercent?: number;\n}\n\nexport function CeremonyFooter({ patternsLearned, pitfallsAvoided, smarterPercent }: CeremonyFooterProps) {\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text>\n\t\t\t\t<GeckoGlyph />\n\t\t\t\t<Text color={BRAND_GREEN}>\n\t\t\t\t\t{\" \"}\n\t\t\t\t\t{patternsLearned} patterns learned · {pitfallsAvoided} pitfalls avoided\n\t\t\t\t</Text>\n\t\t\t</Text>\n\t\t\t{typeof smarterPercent === \"number\" && (\n\t\t\t\t<Text color={DIM_GREEN}>\n\t\t\t\t\t{\" \"}Codebase intelligence +{smarterPercent}%\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Box>\n\t);\n}\n","/**\n * useDaemonPolling - fast poll (5s) for daemon vital signs.\n *\n * Extracts the fast-poll useEffect pattern into a standalone hook.\n * Pattern: apps/cli/src/ui/init/hooks/useAnalysis.ts (StrictMode guard)\n * Dual-interval polling pattern extracted from legacy dashboard component (Phase 32).\n */\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { useEffect, useState } from \"react\";\n\nexport interface DaemonState {\n\tpid: number;\n\tversion: string;\n\tuptime: string;\n\tconnections: number;\n\tmemoryMB: number;\n}\n\nexport function useDaemonPolling(\n\tclient: VrekoLocalClient,\n\tintervalMs = 5000,\n): { daemon: DaemonState | null; error: string | null } {\n\tconst [daemon, setDaemon] = useState<DaemonState | null>(null);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\n\t\tfunction formatUptime(ms: number): string {\n\t\t\tconst s = Math.floor(ms / 1000);\n\t\t\tconst m = Math.floor(s / 60);\n\t\t\tconst h = Math.floor(m / 60);\n\t\t\tconst d = Math.floor(h / 24);\n\t\t\tif (d > 0) {\n\t\t\t\treturn `${d}d ${h % 24}h`;\n\t\t\t}\n\t\t\tif (h > 0) {\n\t\t\t\treturn `${h}h ${m % 60}m`;\n\t\t\t}\n\t\t\tif (m > 0) {\n\t\t\t\treturn `${m}m ${s % 60}s`;\n\t\t\t}\n\t\t\treturn `${s}s`;\n\t\t}\n\n\t\tconst poll = async () => {\n\t\t\ttry {\n\t\t\t\tconst status = await client.daemon.status();\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetDaemon({\n\t\t\t\t\tpid: status.pid,\n\t\t\t\t\tversion: status.version,\n\t\t\t\t\tuptime: formatUptime(status.uptime),\n\t\t\t\t\tconnections: status.connections,\n\t\t\t\t\tmemoryMB: Math.round(status.memoryUsage.heapUsed / (1024 * 1024)),\n\t\t\t\t});\n\t\t\t\tsetError(null);\n\t\t\t} catch (err) {\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetDaemon(null);\n\t\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\t}\n\t\t};\n\n\t\tpoll();\n\t\tconst id = setInterval(poll, intervalMs);\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tclearInterval(id);\n\t\t};\n\t}, [client, intervalMs]);\n\n\treturn { daemon, error };\n}\n","/**\n * useSlowPolling - slow poll (60s) for snapshots, learnings, momentum.\n *\n * Each subsystem call is isolated - one failure does not crash others.\n * On failure, last-known-good values are preserved so the UI never shows\n * stale zeros masquerading as truth. Errors are surfaced via `error` field.\n * Slow-poll pattern extracted from legacy dashboard component (Phase 32).\n */\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { useEffect, useRef, useState } from \"react\";\n\nexport interface SlowPollState {\n\tsnapshots: { count: number; latestAt: string | null };\n\tlearnings: { count: number };\n\tmomentum: { fileCount: number; averageScore: number } | null;\n\terror: string | null;\n}\n\nconst INITIAL: SlowPollState = {\n\tsnapshots: { count: 0, latestAt: null },\n\tlearnings: { count: 0 },\n\tmomentum: null,\n\terror: null,\n};\n\nexport function useSlowPolling(client: VrekoLocalClient, intervalMs = 60000): SlowPollState {\n\tconst [state, setState] = useState<SlowPollState>(INITIAL);\n\t// Preserve last-good values across failed polls so the UI never flips to\n\t// zeros just because one interval's IPC calls failed.\n\tconst lastGoodRef = useRef({\n\t\tsnapshots: INITIAL.snapshots,\n\t\tlearnings: INITIAL.learnings,\n\t\tmomentum: INITIAL.momentum,\n\t});\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tconst cwd = process.cwd();\n\n\t\tconst poll = async () => {\n\t\t\tconst lg = lastGoodRef.current;\n\t\t\tlet snapshotCount = lg.snapshots.count;\n\t\t\tlet latestAt = lg.snapshots.latestAt;\n\t\t\tlet learningCount = lg.learnings.count;\n\t\t\tlet momentumData = lg.momentum;\n\t\t\tconst errors: string[] = [];\n\n\t\t\ttry {\n\t\t\t\tconst snap = await client.snapshot.list({ limit: 1, orderBy: \"createdAt\", orderDir: \"desc\" });\n\t\t\t\tsnapshotCount = snap.totalCount ?? 0;\n\t\t\t\tlatestAt = snap.snapshots[0]?.createdAt ?? null;\n\t\t\t} catch (err) {\n\t\t\t\terrors.push(`snapshots: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst learn = await client.learning.list({ workspace: cwd, limit: 1 });\n\t\t\t\tlearningCount = learn.total;\n\t\t\t} catch (err) {\n\t\t\t\terrors.push(`learnings: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst mom = await client.momentum.status({ workspace: cwd });\n\t\t\t\tmomentumData = { fileCount: mom.fileCount, averageScore: mom.averageScore };\n\t\t\t} catch (err) {\n\t\t\t\terrors.push(`momentum: ${err instanceof Error ? err.message : String(err)}`);\n\t\t\t}\n\n\t\t\tif (cancelled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlastGoodRef.current = {\n\t\t\t\tsnapshots: { count: snapshotCount, latestAt },\n\t\t\t\tlearnings: { count: learningCount },\n\t\t\t\tmomentum: momentumData,\n\t\t\t};\n\n\t\t\tsetState({\n\t\t\t\tsnapshots: { count: snapshotCount, latestAt },\n\t\t\t\tlearnings: { count: learningCount },\n\t\t\t\tmomentum: momentumData,\n\t\t\t\terror: errors.length > 0 ? errors.join(\"; \") : null,\n\t\t\t});\n\t\t};\n\n\t\tpoll();\n\t\tconst id = setInterval(poll, intervalMs);\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tclearInterval(id);\n\t\t};\n\t}, [client, intervalMs]);\n\n\treturn state;\n}\n","/**\n * DashboardPanel - command center overview.\n *\n * Shows daemon health, session summary, protection status, snapshot count,\n * learnings count, and momentum score. Uses extracted polling hooks.\n *\n * Polling pattern migrated from legacy dashboard component (Phase 32) to useDaemonPolling hook.\n *\n * @module ui/tui/panels/DashboardPanel\n */\nimport { Alert, Badge, ProgressBar, Spinner } from \"@inkjs/ui\";\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { Box, Text } from \"ink\";\nimport { VrekoHeader } from \"../../brand.js\";\nimport { BRAND_COLORS } from \"../../theme.js\";\nimport { useDaemonPolling } from \"../hooks/useDaemonPolling.js\";\nimport { useSlowPolling } from \"../hooks/useSlowPolling.js\";\n\ninterface DashboardPanelProps {\n\tclient: VrekoLocalClient;\n}\n\nfunction formatTimeAgo(ts: string | null): string {\n\tif (!ts) {\n\t\treturn \"never\";\n\t}\n\tconst diffMs = Date.now() - new Date(ts).getTime();\n\tconst mins = Math.floor(diffMs / 60000);\n\tif (mins < 1) {\n\t\treturn \"just now\";\n\t}\n\tif (mins < 60) {\n\t\treturn `${mins}m ago`;\n\t}\n\tconst hours = Math.floor(mins / 60);\n\tif (hours < 24) {\n\t\treturn `${hours}h ago`;\n\t}\n\treturn `${Math.floor(hours / 24)}d ago`;\n}\n\nexport function DashboardPanel({ client }: DashboardPanelProps) {\n\tconst { daemon, error: daemonError } = useDaemonPolling(client, 5000);\n\tconst { snapshots, learnings, momentum, error: slowError } = useSlowPolling(client, 60000);\n\n\tconst columns = process.stdout.columns ?? 80;\n\tconst daemonVersion = daemon?.version ?? \" - \";\n\tconst isConnected = daemon !== null;\n\tconst error = daemonError ?? slowError;\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t<VrekoHeader version={daemonVersion} />\n\n\t\t\t{/* Connection status badge */}\n\t\t\t<Box marginBottom={1}>\n\t\t\t\t<Badge color={isConnected ? \"green\" : \"red\"}>\n\t\t\t\t\t{isConnected ? \"daemon connected\" : \"daemon offline\"}\n\t\t\t\t</Badge>\n\t\t\t</Box>\n\n\t\t\t{/* Error bar */}\n\t\t\t{error && (\n\t\t\t\t<Box marginBottom={1}>\n\t\t\t\t\t<Alert variant=\"error\">{error}</Alert>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Main content: 3-column layout (narrow: stacked) */}\n\t\t\t<Box flexDirection={columns >= 100 ? \"row\" : \"column\"} gap={3}>\n\t\t\t\t{/* Column 1: Daemon vitals */}\n\t\t\t\t<Box flexDirection=\"column\" minWidth={24}>\n\t\t\t\t\t<Text bold underline>\n\t\t\t\t\t\tDaemon\n\t\t\t\t\t</Text>\n\t\t\t\t\t{daemon ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\tPID <Text color={BRAND_COLORS.primary}>{daemon.pid}</Text>\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\tUptime <Text color={BRAND_COLORS.primary}>{daemon.uptime}</Text>\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\tMemory <Text dimColor>{daemon.memoryMB} MB</Text>\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\tConns <Text dimColor>{daemon.connections}</Text>\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Spinner label=\"connecting...\" />\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\n\t\t\t\t{/* Column 2: Protection & Snapshots */}\n\t\t\t\t<Box flexDirection=\"column\" minWidth={24}>\n\t\t\t\t\t<Text bold underline>\n\t\t\t\t\t\tProtection\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text>\n\t\t\t\t\t\tSnapshots <Text color={BRAND_COLORS.primary}>{snapshots.count}</Text>\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text>\n\t\t\t\t\t\tLast snap <Text dimColor>{formatTimeAgo(snapshots.latestAt)}</Text>\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text>\n\t\t\t\t\t\tLearnings <Text color={BRAND_COLORS.primary}>{learnings.count}</Text>\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\n\t\t\t\t{/* Column 3: Momentum */}\n\t\t\t\t<Box flexDirection=\"column\" minWidth={30}>\n\t\t\t\t\t<Text bold underline>\n\t\t\t\t\t\tMomentum\n\t\t\t\t\t</Text>\n\t\t\t\t\t{momentum ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\tFiles tracked <Text dimColor>{momentum.fileCount}</Text>\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Box>\n\t\t\t\t\t\t\t\t<Text>Score </Text>\n\t\t\t\t\t\t\t\t<ProgressBar value={Math.round(momentum.averageScore * 100)} />\n\t\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t\t\t<Text dimColor>{Math.round(momentum.averageScore * 100)}%</Text>\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Text dimColor>No momentum data yet</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\n\t\t\t{/* Hint bar */}\n\t\t\t<Box marginTop={1}>\n\t\t\t\t<Text dimColor>r:refresh 1-4:panels q:quit</Text>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","/**\n * LearningsPanel - pattern/learning browser.\n *\n * Shows learnings from daemon with type, trigger, action, and status.\n * UnorderedList from @inkjs/ui for consistent bullet rendering.\n * Filter toggle: all / active.\n *\n * @module ui/tui/panels/LearningsPanel\n */\nimport { Alert, Select, Spinner, UnorderedList } from \"@inkjs/ui\";\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { Box, Text, useInput } from \"ink\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype FilterMode = \"all\" | \"active\";\n\ninterface LearningItem {\n\ttype: string;\n\ttrigger: string;\n\taction: string;\n\trelevanceScore?: number;\n}\n\ninterface LearningsPanelProps {\n\tclient: VrekoLocalClient;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function LearningsPanel({ client }: LearningsPanelProps) {\n\tconst [learnings, setLearnings] = useState<LearningItem[]>([]);\n\tconst [total, setTotal] = useState(0);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [filter, setFilter] = useState<FilterMode>(\"all\");\n\tconst [showFilterMenu, setShowFilterMenu] = useState(false);\n\tconst hasStarted = useRef(false); // StrictMode guard\n\n\tuseEffect(() => {\n\t\tif (hasStarted.current) {\n\t\t\treturn;\n\t\t}\n\t\thasStarted.current = true;\n\t\tlet cancelled = false;\n\t\tconst cwd = process.cwd();\n\n\t\tconst load = async () => {\n\t\t\tsetIsLoading(true);\n\t\t\ttry {\n\t\t\t\tconst result = await client.learning.list({\n\t\t\t\t\tworkspace: cwd,\n\t\t\t\t\tlimit: 50,\n\t\t\t\t});\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst items: LearningItem[] = result.learnings.map((l) => ({\n\t\t\t\t\ttype: l.type,\n\t\t\t\t\ttrigger: l.trigger,\n\t\t\t\t\taction: l.action,\n\t\t\t\t}));\n\t\t\t\tsetLearnings(items);\n\t\t\t\tsetTotal(result.total);\n\t\t\t\tsetError(null);\n\t\t\t} catch (err) {\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\t} finally {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tload();\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [client]);\n\n\t// 'f' key toggles filter menu - only active when this panel is mounted\n\tuseInput((input) => {\n\t\tif (input === \"f\") {\n\t\t\tsetShowFilterMenu((v) => !v);\n\t\t}\n\t});\n\n\tconst filtered = learnings.filter((l) => {\n\t\tif (filter === \"all\") {\n\t\t\treturn true;\n\t\t}\n\t\t// \"active\" = learnings that have a meaningful action (not empty)\n\t\treturn l.action.length > 0;\n\t});\n\n\tconst filterOptions: Array<{ label: string; value: FilterMode }> = [\n\t\t{ label: \"All learnings\", value: \"all\" },\n\t\t{ label: \"With action only\", value: \"active\" },\n\t];\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t<Box gap={2} marginBottom={1}>\n\t\t\t\t<Text bold>Learnings ({total} total)</Text>\n\t\t\t\t<Text dimColor>[f:filter = {filter}]</Text>\n\t\t\t</Box>\n\n\t\t\t{error && (\n\t\t\t\t<Box marginBottom={1}>\n\t\t\t\t\t<Alert variant=\"error\">{error}</Alert>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{isLoading && <Spinner label=\"Loading patterns...\" />}\n\n\t\t\t{!isLoading && learnings.length === 0 && !error && (\n\t\t\t\t<Box marginTop={1}>\n\t\t\t\t\t<Text dimColor>\n\t\t\t\t\t\tNo patterns learned yet. Run an AI session and use vreko_learn to record patterns.\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{showFilterMenu ? (\n\t\t\t\t<Box flexDirection=\"column\" marginBottom={1}>\n\t\t\t\t\t<Text>Filter by:</Text>\n\t\t\t\t\t<Select\n\t\t\t\t\t\toptions={filterOptions}\n\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\tsetFilter(v as FilterMode);\n\t\t\t\t\t\t\tsetShowFilterMenu(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</Box>\n\t\t\t) : (\n\t\t\t\t!isLoading &&\n\t\t\t\tfiltered.length > 0 && (\n\t\t\t\t\t<UnorderedList>\n\t\t\t\t\t\t{filtered.slice(0, 30).map((l, i) => (\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: stable list rendered once at mount\n\t\t\t\t\t\t\t<UnorderedList.Item key={`${l.type}-${i}`}>\n\t\t\t\t\t\t\t\t<Text>\n\t\t\t\t\t\t\t\t\t<Text bold>{l.type}</Text>\n\t\t\t\t\t\t\t\t\t<Text dimColor>\n\t\t\t\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t\t\t\t- {l.trigger.length > 40 ? `${l.trigger.slice(0, 40)}…` : l.trigger}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</UnorderedList.Item>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filtered.length > 30 && (\n\t\t\t\t\t\t\t<UnorderedList.Item>\n\t\t\t\t\t\t\t\t<Text dimColor>...and {filtered.length - 30} more. Use vr patterns for full list.</Text>\n\t\t\t\t\t\t\t</UnorderedList.Item>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</UnorderedList>\n\t\t\t\t)\n\t\t\t)}\n\n\t\t\t<Box marginTop={1}>\n\t\t\t\t<Text dimColor>f:filter 1-4:panels q:quit</Text>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","/**\n * SessionPanel - session lifecycle view.\n *\n * Shows current session ID, start time, duration.\n * Actions: start session, end session (via daemon IPC).\n *\n * RESILIENCE (A3): If session IPC is unavailable, shows\n * \"Session management available via MCP tools\" - no crash.\n *\n * Pattern: commands/init/tui/frames/DaemonStart.tsx (step-sequenced async)\n *\n * @module ui/tui/panels/SessionPanel\n */\n\nimport { Alert, Select, Spinner } from \"@inkjs/ui\";\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { Box, Text } from \"ink\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { BRAND_COLORS } from \"../../theme.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface SessionInfo {\n\tid: string;\n\tstartedAt: string;\n}\n\ntype SessionViewMode = \"overview\" | \"working\";\n\ninterface SessionPanelProps {\n\tclient: VrekoLocalClient;\n}\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\nfunction formatSessionDuration(startedAt: string): string {\n\tconst diffMs = Date.now() - new Date(startedAt).getTime();\n\tconst mins = Math.floor(diffMs / 60000);\n\tconst hours = Math.floor(mins / 60);\n\tif (hours > 0) {\n\t\treturn `${hours}h ${mins % 60}m`;\n\t}\n\treturn `${mins}m`;\n}\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\ninterface SessionCardProps {\n\tsession: SessionInfo;\n}\n\nfunction SessionCard({ session }: SessionCardProps) {\n\treturn (\n\t\t<Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1} marginBottom={1}>\n\t\t\t<Text>\n\t\t\t\tID <Text bold>{session.id.slice(0, 20)}...</Text>\n\t\t\t</Text>\n\t\t\t<Text>\n\t\t\t\tDuration <Text color={BRAND_COLORS.primary}>{formatSessionDuration(session.startedAt)}</Text>\n\t\t\t\t{/* brand-color-allowed */}\n\t\t\t</Text>\n\t\t\t<Text>\n\t\t\t\tStarted <Text dimColor>{new Date(session.startedAt).toLocaleTimeString()}</Text>\n\t\t\t</Text>\n\t\t</Box>\n\t);\n}\n\ninterface SessionUnavailableNoticeProps {\n\tshow: boolean;\n}\n\nfunction SessionUnavailableNotice({ show }: SessionUnavailableNoticeProps) {\n\tif (!show) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Box marginTop={1} flexDirection=\"column\">\n\t\t\t<Text dimColor>Session management is available via MCP tools:</Text>\n\t\t\t<Text dimColor> vreko_begin vreko_end vreko_pulse</Text>\n\t\t\t<Text dimColor>In-TUI session control arriving in a future release.</Text>\n\t\t</Box>\n\t);\n}\n\n// =============================================================================\n// HOOK: useSessionLoader - loads session status on mount\n// =============================================================================\n\ninterface SessionLoaderResult {\n\tsession: SessionInfo | null;\n\tsetSession: (s: SessionInfo | null) => void;\n\tisLoading: boolean;\n\terror: string | null;\n\tsetError: (e: string | null) => void;\n\tsessionUnavailable: boolean;\n}\n\nfunction useSessionLoader(client: VrekoLocalClient, cwd: string): SessionLoaderResult {\n\tconst [session, setSession] = useState<SessionInfo | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [sessionUnavailable, setSessionUnavailable] = useState(false);\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tconst load = async () => {\n\t\t\tsetIsLoading(true);\n\t\t\ttry {\n\t\t\t\tconst response = await client.session.current({ workspacePath: cwd });\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Handle both response formats: { session: ... } and direct session object\n\t\t\t\tconst currentSession =\n\t\t\t\t\tresponse && typeof response === \"object\" && \"session\" in response\n\t\t\t\t\t\t? (response as { session?: SessionInfo }).session\n\t\t\t\t\t\t: response;\n\t\t\t\tif (currentSession) {\n\t\t\t\t\tsetSession({\n\t\t\t\t\t\tid: currentSession.id,\n\t\t\t\t\t\tstartedAt: currentSession.startedAt,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tsetSession(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\t\t// Graceful degradation: method not found = session IPC not yet available (A3)\n\t\t\t\tif (msg.includes(\"not found\") || msg.includes(\"not implemented\") || msg.includes(\"method\")) {\n\t\t\t\t\tsetSessionUnavailable(true);\n\t\t\t\t} else {\n\t\t\t\t\tsetError(msg);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tload();\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [client, cwd]);\n\n\treturn { session, setSession, isLoading, error, setError, sessionUnavailable };\n}\n\n// =============================================================================\n// HOOK: useSessionActions - start/end session via IPC\n// =============================================================================\n\ninterface SessionActionsResult {\n\tviewMode: SessionViewMode;\n\tstatusMessage: string | null;\n\thandleAction: (action: string) => Promise<void>;\n}\n\nfunction useSessionActions(\n\tclient: VrekoLocalClient,\n\tcwd: string,\n\tsession: SessionInfo | null,\n\tsetSession: (s: SessionInfo | null) => void,\n\tsetError: (e: string | null) => void,\n): SessionActionsResult {\n\tconst [viewMode, setViewMode] = useState<SessionViewMode>(\"overview\");\n\tconst [statusMessage, setStatusMessage] = useState<string | null>(null);\n\tconst isMountedRef = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMountedRef.current = true;\n\t\treturn () => {\n\t\t\tisMountedRef.current = false;\n\t\t};\n\t}, []);\n\n\tconst handleAction = async (action: string) => {\n\t\tif (action === \"back\") {\n\t\t\tsetViewMode(\"overview\");\n\t\t\treturn;\n\t\t}\n\t\tsetViewMode(\"working\");\n\t\tif (action === \"start\") {\n\t\t\ttry {\n\t\t\t\tconst result = await client.session.start({ workspacePath: cwd });\n\t\t\t\tif (!isMountedRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (result?.id) {\n\t\t\t\t\tsetSession({ id: result.id, startedAt: result.startedAt });\n\t\t\t\t\tsetStatusMessage(\"Session started.\");\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tif (!isMountedRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\t} finally {\n\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\tsetViewMode(\"overview\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (action === \"end\" && session) {\n\t\t\ttry {\n\t\t\t\tawait client.session.end({ sessionId: session.id });\n\t\t\t\tif (!isMountedRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetSession(null);\n\t\t\t\tsetStatusMessage(\"Session ended. Ceremony written to .vreko/docs/last-ceremony.md.\");\n\t\t\t} catch (err) {\n\t\t\t\tif (!isMountedRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\t} finally {\n\t\t\t\tif (isMountedRef.current) {\n\t\t\t\t\tsetViewMode(\"overview\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn { viewMode, statusMessage, handleAction };\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function SessionPanel({ client }: SessionPanelProps) {\n\tconst cwd = process.cwd();\n\tconst { session, setSession, isLoading, error, setError, sessionUnavailable } = useSessionLoader(client, cwd);\n\tconst { viewMode, statusMessage, handleAction } = useSessionActions(client, cwd, session, setSession, setError);\n\n\tconst sessionActions = session\n\t\t? [\n\t\t\t\t{ label: \"End session (save & ceremony)\", value: \"end\" },\n\t\t\t\t{ label: \"<- Cancel\", value: \"back\" },\n\t\t\t]\n\t\t: [\n\t\t\t\t{ label: \"Start new session\", value: \"start\" },\n\t\t\t\t{ label: \"<- Cancel\", value: \"back\" },\n\t\t\t];\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t<Text bold>Session</Text>\n\n\t\t\t{isLoading && <Spinner label=\"Loading session...\" />}\n\n\t\t\t<SessionUnavailableNotice show={sessionUnavailable} />\n\n\t\t\t{error && (\n\t\t\t\t<Box marginTop={1}>\n\t\t\t\t\t<Alert variant=\"error\">{error}</Alert>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{statusMessage && !error && (\n\t\t\t\t<Box marginTop={1}>\n\t\t\t\t\t<Alert variant=\"success\">{statusMessage}</Alert>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{!isLoading && !sessionUnavailable && (\n\t\t\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t\t\t{session ? (\n\t\t\t\t\t\t<SessionCard session={session} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Box marginBottom={1}>\n\t\t\t\t\t\t\t<Text dimColor>No active session.</Text>\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t)}\n\t\t\t\t\t{viewMode === \"working\" ? (\n\t\t\t\t\t\t<Spinner label=\"Working...\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Select options={sessionActions} onChange={handleAction} />\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t<Box marginTop={1}>\n\t\t\t\t<Text dimColor>1-4:panels q:quit</Text>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","/**\n * SnapshotPanel - snapshot browser with action menu.\n *\n * Lists snapshots ordered by creation date (newest first).\n * Select component from @inkjs/ui handles keyboard navigation within the list.\n * Actions: restore, diff, delete (+ back to list).\n *\n * Pattern: RESEARCH.md don't-hand-roll: \"Use Select from @inkjs/ui for scrollable menus\"\n *\n * @module ui/tui/panels/SnapshotPanel\n */\nimport { Alert, Select, Spinner } from \"@inkjs/ui\";\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { Box, Text } from \"ink\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface SnapshotItem {\n\tid: string;\n\trelativePath: string;\n\tfilePath: string;\n\ttrigger: string;\n\tcreatedAt: string;\n}\n\ntype ViewMode = \"list\" | \"action\";\n\ninterface SnapshotPanelProps {\n\tclient: VrekoLocalClient;\n}\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\nfunction formatSnapshotDate(ts: string): string {\n\tconst d = new Date(ts);\n\treturn d.toLocaleString(\"en-US\", {\n\t\tmonth: \"short\",\n\t\tday: \"numeric\",\n\t\thour: \"2-digit\",\n\t\tminute: \"2-digit\",\n\t});\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function SnapshotPanel({ client }: SnapshotPanelProps) {\n\tconst [snapshots, setSnapshots] = useState<SnapshotItem[]>([]);\n\tconst [totalCount, setTotalCount] = useState(0);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [viewMode, setViewMode] = useState<ViewMode>(\"list\");\n\tconst [selectedId, setSelectedId] = useState<string | null>(null);\n\tconst [actionResult, setActionResult] = useState<string | null>(null);\n\tconst [page, setPage] = useState(0);\n\tconst hasStarted = useRef(false); // StrictMode guard\n\n\tconst PAGE_SIZE = 20;\n\n\t// Load snapshots on mount (and page change)\n\tuseEffect(() => {\n\t\tif (hasStarted.current && page === 0) {\n\t\t\treturn;\n\t\t}\n\t\thasStarted.current = true;\n\t\tlet cancelled = false;\n\n\t\tconst load = async () => {\n\t\t\tsetIsLoading(true);\n\t\t\ttry {\n\t\t\t\tconst result = await client.snapshot.list({\n\t\t\t\t\tlimit: PAGE_SIZE,\n\t\t\t\t\tcursor: page > 0 ? String(page * PAGE_SIZE) : undefined,\n\t\t\t\t\torderBy: \"createdAt\",\n\t\t\t\t\torderDir: \"desc\",\n\t\t\t\t});\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst items: SnapshotItem[] = result.snapshots.map((s) => ({\n\t\t\t\t\tid: s.id,\n\t\t\t\t\trelativePath: s.relativePath,\n\t\t\t\t\tfilePath: s.filePath,\n\t\t\t\t\ttrigger: s.trigger,\n\t\t\t\t\tcreatedAt: s.createdAt,\n\t\t\t\t}));\n\t\t\t\tsetSnapshots((prev) => (page === 0 ? items : [...prev, ...items]));\n\t\t\t\tsetTotalCount(result.totalCount ?? result.snapshots.length);\n\t\t\t\tsetError(null);\n\t\t\t} catch (err) {\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetError(err instanceof Error ? err.message : String(err));\n\t\t\t} finally {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tload();\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [client, page]);\n\n\t// Build Select options for snapshot list\n\tconst snapshotOptions = [\n\t\t...snapshots.map((s) => ({\n\t\t\tlabel: `${formatSnapshotDate(s.createdAt)} [${s.trigger}] ${s.relativePath}`,\n\t\t\tvalue: s.id,\n\t\t})),\n\t\t...(snapshots.length < totalCount\n\t\t\t? [{ label: `Load more (${totalCount - snapshots.length} remaining)`, value: \"__load_more__\" }]\n\t\t\t: []),\n\t];\n\n\t// Action menu options for a selected snapshot\n\tconst actionOptions = [\n\t\t{ label: \"Restore this snapshot\", value: \"restore\" },\n\t\t{ label: \"Diff against current file\", value: \"diff\" },\n\t\t{ label: \"Delete snapshot\", value: \"delete\" },\n\t\t{ label: \"Back to list\", value: \"back\" },\n\t];\n\n\tconst handleSnapshotSelect = (value: string) => {\n\t\tif (value === \"__load_more__\") {\n\t\t\tsetPage((p) => p + 1);\n\t\t\treturn;\n\t\t}\n\t\tsetSelectedId(value);\n\t\tsetViewMode(\"action\");\n\t\tsetActionResult(null);\n\t};\n\n\tconst handleAction = async (action: string) => {\n\t\tif (action === \"back\") {\n\t\t\tsetViewMode(\"list\");\n\t\t\tsetSelectedId(null);\n\t\t\treturn;\n\t\t}\n\t\tif (!selectedId) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetActionResult(null);\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"restore\": {\n\t\t\t\t\tawait client.snapshot.restore({ snapshotId: selectedId, createBackup: true, dryRun: false });\n\t\t\t\t\tsetActionResult(\"Snapshot restored successfully.\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"diff\": {\n\t\t\t\t\tconst result = await client.snapshot.diff({\n\t\t\t\t\t\tbaseSnapshotId: selectedId,\n\t\t\t\t\t\tcontextLines: 3,\n\t\t\t\t\t\tformat: \"unified\",\n\t\t\t\t\t});\n\t\t\t\t\tconst stats = result.stats;\n\t\t\t\t\tsetActionResult(\n\t\t\t\t\t\t`Diff: +${stats.additions} -${stats.deletions} across ${stats.filesChanged} file(s)`,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tawait client.snapshot.delete({ snapshotIds: [selectedId], dryRun: false });\n\t\t\t\t\tsetActionResult(\"Snapshot deleted.\");\n\t\t\t\t\t// Refresh list\n\t\t\t\t\thasStarted.current = false;\n\t\t\t\t\tsetPage(0);\n\t\t\t\t\tsetSnapshots([]);\n\t\t\t\t\tsetViewMode(\"list\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tsetActionResult(`Error: ${err instanceof Error ? err.message : String(err)}`);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t<Text bold>Snapshots ({totalCount} total)</Text>\n\n\t\t\t{error && (\n\t\t\t\t<Box marginTop={1}>\n\t\t\t\t\t<Alert variant=\"error\">{error}</Alert>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{isLoading && snapshots.length === 0 && <Spinner label=\"Loading snapshots...\" />}\n\n\t\t\t{!isLoading && snapshots.length === 0 && !error && (\n\t\t\t\t<Box marginTop={1}>\n\t\t\t\t\t<Text dimColor>No snapshots yet. Vreko creates snapshots automatically as you work with AI.</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{viewMode === \"list\" && snapshotOptions.length > 0 && (\n\t\t\t\t<Box marginTop={1} flexDirection=\"column\">\n\t\t\t\t\t<Text dimColor>↑↓ navigate ENTER select 1-4:panels</Text>\n\t\t\t\t\t<Select options={snapshotOptions} onChange={handleSnapshotSelect} visibleOptionCount={12} />\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{viewMode === \"action\" && selectedId && (\n\t\t\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t\t\t<Text>\n\t\t\t\t\t\tSelected: <Text bold>{selectedId.slice(0, 8)}</Text>\n\t\t\t\t\t</Text>\n\t\t\t\t\t{actionResult && (\n\t\t\t\t\t\t<Box marginY={1}>\n\t\t\t\t\t\t\t<Alert variant={actionResult.startsWith(\"Error\") ? \"error\" : \"success\"}>\n\t\t\t\t\t\t\t\t{actionResult}\n\t\t\t\t\t\t\t</Alert>\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t)}\n\t\t\t\t\t<Select options={actionOptions} onChange={handleAction} />\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t<Box marginTop={1}>\n\t\t\t\t<Text dimColor>1-4:panels q:quit</Text>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","/**\n * StatusPanel - focused workspace health and daemon status view.\n *\n * Shown when user runs `vr status` (launchTui('dashboard') with statusFocus=true).\n * Displays: daemon connection, workspace health signals, protection active count,\n * invariant check status (from .vreko/invariants/).\n *\n * @module ui/tui/panels/StatusPanel\n */\nimport { Alert, Badge, Spinner } from \"@inkjs/ui\";\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { Box, Text } from \"ink\";\nimport { VrekoHeader } from \"../../brand.js\";\nimport { BRAND_COLORS } from \"../../theme.js\";\nimport { useDaemonPolling } from \"../hooks/useDaemonPolling.js\";\nimport { useSlowPolling } from \"../hooks/useSlowPolling.js\";\n\ninterface StatusPanelProps {\n\tclient: VrekoLocalClient;\n}\n\nexport function StatusPanel({ client }: StatusPanelProps) {\n\tconst { daemon, error: daemonError } = useDaemonPolling(client, 5000);\n\tconst { snapshots, learnings, momentum, error: slowError } = useSlowPolling(client, 60000);\n\n\tconst isConnected = daemon !== null;\n\tconst error = daemonError ?? slowError;\n\tconst daemonVersion = daemon?.version ?? \" - \";\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t<VrekoHeader version={daemonVersion} subtitle=\"workspace status\" />\n\n\t\t\t{/* Daemon status badge */}\n\t\t\t<Box marginBottom={1}>\n\t\t\t\t<Badge color={isConnected ? \"green\" : \"red\"}>\n\t\t\t\t\t{isConnected\n\t\t\t\t\t\t? `daemon v${daemonVersion} pid:${daemon?.pid} uptime:${daemon?.uptime}`\n\t\t\t\t\t\t: \"daemon offline - run: vr service start\"}\n\t\t\t\t</Badge>\n\t\t\t</Box>\n\n\t\t\t{error && (\n\t\t\t\t<Box marginBottom={1}>\n\t\t\t\t\t<Alert variant=\"warning\">{error}</Alert>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Health signals table */}\n\t\t\t<Box flexDirection=\"column\" borderStyle=\"round\" paddingX={1} marginBottom={1}>\n\t\t\t\t<Text bold>Workspace Health</Text>\n\t\t\t\t<Text>\n\t\t\t\t\tSnapshots <Text color={BRAND_COLORS.primary}>{snapshots.count}</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\tLearnings <Text color={BRAND_COLORS.primary}>{learnings.count}</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\tMomentum{\" \"}\n\t\t\t\t\t<Text dimColor>{momentum ? `${Math.round(momentum.averageScore * 100)}%` : \"uncalibrated\"}</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\tConnection{\" \"}\n\t\t\t\t\t{isConnected ? (\n\t\t\t\t\t\t<Text color={BRAND_COLORS.primary}>healthy</Text>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Text color={BRAND_COLORS.error}>offline</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Text>\n\t\t\t</Box>\n\n\t\t\t{!daemon && <Spinner label=\"Connecting to daemon...\" />}\n\n\t\t\t<Box marginTop={1}>\n\t\t\t\t<Text dimColor>r:refresh 1-4:panels q:quit</Text>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","/**\n * TabBar - keyboard-navigable panel tab strip.\n *\n * Shows active panel highlighted in brand green; others dimmed.\n * Adapts label length when terminal is narrower than 80 columns.\n * Pattern: RESEARCH.md Pattern 2 (Responsive Tab Bar)\n */\nimport { Box, Text } from \"ink\";\nimport type { PanelId } from \"./TuiApp.js\";\n\nconst LABELS: Record<PanelId, [full: string, short: string]> = {\n\tdashboard: [\"[1] Dashboard\", \"[1]\"],\n\tsession: [\"[2] Session\", \"[2]\"],\n\tsnapshots: [\"[3] Snapshots\", \"[3]\"],\n\tlearnings: [\"[4] Learnings\", \"[4]\"],\n};\n\nconst PANELS: PanelId[] = [\"dashboard\", \"session\", \"snapshots\", \"learnings\"];\n\ninterface TabBarProps {\n\tactive: PanelId;\n}\n\nexport function TabBar({ active }: TabBarProps) {\n\tconst columns = process.stdout.columns ?? 80;\n\tconst narrow = columns < 80;\n\treturn (\n\t\t<Box\n\t\t\tgap={2}\n\t\t\tmarginBottom={1}\n\t\t\tborderStyle=\"single\"\n\t\t\tborderColor=\"#4ADE80\" // brand-color-allowed\n\t\t\tpaddingX={1}\n\t\t>\n\t\t\t{PANELS.map((p) => (\n\t\t\t\t<Text\n\t\t\t\t\tkey={p}\n\t\t\t\t\tcolor={p === active ? \"#4ADE80\" : undefined} // brand-color-allowed\n\t\t\t\t\tbold={p === active}\n\t\t\t\t\tdimColor={p !== active}\n\t\t\t\t>\n\t\t\t\t\t{narrow ? LABELS[p][1] : LABELS[p][0]}\n\t\t\t\t</Text>\n\t\t\t))}\n\t\t\t<Text dimColor> q:quit r:refresh</Text>\n\t\t</Box>\n\t);\n}\n","/**\n * TuiApp - root panel router for the Vreko TUI.\n *\n * Owns activePanel state, keyboard navigation, and panel mounting.\n * All panels are conditionally rendered (not mounted simultaneously).\n * Pattern: commands/init/tui/App.tsx (frame-machine pattern)\n * RESEARCH.md Pattern 1 (Panel Router with useReducer + useInput)\n *\n * @module ui/tui/TuiApp\n */\nimport type { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { Box, useApp, useInput } from \"ink\";\nimport { useEffect, useState } from \"react\";\nimport { VrekoTheme } from \"../ink-theme.js\";\nimport { InkErrorBoundary } from \"./InkErrorBoundary.js\";\nimport { DashboardPanel } from \"./panels/DashboardPanel.js\";\nimport { LearningsPanel } from \"./panels/LearningsPanel.js\";\nimport { SessionPanel } from \"./panels/SessionPanel.js\";\nimport { SnapshotPanel } from \"./panels/SnapshotPanel.js\";\nimport { StatusPanel } from \"./panels/StatusPanel.js\";\nimport { TabBar } from \"./TabBar.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type PanelId = \"dashboard\" | \"session\" | \"snapshots\" | \"learnings\";\n\nconst PANELS: PanelId[] = [\"dashboard\", \"session\", \"snapshots\", \"learnings\"];\n\nexport interface TuiAppProps {\n\tclient: VrekoLocalClient;\n\tinitialPanel?: PanelId;\n\t/** When true, shows StatusPanel instead of DashboardPanel on tab 1 (used by `vr status`) */\n\tstatusFocus?: boolean;\n}\n\n// =============================================================================\n// ROOT COMPONENT\n// =============================================================================\n\nexport function TuiApp({ client, initialPanel = \"dashboard\", statusFocus = false }: TuiAppProps) {\n\tconst { exit } = useApp();\n\tconst [activePanel, setActivePanel] = useState<PanelId>(initialPanel);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tclient.close();\n\t\t};\n\t}, [client]);\n\n\tuseInput((input, key) => {\n\t\t// Quit\n\t\tif (input === \"q\" || (key.ctrl && input === \"c\")) {\n\t\t\texit();\n\t\t\treturn;\n\t\t}\n\t\t// Direct panel select\n\t\tif (input === \"1\") {\n\t\t\tsetActivePanel(\"dashboard\");\n\t\t\treturn;\n\t\t}\n\t\tif (input === \"2\") {\n\t\t\tsetActivePanel(\"session\");\n\t\t\treturn;\n\t\t}\n\t\tif (input === \"3\") {\n\t\t\tsetActivePanel(\"snapshots\");\n\t\t\treturn;\n\t\t}\n\t\tif (input === \"4\") {\n\t\t\tsetActivePanel(\"learnings\");\n\t\t\treturn;\n\t\t}\n\t\t// Arrow key cycle\n\t\tif (key.rightArrow) {\n\t\t\tconst idx = PANELS.indexOf(activePanel);\n\t\t\tsetActivePanel(PANELS[(idx + 1) % PANELS.length]);\n\t\t\treturn;\n\t\t}\n\t\tif (key.leftArrow) {\n\t\t\tconst idx = PANELS.indexOf(activePanel);\n\t\t\tsetActivePanel(PANELS[(idx - 1 + PANELS.length) % PANELS.length]);\n\t\t}\n\t});\n\n\treturn (\n\t\t<VrekoTheme>\n\t\t\t<Box flexDirection=\"column\">\n\t\t\t\t<TabBar active={activePanel} />\n\t\t\t\t{activePanel === \"dashboard\" && (\n\t\t\t\t\t<InkErrorBoundary panel=\"dashboard\">\n\t\t\t\t\t\t{statusFocus ? <StatusPanel client={client} /> : <DashboardPanel client={client} />}\n\t\t\t\t\t</InkErrorBoundary>\n\t\t\t\t)}\n\t\t\t\t{activePanel === \"session\" && (\n\t\t\t\t\t<InkErrorBoundary panel=\"session\">\n\t\t\t\t\t\t<SessionPanel client={client} />\n\t\t\t\t\t</InkErrorBoundary>\n\t\t\t\t)}\n\t\t\t\t{activePanel === \"snapshots\" && (\n\t\t\t\t\t<InkErrorBoundary panel=\"snapshots\">\n\t\t\t\t\t\t<SnapshotPanel client={client} />\n\t\t\t\t\t</InkErrorBoundary>\n\t\t\t\t)}\n\t\t\t\t{activePanel === \"learnings\" && (\n\t\t\t\t\t<InkErrorBoundary panel=\"learnings\">\n\t\t\t\t\t\t<LearningsPanel client={client} />\n\t\t\t\t\t</InkErrorBoundary>\n\t\t\t\t)}\n\t\t\t</Box>\n\t\t</VrekoTheme>\n\t);\n}\n"]}
|