@datarecce/ui 0.1.30 → 0.1.32

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 (622) hide show
  1. package/dist/{state-lPCQsWy5.js → RecceCheckContext-BOGmP80K.js} +4367 -5089
  2. package/dist/RecceCheckContext-BOGmP80K.js.map +1 -0
  3. package/dist/{state-B9yzhuKs.mjs → RecceCheckContext-CwUCo6AW.mjs} +4273 -4541
  4. package/dist/RecceCheckContext-CwUCo6AW.mjs.map +1 -0
  5. package/dist/{state-DOUPNifc.css → RecceCheckContext-DPnWB_aU.css} +57 -57
  6. package/dist/RecceCheckContext-DPnWB_aU.css.map +1 -0
  7. package/dist/{state-IA7HWYOs.css → RecceCheckContext-DyxOeUsX.css} +57 -57
  8. package/dist/RecceCheckContext-DyxOeUsX.css.map +1 -0
  9. package/dist/api.d.mts +1 -1
  10. package/dist/api.d.ts +1 -1
  11. package/dist/api.js +65 -26
  12. package/dist/api.js.map +1 -0
  13. package/dist/api.mjs +44 -5
  14. package/dist/api.mjs.map +1 -0
  15. package/dist/{components-DCOI1YlQ.mjs → components-DQUwJlNQ.mjs} +20 -21
  16. package/dist/{components-DCOI1YlQ.mjs.map → components-DQUwJlNQ.mjs.map} +1 -1
  17. package/dist/{components-B-YxuuPz.js → components-uVp0e4cH.js} +231 -241
  18. package/dist/{components-B-YxuuPz.js.map → components-uVp0e4cH.js.map} +1 -1
  19. package/dist/components.d.mts +1 -1
  20. package/dist/components.d.ts +1 -1
  21. package/dist/components.js +38 -38
  22. package/dist/components.mjs +5 -5
  23. package/dist/{urls-B1Ymdoz-.mjs → const-CaIm1Z8g.mjs} +2 -6
  24. package/dist/const-CaIm1Z8g.mjs.map +1 -0
  25. package/dist/{urls-C4eAc82S.js → const-CvdZO0FN.js} +1 -11
  26. package/dist/const-CvdZO0FN.js.map +1 -0
  27. package/dist/global-styles.css +84 -0
  28. package/dist/global-styles.css.map +1 -0
  29. package/dist/global-styles.js +1 -0
  30. package/dist/global-styles.mjs +1 -0
  31. package/dist/{hooks-DjBNmTdh.mjs → hooks-C6Kma5ld.mjs} +2 -3
  32. package/dist/{hooks-DjBNmTdh.mjs.map → hooks-C6Kma5ld.mjs.map} +1 -1
  33. package/dist/hooks-CfZ4UBBF.js +40 -0
  34. package/dist/{hooks-B9hsc1oD.js.map → hooks-CfZ4UBBF.js.map} +1 -1
  35. package/dist/hooks.d.mts +1 -1
  36. package/dist/hooks.d.ts +1 -1
  37. package/dist/hooks.js +26 -26
  38. package/dist/hooks.mjs +4 -4
  39. package/dist/{html2canvas-pro.esm-WJxOmKlq.js → html2canvas-pro.esm-CsuSOHXp.js} +1 -1
  40. package/dist/{html2canvas-pro.esm-WJxOmKlq.js.map → html2canvas-pro.esm-CsuSOHXp.js.map} +1 -1
  41. package/dist/{html2canvas-pro.esm-BInzOtWO.mjs → html2canvas-pro.esm-E7kpobrC.mjs} +1 -1
  42. package/dist/{html2canvas-pro.esm-BInzOtWO.mjs.map → html2canvas-pro.esm-E7kpobrC.mjs.map} +1 -1
  43. package/dist/{index-BNUP2V_N.d.ts → index-B9lSPJTi.d.ts} +184 -2
  44. package/dist/index-B9lSPJTi.d.ts.map +1 -0
  45. package/dist/{index-DOPZuhD8.d.mts → index-DsCU2oGL.d.mts} +259 -77
  46. package/dist/index-DsCU2oGL.d.mts.map +1 -0
  47. package/dist/index.d.mts +2 -2
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.js +92 -84
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +12 -10
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/{mui-theme-B2wm_cvZ.js → mui-theme-iBHkjXJq.js} +2 -2
  54. package/dist/{mui-theme-B2wm_cvZ.js.map → mui-theme-iBHkjXJq.js.map} +1 -1
  55. package/dist/state-CTITyT0R.js +795 -0
  56. package/dist/state-CTITyT0R.js.map +1 -0
  57. package/dist/state-Sc2b4jri.mjs +382 -0
  58. package/dist/state-Sc2b4jri.mjs.map +1 -0
  59. package/dist/styles.css +5 -0
  60. package/dist/theme.d.mts +2 -185
  61. package/dist/theme.d.ts +2 -185
  62. package/dist/theme.js +1 -1
  63. package/dist/{tooltipMessage-DosF13kZ.js → tooltipMessage-BC5W7H3X.js} +1 -1
  64. package/dist/{tooltipMessage-DosF13kZ.js.map → tooltipMessage-BC5W7H3X.js.map} +1 -1
  65. package/dist/{tooltipMessage-B--I3p1V.mjs → tooltipMessage-B_xMIKWL.mjs} +1 -1
  66. package/dist/{tooltipMessage-B--I3p1V.mjs.map → tooltipMessage-B_xMIKWL.mjs.map} +1 -1
  67. package/dist/types.d.mts +1 -1
  68. package/dist/types.d.ts +1 -1
  69. package/dist/types.js +5 -4
  70. package/dist/types.mjs +3 -2
  71. package/dist/urls-BQW5wjg-.js +13 -0
  72. package/dist/urls-BQW5wjg-.js.map +1 -0
  73. package/dist/urls-DT7FVEcS.mjs +7 -0
  74. package/dist/urls-DT7FVEcS.mjs.map +1 -0
  75. package/dist/version-B9s8yne-.js +300 -0
  76. package/dist/version-B9s8yne-.js.map +1 -0
  77. package/dist/version-DP1kU_7v.mjs +162 -0
  78. package/dist/version-DP1kU_7v.mjs.map +1 -0
  79. package/package.json +5 -3
  80. package/recce-source/.editorconfig +26 -0
  81. package/recce-source/.flake8 +37 -0
  82. package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
  83. package/recce-source/.github/ISSUE_TEMPLATE/custom.md +10 -0
  84. package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  85. package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  86. package/recce-source/.github/copilot-instructions.md +331 -0
  87. package/recce-source/.github/instructions/backend-instructions.md +541 -0
  88. package/recce-source/.github/instructions/frontend-instructions.md +317 -0
  89. package/recce-source/.github/workflows/build-statics.yaml +72 -0
  90. package/recce-source/.github/workflows/bump.yaml +48 -0
  91. package/recce-source/.github/workflows/integration-tests-cloud.yaml +92 -0
  92. package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +33 -0
  93. package/recce-source/.github/workflows/integration-tests.yaml +52 -0
  94. package/recce-source/.github/workflows/nightly.yaml +246 -0
  95. package/recce-source/.github/workflows/release.yaml +196 -0
  96. package/recce-source/.github/workflows/tests-js.yaml +58 -0
  97. package/recce-source/.github/workflows/tests-python.yaml +128 -0
  98. package/recce-source/.pre-commit-config.yaml +26 -0
  99. package/recce-source/CLAUDE.md +483 -0
  100. package/recce-source/CODE_OF_CONDUCT.md +128 -0
  101. package/recce-source/CONTRIBUTING.md +107 -0
  102. package/recce-source/LICENSE +201 -0
  103. package/recce-source/Makefile +126 -0
  104. package/recce-source/README.md +182 -0
  105. package/recce-source/RECCE_CLOUD.md +81 -0
  106. package/recce-source/SECURITY.md +25 -0
  107. package/recce-source/docs/PACKAGING.md +340 -0
  108. package/recce-source/docs/README.md +1 -0
  109. package/recce-source/integration_tests/dbt/dbt_project.yml +26 -0
  110. package/recce-source/integration_tests/dbt/models/customers.sql +69 -0
  111. package/recce-source/integration_tests/dbt/models/docs.md +14 -0
  112. package/recce-source/integration_tests/dbt/models/orders.sql +56 -0
  113. package/recce-source/integration_tests/dbt/models/schema.yml +82 -0
  114. package/recce-source/integration_tests/dbt/models/staging/schema.yml +31 -0
  115. package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +22 -0
  116. package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +23 -0
  117. package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +25 -0
  118. package/recce-source/integration_tests/dbt/packages.yml +7 -0
  119. package/recce-source/integration_tests/dbt/profiles.yml +8 -0
  120. package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +101 -0
  121. package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +100 -0
  122. package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +114 -0
  123. package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +5 -0
  124. package/recce-source/integration_tests/dbt/smoke_test.sh +72 -0
  125. package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +71 -0
  126. package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
  127. package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +9 -0
  128. package/recce-source/integration_tests/sqlmesh/audits/items.sql +7 -0
  129. package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +7 -0
  130. package/recce-source/integration_tests/sqlmesh/config.py +171 -0
  131. package/recce-source/integration_tests/sqlmesh/helper.py +20 -0
  132. package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
  133. package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
  134. package/recce-source/integration_tests/sqlmesh/macros/macros.py +8 -0
  135. package/recce-source/integration_tests/sqlmesh/macros/macros.sql +8 -0
  136. package/recce-source/integration_tests/sqlmesh/macros/utils.py +11 -0
  137. package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +25 -0
  138. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +41 -0
  139. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +60 -0
  140. package/recce-source/integration_tests/sqlmesh/models/customers.sql +32 -0
  141. package/recce-source/integration_tests/sqlmesh/models/items.py +95 -0
  142. package/recce-source/integration_tests/sqlmesh/models/marketing.sql +15 -0
  143. package/recce-source/integration_tests/sqlmesh/models/order_items.py +95 -0
  144. package/recce-source/integration_tests/sqlmesh/models/orders.py +70 -0
  145. package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +62 -0
  146. package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +23 -0
  147. package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +29 -0
  148. package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +10 -0
  149. package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +29 -0
  150. package/recce-source/integration_tests/sqlmesh/models/waiters.py +62 -0
  151. package/recce-source/integration_tests/sqlmesh/prep_env.sh +16 -0
  152. package/recce-source/integration_tests/sqlmesh/schema.yaml +5 -0
  153. package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +11 -0
  154. package/recce-source/integration_tests/sqlmesh/test_server.sh +29 -0
  155. package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +63 -0
  156. package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +72 -0
  157. package/recce-source/js/.editorconfig +27 -0
  158. package/recce-source/js/.env.development +5 -0
  159. package/recce-source/js/.husky/pre-commit +29 -0
  160. package/recce-source/js/.nvmrc +1 -0
  161. package/recce-source/js/README.md +39 -0
  162. package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +65 -0
  163. package/recce-source/js/app/(mainComponents)/NavBar.tsx +228 -0
  164. package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +107 -0
  165. package/recce-source/js/app/(mainComponents)/TopBar.tsx +252 -0
  166. package/recce-source/js/app/@lineage/default.tsx +20 -0
  167. package/recce-source/js/app/@lineage/page.tsx +14 -0
  168. package/recce-source/js/app/MainLayout.tsx +170 -0
  169. package/recce-source/js/app/Providers.tsx +49 -0
  170. package/recce-source/js/app/checks/page.tsx +296 -0
  171. package/recce-source/js/app/error.tsx +93 -0
  172. package/recce-source/js/app/favicon.ico +0 -0
  173. package/recce-source/js/app/global-error.tsx +115 -0
  174. package/recce-source/js/app/global.css +82 -0
  175. package/recce-source/js/app/layout.tsx +48 -0
  176. package/recce-source/js/app/lineage/page.tsx +15 -0
  177. package/recce-source/js/app/page.tsx +12 -0
  178. package/recce-source/js/app/query/page.tsx +8 -0
  179. package/recce-source/js/biome.json +313 -0
  180. package/recce-source/js/jest.config.js +34 -0
  181. package/recce-source/js/jest.globals.d.ts +32 -0
  182. package/recce-source/js/jest.setup.js +91 -0
  183. package/recce-source/js/next.config.js +16 -0
  184. package/recce-source/js/package-lock.json +13843 -0
  185. package/recce-source/js/package.json +123 -0
  186. package/recce-source/js/pnpm-lock.yaml +9235 -0
  187. package/recce-source/js/pnpm-workspace.yaml +6 -0
  188. package/recce-source/js/postcss.config.js +5 -0
  189. package/recce-source/js/public/auth_callback.html +68 -0
  190. package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
  191. package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
  192. package/recce-source/js/public/imgs/reload-image.svg +4 -0
  193. package/recce-source/js/public/logo/recce-logo-white.png +0 -0
  194. package/recce-source/js/src/components/AuthModal/AuthModal.tsx +202 -0
  195. package/recce-source/js/src/components/app/AvatarDropdown.tsx +159 -0
  196. package/recce-source/js/src/components/app/EnvInfo.tsx +357 -0
  197. package/recce-source/js/src/components/app/Filename.tsx +388 -0
  198. package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +91 -0
  199. package/recce-source/js/src/components/app/StateExporter.tsx +57 -0
  200. package/recce-source/js/src/components/app/StateImporter.tsx +198 -0
  201. package/recce-source/js/src/components/app/StateSharing.tsx +145 -0
  202. package/recce-source/js/src/components/app/StateSynchronizer.tsx +205 -0
  203. package/recce-source/js/src/components/charts/HistogramChart.tsx +291 -0
  204. package/recce-source/js/src/components/charts/SquareIcon.tsx +51 -0
  205. package/recce-source/js/src/components/charts/TopKSummaryList.tsx +457 -0
  206. package/recce-source/js/src/components/charts/chartTheme.ts +74 -0
  207. package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +97 -0
  208. package/recce-source/js/src/components/check/CheckDescription.tsx +134 -0
  209. package/recce-source/js/src/components/check/CheckDetail.tsx +797 -0
  210. package/recce-source/js/src/components/check/CheckEmptyState.tsx +84 -0
  211. package/recce-source/js/src/components/check/CheckList.tsx +320 -0
  212. package/recce-source/js/src/components/check/LineageDiffView.tsx +32 -0
  213. package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +48 -0
  214. package/recce-source/js/src/components/check/SchemaDiffView.tsx +290 -0
  215. package/recce-source/js/src/components/check/check.ts +25 -0
  216. package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +163 -0
  217. package/recce-source/js/src/components/check/timeline/CommentInput.tsx +84 -0
  218. package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +468 -0
  219. package/recce-source/js/src/components/check/timeline/index.ts +12 -0
  220. package/recce-source/js/src/components/check/utils.ts +12 -0
  221. package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +333 -0
  222. package/recce-source/js/src/components/data-grid/agGridStyles.css +55 -0
  223. package/recce-source/js/src/components/data-grid/agGridTheme.ts +43 -0
  224. package/recce-source/js/src/components/editor/CodeEditor.tsx +107 -0
  225. package/recce-source/js/src/components/editor/DiffEditor.tsx +162 -0
  226. package/recce-source/js/src/components/editor/index.ts +12 -0
  227. package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +87 -0
  228. package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +147 -0
  229. package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +63 -0
  230. package/recce-source/js/src/components/icons/index.tsx +142 -0
  231. package/recce-source/js/src/components/lineage/ActionControl.tsx +63 -0
  232. package/recce-source/js/src/components/lineage/ActionTag.tsx +141 -0
  233. package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +46 -0
  234. package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +327 -0
  235. package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +57 -0
  236. package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +199 -0
  237. package/recce-source/js/src/components/lineage/GraphEdge.tsx +59 -0
  238. package/recce-source/js/src/components/lineage/GraphNode.tsx +555 -0
  239. package/recce-source/js/src/components/lineage/LineagePage.tsx +10 -0
  240. package/recce-source/js/src/components/lineage/LineageView.tsx +1384 -0
  241. package/recce-source/js/src/components/lineage/LineageViewContext.tsx +86 -0
  242. package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +637 -0
  243. package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +64 -0
  244. package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +596 -0
  245. package/recce-source/js/src/components/lineage/NodeSqlView.tsx +136 -0
  246. package/recce-source/js/src/components/lineage/NodeTag.tsx +278 -0
  247. package/recce-source/js/src/components/lineage/NodeView.tsx +642 -0
  248. package/recce-source/js/src/components/lineage/SandboxView.tsx +436 -0
  249. package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +105 -0
  250. package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +52 -0
  251. package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +152 -0
  252. package/recce-source/js/src/components/lineage/graph.test.ts +31 -0
  253. package/recce-source/js/src/components/lineage/graph.ts +58 -0
  254. package/recce-source/js/src/components/lineage/lineage.test.ts +169 -0
  255. package/recce-source/js/src/components/lineage/lineage.ts +521 -0
  256. package/recce-source/js/src/components/lineage/styles.css +42 -0
  257. package/recce-source/js/src/components/lineage/styles.tsx +165 -0
  258. package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +352 -0
  259. package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +108 -0
  260. package/recce-source/js/src/components/onboarding-guide/Notification.tsx +62 -0
  261. package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +134 -0
  262. package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +245 -0
  263. package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +29 -0
  264. package/recce-source/js/src/components/query/DiffText.tsx +120 -0
  265. package/recce-source/js/src/components/query/QueryDiffResultView.tsx +470 -0
  266. package/recce-source/js/src/components/query/QueryForm.tsx +80 -0
  267. package/recce-source/js/src/components/query/QueryPage.tsx +282 -0
  268. package/recce-source/js/src/components/query/QueryResultView.tsx +180 -0
  269. package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +57 -0
  270. package/recce-source/js/src/components/query/SqlEditor.tsx +245 -0
  271. package/recce-source/js/src/components/query/ToggleSwitch.tsx +84 -0
  272. package/recce-source/js/src/components/query/styles.css +21 -0
  273. package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +428 -0
  274. package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +311 -0
  275. package/recce-source/js/src/components/routing/Navigation.test.tsx +256 -0
  276. package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +109 -0
  277. package/recce-source/js/src/components/rowcount/delta.ts +11 -0
  278. package/recce-source/js/src/components/run/RunList.tsx +303 -0
  279. package/recce-source/js/src/components/run/RunModal.tsx +191 -0
  280. package/recce-source/js/src/components/run/RunPage.tsx +26 -0
  281. package/recce-source/js/src/components/run/RunResultPane.tsx +454 -0
  282. package/recce-source/js/src/components/run/RunStatusAndDate.tsx +106 -0
  283. package/recce-source/js/src/components/run/RunToolbar.tsx +70 -0
  284. package/recce-source/js/src/components/run/RunView.tsx +196 -0
  285. package/recce-source/js/src/components/run/registry.ts +214 -0
  286. package/recce-source/js/src/components/run/types.ts +14 -0
  287. package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +169 -0
  288. package/recce-source/js/src/components/schema/ColumnNameCell.tsx +198 -0
  289. package/recce-source/js/src/components/schema/SchemaView.tsx +337 -0
  290. package/recce-source/js/src/components/schema/schemaDiff.ts +32 -0
  291. package/recce-source/js/src/components/schema/style.css +134 -0
  292. package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +39 -0
  293. package/recce-source/js/src/components/shared/HistoryToggle.tsx +35 -0
  294. package/recce-source/js/src/components/split/Split.tsx +40 -0
  295. package/recce-source/js/src/components/split/styles.css +24 -0
  296. package/recce-source/js/src/components/summary/ChangeSummary.tsx +264 -0
  297. package/recce-source/js/src/components/summary/SchemaSummary.tsx +123 -0
  298. package/recce-source/js/src/components/summary/SummaryView.tsx +29 -0
  299. package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +48 -0
  300. package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +58 -0
  301. package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +73 -0
  302. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +228 -0
  303. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +113 -0
  304. package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +72 -0
  305. package/recce-source/js/src/components/ui/dataGrid/index.ts +23 -0
  306. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +607 -0
  307. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +211 -0
  308. package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +452 -0
  309. package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +142 -0
  310. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +178 -0
  311. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +275 -0
  312. package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +134 -0
  313. package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +364 -0
  314. package/recce-source/js/src/components/ui/mui/index.ts +13 -0
  315. package/recce-source/js/src/components/ui/mui-provider.tsx +67 -0
  316. package/recce-source/js/src/components/ui/mui-theme.ts +1039 -0
  317. package/recce-source/js/src/components/ui/mui-utils.ts +113 -0
  318. package/recce-source/js/src/components/ui/toaster.tsx +288 -0
  319. package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +217 -0
  320. package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +246 -0
  321. package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +82 -0
  322. package/recce-source/js/src/components/valuediff/shared.ts +33 -0
  323. package/recce-source/js/src/constants/tooltipMessage.ts +3 -0
  324. package/recce-source/js/src/constants/urls.ts +1 -0
  325. package/recce-source/js/src/lib/UrlHash.ts +12 -0
  326. package/recce-source/js/src/lib/api/adhocQuery.ts +70 -0
  327. package/recce-source/js/src/lib/api/axiosClient.ts +9 -0
  328. package/recce-source/js/src/lib/api/cacheKeys.ts +13 -0
  329. package/recce-source/js/src/lib/api/checkEvents.ts +252 -0
  330. package/recce-source/js/src/lib/api/checks.ts +129 -0
  331. package/recce-source/js/src/lib/api/cll.ts +53 -0
  332. package/recce-source/js/src/lib/api/connectToCloud.ts +13 -0
  333. package/recce-source/js/src/lib/api/flag.ts +37 -0
  334. package/recce-source/js/src/lib/api/info.ts +198 -0
  335. package/recce-source/js/src/lib/api/instanceInfo.ts +25 -0
  336. package/recce-source/js/src/lib/api/keepAlive.ts +108 -0
  337. package/recce-source/js/src/lib/api/lineagecheck.ts +35 -0
  338. package/recce-source/js/src/lib/api/localStorageKeys.ts +7 -0
  339. package/recce-source/js/src/lib/api/models.ts +59 -0
  340. package/recce-source/js/src/lib/api/profile.ts +65 -0
  341. package/recce-source/js/src/lib/api/rowcount.ts +19 -0
  342. package/recce-source/js/src/lib/api/runs.ts +174 -0
  343. package/recce-source/js/src/lib/api/schemacheck.ts +31 -0
  344. package/recce-source/js/src/lib/api/select.ts +25 -0
  345. package/recce-source/js/src/lib/api/sessionStorageKeys.ts +8 -0
  346. package/recce-source/js/src/lib/api/state.ts +117 -0
  347. package/recce-source/js/src/lib/api/track.ts +281 -0
  348. package/recce-source/js/src/lib/api/types.ts +284 -0
  349. package/recce-source/js/src/lib/api/user.ts +42 -0
  350. package/recce-source/js/src/lib/api/valuediff.ts +46 -0
  351. package/recce-source/js/src/lib/api/version.ts +40 -0
  352. package/recce-source/js/src/lib/const.ts +9 -0
  353. package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +626 -0
  354. package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +2140 -0
  355. package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +397 -0
  356. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +132 -0
  357. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +126 -0
  358. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +1627 -0
  359. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +140 -0
  360. package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +67 -0
  361. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +142 -0
  362. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +71 -0
  363. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +258 -0
  364. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +153 -0
  365. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +951 -0
  366. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +221 -0
  367. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +395 -0
  368. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +184 -0
  369. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +884 -0
  370. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +113 -0
  371. package/recce-source/js/src/lib/dataGrid/index.ts +51 -0
  372. package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +858 -0
  373. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +482 -0
  374. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +345 -0
  375. package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +698 -0
  376. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +820 -0
  377. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +277 -0
  378. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +785 -0
  379. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +370 -0
  380. package/recce-source/js/src/lib/dataGrid/shared/index.ts +81 -0
  381. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +909 -0
  382. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +325 -0
  383. package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +240 -0
  384. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +719 -0
  385. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +231 -0
  386. package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +559 -0
  387. package/recce-source/js/src/lib/dataGrid/shared/validation.ts +367 -0
  388. package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +1117 -0
  389. package/recce-source/js/src/lib/formatSelect.ts +50 -0
  390. package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +181 -0
  391. package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +177 -0
  392. package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +512 -0
  393. package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +269 -0
  394. package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +33 -0
  395. package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +54 -0
  396. package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +129 -0
  397. package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +98 -0
  398. package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +59 -0
  399. package/recce-source/js/src/lib/hooks/ScreenShot.tsx +399 -0
  400. package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +211 -0
  401. package/recce-source/js/src/lib/hooks/useAppRouter.ts +200 -0
  402. package/recce-source/js/src/lib/hooks/useCheckEvents.ts +99 -0
  403. package/recce-source/js/src/lib/hooks/useCheckToast.tsx +14 -0
  404. package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +27 -0
  405. package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +102 -0
  406. package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +130 -0
  407. package/recce-source/js/src/lib/hooks/useGuideToast.tsx +45 -0
  408. package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +185 -0
  409. package/recce-source/js/src/lib/hooks/useModelColumns.tsx +113 -0
  410. package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +13 -0
  411. package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +13 -0
  412. package/recce-source/js/src/lib/hooks/useRun.tsx +89 -0
  413. package/recce-source/js/src/lib/hooks/useThemeColors.ts +115 -0
  414. package/recce-source/js/src/lib/mergeKeys.test.ts +89 -0
  415. package/recce-source/js/src/lib/mergeKeys.ts +86 -0
  416. package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +9 -0
  417. package/recce-source/js/src/lib/utils/formatTime.ts +84 -0
  418. package/recce-source/js/src/lib/utils/urls.ts +16 -0
  419. package/recce-source/js/src/utils/DropdownValuesInput.tsx +297 -0
  420. package/recce-source/js/src/utils/formatters.tsx +237 -0
  421. package/recce-source/js/src/utils/transforms.ts +81 -0
  422. package/recce-source/js/tsconfig.json +47 -0
  423. package/recce-source/macros/README.md +8 -0
  424. package/recce-source/macros/recce_athena.sql +73 -0
  425. package/recce-source/pyproject.toml +109 -0
  426. package/recce-source/recce/VERSION +1 -0
  427. package/recce-source/recce/__init__.py +84 -0
  428. package/recce-source/recce/adapter/__init__.py +0 -0
  429. package/recce-source/recce/adapter/base.py +109 -0
  430. package/recce-source/recce/adapter/dbt_adapter/__init__.py +1699 -0
  431. package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +42 -0
  432. package/recce-source/recce/adapter/sqlmesh_adapter.py +141 -0
  433. package/recce-source/recce/apis/__init__.py +0 -0
  434. package/recce-source/recce/apis/check_api.py +203 -0
  435. package/recce-source/recce/apis/check_events_api.py +353 -0
  436. package/recce-source/recce/apis/check_func.py +130 -0
  437. package/recce-source/recce/apis/run_api.py +130 -0
  438. package/recce-source/recce/apis/run_func.py +258 -0
  439. package/recce-source/recce/artifact.py +266 -0
  440. package/recce-source/recce/cli.py +1846 -0
  441. package/recce-source/recce/config.py +127 -0
  442. package/recce-source/recce/connect_to_cloud.py +138 -0
  443. package/recce-source/recce/core.py +334 -0
  444. package/recce-source/recce/diff.py +26 -0
  445. package/recce-source/recce/event/CONFIG +1 -0
  446. package/recce-source/recce/event/SENTRY_DNS +1 -0
  447. package/recce-source/recce/event/__init__.py +304 -0
  448. package/recce-source/recce/event/collector.py +184 -0
  449. package/recce-source/recce/event/track.py +158 -0
  450. package/recce-source/recce/exceptions.py +21 -0
  451. package/recce-source/recce/git.py +77 -0
  452. package/recce-source/recce/github.py +222 -0
  453. package/recce-source/recce/mcp_server.py +861 -0
  454. package/recce-source/recce/models/__init__.py +6 -0
  455. package/recce-source/recce/models/check.py +473 -0
  456. package/recce-source/recce/models/run.py +46 -0
  457. package/recce-source/recce/models/types.py +218 -0
  458. package/recce-source/recce/pull_request.py +124 -0
  459. package/recce-source/recce/run.py +390 -0
  460. package/recce-source/recce/server.py +877 -0
  461. package/recce-source/recce/state/__init__.py +31 -0
  462. package/recce-source/recce/state/cloud.py +644 -0
  463. package/recce-source/recce/state/const.py +26 -0
  464. package/recce-source/recce/state/local.py +56 -0
  465. package/recce-source/recce/state/state.py +119 -0
  466. package/recce-source/recce/state/state_loader.py +174 -0
  467. package/recce-source/recce/summary.py +575 -0
  468. package/recce-source/recce/tasks/__init__.py +23 -0
  469. package/recce-source/recce/tasks/core.py +134 -0
  470. package/recce-source/recce/tasks/dataframe.py +170 -0
  471. package/recce-source/recce/tasks/histogram.py +433 -0
  472. package/recce-source/recce/tasks/lineage.py +19 -0
  473. package/recce-source/recce/tasks/profile.py +298 -0
  474. package/recce-source/recce/tasks/query.py +450 -0
  475. package/recce-source/recce/tasks/rowcount.py +277 -0
  476. package/recce-source/recce/tasks/schema.py +65 -0
  477. package/recce-source/recce/tasks/top_k.py +172 -0
  478. package/recce-source/recce/tasks/utils.py +147 -0
  479. package/recce-source/recce/tasks/valuediff.py +497 -0
  480. package/recce-source/recce/util/__init__.py +4 -0
  481. package/recce-source/recce/util/api_token.py +80 -0
  482. package/recce-source/recce/util/breaking.py +330 -0
  483. package/recce-source/recce/util/cache.py +25 -0
  484. package/recce-source/recce/util/cll.py +355 -0
  485. package/recce-source/recce/util/cloud/__init__.py +15 -0
  486. package/recce-source/recce/util/cloud/base.py +115 -0
  487. package/recce-source/recce/util/cloud/check_events.py +190 -0
  488. package/recce-source/recce/util/cloud/checks.py +242 -0
  489. package/recce-source/recce/util/io.py +120 -0
  490. package/recce-source/recce/util/lineage.py +83 -0
  491. package/recce-source/recce/util/logger.py +25 -0
  492. package/recce-source/recce/util/onboarding_state.py +45 -0
  493. package/recce-source/recce/util/perf_tracking.py +85 -0
  494. package/recce-source/recce/util/pydantic_model.py +22 -0
  495. package/recce-source/recce/util/recce_cloud.py +454 -0
  496. package/recce-source/recce/util/singleton.py +18 -0
  497. package/recce-source/recce/util/startup_perf.py +121 -0
  498. package/recce-source/recce/yaml/__init__.py +58 -0
  499. package/recce-source/recce_cloud/README.md +780 -0
  500. package/recce-source/recce_cloud/VERSION +1 -0
  501. package/recce-source/recce_cloud/__init__.py +24 -0
  502. package/recce-source/recce_cloud/api/__init__.py +17 -0
  503. package/recce-source/recce_cloud/api/base.py +132 -0
  504. package/recce-source/recce_cloud/api/client.py +186 -0
  505. package/recce-source/recce_cloud/api/exceptions.py +26 -0
  506. package/recce-source/recce_cloud/api/factory.py +63 -0
  507. package/recce-source/recce_cloud/api/github.py +106 -0
  508. package/recce-source/recce_cloud/api/gitlab.py +111 -0
  509. package/recce-source/recce_cloud/artifact.py +57 -0
  510. package/recce-source/recce_cloud/ci_providers/__init__.py +9 -0
  511. package/recce-source/recce_cloud/ci_providers/base.py +82 -0
  512. package/recce-source/recce_cloud/ci_providers/detector.py +147 -0
  513. package/recce-source/recce_cloud/ci_providers/github_actions.py +136 -0
  514. package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +130 -0
  515. package/recce-source/recce_cloud/cli.py +434 -0
  516. package/recce-source/recce_cloud/download.py +230 -0
  517. package/recce-source/recce_cloud/hatch_build.py +20 -0
  518. package/recce-source/recce_cloud/pyproject.toml +49 -0
  519. package/recce-source/recce_cloud/upload.py +214 -0
  520. package/recce-source/test.py +0 -0
  521. package/recce-source/tests/__init__.py +0 -0
  522. package/recce-source/tests/adapter/__init__.py +0 -0
  523. package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
  524. package/recce-source/tests/adapter/dbt_adapter/conftest.py +17 -0
  525. package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +298 -0
  526. package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +25 -0
  527. package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +717 -0
  528. package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +4 -0
  529. package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +1 -0
  530. package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +8 -0
  531. package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +7 -0
  532. package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +6 -0
  533. package/recce-source/tests/adapter/dbt_adapter/test_selector.py +205 -0
  534. package/recce-source/tests/apis/__init__.py +0 -0
  535. package/recce-source/tests/apis/row_count_diff.json +59 -0
  536. package/recce-source/tests/apis/test_check_events_api.py +615 -0
  537. package/recce-source/tests/apis/test_run_func.py +433 -0
  538. package/recce-source/tests/catalog.json +527 -0
  539. package/recce-source/tests/data/manifest/base/catalog.json +1 -0
  540. package/recce-source/tests/data/manifest/base/manifest.json +1 -0
  541. package/recce-source/tests/data/manifest/pr2/catalog.json +1 -0
  542. package/recce-source/tests/data/manifest/pr2/manifest.json +1 -0
  543. package/recce-source/tests/manifest.json +10655 -0
  544. package/recce-source/tests/models/__init__.py +0 -0
  545. package/recce-source/tests/models/test_check.py +731 -0
  546. package/recce-source/tests/models/test_run_models.py +295 -0
  547. package/recce-source/tests/recce_cloud/__init__.py +0 -0
  548. package/recce-source/tests/recce_cloud/test_ci_providers.py +351 -0
  549. package/recce-source/tests/recce_cloud/test_cli.py +735 -0
  550. package/recce-source/tests/recce_cloud/test_client.py +379 -0
  551. package/recce-source/tests/recce_cloud/test_platform_clients.py +483 -0
  552. package/recce-source/tests/recce_state.json +1 -0
  553. package/recce-source/tests/state/test_cloud.py +719 -0
  554. package/recce-source/tests/state/test_local.py +164 -0
  555. package/recce-source/tests/state/test_state_loader.py +211 -0
  556. package/recce-source/tests/tasks/__init__.py +0 -0
  557. package/recce-source/tests/tasks/conftest.py +4 -0
  558. package/recce-source/tests/tasks/test_histogram.py +129 -0
  559. package/recce-source/tests/tasks/test_lineage.py +55 -0
  560. package/recce-source/tests/tasks/test_preset_checks.py +64 -0
  561. package/recce-source/tests/tasks/test_profile.py +397 -0
  562. package/recce-source/tests/tasks/test_query.py +528 -0
  563. package/recce-source/tests/tasks/test_row_count.py +133 -0
  564. package/recce-source/tests/tasks/test_schema.py +122 -0
  565. package/recce-source/tests/tasks/test_top_k.py +77 -0
  566. package/recce-source/tests/tasks/test_utils.py +439 -0
  567. package/recce-source/tests/tasks/test_valuediff.py +361 -0
  568. package/recce-source/tests/test_cli.py +236 -0
  569. package/recce-source/tests/test_cli_mcp_optional.py +45 -0
  570. package/recce-source/tests/test_cloud_listing_cli.py +324 -0
  571. package/recce-source/tests/test_config.py +43 -0
  572. package/recce-source/tests/test_connect_to_cloud.py +82 -0
  573. package/recce-source/tests/test_core.py +174 -0
  574. package/recce-source/tests/test_dbt.py +36 -0
  575. package/recce-source/tests/test_mcp_server.py +505 -0
  576. package/recce-source/tests/test_pull_request.py +130 -0
  577. package/recce-source/tests/test_server.py +202 -0
  578. package/recce-source/tests/test_server_lifespan.py +138 -0
  579. package/recce-source/tests/test_summary.py +73 -0
  580. package/recce-source/tests/util/__init__.py +0 -0
  581. package/recce-source/tests/util/cloud/__init__.py +0 -0
  582. package/recce-source/tests/util/cloud/test_check_events.py +255 -0
  583. package/recce-source/tests/util/cloud/test_checks.py +204 -0
  584. package/recce-source/tests/util/test_api_token.py +119 -0
  585. package/recce-source/tests/util/test_breaking.py +1427 -0
  586. package/recce-source/tests/util/test_cll.py +706 -0
  587. package/recce-source/tests/util/test_lineage.py +122 -0
  588. package/recce-source/tests/util/test_onboarding_state.py +84 -0
  589. package/recce-source/tests/util/test_recce_cloud.py +231 -0
  590. package/recce-source/tox.ini +40 -0
  591. package/recce-source/uv.lock +3928 -0
  592. package/src/api/index.ts +32 -0
  593. package/src/components/index.ts +154 -0
  594. package/src/global-styles.css +81 -0
  595. package/src/global.d.ts +14 -0
  596. package/src/hooks/index.ts +56 -0
  597. package/src/index.ts +17 -0
  598. package/src/lib/hooks/RouteConfigContext.ts +139 -0
  599. package/src/lib/hooks/useAppRouter.ts +240 -0
  600. package/src/mui-augmentation.d.ts +139 -0
  601. package/src/theme/index.ts +13 -0
  602. package/src/theme.ts +23 -0
  603. package/src/types/index.ts +23 -0
  604. package/dist/RecceCheckContext-DPpu9nG5.js +0 -303
  605. package/dist/RecceCheckContext-DPpu9nG5.js.map +0 -1
  606. package/dist/RecceCheckContext-bXdfQLGG.mjs +0 -229
  607. package/dist/RecceCheckContext-bXdfQLGG.mjs.map +0 -1
  608. package/dist/hooks-B9hsc1oD.js +0 -40
  609. package/dist/index-BNUP2V_N.d.ts.map +0 -1
  610. package/dist/index-DOPZuhD8.d.mts.map +0 -1
  611. package/dist/state-B9yzhuKs.mjs.map +0 -1
  612. package/dist/state-DOUPNifc.css.map +0 -1
  613. package/dist/state-IA7HWYOs.css.map +0 -1
  614. package/dist/state-lPCQsWy5.js.map +0 -1
  615. package/dist/theme.d.mts.map +0 -1
  616. package/dist/theme.d.ts.map +0 -1
  617. package/dist/urls-B1Ymdoz-.mjs.map +0 -1
  618. package/dist/urls-C4eAc82S.js.map +0 -1
  619. package/dist/version-Dh8sZhvs.js +0 -147
  620. package/dist/version-Dh8sZhvs.js.map +0 -1
  621. package/dist/version-OnOKzBeQ.mjs +0 -93
  622. package/dist/version-OnOKzBeQ.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ 1.31.0.dev0
@@ -0,0 +1,24 @@
1
+ """Recce Cloud - Lightweight CLI for Recce Cloud operations."""
2
+
3
+ import os
4
+
5
+
6
+ def get_version():
7
+ """Get version from VERSION file."""
8
+ # Try recce_cloud/VERSION first (for standalone package)
9
+ version_file = os.path.join(os.path.dirname(__file__), "VERSION")
10
+ if os.path.exists(version_file):
11
+ with open(version_file) as fh:
12
+ return fh.read().strip()
13
+
14
+ # Fallback to ../recce/VERSION (for development)
15
+ version_file = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "recce", "VERSION"))
16
+ if os.path.exists(version_file):
17
+ with open(version_file) as fh:
18
+ return fh.read().strip()
19
+
20
+ # Last resort
21
+ return "unknown"
22
+
23
+
24
+ __version__ = get_version()
@@ -0,0 +1,17 @@
1
+ """Recce Cloud API client module."""
2
+
3
+ from recce_cloud.api.base import BaseRecceCloudClient
4
+ from recce_cloud.api.client import RecceCloudClient
5
+ from recce_cloud.api.exceptions import RecceCloudException
6
+ from recce_cloud.api.factory import create_platform_client
7
+ from recce_cloud.api.github import GitHubRecceCloudClient
8
+ from recce_cloud.api.gitlab import GitLabRecceCloudClient
9
+
10
+ __all__ = [
11
+ "BaseRecceCloudClient",
12
+ "RecceCloudClient",
13
+ "RecceCloudException",
14
+ "create_platform_client",
15
+ "GitHubRecceCloudClient",
16
+ "GitLabRecceCloudClient",
17
+ ]
@@ -0,0 +1,132 @@
1
+ """
2
+ Base API client for Recce Cloud.
3
+ """
4
+
5
+ import os
6
+ from abc import ABC, abstractmethod
7
+ from typing import Dict, Optional
8
+
9
+ import requests
10
+
11
+ from recce_cloud.api.exceptions import RecceCloudException
12
+
13
+
14
+ class BaseRecceCloudClient(ABC):
15
+ """Abstract base class for platform-specific Recce Cloud API clients."""
16
+
17
+ def __init__(self, token: str, api_host: Optional[str] = None):
18
+ """
19
+ Initialize the API client.
20
+
21
+ Args:
22
+ token: Authentication token (GITHUB_TOKEN, CI_JOB_TOKEN, or RECCE_API_TOKEN)
23
+ api_host: Recce Cloud API host (defaults to RECCE_CLOUD_API_HOST or https://cloud.datarecce.io)
24
+ """
25
+ self.token = token
26
+ self.api_host = api_host or os.getenv("RECCE_CLOUD_API_HOST", "https://cloud.datarecce.io")
27
+
28
+ def _make_request(self, method: str, url: str, **kwargs) -> Dict:
29
+ """
30
+ Make an HTTP request to Recce Cloud API.
31
+
32
+ Args:
33
+ method: HTTP method (GET, POST, PUT, etc.)
34
+ url: Full URL for the request
35
+ **kwargs: Additional arguments passed to requests
36
+
37
+ Returns:
38
+ Response JSON as dictionary
39
+
40
+ Raises:
41
+ RecceCloudException: If the request fails
42
+ """
43
+ headers = kwargs.pop("headers", {})
44
+ headers.update(
45
+ {
46
+ "Authorization": f"Bearer {self.token}",
47
+ "Content-Type": "application/json",
48
+ }
49
+ )
50
+
51
+ try:
52
+ response = requests.request(method, url, headers=headers, **kwargs)
53
+ response.raise_for_status()
54
+
55
+ # Handle empty responses (e.g., 204 No Content)
56
+ if response.status_code == 204 or not response.content:
57
+ return {}
58
+
59
+ return response.json()
60
+ except requests.exceptions.HTTPError as e:
61
+ reason = str(e)
62
+ if e.response is not None:
63
+ try:
64
+ error_detail = e.response.json()
65
+ reason = error_detail.get("message", str(e))
66
+ except Exception:
67
+ reason = e.response.text or str(e)
68
+ raise RecceCloudException(reason=reason, status_code=e.response.status_code if e.response else None)
69
+ except requests.exceptions.RequestException as e:
70
+ raise RecceCloudException(reason=str(e))
71
+
72
+ @abstractmethod
73
+ def touch_recce_session(
74
+ self,
75
+ branch: str,
76
+ adapter_type: str,
77
+ cr_number: Optional[int] = None,
78
+ commit_sha: Optional[str] = None,
79
+ session_type: Optional[str] = None,
80
+ ) -> Dict:
81
+ """
82
+ Create or touch a Recce session.
83
+
84
+ Args:
85
+ branch: Branch name
86
+ adapter_type: DBT adapter type (e.g., 'postgres', 'snowflake', 'bigquery')
87
+ cr_number: Change request number (PR/MR number) for CR sessions
88
+ commit_sha: Commit SHA (GitLab requires this)
89
+ session_type: Session type ("cr", "prod", "dev") - determines if cr_number is used
90
+
91
+ Returns:
92
+ Dictionary containing:
93
+ - session_id: Session ID
94
+ - manifest_upload_url: Presigned URL for manifest.json upload
95
+ - catalog_upload_url: Presigned URL for catalog.json upload
96
+ """
97
+ pass
98
+
99
+ @abstractmethod
100
+ def upload_completed(self, session_id: str, commit_sha: Optional[str] = None) -> Dict:
101
+ """
102
+ Notify Recce Cloud that upload is complete.
103
+
104
+ Args:
105
+ session_id: Session ID from touch_recce_session
106
+ commit_sha: Commit SHA (GitLab requires this)
107
+
108
+ Returns:
109
+ Empty dictionary or acknowledgement
110
+ """
111
+ pass
112
+
113
+ @abstractmethod
114
+ def get_session_download_urls(
115
+ self,
116
+ cr_number: Optional[int] = None,
117
+ session_type: Optional[str] = None,
118
+ ) -> Dict:
119
+ """
120
+ Get download URLs for artifacts from a session.
121
+
122
+ Args:
123
+ cr_number: Change request number (PR/MR number) for CR sessions
124
+ session_type: Session type ("cr", "prod", "dev")
125
+
126
+ Returns:
127
+ Dictionary containing:
128
+ - session_id: Session ID
129
+ - manifest_url: Presigned URL for manifest.json download
130
+ - catalog_url: Presigned URL for catalog.json download
131
+ """
132
+ pass
@@ -0,0 +1,186 @@
1
+ """
2
+ Recce Cloud API client for lightweight operations.
3
+
4
+ Simplified version of recce.util.recce_cloud.RecceCloud with only
5
+ the methods needed for upload-session functionality.
6
+ """
7
+
8
+ import os
9
+
10
+ import requests
11
+
12
+ from recce_cloud.api.exceptions import RecceCloudException
13
+
14
+ RECCE_CLOUD_API_HOST = os.environ.get("RECCE_CLOUD_API_HOST", "https://cloud.datarecce.io")
15
+
16
+ DOCKER_INTERNAL_URL_PREFIX = "http://host.docker.internal"
17
+ LOCALHOST_URL_PREFIX = "http://localhost"
18
+
19
+
20
+ class RecceCloudClient:
21
+ """
22
+ Lightweight Recce Cloud API client.
23
+
24
+ Supports authentication with Recce Cloud API token (starts with "rct-").
25
+ """
26
+
27
+ def __init__(self, token: str):
28
+ if token is None:
29
+ raise ValueError("Token cannot be None.")
30
+ self.token = token
31
+ self.base_url_v2 = f"{RECCE_CLOUD_API_HOST}/api/v2"
32
+
33
+ def _request(self, method: str, url: str, headers: dict = None, **kwargs):
34
+ """Make authenticated HTTP request to Recce Cloud API."""
35
+ headers = {
36
+ **(headers or {}),
37
+ "Authorization": f"Bearer {self.token}",
38
+ }
39
+ return requests.request(method, url, headers=headers, **kwargs)
40
+
41
+ def _replace_localhost_with_docker_internal(self, url: str) -> str:
42
+ """Convert localhost URLs to docker internal URLs if running in Docker."""
43
+ if url is None:
44
+ return None
45
+ if (
46
+ os.environ.get("RECCE_SHARE_INSTANCE_ENV") == "docker"
47
+ or os.environ.get("RECCE_TASK_INSTANCE_ENV") == "docker"
48
+ or os.environ.get("RECCE_INSTANCE_ENV") == "docker"
49
+ ):
50
+ # For local development, convert the presigned URL from localhost to host.docker.internal
51
+ if url.startswith(LOCALHOST_URL_PREFIX):
52
+ return url.replace(LOCALHOST_URL_PREFIX, DOCKER_INTERNAL_URL_PREFIX)
53
+ return url
54
+
55
+ def get_session(self, session_id: str) -> dict:
56
+ """
57
+ Get session information from Recce Cloud.
58
+
59
+ Args:
60
+ session_id: The session ID to retrieve
61
+
62
+ Returns:
63
+ dict containing session information with keys:
64
+ - org_id: Organization ID
65
+ - project_id: Project ID
66
+ - ... other session fields
67
+
68
+ Raises:
69
+ RecceCloudException: If the request fails
70
+ """
71
+ api_url = f"{self.base_url_v2}/sessions/{session_id}"
72
+ response = self._request("GET", api_url)
73
+ if response.status_code == 403:
74
+ return {"status": "error", "message": response.json().get("detail")}
75
+ if response.status_code != 200:
76
+ raise RecceCloudException(
77
+ reason=response.text,
78
+ status_code=response.status_code,
79
+ )
80
+ data = response.json()
81
+ if data["success"] is not True:
82
+ raise RecceCloudException(
83
+ reason=data.get("message", "Unknown error"),
84
+ status_code=response.status_code,
85
+ )
86
+ return data["session"]
87
+
88
+ def get_upload_urls_by_session_id(self, org_id: str, project_id: str, session_id: str) -> dict:
89
+ """
90
+ Get presigned S3 upload URLs for a session.
91
+
92
+ Args:
93
+ org_id: Organization ID
94
+ project_id: Project ID
95
+ session_id: Session ID
96
+
97
+ Returns:
98
+ dict with keys:
99
+ - manifest_url: Presigned URL for uploading manifest.json
100
+ - catalog_url: Presigned URL for uploading catalog.json
101
+
102
+ Raises:
103
+ RecceCloudException: If the request fails
104
+ """
105
+ api_url = f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/upload-url"
106
+ response = self._request("GET", api_url)
107
+ if response.status_code != 200:
108
+ raise RecceCloudException(
109
+ reason=response.text,
110
+ status_code=response.status_code,
111
+ )
112
+ data = response.json()
113
+ if data["presigned_urls"] is None:
114
+ raise RecceCloudException(
115
+ reason="No presigned URLs returned from the server.",
116
+ status_code=404,
117
+ )
118
+
119
+ presigned_urls = data["presigned_urls"]
120
+ for key, url in presigned_urls.items():
121
+ presigned_urls[key] = self._replace_localhost_with_docker_internal(url)
122
+ return presigned_urls
123
+
124
+ def get_download_urls_by_session_id(self, org_id: str, project_id: str, session_id: str) -> dict:
125
+ """
126
+ Get presigned S3 download URLs for a session.
127
+
128
+ Args:
129
+ org_id: Organization ID
130
+ project_id: Project ID
131
+ session_id: Session ID
132
+
133
+ Returns:
134
+ dict with keys:
135
+ - manifest_url: Presigned URL for downloading manifest.json
136
+ - catalog_url: Presigned URL for downloading catalog.json
137
+
138
+ Raises:
139
+ RecceCloudException: If the request fails
140
+ """
141
+ api_url = f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/download-url"
142
+ response = self._request("GET", api_url)
143
+ if response.status_code != 200:
144
+ raise RecceCloudException(
145
+ reason=response.text,
146
+ status_code=response.status_code,
147
+ )
148
+ data = response.json()
149
+ if data["presigned_urls"] is None:
150
+ raise RecceCloudException(
151
+ reason="No presigned URLs returned from the server.",
152
+ status_code=404,
153
+ )
154
+
155
+ presigned_urls = data["presigned_urls"]
156
+ for key, url in presigned_urls.items():
157
+ presigned_urls[key] = self._replace_localhost_with_docker_internal(url)
158
+ return presigned_urls
159
+
160
+ def update_session(self, org_id: str, project_id: str, session_id: str, adapter_type: str) -> dict:
161
+ """
162
+ Update session metadata with adapter type.
163
+
164
+ Args:
165
+ org_id: Organization ID
166
+ project_id: Project ID
167
+ session_id: Session ID
168
+ adapter_type: dbt adapter type (e.g., "postgres", "snowflake", "bigquery")
169
+
170
+ Returns:
171
+ dict containing updated session information
172
+
173
+ Raises:
174
+ RecceCloudException: If the request fails
175
+ """
176
+ api_url = f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}"
177
+ data = {"adapter_type": adapter_type}
178
+ response = self._request("PATCH", api_url, json=data)
179
+ if response.status_code == 403:
180
+ return {"status": "error", "message": response.json().get("detail")}
181
+ if response.status_code != 200:
182
+ raise RecceCloudException(
183
+ reason=response.text,
184
+ status_code=response.status_code,
185
+ )
186
+ return response.json()
@@ -0,0 +1,26 @@
1
+ """
2
+ Exceptions for Recce Cloud API.
3
+ """
4
+
5
+ import json
6
+
7
+
8
+ class RecceCloudException(Exception):
9
+ """Exception raised when Recce Cloud API returns an error."""
10
+
11
+ def __init__(self, reason: str, status_code: int = None):
12
+ """
13
+ Initialize exception.
14
+
15
+ Args:
16
+ reason: Error reason/message
17
+ status_code: HTTP status code (optional)
18
+ """
19
+ try:
20
+ reason = json.loads(reason).get("detail", reason)
21
+ except (json.JSONDecodeError, AttributeError):
22
+ pass
23
+
24
+ super().__init__(reason)
25
+ self.reason = reason
26
+ self.status_code = status_code
@@ -0,0 +1,63 @@
1
+ """
2
+ Factory for creating platform-specific API clients.
3
+ """
4
+
5
+ import os
6
+ from typing import Optional
7
+
8
+ from recce_cloud.api.github import GitHubRecceCloudClient
9
+ from recce_cloud.api.gitlab import GitLabRecceCloudClient
10
+ from recce_cloud.ci_providers import CIDetector
11
+ from recce_cloud.ci_providers.base import CIInfo
12
+
13
+
14
+ def create_platform_client(
15
+ token: str,
16
+ ci_info: Optional[CIInfo] = None,
17
+ api_host: Optional[str] = None,
18
+ ):
19
+ """
20
+ Create a platform-specific Recce Cloud API client based on CI environment.
21
+
22
+ Args:
23
+ token: Authentication token (GITHUB_TOKEN, CI_JOB_TOKEN, or RECCE_API_TOKEN)
24
+ ci_info: CI information (auto-detected if not provided)
25
+ api_host: Recce Cloud API host (optional)
26
+
27
+ Returns:
28
+ GitHubRecceCloudClient or GitLabRecceCloudClient
29
+
30
+ Raises:
31
+ ValueError: If platform is not supported or required information is missing
32
+ """
33
+ # Auto-detect CI info if not provided
34
+ if ci_info is None:
35
+ ci_info = CIDetector.detect()
36
+
37
+ if ci_info.platform == "github-actions":
38
+ repository = ci_info.repository or os.getenv("GITHUB_REPOSITORY")
39
+ if not repository:
40
+ raise ValueError("GitHub repository information is required but not detected")
41
+
42
+ return GitHubRecceCloudClient(token=token, repository=repository, api_host=api_host)
43
+
44
+ elif ci_info.platform == "gitlab-ci":
45
+ project_path = ci_info.repository or os.getenv("CI_PROJECT_PATH")
46
+ repository_url = os.getenv("CI_PROJECT_URL")
47
+
48
+ if not project_path:
49
+ raise ValueError("GitLab project path is required but not detected")
50
+ if not repository_url:
51
+ raise ValueError("GitLab project URL is required but not detected")
52
+
53
+ return GitLabRecceCloudClient(
54
+ token=token,
55
+ project_path=project_path,
56
+ repository_url=repository_url,
57
+ api_host=api_host,
58
+ )
59
+
60
+ else:
61
+ raise ValueError(
62
+ f"Unsupported platform: {ci_info.platform}. " "Only GitHub Actions and GitLab CI are supported."
63
+ )
@@ -0,0 +1,106 @@
1
+ """
2
+ GitHub-specific API client for Recce Cloud.
3
+ """
4
+
5
+ from typing import Dict, Optional
6
+
7
+ from recce_cloud.api.base import BaseRecceCloudClient
8
+
9
+
10
+ class GitHubRecceCloudClient(BaseRecceCloudClient):
11
+ """GitHub Actions-specific implementation of Recce Cloud API client."""
12
+
13
+ def __init__(self, token: str, repository: str, api_host: Optional[str] = None):
14
+ """
15
+ Initialize GitHub API client.
16
+
17
+ Args:
18
+ token: GitHub token (GITHUB_TOKEN or RECCE_API_TOKEN)
19
+ repository: Repository in format "owner/repo"
20
+ api_host: Recce Cloud API host
21
+ """
22
+ super().__init__(token, api_host)
23
+ self.repository = repository
24
+
25
+ def touch_recce_session(
26
+ self,
27
+ branch: str,
28
+ adapter_type: str,
29
+ cr_number: Optional[int] = None,
30
+ commit_sha: Optional[str] = None,
31
+ session_type: Optional[str] = None,
32
+ ) -> Dict:
33
+ """
34
+ Create or touch a Recce session for GitHub Actions.
35
+
36
+ Args:
37
+ branch: Branch name
38
+ adapter_type: DBT adapter type
39
+ cr_number: PR number for pull request sessions (None for prod sessions)
40
+ commit_sha: Not used for GitHub (optional for compatibility)
41
+ session_type: Session type ("cr", "prod", "dev") - determines if pr_number is passed
42
+
43
+ Returns:
44
+ Dictionary containing session_id, manifest_upload_url, catalog_upload_url
45
+ """
46
+ url = f"{self.api_host}/api/v2/github/{self.repository}/touch-recce-session"
47
+
48
+ payload = {
49
+ "branch": branch,
50
+ "adapter_type": adapter_type,
51
+ }
52
+
53
+ # Only include pr_number for "cr" type sessions
54
+ # For "prod" type, omit pr_number even if cr_number is detected
55
+ if session_type == "cr" and cr_number is not None:
56
+ payload["pr_number"] = cr_number
57
+
58
+ return self._make_request("POST", url, json=payload)
59
+
60
+ def upload_completed(self, session_id: str, commit_sha: Optional[str] = None) -> Dict:
61
+ """
62
+ Notify Recce Cloud that upload is complete for GitHub.
63
+
64
+ Args:
65
+ session_id: Session ID from touch_recce_session
66
+ commit_sha: Not used for GitHub (optional for compatibility)
67
+
68
+ Returns:
69
+ Empty dictionary or acknowledgement
70
+ """
71
+ url = f"{self.api_host}/api/v2/github/{self.repository}/upload-completed"
72
+
73
+ payload = {
74
+ "session_id": session_id,
75
+ }
76
+
77
+ return self._make_request("POST", url, json=payload)
78
+
79
+ def get_session_download_urls(
80
+ self,
81
+ cr_number: Optional[int] = None,
82
+ session_type: Optional[str] = None,
83
+ ) -> Dict:
84
+ """
85
+ Get download URLs for artifacts from a GitHub session.
86
+
87
+ Args:
88
+ cr_number: PR number for pull request sessions
89
+ session_type: Session type ("cr", "prod", "dev")
90
+
91
+ Returns:
92
+ Dictionary containing session_id, manifest_url, catalog_url
93
+ """
94
+ url = f"{self.api_host}/api/v2/github/{self.repository}/session-download-url"
95
+
96
+ # Build query parameters
97
+ params = {}
98
+
99
+ # For prod session, set base=true
100
+ if session_type == "prod":
101
+ params["base"] = "true"
102
+ # For CR session, include pr_number
103
+ elif session_type == "cr" and cr_number is not None:
104
+ params["pr_number"] = cr_number
105
+
106
+ return self._make_request("GET", url, params=params)
@@ -0,0 +1,111 @@
1
+ """
2
+ GitLab-specific API client for Recce Cloud.
3
+ """
4
+
5
+ from typing import Dict, Optional
6
+
7
+ from recce_cloud.api.base import BaseRecceCloudClient
8
+
9
+
10
+ class GitLabRecceCloudClient(BaseRecceCloudClient):
11
+ """GitLab CI-specific implementation of Recce Cloud API client."""
12
+
13
+ def __init__(self, token: str, project_path: str, repository_url: str, api_host: Optional[str] = None):
14
+ """
15
+ Initialize GitLab API client.
16
+
17
+ Args:
18
+ token: GitLab token (CI_JOB_TOKEN or RECCE_API_TOKEN)
19
+ project_path: Project path in format "group/project"
20
+ repository_url: Full repository URL (e.g., https://gitlab.com/group/project)
21
+ api_host: Recce Cloud API host
22
+ """
23
+ super().__init__(token, api_host)
24
+ self.project_path = project_path
25
+ self.repository_url = repository_url
26
+
27
+ def touch_recce_session(
28
+ self,
29
+ branch: str,
30
+ adapter_type: str,
31
+ cr_number: Optional[int] = None,
32
+ commit_sha: Optional[str] = None,
33
+ session_type: Optional[str] = None,
34
+ ) -> Dict:
35
+ """
36
+ Create or touch a Recce session for GitLab CI.
37
+
38
+ Args:
39
+ branch: Branch name
40
+ adapter_type: DBT adapter type
41
+ cr_number: MR IID for merge request sessions (None for prod sessions)
42
+ commit_sha: Commit SHA (required for GitLab)
43
+ session_type: Session type ("cr", "prod", "dev") - determines if mr_iid is passed
44
+
45
+ Returns:
46
+ Dictionary containing session_id, manifest_upload_url, catalog_upload_url
47
+ """
48
+ url = f"{self.api_host}/api/v2/gitlab/{self.project_path}/touch-recce-session"
49
+
50
+ payload = {
51
+ "branch": branch,
52
+ "adapter_type": adapter_type,
53
+ "commit_sha": commit_sha,
54
+ "repository_url": self.repository_url,
55
+ }
56
+
57
+ # Only include mr_iid for "cr" type sessions
58
+ # For "prod" type, omit mr_iid even if cr_number is detected
59
+ if session_type == "cr" and cr_number is not None:
60
+ payload["mr_iid"] = cr_number
61
+
62
+ return self._make_request("POST", url, json=payload)
63
+
64
+ def upload_completed(self, session_id: str, commit_sha: Optional[str] = None) -> Dict:
65
+ """
66
+ Notify Recce Cloud that upload is complete for GitLab.
67
+
68
+ Args:
69
+ session_id: Session ID from touch_recce_session
70
+ commit_sha: Commit SHA (required for GitLab)
71
+
72
+ Returns:
73
+ Empty dictionary or acknowledgement
74
+ """
75
+ url = f"{self.api_host}/api/v2/gitlab/{self.project_path}/upload-completed"
76
+
77
+ payload = {
78
+ "session_id": session_id,
79
+ "commit_sha": commit_sha,
80
+ }
81
+
82
+ return self._make_request("POST", url, json=payload)
83
+
84
+ def get_session_download_urls(
85
+ self,
86
+ cr_number: Optional[int] = None,
87
+ session_type: Optional[str] = None,
88
+ ) -> Dict:
89
+ """
90
+ Get download URLs for artifacts from a GitLab session.
91
+
92
+ Args:
93
+ cr_number: MR IID for merge request sessions
94
+ session_type: Session type ("cr", "prod", "dev")
95
+
96
+ Returns:
97
+ Dictionary containing session_id, manifest_url, catalog_url
98
+ """
99
+ url = f"{self.api_host}/api/v2/gitlab/{self.project_path}/session-download-url"
100
+
101
+ # Build query parameters
102
+ params = {}
103
+
104
+ # For prod session, set base=true
105
+ if session_type == "prod":
106
+ params["base"] = "true"
107
+ # For CR session, include mr_iid
108
+ elif session_type == "cr" and cr_number is not None:
109
+ params["mr_iid"] = cr_number
110
+
111
+ return self._make_request("GET", url, params=params)