@datarecce/ui 0.1.41 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -133
- package/dist/AuthModal-C8LetZNB.js +23 -0
- package/dist/AuthModal-C8LetZNB.js.map +1 -0
- package/dist/LineageCanvas-CR38SDYr.d.ts +41 -0
- package/dist/LineageCanvas-CR38SDYr.d.ts.map +1 -0
- package/dist/ResultErrorFallback-C7c-TN1p.js +3 -0
- package/dist/ResultErrorFallback-C7c-TN1p.js.map +1 -0
- package/dist/RouteConfigContext-z8YNimdP.d.ts +172 -0
- package/dist/RouteConfigContext-z8YNimdP.d.ts.map +1 -0
- package/dist/RunProgress-DyFIALbI.d.ts +429 -0
- package/dist/RunProgress-DyFIALbI.d.ts.map +1 -0
- package/dist/ScreenshotDataGrid-BfxYUThx.d.ts +64 -0
- package/dist/ScreenshotDataGrid-BfxYUThx.d.ts.map +1 -0
- package/dist/SplitPane-B-BLxZaQ.d.ts +1427 -0
- package/dist/SplitPane-B-BLxZaQ.d.ts.map +1 -0
- package/dist/advanced.d.ts +18 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +3 -0
- package/dist/advanced.js.map +1 -0
- package/dist/api-ZZ4cc9b9.d.ts +255 -0
- package/dist/api-ZZ4cc9b9.d.ts.map +1 -0
- package/dist/api-_i6BZPkM.js +3 -0
- package/dist/api-_i6BZPkM.js.map +1 -0
- package/dist/api.d.ts +3 -2
- package/dist/api.js +2 -100
- package/dist/colors--47Kkns4.js +3 -0
- package/dist/colors--47Kkns4.js.map +1 -0
- package/dist/colors-vY9Yzui0.d.ts +255 -0
- package/dist/colors-vY9Yzui0.d.ts.map +1 -0
- package/dist/components-run.d.ts +8 -0
- package/dist/components-run.js +2 -0
- package/dist/components.d.ts +22 -2
- package/dist/components.js +2 -86
- package/dist/const-DbXBkrxT.js +3 -0
- package/dist/const-DbXBkrxT.js.map +1 -0
- package/dist/constants-DD5vJv2q.js +3 -0
- package/dist/constants-DD5vJv2q.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +2 -0
- package/dist/contexts.d.ts +7 -0
- package/dist/contexts.js +2 -0
- package/dist/flag-CiR2E5oz.d.ts +898 -0
- package/dist/flag-CiR2E5oz.d.ts.map +1 -0
- package/dist/flag-koeDAqr3.js +3 -0
- package/dist/flag-koeDAqr3.js.map +1 -0
- package/dist/hooks.d.ts +15 -2
- package/dist/hooks.js +2 -43
- package/dist/index-BFkbe0aF.d.ts +698 -0
- package/dist/index-BFkbe0aF.d.ts.map +1 -0
- package/dist/index-Ba3hp2Ng.d.ts +471 -0
- package/dist/index-Ba3hp2Ng.d.ts.map +1 -0
- package/dist/index-C_kD4ZQ3.d.ts +1079 -0
- package/dist/index-C_kD4ZQ3.d.ts.map +1 -0
- package/dist/index-CiPcALu4.d.ts +146 -0
- package/dist/index-CiPcALu4.d.ts.map +1 -0
- package/dist/index-CkXLPYZY.d.ts +13 -0
- package/dist/index-CkXLPYZY.d.ts.map +1 -0
- package/dist/index-DTCpHvX_.d.ts +211 -0
- package/dist/index-DTCpHvX_.d.ts.map +1 -0
- package/dist/index-DVoQsx5c.d.ts +349 -0
- package/dist/index-DVoQsx5c.d.ts.map +1 -0
- package/dist/index-DmwYRgDR.d.ts +192 -0
- package/dist/index-DmwYRgDR.d.ts.map +1 -0
- package/dist/index-N8N7XmRj.d.ts +130 -0
- package/dist/index-N8N7XmRj.d.ts.map +1 -0
- package/dist/index-h_fw6R9U.d.ts +1501 -0
- package/dist/index-h_fw6R9U.d.ts.map +1 -0
- package/dist/index-o48TPoFN.d.ts +734 -0
- package/dist/index-o48TPoFN.d.ts.map +1 -0
- package/dist/index.d.ts +24 -2
- package/dist/index.js +2 -198
- package/dist/keepAlive-CEzyrDfg.js +3 -0
- package/dist/keepAlive-CEzyrDfg.js.map +1 -0
- package/dist/lib/api/axiosClient.d.ts +8 -0
- package/dist/lib/api/axiosClient.d.ts.map +1 -0
- package/dist/lib/api/axiosClient.js +3 -0
- package/dist/lib/api/axiosClient.js.map +1 -0
- package/dist/lib/api/track.d.ts +137 -0
- package/dist/lib/api/track.d.ts.map +1 -0
- package/dist/lib/api/track.js +2 -0
- package/dist/lib/api/user.d.ts +16 -0
- package/dist/lib/api/user.d.ts.map +1 -0
- package/dist/lib/api/user.js +2 -0
- package/dist/lib/const.d.ts +8 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/const.js +2 -0
- package/dist/lib/result/ResultErrorFallback.d.ts +8 -0
- package/dist/lib/result/ResultErrorFallback.d.ts.map +1 -0
- package/dist/lib/result/ResultErrorFallback.js +2 -0
- package/dist/primitives-CgGUvwHB.d.ts +914 -0
- package/dist/primitives-CgGUvwHB.d.ts.map +1 -0
- package/dist/primitives.d.ts +12 -0
- package/dist/primitives.js +2 -0
- package/dist/result.d.ts +4 -0
- package/dist/result.js +2 -0
- package/dist/src-BgHSbbHk.js +67 -0
- package/dist/src-BgHSbbHk.js.map +1 -0
- package/dist/styles.css +478 -4
- package/dist/theme-CeWzymUn.js +64 -0
- package/dist/theme-CeWzymUn.js.map +1 -0
- package/dist/theme.d.ts +3 -2
- package/dist/theme.js +2 -9
- package/dist/track-9ZQpBlUK.js +3 -0
- package/dist/track-9ZQpBlUK.js.map +1 -0
- package/dist/types-CFbNxrx2.d.ts +171 -0
- package/dist/types-CFbNxrx2.d.ts.map +1 -0
- package/dist/types-CZre3j02.d.ts +231 -0
- package/dist/types-CZre3j02.d.ts.map +1 -0
- package/dist/types.d.ts +14 -2
- package/dist/types.js +3 -9
- package/dist/types.js.map +1 -0
- package/dist/useRecceServerFlag-Bg5R67J4.js +3 -0
- package/dist/useRecceServerFlag-Bg5R67J4.js.map +1 -0
- package/dist/useThemeColors--prVbMmM.js +3 -0
- package/dist/useThemeColors--prVbMmM.js.map +1 -0
- package/dist/useThemeColors-DHEroo8f.d.ts +104 -0
- package/dist/useThemeColors-DHEroo8f.d.ts.map +1 -0
- package/dist/user-DMT7E0fc.js +3 -0
- package/dist/user-DMT7E0fc.js.map +1 -0
- package/dist/utils-CW2skXm_.js +3 -0
- package/dist/utils-CW2skXm_.js.map +1 -0
- package/dist/utils-CXWhfyxC.js +5 -0
- package/dist/utils-CXWhfyxC.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +2 -0
- package/package.json +115 -107
- package/LICENSE +0 -201
- package/dist/RecceCheckContext-BJprb2xR.js +0 -7968
- package/dist/RecceCheckContext-BJprb2xR.js.map +0 -1
- package/dist/RecceCheckContext-DPnWB_aU.css +0 -215
- package/dist/RecceCheckContext-DPnWB_aU.css.map +0 -1
- package/dist/RecceCheckContext-DbZ7BdRy.mjs +0 -7426
- package/dist/RecceCheckContext-DbZ7BdRy.mjs.map +0 -1
- package/dist/RecceCheckContext-DyxOeUsX.css +0 -215
- package/dist/RecceCheckContext-DyxOeUsX.css.map +0 -1
- package/dist/api.d.mts +0 -3
- package/dist/api.js.map +0 -1
- package/dist/api.mjs +0 -46
- package/dist/api.mjs.map +0 -1
- package/dist/components-BeAjVBV3.css +0 -70
- package/dist/components-BeAjVBV3.css.map +0 -1
- package/dist/components-DfXnN1Hx.js +0 -14689
- package/dist/components-DfXnN1Hx.js.map +0 -1
- package/dist/components-iUxcqtUB.css +0 -70
- package/dist/components-iUxcqtUB.css.map +0 -1
- package/dist/components-jh6r4tQn.mjs +0 -12348
- package/dist/components-jh6r4tQn.mjs.map +0 -1
- package/dist/components.d.mts +0 -3
- package/dist/components.mjs +0 -9
- package/dist/const-CaIm1Z8g.mjs +0 -12
- package/dist/const-CaIm1Z8g.mjs.map +0 -1
- package/dist/const-CvdZO0FN.js +0 -24
- package/dist/const-CvdZO0FN.js.map +0 -1
- package/dist/hooks-cQsBXBd1.js +0 -40
- package/dist/hooks-cQsBXBd1.js.map +0 -1
- package/dist/hooks-eaHm_yEp.mjs +0 -33
- package/dist/hooks-eaHm_yEp.mjs.map +0 -1
- package/dist/hooks.d.mts +0 -3
- package/dist/hooks.mjs +0 -8
- package/dist/html2canvas-pro.esm-CsuSOHXp.js +0 -7250
- package/dist/html2canvas-pro.esm-CsuSOHXp.js.map +0 -1
- package/dist/html2canvas-pro.esm-E7kpobrC.mjs +0 -7249
- package/dist/html2canvas-pro.esm-E7kpobrC.mjs.map +0 -1
- package/dist/index-B5bpmv0i.d.mts +0 -2172
- package/dist/index-B5bpmv0i.d.mts.map +0 -1
- package/dist/index-B9lSPJTi.d.ts +0 -2170
- package/dist/index-B9lSPJTi.d.ts.map +0 -1
- package/dist/index.d.mts +0 -3
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -20
- package/dist/index.mjs.map +0 -1
- package/dist/mui-theme-CUhybmBq.mjs +0 -696
- package/dist/mui-theme-CUhybmBq.mjs.map +0 -1
- package/dist/mui-theme-iBHkjXJq.js +0 -732
- package/dist/mui-theme-iBHkjXJq.js.map +0 -1
- package/dist/state-CTITyT0R.js +0 -795
- package/dist/state-CTITyT0R.js.map +0 -1
- package/dist/state-Sc2b4jri.mjs +0 -382
- package/dist/state-Sc2b4jri.mjs.map +0 -1
- package/dist/theme.d.mts +0 -3
- package/dist/theme.mjs +0 -4
- package/dist/tooltipMessage-BC5W7H3X.js +0 -13
- package/dist/tooltipMessage-BC5W7H3X.js.map +0 -1
- package/dist/tooltipMessage-B_xMIKWL.mjs +0 -7
- package/dist/tooltipMessage-B_xMIKWL.mjs.map +0 -1
- package/dist/types.d.mts +0 -3
- package/dist/types.mjs +0 -6
- package/dist/urls-BQW5wjg-.js +0 -13
- package/dist/urls-BQW5wjg-.js.map +0 -1
- package/dist/urls-DT7FVEcS.mjs +0 -7
- package/dist/urls-DT7FVEcS.mjs.map +0 -1
- package/dist/version-B9s8yne-.js +0 -300
- package/dist/version-B9s8yne-.js.map +0 -1
- package/dist/version-DP1kU_7v.mjs +0 -162
- package/dist/version-DP1kU_7v.mjs.map +0 -1
- package/recce-source/.editorconfig +0 -26
- package/recce-source/.flake8 +0 -37
- package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +0 -67
- package/recce-source/.github/ISSUE_TEMPLATE/custom.md +0 -10
- package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
- package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +0 -21
- package/recce-source/.github/copilot-instructions.md +0 -331
- package/recce-source/.github/instructions/backend-instructions.md +0 -541
- package/recce-source/.github/instructions/frontend-instructions.md +0 -317
- package/recce-source/.github/workflows/build-statics.yaml +0 -72
- package/recce-source/.github/workflows/bump.yaml +0 -48
- package/recce-source/.github/workflows/integration-tests-cloud.yaml +0 -92
- package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +0 -33
- package/recce-source/.github/workflows/integration-tests.yaml +0 -52
- package/recce-source/.github/workflows/nightly.yaml +0 -246
- package/recce-source/.github/workflows/release.yaml +0 -196
- package/recce-source/.github/workflows/tests-js.yaml +0 -58
- package/recce-source/.github/workflows/tests-python.yaml +0 -128
- package/recce-source/.pre-commit-config.yaml +0 -26
- package/recce-source/CLAUDE.md +0 -483
- package/recce-source/CODE_OF_CONDUCT.md +0 -128
- package/recce-source/CONTRIBUTING.md +0 -107
- package/recce-source/LICENSE +0 -201
- package/recce-source/Makefile +0 -126
- package/recce-source/README.md +0 -182
- package/recce-source/RECCE_CLOUD.md +0 -81
- package/recce-source/SECURITY.md +0 -25
- package/recce-source/docs/PACKAGING.md +0 -340
- package/recce-source/docs/README.md +0 -1
- package/recce-source/docs/plans/2024-12-31-csv-download-design.md +0 -121
- package/recce-source/docs/plans/2024-12-31-csv-download-implementation.md +0 -930
- package/recce-source/integration_tests/dbt/dbt_project.yml +0 -26
- package/recce-source/integration_tests/dbt/models/customers.sql +0 -69
- package/recce-source/integration_tests/dbt/models/docs.md +0 -14
- package/recce-source/integration_tests/dbt/models/orders.sql +0 -56
- package/recce-source/integration_tests/dbt/models/schema.yml +0 -82
- package/recce-source/integration_tests/dbt/models/staging/schema.yml +0 -31
- package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +0 -22
- package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +0 -23
- package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +0 -25
- package/recce-source/integration_tests/dbt/packages.yml +0 -7
- package/recce-source/integration_tests/dbt/profiles.yml +0 -8
- package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +0 -101
- package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +0 -100
- package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +0 -114
- package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +0 -5
- package/recce-source/integration_tests/dbt/smoke_test.sh +0 -72
- package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +0 -71
- package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +0 -9
- package/recce-source/integration_tests/sqlmesh/audits/items.sql +0 -7
- package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +0 -7
- package/recce-source/integration_tests/sqlmesh/config.py +0 -171
- package/recce-source/integration_tests/sqlmesh/helper.py +0 -20
- package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/macros/macros.py +0 -8
- package/recce-source/integration_tests/sqlmesh/macros/macros.sql +0 -8
- package/recce-source/integration_tests/sqlmesh/macros/utils.py +0 -11
- package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +0 -25
- package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +0 -41
- package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +0 -60
- package/recce-source/integration_tests/sqlmesh/models/customers.sql +0 -32
- package/recce-source/integration_tests/sqlmesh/models/items.py +0 -95
- package/recce-source/integration_tests/sqlmesh/models/marketing.sql +0 -15
- package/recce-source/integration_tests/sqlmesh/models/order_items.py +0 -95
- package/recce-source/integration_tests/sqlmesh/models/orders.py +0 -70
- package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +0 -62
- package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +0 -23
- package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +0 -29
- package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +0 -10
- package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +0 -29
- package/recce-source/integration_tests/sqlmesh/models/waiters.py +0 -62
- package/recce-source/integration_tests/sqlmesh/prep_env.sh +0 -16
- package/recce-source/integration_tests/sqlmesh/schema.yaml +0 -5
- package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +0 -11
- package/recce-source/integration_tests/sqlmesh/test_server.sh +0 -29
- package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +0 -63
- package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +0 -72
- package/recce-source/js/.editorconfig +0 -27
- package/recce-source/js/.env.development +0 -5
- package/recce-source/js/.husky/pre-commit +0 -29
- package/recce-source/js/.nvmrc +0 -1
- package/recce-source/js/README.md +0 -39
- package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +0 -65
- package/recce-source/js/app/(mainComponents)/NavBar.tsx +0 -228
- package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +0 -107
- package/recce-source/js/app/(mainComponents)/TopBar.tsx +0 -252
- package/recce-source/js/app/@lineage/default.tsx +0 -20
- package/recce-source/js/app/@lineage/page.tsx +0 -14
- package/recce-source/js/app/MainLayout.tsx +0 -170
- package/recce-source/js/app/Providers.tsx +0 -49
- package/recce-source/js/app/checks/page.tsx +0 -296
- package/recce-source/js/app/error.tsx +0 -93
- package/recce-source/js/app/favicon.ico +0 -0
- package/recce-source/js/app/global-error.tsx +0 -115
- package/recce-source/js/app/global.css +0 -82
- package/recce-source/js/app/layout.tsx +0 -48
- package/recce-source/js/app/lineage/page.tsx +0 -15
- package/recce-source/js/app/page.tsx +0 -12
- package/recce-source/js/app/query/page.tsx +0 -8
- package/recce-source/js/biome.json +0 -313
- package/recce-source/js/jest.config.js +0 -34
- package/recce-source/js/jest.globals.d.ts +0 -32
- package/recce-source/js/jest.setup.js +0 -91
- package/recce-source/js/next.config.js +0 -16
- package/recce-source/js/package-lock.json +0 -13843
- package/recce-source/js/package.json +0 -123
- package/recce-source/js/pnpm-lock.yaml +0 -9235
- package/recce-source/js/pnpm-workspace.yaml +0 -6
- package/recce-source/js/postcss.config.js +0 -5
- package/recce-source/js/public/auth_callback.html +0 -68
- package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
- package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
- package/recce-source/js/public/imgs/reload-image.svg +0 -4
- package/recce-source/js/public/logo/recce-logo-white.png +0 -0
- package/recce-source/js/src/components/AuthModal/AuthModal.tsx +0 -202
- package/recce-source/js/src/components/app/AvatarDropdown.tsx +0 -159
- package/recce-source/js/src/components/app/EnvInfo.tsx +0 -357
- package/recce-source/js/src/components/app/Filename.tsx +0 -388
- package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +0 -91
- package/recce-source/js/src/components/app/StateExporter.tsx +0 -57
- package/recce-source/js/src/components/app/StateImporter.tsx +0 -198
- package/recce-source/js/src/components/app/StateSharing.tsx +0 -145
- package/recce-source/js/src/components/app/StateSynchronizer.tsx +0 -205
- package/recce-source/js/src/components/charts/HistogramChart.tsx +0 -291
- package/recce-source/js/src/components/charts/SquareIcon.tsx +0 -51
- package/recce-source/js/src/components/charts/TopKSummaryList.tsx +0 -457
- package/recce-source/js/src/components/charts/chartTheme.ts +0 -74
- package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +0 -97
- package/recce-source/js/src/components/check/CheckDescription.tsx +0 -134
- package/recce-source/js/src/components/check/CheckDetail.tsx +0 -797
- package/recce-source/js/src/components/check/CheckEmptyState.tsx +0 -84
- package/recce-source/js/src/components/check/CheckList.tsx +0 -320
- package/recce-source/js/src/components/check/LineageDiffView.tsx +0 -32
- package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +0 -48
- package/recce-source/js/src/components/check/SchemaDiffView.tsx +0 -290
- package/recce-source/js/src/components/check/check.ts +0 -25
- package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +0 -163
- package/recce-source/js/src/components/check/timeline/CommentInput.tsx +0 -84
- package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +0 -468
- package/recce-source/js/src/components/check/timeline/index.ts +0 -12
- package/recce-source/js/src/components/check/utils.ts +0 -12
- package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +0 -333
- package/recce-source/js/src/components/data-grid/agGridStyles.css +0 -55
- package/recce-source/js/src/components/data-grid/agGridTheme.ts +0 -43
- package/recce-source/js/src/components/editor/CodeEditor.tsx +0 -107
- package/recce-source/js/src/components/editor/DiffEditor.tsx +0 -162
- package/recce-source/js/src/components/editor/index.ts +0 -12
- package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +0 -87
- package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +0 -147
- package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +0 -63
- package/recce-source/js/src/components/icons/index.tsx +0 -142
- package/recce-source/js/src/components/lineage/ActionControl.tsx +0 -63
- package/recce-source/js/src/components/lineage/ActionTag.tsx +0 -141
- package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +0 -46
- package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +0 -327
- package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +0 -57
- package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +0 -199
- package/recce-source/js/src/components/lineage/GraphEdge.tsx +0 -59
- package/recce-source/js/src/components/lineage/GraphNode.tsx +0 -555
- package/recce-source/js/src/components/lineage/LineagePage.tsx +0 -10
- package/recce-source/js/src/components/lineage/LineageView.tsx +0 -1384
- package/recce-source/js/src/components/lineage/LineageViewContext.tsx +0 -86
- package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +0 -637
- package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +0 -64
- package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +0 -596
- package/recce-source/js/src/components/lineage/NodeSqlView.tsx +0 -136
- package/recce-source/js/src/components/lineage/NodeTag.tsx +0 -278
- package/recce-source/js/src/components/lineage/NodeView.tsx +0 -642
- package/recce-source/js/src/components/lineage/SandboxView.tsx +0 -436
- package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +0 -105
- package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +0 -52
- package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +0 -152
- package/recce-source/js/src/components/lineage/graph.test.ts +0 -31
- package/recce-source/js/src/components/lineage/graph.ts +0 -58
- package/recce-source/js/src/components/lineage/lineage.test.ts +0 -169
- package/recce-source/js/src/components/lineage/lineage.ts +0 -521
- package/recce-source/js/src/components/lineage/styles.css +0 -42
- package/recce-source/js/src/components/lineage/styles.tsx +0 -165
- package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +0 -352
- package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +0 -108
- package/recce-source/js/src/components/onboarding-guide/Notification.tsx +0 -62
- package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +0 -134
- package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +0 -243
- package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +0 -29
- package/recce-source/js/src/components/query/DiffText.tsx +0 -120
- package/recce-source/js/src/components/query/QueryDiffResultView.tsx +0 -468
- package/recce-source/js/src/components/query/QueryForm.tsx +0 -80
- package/recce-source/js/src/components/query/QueryPage.tsx +0 -282
- package/recce-source/js/src/components/query/QueryResultView.tsx +0 -180
- package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +0 -57
- package/recce-source/js/src/components/query/SqlEditor.tsx +0 -245
- package/recce-source/js/src/components/query/ToggleSwitch.tsx +0 -84
- package/recce-source/js/src/components/query/styles.css +0 -21
- package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +0 -428
- package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +0 -311
- package/recce-source/js/src/components/routing/Navigation.test.tsx +0 -256
- package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +0 -108
- package/recce-source/js/src/components/rowcount/delta.test.ts +0 -51
- package/recce-source/js/src/components/rowcount/delta.ts +0 -16
- package/recce-source/js/src/components/run/RunList.tsx +0 -303
- package/recce-source/js/src/components/run/RunModal.tsx +0 -191
- package/recce-source/js/src/components/run/RunPage.tsx +0 -26
- package/recce-source/js/src/components/run/RunResultPane.tsx +0 -578
- package/recce-source/js/src/components/run/RunStatusAndDate.tsx +0 -106
- package/recce-source/js/src/components/run/RunToolbar.tsx +0 -70
- package/recce-source/js/src/components/run/RunView.tsx +0 -196
- package/recce-source/js/src/components/run/registry.ts +0 -214
- package/recce-source/js/src/components/run/types.ts +0 -14
- package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +0 -169
- package/recce-source/js/src/components/schema/ColumnNameCell.tsx +0 -198
- package/recce-source/js/src/components/schema/SchemaView.tsx +0 -336
- package/recce-source/js/src/components/schema/schemaDiff.ts +0 -32
- package/recce-source/js/src/components/schema/style.css +0 -134
- package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +0 -39
- package/recce-source/js/src/components/shared/HistoryToggle.tsx +0 -35
- package/recce-source/js/src/components/split/Split.tsx +0 -40
- package/recce-source/js/src/components/split/styles.css +0 -24
- package/recce-source/js/src/components/summary/ChangeSummary.tsx +0 -264
- package/recce-source/js/src/components/summary/SchemaSummary.tsx +0 -123
- package/recce-source/js/src/components/summary/SummaryView.tsx +0 -29
- package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +0 -48
- package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +0 -58
- package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +0 -73
- package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +0 -228
- package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +0 -113
- package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +0 -72
- package/recce-source/js/src/components/ui/dataGrid/index.ts +0 -23
- package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +0 -607
- package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +0 -211
- package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +0 -452
- package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +0 -142
- package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +0 -178
- package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +0 -275
- package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +0 -134
- package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +0 -364
- package/recce-source/js/src/components/ui/mui/index.ts +0 -13
- package/recce-source/js/src/components/ui/mui-provider.tsx +0 -67
- package/recce-source/js/src/components/ui/mui-theme.ts +0 -1039
- package/recce-source/js/src/components/ui/mui-utils.ts +0 -113
- package/recce-source/js/src/components/ui/toaster.tsx +0 -288
- package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +0 -216
- package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +0 -246
- package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +0 -81
- package/recce-source/js/src/components/valuediff/shared.ts +0 -33
- package/recce-source/js/src/constants/tooltipMessage.ts +0 -3
- package/recce-source/js/src/constants/urls.ts +0 -1
- package/recce-source/js/src/lib/UrlHash.ts +0 -12
- package/recce-source/js/src/lib/api/adhocQuery.ts +0 -70
- package/recce-source/js/src/lib/api/axiosClient.ts +0 -9
- package/recce-source/js/src/lib/api/cacheKeys.ts +0 -13
- package/recce-source/js/src/lib/api/checkEvents.ts +0 -252
- package/recce-source/js/src/lib/api/checks.ts +0 -129
- package/recce-source/js/src/lib/api/cll.ts +0 -53
- package/recce-source/js/src/lib/api/connectToCloud.ts +0 -13
- package/recce-source/js/src/lib/api/flag.ts +0 -37
- package/recce-source/js/src/lib/api/info.ts +0 -198
- package/recce-source/js/src/lib/api/instanceInfo.ts +0 -25
- package/recce-source/js/src/lib/api/keepAlive.ts +0 -108
- package/recce-source/js/src/lib/api/lineagecheck.ts +0 -35
- package/recce-source/js/src/lib/api/localStorageKeys.ts +0 -7
- package/recce-source/js/src/lib/api/models.ts +0 -59
- package/recce-source/js/src/lib/api/profile.ts +0 -65
- package/recce-source/js/src/lib/api/rowcount.ts +0 -19
- package/recce-source/js/src/lib/api/runs.ts +0 -174
- package/recce-source/js/src/lib/api/schemacheck.ts +0 -31
- package/recce-source/js/src/lib/api/select.ts +0 -25
- package/recce-source/js/src/lib/api/sessionStorageKeys.ts +0 -8
- package/recce-source/js/src/lib/api/state.ts +0 -117
- package/recce-source/js/src/lib/api/track.ts +0 -281
- package/recce-source/js/src/lib/api/types.ts +0 -284
- package/recce-source/js/src/lib/api/user.ts +0 -42
- package/recce-source/js/src/lib/api/valuediff.ts +0 -46
- package/recce-source/js/src/lib/api/version.ts +0 -40
- package/recce-source/js/src/lib/const.ts +0 -9
- package/recce-source/js/src/lib/csv/extractors.test.ts +0 -456
- package/recce-source/js/src/lib/csv/extractors.ts +0 -468
- package/recce-source/js/src/lib/csv/format.test.ts +0 -211
- package/recce-source/js/src/lib/csv/format.ts +0 -44
- package/recce-source/js/src/lib/csv/index.test.ts +0 -155
- package/recce-source/js/src/lib/csv/index.ts +0 -109
- package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +0 -626
- package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +0 -2140
- package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +0 -397
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +0 -132
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +0 -126
- package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +0 -1627
- package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +0 -140
- package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +0 -67
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +0 -142
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +0 -71
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +0 -258
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +0 -153
- package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +0 -951
- package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +0 -221
- package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +0 -395
- package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +0 -184
- package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +0 -884
- package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +0 -113
- package/recce-source/js/src/lib/dataGrid/index.ts +0 -51
- package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +0 -858
- package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +0 -482
- package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +0 -345
- package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +0 -698
- package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +0 -820
- package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +0 -277
- package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +0 -785
- package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +0 -370
- package/recce-source/js/src/lib/dataGrid/shared/index.ts +0 -81
- package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +0 -909
- package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +0 -325
- package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +0 -240
- package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +0 -719
- package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +0 -231
- package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +0 -559
- package/recce-source/js/src/lib/dataGrid/shared/validation.ts +0 -367
- package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +0 -1117
- package/recce-source/js/src/lib/formatSelect.ts +0 -50
- package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +0 -181
- package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +0 -177
- package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +0 -512
- package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +0 -269
- package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +0 -33
- package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +0 -54
- package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +0 -129
- package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +0 -98
- package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +0 -59
- package/recce-source/js/src/lib/hooks/ScreenShot.tsx +0 -399
- package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +0 -211
- package/recce-source/js/src/lib/hooks/useAppRouter.ts +0 -200
- package/recce-source/js/src/lib/hooks/useCSVExport.ts +0 -136
- package/recce-source/js/src/lib/hooks/useCheckEvents.ts +0 -99
- package/recce-source/js/src/lib/hooks/useCheckToast.tsx +0 -14
- package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +0 -27
- package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +0 -102
- package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +0 -130
- package/recce-source/js/src/lib/hooks/useGuideToast.tsx +0 -45
- package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +0 -185
- package/recce-source/js/src/lib/hooks/useModelColumns.tsx +0 -113
- package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +0 -13
- package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +0 -13
- package/recce-source/js/src/lib/hooks/useRun.tsx +0 -89
- package/recce-source/js/src/lib/hooks/useThemeColors.ts +0 -115
- package/recce-source/js/src/lib/mergeKeys.test.ts +0 -89
- package/recce-source/js/src/lib/mergeKeys.ts +0 -86
- package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +0 -9
- package/recce-source/js/src/lib/utils/formatTime.ts +0 -84
- package/recce-source/js/src/lib/utils/urls.ts +0 -16
- package/recce-source/js/src/utils/DropdownValuesInput.tsx +0 -297
- package/recce-source/js/src/utils/formatters.tsx +0 -237
- package/recce-source/js/src/utils/transforms.ts +0 -81
- package/recce-source/js/tsconfig.json +0 -47
- package/recce-source/macros/README.md +0 -8
- package/recce-source/macros/recce_athena.sql +0 -73
- package/recce-source/pyproject.toml +0 -109
- package/recce-source/recce/VERSION +0 -1
- package/recce-source/recce/__init__.py +0 -84
- package/recce-source/recce/adapter/__init__.py +0 -0
- package/recce-source/recce/adapter/base.py +0 -109
- package/recce-source/recce/adapter/dbt_adapter/__init__.py +0 -1699
- package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +0 -42
- package/recce-source/recce/adapter/sqlmesh_adapter.py +0 -141
- package/recce-source/recce/apis/__init__.py +0 -0
- package/recce-source/recce/apis/check_api.py +0 -203
- package/recce-source/recce/apis/check_events_api.py +0 -353
- package/recce-source/recce/apis/check_func.py +0 -130
- package/recce-source/recce/apis/run_api.py +0 -130
- package/recce-source/recce/apis/run_func.py +0 -258
- package/recce-source/recce/artifact.py +0 -266
- package/recce-source/recce/cli.py +0 -1846
- package/recce-source/recce/config.py +0 -127
- package/recce-source/recce/connect_to_cloud.py +0 -138
- package/recce-source/recce/core.py +0 -334
- package/recce-source/recce/diff.py +0 -26
- package/recce-source/recce/event/CONFIG +0 -1
- package/recce-source/recce/event/SENTRY_DNS +0 -1
- package/recce-source/recce/event/__init__.py +0 -304
- package/recce-source/recce/event/collector.py +0 -184
- package/recce-source/recce/event/track.py +0 -158
- package/recce-source/recce/exceptions.py +0 -21
- package/recce-source/recce/git.py +0 -77
- package/recce-source/recce/github.py +0 -222
- package/recce-source/recce/mcp_server.py +0 -885
- package/recce-source/recce/models/__init__.py +0 -6
- package/recce-source/recce/models/check.py +0 -481
- package/recce-source/recce/models/run.py +0 -46
- package/recce-source/recce/models/types.py +0 -218
- package/recce-source/recce/pull_request.py +0 -124
- package/recce-source/recce/run.py +0 -390
- package/recce-source/recce/server.py +0 -877
- package/recce-source/recce/state/__init__.py +0 -31
- package/recce-source/recce/state/cloud.py +0 -644
- package/recce-source/recce/state/const.py +0 -26
- package/recce-source/recce/state/local.py +0 -56
- package/recce-source/recce/state/state.py +0 -119
- package/recce-source/recce/state/state_loader.py +0 -174
- package/recce-source/recce/summary.py +0 -575
- package/recce-source/recce/tasks/__init__.py +0 -23
- package/recce-source/recce/tasks/core.py +0 -134
- package/recce-source/recce/tasks/dataframe.py +0 -170
- package/recce-source/recce/tasks/histogram.py +0 -433
- package/recce-source/recce/tasks/lineage.py +0 -19
- package/recce-source/recce/tasks/profile.py +0 -298
- package/recce-source/recce/tasks/query.py +0 -450
- package/recce-source/recce/tasks/rowcount.py +0 -277
- package/recce-source/recce/tasks/schema.py +0 -65
- package/recce-source/recce/tasks/top_k.py +0 -172
- package/recce-source/recce/tasks/utils.py +0 -147
- package/recce-source/recce/tasks/valuediff.py +0 -497
- package/recce-source/recce/util/__init__.py +0 -4
- package/recce-source/recce/util/api_token.py +0 -80
- package/recce-source/recce/util/breaking.py +0 -330
- package/recce-source/recce/util/cache.py +0 -25
- package/recce-source/recce/util/cll.py +0 -355
- package/recce-source/recce/util/cloud/__init__.py +0 -15
- package/recce-source/recce/util/cloud/base.py +0 -115
- package/recce-source/recce/util/cloud/check_events.py +0 -190
- package/recce-source/recce/util/cloud/checks.py +0 -242
- package/recce-source/recce/util/io.py +0 -120
- package/recce-source/recce/util/lineage.py +0 -83
- package/recce-source/recce/util/logger.py +0 -25
- package/recce-source/recce/util/onboarding_state.py +0 -45
- package/recce-source/recce/util/perf_tracking.py +0 -85
- package/recce-source/recce/util/pydantic_model.py +0 -22
- package/recce-source/recce/util/recce_cloud.py +0 -454
- package/recce-source/recce/util/singleton.py +0 -18
- package/recce-source/recce/util/startup_perf.py +0 -121
- package/recce-source/recce/yaml/__init__.py +0 -58
- package/recce-source/recce_cloud/README.md +0 -780
- package/recce-source/recce_cloud/VERSION +0 -1
- package/recce-source/recce_cloud/__init__.py +0 -24
- package/recce-source/recce_cloud/api/__init__.py +0 -17
- package/recce-source/recce_cloud/api/base.py +0 -132
- package/recce-source/recce_cloud/api/client.py +0 -186
- package/recce-source/recce_cloud/api/exceptions.py +0 -26
- package/recce-source/recce_cloud/api/factory.py +0 -63
- package/recce-source/recce_cloud/api/github.py +0 -106
- package/recce-source/recce_cloud/api/gitlab.py +0 -111
- package/recce-source/recce_cloud/artifact.py +0 -57
- package/recce-source/recce_cloud/ci_providers/__init__.py +0 -9
- package/recce-source/recce_cloud/ci_providers/base.py +0 -82
- package/recce-source/recce_cloud/ci_providers/detector.py +0 -147
- package/recce-source/recce_cloud/ci_providers/github_actions.py +0 -136
- package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +0 -130
- package/recce-source/recce_cloud/cli.py +0 -434
- package/recce-source/recce_cloud/download.py +0 -230
- package/recce-source/recce_cloud/hatch_build.py +0 -20
- package/recce-source/recce_cloud/pyproject.toml +0 -49
- package/recce-source/recce_cloud/upload.py +0 -214
- package/recce-source/test.py +0 -0
- package/recce-source/tests/__init__.py +0 -0
- package/recce-source/tests/adapter/__init__.py +0 -0
- package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
- package/recce-source/tests/adapter/dbt_adapter/conftest.py +0 -17
- package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -298
- package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -25
- package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -717
- package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +0 -4
- package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +0 -1
- package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +0 -8
- package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +0 -7
- package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +0 -6
- package/recce-source/tests/adapter/dbt_adapter/test_selector.py +0 -205
- package/recce-source/tests/apis/__init__.py +0 -0
- package/recce-source/tests/apis/row_count_diff.json +0 -59
- package/recce-source/tests/apis/test_check_events_api.py +0 -615
- package/recce-source/tests/apis/test_run_func.py +0 -433
- package/recce-source/tests/catalog.json +0 -527
- package/recce-source/tests/data/manifest/base/catalog.json +0 -1
- package/recce-source/tests/data/manifest/base/manifest.json +0 -1
- package/recce-source/tests/data/manifest/pr2/catalog.json +0 -1
- package/recce-source/tests/data/manifest/pr2/manifest.json +0 -1
- package/recce-source/tests/manifest.json +0 -10655
- package/recce-source/tests/models/__init__.py +0 -0
- package/recce-source/tests/models/test_check.py +0 -731
- package/recce-source/tests/models/test_run_models.py +0 -295
- package/recce-source/tests/recce_cloud/__init__.py +0 -0
- package/recce-source/tests/recce_cloud/test_ci_providers.py +0 -351
- package/recce-source/tests/recce_cloud/test_cli.py +0 -735
- package/recce-source/tests/recce_cloud/test_client.py +0 -379
- package/recce-source/tests/recce_cloud/test_platform_clients.py +0 -483
- package/recce-source/tests/recce_state.json +0 -1
- package/recce-source/tests/state/test_cloud.py +0 -719
- package/recce-source/tests/state/test_local.py +0 -164
- package/recce-source/tests/state/test_state_loader.py +0 -211
- package/recce-source/tests/tasks/__init__.py +0 -0
- package/recce-source/tests/tasks/conftest.py +0 -4
- package/recce-source/tests/tasks/test_histogram.py +0 -129
- package/recce-source/tests/tasks/test_lineage.py +0 -55
- package/recce-source/tests/tasks/test_preset_checks.py +0 -64
- package/recce-source/tests/tasks/test_profile.py +0 -397
- package/recce-source/tests/tasks/test_query.py +0 -528
- package/recce-source/tests/tasks/test_row_count.py +0 -133
- package/recce-source/tests/tasks/test_schema.py +0 -122
- package/recce-source/tests/tasks/test_top_k.py +0 -77
- package/recce-source/tests/tasks/test_utils.py +0 -439
- package/recce-source/tests/tasks/test_valuediff.py +0 -361
- package/recce-source/tests/test_cli.py +0 -236
- package/recce-source/tests/test_cli_mcp_optional.py +0 -45
- package/recce-source/tests/test_cloud_listing_cli.py +0 -324
- package/recce-source/tests/test_config.py +0 -43
- package/recce-source/tests/test_connect_to_cloud.py +0 -82
- package/recce-source/tests/test_core.py +0 -174
- package/recce-source/tests/test_dbt.py +0 -36
- package/recce-source/tests/test_mcp_server.py +0 -505
- package/recce-source/tests/test_pull_request.py +0 -130
- package/recce-source/tests/test_server.py +0 -202
- package/recce-source/tests/test_server_lifespan.py +0 -138
- package/recce-source/tests/test_summary.py +0 -73
- package/recce-source/tests/util/__init__.py +0 -0
- package/recce-source/tests/util/cloud/__init__.py +0 -0
- package/recce-source/tests/util/cloud/test_check_events.py +0 -255
- package/recce-source/tests/util/cloud/test_checks.py +0 -204
- package/recce-source/tests/util/test_api_token.py +0 -119
- package/recce-source/tests/util/test_breaking.py +0 -1427
- package/recce-source/tests/util/test_cll.py +0 -706
- package/recce-source/tests/util/test_lineage.py +0 -122
- package/recce-source/tests/util/test_onboarding_state.py +0 -84
- package/recce-source/tests/util/test_recce_cloud.py +0 -231
- package/recce-source/tox.ini +0 -40
- package/recce-source/uv.lock +0 -3928
- package/src/api/index.ts +0 -32
- package/src/components/index.ts +0 -154
- package/src/global.d.ts +0 -14
- package/src/hooks/index.ts +0 -56
- package/src/index.ts +0 -17
- package/src/lib/hooks/RouteConfigContext.ts +0 -139
- package/src/lib/hooks/useAppRouter.ts +0 -240
- package/src/mui-augmentation.d.ts +0 -139
- package/src/theme/index.ts +0 -13
- package/src/theme.ts +0 -23
- package/src/types/index.ts +0 -23
|
@@ -1,877 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import json
|
|
3
|
-
import logging
|
|
4
|
-
import os
|
|
5
|
-
import signal
|
|
6
|
-
import uuid
|
|
7
|
-
from contextlib import asynccontextmanager
|
|
8
|
-
from dataclasses import dataclass
|
|
9
|
-
from datetime import datetime, timedelta
|
|
10
|
-
from enum import Enum
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import Annotated, Any, Literal, Optional, Set
|
|
13
|
-
|
|
14
|
-
from fastapi import (
|
|
15
|
-
BackgroundTasks,
|
|
16
|
-
FastAPI,
|
|
17
|
-
Form,
|
|
18
|
-
HTTPException,
|
|
19
|
-
Request,
|
|
20
|
-
Response,
|
|
21
|
-
UploadFile,
|
|
22
|
-
WebSocket,
|
|
23
|
-
)
|
|
24
|
-
from fastapi.middleware.cors import CORSMiddleware
|
|
25
|
-
from fastapi.responses import PlainTextResponse
|
|
26
|
-
from fastapi.staticfiles import StaticFiles
|
|
27
|
-
from pydantic import BaseModel, ValidationError
|
|
28
|
-
from pytz import utc
|
|
29
|
-
from starlette.middleware.gzip import GZipMiddleware
|
|
30
|
-
from starlette.middleware.sessions import SessionMiddleware
|
|
31
|
-
from starlette.websockets import WebSocketDisconnect
|
|
32
|
-
|
|
33
|
-
from . import __latest_version__, __version__, event, is_recce_cloud_instance
|
|
34
|
-
from .apis.check_api import check_router
|
|
35
|
-
from .apis.check_events_api import check_events_router
|
|
36
|
-
from .apis.run_api import run_router
|
|
37
|
-
from .config import RecceConfig
|
|
38
|
-
from .connect_to_cloud import (
|
|
39
|
-
connect_to_cloud_background_task,
|
|
40
|
-
generate_key_pair,
|
|
41
|
-
get_connection_url,
|
|
42
|
-
is_callback_server_running,
|
|
43
|
-
prepare_connection_url,
|
|
44
|
-
)
|
|
45
|
-
from .core import RecceContext, default_context, load_context
|
|
46
|
-
from .event import get_recce_api_token, log_api_event, log_single_env_event
|
|
47
|
-
from .exceptions import RecceException
|
|
48
|
-
from .github import is_github_codespace
|
|
49
|
-
from .models.types import CllData
|
|
50
|
-
from .run import load_preset_checks
|
|
51
|
-
from .state import RecceShareStateManager, RecceStateLoader
|
|
52
|
-
from .util.startup_perf import track_timing
|
|
53
|
-
|
|
54
|
-
logger = logging.getLogger("uvicorn")
|
|
55
|
-
|
|
56
|
-
# Idle timeout check interval bounds (in seconds)
|
|
57
|
-
MAX_CHECK_INTERVAL = 30
|
|
58
|
-
MIN_CHECK_INTERVAL = 1
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class RecceServerMode(str, Enum):
|
|
62
|
-
server = "server"
|
|
63
|
-
preview = "preview"
|
|
64
|
-
read_only = "read-only"
|
|
65
|
-
|
|
66
|
-
def __str__(self):
|
|
67
|
-
return self.value
|
|
68
|
-
|
|
69
|
-
@staticmethod
|
|
70
|
-
def available_members() -> Set[str]:
|
|
71
|
-
return ["server", "preview", "read-only"]
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
@dataclass
|
|
75
|
-
class AppState:
|
|
76
|
-
command: Optional[str] = None
|
|
77
|
-
state_loader: Optional[RecceStateLoader] = None
|
|
78
|
-
kwargs: Optional[dict] = None
|
|
79
|
-
flag: Optional[dict] = None
|
|
80
|
-
auth_options: Optional[dict] = None
|
|
81
|
-
lifetime: Optional[int] = None
|
|
82
|
-
lifetime_expired_at: Optional[datetime] = None
|
|
83
|
-
idle_timeout: Optional[int] = None
|
|
84
|
-
last_activity: Optional[dict] = None
|
|
85
|
-
share_url: Optional[str] = None
|
|
86
|
-
organization_name: Optional[str] = None
|
|
87
|
-
web_url: Optional[str] = None
|
|
88
|
-
host: Optional[str] = None
|
|
89
|
-
port: Optional[int] = None
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def schedule_lifetime_termination(app_state):
|
|
93
|
-
def terminating_server():
|
|
94
|
-
pid = os.getpid()
|
|
95
|
-
logger.info(f"Terminating server process [{pid}] manually due to lifetime expiration")
|
|
96
|
-
os.kill(pid, signal.SIGINT)
|
|
97
|
-
|
|
98
|
-
# Terminate the server process after the specified lifetime
|
|
99
|
-
logger.info(f"[Configuration] The lifetime of the server is {app_state.lifetime} seconds")
|
|
100
|
-
app.state.lifetime_expired_at = datetime.now(utc) + timedelta(seconds=app_state.lifetime)
|
|
101
|
-
asyncio.get_running_loop().call_later(app_state.lifetime, terminating_server)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def schedule_idle_timeout_check(app_state):
|
|
105
|
-
"""
|
|
106
|
-
Schedule periodic checks for idle timeout.
|
|
107
|
-
If the server has been idle for longer than idle_timeout, terminate it.
|
|
108
|
-
"""
|
|
109
|
-
# Track last activity time in app_state
|
|
110
|
-
app_state.last_activity = {"time": datetime.now(utc)}
|
|
111
|
-
|
|
112
|
-
def terminating_server_idle():
|
|
113
|
-
pid = os.getpid()
|
|
114
|
-
logger.info(f"Terminating server process [{pid}] manually due to idle timeout")
|
|
115
|
-
os.kill(pid, signal.SIGINT)
|
|
116
|
-
|
|
117
|
-
async def check_idle_timeout():
|
|
118
|
-
"""Periodically check if the server has been idle for too long"""
|
|
119
|
-
# Use smaller check interval if idle_timeout is very short
|
|
120
|
-
# Check at least every MAX_CHECK_INTERVAL seconds, but also check when idle_timeout is approaching
|
|
121
|
-
check_interval = min(MAX_CHECK_INTERVAL, max(MIN_CHECK_INTERVAL, app_state.idle_timeout // 3))
|
|
122
|
-
|
|
123
|
-
logger.debug(f"[Idle Timeout] Starting idle timeout checker with {check_interval}s check interval")
|
|
124
|
-
|
|
125
|
-
while True:
|
|
126
|
-
await asyncio.sleep(check_interval)
|
|
127
|
-
|
|
128
|
-
idle_seconds = (datetime.now(utc) - app_state.last_activity["time"]).total_seconds()
|
|
129
|
-
remaining_seconds = app_state.idle_timeout - idle_seconds
|
|
130
|
-
|
|
131
|
-
# Always log the countdown for debugging
|
|
132
|
-
if remaining_seconds > 0:
|
|
133
|
-
logger.debug(
|
|
134
|
-
f"[Idle Timeout] Server idle for {idle_seconds:.1f}s / {app_state.idle_timeout}s "
|
|
135
|
-
f"(remaining: {remaining_seconds:.1f}s)"
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
if idle_seconds >= app_state.idle_timeout:
|
|
139
|
-
logger.info(
|
|
140
|
-
f"[Idle Timeout] Threshold reached! Server has been idle for {idle_seconds:.0f} seconds "
|
|
141
|
-
f"(threshold: {app_state.idle_timeout} seconds)"
|
|
142
|
-
)
|
|
143
|
-
terminating_server_idle()
|
|
144
|
-
break
|
|
145
|
-
|
|
146
|
-
# Start the idle timeout check task
|
|
147
|
-
logger.info(f"[Configuration] The idle timeout of the server is {app_state.idle_timeout} seconds")
|
|
148
|
-
|
|
149
|
-
# Create task using asyncio.create_task which works in async context
|
|
150
|
-
task = asyncio.create_task(check_idle_timeout())
|
|
151
|
-
logger.debug(f"[Idle Timeout] Background task created: {task}")
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def setup_server(app_state: AppState) -> RecceContext:
|
|
155
|
-
from rich.console import Console
|
|
156
|
-
|
|
157
|
-
from .core import load_context
|
|
158
|
-
|
|
159
|
-
console = Console()
|
|
160
|
-
state_loader = app_state.state_loader
|
|
161
|
-
kwargs = app_state.kwargs
|
|
162
|
-
ctx = load_context(**kwargs, state_loader=state_loader)
|
|
163
|
-
ctx.start_monitor_artifacts(callback=dbt_artifacts_updated_callback)
|
|
164
|
-
single_env = False
|
|
165
|
-
if app_state.flag.get("single_env_onboarding", False) is True:
|
|
166
|
-
# [Experiment 2] Start with Single Environment
|
|
167
|
-
single_env = True
|
|
168
|
-
ctx.start_monitor_base_env(callback=dbt_env_updated_callback)
|
|
169
|
-
log_single_env_event()
|
|
170
|
-
|
|
171
|
-
# Initialize Recce Config
|
|
172
|
-
config = RecceConfig(config_file=kwargs.get("config"))
|
|
173
|
-
if state_loader.state is None:
|
|
174
|
-
preset_checks = config.get("checks", [])
|
|
175
|
-
if preset_checks and len(preset_checks) > 0:
|
|
176
|
-
console.rule("Loading Preset Checks")
|
|
177
|
-
load_preset_checks(preset_checks)
|
|
178
|
-
|
|
179
|
-
from recce.event import log_load_state
|
|
180
|
-
|
|
181
|
-
log_load_state(command="server", single_env=single_env)
|
|
182
|
-
|
|
183
|
-
return ctx
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
def teardown_server(app_state: AppState, ctx: RecceContext):
|
|
187
|
-
# pull latest state, merge runs/checks and pick the newer artifacts
|
|
188
|
-
state_loader = ctx.state_loader
|
|
189
|
-
state_loader.refresh()
|
|
190
|
-
if state_loader.state:
|
|
191
|
-
ctx.import_state(state_loader.state, merge=True)
|
|
192
|
-
state_loader.export(ctx.export_state())
|
|
193
|
-
ctx.stop_monitor_artifacts()
|
|
194
|
-
if app_state.flag.get("single_env_onboarding", False):
|
|
195
|
-
ctx.stop_monitor_base_env()
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
def setup_ready_only(app_state: AppState):
|
|
199
|
-
pass
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def teardown_ready_only(app_state: AppState):
|
|
203
|
-
pass
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
def setup_preview(app_state: AppState):
|
|
207
|
-
state_loader = app_state.state_loader
|
|
208
|
-
kwargs = app_state.kwargs
|
|
209
|
-
ctx = load_context(**kwargs, state_loader=state_loader)
|
|
210
|
-
return ctx
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def teardown_preview(app_state: AppState, ctx: RecceContext):
|
|
214
|
-
state_loader = app_state.state_loader
|
|
215
|
-
state_loader.export(ctx.export_state())
|
|
216
|
-
pass
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
@track_timing("server_setup")
|
|
220
|
-
def _do_lifespan_setup(app_state: AppState):
|
|
221
|
-
"""Run server setup and return context for teardown."""
|
|
222
|
-
if app_state.command == "server":
|
|
223
|
-
ctx = setup_server(app_state)
|
|
224
|
-
elif app_state.command == "read-only":
|
|
225
|
-
setup_ready_only(app_state)
|
|
226
|
-
ctx = None
|
|
227
|
-
elif app_state.command == "preview":
|
|
228
|
-
ctx = setup_preview(app_state)
|
|
229
|
-
else:
|
|
230
|
-
ctx = None
|
|
231
|
-
|
|
232
|
-
if app_state.lifetime is not None and app_state.lifetime > 0:
|
|
233
|
-
schedule_lifetime_termination(app_state)
|
|
234
|
-
|
|
235
|
-
if app_state.idle_timeout is not None and app_state.idle_timeout > 0:
|
|
236
|
-
logger.debug(f"[Idle Timeout] Scheduling idle timeout check with {app_state.idle_timeout} seconds")
|
|
237
|
-
schedule_idle_timeout_check(app_state)
|
|
238
|
-
|
|
239
|
-
return ctx
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
@asynccontextmanager
|
|
243
|
-
async def lifespan(fastapi: FastAPI):
|
|
244
|
-
from recce.core import default_context
|
|
245
|
-
from recce.event import log_performance
|
|
246
|
-
from recce.util.startup_perf import clear_startup_tracker, get_startup_tracker
|
|
247
|
-
|
|
248
|
-
app_state: AppState = app.state
|
|
249
|
-
|
|
250
|
-
# Ensure logger is at DEBUG level if debug mode is enabled
|
|
251
|
-
if app_state.kwargs and app_state.kwargs.get("debug"):
|
|
252
|
-
logger.setLevel(logging.DEBUG)
|
|
253
|
-
logger.debug("Debug mode enabled - logger set to DEBUG level")
|
|
254
|
-
|
|
255
|
-
ctx = _do_lifespan_setup(app_state)
|
|
256
|
-
|
|
257
|
-
# Log startup performance metrics
|
|
258
|
-
if tracker := get_startup_tracker():
|
|
259
|
-
tracker.command = app_state.command
|
|
260
|
-
recce_ctx = default_context()
|
|
261
|
-
if recce_ctx and recce_ctx.adapter:
|
|
262
|
-
tracker.adapter_type = type(recce_ctx.adapter).__name__
|
|
263
|
-
if hasattr(recce_ctx.adapter, "curr_manifest") and recce_ctx.adapter.curr_manifest:
|
|
264
|
-
tracker.node_count = len(recce_ctx.adapter.curr_manifest.nodes)
|
|
265
|
-
log_performance("server_startup", tracker.to_dict())
|
|
266
|
-
clear_startup_tracker()
|
|
267
|
-
|
|
268
|
-
yield
|
|
269
|
-
|
|
270
|
-
if app_state.command == "server":
|
|
271
|
-
teardown_server(app_state, ctx)
|
|
272
|
-
elif app_state.command == "read-only":
|
|
273
|
-
teardown_ready_only(app_state)
|
|
274
|
-
elif app_state.command == "preview":
|
|
275
|
-
teardown_preview(app_state, ctx)
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
app = FastAPI(lifespan=lifespan)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
def verify_json_file(file_path: str) -> bool:
|
|
282
|
-
try:
|
|
283
|
-
with open(file_path, "r", encoding="utf-8") as f:
|
|
284
|
-
json.load(f)
|
|
285
|
-
except Exception:
|
|
286
|
-
return False
|
|
287
|
-
return True
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
def dbt_artifacts_updated_callback(file_changed_event: Any):
|
|
291
|
-
src_path = Path(file_changed_event.src_path)
|
|
292
|
-
target_type = src_path.parent.name
|
|
293
|
-
file_name = src_path.name
|
|
294
|
-
|
|
295
|
-
if not verify_json_file(file_changed_event.src_path):
|
|
296
|
-
logger.debug("Skip to refresh the artifacts because the file is not updated completely.")
|
|
297
|
-
return
|
|
298
|
-
|
|
299
|
-
logger.info(f"Detect {target_type} file {file_changed_event.event_type}: {file_name}")
|
|
300
|
-
ctx = load_context()
|
|
301
|
-
ctx.refresh_manifest(file_changed_event.src_path)
|
|
302
|
-
broadcast_command = {
|
|
303
|
-
"command": "refresh",
|
|
304
|
-
"event": {"eventType": file_changed_event.event_type, "srcPath": file_changed_event.src_path},
|
|
305
|
-
}
|
|
306
|
-
payload = json.dumps(broadcast_command)
|
|
307
|
-
asyncio.run(broadcast(payload))
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
def dbt_env_updated_callback():
|
|
311
|
-
logger.info("Detect 'manifest.json' and 'catalog.json' are generated under 'target-base' directory")
|
|
312
|
-
broadcast_command = {
|
|
313
|
-
"command": "relaunch",
|
|
314
|
-
}
|
|
315
|
-
payload = json.dumps(broadcast_command)
|
|
316
|
-
asyncio.run(broadcast(payload))
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
clients = set()
|
|
320
|
-
|
|
321
|
-
origins = [
|
|
322
|
-
"http://localhost:3000",
|
|
323
|
-
"http://localhost:3001",
|
|
324
|
-
]
|
|
325
|
-
|
|
326
|
-
app.add_middleware(GZipMiddleware, minimum_size=1000)
|
|
327
|
-
app.add_middleware(
|
|
328
|
-
CORSMiddleware,
|
|
329
|
-
allow_origins=origins,
|
|
330
|
-
allow_credentials=True,
|
|
331
|
-
allow_methods=["*"],
|
|
332
|
-
allow_headers=["*"],
|
|
333
|
-
)
|
|
334
|
-
app.add_middleware(
|
|
335
|
-
SessionMiddleware,
|
|
336
|
-
secret_key=uuid.uuid4(),
|
|
337
|
-
)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
@app.middleware("http")
|
|
341
|
-
async def track_activity_for_idle_timeout(request: Request, call_next):
|
|
342
|
-
"""Track activity time for idle timeout check"""
|
|
343
|
-
# Exclude paths that should not reset idle timer
|
|
344
|
-
# Health checks and monitoring endpoints don't count as user activity
|
|
345
|
-
excluded_paths = ["/api/health", "/api/ws"]
|
|
346
|
-
|
|
347
|
-
# Update last activity time BEFORE processing request if idle timeout is enabled
|
|
348
|
-
# This ensures long-running requests don't get terminated mid-execution
|
|
349
|
-
app_state: AppState = app.state
|
|
350
|
-
if app_state.last_activity is not None:
|
|
351
|
-
if request.url.path not in excluded_paths:
|
|
352
|
-
app_state.last_activity["time"] = datetime.now(utc)
|
|
353
|
-
logger.debug(f"[Idle Timeout] ✓ Activity detected: {request.method} {request.url.path} - Timer reset")
|
|
354
|
-
else:
|
|
355
|
-
logger.debug(f"[Idle Timeout] Excluded path (no timer reset): {request.method} {request.url.path}")
|
|
356
|
-
|
|
357
|
-
response = await call_next(request)
|
|
358
|
-
return response
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
@app.middleware("http")
|
|
362
|
-
async def set_context_by_cookie(request: Request, call_next):
|
|
363
|
-
response = await call_next(request)
|
|
364
|
-
|
|
365
|
-
user_id_in_cookie = request.cookies.get("recce_user_id")
|
|
366
|
-
user_id = event.get_user_id()
|
|
367
|
-
|
|
368
|
-
if event.is_anonymous_tracking() is False:
|
|
369
|
-
# Disable anonymous tracking
|
|
370
|
-
user_id = None
|
|
371
|
-
|
|
372
|
-
if user_id_in_cookie is None or user_id_in_cookie != user_id:
|
|
373
|
-
response.set_cookie(key="recce_user_id", value=user_id)
|
|
374
|
-
return response
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
@app.middleware("http")
|
|
378
|
-
async def disable_cache(request: Request, call_next):
|
|
379
|
-
response = await call_next(request)
|
|
380
|
-
|
|
381
|
-
# disable cache for '/' and '/index.html'
|
|
382
|
-
if request.url.path in ["/", "/index.html"]:
|
|
383
|
-
response.headers["Cache-Control"] = "no-store"
|
|
384
|
-
|
|
385
|
-
return response
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
@app.get("/api/health")
|
|
389
|
-
async def health_check(request: Request):
|
|
390
|
-
return {"status": "ok"}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
@app.post("/api/keep-alive")
|
|
394
|
-
async def keep_alive():
|
|
395
|
-
"""Endpoint to keep the session alive and reset idle timeout"""
|
|
396
|
-
app_state: AppState = app.state
|
|
397
|
-
if app_state.last_activity is not None:
|
|
398
|
-
app_state.last_activity["time"] = datetime.now(utc)
|
|
399
|
-
logger.debug("[Idle Timeout] Keep-alive request received - Timer reset")
|
|
400
|
-
return {"status": "ok", "idle_timeout_enabled": True}
|
|
401
|
-
return {"status": "ok", "idle_timeout_enabled": False}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
class RecceInstanceInfoOut(BaseModel):
|
|
405
|
-
server_mode: RecceServerMode
|
|
406
|
-
read_only: bool
|
|
407
|
-
preview: bool
|
|
408
|
-
single_env: bool
|
|
409
|
-
authed: bool
|
|
410
|
-
cloud_instance: bool
|
|
411
|
-
lifetime_expired_at: Optional[datetime] = None
|
|
412
|
-
idle_timeout: Optional[int] = None
|
|
413
|
-
share_url: Optional[str] = None
|
|
414
|
-
session_id: Optional[str] = None
|
|
415
|
-
organization_name: Optional[str] = None
|
|
416
|
-
web_url: Optional[str] = None
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
@app.get("/api/instance-info", response_model=RecceInstanceInfoOut, response_model_exclude_none=True)
|
|
420
|
-
async def recce_instance_info():
|
|
421
|
-
app_state: AppState = app.state
|
|
422
|
-
flag = app_state.flag
|
|
423
|
-
read_only = flag.get("read_only", False)
|
|
424
|
-
single_env = flag.get("single_env_onboarding", False)
|
|
425
|
-
|
|
426
|
-
api_token = get_recce_api_token()
|
|
427
|
-
|
|
428
|
-
return {
|
|
429
|
-
"server_mode": app_state.command,
|
|
430
|
-
"read_only": read_only,
|
|
431
|
-
"preview": flag.get("preview", False),
|
|
432
|
-
"single_env": single_env,
|
|
433
|
-
"authed": True if api_token else False,
|
|
434
|
-
"cloud_instance": is_recce_cloud_instance(),
|
|
435
|
-
"lifetime_expired_at": app_state.lifetime_expired_at, # UTC timezone
|
|
436
|
-
"idle_timeout": app_state.idle_timeout,
|
|
437
|
-
"share_url": app_state.share_url,
|
|
438
|
-
"session_id": app_state.state_loader.session_id if app_state.state_loader else None,
|
|
439
|
-
"organization_name": app_state.organization_name,
|
|
440
|
-
"web_url": app_state.web_url,
|
|
441
|
-
# TODO: Add more instance info which won't change during the instance lifecycle
|
|
442
|
-
# review_mode
|
|
443
|
-
# cloud_mode
|
|
444
|
-
# demo
|
|
445
|
-
# single env
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
@app.get("/api/flag")
|
|
450
|
-
async def config_flag():
|
|
451
|
-
app_state: AppState = app.state
|
|
452
|
-
flag = app_state.flag
|
|
453
|
-
return flag
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
@app.post("/api/relaunch-hint/completed", status_code=204)
|
|
457
|
-
async def mark_relaunch_hint_completed():
|
|
458
|
-
app.state.flag["show_relaunch_hint"] = False
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
@app.get("/api/info")
|
|
462
|
-
async def get_info():
|
|
463
|
-
"""
|
|
464
|
-
Get the information of the current context.
|
|
465
|
-
"""
|
|
466
|
-
context = default_context()
|
|
467
|
-
demo = os.environ.get("DEMO", False)
|
|
468
|
-
is_codespace = is_github_codespace()
|
|
469
|
-
|
|
470
|
-
if demo:
|
|
471
|
-
state = context.export_demo_state()
|
|
472
|
-
else:
|
|
473
|
-
state = context.export_state()
|
|
474
|
-
|
|
475
|
-
support_tasks = context.support_tasks()
|
|
476
|
-
if context.state_loader and context.state_loader.state_file:
|
|
477
|
-
filename = os.path.basename(context.state_loader.state_file)
|
|
478
|
-
else:
|
|
479
|
-
filename = None
|
|
480
|
-
|
|
481
|
-
state_metadata = context.state_loader.state.metadata if context.state_loader.state else None
|
|
482
|
-
lineage_diff = context.get_lineage_diff()
|
|
483
|
-
|
|
484
|
-
try:
|
|
485
|
-
info = {
|
|
486
|
-
"state_metadata": state_metadata,
|
|
487
|
-
"adapter_type": context.adapter_type,
|
|
488
|
-
"review_mode": context.review_mode,
|
|
489
|
-
"git": state.git.to_dict() if state.git else None,
|
|
490
|
-
"pull_request": state.pull_request.to_dict() if state.pull_request else None,
|
|
491
|
-
"lineage": lineage_diff,
|
|
492
|
-
"demo": bool(demo),
|
|
493
|
-
"codespace": bool(is_codespace),
|
|
494
|
-
"cloud_mode": context.state_loader.cloud_mode,
|
|
495
|
-
"file_mode": context.state_loader.state_file is not None,
|
|
496
|
-
"filename": filename,
|
|
497
|
-
"support_tasks": support_tasks,
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
if context.adapter_type == "sqlmesh":
|
|
501
|
-
from recce.adapter.sqlmesh_adapter import SqlmeshAdapter
|
|
502
|
-
|
|
503
|
-
sqlmesh_adapter: SqlmeshAdapter = context.adapter
|
|
504
|
-
info["sqlmesh"] = {
|
|
505
|
-
"base_env": sqlmesh_adapter.base_env.name,
|
|
506
|
-
"current_env": sqlmesh_adapter.curr_env.name,
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
return info
|
|
510
|
-
except Exception as e:
|
|
511
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
class CllIn(BaseModel):
|
|
515
|
-
node_id: Optional[str] = None
|
|
516
|
-
column: Optional[str] = None
|
|
517
|
-
change_analysis: Optional[bool] = False
|
|
518
|
-
no_cll: Optional[bool] = False
|
|
519
|
-
no_upstream: Optional[bool] = False
|
|
520
|
-
no_downstream: Optional[bool] = False
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
class CllOutput(BaseModel):
|
|
524
|
-
current: CllData
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
@app.post("/api/cll", response_model=CllOutput)
|
|
528
|
-
async def column_level_lineage_by_node(cll_input: CllIn):
|
|
529
|
-
from recce.adapter.dbt_adapter import DbtAdapter
|
|
530
|
-
|
|
531
|
-
dbt_adapter: DbtAdapter = default_context().adapter
|
|
532
|
-
cll = dbt_adapter.get_cll(
|
|
533
|
-
node_id=cll_input.node_id,
|
|
534
|
-
column=cll_input.column,
|
|
535
|
-
change_analysis=cll_input.change_analysis,
|
|
536
|
-
no_upstream=cll_input.no_upstream,
|
|
537
|
-
no_downstream=cll_input.no_downstream,
|
|
538
|
-
no_cll=cll_input.no_cll,
|
|
539
|
-
)
|
|
540
|
-
|
|
541
|
-
return CllOutput(current=cll)
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
class SelectNodesInput(BaseModel):
|
|
545
|
-
select: Optional[str] = None
|
|
546
|
-
exclude: Optional[str] = None
|
|
547
|
-
packages: Optional[list[str]] = None
|
|
548
|
-
view_mode: Optional[Literal["all", "changed_models"]] = None
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
class SelectNodesOutput(BaseModel):
|
|
552
|
-
nodes: Set[str] = []
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
@app.post("/api/select", response_model=SelectNodesOutput)
|
|
556
|
-
async def select_nodes(input: SelectNodesInput):
|
|
557
|
-
context = default_context()
|
|
558
|
-
|
|
559
|
-
if context.adapter_type != "dbt":
|
|
560
|
-
raise HTTPException(status_code=400, detail="Only dbt adapter is supported")
|
|
561
|
-
|
|
562
|
-
try:
|
|
563
|
-
nodes = context.adapter.select_nodes(
|
|
564
|
-
select=input.select,
|
|
565
|
-
exclude=input.exclude,
|
|
566
|
-
packages=input.packages,
|
|
567
|
-
view_mode=input.view_mode,
|
|
568
|
-
)
|
|
569
|
-
nodes = [node for node in nodes if not node.startswith("test.")]
|
|
570
|
-
return SelectNodesOutput(nodes=nodes)
|
|
571
|
-
except Exception as e:
|
|
572
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
@app.get("/api/model/{model_id}")
|
|
576
|
-
async def get_columns(model_id: str):
|
|
577
|
-
context = default_context()
|
|
578
|
-
try:
|
|
579
|
-
return {
|
|
580
|
-
"model": {
|
|
581
|
-
"base": context.get_model(model_id, base=True),
|
|
582
|
-
"current": context.get_model(model_id, base=False),
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
except Exception as e:
|
|
586
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
@app.post("/api/save", response_class=PlainTextResponse, status_code=200)
|
|
590
|
-
async def save_handler():
|
|
591
|
-
"""
|
|
592
|
-
Save the in-memory state to the state file
|
|
593
|
-
"""
|
|
594
|
-
try:
|
|
595
|
-
# Sync the state file
|
|
596
|
-
context = default_context()
|
|
597
|
-
log_api_event("save", dict(state_loader_mode=context.state_loader_mode()))
|
|
598
|
-
state_loader = context.state_loader
|
|
599
|
-
if not state_loader.cloud_mode and state_loader.state_file is None:
|
|
600
|
-
raise RecceException("Not file mode or cloud mode")
|
|
601
|
-
|
|
602
|
-
context.sync_state("overwrite")
|
|
603
|
-
except RecceException as e:
|
|
604
|
-
raise HTTPException(status_code=400, detail=e.message)
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
class SaveAsOrRenameInput(BaseModel):
|
|
608
|
-
# The filename. The filename should not contain directory.
|
|
609
|
-
filename: Optional[str] = None
|
|
610
|
-
# Overwrite the file if it exists
|
|
611
|
-
overwrite: Optional[bool] = False
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
def saveas_or_rename(input: SaveAsOrRenameInput, rename: bool = False):
|
|
615
|
-
context = default_context()
|
|
616
|
-
state_loader = context.state_loader
|
|
617
|
-
if state_loader.cloud_mode:
|
|
618
|
-
raise RecceException("Cloud mode does not support rename")
|
|
619
|
-
|
|
620
|
-
new_filename = input.filename
|
|
621
|
-
if os.path.dirname(new_filename):
|
|
622
|
-
raise RecceException("The new filename should not contain directory")
|
|
623
|
-
if not new_filename.endswith(".json"):
|
|
624
|
-
raise RecceException("The new filename should end with .json")
|
|
625
|
-
|
|
626
|
-
old_path = state_loader.state_file
|
|
627
|
-
if old_path:
|
|
628
|
-
old_dir = os.path.dirname(state_loader.state_file)
|
|
629
|
-
old_filename = os.path.basename(state_loader.state_file)
|
|
630
|
-
if old_filename == new_filename:
|
|
631
|
-
raise RecceException("The new filename is the same as the current filename")
|
|
632
|
-
new_path = os.path.join(old_dir, new_filename)
|
|
633
|
-
else:
|
|
634
|
-
new_path = new_filename
|
|
635
|
-
|
|
636
|
-
if os.path.exists(new_path):
|
|
637
|
-
if os.path.isdir(new_path):
|
|
638
|
-
raise HTTPException(status_code=400, detail=f"The file {new_path} exists and is a directory")
|
|
639
|
-
|
|
640
|
-
if not input.overwrite:
|
|
641
|
-
raise HTTPException(status_code=409, detail=f"The file {new_filename} already exists")
|
|
642
|
-
|
|
643
|
-
state_loader.state_file = new_path
|
|
644
|
-
context.sync_state("overwrite")
|
|
645
|
-
if rename and os.path.exists(old_path):
|
|
646
|
-
os.remove(old_path)
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
@app.post("/api/save-as", response_class=PlainTextResponse, status_code=200)
|
|
650
|
-
async def save_as_handler(input: SaveAsOrRenameInput):
|
|
651
|
-
"""
|
|
652
|
-
Save the state to a new file
|
|
653
|
-
"""
|
|
654
|
-
context = default_context()
|
|
655
|
-
try:
|
|
656
|
-
log_api_event("saveas", dict(state_loader_mode=context.state_loader_mode()))
|
|
657
|
-
saveas_or_rename(input, rename=False)
|
|
658
|
-
except RecceException as e:
|
|
659
|
-
raise HTTPException(status_code=400, detail=e.message)
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
@app.post("/api/rename", response_class=PlainTextResponse, status_code=200)
|
|
663
|
-
async def rename_handler(input: SaveAsOrRenameInput):
|
|
664
|
-
"""
|
|
665
|
-
Rename the state to a new file
|
|
666
|
-
"""
|
|
667
|
-
context = default_context()
|
|
668
|
-
try:
|
|
669
|
-
log_api_event("rename", dict(state_loader_mode=context.state_loader_mode()))
|
|
670
|
-
saveas_or_rename(input, rename=True)
|
|
671
|
-
except RecceException as e:
|
|
672
|
-
raise HTTPException(status_code=400, detail=e.message)
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
@app.post("/api/export", response_class=PlainTextResponse, status_code=200)
|
|
676
|
-
async def export_handler():
|
|
677
|
-
"""
|
|
678
|
-
Export the recce state to the client.
|
|
679
|
-
"""
|
|
680
|
-
context = default_context()
|
|
681
|
-
try:
|
|
682
|
-
log_api_event("export", dict(state_loader_mode=context.state_loader_mode()))
|
|
683
|
-
return context.export_state().to_json()
|
|
684
|
-
except RecceException as e:
|
|
685
|
-
raise HTTPException(status_code=400, detail=e.message)
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
@app.post("/api/import", status_code=200)
|
|
689
|
-
async def import_handler(
|
|
690
|
-
file: Annotated[UploadFile, Form()], checks_only: Annotated[bool, Form()], background_tasks: BackgroundTasks
|
|
691
|
-
):
|
|
692
|
-
"""
|
|
693
|
-
Import the recce state from the client.
|
|
694
|
-
"""
|
|
695
|
-
from recce.state import RecceState
|
|
696
|
-
|
|
697
|
-
context = default_context()
|
|
698
|
-
try:
|
|
699
|
-
log_api_event("import", dict(state_loader_mode=context.state_loader_mode()))
|
|
700
|
-
content = await file.read()
|
|
701
|
-
state = RecceState.from_json(content)
|
|
702
|
-
|
|
703
|
-
if checks_only:
|
|
704
|
-
import_checks = context.import_checks(state)
|
|
705
|
-
background_tasks.add_task(context.sync_state, "overwrite")
|
|
706
|
-
return {"runs": 0, "checks": import_checks}
|
|
707
|
-
|
|
708
|
-
import_runs, import_checks = context.import_state(state)
|
|
709
|
-
return {"runs": import_runs, "checks": import_checks}
|
|
710
|
-
except ValidationError as e:
|
|
711
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
712
|
-
except RecceException as e:
|
|
713
|
-
raise HTTPException(status_code=400, detail=e.message)
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
class SyncStateInput(BaseModel):
|
|
717
|
-
method: Optional[str] = None
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
@app.post("/api/sync", status_code=202)
|
|
721
|
-
async def sync_handler(input: SyncStateInput, response: Response, background_tasks: BackgroundTasks):
|
|
722
|
-
"""
|
|
723
|
-
Sync the state with the external storage. (two-way sync)
|
|
724
|
-
|
|
725
|
-
This is used to sync the state with the external (local or cloud) storage. There are three methods:
|
|
726
|
-
- overwrite: Overwrite the external storage with the in-memory state.
|
|
727
|
-
- revert: Revert the in-memory state with the external storage.
|
|
728
|
-
- merge: Merge the state between the in-memory and external storage.
|
|
729
|
-
"""
|
|
730
|
-
context = default_context()
|
|
731
|
-
state_loader = context.state_loader
|
|
732
|
-
method = input.method
|
|
733
|
-
log_api_event(
|
|
734
|
-
"sync",
|
|
735
|
-
dict(
|
|
736
|
-
state_loader_mode=context.state_loader_mode(),
|
|
737
|
-
method=method,
|
|
738
|
-
),
|
|
739
|
-
)
|
|
740
|
-
|
|
741
|
-
if not method:
|
|
742
|
-
is_conflict = state_loader.check_conflict()
|
|
743
|
-
if is_conflict:
|
|
744
|
-
raise HTTPException(status_code=409, detail="Conflict detected")
|
|
745
|
-
method = "overwrite"
|
|
746
|
-
|
|
747
|
-
is_syncing = state_loader.state_lock.locked()
|
|
748
|
-
if is_syncing:
|
|
749
|
-
response.status_code = 208
|
|
750
|
-
return {"status": "syncing"}
|
|
751
|
-
|
|
752
|
-
def reload_state():
|
|
753
|
-
ctx = default_context()
|
|
754
|
-
ctx.sync_state(method)
|
|
755
|
-
|
|
756
|
-
background_tasks.add_task(reload_state)
|
|
757
|
-
response.status_code = 202
|
|
758
|
-
return {"status": "request accepted"}
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
@app.get("/api/sync", status_code=200)
|
|
762
|
-
async def sync_status(response: Response):
|
|
763
|
-
"""
|
|
764
|
-
Get the sync status.
|
|
765
|
-
"""
|
|
766
|
-
context = default_context()
|
|
767
|
-
if context.state_loader.state_lock.locked():
|
|
768
|
-
response.status_code = 208
|
|
769
|
-
return {"status": "syncing"}
|
|
770
|
-
|
|
771
|
-
response.status_code = 200
|
|
772
|
-
return {"status": "idle"}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
class ShareStateOutput(BaseModel):
|
|
776
|
-
status: str
|
|
777
|
-
message: str
|
|
778
|
-
share_url: Optional[str] = None
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
@app.post("/api/share", response_model=ShareStateOutput)
|
|
782
|
-
async def share_state():
|
|
783
|
-
"""
|
|
784
|
-
Share the recce state to the external storage. (one-way sync)
|
|
785
|
-
"""
|
|
786
|
-
app_state: AppState = app.state
|
|
787
|
-
state_manager = RecceShareStateManager(app_state.auth_options)
|
|
788
|
-
if not state_manager.verify():
|
|
789
|
-
error, hint = state_manager.error_and_hint
|
|
790
|
-
raise HTTPException(status_code=400, detail=f"Failed to share state: {error}. {hint}")
|
|
791
|
-
|
|
792
|
-
context = default_context()
|
|
793
|
-
state_loader = context.state_loader
|
|
794
|
-
|
|
795
|
-
file_name = "recce_state.json"
|
|
796
|
-
if state_loader.state_file:
|
|
797
|
-
file_name = os.path.basename(state_loader.state_file)
|
|
798
|
-
|
|
799
|
-
state = state_loader.state
|
|
800
|
-
if state_loader.state is None:
|
|
801
|
-
state = context.export_state()
|
|
802
|
-
|
|
803
|
-
response = state_manager.share_state(file_name, state)
|
|
804
|
-
|
|
805
|
-
return ShareStateOutput(**response)
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
class VersionOut(BaseModel):
|
|
809
|
-
version: str
|
|
810
|
-
latestVersion: str
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
@app.get("/api/version", response_model=VersionOut)
|
|
814
|
-
async def version():
|
|
815
|
-
try:
|
|
816
|
-
return dict(
|
|
817
|
-
version=__version__,
|
|
818
|
-
latestVersion=__latest_version__,
|
|
819
|
-
)
|
|
820
|
-
except Exception as e:
|
|
821
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
@app.websocket("/api/ws")
|
|
825
|
-
async def websocket_endpoint(websocket: WebSocket):
|
|
826
|
-
await websocket.accept()
|
|
827
|
-
clients.add(websocket)
|
|
828
|
-
try:
|
|
829
|
-
while True:
|
|
830
|
-
data = await websocket.receive_text()
|
|
831
|
-
if data == "ping":
|
|
832
|
-
await websocket.send_text("pong")
|
|
833
|
-
except WebSocketDisconnect:
|
|
834
|
-
clients.remove(websocket)
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
async def broadcast(data: str):
|
|
838
|
-
for client in clients:
|
|
839
|
-
await client.send_text(data)
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
@app.post("/api/connect")
|
|
843
|
-
async def generate_connect_to_cloud_url(background_tasks: BackgroundTasks):
|
|
844
|
-
if is_callback_server_running():
|
|
845
|
-
return {"connection_url": get_connection_url()}
|
|
846
|
-
|
|
847
|
-
private_key, public_key = generate_key_pair()
|
|
848
|
-
connection_url, callback_port = prepare_connection_url(public_key)
|
|
849
|
-
|
|
850
|
-
background_tasks.add_task(connect_to_cloud_background_task, private_key, callback_port, connection_url)
|
|
851
|
-
return {
|
|
852
|
-
"connection_url": connection_url,
|
|
853
|
-
}
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
@app.get("/api/users")
|
|
857
|
-
async def get_user_info():
|
|
858
|
-
from recce.connect_to_cloud import RecceCloud
|
|
859
|
-
|
|
860
|
-
context = default_context()
|
|
861
|
-
user_token = get_recce_api_token() or context.state_loader.token
|
|
862
|
-
cloud = RecceCloud(user_token)
|
|
863
|
-
try:
|
|
864
|
-
user_info = cloud.get_user_info()
|
|
865
|
-
return user_info
|
|
866
|
-
except Exception as e:
|
|
867
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
api_prefix = "/api"
|
|
871
|
-
app.include_router(check_router, prefix=api_prefix)
|
|
872
|
-
app.include_router(check_events_router, prefix=api_prefix)
|
|
873
|
-
app.include_router(run_router, prefix=api_prefix)
|
|
874
|
-
|
|
875
|
-
static_folder_path = Path(__file__).parent / "data"
|
|
876
|
-
|
|
877
|
-
app.mount("/", StaticFiles(directory=static_folder_path, html=True), name="static")
|