@datarecce/ui 0.1.41 → 0.2.1-nightly.20260402

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (717) hide show
  1. package/README.md +28 -133
  2. package/dist/AuthModal-B38pWD3T.js +7 -0
  3. package/dist/AuthModal-B38pWD3T.js.map +1 -0
  4. package/dist/RouteConfigContext-DWFg6bll.d.ts +171 -0
  5. package/dist/RouteConfigContext-DWFg6bll.d.ts.map +1 -0
  6. package/dist/RunProgress-BCFXvUsE.d.ts +429 -0
  7. package/dist/RunProgress-BCFXvUsE.d.ts.map +1 -0
  8. package/dist/ScreenshotDataGrid-BAsPWcde.d.ts +63 -0
  9. package/dist/ScreenshotDataGrid-BAsPWcde.d.ts.map +1 -0
  10. package/dist/SplitPane-g8w-XF2_.d.ts +1607 -0
  11. package/dist/SplitPane-g8w-XF2_.d.ts.map +1 -0
  12. package/dist/advanced.d.ts +17 -0
  13. package/dist/advanced.d.ts.map +1 -0
  14. package/dist/advanced.js +3 -0
  15. package/dist/advanced.js.map +1 -0
  16. package/dist/api-BwiRz6pD.d.ts +254 -0
  17. package/dist/api-BwiRz6pD.d.ts.map +1 -0
  18. package/dist/api-CbzeUNef.js +3 -0
  19. package/dist/api-CbzeUNef.js.map +1 -0
  20. package/dist/api.d.ts +3 -2
  21. package/dist/api.js +2 -100
  22. package/dist/colors-BbPSDR1X.js +3 -0
  23. package/dist/colors-BbPSDR1X.js.map +1 -0
  24. package/dist/components-run.d.ts +5 -0
  25. package/dist/components-run.js +2 -0
  26. package/dist/components.d.ts +9 -2
  27. package/dist/components.js +2 -86
  28. package/dist/constants-D-hOGDbU.js +3 -0
  29. package/dist/constants-D-hOGDbU.js.map +1 -0
  30. package/dist/constants.d.ts +3 -0
  31. package/dist/constants.js +2 -0
  32. package/dist/contexts.d.ts +6 -0
  33. package/dist/contexts.js +2 -0
  34. package/dist/fetchClient-Bqjx8inP.js +3 -0
  35. package/dist/fetchClient-Bqjx8inP.js.map +1 -0
  36. package/dist/fetchClient-CTnJ39EA.d.ts +19 -0
  37. package/dist/fetchClient-CTnJ39EA.d.ts.map +1 -0
  38. package/dist/hooks.d.ts +3 -2
  39. package/dist/hooks.js +2 -43
  40. package/dist/index-B1IyNkDA.d.ts +472 -0
  41. package/dist/index-B1IyNkDA.d.ts.map +1 -0
  42. package/dist/index-BJOCIgE1.d.ts +148 -0
  43. package/dist/index-BJOCIgE1.d.ts.map +1 -0
  44. package/dist/index-C9nBECPv.d.ts +212 -0
  45. package/dist/index-C9nBECPv.d.ts.map +1 -0
  46. package/dist/index-CHJ0PCEg.d.ts +380 -0
  47. package/dist/index-CHJ0PCEg.d.ts.map +1 -0
  48. package/dist/index-CZ7gueQV.d.ts +13 -0
  49. package/dist/index-CZ7gueQV.d.ts.map +1 -0
  50. package/dist/index-CaKcjGJC.d.ts +1536 -0
  51. package/dist/index-CaKcjGJC.d.ts.map +1 -0
  52. package/dist/index-D-H3NTdf.d.ts +744 -0
  53. package/dist/index-D-H3NTdf.d.ts.map +1 -0
  54. package/dist/index-Dh6gw0NG.d.ts +351 -0
  55. package/dist/index-Dh6gw0NG.d.ts.map +1 -0
  56. package/dist/index-Dp-BUtpt.d.ts +704 -0
  57. package/dist/index-Dp-BUtpt.d.ts.map +1 -0
  58. package/dist/index.d.ts +17 -2
  59. package/dist/index.js +2 -198
  60. package/dist/instanceInfo-DNLFhkK8.d.ts +909 -0
  61. package/dist/instanceInfo-DNLFhkK8.d.ts.map +1 -0
  62. package/dist/keepAlive-Dj0q3fC9.js +3 -0
  63. package/dist/keepAlive-Dj0q3fC9.js.map +1 -0
  64. package/dist/lib/api/queryClient.d.ts +8 -0
  65. package/dist/lib/api/queryClient.d.ts.map +1 -0
  66. package/dist/lib/api/queryClient.js +3 -0
  67. package/dist/lib/api/queryClient.js.map +1 -0
  68. package/dist/lib/api/track.d.ts +137 -0
  69. package/dist/lib/api/track.d.ts.map +1 -0
  70. package/dist/lib/api/track.js +3 -0
  71. package/dist/lib/api/track.js.map +1 -0
  72. package/dist/lib/api/user.d.ts +16 -0
  73. package/dist/lib/api/user.d.ts.map +1 -0
  74. package/dist/lib/api/user.js +3 -0
  75. package/dist/lib/api/user.js.map +1 -0
  76. package/dist/lib/const.d.ts +8 -0
  77. package/dist/lib/const.d.ts.map +1 -0
  78. package/dist/lib/const.js +3 -0
  79. package/dist/lib/const.js.map +1 -0
  80. package/dist/lib/result/ResultErrorFallback.d.ts +8 -0
  81. package/dist/lib/result/ResultErrorFallback.d.ts.map +1 -0
  82. package/dist/lib/result/ResultErrorFallback.js +3 -0
  83. package/dist/lib/result/ResultErrorFallback.js.map +1 -0
  84. package/dist/lineage-DsKqx9yh.d.ts +1299 -0
  85. package/dist/lineage-DsKqx9yh.d.ts.map +1 -0
  86. package/dist/primitives-D8s_Rs5T.d.ts +1089 -0
  87. package/dist/primitives-D8s_Rs5T.d.ts.map +1 -0
  88. package/dist/primitives.d.ts +8 -0
  89. package/dist/primitives.js +2 -0
  90. package/dist/result.d.ts +3 -0
  91. package/dist/result.js +2 -0
  92. package/dist/src-BH-TT0Mt.js +12 -0
  93. package/dist/src-BH-TT0Mt.js.map +1 -0
  94. package/dist/style.css +290 -0
  95. package/dist/styles.css +478 -4
  96. package/dist/theme-B_XT39eO.js +3 -0
  97. package/dist/theme-B_XT39eO.js.map +1 -0
  98. package/dist/theme.d.ts +2 -2
  99. package/dist/theme.js +2 -9
  100. package/dist/types-DLRfpcrV.d.ts +234 -0
  101. package/dist/types-DLRfpcrV.d.ts.map +1 -0
  102. package/dist/types-qpgIe7MT.d.ts +171 -0
  103. package/dist/types-qpgIe7MT.d.ts.map +1 -0
  104. package/dist/types.d.ts +10 -2
  105. package/dist/types.js +3 -9
  106. package/dist/types.js.map +1 -0
  107. package/dist/useThemeColors-OwCMwSrx.d.ts +79 -0
  108. package/dist/useThemeColors-OwCMwSrx.d.ts.map +1 -0
  109. package/dist/utils-BwEuAiEd.js +3 -0
  110. package/dist/utils-BwEuAiEd.js.map +1 -0
  111. package/dist/utils-Crcz1Rb5.js +6 -0
  112. package/dist/utils-Crcz1Rb5.js.map +1 -0
  113. package/dist/utils.d.ts +3 -0
  114. package/dist/utils.js +2 -0
  115. package/package.json +142 -108
  116. package/LICENSE +0 -201
  117. package/dist/RecceCheckContext-BJprb2xR.js +0 -7968
  118. package/dist/RecceCheckContext-BJprb2xR.js.map +0 -1
  119. package/dist/RecceCheckContext-DPnWB_aU.css +0 -215
  120. package/dist/RecceCheckContext-DPnWB_aU.css.map +0 -1
  121. package/dist/RecceCheckContext-DbZ7BdRy.mjs +0 -7426
  122. package/dist/RecceCheckContext-DbZ7BdRy.mjs.map +0 -1
  123. package/dist/RecceCheckContext-DyxOeUsX.css +0 -215
  124. package/dist/RecceCheckContext-DyxOeUsX.css.map +0 -1
  125. package/dist/api.d.mts +0 -3
  126. package/dist/api.js.map +0 -1
  127. package/dist/api.mjs +0 -46
  128. package/dist/api.mjs.map +0 -1
  129. package/dist/components-BeAjVBV3.css +0 -70
  130. package/dist/components-BeAjVBV3.css.map +0 -1
  131. package/dist/components-DfXnN1Hx.js +0 -14689
  132. package/dist/components-DfXnN1Hx.js.map +0 -1
  133. package/dist/components-iUxcqtUB.css +0 -70
  134. package/dist/components-iUxcqtUB.css.map +0 -1
  135. package/dist/components-jh6r4tQn.mjs +0 -12348
  136. package/dist/components-jh6r4tQn.mjs.map +0 -1
  137. package/dist/components.d.mts +0 -3
  138. package/dist/components.mjs +0 -9
  139. package/dist/const-CaIm1Z8g.mjs +0 -12
  140. package/dist/const-CaIm1Z8g.mjs.map +0 -1
  141. package/dist/const-CvdZO0FN.js +0 -24
  142. package/dist/const-CvdZO0FN.js.map +0 -1
  143. package/dist/hooks-cQsBXBd1.js +0 -40
  144. package/dist/hooks-cQsBXBd1.js.map +0 -1
  145. package/dist/hooks-eaHm_yEp.mjs +0 -33
  146. package/dist/hooks-eaHm_yEp.mjs.map +0 -1
  147. package/dist/hooks.d.mts +0 -3
  148. package/dist/hooks.mjs +0 -8
  149. package/dist/html2canvas-pro.esm-CsuSOHXp.js +0 -7250
  150. package/dist/html2canvas-pro.esm-CsuSOHXp.js.map +0 -1
  151. package/dist/html2canvas-pro.esm-E7kpobrC.mjs +0 -7249
  152. package/dist/html2canvas-pro.esm-E7kpobrC.mjs.map +0 -1
  153. package/dist/index-B5bpmv0i.d.mts +0 -2172
  154. package/dist/index-B5bpmv0i.d.mts.map +0 -1
  155. package/dist/index-B9lSPJTi.d.ts +0 -2170
  156. package/dist/index-B9lSPJTi.d.ts.map +0 -1
  157. package/dist/index.d.mts +0 -3
  158. package/dist/index.js.map +0 -1
  159. package/dist/index.mjs +0 -20
  160. package/dist/index.mjs.map +0 -1
  161. package/dist/mui-theme-CUhybmBq.mjs +0 -696
  162. package/dist/mui-theme-CUhybmBq.mjs.map +0 -1
  163. package/dist/mui-theme-iBHkjXJq.js +0 -732
  164. package/dist/mui-theme-iBHkjXJq.js.map +0 -1
  165. package/dist/state-CTITyT0R.js +0 -795
  166. package/dist/state-CTITyT0R.js.map +0 -1
  167. package/dist/state-Sc2b4jri.mjs +0 -382
  168. package/dist/state-Sc2b4jri.mjs.map +0 -1
  169. package/dist/theme.d.mts +0 -3
  170. package/dist/theme.mjs +0 -4
  171. package/dist/tooltipMessage-BC5W7H3X.js +0 -13
  172. package/dist/tooltipMessage-BC5W7H3X.js.map +0 -1
  173. package/dist/tooltipMessage-B_xMIKWL.mjs +0 -7
  174. package/dist/tooltipMessage-B_xMIKWL.mjs.map +0 -1
  175. package/dist/types.d.mts +0 -3
  176. package/dist/types.mjs +0 -6
  177. package/dist/urls-BQW5wjg-.js +0 -13
  178. package/dist/urls-BQW5wjg-.js.map +0 -1
  179. package/dist/urls-DT7FVEcS.mjs +0 -7
  180. package/dist/urls-DT7FVEcS.mjs.map +0 -1
  181. package/dist/version-B9s8yne-.js +0 -300
  182. package/dist/version-B9s8yne-.js.map +0 -1
  183. package/dist/version-DP1kU_7v.mjs +0 -162
  184. package/dist/version-DP1kU_7v.mjs.map +0 -1
  185. package/recce-source/.editorconfig +0 -26
  186. package/recce-source/.flake8 +0 -37
  187. package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +0 -67
  188. package/recce-source/.github/ISSUE_TEMPLATE/custom.md +0 -10
  189. package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
  190. package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +0 -21
  191. package/recce-source/.github/copilot-instructions.md +0 -331
  192. package/recce-source/.github/instructions/backend-instructions.md +0 -541
  193. package/recce-source/.github/instructions/frontend-instructions.md +0 -317
  194. package/recce-source/.github/workflows/build-statics.yaml +0 -72
  195. package/recce-source/.github/workflows/bump.yaml +0 -48
  196. package/recce-source/.github/workflows/integration-tests-cloud.yaml +0 -92
  197. package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +0 -33
  198. package/recce-source/.github/workflows/integration-tests.yaml +0 -52
  199. package/recce-source/.github/workflows/nightly.yaml +0 -246
  200. package/recce-source/.github/workflows/release.yaml +0 -196
  201. package/recce-source/.github/workflows/tests-js.yaml +0 -58
  202. package/recce-source/.github/workflows/tests-python.yaml +0 -128
  203. package/recce-source/.pre-commit-config.yaml +0 -26
  204. package/recce-source/CLAUDE.md +0 -483
  205. package/recce-source/CODE_OF_CONDUCT.md +0 -128
  206. package/recce-source/CONTRIBUTING.md +0 -107
  207. package/recce-source/LICENSE +0 -201
  208. package/recce-source/Makefile +0 -126
  209. package/recce-source/README.md +0 -182
  210. package/recce-source/RECCE_CLOUD.md +0 -81
  211. package/recce-source/SECURITY.md +0 -25
  212. package/recce-source/docs/PACKAGING.md +0 -340
  213. package/recce-source/docs/README.md +0 -1
  214. package/recce-source/docs/plans/2024-12-31-csv-download-design.md +0 -121
  215. package/recce-source/docs/plans/2024-12-31-csv-download-implementation.md +0 -930
  216. package/recce-source/integration_tests/dbt/dbt_project.yml +0 -26
  217. package/recce-source/integration_tests/dbt/models/customers.sql +0 -69
  218. package/recce-source/integration_tests/dbt/models/docs.md +0 -14
  219. package/recce-source/integration_tests/dbt/models/orders.sql +0 -56
  220. package/recce-source/integration_tests/dbt/models/schema.yml +0 -82
  221. package/recce-source/integration_tests/dbt/models/staging/schema.yml +0 -31
  222. package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +0 -22
  223. package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +0 -23
  224. package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +0 -25
  225. package/recce-source/integration_tests/dbt/packages.yml +0 -7
  226. package/recce-source/integration_tests/dbt/profiles.yml +0 -8
  227. package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +0 -101
  228. package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +0 -100
  229. package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +0 -114
  230. package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +0 -5
  231. package/recce-source/integration_tests/dbt/smoke_test.sh +0 -72
  232. package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +0 -71
  233. package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
  234. package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +0 -9
  235. package/recce-source/integration_tests/sqlmesh/audits/items.sql +0 -7
  236. package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +0 -7
  237. package/recce-source/integration_tests/sqlmesh/config.py +0 -171
  238. package/recce-source/integration_tests/sqlmesh/helper.py +0 -20
  239. package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
  240. package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
  241. package/recce-source/integration_tests/sqlmesh/macros/macros.py +0 -8
  242. package/recce-source/integration_tests/sqlmesh/macros/macros.sql +0 -8
  243. package/recce-source/integration_tests/sqlmesh/macros/utils.py +0 -11
  244. package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +0 -25
  245. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +0 -41
  246. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +0 -60
  247. package/recce-source/integration_tests/sqlmesh/models/customers.sql +0 -32
  248. package/recce-source/integration_tests/sqlmesh/models/items.py +0 -95
  249. package/recce-source/integration_tests/sqlmesh/models/marketing.sql +0 -15
  250. package/recce-source/integration_tests/sqlmesh/models/order_items.py +0 -95
  251. package/recce-source/integration_tests/sqlmesh/models/orders.py +0 -70
  252. package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +0 -62
  253. package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +0 -23
  254. package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +0 -29
  255. package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +0 -10
  256. package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +0 -29
  257. package/recce-source/integration_tests/sqlmesh/models/waiters.py +0 -62
  258. package/recce-source/integration_tests/sqlmesh/prep_env.sh +0 -16
  259. package/recce-source/integration_tests/sqlmesh/schema.yaml +0 -5
  260. package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +0 -11
  261. package/recce-source/integration_tests/sqlmesh/test_server.sh +0 -29
  262. package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +0 -63
  263. package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +0 -72
  264. package/recce-source/js/.editorconfig +0 -27
  265. package/recce-source/js/.env.development +0 -5
  266. package/recce-source/js/.husky/pre-commit +0 -29
  267. package/recce-source/js/.nvmrc +0 -1
  268. package/recce-source/js/README.md +0 -39
  269. package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +0 -65
  270. package/recce-source/js/app/(mainComponents)/NavBar.tsx +0 -228
  271. package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +0 -107
  272. package/recce-source/js/app/(mainComponents)/TopBar.tsx +0 -252
  273. package/recce-source/js/app/@lineage/default.tsx +0 -20
  274. package/recce-source/js/app/@lineage/page.tsx +0 -14
  275. package/recce-source/js/app/MainLayout.tsx +0 -170
  276. package/recce-source/js/app/Providers.tsx +0 -49
  277. package/recce-source/js/app/checks/page.tsx +0 -296
  278. package/recce-source/js/app/error.tsx +0 -93
  279. package/recce-source/js/app/favicon.ico +0 -0
  280. package/recce-source/js/app/global-error.tsx +0 -115
  281. package/recce-source/js/app/global.css +0 -82
  282. package/recce-source/js/app/layout.tsx +0 -48
  283. package/recce-source/js/app/lineage/page.tsx +0 -15
  284. package/recce-source/js/app/page.tsx +0 -12
  285. package/recce-source/js/app/query/page.tsx +0 -8
  286. package/recce-source/js/biome.json +0 -313
  287. package/recce-source/js/jest.config.js +0 -34
  288. package/recce-source/js/jest.globals.d.ts +0 -32
  289. package/recce-source/js/jest.setup.js +0 -91
  290. package/recce-source/js/next.config.js +0 -16
  291. package/recce-source/js/package-lock.json +0 -13843
  292. package/recce-source/js/package.json +0 -123
  293. package/recce-source/js/pnpm-lock.yaml +0 -9235
  294. package/recce-source/js/pnpm-workspace.yaml +0 -6
  295. package/recce-source/js/postcss.config.js +0 -5
  296. package/recce-source/js/public/auth_callback.html +0 -68
  297. package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
  298. package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
  299. package/recce-source/js/public/imgs/reload-image.svg +0 -4
  300. package/recce-source/js/public/logo/recce-logo-white.png +0 -0
  301. package/recce-source/js/src/components/AuthModal/AuthModal.tsx +0 -202
  302. package/recce-source/js/src/components/app/AvatarDropdown.tsx +0 -159
  303. package/recce-source/js/src/components/app/EnvInfo.tsx +0 -357
  304. package/recce-source/js/src/components/app/Filename.tsx +0 -388
  305. package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +0 -91
  306. package/recce-source/js/src/components/app/StateExporter.tsx +0 -57
  307. package/recce-source/js/src/components/app/StateImporter.tsx +0 -198
  308. package/recce-source/js/src/components/app/StateSharing.tsx +0 -145
  309. package/recce-source/js/src/components/app/StateSynchronizer.tsx +0 -205
  310. package/recce-source/js/src/components/charts/HistogramChart.tsx +0 -291
  311. package/recce-source/js/src/components/charts/SquareIcon.tsx +0 -51
  312. package/recce-source/js/src/components/charts/TopKSummaryList.tsx +0 -457
  313. package/recce-source/js/src/components/charts/chartTheme.ts +0 -74
  314. package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +0 -97
  315. package/recce-source/js/src/components/check/CheckDescription.tsx +0 -134
  316. package/recce-source/js/src/components/check/CheckDetail.tsx +0 -797
  317. package/recce-source/js/src/components/check/CheckEmptyState.tsx +0 -84
  318. package/recce-source/js/src/components/check/CheckList.tsx +0 -320
  319. package/recce-source/js/src/components/check/LineageDiffView.tsx +0 -32
  320. package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +0 -48
  321. package/recce-source/js/src/components/check/SchemaDiffView.tsx +0 -290
  322. package/recce-source/js/src/components/check/check.ts +0 -25
  323. package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +0 -163
  324. package/recce-source/js/src/components/check/timeline/CommentInput.tsx +0 -84
  325. package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +0 -468
  326. package/recce-source/js/src/components/check/timeline/index.ts +0 -12
  327. package/recce-source/js/src/components/check/utils.ts +0 -12
  328. package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +0 -333
  329. package/recce-source/js/src/components/data-grid/agGridStyles.css +0 -55
  330. package/recce-source/js/src/components/data-grid/agGridTheme.ts +0 -43
  331. package/recce-source/js/src/components/editor/CodeEditor.tsx +0 -107
  332. package/recce-source/js/src/components/editor/DiffEditor.tsx +0 -162
  333. package/recce-source/js/src/components/editor/index.ts +0 -12
  334. package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +0 -87
  335. package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +0 -147
  336. package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +0 -63
  337. package/recce-source/js/src/components/icons/index.tsx +0 -142
  338. package/recce-source/js/src/components/lineage/ActionControl.tsx +0 -63
  339. package/recce-source/js/src/components/lineage/ActionTag.tsx +0 -141
  340. package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +0 -46
  341. package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +0 -327
  342. package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +0 -57
  343. package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +0 -199
  344. package/recce-source/js/src/components/lineage/GraphEdge.tsx +0 -59
  345. package/recce-source/js/src/components/lineage/GraphNode.tsx +0 -555
  346. package/recce-source/js/src/components/lineage/LineagePage.tsx +0 -10
  347. package/recce-source/js/src/components/lineage/LineageView.tsx +0 -1384
  348. package/recce-source/js/src/components/lineage/LineageViewContext.tsx +0 -86
  349. package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +0 -637
  350. package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +0 -64
  351. package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +0 -596
  352. package/recce-source/js/src/components/lineage/NodeSqlView.tsx +0 -136
  353. package/recce-source/js/src/components/lineage/NodeTag.tsx +0 -278
  354. package/recce-source/js/src/components/lineage/NodeView.tsx +0 -642
  355. package/recce-source/js/src/components/lineage/SandboxView.tsx +0 -436
  356. package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +0 -105
  357. package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +0 -52
  358. package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +0 -152
  359. package/recce-source/js/src/components/lineage/graph.test.ts +0 -31
  360. package/recce-source/js/src/components/lineage/graph.ts +0 -58
  361. package/recce-source/js/src/components/lineage/lineage.test.ts +0 -169
  362. package/recce-source/js/src/components/lineage/lineage.ts +0 -521
  363. package/recce-source/js/src/components/lineage/styles.css +0 -42
  364. package/recce-source/js/src/components/lineage/styles.tsx +0 -165
  365. package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +0 -352
  366. package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +0 -108
  367. package/recce-source/js/src/components/onboarding-guide/Notification.tsx +0 -62
  368. package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +0 -134
  369. package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +0 -243
  370. package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +0 -29
  371. package/recce-source/js/src/components/query/DiffText.tsx +0 -120
  372. package/recce-source/js/src/components/query/QueryDiffResultView.tsx +0 -468
  373. package/recce-source/js/src/components/query/QueryForm.tsx +0 -80
  374. package/recce-source/js/src/components/query/QueryPage.tsx +0 -282
  375. package/recce-source/js/src/components/query/QueryResultView.tsx +0 -180
  376. package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +0 -57
  377. package/recce-source/js/src/components/query/SqlEditor.tsx +0 -245
  378. package/recce-source/js/src/components/query/ToggleSwitch.tsx +0 -84
  379. package/recce-source/js/src/components/query/styles.css +0 -21
  380. package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +0 -428
  381. package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +0 -311
  382. package/recce-source/js/src/components/routing/Navigation.test.tsx +0 -256
  383. package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +0 -108
  384. package/recce-source/js/src/components/rowcount/delta.test.ts +0 -51
  385. package/recce-source/js/src/components/rowcount/delta.ts +0 -16
  386. package/recce-source/js/src/components/run/RunList.tsx +0 -303
  387. package/recce-source/js/src/components/run/RunModal.tsx +0 -191
  388. package/recce-source/js/src/components/run/RunPage.tsx +0 -26
  389. package/recce-source/js/src/components/run/RunResultPane.tsx +0 -578
  390. package/recce-source/js/src/components/run/RunStatusAndDate.tsx +0 -106
  391. package/recce-source/js/src/components/run/RunToolbar.tsx +0 -70
  392. package/recce-source/js/src/components/run/RunView.tsx +0 -196
  393. package/recce-source/js/src/components/run/registry.ts +0 -214
  394. package/recce-source/js/src/components/run/types.ts +0 -14
  395. package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +0 -169
  396. package/recce-source/js/src/components/schema/ColumnNameCell.tsx +0 -198
  397. package/recce-source/js/src/components/schema/SchemaView.tsx +0 -336
  398. package/recce-source/js/src/components/schema/schemaDiff.ts +0 -32
  399. package/recce-source/js/src/components/schema/style.css +0 -134
  400. package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +0 -39
  401. package/recce-source/js/src/components/shared/HistoryToggle.tsx +0 -35
  402. package/recce-source/js/src/components/split/Split.tsx +0 -40
  403. package/recce-source/js/src/components/split/styles.css +0 -24
  404. package/recce-source/js/src/components/summary/ChangeSummary.tsx +0 -264
  405. package/recce-source/js/src/components/summary/SchemaSummary.tsx +0 -123
  406. package/recce-source/js/src/components/summary/SummaryView.tsx +0 -29
  407. package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +0 -48
  408. package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +0 -58
  409. package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +0 -73
  410. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +0 -228
  411. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +0 -113
  412. package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +0 -72
  413. package/recce-source/js/src/components/ui/dataGrid/index.ts +0 -23
  414. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +0 -607
  415. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +0 -211
  416. package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +0 -452
  417. package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +0 -142
  418. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +0 -178
  419. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +0 -275
  420. package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +0 -134
  421. package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +0 -364
  422. package/recce-source/js/src/components/ui/mui/index.ts +0 -13
  423. package/recce-source/js/src/components/ui/mui-provider.tsx +0 -67
  424. package/recce-source/js/src/components/ui/mui-theme.ts +0 -1039
  425. package/recce-source/js/src/components/ui/mui-utils.ts +0 -113
  426. package/recce-source/js/src/components/ui/toaster.tsx +0 -288
  427. package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +0 -216
  428. package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +0 -246
  429. package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +0 -81
  430. package/recce-source/js/src/components/valuediff/shared.ts +0 -33
  431. package/recce-source/js/src/constants/tooltipMessage.ts +0 -3
  432. package/recce-source/js/src/constants/urls.ts +0 -1
  433. package/recce-source/js/src/lib/UrlHash.ts +0 -12
  434. package/recce-source/js/src/lib/api/adhocQuery.ts +0 -70
  435. package/recce-source/js/src/lib/api/axiosClient.ts +0 -9
  436. package/recce-source/js/src/lib/api/cacheKeys.ts +0 -13
  437. package/recce-source/js/src/lib/api/checkEvents.ts +0 -252
  438. package/recce-source/js/src/lib/api/checks.ts +0 -129
  439. package/recce-source/js/src/lib/api/cll.ts +0 -53
  440. package/recce-source/js/src/lib/api/connectToCloud.ts +0 -13
  441. package/recce-source/js/src/lib/api/flag.ts +0 -37
  442. package/recce-source/js/src/lib/api/info.ts +0 -198
  443. package/recce-source/js/src/lib/api/instanceInfo.ts +0 -25
  444. package/recce-source/js/src/lib/api/keepAlive.ts +0 -108
  445. package/recce-source/js/src/lib/api/lineagecheck.ts +0 -35
  446. package/recce-source/js/src/lib/api/localStorageKeys.ts +0 -7
  447. package/recce-source/js/src/lib/api/models.ts +0 -59
  448. package/recce-source/js/src/lib/api/profile.ts +0 -65
  449. package/recce-source/js/src/lib/api/rowcount.ts +0 -19
  450. package/recce-source/js/src/lib/api/runs.ts +0 -174
  451. package/recce-source/js/src/lib/api/schemacheck.ts +0 -31
  452. package/recce-source/js/src/lib/api/select.ts +0 -25
  453. package/recce-source/js/src/lib/api/sessionStorageKeys.ts +0 -8
  454. package/recce-source/js/src/lib/api/state.ts +0 -117
  455. package/recce-source/js/src/lib/api/track.ts +0 -281
  456. package/recce-source/js/src/lib/api/types.ts +0 -284
  457. package/recce-source/js/src/lib/api/user.ts +0 -42
  458. package/recce-source/js/src/lib/api/valuediff.ts +0 -46
  459. package/recce-source/js/src/lib/api/version.ts +0 -40
  460. package/recce-source/js/src/lib/const.ts +0 -9
  461. package/recce-source/js/src/lib/csv/extractors.test.ts +0 -456
  462. package/recce-source/js/src/lib/csv/extractors.ts +0 -468
  463. package/recce-source/js/src/lib/csv/format.test.ts +0 -211
  464. package/recce-source/js/src/lib/csv/format.ts +0 -44
  465. package/recce-source/js/src/lib/csv/index.test.ts +0 -155
  466. package/recce-source/js/src/lib/csv/index.ts +0 -109
  467. package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +0 -626
  468. package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +0 -2140
  469. package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +0 -397
  470. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +0 -132
  471. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +0 -126
  472. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +0 -1627
  473. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +0 -140
  474. package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +0 -67
  475. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +0 -142
  476. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +0 -71
  477. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +0 -258
  478. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +0 -153
  479. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +0 -951
  480. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +0 -221
  481. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +0 -395
  482. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +0 -184
  483. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +0 -884
  484. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +0 -113
  485. package/recce-source/js/src/lib/dataGrid/index.ts +0 -51
  486. package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +0 -858
  487. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +0 -482
  488. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +0 -345
  489. package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +0 -698
  490. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +0 -820
  491. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +0 -277
  492. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +0 -785
  493. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +0 -370
  494. package/recce-source/js/src/lib/dataGrid/shared/index.ts +0 -81
  495. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +0 -909
  496. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +0 -325
  497. package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +0 -240
  498. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +0 -719
  499. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +0 -231
  500. package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +0 -559
  501. package/recce-source/js/src/lib/dataGrid/shared/validation.ts +0 -367
  502. package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +0 -1117
  503. package/recce-source/js/src/lib/formatSelect.ts +0 -50
  504. package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +0 -181
  505. package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +0 -177
  506. package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +0 -512
  507. package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +0 -269
  508. package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +0 -33
  509. package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +0 -54
  510. package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +0 -129
  511. package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +0 -98
  512. package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +0 -59
  513. package/recce-source/js/src/lib/hooks/ScreenShot.tsx +0 -399
  514. package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +0 -211
  515. package/recce-source/js/src/lib/hooks/useAppRouter.ts +0 -200
  516. package/recce-source/js/src/lib/hooks/useCSVExport.ts +0 -136
  517. package/recce-source/js/src/lib/hooks/useCheckEvents.ts +0 -99
  518. package/recce-source/js/src/lib/hooks/useCheckToast.tsx +0 -14
  519. package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +0 -27
  520. package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +0 -102
  521. package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +0 -130
  522. package/recce-source/js/src/lib/hooks/useGuideToast.tsx +0 -45
  523. package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +0 -185
  524. package/recce-source/js/src/lib/hooks/useModelColumns.tsx +0 -113
  525. package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +0 -13
  526. package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +0 -13
  527. package/recce-source/js/src/lib/hooks/useRun.tsx +0 -89
  528. package/recce-source/js/src/lib/hooks/useThemeColors.ts +0 -115
  529. package/recce-source/js/src/lib/mergeKeys.test.ts +0 -89
  530. package/recce-source/js/src/lib/mergeKeys.ts +0 -86
  531. package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +0 -9
  532. package/recce-source/js/src/lib/utils/formatTime.ts +0 -84
  533. package/recce-source/js/src/lib/utils/urls.ts +0 -16
  534. package/recce-source/js/src/utils/DropdownValuesInput.tsx +0 -297
  535. package/recce-source/js/src/utils/formatters.tsx +0 -237
  536. package/recce-source/js/src/utils/transforms.ts +0 -81
  537. package/recce-source/js/tsconfig.json +0 -47
  538. package/recce-source/macros/README.md +0 -8
  539. package/recce-source/macros/recce_athena.sql +0 -73
  540. package/recce-source/pyproject.toml +0 -109
  541. package/recce-source/recce/VERSION +0 -1
  542. package/recce-source/recce/__init__.py +0 -84
  543. package/recce-source/recce/adapter/__init__.py +0 -0
  544. package/recce-source/recce/adapter/base.py +0 -109
  545. package/recce-source/recce/adapter/dbt_adapter/__init__.py +0 -1699
  546. package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +0 -42
  547. package/recce-source/recce/adapter/sqlmesh_adapter.py +0 -141
  548. package/recce-source/recce/apis/__init__.py +0 -0
  549. package/recce-source/recce/apis/check_api.py +0 -203
  550. package/recce-source/recce/apis/check_events_api.py +0 -353
  551. package/recce-source/recce/apis/check_func.py +0 -130
  552. package/recce-source/recce/apis/run_api.py +0 -130
  553. package/recce-source/recce/apis/run_func.py +0 -258
  554. package/recce-source/recce/artifact.py +0 -266
  555. package/recce-source/recce/cli.py +0 -1846
  556. package/recce-source/recce/config.py +0 -127
  557. package/recce-source/recce/connect_to_cloud.py +0 -138
  558. package/recce-source/recce/core.py +0 -334
  559. package/recce-source/recce/diff.py +0 -26
  560. package/recce-source/recce/event/CONFIG +0 -1
  561. package/recce-source/recce/event/SENTRY_DNS +0 -1
  562. package/recce-source/recce/event/__init__.py +0 -304
  563. package/recce-source/recce/event/collector.py +0 -184
  564. package/recce-source/recce/event/track.py +0 -158
  565. package/recce-source/recce/exceptions.py +0 -21
  566. package/recce-source/recce/git.py +0 -77
  567. package/recce-source/recce/github.py +0 -222
  568. package/recce-source/recce/mcp_server.py +0 -885
  569. package/recce-source/recce/models/__init__.py +0 -6
  570. package/recce-source/recce/models/check.py +0 -481
  571. package/recce-source/recce/models/run.py +0 -46
  572. package/recce-source/recce/models/types.py +0 -218
  573. package/recce-source/recce/pull_request.py +0 -124
  574. package/recce-source/recce/run.py +0 -390
  575. package/recce-source/recce/server.py +0 -877
  576. package/recce-source/recce/state/__init__.py +0 -31
  577. package/recce-source/recce/state/cloud.py +0 -644
  578. package/recce-source/recce/state/const.py +0 -26
  579. package/recce-source/recce/state/local.py +0 -56
  580. package/recce-source/recce/state/state.py +0 -119
  581. package/recce-source/recce/state/state_loader.py +0 -174
  582. package/recce-source/recce/summary.py +0 -575
  583. package/recce-source/recce/tasks/__init__.py +0 -23
  584. package/recce-source/recce/tasks/core.py +0 -134
  585. package/recce-source/recce/tasks/dataframe.py +0 -170
  586. package/recce-source/recce/tasks/histogram.py +0 -433
  587. package/recce-source/recce/tasks/lineage.py +0 -19
  588. package/recce-source/recce/tasks/profile.py +0 -298
  589. package/recce-source/recce/tasks/query.py +0 -450
  590. package/recce-source/recce/tasks/rowcount.py +0 -277
  591. package/recce-source/recce/tasks/schema.py +0 -65
  592. package/recce-source/recce/tasks/top_k.py +0 -172
  593. package/recce-source/recce/tasks/utils.py +0 -147
  594. package/recce-source/recce/tasks/valuediff.py +0 -497
  595. package/recce-source/recce/util/__init__.py +0 -4
  596. package/recce-source/recce/util/api_token.py +0 -80
  597. package/recce-source/recce/util/breaking.py +0 -330
  598. package/recce-source/recce/util/cache.py +0 -25
  599. package/recce-source/recce/util/cll.py +0 -355
  600. package/recce-source/recce/util/cloud/__init__.py +0 -15
  601. package/recce-source/recce/util/cloud/base.py +0 -115
  602. package/recce-source/recce/util/cloud/check_events.py +0 -190
  603. package/recce-source/recce/util/cloud/checks.py +0 -242
  604. package/recce-source/recce/util/io.py +0 -120
  605. package/recce-source/recce/util/lineage.py +0 -83
  606. package/recce-source/recce/util/logger.py +0 -25
  607. package/recce-source/recce/util/onboarding_state.py +0 -45
  608. package/recce-source/recce/util/perf_tracking.py +0 -85
  609. package/recce-source/recce/util/pydantic_model.py +0 -22
  610. package/recce-source/recce/util/recce_cloud.py +0 -454
  611. package/recce-source/recce/util/singleton.py +0 -18
  612. package/recce-source/recce/util/startup_perf.py +0 -121
  613. package/recce-source/recce/yaml/__init__.py +0 -58
  614. package/recce-source/recce_cloud/README.md +0 -780
  615. package/recce-source/recce_cloud/VERSION +0 -1
  616. package/recce-source/recce_cloud/__init__.py +0 -24
  617. package/recce-source/recce_cloud/api/__init__.py +0 -17
  618. package/recce-source/recce_cloud/api/base.py +0 -132
  619. package/recce-source/recce_cloud/api/client.py +0 -186
  620. package/recce-source/recce_cloud/api/exceptions.py +0 -26
  621. package/recce-source/recce_cloud/api/factory.py +0 -63
  622. package/recce-source/recce_cloud/api/github.py +0 -106
  623. package/recce-source/recce_cloud/api/gitlab.py +0 -111
  624. package/recce-source/recce_cloud/artifact.py +0 -57
  625. package/recce-source/recce_cloud/ci_providers/__init__.py +0 -9
  626. package/recce-source/recce_cloud/ci_providers/base.py +0 -82
  627. package/recce-source/recce_cloud/ci_providers/detector.py +0 -147
  628. package/recce-source/recce_cloud/ci_providers/github_actions.py +0 -136
  629. package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +0 -130
  630. package/recce-source/recce_cloud/cli.py +0 -434
  631. package/recce-source/recce_cloud/download.py +0 -230
  632. package/recce-source/recce_cloud/hatch_build.py +0 -20
  633. package/recce-source/recce_cloud/pyproject.toml +0 -49
  634. package/recce-source/recce_cloud/upload.py +0 -214
  635. package/recce-source/test.py +0 -0
  636. package/recce-source/tests/__init__.py +0 -0
  637. package/recce-source/tests/adapter/__init__.py +0 -0
  638. package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
  639. package/recce-source/tests/adapter/dbt_adapter/conftest.py +0 -17
  640. package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -298
  641. package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -25
  642. package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -717
  643. package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +0 -4
  644. package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +0 -1
  645. package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +0 -8
  646. package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +0 -7
  647. package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +0 -6
  648. package/recce-source/tests/adapter/dbt_adapter/test_selector.py +0 -205
  649. package/recce-source/tests/apis/__init__.py +0 -0
  650. package/recce-source/tests/apis/row_count_diff.json +0 -59
  651. package/recce-source/tests/apis/test_check_events_api.py +0 -615
  652. package/recce-source/tests/apis/test_run_func.py +0 -433
  653. package/recce-source/tests/catalog.json +0 -527
  654. package/recce-source/tests/data/manifest/base/catalog.json +0 -1
  655. package/recce-source/tests/data/manifest/base/manifest.json +0 -1
  656. package/recce-source/tests/data/manifest/pr2/catalog.json +0 -1
  657. package/recce-source/tests/data/manifest/pr2/manifest.json +0 -1
  658. package/recce-source/tests/manifest.json +0 -10655
  659. package/recce-source/tests/models/__init__.py +0 -0
  660. package/recce-source/tests/models/test_check.py +0 -731
  661. package/recce-source/tests/models/test_run_models.py +0 -295
  662. package/recce-source/tests/recce_cloud/__init__.py +0 -0
  663. package/recce-source/tests/recce_cloud/test_ci_providers.py +0 -351
  664. package/recce-source/tests/recce_cloud/test_cli.py +0 -735
  665. package/recce-source/tests/recce_cloud/test_client.py +0 -379
  666. package/recce-source/tests/recce_cloud/test_platform_clients.py +0 -483
  667. package/recce-source/tests/recce_state.json +0 -1
  668. package/recce-source/tests/state/test_cloud.py +0 -719
  669. package/recce-source/tests/state/test_local.py +0 -164
  670. package/recce-source/tests/state/test_state_loader.py +0 -211
  671. package/recce-source/tests/tasks/__init__.py +0 -0
  672. package/recce-source/tests/tasks/conftest.py +0 -4
  673. package/recce-source/tests/tasks/test_histogram.py +0 -129
  674. package/recce-source/tests/tasks/test_lineage.py +0 -55
  675. package/recce-source/tests/tasks/test_preset_checks.py +0 -64
  676. package/recce-source/tests/tasks/test_profile.py +0 -397
  677. package/recce-source/tests/tasks/test_query.py +0 -528
  678. package/recce-source/tests/tasks/test_row_count.py +0 -133
  679. package/recce-source/tests/tasks/test_schema.py +0 -122
  680. package/recce-source/tests/tasks/test_top_k.py +0 -77
  681. package/recce-source/tests/tasks/test_utils.py +0 -439
  682. package/recce-source/tests/tasks/test_valuediff.py +0 -361
  683. package/recce-source/tests/test_cli.py +0 -236
  684. package/recce-source/tests/test_cli_mcp_optional.py +0 -45
  685. package/recce-source/tests/test_cloud_listing_cli.py +0 -324
  686. package/recce-source/tests/test_config.py +0 -43
  687. package/recce-source/tests/test_connect_to_cloud.py +0 -82
  688. package/recce-source/tests/test_core.py +0 -174
  689. package/recce-source/tests/test_dbt.py +0 -36
  690. package/recce-source/tests/test_mcp_server.py +0 -505
  691. package/recce-source/tests/test_pull_request.py +0 -130
  692. package/recce-source/tests/test_server.py +0 -202
  693. package/recce-source/tests/test_server_lifespan.py +0 -138
  694. package/recce-source/tests/test_summary.py +0 -73
  695. package/recce-source/tests/util/__init__.py +0 -0
  696. package/recce-source/tests/util/cloud/__init__.py +0 -0
  697. package/recce-source/tests/util/cloud/test_check_events.py +0 -255
  698. package/recce-source/tests/util/cloud/test_checks.py +0 -204
  699. package/recce-source/tests/util/test_api_token.py +0 -119
  700. package/recce-source/tests/util/test_breaking.py +0 -1427
  701. package/recce-source/tests/util/test_cll.py +0 -706
  702. package/recce-source/tests/util/test_lineage.py +0 -122
  703. package/recce-source/tests/util/test_onboarding_state.py +0 -84
  704. package/recce-source/tests/util/test_recce_cloud.py +0 -231
  705. package/recce-source/tox.ini +0 -40
  706. package/recce-source/uv.lock +0 -3928
  707. package/src/api/index.ts +0 -32
  708. package/src/components/index.ts +0 -154
  709. package/src/global.d.ts +0 -14
  710. package/src/hooks/index.ts +0 -56
  711. package/src/index.ts +0 -17
  712. package/src/lib/hooks/RouteConfigContext.ts +0 -139
  713. package/src/lib/hooks/useAppRouter.ts +0 -240
  714. package/src/mui-augmentation.d.ts +0 -139
  715. package/src/theme/index.ts +0 -13
  716. package/src/theme.ts +0 -23
  717. package/src/types/index.ts +0 -23
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-BwEuAiEd.js","names":["defaultApiClient","defaultApiClient"],"sources":["../src/providers/contexts/RouteConfigContext.tsx","../src/contexts/action/RecceActionContext.tsx","../src/contexts/instance/types.ts","../src/contexts/instance/useRecceInstanceInfo.ts","../src/contexts/instance/RecceInstanceContext.tsx","../src/contexts/idle/types.ts","../src/contexts/idle/useIdleDetection.ts","../src/contexts/idle/IdleTimeoutContext.tsx","../src/contexts/lineage/LineageGraphContext.tsx","../src/contexts/lineage/LineageViewContext.tsx","../src/contexts/lineage/types.ts","../src/contexts/lineage/useRecceServerFlag.ts","../src/contexts/lineage/utils.ts"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n} from \"react\";\n\n/**\n * Route Configuration for path prefix customization.\n *\n * This context allows cloud consumers to configure a base path prefix\n * for all navigation within OSS components.\n *\n * Default behavior (OSS):\n * - basePath: \"\" (uses absolute paths like /query, /checks)\n *\n * Cloud usage example:\n * - basePath: \"/oss/abc123\" or \"/preview/abc123\"\n * - Navigation to \"/query\" becomes \"/oss/abc123/query\"\n */\n\n/**\n * Route configuration interface\n */\nexport interface RouteConfig {\n /**\n * Base path prefix for navigation.\n * For OSS: \"\" (empty string, uses absolute paths like /query)\n * For Cloud: \"/oss/<sessionId>\" or \"/preview/<sessionId>\"\n */\n basePath: string;\n}\n\n/**\n * Context value with path resolution utility\n */\nexport interface RouteConfigContextType extends RouteConfig {\n /**\n * Resolves a path with the base path prefix.\n * @param path - The path to resolve (e.g., \"/query\")\n * @returns The resolved path (e.g., \"/oss/abc123/query\")\n */\n resolvePath: (path: string) => string;\n}\n\nconst defaultConfig: RouteConfig = {\n basePath: \"\",\n};\n\nconst RouteConfigContext = createContext<RouteConfigContextType | null>(null);\nRouteConfigContext.displayName = \"RouteConfigContext\";\n\n/**\n * Props for RouteConfigProvider\n */\nexport interface RouteConfigProviderProps extends Partial<RouteConfig> {\n children: ReactNode;\n}\n\n/**\n * Provider for route configuration.\n *\n * Wrap your application (or RecceContextProvider) with this provider\n * to configure path prefixes for navigation.\n *\n * @example\n * ```tsx\n * // In cloud application\n * <RouteConfigProvider basePath={`/oss/${sessionId}`}>\n * <RecceContextProvider>\n * {children}\n * </RecceContextProvider>\n * </RouteConfigProvider>\n * ```\n */\nexport function RouteConfigProvider({\n children,\n basePath = defaultConfig.basePath,\n}: RouteConfigProviderProps) {\n const resolvePath = useCallback(\n (path: string): string => {\n // If no basePath configured, return path as-is (OSS mode)\n if (!basePath) {\n return path;\n }\n\n // Handle paths that already start with the basePath (avoid double-prefixing)\n if (path.startsWith(basePath)) {\n return path;\n }\n\n // Handle absolute URLs (http://, https://, etc.) - don't prefix\n if (path.match(/^https?:\\/\\//)) {\n return path;\n }\n\n // Handle hash-only paths - don't prefix\n if (path.startsWith(\"#\")) {\n return path;\n }\n\n // Ensure proper joining (no double slashes)\n const cleanBasePath = basePath.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n\n return `${cleanBasePath}${cleanPath}`;\n },\n [basePath],\n );\n\n const contextValue: RouteConfigContextType = useMemo(\n () => ({\n basePath,\n resolvePath,\n }),\n [basePath, resolvePath],\n );\n\n return (\n <RouteConfigContext.Provider value={contextValue}>\n {children}\n </RouteConfigContext.Provider>\n );\n}\n\n// Default context for OSS mode (no prefix)\nconst defaultRouteConfigContext: RouteConfigContextType = {\n basePath: \"\",\n resolvePath: (path: string) => path,\n};\n\n/**\n * Hook to access route configuration.\n *\n * When used outside RouteConfigProvider, returns default config\n * (for OSS backward compatibility).\n *\n * @returns RouteConfigContextType with basePath and resolvePath function\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { basePath, resolvePath } = useRouteConfig();\n * const fullPath = resolvePath('/checks');\n * // In cloud with basePath=\"/oss/abc123\": \"/oss/abc123/checks\"\n * // In OSS with basePath=\"\": \"/checks\"\n * }\n * ```\n */\nexport function useRouteConfig(): RouteConfigContextType {\n const context = useContext(RouteConfigContext);\n // Return default config if outside provider (OSS mode)\n return context ?? defaultRouteConfigContext;\n}\n\n/**\n * Safe hook that returns null if context not available.\n * Useful for components that need to detect if RouteConfigProvider is present.\n */\nexport function useRouteConfigSafe(): RouteConfigContextType | null {\n return useContext(RouteConfigContext);\n}\n","\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type {\n AxiosQueryParams,\n RecceActionContextType,\n RecceActionOptions,\n} from \"./types\";\n\n/**\n * Props for RecceActionProvider\n *\n * This is a props-driven provider - pass your own run execution handler.\n * The provider manages UI state (result pane, history panel) internally.\n */\nexport interface RecceActionProviderProps {\n children: ReactNode;\n\n /**\n * Handler called when a run action is requested.\n * Implement this to submit runs to your backend.\n *\n * @param type - The run type (e.g., \"row_count_diff\", \"value_diff\")\n * @param params - Query parameters for the run\n * @param options - Action options (showForm, trackProps)\n * @returns Promise that resolves to the run ID, or void if handled differently\n */\n onRunAction?: (\n type: string,\n params?: AxiosQueryParams,\n options?: RecceActionOptions,\n ) => Promise<string | undefined> | string | undefined;\n\n /**\n * Handler called when a run result should be shown.\n * Called by showRunId when displaying a specific run.\n *\n * @param runId - The run ID to display\n * @param refreshHistory - Whether to refresh the history list\n */\n onShowRunId?: (runId: string, refreshHistory?: boolean) => void;\n\n /** Initial run ID to display (optional) */\n initialRunId?: string;\n\n /** Initial state for history panel (default: false) */\n initialHistoryOpen?: boolean;\n}\n\nconst defaultContext: RecceActionContextType = {\n runAction: () => void 0,\n showRunId: () => void 0,\n isRunResultOpen: false,\n closeRunResult: () => void 0,\n isHistoryOpen: false,\n closeHistory: () => void 0,\n showHistory: () => void 0,\n setHistoryOpen: () => void 0,\n clearRunResult: () => void 0,\n};\n\nconst RecceActionContext =\n createContext<RecceActionContextType>(defaultContext);\nRecceActionContext.displayName = \"RecceActionContext\";\n\n/**\n * Provider for run action context.\n *\n * This is a props-driven provider designed for library consumers.\n * Pass your own `onRunAction` handler to execute runs.\n *\n * @example\n * ```tsx\n * const handleRunAction = async (type, params, options) => {\n * const response = await api.submitRun(type, params);\n * return response.run_id;\n * };\n *\n * <RecceActionProvider onRunAction={handleRunAction}>\n * <LineageView />\n * </RecceActionProvider>\n * ```\n */\nexport function RecceActionProvider({\n children,\n onRunAction,\n onShowRunId,\n initialRunId,\n initialHistoryOpen = false,\n}: RecceActionProviderProps) {\n // Run result pane state\n const [isRunResultOpen, setRunResultOpen] = useState(!!initialRunId);\n const [runId, setRunId] = useState<string | undefined>(initialRunId);\n\n // History panel state\n const [isHistoryOpen, setHistoryOpen] = useState(initialHistoryOpen);\n\n // Close run result pane\n const closeRunResult = useCallback(() => {\n setRunResultOpen(false);\n }, []);\n\n // Clear run result and close pane\n const clearRunResult = useCallback(() => {\n setRunId(undefined);\n setRunResultOpen(false);\n }, []);\n\n // History panel controls\n const showHistory = useCallback(() => {\n setHistoryOpen(true);\n }, []);\n\n const closeHistory = useCallback(() => {\n setHistoryOpen(false);\n }, []);\n\n // Show a specific run result\n const showRunId = useCallback(\n (newRunId: string, refreshHistory?: boolean) => {\n setRunId(newRunId);\n setRunResultOpen(true);\n onShowRunId?.(newRunId, refreshHistory);\n },\n [onShowRunId],\n );\n\n // Execute a run action\n const runAction = useCallback(\n async (\n type: string,\n params?: AxiosQueryParams,\n options?: RecceActionOptions,\n ) => {\n if (!onRunAction) {\n console.warn(\n \"RecceActionProvider: onRunAction not provided, cannot execute run\",\n );\n return;\n }\n\n const result = await onRunAction(type, params, options);\n\n // If the handler returns a run ID, show the result\n if (typeof result === \"string\") {\n showRunId(result);\n }\n },\n [onRunAction, showRunId],\n );\n\n const contextValue = useMemo<RecceActionContextType>(\n () => ({\n runAction,\n runId,\n showRunId,\n isRunResultOpen,\n closeRunResult,\n isHistoryOpen,\n closeHistory,\n showHistory,\n setHistoryOpen,\n clearRunResult,\n }),\n [\n runAction,\n runId,\n showRunId,\n isRunResultOpen,\n closeRunResult,\n isHistoryOpen,\n closeHistory,\n showHistory,\n clearRunResult,\n ],\n );\n\n return (\n <RecceActionContext.Provider value={contextValue}>\n {children}\n </RecceActionContext.Provider>\n );\n}\n\n/**\n * Hook to access the RecceAction context.\n *\n * @returns RecceActionContextType with run action methods and state\n */\nexport function useRecceActionContext(): RecceActionContextType {\n return useContext(RecceActionContext);\n}\n","\"use client\";\n\n/**\n * Feature mode for the Recce instance.\n * - \"read only\": No modifications allowed\n * - \"metadata only\": Database queries disabled\n * - null: Full functionality enabled\n */\nexport type RecceFeatureMode = \"read only\" | \"metadata only\" | null;\n\n/**\n * Feature toggles that control what actions are available in the UI.\n * These are derived from the server's instance info based on server mode.\n */\nexport interface RecceFeatureToggles {\n /** Current feature mode based on server_mode */\n mode: RecceFeatureMode;\n /** Disable saving state to file */\n disableSaveToFile: boolean;\n /** Disable exporting state file */\n disableExportStateFile: boolean;\n /** Disable importing state file */\n disableImportStateFile: boolean;\n /** Disable updating checklist */\n disableUpdateChecklist: boolean;\n /** Disable database query execution */\n disableDatabaseQuery: boolean;\n /** Disable view action dropdown menu */\n disableViewActionDropdown: boolean;\n /** Disable node action dropdown menu */\n disableNodeActionDropdown: boolean;\n /** Disable share functionality */\n disableShare: boolean;\n}\n\n/**\n * Instance information exposed through the RecceInstanceContext.\n * Contains feature toggles and session information.\n */\nexport interface InstanceInfoType {\n /** Whether running in single environment mode */\n singleEnv: boolean;\n /** Whether user is authenticated */\n authed: boolean;\n /** Feature toggles based on server mode */\n featureToggles: RecceFeatureToggles;\n /** When the instance lifetime expires */\n lifetimeExpiredAt?: Date;\n /** URL for sharing the instance */\n shareUrl?: string;\n /** Current session ID */\n sessionId?: string;\n /** Python runtime version (e.g., \"3.9.18\") */\n pythonVersion?: string;\n}\n\n/**\n * Default feature toggles with all features enabled.\n */\nexport const defaultFeatureToggles: RecceFeatureToggles = {\n mode: null,\n disableSaveToFile: false,\n disableExportStateFile: false,\n disableImportStateFile: false,\n disableUpdateChecklist: false,\n disableDatabaseQuery: false,\n disableViewActionDropdown: false,\n disableNodeActionDropdown: false,\n disableShare: false,\n};\n\n/**\n * Default instance info values.\n */\nexport const defaultInstanceInfo: InstanceInfoType = {\n singleEnv: false,\n authed: false,\n lifetimeExpiredAt: undefined,\n featureToggles: defaultFeatureToggles,\n shareUrl: undefined,\n sessionId: undefined,\n pythonVersion: undefined,\n};\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../../api/cacheKeys\";\nimport {\n getRecceInstanceInfo,\n type RecceInstanceInfo,\n} from \"../../api/instanceInfo\";\nimport { createFetchClient } from \"../../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../../providers/contexts/ApiContext\";\n\n// Default API client for use outside RecceProvider (OSS mode)\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\n/**\n * Hook to fetch Recce instance information from the server.\n *\n * Uses TanStack Query to cache the response and the configured API client.\n * Works both inside RecceProvider (uses configured client) and outside (uses default API client).\n *\n * @returns Query result with RecceInstanceInfo data\n *\n * @example\n * ```tsx\n * function InstanceStatus() {\n * const { data, isLoading, error } = useRecceInstanceInfo();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error loading instance info</div>;\n *\n * return <div>Server mode: {data?.server_mode}</div>;\n * }\n * ```\n */\nexport function useRecceInstanceInfo() {\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n return useQuery<RecceInstanceInfo>({\n queryKey: cacheKeys.instanceInfo(),\n queryFn: () => getRecceInstanceInfo(apiClient),\n });\n}\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext, useState } from \"react\";\n\nimport {\n defaultFeatureToggles,\n defaultInstanceInfo,\n type InstanceInfoType,\n type RecceFeatureToggles,\n} from \"./types\";\nimport { useRecceInstanceInfo } from \"./useRecceInstanceInfo\";\n\nconst InstanceInfoContext =\n createContext<InstanceInfoType>(defaultInstanceInfo);\nInstanceInfoContext.displayName = \"RecceInstanceInfoContext\";\n\n/**\n * Provider that fetches and processes Recce instance information.\n *\n * This provider:\n * 1. Fetches instance info from the server using useRecceInstanceInfo\n * 2. Computes feature toggles based on server_mode\n * 3. Provides the processed data through context\n *\n * Feature toggles are computed based on:\n * - server_mode: \"read-only\" disables all modifications\n * - server_mode: \"preview\" disables database queries but allows metadata operations\n * - single_env: disables checklist updates and sharing\n * - cloud_instance: disables sharing\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <RecceProvider api={{ baseUrl: \"/api\" }}>\n * <RecceInstanceInfoProvider>\n * <MyComponent />\n * </RecceInstanceInfoProvider>\n * </RecceProvider>\n * );\n * }\n * ```\n */\nexport function RecceInstanceInfoProvider({\n children,\n}: {\n children: ReactNode;\n}) {\n const { data: instanceInfo, isLoading } = useRecceInstanceInfo();\n const [featureToggles, setFeatureToggles] = useState<RecceFeatureToggles>(\n defaultFeatureToggles,\n );\n const [singleEnv, setSingleEnv] = useState<boolean>(false);\n const [authed, setAuthed] = useState<boolean>(false);\n const [lifetimeExpiredAt, setLifetimeExpiredAt] = useState<Date>();\n const [shareUrl, setShareUrl] = useState<string>();\n const [sessionId, setSessionId] = useState<string>();\n const [pythonVersion, setPythonVersion] = useState<string>();\n const [prevInstanceInfo, setPrevInstanceInfo] = useState(instanceInfo);\n\n // Adjust state during render when instanceInfo changes\n if (!isLoading && instanceInfo && instanceInfo !== prevInstanceInfo) {\n setPrevInstanceInfo(instanceInfo);\n\n setSingleEnv(instanceInfo.single_env);\n setAuthed(instanceInfo.authed);\n setShareUrl(instanceInfo.share_url);\n setSessionId(instanceInfo.session_id);\n setPythonVersion(instanceInfo.python_version);\n\n if (instanceInfo.lifetime_expired_at) {\n setLifetimeExpiredAt(new Date(instanceInfo.lifetime_expired_at));\n console.log(\"lifetime expired at\", instanceInfo.lifetime_expired_at);\n }\n\n // Set feature toggles based on instanceInfo\n const toggles = { ...defaultFeatureToggles };\n if (instanceInfo.server_mode === \"read-only\") {\n toggles.mode = \"read only\";\n toggles.disableSaveToFile = true;\n toggles.disableExportStateFile = true;\n toggles.disableImportStateFile = true;\n toggles.disableUpdateChecklist = true;\n toggles.disableDatabaseQuery = true;\n toggles.disableViewActionDropdown = true;\n toggles.disableNodeActionDropdown = true;\n toggles.disableShare = true;\n } else if (instanceInfo.server_mode === \"preview\") {\n toggles.mode = \"metadata only\";\n toggles.disableSaveToFile = true;\n toggles.disableExportStateFile = true;\n toggles.disableImportStateFile = true;\n toggles.disableUpdateChecklist = false;\n toggles.disableDatabaseQuery = true;\n toggles.disableViewActionDropdown = false;\n toggles.disableNodeActionDropdown = false;\n toggles.disableShare = true;\n }\n if (instanceInfo.single_env) {\n toggles.disableUpdateChecklist = true;\n toggles.disableShare = true;\n }\n if (instanceInfo.cloud_instance) {\n toggles.disableShare = true;\n }\n setFeatureToggles(toggles);\n }\n\n return (\n <InstanceInfoContext.Provider\n value={{\n featureToggles,\n singleEnv,\n authed,\n lifetimeExpiredAt,\n shareUrl,\n sessionId,\n pythonVersion,\n }}\n >\n {children}\n </InstanceInfoContext.Provider>\n );\n}\n\n/**\n * Hook to access the Recce instance context.\n *\n * Returns the current instance information including feature toggles,\n * authentication status, and session information.\n *\n * @returns InstanceInfoType with feature toggles and session info\n *\n * @example\n * ```tsx\n * function FeatureGate() {\n * const { featureToggles } = useRecceInstanceContext();\n *\n * if (featureToggles.disableDatabaseQuery) {\n * return <div>Database queries are disabled</div>;\n * }\n *\n * return <QueryEditor />;\n * }\n * ```\n */\nexport function useRecceInstanceContext(): InstanceInfoType {\n return useContext(InstanceInfoContext);\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\n/**\n * Context for sharing idle timeout state across components\n *\n * IMPORTANT: The countdown is based on the last SUCCESSFUL keep-alive API call,\n * NOT on user activity. This ensures the countdown accurately reflects the\n * server's idle timeout state.\n */\nexport interface IdleTimeoutContextType {\n /** Remaining seconds until timeout (null if idle timeout not enabled) */\n remainingSeconds: number | null;\n /** Idle timeout value from server in seconds (null if not configured) */\n idleTimeout: number | null;\n /** Whether idle timeout is enabled */\n isEnabled: boolean;\n /** Mark as disconnected - stops countdown and keep-alive */\n setDisconnected: () => void;\n /** Reset connection state - restarts countdown and keep-alive after successful reconnect */\n resetConnection: () => void;\n /** Whether the connection is disconnected */\n isDisconnected: boolean;\n}\n\nexport const IdleTimeoutContext = createContext<\n IdleTimeoutContextType | undefined\n>(undefined);\n\n/**\n * Hook to access idle timeout context, returns null if outside provider\n * Used internally by useIdleDetection to avoid circular dependency\n */\nexport function useIdleTimeoutSafe(): IdleTimeoutContextType | null {\n return useContext(IdleTimeoutContext) ?? null;\n}\n","\"use client\";\n\nimport throttle from \"lodash/throttle\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { sendKeepAlive } from \"../../api/keepAlive\";\nimport { createFetchClient } from \"../../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../../providers/contexts/ApiContext\";\n\nimport { useRecceInstanceInfo } from \"../instance\";\nimport { useIdleTimeoutSafe } from \"./types\";\n\n// Default API client for use outside RecceProvider (OSS mode)\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\n/**\n * Check if debug logging is enabled via window.RECCE_DEBUG_IDLE\n * Enable in browser console: window.RECCE_DEBUG_IDLE = true\n * Disable: delete window.RECCE_DEBUG_IDLE\n */\nfunction isDebugEnabled(): boolean {\n // biome-ignore lint/suspicious/noExplicitAny: window flag for debug logging\n return typeof window !== \"undefined\" && !!(window as any).RECCE_DEBUG_IDLE;\n}\n\n/**\n * Log function that only outputs when debug is enabled\n */\nfunction debugLog(message: string, data?: Record<string, unknown>) {\n if (isDebugEnabled()) {\n if (data) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n}\n\n/**\n * Configuration for idle detection behavior\n */\nconst IDLE_DETECTION_CONFIG = {\n /** Events to listen for user activity */\n ACTIVITY_EVENTS: [\"focus\", \"mousemove\", \"keydown\", \"scroll\"] as const,\n /**\n * Throttle event handler execution to reduce JS overhead (150ms).\n * Uses lodash.throttle with { leading: true, trailing: true } to ensure\n * immediate response on first activity (leading) and also capture the final\n * event in a burst (trailing), which is important for user experience.\n */\n EVENT_THROTTLE_MS: 150,\n} as const;\n\n/**\n * Hook to detect user activity and send keep-alive signals to prevent server idle timeout.\n *\n * This hook:\n * - Listens for user activities (focus, mouse, keyboard, scroll)\n * - Sends keep-alive requests (throttled at API layer to minimum 3 seconds)\n * - Pauses when the tab is inactive (using Page Visibility API)\n * - Immediately sends a keep-alive when tab becomes active\n * - Only activates when idle_timeout is configured on the server\n *\n * Note: The countdown in IdleTimeoutContext is based on successful keep-alive\n * API calls, not on user activity. This ensures accurate server state tracking.\n */\nexport function useIdleDetection() {\n const { data: instanceInfo, isLoading, isError } = useRecceInstanceInfo();\n const idleTimeoutContext = useIdleTimeoutSafe();\n const isDisconnected = idleTimeoutContext?.isDisconnected ?? false;\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n // Only enable idle detection if idle_timeout is configured and not disconnected\n const idleTimeout = instanceInfo?.idle_timeout;\n const isEnabled =\n idleTimeout !== undefined && idleTimeout > 0 && !isDisconnected;\n\n // Debug: Log instance info state when debug is enabled\n debugLog(\"[Idle Detection] Instance info\", {\n isLoading,\n isError,\n hasIdleTimeout: idleTimeout !== undefined,\n idleTimeout:\n idleTimeout !== undefined ? `${idleTimeout}s` : \"not configured\",\n isDisconnected,\n isEnabled,\n });\n\n /**\n * Send keep-alive signal to server\n * Throttling is handled at the API layer (minimum 3 seconds between API calls)\n * The successful send will notify IdleTimeoutContext to reset countdown\n */\n const sendKeepAliveNow = useCallback(async () => {\n if (document.hidden) return;\n\n const sent = await sendKeepAlive(apiClient);\n\n if (sent) {\n debugLog(\"[Idle Detection] Keep-alive sent successfully\", {\n timestamp: new Date().toISOString(),\n });\n }\n }, [apiClient]);\n\n /**\n * Handle any user activity event\n * Attempts to send keep-alive (API layer handles throttling)\n */\n const handleActivity = useCallback(\n (event: Event) => {\n if (isEnabled && !document.hidden) {\n debugLog(\"[Idle Detection] Activity detected\", {\n event: event.type,\n tabActive: !document.hidden,\n });\n\n // Send keep-alive API call (API layer handles throttling)\n void sendKeepAliveNow();\n }\n },\n [isEnabled, sendKeepAliveNow],\n );\n\n /**\n * Handle tab visibility changes\n * When tab becomes active, attempt to send keep-alive\n */\n const handleVisibilityChange = useCallback(() => {\n if (!isEnabled) return;\n\n if (!document.hidden) {\n debugLog(\"[Idle Detection] Tab became active\", {\n timestamp: new Date().toISOString(),\n });\n\n // Send keep-alive (API layer handles throttling)\n void sendKeepAliveNow();\n }\n }, [isEnabled, sendKeepAliveNow]);\n\n // Create throttled handler using lodash to reduce JS overhead from high-frequency events\n // useMemo ensures stable reference and proper cleanup\n const throttledHandler = useMemo(\n () =>\n throttle(handleActivity, IDLE_DETECTION_CONFIG.EVENT_THROTTLE_MS, {\n leading: true,\n trailing: true,\n }),\n [handleActivity],\n );\n\n useEffect(() => {\n if (!isEnabled) {\n debugLog(\"[Idle Detection] Disabled\", {\n idleTimeout: idleTimeout,\n reason:\n idleTimeout === undefined\n ? \"idle_timeout not configured on server\"\n : idleTimeout === 0\n ? \"idle_timeout is 0\"\n : \"disconnected\",\n });\n return;\n }\n\n debugLog(\"[Idle Detection] Initialized\", {\n enabled: true,\n idleTimeout: `${idleTimeout}s`,\n eventThrottle: `${IDLE_DETECTION_CONFIG.EVENT_THROTTLE_MS}ms`,\n apiThrottle: \"3s (API layer)\",\n monitoredEvents: IDLE_DETECTION_CONFIG.ACTIVITY_EVENTS.join(\", \"),\n });\n\n // Register activity event listeners with throttled handler\n IDLE_DETECTION_CONFIG.ACTIVITY_EVENTS.forEach((eventType) => {\n window.addEventListener(eventType, throttledHandler, { passive: true });\n });\n\n // Register visibility change listener (not throttled - immediate response needed)\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n // Cleanup function\n return () => {\n debugLog(\"[Idle Detection] Cleanup - removing event listeners\");\n IDLE_DETECTION_CONFIG.ACTIVITY_EVENTS.forEach((eventType) => {\n window.removeEventListener(eventType, throttledHandler);\n });\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n throttledHandler.cancel(); // Cancel any pending throttled calls\n };\n }, [isEnabled, throttledHandler, handleVisibilityChange, idleTimeout]);\n}\n","\"use client\";\n\nimport {\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n getLastKeepAliveTime,\n setKeepAliveCallback,\n} from \"../../api/keepAlive\";\nimport { useRecceInstanceInfo } from \"../instance\";\nimport { IdleTimeoutContext, type IdleTimeoutContextType } from \"./types\";\nimport { useIdleDetection } from \"./useIdleDetection\";\n\n/**\n * Provider for idle timeout state\n *\n * The countdown is based on lastServerSyncTime (when keep-alive API was last\n * successfully sent), not on user activity. This provides accurate server state.\n */\nexport function IdleTimeoutProvider({ children }: { children: ReactNode }) {\n const { data: instanceInfo } = useRecceInstanceInfo();\n // Track the last time we successfully synced with server (keep-alive sent)\n const lastServerSyncRef = useRef<number>(Date.now());\n const [remainingSeconds, setRemainingSeconds] = useState<number | null>(null);\n const [isDisconnected, setIsDisconnected] = useState(false);\n\n const idleTimeout = instanceInfo?.idle_timeout ?? null;\n const isEnabled = idleTimeout !== null && idleTimeout > 0;\n\n // Register callback to receive keep-alive success notifications\n // Use ref to track enabled state to avoid race condition in callback\n const isEnabledRef = useRef(isEnabled);\n useEffect(() => {\n isEnabledRef.current = isEnabled;\n }, [isEnabled]);\n\n useEffect(() => {\n if (!isEnabled) {\n setKeepAliveCallback(null);\n return;\n }\n\n setKeepAliveCallback((timestamp: number) => {\n // Check current enabled state to avoid updating after disabled\n if (isEnabledRef.current) {\n lastServerSyncRef.current = timestamp;\n }\n });\n\n // Initialize with current keep-alive time if available\n const currentTime = getLastKeepAliveTime();\n if (currentTime > 0) {\n lastServerSyncRef.current = currentTime;\n }\n\n return () => {\n setKeepAliveCallback(null);\n };\n }, [isEnabled]);\n\n const setDisconnected = useCallback(() => {\n setIsDisconnected(true);\n }, []);\n\n const resetConnection = useCallback(() => {\n // Reset disconnected state\n setIsDisconnected(false);\n // Reset server sync time to now (server just restarted, timer reset)\n lastServerSyncRef.current = Date.now();\n }, []);\n\n // Update remaining seconds every second based on server sync time\n useEffect(() => {\n if (!isEnabled || idleTimeout === null) {\n setRemainingSeconds(null);\n return;\n }\n\n // Stop updating countdown if disconnected\n if (isDisconnected) {\n return;\n }\n\n const updateCountdown = () => {\n const now = Date.now();\n const elapsedSeconds = (now - lastServerSyncRef.current) / 1000;\n const remaining = Math.max(0, idleTimeout - elapsedSeconds);\n setRemainingSeconds(remaining);\n };\n\n // Initial update\n updateCountdown();\n\n // Set up interval for updates\n const intervalId = setInterval(updateCountdown, 1000);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [isEnabled, idleTimeout, isDisconnected]);\n\n return (\n <IdleTimeoutContext.Provider\n value={{\n remainingSeconds,\n idleTimeout,\n isEnabled,\n setDisconnected,\n resetConnection,\n isDisconnected,\n }}\n >\n <IdleDetector />\n {children}\n </IdleTimeoutContext.Provider>\n );\n}\n\n/**\n * Internal component that activates idle detection\n * Placed inside provider so it has access to context\n */\nfunction IdleDetector() {\n useIdleDetection();\n return null;\n}\n\n/**\n * Hook to access idle timeout context\n * @throws Error if used outside IdleTimeoutProvider\n */\nexport function useIdleTimeout() {\n const context = useContext(IdleTimeoutContext);\n if (!context) {\n throw new Error(\"useIdleTimeout must be used within IdleTimeoutProvider\");\n }\n return context;\n}\n\n// Re-export type and safe hook for backwards compatibility\nexport type { IdleTimeoutContextType } from \"./types\";\nexport { useIdleTimeoutSafe } from \"./types\";\n","\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n} from \"react\";\nimport type { RunsAggregated } from \"../../api/runs\";\nimport type { EnvInfo, LineageGraph, LineageGraphContextType } from \"./types\";\n\n/**\n * Props for LineageGraphProvider\n *\n * This is a props-driven provider - pass data from your data fetching layer.\n * The provider does NOT fetch data internally; consumers handle data fetching\n * and pass the results via props.\n */\nexport interface LineageGraphProviderProps {\n children: ReactNode;\n\n /** The processed lineage graph data */\n lineageGraph?: LineageGraph;\n\n /** Environment information (git, dbt, sqlmesh metadata) */\n envInfo?: EnvInfo;\n\n /** Whether in review mode (read-only checks) */\n reviewMode?: boolean;\n\n /** Whether in cloud mode (recce cloud) */\n cloudMode?: boolean;\n\n /** Whether in file mode (loading from file) */\n fileMode?: boolean;\n\n /** The state file name if in file mode */\n fileName?: string;\n\n /** Whether this is the demo site */\n isDemoSite?: boolean;\n\n /** Whether running in GitHub Codespace */\n isCodespace?: boolean;\n\n /** Loading state */\n isLoading?: boolean;\n\n /** Error message if loading failed */\n error?: string;\n\n /** Supported task types from server */\n supportTasks?: Record<string, boolean>;\n\n /** Callback to refetch the lineage graph */\n onRefetchLineageGraph?: () => void;\n\n /** Pre-aggregated run results by model */\n runsAggregated?: RunsAggregated;\n\n /** Callback to refetch aggregated runs */\n onRefetchRunsAggregated?: () => void;\n}\n\nconst defaultContext: LineageGraphContextType = {\n isActionAvailable: () => true,\n isDemoSite: false,\n isLoading: true, // Default to loading state for SSR hydration safety\n};\n\nconst LineageGraphContext =\n createContext<LineageGraphContextType>(defaultContext);\nLineageGraphContext.displayName = \"RecceLineageGraphContext\";\n\n/**\n * Provider for LineageGraph context.\n *\n * This is a props-driven provider designed for library consumers.\n * Pass data from your data fetching layer (e.g., TanStack Query).\n *\n * @example\n * ```tsx\n * const { data, isLoading, error, refetch } = useQuery({\n * queryKey: ['lineage'],\n * queryFn: fetchLineageData,\n * });\n *\n * <LineageGraphProvider\n * lineageGraph={data?.lineageGraph}\n * envInfo={data?.envInfo}\n * isLoading={isLoading}\n * error={error?.message}\n * onRefetchLineageGraph={refetch}\n * >\n * <LineageView />\n * </LineageGraphProvider>\n * ```\n */\nexport function LineageGraphProvider({\n children,\n lineageGraph,\n envInfo,\n reviewMode,\n cloudMode,\n fileMode,\n fileName,\n isDemoSite = false,\n isCodespace,\n isLoading,\n error,\n supportTasks,\n onRefetchLineageGraph,\n runsAggregated,\n onRefetchRunsAggregated,\n}: LineageGraphProviderProps) {\n // Create stable isActionAvailable function\n const isActionAvailable = useCallback(\n (name: string) => {\n if (supportTasks) {\n // Default to true if action not found in supportTasks\n return supportTasks[name] ?? true;\n }\n // If supportTasks not provided, all actions are available\n return true;\n },\n [supportTasks],\n );\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue = useMemo<LineageGraphContextType>(\n () => ({\n lineageGraph,\n envInfo,\n reviewMode,\n cloudMode,\n fileMode,\n fileName,\n isDemoSite,\n isCodespace,\n isLoading,\n error,\n supportTasks,\n refetchLineageGraph: onRefetchLineageGraph,\n isActionAvailable,\n runsAggregated,\n refetchRunsAggregated: onRefetchRunsAggregated,\n }),\n [\n lineageGraph,\n envInfo,\n reviewMode,\n cloudMode,\n fileMode,\n fileName,\n isDemoSite,\n isCodespace,\n isLoading,\n error,\n supportTasks,\n onRefetchLineageGraph,\n isActionAvailable,\n runsAggregated,\n onRefetchRunsAggregated,\n ],\n );\n\n return (\n <LineageGraphContext.Provider value={contextValue}>\n {children}\n </LineageGraphContext.Provider>\n );\n}\n\n/**\n * Hook to access the LineageGraph context.\n *\n * @returns LineageGraphContextType with lineage data and utilities\n * @throws Warning in dev mode if used outside provider (returns default context)\n */\nexport function useLineageGraphContext(): LineageGraphContextType {\n const context = useContext(LineageGraphContext);\n return context;\n}\n\n/**\n * Hook to access aggregated runs data.\n * Convenience wrapper around useLineageGraphContext.\n *\n * @returns Tuple of [runsAggregated, refetchRunsAggregated]\n */\nexport function useRunsAggregated(): [\n RunsAggregated | undefined,\n (() => void) | undefined,\n] {\n const { runsAggregated, refetchRunsAggregated } = useLineageGraphContext();\n return [runsAggregated, refetchRunsAggregated];\n}\n","import { createContext, useContext } from \"react\";\nimport type { LineageViewContextType } from \"./types\";\n\nexport const LineageViewContext = createContext<\n LineageViewContextType | undefined\n>(undefined);\n\nexport const useLineageViewContextSafe = (): LineageViewContextType => {\n const context = useContext(LineageViewContext);\n if (!context) {\n throw new Error(\n \"useLineageViewContext must be used within a LineageViewProvider\",\n );\n }\n return context;\n};\n\nexport const useLineageViewContext = (): LineageViewContextType | undefined => {\n return useContext(LineageViewContext);\n};\n","import type { Edge, Node } from \"@xyflow/react\";\nimport type React from \"react\";\nimport type { CllInput, ColumnLineageData } from \"../../api/cll\";\nimport type {\n CatalogMetadata,\n GitInfo,\n ManifestMetadata,\n NodeData,\n PullRequestInfo,\n SQLMeshInfo,\n StateMetadata,\n} from \"../../api/info\";\nimport type { LineageDiffViewOptions } from \"../../api/lineagecheck\";\nimport type { RunsAggregated } from \"../../api/runs\";\nimport type { Run } from \"../../api/types\";\n\n/**\n * Environment information derived from server info\n */\nexport interface EnvInfo {\n stateMetadata?: StateMetadata;\n adapterType?: string;\n git?: GitInfo;\n pullRequest?: PullRequestInfo;\n dbt?: {\n base: ManifestMetadata | undefined | null;\n current: ManifestMetadata | undefined | null;\n };\n sqlmesh?: SQLMeshInfo | null;\n}\n\n/**\n * Which environment the node/edge comes from\n */\ntype LineageFrom = \"both\" | \"base\" | \"current\";\n\n/**\n * Lineage graph node type for React Flow\n */\nexport type LineageGraphNode = Node<\n {\n id: string;\n name: string;\n from: LineageFrom;\n data: {\n base?: NodeData;\n current?: NodeData;\n };\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n change?: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns: Record<string, \"added\" | \"removed\" | \"modified\"> | null;\n };\n resourceType?: string;\n packageName?: string;\n parents: Record<string, LineageGraphEdge>;\n children: Record<string, LineageGraphEdge>;\n },\n \"lineageGraphNode\"\n>;\n\n/**\n * Column-level lineage node type\n */\nexport type LineageGraphColumnNode = Node<\n {\n node: LineageGraphNode[\"data\"];\n column: string;\n type: string;\n transformationType?: string;\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n },\n \"lineageGraphColumnNode\"\n>;\n\n/**\n * Lineage graph edge type for React Flow\n */\nexport type LineageGraphEdge = Edge<\n {\n from: LineageFrom;\n changeStatus?: \"added\" | \"removed\";\n },\n \"lineageGraphEdge\"\n>;\n\n/**\n * Union type for all lineage graph node types\n */\nexport type LineageGraphNodes = LineageGraphNode | LineageGraphColumnNode;\n\n/**\n * The main lineage graph data structure\n */\nexport interface LineageGraph {\n nodes: Record<string, LineageGraphNode>;\n edges: Record<string, LineageGraphEdge>;\n modifiedSet: string[];\n manifestMetadata: {\n base?: ManifestMetadata;\n current?: ManifestMetadata;\n };\n catalogMetadata: {\n base?: CatalogMetadata;\n current?: CatalogMetadata;\n };\n}\n\n/**\n * Type guard for LineageGraphNode\n */\nexport function isLineageGraphNode(\n node: LineageGraphNodes,\n): node is LineageGraphNode {\n return node.type === \"lineageGraphNode\";\n}\n\n/**\n * Type guard for LineageGraphColumnNode\n */\nexport function isLineageGraphColumnNode(\n node: LineageGraphNodes,\n): node is LineageGraphColumnNode {\n return node.type === \"lineageGraphColumnNode\";\n}\n\n/**\n * Context value exposed by LineageGraphContext\n */\nexport interface LineageGraphContextType {\n /** The processed lineage graph */\n lineageGraph?: LineageGraph;\n /** Environment metadata */\n envInfo?: EnvInfo;\n /** Whether in review mode (read-only checks) */\n reviewMode?: boolean;\n /** Whether in cloud mode (recce cloud) */\n cloudMode?: boolean;\n /** Whether in file mode (loading from file) */\n fileMode?: boolean;\n /** The state file name if in file mode */\n fileName?: string;\n /** Whether this is the demo site */\n isDemoSite: boolean;\n /** Whether running in GitHub Codespace */\n isCodespace?: boolean;\n /** Loading state */\n isLoading?: boolean;\n /** Error message if loading failed */\n error?: string;\n /** Supported task types from server */\n supportTasks?: Record<string, boolean>;\n /** Refetch the lineage graph data */\n refetchLineageGraph?: () => void;\n /** Check if an action is available */\n isActionAvailable: (actionName: string) => boolean;\n /** Pre-aggregated run results by model */\n runsAggregated?: RunsAggregated;\n /** Refetch the aggregated runs */\n refetchRunsAggregated?: () => void;\n}\n\n// ============================================================================\n// LineageViewContext Types\n// ============================================================================\n\n/**\n * Action mode for node operations - single or multiple nodes\n */\nexport type ActionMode = \"per_node\" | \"multi_nodes\";\n\n/**\n * Select mode for multi-node selection\n */\nexport type SelectMode = \"selecting\" | \"action_result\" | undefined;\n\n/**\n * Action state for individual node operations\n */\nexport interface NodeAction {\n /** Whether this is a per-node or multi-node action */\n mode: ActionMode;\n /** Current status of this node's action */\n status?: \"pending\" | \"running\" | \"success\" | \"failure\" | \"skipped\";\n /** Reason why this node was skipped (if applicable) */\n skipReason?: string;\n /** The run associated with this action */\n run?: Run;\n}\n\n/**\n * Overall action state for batch operations\n */\nexport interface ActionState {\n /** Whether this is a per-node or multi-node action */\n mode: ActionMode;\n /** Overall status of the action batch */\n status: \"pending\" | \"running\" | \"canceling\" | \"canceled\" | \"completed\";\n /** Current run being executed */\n currentRun?: Partial<Run>;\n /** Number of completed actions */\n completed: number;\n /** Total number of actions */\n total: number;\n /** Per-node action state */\n actions: Record<string, NodeAction>;\n}\n\n/**\n * Context value exposed by LineageViewContext.\n * Provides state and methods for interacting with the lineage view.\n */\nexport interface LineageViewContextType {\n /** Whether the view is interactive (vs read-only) */\n interactive: boolean;\n /** All nodes in the current view */\n nodes: LineageGraphNodes[];\n /** Currently focused node (hovered/highlighted) */\n focusedNode?: LineageGraphNode;\n /** Currently selected nodes for batch operations */\n selectedNodes: LineageGraphNode[];\n /** Column-level lineage data if showing CLL */\n cll: ColumnLineageData | undefined;\n\n // Context menu\n /** Show the context menu for a node */\n showContextMenu: (event: React.MouseEvent, node: LineageGraphNodes) => void;\n\n // View options\n /** Current view options (filters, display settings) */\n viewOptions: LineageDiffViewOptions;\n /** Update view options */\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n\n // Multi-node selection\n /** Current selection mode */\n selectMode: SelectMode;\n /** Select/deselect a single node */\n selectNode: (nodeId: string) => void;\n /** Select all parent nodes up to a degree */\n selectParentNodes: (nodeId: string, degree?: number) => void;\n /** Select all child nodes up to a degree */\n selectChildNodes: (nodeId: string, degree?: number) => void;\n /** Clear selection */\n deselect: () => void;\n\n // Node state queries\n /** Check if a node is highlighted */\n isNodeHighlighted: (nodeId: string) => boolean;\n /** Check if a node is selected */\n isNodeSelected: (nodeId: string) => boolean;\n /** Check if an edge is highlighted */\n isEdgeHighlighted: (source: string, target: string) => boolean;\n /** Get the action state for a node */\n getNodeAction: (nodeId: string) => NodeAction;\n /** Get the columns visible for a node in CLL mode */\n getNodeColumnSet: (nodeId: string) => Set<string>;\n /** Check if a node is showing change analysis */\n isNodeShowingChangeAnalysis: (nodeId: string) => boolean;\n /** Whether impact radius (change analysis) mode is active */\n changeAnalysisMode: boolean;\n /** Set change analysis mode on/off */\n setChangeAnalysisMode: (active: boolean) => void;\n\n // Actions\n /** Run row count on selected nodes */\n runRowCount: () => Promise<void>;\n /** Run row count diff on selected nodes */\n runRowCountDiff: () => Promise<void>;\n /** Run value diff on selected nodes */\n runValueDiff: () => Promise<void>;\n /** Add a lineage diff check */\n addLineageDiffCheck: (viewMode?: string) => void;\n /** Add a schema diff check */\n addSchemaDiffCheck: () => void;\n /** Cancel the current action */\n cancel: () => void;\n /** Current action state */\n actionState: ActionState;\n\n // Column-level lineage\n /** Center the view on a specific node */\n centerNode: (nodeId: string) => void;\n /** Show column-level lineage for a node/column */\n showColumnLevelLineage: (cll?: CllInput) => Promise<void>;\n /** Reset column-level lineage view */\n resetColumnLevelLineage: (previous?: boolean) => Promise<void>;\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../../api/cacheKeys\";\nimport { getServerFlag, type RecceServerFlags } from \"../../api/flag\";\nimport { createFetchClient } from \"../../lib/fetchClient\";\nimport { useApiConfigOptional } from \"../../providers/contexts/ApiContext\";\n\n// Default API client for use outside RecceProvider (OSS mode)\nconst defaultApiClient = createFetchClient({ baseURL: \"\" });\n\n/**\n * Hook to fetch server-side feature flags.\n *\n * Uses TanStack Query to cache and manage flag state.\n * Works both inside RecceProvider (uses configured client) and outside (uses default API client).\n *\n * @returns TanStack Query result with RecceServerFlags data\n */\nexport function useRecceServerFlag() {\n const apiConfig = useApiConfigOptional();\n const apiClient = apiConfig?.apiClient ?? defaultApiClient;\n\n return useQuery<RecceServerFlags>({\n queryKey: cacheKeys.flag(),\n queryFn: () => getServerFlag(apiClient),\n });\n}\n","import type { Position } from \"@xyflow/react\";\nimport type { LineageDataFromMetadata, LineageDiffData } from \"../../api/info\";\nimport type {\n LineageGraph,\n LineageGraphColumnNode,\n LineageGraphEdge,\n LineageGraphNode,\n LineageGraphNodes,\n} from \"./types\";\nimport { isLineageGraphNode } from \"./types\";\n\n/**\n * Height of a column node in pixels\n * Must match COLUMN_NODE_HEIGHT in columns/LineageColumnNode.tsx\n */\nexport const COLUMN_HEIGHT = 24;\n\n/**\n * Map of node IDs to their column sets\n */\nexport type NodeColumnSetMap = Record<string, Set<string>>;\n\n// =============================================================================\n// Set Utilities\n// =============================================================================\n\n/**\n * Get the union of multiple sets\n */\nexport function union<T>(...sets: Set<T>[]): Set<T> {\n const unionSet = new Set<T>();\n for (const set of sets) {\n for (const key of set) {\n unionSet.add(key);\n }\n }\n return unionSet;\n}\n\n/**\n * Get the intersection of multiple sets\n */\nexport function intersect<T>(...sets: Set<T>[]): Set<T> {\n if (sets.length === 0) {\n return new Set<T>();\n }\n\n let intersection = new Set<T>(sets[0]);\n\n for (const set of sets) {\n intersection = new Set([...intersection].filter((x) => set.has(x)));\n }\n\n return intersection;\n}\n\n/**\n * Get a set of neighbor nodes up to a certain degree\n */\nexport function getNeighborSet(\n nodeIds: string[],\n getNeighbors: (id: string) => string[],\n degree = 1000,\n): Set<string> {\n const neighborSet = new Set<string>();\n const visited: Record<string, number | undefined> = {};\n\n const dfs = (id: string, currentDegree: number) => {\n if (currentDegree < 0) {\n return;\n }\n if (visited[id] != null && visited[id] >= currentDegree) {\n return;\n }\n visited[id] = currentDegree;\n\n const neighbors = getNeighbors(id);\n\n for (const neighborId of neighbors) {\n dfs(neighborId, currentDegree - 1);\n }\n\n neighborSet.add(id);\n };\n\n for (const nodeId of nodeIds) {\n dfs(nodeId, degree);\n }\n\n return neighborSet;\n}\n\n// =============================================================================\n// Lineage Graph Building\n// =============================================================================\n\n/**\n * Build a LineageGraph from base and current lineage data\n *\n * @param base - Base lineage data (before changes)\n * @param current - Current lineage data (after changes)\n * @param diff - Optional diff data for change status\n * @returns Processed LineageGraph structure\n *\n * @example\n * ```tsx\n * const lineageGraph = buildLineageGraph(\n * serverInfo.lineage.base,\n * serverInfo.lineage.current,\n * serverInfo.lineage.diff\n * );\n * ```\n */\nexport function buildLineageGraph(\n base: LineageDataFromMetadata,\n current: LineageDataFromMetadata,\n diff?: LineageDiffData,\n): LineageGraph {\n const nodes: Record<string, LineageGraphNode> = {};\n const edges: Record<string, LineageGraphEdge> = {};\n\n const buildNode = (\n key: string,\n from: \"base\" | \"current\",\n ): LineageGraphNode => {\n return {\n id: key,\n data: {\n id: key,\n name: key,\n from,\n data: {\n base: undefined,\n current: undefined,\n },\n parents: {},\n children: {},\n },\n type: \"lineageGraphNode\",\n } as LineageGraphNode;\n };\n\n // Process base nodes\n for (const [key, nodeData] of Object.entries(base.nodes)) {\n nodes[key] = buildNode(key, \"base\");\n if (nodeData) {\n nodes[key].data.data.base = nodeData;\n nodes[key].data.name = nodeData.name;\n nodes[key].data.resourceType = nodeData.resource_type;\n nodes[key].data.packageName = nodeData.package_name;\n }\n }\n\n // Process current nodes\n for (const [key, nodeData] of Object.entries(current.nodes)) {\n if (nodes[key] as LineageGraphNode | undefined) {\n nodes[key].data.from = \"both\";\n } else {\n nodes[key] = buildNode(key, \"current\");\n }\n if (nodeData) {\n nodes[key].data.data.current = current.nodes[key];\n nodes[key].data.name = nodeData.name;\n nodes[key].data.resourceType = nodeData.resource_type;\n nodes[key].data.packageName = nodeData.package_name;\n }\n }\n\n // Process base edges\n for (const [child, parents] of Object.entries(base.parent_map)) {\n for (const parent of parents) {\n const childNode = nodes[child] as LineageGraphNode | undefined;\n const parentNode = nodes[parent] as LineageGraphNode | undefined;\n const id = `${parent}_${child}`;\n\n if (!childNode || !parentNode) {\n continue;\n }\n edges[id] = {\n id,\n source: parentNode.id,\n target: childNode.id,\n data: {\n from: \"base\",\n },\n };\n const edge = edges[id];\n\n childNode.data.parents[parent] = edge;\n parentNode.data.children[child] = edge;\n }\n }\n\n // Process current edges\n for (const [child, parents] of Object.entries(current.parent_map)) {\n for (const parent of parents) {\n const childNode = nodes[child] as LineageGraphNode | undefined;\n const parentNode = nodes[parent] as LineageGraphNode | undefined;\n const id = `${parent}_${child}`;\n\n if (!childNode || !parentNode) {\n continue;\n }\n const existingEdge = edges[id] as LineageGraphEdge | undefined;\n if (existingEdge?.data && edges[id].data) {\n edges[id].data.from = \"both\";\n } else {\n edges[id] = {\n id,\n source: parentNode.id,\n target: childNode.id,\n data: {\n from: \"current\",\n },\n };\n }\n const edge = edges[id];\n\n childNode.data.parents[parent] = edge;\n parentNode.data.children[child] = edge;\n }\n }\n\n // Process diff and calculate modified set\n const modifiedSet: string[] = [];\n\n for (const [key, node] of Object.entries(nodes)) {\n const diffNode = diff?.[key];\n if (diffNode) {\n node.data.changeStatus = diffNode.change_status;\n if (diffNode.change) {\n node.data.change = {\n category: diffNode.change.category,\n columns: diffNode.change.columns,\n };\n }\n modifiedSet.push(key);\n } else if (node.data.from === \"base\") {\n node.data.changeStatus = \"removed\";\n modifiedSet.push(node.id);\n } else if (node.data.from === \"current\") {\n node.data.changeStatus = \"added\";\n modifiedSet.push(node.id);\n } else {\n const checksum1 = node.data.data.base?.checksum?.checksum;\n const checksum2 = node.data.data.current?.checksum?.checksum;\n\n if (checksum1 && checksum2 && checksum1 !== checksum2) {\n node.data.changeStatus = \"modified\";\n modifiedSet.push(node.id);\n }\n }\n }\n\n // Set edge change status\n for (const edge of Object.values(edges)) {\n if (edge.data) {\n if (edge.data.from === \"base\") {\n edge.data.changeStatus = \"removed\";\n } else if (edge.data.from === \"current\") {\n edge.data.changeStatus = \"added\";\n }\n }\n }\n\n return {\n nodes,\n edges,\n modifiedSet,\n manifestMetadata: {\n base: base.manifest_metadata ?? undefined,\n current: current.manifest_metadata ?? undefined,\n },\n catalogMetadata: {\n base: base.catalog_metadata ?? undefined,\n current: current.catalog_metadata ?? undefined,\n },\n };\n}\n\n// =============================================================================\n// Selection Utilities\n// =============================================================================\n\n/**\n * Select upstream nodes from the given node IDs\n *\n * @param lineageGraph - The lineage graph\n * @param nodeIds - Starting node IDs\n * @param degree - Maximum degree of separation (default: 1000)\n * @returns Set of upstream node IDs\n */\nexport function selectUpstream(\n lineageGraph: LineageGraph,\n nodeIds: string[],\n degree = 1000,\n): Set<string> {\n return getNeighborSet(\n nodeIds,\n (key) => {\n const maybeNodes = lineageGraph.nodes as unknown as Record<\n string,\n LineageGraphNode | undefined\n >;\n if (maybeNodes[key] === undefined) {\n return [];\n }\n return Object.keys(lineageGraph.nodes[key].data.parents);\n },\n degree,\n );\n}\n\n/**\n * Select downstream nodes from the given node IDs\n *\n * @param lineageGraph - The lineage graph\n * @param nodeIds - Starting node IDs\n * @param degree - Maximum degree of separation (default: 1000)\n * @returns Set of downstream node IDs\n */\nexport function selectDownstream(\n lineageGraph: LineageGraph,\n nodeIds: string[],\n degree = 1000,\n): Set<string> {\n return getNeighborSet(\n nodeIds,\n (key) => {\n if (\n (lineageGraph.nodes[key] as LineageGraphNode | undefined) === undefined\n ) {\n return [];\n }\n return Object.keys(lineageGraph.nodes[key].data.children);\n },\n degree,\n );\n}\n\n// =============================================================================\n// React Flow Conversion\n// =============================================================================\n\n/**\n * Convert a LineageGraph to React Flow nodes and edges\n *\n * This is a simplified version that converts the graph structure.\n * For full column-level lineage support, use the OSS implementation.\n *\n * @param lineageGraph - The lineage graph to convert\n * @param selectedNodes - Optional filter for which nodes to include\n * @returns Tuple of [nodes, edges]\n */\nexport function toReactFlowBasic(\n lineageGraph: LineageGraph,\n selectedNodes?: string[],\n): [LineageGraphNode[], LineageGraphEdge[]] {\n const nodes: LineageGraphNode[] = [];\n const edges: LineageGraphEdge[] = [];\n\n function getWeight(from?: string) {\n if (from === \"base\") {\n return 0;\n } else if (from === \"current\") {\n return 2;\n }\n return 1;\n }\n\n function compareFn(\n a: LineageGraphNode | LineageGraphEdge,\n b: LineageGraphNode | LineageGraphEdge,\n ) {\n const weightA = getWeight(a.data?.from);\n const weightB = getWeight(b.data?.from);\n return weightA - weightB;\n }\n\n const filterSet =\n selectedNodes !== undefined ? new Set(selectedNodes) : undefined;\n const sortedNodes = Object.values(lineageGraph.nodes).sort(compareFn);\n\n for (const node of sortedNodes) {\n if (filterSet && !filterSet.has(node.id)) {\n continue;\n }\n\n nodes.push({\n id: node.id,\n position: { x: 0, y: 0 },\n width: 300,\n height: 60,\n className: \"no-track-pii-safe\",\n data: {\n ...node.data,\n },\n type: \"lineageGraphNode\",\n targetPosition: \"left\" as Position,\n sourcePosition: \"right\" as Position,\n style: {\n width: 300,\n height: 60,\n },\n } as LineageGraphNode);\n }\n\n const sortedEdges = Object.values(lineageGraph.edges).sort(compareFn);\n for (const edge of sortedEdges) {\n if (\n filterSet &&\n (!filterSet.has(edge.source) || !filterSet.has(edge.target))\n ) {\n continue;\n }\n\n edges.push({\n id: edge.id,\n type: \"lineageGraphEdge\",\n source: edge.source,\n target: edge.target,\n data: {\n ...edge.data,\n },\n } as LineageGraphEdge);\n }\n\n return [nodes, edges];\n}\n\n/**\n * Apply dagre layout to nodes and edges\n *\n * NOTE: This function requires @dagrejs/dagre to be installed.\n * Import and call it as follows:\n *\n * @example\n * ```tsx\n * import dagre from '@dagrejs/dagre';\n * import { layoutWithDagre } from '@datarecce/ui';\n *\n * const [nodes, edges] = toReactFlowBasic(lineageGraph);\n * layoutWithDagre(dagre, nodes, edges);\n * ```\n *\n * @param dagre - The dagre library instance\n * @param nodes - Nodes to layout\n * @param edges - Edges for layout\n * @param direction - Layout direction (default: \"LR\" for left-to-right)\n */\nexport function layoutWithDagre(\n // biome-ignore lint/suspicious/noExplicitAny: dagre library is external, consumers provide their own instance\n dagre: any,\n nodes: LineageGraphNodes[],\n edges: LineageGraphEdge[],\n direction = \"LR\",\n): void {\n const dagreGraph = new dagre.graphlib.Graph();\n dagreGraph.setDefaultEdgeLabel(() => ({}));\n dagreGraph.setGraph({ rankdir: direction, ranksep: 50, nodesep: 30 });\n\n for (const node of nodes) {\n if (!isLineageGraphNode(node)) {\n continue;\n }\n let width = 300;\n let height = 60;\n if (node.style?.height && node.style.width) {\n width = parseInt(String(node.style.width), 10);\n height = parseInt(String(node.style.height), 10);\n }\n dagreGraph.setNode(node.id, { width, height });\n }\n\n for (const edge of edges) {\n dagreGraph.setEdge(edge.source, edge.target);\n }\n\n dagre.layout(dagreGraph);\n\n for (const node of nodes) {\n if (!isLineageGraphNode(node)) {\n continue;\n }\n\n const nodeWidth = node.style?.width ?? 300;\n const nodeHeight = node.style?.height ?? 60;\n const nodeWithPosition = dagreGraph.node(node.id);\n\n // Shift from center anchor to top-left anchor\n node.position = {\n x: nodeWithPosition.x - Number(nodeWidth) / 2,\n y: nodeWithPosition.y - Number(nodeHeight) / 2,\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import{n as e}from"./colors-BbPSDR1X.js";import{createContext as t,useCallback as n,useContext as r,useEffect as i,useState as a}from"react";import{Fragment as o,jsx as s,jsxs as c}from"react/jsx-runtime";import l from"@mui/material/Box";import u from"@mui/material/Stack";import d from"@mui/material/Typography";import f from"@mui/material/IconButton";import p from"@mui/material/CircularProgress";import m from"@mui/material/Tooltip";import{PiCopy as h,PiDotsThreeVertical as g}from"react-icons/pi";import _ from"file-saver";import v from"write-excel-file/universal";import{useCopyToClipboard as y}from"usehooks-ts";import b from"@mui/material/Alert";import x from"@mui/material/Snackbar";import ee from"@mui/material/Menu";import te from"@mui/material/MenuItem";import S from"lodash";import{VscClose as ne,VscKebabVertical as re,VscKey as ie,VscPin as ae,VscPinned as oe}from"react-icons/vsc";import{format as se,formatDistance as ce,parseISO as le}from"date-fns";const C=t(null);C.displayName=`RecceThemeContext`;function ue(){let e=r(C);if(!e)throw Error(`useRecceTheme must be used within RecceProvider`);return e}function de(){return r(C)}function fe({children:e,defaultMode:t=`system`}){let[n,r]=a(t),[o,c]=a(()=>typeof window>`u`?`light`:t===`system`?window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:t);return i(()=>{if(n===`system`){let e=window.matchMedia(`(prefers-color-scheme: dark)`);c(e.matches?`dark`:`light`);let t=e=>{c(e.matches?`dark`:`light`)};return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)}else c(n)},[n]),i(()=>{typeof window>`u`||document.documentElement.classList.toggle(`dark`,o===`dark`)},[o]),s(C.Provider,{value:{mode:n,resolvedMode:o,setMode:r},children:e})}function pe(){let e=de(),[t,n]=a(!1),[r,o]=a(!1);return i(()=>{if(n(!0),!e){let e=()=>{o(document.documentElement.classList.contains(`dark`))};e();let t=new MutationObserver(e);return t.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),()=>t.disconnect()}},[e]),t?e?e.resolvedMode===`dark`:r:!1}function me(e,t){_(new Blob([e],{type:`text/csv;charset=utf-8`}),t)}function he(e,t){_(new Blob([e],{type:`text/tab-separated-values;charset=utf-8`}),t)}function ge(e,t){_(e,t)}async function _e(e){if(typeof navigator>`u`||!navigator.clipboard?.writeText)throw Error(`Clipboard API not available. Ensure you're using HTTPS or localhost.`);await navigator.clipboard.writeText(e)}function ve(e){return e==null?null:typeof e==`object`?{value:JSON.stringify(e),type:String}:typeof e==`number`?{value:e,type:Number}:typeof e==`boolean`?{value:e,type:Boolean}:{value:String(e),type:String}}function ye(e,t){return v([e.map(e=>({value:e,type:String})),...t.map(e=>e.map(ve))],{})}function be(e,t){return(e==null?``:String(e))===(t==null?``:String(t))?e:`${e==null?``:`(${e})`} ${t==null?``:`(${t})`}`.trim()}function w(e){return!e?.columns||!e.data?null:{columns:e.columns.map(e=>e.name),rows:e.data.map(e=>[...e])}}function xe(e){return w(e)}function Se(e){return w(e)}function Ce(e,t){let n=e,r=t?.displayMode??`inline`,i=t?.primaryKeys??[];return n?.diff?we(n.diff,r,i):Te(n,r)}function we(e,t,n){if(!e?.columns||!e?.data)return null;let r=e.columns.findIndex(e=>e.key.toLowerCase()===`in_a`),i=e.columns.findIndex(e=>e.key.toLowerCase()===`in_b`),a=e.columns.filter(e=>e.key.toLowerCase()!==`in_a`&&e.key.toLowerCase()!==`in_b`),o=a.map(e=>e.name),s=a.map(t=>e.columns.findIndex(e=>e.key===t.key)),c=n.map(t=>e.columns.findIndex(e=>e.key===t)).filter(e=>e>=0),l=e=>s.map(t=>e[t]),u=e=>c.length===0?``:c.map(t=>String(e[t]??``)).join(`|||`),d=new Map,f=[];if(e.data.forEach((e,t)=>{let n=r>=0?e[r]:!0,a=i>=0?e[i]:!0,o=u(e);o===``&&(o=String(t)),d.has(o)||(d.set(o,{base:null,current:null}),f.push(o));let s=d.get(o);if(!s)return;let c=l(e);n&&(s.base=c),a&&(s.current=c)}),t===`side_by_side`){let e=[];o.forEach(t=>{e.push(`base__${t}`,`current__${t}`)});let t=[];for(let e of f){let n=d.get(e);if(!n)continue;let r=n.base,i=n.current,a=[];o.forEach((e,t)=>{a.push(r?r[t]:null),a.push(i?i[t]:null)}),t.push(a)}return{columns:e,rows:t}}let p=[...o],m=[];for(let e of f){let t=d.get(e);if(!t)continue;let n=t.base,r=t.current,i=[];o.forEach((e,t)=>{let a=n?n[t]:null,o=r?r[t]:null;i.push(be(a,o))}),m.push(i)}return{columns:p,rows:m}}function Te(e,t){let n=e?.current||e?.base;if(!n)return null;if(!e?.base||!e?.current)return w(n);let r=e.current.columns.map(e=>e.name);if(t===`side_by_side`){let t=[];r.forEach(e=>{t.push(`base__${e}`,`current__${e}`)});let n=[],i=Math.max(e.base.data.length,e.current.data.length);for(let t=0;t<i;t++){let i=[],a=t<e.base.data.length?e.base.data[t]:null,o=t<e.current.data.length?e.current.data[t]:null;r.forEach((e,t)=>{i.push(a?a[t]:null),i.push(o?o[t]:null)}),n.push(i)}return{columns:t,rows:n}}let i=[...r],a=[],o=Math.max(e.base.data.length,e.current.data.length);for(let t=0;t<o;t++){let n=t<e.base.data.length?e.base.data[t]:null,i=t<e.current.data.length?e.current.data[t]:null,o=[];r.forEach((e,t)=>{let r=n?n[t]:null,a=i?i[t]:null;o.push(be(r,a))}),a.push(o)}return{columns:i,rows:a}}function Ee(e){let t=e,n=t?.current||t?.base;if(!n)return null;if(t?.base&&t?.current){let e=[`_source`,...t.current.columns.map(e=>e.name)],n=[];return t.base.data.forEach(e=>{n.push([`base`,...e])}),t.current.data.forEach(e=>{n.push([`current`,...e])}),{columns:e,rows:n}}return w(n)}function De(e){let t=e;if(!t||typeof t!=`object`)return null;let n=[`node`,`base_count`,`current_count`,`diff`,`diff_percent`],r=[];for(let[e,n]of Object.entries(t))if(n&&typeof n==`object`){let t=n.base,i=n.curr,a=t!=null&&i!=null?i-t:null,o=t&&a!==null?(a/t*100).toFixed(2)+`%`:null;r.push([e,t,i,a,o])}return{columns:n,rows:r}}function Oe(e){let t=e;return t?.data?w(t.data):null}function ke(e){return w(e)}function Ae(e){let t=e,n=!!t?.base?.values,r=!!t?.current?.values;if(!n&&!r)return null;let i=[`_source`,`value`,`count`],a=[];return t?.base?.values&&t.base.values.forEach((e,n)=>{a.push([`base`,e,t.base.counts[n]])}),t?.current?.values&&t.current.values.forEach((e,n)=>{a.push([`current`,e,t.current.counts[n]])}),{columns:i,rows:a}}const je={query:xe,query_base:Se,query_diff:Ce,profile:Ee,profile_diff:Ee,row_count:De,row_count_diff:De,value_diff:Oe,value_diff_detail:ke,top_k_diff:Ae};function Me(e,t,n){let r=je[e];if(!r)return null;try{return r(t,n)}catch(t){return console.error(`Failed to extract CSV data for run type "${e}":`,t),null}}function Ne(e){return e in je}function Pe(e){if(e==null)return``;let t=typeof e==`object`?JSON.stringify(e):String(e);return t.includes(`,`)||t.includes(`"`)||t.includes(`
3
+ `)||t.includes(`\r`)?`"${t.replace(/"/g,`""`)}"`:t}function Fe(e,t){return``+[e.map(Pe).join(`,`),...t.map(e=>e.map(Pe).join(`,`))].join(`\r
4
+ `)}function Ie(e){return e==null?``:(typeof e==`object`?JSON.stringify(e):String(e)).replace(/[\t\r\n]+/g,` `)}function Le(e,t){return[e.map(Ie).join(` `),...t.map(e=>e.map(Ie).join(` `))].join(`\r
5
+ `)}function Re(e){let t=e===1?`row`:`rows`;if(e<1e3)return`${e} ${t}`;if(e<1e6){let n=e/1e3;return n>=999.95?`1M ${t}`:`${n%1==0?String(n):n.toFixed(1)}k ${t}`}let n=e/1e6;return`${n%1==0?String(n):n.toFixed(1)}M ${t}`}function ze(){let e=new Date;return`${e.getFullYear()}${String(e.getMonth()+1).padStart(2,`0`)}${String(e.getDate()).padStart(2,`0`)}-${String(e.getHours()).padStart(2,`0`)}${String(e.getMinutes()).padStart(2,`0`)}${String(e.getSeconds()).padStart(2,`0`)}`}function Be(e,t){let n=ze(),r=e.replace(/_/g,`-`),i;return t?.node_names&&Array.isArray(t.node_names)&&t.node_names.length===1?i=String(t.node_names[0]):t?.model&&typeof t.model==`string`&&(i=t.model),i?(i=i.replace(/[^a-zA-Z0-9_.-]/g,`-`).toLowerCase(),`${r}-${i}-${n}.csv`):`${r}-result-${n}.csv`}function Ve(e){let{primaryKeys:t,pinnedColumns:n,allColumns:r,excludeColumns:i=[]}=e,a=[],o=new Set,s=e=>i.includes(e);return t.forEach(e=>{!o.has(e)&&!s(e)&&(a.push(e),o.add(e))}),n.forEach(e=>{!o.has(e)&&!s(e)&&(a.push(e),o.add(e))}),r.forEach(e=>{!o.has(e)&&!s(e)&&(a.push(e),o.add(e))}),a}function He(e,t,n){return!t||!n?!0:e===`added`||e===`removed`||e===`modified`}function T(e,t){return t.includes(e)}function Ue(e,t){return t.includes(e)}function E(e,t){return t.includes(e)}function We(e,t){return e[t]}function D(e){let{columnMap:t,primaryKeys:n,pinnedColumns:r,columnsRenderMode:i,changedOnly:a=!1,rowStats:o,excludeColumns:s=[],strictMode:c=!1}=e,l=(o?.modified??0)>0,u=[];return n.forEach(e=>{let n=We(t,e);if(!n){if(c)throw Error(`Primary key column "${e}" not found in columnMap`);return}u.push({key:e,name:e,columnType:n.colType,columnStatus:n.status,columnRenderMode:i[e],frozen:!0,isPrimaryKey:!0})}),r.forEach(e=>{if(T(e,n)||E(e,s))return;let r=We(t,e);if(!r){if(c)throw Error(`Pinned column "${e}" not found in columnMap`);return}u.push({key:e,name:e,columnType:r.colType,columnStatus:r.status,columnRenderMode:i[e],frozen:!0})}),Object.entries(t).forEach(([e,t])=>{T(e,n)||Ue(e,r)||E(e,s)||He(t.status,a,l)&&u.push({key:e,name:e,columnType:t.colType,columnStatus:t.status,columnRenderMode:i[e]})}),u}function Ge(e){let{columnMap:t,primaryKeys:n,pinnedColumns:r,columnsRenderMode:i,excludeColumns:a=[],strictMode:o=!1}=e,s=[];return n.forEach(e=>{let n=t[e];if(!n){if(o)throw Error(`Primary key column "${e}" not found in columnMap`);return}s.push({key:e,name:e,columnType:n.colType,columnRenderMode:i[e],frozen:!0,isPrimaryKey:!0})}),r.forEach(e=>{if(n.includes(e)||a.includes(e))return;let r=t[e];if(!r){if(o)throw Error(`Pinned column "${e}" not found in columnMap`);return}s.push({key:r.key,name:e,columnType:r.colType,columnRenderMode:i[e],frozen:!0})}),Object.entries(t).forEach(([e,t])=>{n.includes(e)||r.includes(e)||a.includes(e)||s.push({key:t.key,name:e,columnType:t.colType,columnRenderMode:i[e]})}),s}function O(e,t){return[{value:`Show raw value`,onClick:()=>{t({[e]:`raw`})}},{value:`Show 2 decimal points`,onClick:()=>{t({[e]:2})}},{value:`Show as percentage`,onClick:()=>{t({[e]:`percent`})}},{value:`Show with net change`,onClick:()=>{t({[e]:`delta`})}}]}function k({value:t,colorPalette:n,grayOut:r,noCopy:i,fontSize:o,onCopy:u}){let[d,f]=a(!1),p=pe();return c(l,{sx:{display:`flex`,p:`2px 5px`,minWidth:`30px`,maxWidth:`200px`,overflow:`hidden`,textOverflow:`ellipsis`,color:p?e[n][300]:e[n][800],bgcolor:p?e[n][900]:e[n][100],alignItems:`center`,gap:`2px`,borderRadius:`8px`,fontSize:o,flexShrink:i?0:`inherit`},onMouseEnter:()=>{f(!0)},onMouseLeave:()=>{f(!1)},children:[s(l,{sx:{overflow:`hidden`,textOverflow:`ellipsis`,color:r?`text.disabled`:`inherit`},children:t}),s(Ke,{value:t,noCopy:i,grayOut:r,isHovered:d,onCopy:u})]})}function Ke({value:e,noCopy:t,grayOut:n,isHovered:r,onCopy:i}){if(t||n||!r)return null;let a=()=>{i?i(e):typeof navigator<`u`&&navigator.clipboard&&navigator.clipboard.writeText(e)};return s(m,{title:`Copy Value`,children:s(f,{"aria-label":`Copy`,size:`small`,onClick:a,sx:{minWidth:`0.625rem`,height:`0.625rem`,display:`flex`,alignItems:`center`,justifyContent:`center`,p:0,color:`inherit`},children:s(h,{size:`0.625rem`})})})}const qe=t(null);let A=0;function Je({children:e}){let[t,r]=a([]),i=n(e=>{let t=e.id||`toast-${++A}`,n={id:t,open:!0,duration:e.type===`loading`?null:e.duration??5e3,closable:e.closable??!0,...e};return r(e=>[...e.filter(e=>e.id!==t),n]),t},[]),o=n(e=>{r(t=>t.map(t=>t.id===e?{...t,open:!1}:t)),setTimeout(()=>{r(t=>t.filter(t=>t.id!==e))},300)},[]),l={toast:i,success:e=>i({...e,type:`success`}),error:e=>i({...e,type:`error`}),warning:e=>i({...e,type:`warning`}),info:e=>i({...e,type:`info`}),loading:e=>i({...e,type:`loading`}),dismiss:o,update:n((e,t)=>{r(n=>n.map(n=>n.id===e?{...n,...t}:n))},[])};return c(qe.Provider,{value:l,children:[e,t.map(e=>s(x,{open:e.open,autoHideDuration:e.duration,onClose:()=>e.closable&&o(e.id),anchorOrigin:{vertical:`bottom`,horizontal:`right`},children:s(b,{severity:e.type===`loading`?`info`:e.type||`info`,onClose:e.closable?()=>o(e.id):void 0,icon:e.type===`loading`?s(p,{size:20,color:`inherit`}):void 0,sx:{width:`100%`,minWidth:300},children:c(u,{spacing:.5,children:[e.title&&s(d,{variant:`subtitle2`,fontWeight:`bold`,children:e.title}),e.description&&s(d,{variant:`body2`,component:`div`,children:e.description})]})})},e.id))]})}function Ye(){let e=r(qe);if(!e)throw Error(`useToaster must be used within ToasterProvider`);return e}const j=new Set,M={create:e=>{let t=e.id||`toast-${++A}`;return j.forEach(n=>n({type:`create`,options:{...e,id:t}})),t},success:e=>M.create({...e,type:`success`}),error:e=>M.create({...e,type:`error`}),warning:e=>M.create({...e,type:`warning`}),info:e=>M.create({...e,type:`info`}),loading:e=>M.create({...e,type:`loading`}),dismiss:e=>{j.forEach(t=>t({type:`dismiss`,id:e}))},remove:e=>{j.forEach(t=>t({type:`dismiss`,id:e}))},update:(e,t)=>{j.forEach(n=>n({type:`update`,id:e,options:t}))},subscribe:e=>(j.add(e),()=>j.delete(e))};function Xe(){let[e,t]=a([]);a(()=>M.subscribe(e=>{if(e.type===`create`&&e.options){let n={id:e.options.id||`toast-${++A}`,open:!0,duration:e.options.type===`loading`?void 0:e.options.duration??5e3,closable:e.options.closable??!0,...e.options};t(e=>[...e.filter(e=>e.id!==n.id),n])}else if(e.type===`dismiss`&&e.id){let n=e.id;t(e=>e.map(e=>e.id===n?{...e,open:!1}:e)),setTimeout(()=>{t(e=>e.filter(e=>e.id!==n))},300)}else e.type===`update`&&e.id&&e.options&&t(t=>t.map(t=>t.id===e.id?{...t,...e.options}:t))}));let n=e=>{t(t=>t.map(t=>t.id===e?{...t,open:!1}:t)),setTimeout(()=>{t(t=>t.filter(t=>t.id!==e))},300)};return s(o,{children:e.map(e=>s(x,{open:e.open,autoHideDuration:e.duration,onClose:()=>e.closable&&n(e.id),anchorOrigin:{vertical:`bottom`,horizontal:`right`},children:s(b,{severity:e.type===`loading`?`info`:e.type||`info`,onClose:e.closable?()=>n(e.id):void 0,icon:e.type===`loading`?s(p,{size:20,color:`inherit`}):void 0,sx:{width:`100%`,minWidth:300},children:c(u,{spacing:.5,children:[e.title&&s(d,{variant:`subtitle2`,fontWeight:`bold`,children:e.title}),e.description&&s(d,{variant:`body2`,component:`div`,children:e.description})]})})},e.id))})}function Ze(){function e(e){M.create({description:e,type:`info`,duration:5e3,closable:!0})}function t(e,t){M.create({title:e,description:String(t),type:`error`,duration:5e3,closable:!0})}return{successToast:e,failToast:t}}function N(e){let[,t]=y(),{successToast:n}=Ze(),r=e=>{t(e),n(`${e} copied`)};return s(k,{...e,onCopy:r})}function P({name:e,columnStatus:t,columnType:n,primaryKeys:r=[],onPrimaryKeyChange:i,pinnedColumns:u=[],onPinnedColumnsChange:d,onColumnsRenderModeChanged:p}){let[m,h]=a(null),g=!!m,_=e=>{h(e.currentTarget)},v=()=>{h(null)};if(e===`index`)return s(o,{});let y=r.includes(e),b=u.includes(e),x=t!==`added`&&t!==`removed`,S=[];return p&&(S=O(e,p)),c(l,{sx:{display:`flex`,alignItems:`center`,gap:`10px`,width:`100%`},className:`grid-header`,children:[y&&s(ie,{}),s(l,{sx:{flex:1,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e}),x&&i&&s(l,{component:y?ne:ie,className:y?`close-icon`:`key-icon`,sx:{display:y?`block`:`none`,cursor:`pointer`},onClick:y?()=>{i&&i(r.filter(t=>t!==e))}:()=>{i&&i([...r.filter(e=>e!==`index`),e])}}),!y&&d&&s(l,{component:b?oe:ae,className:b?`unpin-icon`:`pin-icon`,sx:{display:b?`block`:`none`,cursor:`pointer`},onClick:b?()=>{d&&d(u.filter(t=>t!==e))}:()=>{d&&d([...u,e])}}),!y&&n===`number`&&S.length>0&&c(o,{children:[s(f,{"aria-label":`Options`,size:`small`,className:`!size-4 !min-w-4`,onClick:_,children:s(re,{})}),s(ee,{anchorEl:m,open:g,onClose:v,children:S.map(e=>s(te,{onClick:()=>{e.onClick(),v()},children:e.value},e.value))})]})]})}function Qe({name:e,pinnedColumns:t=[],onPinnedColumnsChange:n=()=>{},columnType:r,onColumnsRenderModeChanged:i}){let[u,d]=a(null),p=!!u,m=e=>{d(e.currentTarget)},h=()=>{d(null)},_=[];i&&(_=O(e,i));let v=t.includes(e);return c(l,{sx:{display:`flex`,alignItems:`center`,width:`100%`},className:`grid-header`,children:[s(l,{sx:{flex:1},children:e}),s(l,{component:v?oe:ae,className:v?`unpin-icon`:`pin-icon`,sx:{display:v?`block`:`none`,cursor:`pointer`},onClick:v?()=>{n(t.filter(t=>t!==e))}:()=>{n([...t,e])}}),r===`number`&&c(o,{children:[s(f,{"aria-label":`Options`,size:`small`,className:`size-6!`,sx:{p:0},onClick:m,children:s(g,{})}),s(ee,{anchorEl:u,open:p,onClose:h,children:_.map(e=>s(te,{onClick:()=>{e.onClick(),h()},children:e.value},e.value))})]})]})}function F(e){return e.data.map((t,n)=>({...e.columns.reduce((e,n,r)=>(e[n.key]=t[r],e),{}),__status:void 0,_index:n+1}))}function $e(e){let t=Number(e);return!Number.isNaN(t)&&Number.isFinite(t)?t:et(e)}function et(e){let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t&=t}return Math.abs(t)}function tt(e,t){let n=t.toLowerCase();if(n in e)return e[n];let r=Object.keys(e).find(e=>e.toLowerCase()===n);return r?e[r]:void 0}function nt(e,t){let n=e[t.toLowerCase()];return n||=e[t.toUpperCase()],n||=e[t],n}function I(e,t=`en-US`,n){return typeof e==`number`?new Intl.NumberFormat(t,n).format(e):e}function rt(e){let t=e>0&&e<=.001,n=e<1&&e>=.999,r=(t=e)=>I(t,`en-US`,{style:`percent`,minimumFractionDigits:1});return t?`<${r(.001)}`:n?`>${r(.999)}`:r()}function it(e){if(typeof e!=`number`)return e;{let t=Math.abs(e),n=10**-2,r=10**3,i=10**6,a=10**9,o=10**12,s=10**15,c=t>=n,l=t>=1,u=t>=r,d=t>=i,f=t>=a,p=t>=o,m=t>=s;if(m||p)return new Intl.NumberFormat(`en-US`,{style:`unit`,unit:`liter`,unitDisplay:`narrow`,maximumFractionDigits:m?0:2}).format(e/0xe8d4a51000).replace(`L`,`T`);if(f||d||u){let t={base:f?a:d?i:r,unit:f?`B`:d?`M`:`K`};return new Intl.NumberFormat(`en-US`,{style:`unit`,unit:`liter`,unitDisplay:`narrow`,maximumFractionDigits:1}).format(e/t.base).replace(`L`,t.unit)}else if(l)return new Intl.NumberFormat(`en-US`,{maximumFractionDigits:2}).format(e);else return new Intl.NumberFormat(`en-US`,{maximumFractionDigits:c?3:2,notation:c||t===0?`standard`:`scientific`}).format(e)}}function L(e,t){let n=[...e],r=[...t],i=[];for(;n.length>0&&r.length>0;)if(i.includes(n[0]))n.shift();else if(i.includes(r[0]))r.shift();else if(n[0]===r[0])i.push(n[0]),n.shift(),r.shift();else if(r.includes(n[0])){let e=r.indexOf(n[0]);for(let t=0;t<e;t++)i.includes(r[t])||i.push(r[t]);i.push(n[0]),n.shift(),r.splice(0,e+1)}else i.push(n[0]),n.shift();return n.forEach(e=>{i.includes(e)||i.push(e)}),r.forEach(e=>{i.includes(e)||i.push(e)}),i}function R(e,t){let n=L(e,t),r={};for(let i of n)e.includes(i)?t.includes(i)?r[i]=void 0:r[i]=`removed`:r[i]=`added`;let i={};e.forEach((e,t)=>{i[e]=t});let a=-1;for(let e of n){let t=i[e];t!=null&&(t>a?a=t:r[e]=`reordered`)}return r}function at(e){let t={};return e.columns.forEach((e,n)=>{t[e.name]={key:e.key,index:n,colType:e.type}}),t}function ot(e){let t={};if(e.columns.forEach((e,n)=>{t[e.key]={key:e.key,index:n,colType:e.type}}),!t.in_a)throw Error(`Joined DataFrame missing required 'in_a' column`);if(!t.in_b)throw Error(`Joined DataFrame missing required 'in_b' column`);return t}function st(e,t){let n={},r=R(e.columns.map(e=>e.key),t.columns.map(e=>e.key));return Object.entries(r).forEach(([r,i])=>{let a=e.columns.find(e=>e.key===r),o=t.columns.find(e=>e.key===r);n[r]={status:i,baseColumnKey:a?.key??`unknown`,currentColumnKey:o?.key??`unknown`,colType:a?.type??o?.type??`unknown`,key:a?.key??o?.key??`unknown`}}),n}function z(e,t){let n=[];for(let r of t){let t=e.find(e=>e.key===r);if(!t)throw Error(`Column ${r} not found`);n.push(t.key)}return n}function B(e,t,n){if(t.length===0)return String(n._index);let r=[];for(let i of t){let t=e.find(e=>e.key===i);if(!t)throw Error(`Primary Column ${i} not found`);let a=n[i];r.push(`${t.name}=${a}`)}return r.join(`|`)}function ct(e,t,n,r){if(!e)return`added`;if(!t)return`removed`;let i=e===t;for(let[a,o]of Object.entries(n)){if(a===`index`||r.includes(a))continue;let n,s;if(i){let r=`base__${o.key}`,i=`current__${o.key}`;n=e[r],s=t[i]}else n=e[o.key],s=t[o.key];if(!S.isEqual(n,s))return`modified`}}function V(e,t=2){let n=I(Object.is(e,-0)?0:e,`en-US`,{maximumFractionDigits:t,roundingMode:`halfEven`})??String(e);return n===`-0`?`0`:n}function H(e,t){return Number.isNaN(e)?`NaN`:Number.isFinite(e)?t===`raw`?String(e):typeof t==`number`?V(e,t):t===`percent`?I(e,`en-US`,{style:`percent`,maximumFractionDigits:2})??String(e):V(e,2):e>0?`∞`:`-∞`}function U(e,t,n,r){let i=tt(e,t);if(i==null)return[`-`,!0];let a,o=!1;return typeof i==`boolean`?a=i.toString():i===``?(a=`(empty)`,o=!0):a=typeof i==`number`?H(i,r):n===`number`?H(parseFloat(i),r):String(i),[a,o]}function lt(e,t,n,r){let i=e.__status;if(i===`removed`)return`diff-cell-removed`;if(i===`added`)return`diff-cell-added`;if(t===`added`||t===`removed`)return;let a=`base__${n}`.toLowerCase(),o=`current__${n}`.toLowerCase();if(!S.isEqual(e[a],e[o]))return r?`diff-cell-removed`:`diff-cell-added`}function ut(e){if(e===`added`)return`diff-header-added`;if(e===`removed`)return`diff-header-removed`}const dt=e=>{let t=e.colDef,n=t?.context?.columnType,r=t?.context?.columnRenderMode,i=t?.field??``;if(!e.data)return null;let[a,o]=U(e.data,i,n,r);return s(d,{component:`span`,style:{color:o?`gray`:`inherit`},children:a})};function ft(e={}){let t=e.DiffTextComponent??k;return e=>{let n=e.colDef,r=n?.context?.columnType,i=n?.context?.columnRenderMode,a=n?.field??``;if(!e.data)return null;let o=e.data,u=`base__${a}`.toLowerCase(),f=`current__${a}`.toLowerCase();if(!Object.hasOwn(o,u)&&!Object.hasOwn(o,f))return`-`;let p=Object.hasOwn(o,u),h=Object.hasOwn(o,f),[g,_]=U(o,`base__${a}`.toLowerCase(),r,i),[v,y]=U(o,`current__${a}`.toLowerCase(),r,i);if(o[u]===o[f])return s(d,{component:`span`,style:{color:y?`gray`:`inherit`},children:v});if(i===`delta`&&(r===`number`||r===`integer`)&&p&&h){let e=mt(o[u]),n=mt(o[f]);if(Number.isFinite(e)&&Number.isFinite(n)){let r=n-e,i=e===0?0:r/e*100,a=V(n),o=V(r),u=`(${r>=0?`+`:``}${o})`;return s(m,{title:`Base: ${e}\nCurrent: ${n}\nChange: ${r>=0?`+`:``}${r} (${i>=0?`+`:``}${i.toFixed(2)}%)`,slotProps:{tooltip:{sx:{whiteSpace:`pre-line`}}},enterDelay:300,placement:`top`,children:c(l,{gap:`5px`,display:`flex`,alignItems:`center`,lineHeight:`normal`,height:`100%`,children:[s(t,{value:a,colorPalette:`green`,grayOut:y}),s(d,{fontSize:`0.75rem`,color:r>=0?`green.600`:`red.600`,children:u})]})})}}return c(l,{sx:{display:`flex`,gap:`5px`,alignItems:`center`,lineHeight:`normal`,height:`100%`},children:[p&&s(t,{value:g,colorPalette:`red`,grayOut:_}),h&&s(t,{value:v,colorPalette:`green`,grayOut:y})]})}}const pt=ft({DiffTextComponent:N});function mt(e){if(typeof e==`number`)return e;if(typeof e==`string`){let t=Number.parseFloat(e);return Number.isNaN(t)?0:t}return 0}function ht(e,t){return n=>{let r=n.data;if(!r)return;let i=r.__status;if(i===`removed`)return`diff-cell-removed`;if(i===`added`)return`diff-cell-added`;if(t===`added`||t===`removed`)return;let a=`base__${e}`.toLowerCase(),o=`current__${e}`.toLowerCase();if(!S.isEqual(r[a],r[o]))return`diff-cell-removed`}}function gt(e,t){return n=>{let r=n.data;if(!r)return;let i=r.__status;if(i===`removed`)return`diff-cell-removed`;if(i===`added`)return`diff-cell-added`;if(t===`added`||t===`removed`)return;let a=`base__${e}`.toLowerCase(),o=`current__${e}`.toLowerCase();if(!S.isEqual(r[a],r[o]))return`diff-cell-added`}}function W(e){let{name:t,columnStatus:n,columnType:r,columnRenderMode:i,displayMode:a,baseTitle:o=`Base`,currentTitle:c=`Current`,headerProps:l={},renderComponents:u}=e,{DataFrameColumnGroupHeader:d,defaultRenderCell:f,inlineRenderCell:p}=u,m=ut(n),h=()=>s(d,{name:t,columnStatus:n,columnType:r,...l});if(a===`inline`)return{field:t,headerName:t,headerClass:m,headerComponent:h,cellRenderer:p,context:{columnType:r,columnRenderMode:i}};let g=ht(t,n),_=gt(t,n);return{headerName:t,headerClass:m,headerGroupComponent:h,context:{columnType:r,columnRenderMode:i},children:[{field:`base__${t}`,headerName:o,headerClass:m,cellClass:g,cellRenderer:f,context:{columnType:r,columnRenderMode:i}},{field:`current__${t}`,headerName:c,headerClass:m,cellClass:_,cellRenderer:f,context:{columnType:r,columnRenderMode:i}}]}}function _t(){return{field:`_index`,headerName:``,width:50,maxWidth:100,cellClass:`index-column`,resizable:!1,pinned:`left`}}function vt(e,t,n){let{key:r,name:i,columnType:a,columnStatus:o,columnRenderMode:c}=e,{DataFrameColumnGroupHeader:l,defaultRenderCell:u}=n;return{field:r,headerName:i,headerComponent:()=>s(l,{name:i,columnStatus:o??``,columnType:a,...t}),pinned:`left`,cellClass:e=>{if(e.data?.__status)return`diff-header-${e.data.__status}`},cellRenderer:u,context:{columnType:a,columnRenderMode:c}}}function yt(e,t,n,r,i,a){let{name:o,columnType:s,columnStatus:c,columnRenderMode:l}=e;return W({name:o,columnStatus:c??``,columnType:s,columnRenderMode:l,displayMode:t,baseTitle:i,currentTitle:a,headerProps:n,renderComponents:r})}function G(e){let{columns:t,displayMode:n,headerProps:r,baseTitle:i,currentTitle:a,allowIndexFallback:o=!1,renderComponents:s}=e,c=[],l=!1;!t.some(e=>e.isPrimaryKey)&&o&&(c.push(_t()),l=!0);for(let e of t)if(e.isPrimaryKey)c.push(vt(e,r,s));else{let t=yt(e,n,r,s,i,a);c.push({...t,pinned:e.frozen?`left`:void 0})}return{columns:c,usedIndexFallback:l}}function bt(e){return`baseColumnKey`in e&&`currentColumnKey`in e}function xt(e,t){return t.includes(e)}function St(e){return bt(e)?{baseKey:e.baseColumnKey,currentKey:e.currentColumnKey}:{baseKey:e.key,currentKey:e.key}}function Ct(e,t,n,r,i){n.forEach(n=>{let a=n.key;xt(a,i)?e[String(a).toLowerCase()]=t[a]:e[`${r}${a}`.toLowerCase()]=t[a]})}function wt(e,t,n,r){let i=!1;for(let[a,o]of Object.entries(n)){if(a===`index`||xt(a,r))continue;let{baseKey:n,currentKey:s}=St(o);if(n===`unknown`||s===`unknown`)continue;let c=e[n],l=t[s];S.isEqual(c,l)||(i=!0,o.status=`modified`)}return i}function K(e){let{baseMap:t,currentMap:n,baseColumns:r,currentColumns:i,columnMap:a,primaryKeys:o,changedOnly:s=!1}=e,c=R(Object.keys(t),Object.keys(n)),l={added:0,removed:0,modified:0},u=Object.entries(c).map(([e])=>{let s=t[e],c=n[e],u={_index:$e(e),__status:void 0};return s&&Ct(u,s,r,`base__`,o),c&&Ct(u,c,i,`current__`,o),s?c?wt(s,c,a,o)&&(u.__status=`modified`,l.modified++):(u.__status=`removed`,l.removed++):(u.__status=`added`,l.added++),u});return s&&(u=u.filter(e=>e.__status===`added`||e.__status===`removed`||e.__status===`modified`)),{rows:u,rowStats:l}}var q=class extends Error{constructor(e,t,n){super(t?`[${t}] ${e}`:e),this.context=t,this.details=n,this.name=`DataGridValidationError`}};function J(e,t=`DataFrame`){if(e!=null){if(typeof e!=`object`)throw new q(`Expected an object, got ${typeof e}`,t);if(!(`columns`in e))throw new q(`Missing 'columns' property`,t,{receivedKeys:Object.keys(e)});if(!Array.isArray(e.columns))throw new q(`'columns' must be an array, got ${typeof e.columns}`,t);if(!(`data`in e))throw new q(`Missing 'data' property`,t,{receivedKeys:Object.keys(e)});if(!Array.isArray(e.data))throw new q(`'data' must be an array, got ${typeof e.data}`,t);Tt(e.columns,t),e.data.length>0&&Et(e,t)}}function Tt(e,t=`DataFrame`){e.forEach((e,n)=>{if(!e||typeof e!=`object`)throw new q(`Column at index ${n} is not an object`,t,{column:e});if(typeof e.key!=`string`||e.key===``)throw new q(`Column at index ${n} has invalid 'key': expected non-empty string, got ${JSON.stringify(e.key)}`,t,{column:e});if(typeof e.name!=`string`)throw new q(`Column '${e.key}' has invalid 'name': expected string, got ${typeof e.name}`,t,{column:e});if(typeof e.type!=`string`)throw new q(`Column '${e.key}' has invalid 'type': expected string, got ${typeof e.type}`,t,{column:e})})}function Et(e,t=`DataFrame`){let n=e.columns.length;for(let r=0;r<e.data.length;r++){let i=e.data[r];if(!Array.isArray(i))throw new q(`Row at index ${r} is not an array`,t,{row:i,rowType:typeof i});if(i.length!==n)throw new q(`Row ${r} has ${i.length} values but expected ${n} (column count)`,t,{rowIndex:r,rowLength:i.length,columnCount:n,columns:e.columns.map(e=>e.key)})}}function Y(e,t,n={}){let{required:r=!1,caseInsensitive:i=!1,context:a=`primaryKeys`}=n;if(r&&(!e||e.length===0))throw new q(`Primary keys are required but none were provided`,a);if(!e||e.length===0)return;let o=t.map(e=>e.key),s=i?o.map(e=>e.toLowerCase()):o;for(let t of e){let e=i?t.toLowerCase():t;if(!(i?s.includes(e):o.includes(t)))throw new q(`Primary key column '${t}' not found in columns`,a,{requestedKey:t,availableColumns:o,caseInsensitive:i})}let c=new Set;for(let t of e){let n=i?t.toLowerCase():t;if(c.has(n))throw new q(`Duplicate primary key: '${t}'`,a,{primaryKeys:e});c.add(n)}}function Dt(e,t){J(e,`dataframe`),e&&t?.primaryKeys&&Y(t.primaryKeys,e.columns,{context:`toDataGrid`})}function Ot(e,t,n){if(J(e,`base`),J(t,`current`),n?.primaryKeys&&n.primaryKeys.length>0){let r=e?.columns??[],i=t?.columns??[],a=new Set([...r.map(e=>e.key),...i.map(e=>e.key)]);for(let e of n.primaryKeys)if(!a.has(e))throw new q(`Primary key column '${e}' not found in either base or current DataFrame`,`toDataDiffGrid`,{requestedKey:e,baseColumns:r.map(e=>e.key),currentColumns:i.map(e=>e.key)})}}function kt(e,t){if(!e)throw new q(`DataFrame is required for value diff`);if(J(e),!t||t.length===0)throw new q(`Primary keys are required for value diff`);Y(t,e.columns,{required:!0,context:`toValueDiffGrid`});let n=e.columns.map(e=>e.key);if(!n.includes(`in_a`))throw new q(`Value diff DataFrame must include lowercase 'in_a' column`);if(!n.includes(`in_b`))throw new q(`Value diff DataFrame must include lowercase 'in_b' column`)}function At(e,t,n,r){Ot(e,t,n);let i=e??{columns:[],data:[]},a=t??{columns:[],data:[]},o=n?.primaryKeys??[],s=n?.pinnedColumns??[],c=n?.changedOnly??!1,l=n?.displayMode??`side_by_side`,u=n?.columnsRenderMode??{},d=F(i),f=F(a),p=st(i,a),m={},h={},g=!1,_=!1;if(o.length===0)d.forEach(e=>{m[String(e._index)]=e}),f.forEach(e=>{h[String(e._index)]=e});else{let e=z(i.columns,o);d.forEach(t=>{let n=B(i.columns,e,t);n in m&&(g=!0),m[n]=t});let t=z(a.columns,o);f.forEach(e=>{let n=B(a.columns,t,e);n in h&&(_=!0),h[n]=e})}let{rows:v,rowStats:y}=K({baseMap:m,currentMap:h,baseColumns:i.columns,currentColumns:a.columns,columnMap:p,primaryKeys:o,changedOnly:c}),{columns:b}=G({columns:D({columnMap:p,primaryKeys:o,pinnedColumns:s,columnsRenderMode:u,changedOnly:c,rowStats:y,excludeColumns:[`index`],strictMode:!1}),displayMode:l,allowIndexFallback:!0,baseTitle:n?.baseTitle,currentTitle:n?.currentTitle,headerProps:{primaryKeys:o,pinnedColumns:s,onPrimaryKeyChange:n?.onPrimaryKeyChange,onPinnedColumnsChange:n?.onPinnedColumnsChange,onColumnsRenderModeChanged:n?.onColumnsRenderModeChanged},renderComponents:r?.renderComponents??{DataFrameColumnGroupHeader:()=>null,defaultRenderCell:()=>null,inlineRenderCell:()=>null}});return{columns:b,rows:v,invalidPKeyBase:g,invalidPKeyCurrent:_}}function jt(){return{field:`_index`,headerName:``,width:50,cellClass:`index-column`,resizable:!1,pinned:`left`}}function Mt(e,t,n){let{key:r,name:i,columnType:a,columnRenderMode:o}=e,{DataFrameColumnGroupHeader:c,defaultRenderCell:l}=n;return{field:r,headerName:i,headerComponent:()=>s(c,{name:i,columnStatus:``,columnType:a,pinnedColumns:t.pinnedColumns,onPinnedColumnsChange:t.onPinnedColumnsChange,onColumnsRenderModeChanged:t.onColumnsRenderModeChanged}),pinned:`left`,cellRenderer:l,context:{columnType:a,columnRenderMode:o}}}function Nt(e,t,n){let{key:r,name:i,columnType:a,columnRenderMode:o}=e,{DataFrameColumnHeader:c,defaultRenderCell:l}=n;return{field:r,headerName:i,headerComponent:()=>s(c,{name:i,columnType:a,pinnedColumns:t.pinnedColumns,onPinnedColumnsChange:t.onPinnedColumnsChange,onColumnsRenderModeChanged:t.onColumnsRenderModeChanged}),cellRenderer:l,context:{columnType:a,columnRenderMode:o}}}function X(e){let{columns:t,headerProps:n,allowIndexFallback:r=!0,renderComponents:i}=e,a=[],o=!1;!t.some(e=>e.isPrimaryKey)&&r&&(a.push(jt()),o=!0);for(let e of t)if(e.isPrimaryKey)a.push(Mt(e,n,i));else{let t=Nt(e,n,i);a.push({...t,pinned:e.frozen?`left`:void 0})}return{columns:a,usedIndexFallback:o}}function Pt(e,t,n){Dt(e,t);let r=t.primaryKeys??[],i=t.pinnedColumns??[],a=t.columnsRenderMode??{},{columns:o}=X({columns:Ge({columnMap:at(e),primaryKeys:r,pinnedColumns:i,columnsRenderMode:a}),headerProps:{pinnedColumns:i,onPinnedColumnsChange:t.onPinnedColumnsChange,onColumnsRenderModeChanged:t.onColumnsRenderModeChanged},allowIndexFallback:!0,renderComponents:n.renderComponents});return{columns:o,rows:F(e)}}function Z(e,t,n,r){kt(e,t);let i=n?.pinnedColumns??[],a=n?.changedOnly??!1,o=n?.displayMode??`inline`,s=n?.columnsRenderMode??{},c=F(e),l=ot(e),u={},d={},f=z(e.columns,t),p=l.in_a.key,m=l.in_b.key;c.forEach(t=>{let n=B(e.columns,f,t);t[p]&&(u[n.toLowerCase()]=t),t[m]&&(d[n.toLowerCase()]=t)});let{rows:h,rowStats:g}=K({baseMap:u,currentMap:d,baseColumns:e.columns,currentColumns:e.columns,columnMap:l,primaryKeys:t,changedOnly:a}),{columns:_}=G({columns:D({columnMap:l,primaryKeys:t,pinnedColumns:i,columnsRenderMode:s,changedOnly:a,rowStats:g,excludeColumns:[`in_a`,`in_b`],strictMode:!0}),displayMode:o,allowIndexFallback:!1,baseTitle:n?.baseTitle,currentTitle:n?.currentTitle,headerProps:{primaryKeys:t,pinnedColumns:i,onPinnedColumnsChange:n?.onPinnedColumnsChange,onColumnsRenderModeChanged:n?.onColumnsRenderModeChanged},renderComponents:r?.renderComponents??{DataFrameColumnGroupHeader:()=>null,defaultRenderCell:()=>null,inlineRenderCell:()=>null}});return{columns:_,rows:h}}const Q={DataFrameColumnGroupHeader:P,defaultRenderCell:dt,inlineRenderCell:pt},$={DataFrameColumnGroupHeader:P,DataFrameColumnHeader:Qe,defaultRenderCell:dt};function Ft(e){return W({...e,renderComponents:Q})}function It(e){return G({...e,renderComponents:Q})}function Lt(e,t,n){return At(e,t,n,{renderComponents:Q})}function Rt(e,t,n){return Z(e,t,n,{renderComponents:Q})}function zt(e,t){return Pt(e,t,{renderComponents:$})}function Bt(e){return X({...e,renderComponents:$})}function Vt(e,t){if(e===0&&t!==0)return`N/A`;if(e<t){let n=(t-e)/e*100;return`+${n>=.1?n.toFixed(1):` <0.1 `}%`}else if(e>t){let n=(e-t)/e*100;return`-${n>=.1?n.toFixed(1):` <0.1 `}%`}else return`0`}function Ht(e,t){return e!==null&&t!==null?e===t?`0`:Vt(e,t):e===t?`N/A`:e===null?`Added`:t===null?`Removed`:`N/A`}function Ut(e){return{columns:[{key:`name`,name:`Name`,type:`text`},{key:`base`,name:`Base Rows`,type:`number`},{key:`current`,name:`Current Rows`,type:`number`},{key:`delta`,name:`Delta`,type:`text`}],data:Object.entries(e).map(([e,t])=>{let n=typeof t.base==`number`?t.base:null,r=typeof t.curr==`number`?t.curr:null;return[e,n,r,Ht(n,r)]})}}function Wt(e){return{columns:[{key:`name`,name:`Name`,type:`text`},{key:`current`,name:`Row Count`,type:`number`}],data:Object.entries(e).map(([e,t])=>[e,typeof t.curr==`number`?t.curr:null])}}function Gt(e,t){if(e===null&&t!==null)return`added`;if(e!==null&&t===null)return`removed`;if(e!==null&&t!==null&&e!==t)return`modified`}function Kt(e){return{columns:[{field:`name`,headerName:`Name`,resizable:!0},{field:`current`,headerName:`Row Count`,resizable:!0}],rows:F(Wt(e)).map(e=>({...e,current:e.current??`N/A`,__status:void 0}))}}function qt(){return e=>{let t=e.data;if(!t)return;let n=t.base,r=t.current,i=n===`N/A`?null:n,a=r===`N/A`?null:r;if(i!==a){if(i===null||typeof i==`number`&&typeof a==`number`&&i<a)return`diff-cell-added`;if(a===null||typeof i==`number`&&typeof a==`number`&&i>a)return`diff-cell-removed`}}}function Jt(e){let t=F(Ut(e)).map(e=>{let t=e.base,n=e.current;return{...e,base:t??`N/A`,current:n??`N/A`,__status:Gt(typeof t==`number`?t:null,typeof n==`number`?n:null)}}),n=qt();return{columns:[{field:`name`,headerName:`Name`,resizable:!0,cellClass:n},{field:`base`,headerName:`Base Rows`,resizable:!0,cellClass:n},{field:`current`,headerName:`Current Rows`,resizable:!0,cellClass:n},{field:`delta`,headerName:`Delta`,resizable:!0,cellClass:n}],rows:t}}function Yt(e){let t=new Set,n=new Set;if(e?.nodes){let r=Object.values(e.nodes);for(let e of r)e.data.data.base?.schema&&t.add(e.data.data.base.schema),e.data.data.current?.schema&&n.add(e.data.data.current.schema)}return[t,n]}function Xt(e,t){let n=L(e,t);if(n.length===0)return[];if(e.length===0||t.length===0)return n.map((e,t)=>t===n.length-1?e:e+`,`);let r=``;return n.forEach(n=>{e.includes(n)&&t.includes(n)&&(r=n)}),n.map((i,a)=>{let o;return o=e.includes(i)?t.includes(i)?i:`--- ${i} (Removed)`:`--- ${i} (Added)`,i===r||a===n.length-1?o:o+`,`})}function Zt(e){let t=Math.floor(e);return{hours:Math.floor(t/3600),minutes:Math.floor(t%3600/60),seconds:t%60}}function Qt({hours:e,minutes:t,seconds:n}){return e>0?`${e}:${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}`:`${t}:${n.toString().padStart(2,`0`)}`}function $t({hours:e,minutes:t,seconds:n}){let r=[];return e>0&&r.push(`${e} hour${e===1?``:`s`}`),t>0&&r.push(`${t} min${t===1?``:`s`}`),e===0&&(r.length===0||n>0)&&r.push(`${n} second${n===1?``:`s`}`),r.join(` `)}function en(e,t=`verbose`){let n=Zt(e);return t===`compact`?Qt(n):$t(n)}function tn(e){return se(le(e),`yyyy-MM-dd'T'HH:mm:ss`)}function nn(e){return ce(le(e),new Date,{addSuffix:!0})}function rn(e,t){if(!e||!t)return;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!0;for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!0;for(let n of r)if(!e[n]||e[n].type!==t[n]?.type)return!0;return!1}function an(e,t){return e?.organization_name&&e.web_url?`${e.web_url}/organizations/${e.organization_name}/settings`:t}export{it as $,J as A,_e as At,at as B,Z as C,ze as Ct,q as D,Me as Dt,At as E,Le as Et,K as F,fe as Ft,V as G,st as H,G as I,ue as It,B as J,lt as K,ht as L,de as Lt,Ot as M,ge as Mt,Dt as N,he as Nt,Et as O,Ne as Ot,kt as P,pe as Pt,R as Q,gt as R,Rt as S,Be as St,X as T,Fe as Tt,H as U,ot as V,ct as W,z as X,U as Y,L as Z,Q as _,Ge as _t,tn as a,et as at,zt as b,T as bt,Jt as c,Ze as ct,Gt as d,M as dt,rt as et,Ut as f,Ye as ft,Bt as g,D as gt,It as h,Ve as ht,nn as i,nt as it,Y as j,me as jt,Tt as k,ye as kt,Kt as l,Xe as lt,Vt as m,O as mt,rn as n,F as nt,Xt as o,$e as ot,Wt as p,k as pt,ut as q,en as r,tt as rt,Yt as s,N as st,an as t,I as tt,Ht as u,Je as ut,$ as v,E as vt,Pt as w,Re as wt,Ft as x,He as xt,Lt as y,Ue as yt,W as z};
6
+ //# sourceMappingURL=utils-Crcz1Rb5.js.map