recce-nightly 1.28.0.20251209__tar.gz → 1.32.0.20260113a0__tar.gz
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.
Potentially problematic release.
This version of recce-nightly might be problematic. Click here for more details.
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/.gitignore +7 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/PKG-INFO +54 -1
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/README.md +53 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/pyproject.toml +6 -0
- recce_nightly-1.32.0.20260113a0/recce/VERSION +1 -0
- recce_nightly-1.32.0.20260113a0/recce/VERSION.bak +1 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/adapter/dbt_adapter/__init__.py +32 -5
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/apis/run_func.py +34 -4
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/cli.py +25 -4
- recce_nightly-1.32.0.20260113a0/recce/data/.gitkeep +0 -0
- recce_nightly-1.32.0.20260113a0/recce/data/404/index.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/404.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +7 -0
- recce_nightly-1.32.0.20260113a0/recce/data/__next.@lineage.!KHNsb3Qp.txt +4 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/__next.__PAGE__.txt +2 -2
- recce_nightly-1.32.0.20260113a0/recce/data/__next._full.txt +33 -0
- recce_nightly-1.32.0.20260113a0/recce/data/__next._head.txt +6 -0
- recce_nightly-1.32.0.20260113a0/recce/data/__next._index.txt +15 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/__next._tree.txt +5 -5
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/058ff74552b21862.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/08774b5f5d2409cf.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/0c8a7df4da7d1abd.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/1123b11b9536380a.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/12a01e1b9d6c9851.js +74 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/12ce527381ac41a0.js +9 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/1c892b1043430ede.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/1e4334d18b8a3acd.css +1 -0
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/dd5140b4046eadf2.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/20e5889b8080b252.js +1 -1
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/2192fa09d635fc40.js +1 -0
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/40369ff1dc5b7b50.css → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/21eb68f20f428055.css +1 -2
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/63b594318aefdc2d.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/22ffdfc5c7ffdcd5.js +1 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/48857f1c174c6f15.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/2982366f89a5f741.js +1 -1
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/2ada8753dabf1032.js +48 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/39999944e7676c4f.js +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/429ab504c7e69752.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/4d678259ce3436b0.js +53 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/541d148d76987a33.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/5c80abea6520f14a.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/5f81d085dcde10f2.js +5 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/77c3815a3f1feea2.js +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/7e750f6f5f5542e3.js +9 -0
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/7af6b9e009c4950d.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/8f55db26be2ff1a8.js +1 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/72f009614a252676.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/94a3ae8b72310f75.js +1 -1
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/94edc22174f48b9a.js +48 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/9d07ac7beaf2f874.js +25 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/a6681c810d31e8c7.js +5 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/a6dad97d9634a72d.js.map +1 -0
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/db4f915776bc2845.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/b860325dc46e47c2.js +1 -1
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/bdfcf621148ad9ee.js +1 -0
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/63f93cb374816cf5.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/c81f26d58461bf9e.js +1 -1
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/d2565e3572b1ead7.js +38 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/de16e4ed3c137fec.js +101 -0
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/f0a8186db2f5c774.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/ebdfbcf5fd8e998e.js +1 -1
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/ed46900f63166b58.css +3 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/f2c59bf02f955ace.css +1 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/turbopack-0e990351bb10571c.js +4 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._full.txt +24 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._head.txt +6 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._index.txt +13 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_not-found/__next._not-found.__PAGE__.txt +2 -2
- recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._not-found.txt +4 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_not-found/__next._tree.txt +4 -4
- recce_nightly-1.32.0.20260113a0/recce/data/_not-found/index.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/_not-found/index.txt +24 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/__next.@lineage.__DEFAULT__.txt +7 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/__next._full.txt +35 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/__next._head.txt +6 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/__next._index.txt +15 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/checks/__next._tree.txt +5 -5
- recce_nightly-1.32.0.20260113a0/recce/data/checks/__next.checks.__PAGE__.txt +10 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/__next.checks.txt +4 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/index.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/checks/index.txt +35 -0
- recce_nightly-1.32.0.20260113a0/recce/data/index.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/index.txt +33 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next.@lineage.__DEFAULT__.txt +7 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next._full.txt +35 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next._head.txt +6 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next._index.txt +15 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/lineage/__next._tree.txt +5 -5
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next.lineage.__PAGE__.txt +9 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next.lineage.txt +4 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/index.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/lineage/index.txt +35 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/__next.@lineage.__DEFAULT__.txt +7 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/__next._full.txt +35 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/__next._head.txt +6 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/__next._index.txt +15 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/query/__next._tree.txt +5 -5
- recce_nightly-1.32.0.20260113a0/recce/data/query/__next.query.__PAGE__.txt +9 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/__next.query.txt +4 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/index.html +2 -0
- recce_nightly-1.32.0.20260113a0/recce/data/query/index.txt +35 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/mcp_server.py +167 -7
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/models/check.py +10 -2
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/models/run.py +0 -3
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/server.py +37 -13
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/state/cloud.py +2 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/summary.py +2 -1
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/profile.py +2 -2
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/query.py +40 -3
- recce_nightly-1.32.0.20260113a0/recce/tasks/utils.py +147 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/valuediff.py +84 -56
- recce_nightly-1.32.0.20260113a0/recce/util/startup_perf.py +121 -0
- recce_nightly-1.28.0.20251209/recce/VERSION +0 -1
- recce_nightly-1.28.0.20251209/recce/data/404/index.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/404.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +0 -7
- recce_nightly-1.28.0.20251209/recce/data/__next.@lineage.!KHNsb3Qp.txt +0 -4
- recce_nightly-1.28.0.20251209/recce/data/__next._full.txt +0 -35
- recce_nightly-1.28.0.20251209/recce/data/__next._head.txt +0 -8
- recce_nightly-1.28.0.20251209/recce/data/__next._index.txt +0 -14
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/03a9f660eee5f777.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/3c7f9a06e33a98ca.js +0 -2
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/5446e6c4a01fe7c0.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/5aef0a152973baa8.js +0 -12
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/5c49254ff269fc82.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/622f135facf78f1f.js +0 -74
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/68e9cd43ead46917.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/6b4b4dffb698ebdb.js +0 -11
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/77ab380a2a4dc5fe.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/79e2d13fd82aec69.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/81d5d38f7c8b4bfd.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/8feaa72f5cf4b1dc.css +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/94fa10300f3cc582.js +0 -2
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/984caf6780ed1965.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/a816ce940eec7aa2.js +0 -12
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/a9e01bfedb9ed8c8.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/b69179b21c87ac9e.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/b81354054d870d99.js +0 -34
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/b9167add58023d83.css +0 -2
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/bc5bce953a0a9fc6.js +0 -4
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/c29894d253872163.js +0 -2
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/d0f91117d77ff844.css +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/d8f63730019fbf31.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/e8f1d88e8830b26e.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/f433735613c135f2.js +0 -1
- recce_nightly-1.28.0.20251209/recce/data/_next/static/chunks/turbopack-2358a01b5520316b.js +0 -3
- recce_nightly-1.28.0.20251209/recce/data/_next/static/media/reload-image.7aa931c7.svg +0 -4
- recce_nightly-1.28.0.20251209/recce/data/_not-found/__next._full.txt +0 -24
- recce_nightly-1.28.0.20251209/recce/data/_not-found/__next._head.txt +0 -8
- recce_nightly-1.28.0.20251209/recce/data/_not-found/__next._index.txt +0 -13
- recce_nightly-1.28.0.20251209/recce/data/_not-found/__next._not-found.txt +0 -4
- recce_nightly-1.28.0.20251209/recce/data/_not-found/index.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/_not-found/index.txt +0 -24
- recce_nightly-1.28.0.20251209/recce/data/checks/__next.@lineage.__DEFAULT__.txt +0 -7
- recce_nightly-1.28.0.20251209/recce/data/checks/__next._full.txt +0 -38
- recce_nightly-1.28.0.20251209/recce/data/checks/__next._head.txt +0 -8
- recce_nightly-1.28.0.20251209/recce/data/checks/__next._index.txt +0 -14
- recce_nightly-1.28.0.20251209/recce/data/checks/__next.checks.__PAGE__.txt +0 -10
- recce_nightly-1.28.0.20251209/recce/data/checks/__next.checks.txt +0 -4
- recce_nightly-1.28.0.20251209/recce/data/checks/index.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/checks/index.txt +0 -38
- recce_nightly-1.28.0.20251209/recce/data/index.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/index.txt +0 -35
- recce_nightly-1.28.0.20251209/recce/data/lineage/__next.@lineage.__DEFAULT__.txt +0 -7
- recce_nightly-1.28.0.20251209/recce/data/lineage/__next._full.txt +0 -38
- recce_nightly-1.28.0.20251209/recce/data/lineage/__next._head.txt +0 -8
- recce_nightly-1.28.0.20251209/recce/data/lineage/__next._index.txt +0 -14
- recce_nightly-1.28.0.20251209/recce/data/lineage/__next.lineage.__PAGE__.txt +0 -10
- recce_nightly-1.28.0.20251209/recce/data/lineage/__next.lineage.txt +0 -4
- recce_nightly-1.28.0.20251209/recce/data/lineage/index.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/lineage/index.txt +0 -38
- recce_nightly-1.28.0.20251209/recce/data/query/__next.@lineage.__DEFAULT__.txt +0 -7
- recce_nightly-1.28.0.20251209/recce/data/query/__next._full.txt +0 -36
- recce_nightly-1.28.0.20251209/recce/data/query/__next._head.txt +0 -8
- recce_nightly-1.28.0.20251209/recce/data/query/__next._index.txt +0 -14
- recce_nightly-1.28.0.20251209/recce/data/query/__next.query.__PAGE__.txt +0 -9
- recce_nightly-1.28.0.20251209/recce/data/query/__next.query.txt +0 -4
- recce_nightly-1.28.0.20251209/recce/data/query/index.html +0 -2
- recce_nightly-1.28.0.20251209/recce/data/query/index.txt +0 -36
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/LICENSE +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/adapter/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/adapter/base.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/adapter/sqlmesh_adapter.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/apis/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/apis/check_api.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/apis/check_events_api.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/apis/check_func.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/apis/run_api.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/artifact.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/config.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/connect_to_cloud.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/core.py +0 -0
- {recce_nightly-1.28.0.20251209/recce/data/_next/static/W5IpX473A-83qLxSMSYNL → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/98tBhkYDWuAefdA7Ln9XX}/_buildManifest.js +0 -0
- {recce_nightly-1.28.0.20251209/recce/data/_next/static/W5IpX473A-83qLxSMSYNL → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/98tBhkYDWuAefdA7Ln9XX}/_clientMiddlewareManifest.json +0 -0
- {recce_nightly-1.28.0.20251209/recce/data/_next/static/W5IpX473A-83qLxSMSYNL → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/98tBhkYDWuAefdA7Ln9XX}/_ssgManifest.js +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/5c4dfb0d09eaa401.js +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/6d8557f062aa4386.css +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/923964f18c87d0f1.css +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/auth_callback.html +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/favicon.ico +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/imgs/feedback/thumbs-down.png +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/imgs/feedback/thumbs-up.png +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/imgs/reload-image.svg +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/data/logo/recce-logo-white.png +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/diff.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/event/CONFIG +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/event/CONFIG.bak +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/event/SENTRY_DNS +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/event/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/event/collector.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/event/track.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/exceptions.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/git.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/github.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/models/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/models/types.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/pull_request.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/run.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/state/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/state/const.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/state/local.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/state/state.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/state/state_loader.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/core.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/dataframe.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/histogram.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/lineage.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/rowcount.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/schema.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/tasks/top_k.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/api_token.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/breaking.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/cache.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/cll.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/__init__.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/base.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/check_events.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/checks.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/io.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/lineage.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/logger.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/onboarding_state.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/perf_tracking.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/pydantic_model.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/recce_cloud.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/util/singleton.py +0 -0
- {recce_nightly-1.28.0.20251209 → recce_nightly-1.32.0.20260113a0}/recce/yaml/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: recce-nightly
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.32.0.20260113a0
|
|
4
4
|
Summary: Environment diff tool for dbt
|
|
5
5
|
Project-URL: Bug Tracker, https://github.com/InfuseAI/recce/issues
|
|
6
6
|
Project-URL: Homepage, https://github.com/InfuseAI/recce
|
|
@@ -88,6 +88,7 @@ Description-Content-Type: text/markdown
|
|
|
88
88
|
</p>
|
|
89
89
|
|
|
90
90
|
## Trust, Verify, Ship
|
|
91
|
+
|
|
91
92
|
Cut dbt review time by 90% and ship accurate data fast
|
|
92
93
|
|
|
93
94
|
Recce gives data teams a faster, more reliable way to understand, review, and ship changes without all the guesswork or manual overhead.
|
|
@@ -99,12 +100,14 @@ Recce gives data teams a faster, more reliable way to understand, review, and sh
|
|
|
99
100
|
Recce offers two packages to fit different use cases:
|
|
100
101
|
|
|
101
102
|
**For full local development and Recce Cloud features:**
|
|
103
|
+
|
|
102
104
|
```bash
|
|
103
105
|
pip install -U recce
|
|
104
106
|
recce server
|
|
105
107
|
```
|
|
106
108
|
|
|
107
109
|
**For CI/CD artifact uploads only (lightweight):**
|
|
110
|
+
|
|
108
111
|
```bash
|
|
109
112
|
pip install -U recce-cloud
|
|
110
113
|
recce-cloud upload
|
|
@@ -122,6 +125,8 @@ pip install -U recce
|
|
|
122
125
|
recce server
|
|
123
126
|
```
|
|
124
127
|
|
|
128
|
+
(Note: while recce is not version spsecific, `dbt-core` is currently [not compatible with Python 3.13](https://docs.getdbt.com/faqs/Core/install-python-compatibility). Please make sure to use Python 3.10 - 3.12.)
|
|
129
|
+
|
|
125
130
|
This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you'll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.reccehq.com/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.reccehq.com/get-started-jaffle-shop/) to try it out step-by-step.
|
|
126
131
|
|
|
127
132
|
## What You Get
|
|
@@ -167,6 +172,54 @@ Ready to collaborate and move faster as a team? Recce Cloud adds real-time colla
|
|
|
167
172
|
Recce Cloud is a hosted version of Recce that standardizes your workflow, keeps teams aligned, and reduces errors—so you can ship data changes with confidence.
|
|
168
173
|
👉 [View Pricing and Plans](https://reccehq.com/pricing)
|
|
169
174
|
|
|
175
|
+
## Developer Documentation
|
|
176
|
+
|
|
177
|
+
If you want to contribute to Recce or test local changes in your dbt project, follow these steps to install the development version.
|
|
178
|
+
|
|
179
|
+
### Installing the Local Dev Version
|
|
180
|
+
|
|
181
|
+
1. **Clone the repository** (if you haven't already):
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
git clone https://github.com/DataRecce/recce.git
|
|
185
|
+
cd recce
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
2. **Build the project** from the repository root:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
make build
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
This builds the frontend assets and prepares the package for installation.
|
|
195
|
+
|
|
196
|
+
3. **Install the local dev version** in your dbt project:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Navigate to your dbt project
|
|
200
|
+
cd /path/to/your/dbt-project
|
|
201
|
+
|
|
202
|
+
# Install recce in editable mode (replace with your actual path to the recce repo)
|
|
203
|
+
pip install -e /path/to/recce
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Using `-e` (editable mode) means any changes you make to the Recce source code will be immediately available without reinstalling.
|
|
207
|
+
|
|
208
|
+
4. **Start the Recce server** to verify the installation:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
recce server
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Development Tips
|
|
215
|
+
|
|
216
|
+
- After making frontend changes in `js/`, run `make build` again to rebuild the static assets
|
|
217
|
+
- Run `make install-dev` in the recce repository to install development dependencies
|
|
218
|
+
- Use `make test` to run the Python test suite
|
|
219
|
+
- Use `cd js && pnpm test` to run the frontend test suite
|
|
220
|
+
|
|
221
|
+
For more detailed development guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
222
|
+
|
|
170
223
|
## Community & Support
|
|
171
224
|
|
|
172
225
|
Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
</p>
|
|
28
28
|
|
|
29
29
|
## Trust, Verify, Ship
|
|
30
|
+
|
|
30
31
|
Cut dbt review time by 90% and ship accurate data fast
|
|
31
32
|
|
|
32
33
|
Recce gives data teams a faster, more reliable way to understand, review, and ship changes without all the guesswork or manual overhead.
|
|
@@ -38,12 +39,14 @@ Recce gives data teams a faster, more reliable way to understand, review, and sh
|
|
|
38
39
|
Recce offers two packages to fit different use cases:
|
|
39
40
|
|
|
40
41
|
**For full local development and Recce Cloud features:**
|
|
42
|
+
|
|
41
43
|
```bash
|
|
42
44
|
pip install -U recce
|
|
43
45
|
recce server
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
**For CI/CD artifact uploads only (lightweight):**
|
|
49
|
+
|
|
47
50
|
```bash
|
|
48
51
|
pip install -U recce-cloud
|
|
49
52
|
recce-cloud upload
|
|
@@ -61,6 +64,8 @@ pip install -U recce
|
|
|
61
64
|
recce server
|
|
62
65
|
```
|
|
63
66
|
|
|
67
|
+
(Note: while recce is not version spsecific, `dbt-core` is currently [not compatible with Python 3.13](https://docs.getdbt.com/faqs/Core/install-python-compatibility). Please make sure to use Python 3.10 - 3.12.)
|
|
68
|
+
|
|
64
69
|
This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you'll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.reccehq.com/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.reccehq.com/get-started-jaffle-shop/) to try it out step-by-step.
|
|
65
70
|
|
|
66
71
|
## What You Get
|
|
@@ -106,6 +111,54 @@ Ready to collaborate and move faster as a team? Recce Cloud adds real-time colla
|
|
|
106
111
|
Recce Cloud is a hosted version of Recce that standardizes your workflow, keeps teams aligned, and reduces errors—so you can ship data changes with confidence.
|
|
107
112
|
👉 [View Pricing and Plans](https://reccehq.com/pricing)
|
|
108
113
|
|
|
114
|
+
## Developer Documentation
|
|
115
|
+
|
|
116
|
+
If you want to contribute to Recce or test local changes in your dbt project, follow these steps to install the development version.
|
|
117
|
+
|
|
118
|
+
### Installing the Local Dev Version
|
|
119
|
+
|
|
120
|
+
1. **Clone the repository** (if you haven't already):
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
git clone https://github.com/DataRecce/recce.git
|
|
124
|
+
cd recce
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
2. **Build the project** from the repository root:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
make build
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
This builds the frontend assets and prepares the package for installation.
|
|
134
|
+
|
|
135
|
+
3. **Install the local dev version** in your dbt project:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Navigate to your dbt project
|
|
139
|
+
cd /path/to/your/dbt-project
|
|
140
|
+
|
|
141
|
+
# Install recce in editable mode (replace with your actual path to the recce repo)
|
|
142
|
+
pip install -e /path/to/recce
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Using `-e` (editable mode) means any changes you make to the Recce source code will be immediately available without reinstalling.
|
|
146
|
+
|
|
147
|
+
4. **Start the Recce server** to verify the installation:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
recce server
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Development Tips
|
|
154
|
+
|
|
155
|
+
- After making frontend changes in `js/`, run `make build` again to rebuild the static assets
|
|
156
|
+
- Run `make install-dev` in the recce repository to install development dependencies
|
|
157
|
+
- Use `make test` to run the Python test suite
|
|
158
|
+
- Use `cd js && pnpm test` to run the frontend test suite
|
|
159
|
+
|
|
160
|
+
For more detailed development guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
161
|
+
|
|
109
162
|
## Community & Support
|
|
110
163
|
|
|
111
164
|
Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
|
|
@@ -83,9 +83,15 @@ pattern = "(?P<version>.+)"
|
|
|
83
83
|
include = [
|
|
84
84
|
"/recce",
|
|
85
85
|
]
|
|
86
|
+
artifacts = [
|
|
87
|
+
"/recce/data",
|
|
88
|
+
]
|
|
86
89
|
|
|
87
90
|
[tool.hatch.build.targets.wheel]
|
|
88
91
|
packages = ["recce"]
|
|
92
|
+
artifacts = [
|
|
93
|
+
"/recce/data",
|
|
94
|
+
]
|
|
89
95
|
|
|
90
96
|
[tool.uv.workspace]
|
|
91
97
|
members = ["recce_cloud"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.32.0.20260113a0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.32.0.dev0
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
+
import time
|
|
4
5
|
import uuid
|
|
5
6
|
from contextlib import contextmanager
|
|
6
7
|
from copy import deepcopy
|
|
@@ -32,6 +33,7 @@ from recce.util.lineage import (
|
|
|
32
33
|
find_upstream,
|
|
33
34
|
)
|
|
34
35
|
from recce.util.perf_tracking import LineagePerfTracker
|
|
36
|
+
from recce.util.startup_perf import track_timing
|
|
35
37
|
|
|
36
38
|
from ...tasks.profile import ProfileTask
|
|
37
39
|
from ...util.breaking import BreakingPerformanceTracking, parse_change_category
|
|
@@ -215,6 +217,7 @@ def as_manifest(m: WritableManifest) -> Manifest:
|
|
|
215
217
|
return result
|
|
216
218
|
|
|
217
219
|
|
|
220
|
+
@track_timing(record_size=True)
|
|
218
221
|
def load_manifest(path: str = None, data: dict = None):
|
|
219
222
|
if path is not None:
|
|
220
223
|
if not os.path.isfile(path):
|
|
@@ -224,6 +227,7 @@ def load_manifest(path: str = None, data: dict = None):
|
|
|
224
227
|
return WritableManifest.upgrade_schema_version(data)
|
|
225
228
|
|
|
226
229
|
|
|
230
|
+
@track_timing(record_size=True)
|
|
227
231
|
def load_catalog(path: str = None, data: dict = None):
|
|
228
232
|
if path is not None:
|
|
229
233
|
if not os.path.isfile(path):
|
|
@@ -282,7 +286,10 @@ class DbtArgs:
|
|
|
282
286
|
target_path: Optional[str] = (None,)
|
|
283
287
|
project_only_flags: Optional[Dict[str, Any]] = None
|
|
284
288
|
which: Optional[str] = None
|
|
285
|
-
|
|
289
|
+
# Behavior flags - need to be present on args object for set_from_args
|
|
290
|
+
state_modified_compare_more_unrendered_values: Optional[bool] = True # dbt v1.9
|
|
291
|
+
require_unique_project_resource_names: Optional[bool] = False # dbt v1.11
|
|
292
|
+
require_ref_searches_node_package_before_root: Optional[bool] = False # dbt v1.11
|
|
286
293
|
|
|
287
294
|
|
|
288
295
|
@dataclass
|
|
@@ -476,6 +483,7 @@ class DbtAdapter(BaseAdapter):
|
|
|
476
483
|
|
|
477
484
|
return result
|
|
478
485
|
|
|
486
|
+
@track_timing("artifact_load")
|
|
479
487
|
def load_artifacts(self):
|
|
480
488
|
"""
|
|
481
489
|
Load the artifacts from the 'target' and 'target-base' directory
|
|
@@ -491,16 +499,20 @@ class DbtAdapter(BaseAdapter):
|
|
|
491
499
|
|
|
492
500
|
# load the artifacts
|
|
493
501
|
path = os.path.join(project_root, target_path, "manifest.json")
|
|
494
|
-
curr_manifest = load_manifest(path=path)
|
|
502
|
+
curr_manifest = load_manifest(path=path, timing_name="curr_manifest")
|
|
495
503
|
if curr_manifest is None:
|
|
496
504
|
raise FileNotFoundError(ENOENT, os.strerror(ENOENT), path)
|
|
497
505
|
path = os.path.join(project_root, target_base_path, "manifest.json")
|
|
498
|
-
base_manifest = load_manifest(path=path)
|
|
506
|
+
base_manifest = load_manifest(path=path, timing_name="base_manifest")
|
|
499
507
|
if base_manifest is None:
|
|
500
508
|
raise FileNotFoundError(ENOENT, os.strerror(ENOENT), path)
|
|
501
509
|
|
|
502
|
-
curr_catalog = load_catalog(
|
|
503
|
-
|
|
510
|
+
curr_catalog = load_catalog(
|
|
511
|
+
path=os.path.join(project_root, target_path, "catalog.json"), timing_name="curr_catalog"
|
|
512
|
+
)
|
|
513
|
+
base_catalog = load_catalog(
|
|
514
|
+
path=os.path.join(project_root, target_base_path, "catalog.json"), timing_name="base_catalog"
|
|
515
|
+
)
|
|
504
516
|
|
|
505
517
|
# set the value if all the artifacts are loaded successfully
|
|
506
518
|
self.curr_manifest = curr_manifest
|
|
@@ -804,10 +816,15 @@ class DbtAdapter(BaseAdapter):
|
|
|
804
816
|
|
|
805
817
|
@lru_cache(maxsize=1)
|
|
806
818
|
def _get_lineage_diff_cached(self, cache_key) -> LineageDiff:
|
|
819
|
+
start_time = time.perf_counter_ns()
|
|
820
|
+
|
|
807
821
|
base = self.get_lineage(base=True)
|
|
808
822
|
current = self.get_lineage(base=False)
|
|
809
823
|
|
|
824
|
+
select_start = time.perf_counter_ns()
|
|
810
825
|
modified_nodes = self.select_nodes(select="state:modified")
|
|
826
|
+
select_elapsed_ms = (time.perf_counter_ns() - select_start) / 1_000_000
|
|
827
|
+
|
|
811
828
|
diff = {}
|
|
812
829
|
for node_id in modified_nodes:
|
|
813
830
|
base_node = base.get("nodes", {}).get(node_id)
|
|
@@ -819,6 +836,16 @@ class DbtAdapter(BaseAdapter):
|
|
|
819
836
|
elif curr_node:
|
|
820
837
|
diff[node_id] = NodeDiff(change_status="added")
|
|
821
838
|
|
|
839
|
+
total_elapsed_ms = (time.perf_counter_ns() - start_time) / 1_000_000
|
|
840
|
+
log_performance(
|
|
841
|
+
"lineage diff",
|
|
842
|
+
{
|
|
843
|
+
"total_elapsed_ms": total_elapsed_ms,
|
|
844
|
+
"select_modified_elapsed_ms": select_elapsed_ms,
|
|
845
|
+
"modified_nodes": len(modified_nodes),
|
|
846
|
+
},
|
|
847
|
+
)
|
|
848
|
+
|
|
822
849
|
return LineageDiff(
|
|
823
850
|
base=base,
|
|
824
851
|
current=current,
|
|
@@ -74,7 +74,8 @@ def generate_run_name(run):
|
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
def create_task(run_type: RunType, params: dict):
|
|
77
|
-
|
|
77
|
+
context = default_context()
|
|
78
|
+
if context is not None and context.adapter_type == "sqlmesh":
|
|
78
79
|
from recce.adapter.sqlmesh_adapter import (
|
|
79
80
|
sqlmesh_supported_registry as sqlmesh_registry,
|
|
80
81
|
)
|
|
@@ -122,12 +123,16 @@ def submit_run(type, params, check_id=None):
|
|
|
122
123
|
|
|
123
124
|
task.progress_listener = progress_listener
|
|
124
125
|
|
|
125
|
-
async def update_run_result(
|
|
126
|
+
async def update_run_result(run, result, error, updated_params=None):
|
|
127
|
+
"""Update run with result, error, and optionally updated params."""
|
|
126
128
|
if run is None:
|
|
127
129
|
return
|
|
128
130
|
if result is not None:
|
|
129
131
|
run.result = result
|
|
130
132
|
run.status = RunStatus.FINISHED
|
|
133
|
+
if updated_params is not None:
|
|
134
|
+
# Merge updated params (preserves any fields not in updated_params)
|
|
135
|
+
run.params.update(updated_params)
|
|
131
136
|
if error is not None:
|
|
132
137
|
failed_reason = str(error) if str(error) != "None" else repr(error)
|
|
133
138
|
run.error = failed_reason
|
|
@@ -138,10 +143,35 @@ def submit_run(type, params, check_id=None):
|
|
|
138
143
|
def fn():
|
|
139
144
|
try:
|
|
140
145
|
result = task.execute()
|
|
141
|
-
|
|
146
|
+
|
|
147
|
+
# Extract updated params from task after execution
|
|
148
|
+
updated_params = None
|
|
149
|
+
if hasattr(task, "params") and task.params is not None:
|
|
150
|
+
# Serialization logic:
|
|
151
|
+
# - Most tasks use Pydantic models (v2: model_dump, v1: dict)
|
|
152
|
+
# - Some tasks may use plain dicts
|
|
153
|
+
# - If params is an unexpected type, log a warning for debugging
|
|
154
|
+
# - Handle the case where model_dump() or dict() raises an exception.
|
|
155
|
+
try:
|
|
156
|
+
if hasattr(task.params, "model_dump"):
|
|
157
|
+
updated_params = task.params.model_dump()
|
|
158
|
+
elif hasattr(task.params, "dict"):
|
|
159
|
+
updated_params = task.params.dict()
|
|
160
|
+
elif isinstance(task.params, dict):
|
|
161
|
+
updated_params = task.params
|
|
162
|
+
else:
|
|
163
|
+
logger.warning(
|
|
164
|
+
f"Could not serialize task.params for run_id={run.run_id}: "
|
|
165
|
+
f"unexpected type {type(task.params)} with value {repr(task.params)}"
|
|
166
|
+
)
|
|
167
|
+
except Exception as e:
|
|
168
|
+
logger.warning(f"Failed to serialize task.params: {e}")
|
|
169
|
+
updated_params = None
|
|
170
|
+
|
|
171
|
+
asyncio.run_coroutine_threadsafe(update_run_result(run, result, None, updated_params), loop)
|
|
142
172
|
return result
|
|
143
173
|
except BaseException as e:
|
|
144
|
-
asyncio.run_coroutine_threadsafe(update_run_result(run
|
|
174
|
+
asyncio.run_coroutine_threadsafe(update_run_result(run, None, e, None), loop)
|
|
145
175
|
if isinstance(e, RecceException) and e.is_raise is False:
|
|
146
176
|
return None
|
|
147
177
|
import sentry_sdk
|
|
@@ -37,6 +37,7 @@ from recce.util.onboarding_state import update_onboarding_state
|
|
|
37
37
|
from recce.util.recce_cloud import (
|
|
38
38
|
RecceCloudException,
|
|
39
39
|
)
|
|
40
|
+
from recce.util.startup_perf import track_timing
|
|
40
41
|
|
|
41
42
|
from .core import RecceContext, set_default_context
|
|
42
43
|
from .event.track import TrackCommand
|
|
@@ -76,6 +77,7 @@ def patch_derived_args(args):
|
|
|
76
77
|
args["review"] = True
|
|
77
78
|
|
|
78
79
|
|
|
80
|
+
@track_timing("state_loader_init")
|
|
79
81
|
def create_state_loader_by_args(state_file=None, **kwargs):
|
|
80
82
|
"""
|
|
81
83
|
Create a state loader based on CLI arguments.
|
|
@@ -529,12 +531,19 @@ def server(host, port, lifetime, idle_timeout=0, state_file=None, **kwargs):
|
|
|
529
531
|
|
|
530
532
|
RecceConfig(config_file=kwargs.get("config"))
|
|
531
533
|
|
|
534
|
+
# Initialize startup performance tracking
|
|
535
|
+
from recce.util.startup_perf import StartupPerfTracker, set_startup_tracker
|
|
536
|
+
|
|
537
|
+
startup_tracker = StartupPerfTracker()
|
|
538
|
+
set_startup_tracker(startup_tracker)
|
|
539
|
+
|
|
532
540
|
handle_debug_flag(**kwargs)
|
|
533
541
|
patch_derived_args(kwargs)
|
|
534
542
|
|
|
535
543
|
server_mode = kwargs.get("mode") if kwargs.get("mode") else RecceServerMode.server
|
|
536
544
|
is_review = kwargs.get("review", False)
|
|
537
545
|
is_cloud = kwargs.get("cloud", False)
|
|
546
|
+
startup_tracker.set_cloud_mode(is_cloud)
|
|
538
547
|
flag = {
|
|
539
548
|
"single_env_onboarding": False,
|
|
540
549
|
"show_relaunch_hint": False,
|
|
@@ -580,8 +589,13 @@ def server(host, port, lifetime, idle_timeout=0, state_file=None, **kwargs):
|
|
|
580
589
|
update_onboarding_state(api_token, flag.get("single_env_onboarding"))
|
|
581
590
|
|
|
582
591
|
# Create state loader using shared function
|
|
592
|
+
from recce.util.startup_perf import get_startup_tracker
|
|
593
|
+
|
|
583
594
|
state_loader = create_state_loader_by_args(state_file, **kwargs)
|
|
584
595
|
|
|
596
|
+
if (tracker := get_startup_tracker()) and hasattr(state_loader, "catalog"):
|
|
597
|
+
tracker.set_catalog_type(state_loader.catalog)
|
|
598
|
+
|
|
585
599
|
if not state_loader.verify():
|
|
586
600
|
error, hint = state_loader.error_and_hint
|
|
587
601
|
console.print(f"[[red]Error[/red]] {error}")
|
|
@@ -1734,6 +1748,7 @@ def read_only(ctx, state_file=None, **kwargs):
|
|
|
1734
1748
|
|
|
1735
1749
|
|
|
1736
1750
|
@cli.command(cls=TrackCommand)
|
|
1751
|
+
@click.argument("state_file", required=False)
|
|
1737
1752
|
@click.option("--sse", is_flag=True, default=False, help="Start in HTTP/SSE mode instead of stdio mode")
|
|
1738
1753
|
@click.option("--host", default="localhost", help="Host to bind to in SSE mode (default: localhost)")
|
|
1739
1754
|
@click.option("--port", default=8000, type=int, help="Port to bind to in SSE mode (default: 8000)")
|
|
@@ -1744,7 +1759,7 @@ def read_only(ctx, state_file=None, **kwargs):
|
|
|
1744
1759
|
@add_options(recce_cloud_options)
|
|
1745
1760
|
@add_options(recce_cloud_auth_options)
|
|
1746
1761
|
@add_options(recce_hidden_options)
|
|
1747
|
-
def mcp_server(sse, host, port, **kwargs):
|
|
1762
|
+
def mcp_server(state_file, sse, host, port, **kwargs):
|
|
1748
1763
|
"""
|
|
1749
1764
|
Start the Recce MCP (Model Context Protocol) server
|
|
1750
1765
|
|
|
@@ -1752,12 +1767,18 @@ def mcp_server(sse, host, port, **kwargs):
|
|
|
1752
1767
|
with Recce's data validation capabilities. By default, it uses stdio for
|
|
1753
1768
|
communication. Use --sse to enable HTTP/Server-Sent Events mode instead.
|
|
1754
1769
|
|
|
1770
|
+
STATE_FILE is the path to the recce state file (optional).
|
|
1771
|
+
|
|
1755
1772
|
Examples:\n
|
|
1756
1773
|
|
|
1757
1774
|
\b
|
|
1758
1775
|
# Start the MCP server in stdio mode (default)
|
|
1759
1776
|
recce mcp-server
|
|
1760
1777
|
|
|
1778
|
+
\b
|
|
1779
|
+
# Start with a state file
|
|
1780
|
+
recce mcp-server recce_state.json
|
|
1781
|
+
|
|
1761
1782
|
\b
|
|
1762
1783
|
# Start in HTTP/SSE mode on default port 8000
|
|
1763
1784
|
recce mcp-server --sse
|
|
@@ -1793,10 +1814,10 @@ def mcp_server(sse, host, port, **kwargs):
|
|
|
1793
1814
|
show_invalid_api_token_message()
|
|
1794
1815
|
exit(1)
|
|
1795
1816
|
|
|
1796
|
-
# Create state loader using shared function (
|
|
1817
|
+
# Create state loader using shared function (for cloud mode or when state_file is provided)
|
|
1797
1818
|
is_cloud = kwargs.get("cloud", False)
|
|
1798
|
-
if is_cloud:
|
|
1799
|
-
state_loader = create_state_loader_by_args(
|
|
1819
|
+
if is_cloud or state_file:
|
|
1820
|
+
state_loader = create_state_loader_by_args(state_file, **kwargs)
|
|
1800
1821
|
kwargs["state_loader"] = state_loader
|
|
1801
1822
|
|
|
1802
1823
|
try:
|
|
File without changes
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!DOCTYPE html><!--98tBhkYDWuAefdA7Ln9XX--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/logo/recce-logo-white.png"/><link rel="stylesheet" href="/_next/static/chunks/f2c59bf02f955ace.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/ed46900f63166b58.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/6d8557f062aa4386.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/1e4334d18b8a3acd.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/923964f18c87d0f1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1123b11b9536380a.js"/><script src="/_next/static/chunks/2192fa09d635fc40.js" async=""></script><script src="/_next/static/chunks/a6681c810d31e8c7.js" async=""></script><script src="/_next/static/chunks/turbopack-0e990351bb10571c.js" async=""></script><script src="/_next/static/chunks/058ff74552b21862.js" async=""></script><script src="/_next/static/chunks/22ffdfc5c7ffdcd5.js" async=""></script><script src="/_next/static/chunks/12ce527381ac41a0.js" async=""></script><script src="/_next/static/chunks/541d148d76987a33.js" async=""></script><script src="/_next/static/chunks/4d678259ce3436b0.js" async=""></script><script src="/_next/static/chunks/9d07ac7beaf2f874.js" async=""></script><script src="/_next/static/chunks/de16e4ed3c137fec.js" async=""></script><script src="/_next/static/chunks/d2565e3572b1ead7.js" async=""></script><script src="/_next/static/chunks/b860325dc46e47c2.js" async=""></script><script src="/_next/static/chunks/0c8a7df4da7d1abd.js" async=""></script><script src="/_next/static/chunks/77c3815a3f1feea2.js" async=""></script><script src="/_next/static/chunks/bdfcf621148ad9ee.js" async=""></script><script src="/_next/static/chunks/7e750f6f5f5542e3.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtm.js?id=GTM-M2HVJQFD" as="script"/><title>404: This page could not be found.</title><meta name="robots" content="noindex"/><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><link rel="icon" href="/favicon.ico?favicon.a8d38d84.ico" sizes="32x32" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","light",null,["light","dark"],null,false,true)</script><style data-emotion="css-global 1sm4dhk">html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:#171717;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;background-color:#FFFFFF;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#FFFFFF;}</style><style data-emotion="css lb61rc">.css-lb61rc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh;overflow:hidden;}</style><div class="MuiBox-root css-lb61rc"><style data-emotion="css 1iwwiyf">.css-1iwwiyf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;min-height:40px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#FF6E42;}</style><div class="MuiBox-root css-1iwwiyf"><style data-emotion="css 1cto74x">.css-1cto74x{-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-1cto74x:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1cto74x:hover{color:#225581;}.css-1cto74x:hover{-webkit-text-decoration:none;text-decoration:none;}</style><style data-emotion="css oqdijk">.css-oqdijk{margin:0;font:inherit;line-height:inherit;letter-spacing:inherit;color:#3182CE;font-weight:500;-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-oqdijk:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-oqdijk:hover{color:#225581;}.css-oqdijk:hover{-webkit-text-decoration:none;text-decoration:none;}</style><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineHover css-oqdijk" href="https://reccehq.com/" target="_blank"><style data-emotion="css 15zum9u">.css-15zum9u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-15zum9u"><style data-emotion="css u2at6n">.css-u2at6n{width:20px;height:20px;margin-left:18px;}</style><img class="MuiBox-root css-u2at6n" src="/logo/recce-logo-white.png" alt="recce-logo-white"/><style data-emotion="css a5dmb1">.css-a5dmb1{margin:0;font-weight:600;font-size:1.25rem;line-height:1.4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";color:#fff;font-family:"Montserrat",sans-serif;font-size:1.25rem;}</style><h4 class="MuiTypography-root MuiTypography-h4 css-a5dmb1">RECCE</h4></div></a><style data-emotion="css b1pxe1">.css-b1pxe1{text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--IconButton-hoverBg:rgba(0, 0, 0, 0.04);padding:5px;font-size:1.125rem;border-radius:6px;padding:4px;color:rgba(255, 255, 255, 0.8);}.css-b1pxe1:hover{background-color:var(--IconButton-hoverBg);}@media (hover: none){.css-b1pxe1:hover{background-color:transparent;}}.css-b1pxe1.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}.css-b1pxe1.MuiIconButton-loading{color:transparent;}.css-b1pxe1:hover{background-color:rgba(255, 255, 255, 0.1);}</style><style data-emotion="css 1ksaga0">.css-1ksaga0{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--IconButton-hoverBg:rgba(0, 0, 0, 0.04);padding:5px;font-size:1.125rem;border-radius:6px;padding:4px;color:rgba(255, 255, 255, 0.8);}.css-1ksaga0::-moz-focus-inner{border-style:none;}.css-1ksaga0.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1ksaga0{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1ksaga0:hover{background-color:var(--IconButton-hoverBg);}@media (hover: none){.css-1ksaga0:hover{background-color:transparent;}}.css-1ksaga0.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}.css-1ksaga0.MuiIconButton-loading{color:transparent;}.css-1ksaga0:hover{background-color:rgba(255, 255, 255, 0.1);}</style><button class="MuiButtonBase-root Mui-disabled MuiIconButton-root Mui-disabled MuiIconButton-sizeSmall css-1ksaga0" tabindex="-1" type="button" disabled=""><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" style="width:18px;height:18px" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"></path></svg></button><style data-emotion="css 1jcz15f">.css-1jcz15f{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:rgba(255,255,255,0.8);font-size:sm;text-transform:uppercase;border-width:1px;padding-left:4px;padding-right:4px;border-radius:4.5px;}</style><span class="MuiTypography-root MuiTypography-body1 css-1jcz15f"></span><style data-emotion="css 1rr4qq7">.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="MuiBox-root css-1rr4qq7"></div><style data-emotion="css 9d3kiv">.css-9d3kiv{color:#fff;font-size:0.875rem;font-weight:600;background-color:brand.700;border-radius:6px;padding-left:12px;padding-right:12px;padding-top:4px;padding-bottom:4px;margin-right:8px;cursor:pointer;border:none;}</style><button class="MuiBox-root css-9d3kiv">Connect to Cloud</button></div><style data-emotion="css 1dhtcsx">.css-1dhtcsx{border-bottom:1px solid lightgray;padding-left:12px;padding-right:12px;}</style><div class="MuiBox-root css-1dhtcsx"><style data-emotion="css kkbn2n">.css-kkbn2n{display:grid;grid-template-columns:1fr auto 1fr;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-kkbn2n"><style data-emotion="css 1qlx8uq">.css-1qlx8uq{overflow:hidden;min-height:48px;-webkit-overflow-scrolling:touch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:none;min-height:auto;}@media (max-width:599.95px){.css-1qlx8uq .MuiTabs-scrollButtons{display:none;}}</style><div class="MuiTabs-root css-1qlx8uq"><style data-emotion="css 2xu61f">.css-2xu61f{position:relative;display:inline-block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;white-space:nowrap;overflow-x:hidden;width:100%;}</style><div style="overflow:hidden;margin-bottom:0" class="MuiTabs-scroller MuiTabs-fixed css-2xu61f"><style data-emotion="css 17do188">.css-17do188{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div role="tablist" class="MuiTabs-list MuiTabs-flexContainer css-17do188"><style data-emotion="css 1n2jfwv">.css-1n2jfwv{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1n2jfwv.Mui-selected{color:#3182CE;}.css-1n2jfwv.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><style data-emotion="css 1ameuk9">.css-1ameuk9{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1ameuk9::-moz-focus-inner{border-style:none;}.css-1ameuk9.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1ameuk9{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1ameuk9.Mui-selected{color:#3182CE;}.css-1ameuk9.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-selected Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="true"><style data-emotion="css 171onha">.css-171onha{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;}</style><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/lineage/">Lineage</a></div><style data-emotion="css l6r5ej">.css-l6r5ej{position:absolute;height:2px;bottom:0;width:100%;-webkit-transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;background-color:#3182CE;height:2px;}</style><span class="MuiTabs-indicator css-l6r5ej"></span></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/query/">Query</a></div></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem;display:flex;gap:3px;align-items:center" href="/checks/">Checklist<!-- --> </a></div></button></div></div></div><style data-emotion="css vx1bta">.css-vx1bta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="MuiBox-root css-vx1bta"></div></div></div><div style="display:flex;flex-direction:row;height:100%"><div class="MuiBox-root css-0" style="contain:size"></div><div style="display:flex;flex-direction:column;flex:1;contain:size"><!--$?--><template id="B:0"></template><style data-emotion="css 11iw7t1">.css-11iw7t1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;contain:size;}</style><div class="MuiBox-root css-11iw7t1"><style data-emotion="css tkevr6">.css-tkevr6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:100%;}</style><div class="MuiBox-root css-tkevr6"><style data-emotion="css 18h6s44 animation-61bdi0">.css-18h6s44{display:inline-block;-webkit-animation:animation-61bdi0 1.4s linear infinite;animation:animation-61bdi0 1.4s linear infinite;color:#3182CE;}@-webkit-keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}</style><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-18h6s44" style="width:48px;height:48px" role="progressbar"><style data-emotion="css 4ejps8">.css-4ejps8{display:block;}</style><svg class="MuiCircularProgress-svg css-4ejps8" viewBox="22 22 44 44"><style data-emotion="css 13odlrs animation-1o38n3e">.css-13odlrs{stroke:currentColor;stroke-dasharray:80px,200px;stroke-dashoffset:0;-webkit-animation:animation-1o38n3e 1.4s ease-in-out infinite;animation:animation-1o38n3e 1.4s ease-in-out infinite;}@-webkit-keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}@keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}</style><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-13odlrs" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div></div><!--/$--><style data-emotion="css 10klw3m">.css-10klw3m{height:100%;}</style><div class="MuiBox-root css-10klw3m"></div></div></div></div><style data-emotion="css depviu">@media print{.css-depviu{position:absolute!important;}}</style><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src="/_next/static/chunks/1123b11b9536380a.js" id="_R_" async=""></script><div hidden id="S:0"><style data-emotion="css 18l2koh">.css-18l2koh{padding:0px;contain:content;height:100%;position:relative;}</style><div class="MuiBox-root css-18l2koh"><style data-emotion="css r2yx1p">.css-r2yx1p{display:none;height:100%;position:absolute;inset:0;}</style><div class="MuiBox-root css-r2yx1p"></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
|
|
2
|
+
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[932032,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\"],\"GoogleTagManager\"]\n3:I[825582,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\"],\"\"]\n4:I[84654,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\"],\"default\"]\n5:I[340250,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"default\"]\n6:I[408821,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\",\"/_next/static/chunks/77c3815a3f1feea2.js\"],\"default\"]\n7:I[703827,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"default\"]\n8:I[20967,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"OutletBoundary\"]\nb:I[253348,[\"/_next/static/chunks/bdfcf621148ad9ee.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/7e750f6f5f5542e3.js\"],\"default\"]\n:HL[\"/_next/static/chunks/f2c59bf02f955ace.css\",\"style\"]\n:HL[\"/_next/static/chunks/ed46900f63166b58.css\",\"style\"]\n:HL[\"/_next/static/chunks/6d8557f062aa4386.css\",\"style\"]\n:HL[\"/_next/static/chunks/1e4334d18b8a3acd.css\",\"style\"]\n:HL[\"/_next/static/chunks/923964f18c87d0f1.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"98tBhkYDWuAefdA7Ln9XX\",\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/f2c59bf02f955ace.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/ed46900f63166b58.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/6d8557f062aa4386.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1e4334d18b8a3acd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/923964f18c87d0f1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/058ff74552b21862.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/12ce527381ac41a0.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/541d148d76987a33.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/4d678259ce3436b0.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-6\",{\"src\":\"/_next/static/chunks/de16e4ed3c137fec.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-7\",{\"src\":\"/_next/static/chunks/d2565e3572b1ead7.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"$L2\",null,{\"gtmId\":\"GTM-M2HVJQFD\"}],[\"$\",\"$L3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n const hash = window.location.hash;\\n if (hash.startsWith('#!')) {\\n const newLocation = window.location.origin + window.location.pathname;\\n window.location.assign(newLocation);\\n }\\n })();\\n \"}}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"lineage\":\"$undefined\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$6\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/77c3815a3f1feea2.js\",\"async\":true}]],\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}]]}],{},null,false,false]},null,false,false]},null,false,false],\"$La\",false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:\"$Sreact.suspense\"\ne:I[20967,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"ViewportBoundary\"]\n10:I[20967,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"MetadataBoundary\"]\n9:[\"$\",\"$c\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@d\"}]\na:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$c\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L11\"}]}]}],null]}]\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"12:I[767811,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"IconMark\"]\nd:null\n11:[[\"$\",\"title\",\"0\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.a8d38d84.ico\",\"sizes\":\"32x32\",\"type\":\"image/x-icon\"}],[\"$\",\"$L12\",\"3\",{}]]\n"])</script></body></html>
|