fix: add auth0 authorization

This commit is contained in:
Boris Arzentar 2025-06-02 16:58:03 +02:00
parent e644c3b86d
commit bcb5b12964
No known key found for this signature in database
GPG key ID: D5CC274C784807B7
36 changed files with 4826 additions and 3939 deletions

View file

@ -8,11 +8,12 @@
"name": "cognee-frontend", "name": "cognee-frontend",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@auth0/nextjs-auth0": "^4.6.0",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"next": "14.2.3", "next": "15.2.3",
"ohmy-ui": "^0.0.6", "ohmy-ui": "^0.0.6",
"react": "^18", "react": "^19",
"react-dom": "^18", "react-dom": "^19",
"uuid": "^9.0.1" "uuid": "^9.0.1"
}, },
"devDependencies": { "devDependencies": {
@ -64,6 +65,23 @@
} }
} }
}, },
"node_modules/@auth0/nextjs-auth0": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/@auth0/nextjs-auth0/-/nextjs-auth0-4.6.0.tgz",
"integrity": "sha512-HK+fcUW6P8/qUDQfOfntftMg6yzeZLtyfTxL/lyeOub1o/xTL9SZ2fF39nH0H6w1loB5SCAbyN1vD8xxBwINqQ==",
"dependencies": {
"@edge-runtime/cookies": "^5.0.1",
"@panva/hkdf": "^1.2.1",
"jose": "^5.9.6",
"oauth4webapi": "^3.1.2",
"swr": "^2.2.5"
},
"peerDependencies": {
"next": "^14.2.25 || ^15.2.3",
"react": "^18.0.0 || ^19.0.0 || ^19.0.0-0",
"react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-0"
}
},
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.24.5", "version": "7.24.5",
"dev": true, "dev": true,
@ -75,6 +93,23 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@edge-runtime/cookies": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@edge-runtime/cookies/-/cookies-5.0.2.tgz",
"integrity": "sha512-Sd8LcWpZk/SWEeKGE8LT6gMm5MGfX/wm+GPnh1eBEtCpya3vYqn37wYknwAHw92ONoyyREl1hJwxV/Qx2DWNOg==",
"engines": {
"node": ">=16"
}
},
"node_modules/@emnapi/runtime": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
"integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@eslint-community/eslint-utils": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0", "version": "4.4.0",
"dev": true, "dev": true,
@ -157,6 +192,348 @@
"dev": true, "dev": true,
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@img/sharp-darwin-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
"integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.0.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
"integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.0.4"
}
},
"node_modules/@img/sharp-libvips-darwin-arm64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-darwin-x64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
"integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
"cpu": [
"arm"
],
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
"integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
"integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
"cpu": [
"s390x"
],
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
"integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
"integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-linux-arm": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
"integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
"cpu": [
"arm"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.0.5"
}
},
"node_modules/@img/sharp-linux-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
"integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.0.4"
}
},
"node_modules/@img/sharp-linux-s390x": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
"integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
"cpu": [
"s390x"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.0.4"
}
},
"node_modules/@img/sharp-linux-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
"integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.0.4"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
"integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
"integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.0.4"
}
},
"node_modules/@img/sharp-wasm32": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
"integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
"cpu": [
"wasm32"
],
"optional": true,
"dependencies": {
"@emnapi/runtime": "^1.2.0"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-ia32": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
"integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
"cpu": [
"ia32"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@isaacs/cliui": { "node_modules/@isaacs/cliui": {
"version": "8.0.2", "version": "8.0.2",
"dev": true, "dev": true,
@ -199,8 +576,9 @@
} }
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "14.2.3", "version": "15.2.3",
"license": "MIT" "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.3.tgz",
"integrity": "sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw=="
}, },
"node_modules/@next/eslint-plugin-next": { "node_modules/@next/eslint-plugin-next": {
"version": "14.2.3", "version": "14.2.3",
@ -254,11 +632,12 @@
} }
}, },
"node_modules/@next/swc-darwin-arm64": { "node_modules/@next/swc-darwin-arm64": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.3.tgz",
"integrity": "sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
@ -268,9 +647,9 @@
} }
}, },
"node_modules/@next/swc-darwin-x64": { "node_modules/@next/swc-darwin-x64": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.3.tgz",
"integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", "integrity": "sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -283,9 +662,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-gnu": { "node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.3.tgz",
"integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", "integrity": "sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -298,9 +677,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-musl": { "node_modules/@next/swc-linux-arm64-musl": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.3.tgz",
"integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", "integrity": "sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -313,9 +692,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-gnu": { "node_modules/@next/swc-linux-x64-gnu": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.3.tgz",
"integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", "integrity": "sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -328,9 +707,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-musl": { "node_modules/@next/swc-linux-x64-musl": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.3.tgz",
"integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", "integrity": "sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -343,9 +722,9 @@
} }
}, },
"node_modules/@next/swc-win32-arm64-msvc": { "node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.3.tgz",
"integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", "integrity": "sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -357,25 +736,10 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz",
"integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==",
"cpu": [
"ia32"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@next/swc-win32-x64-msvc": { "node_modules/@next/swc-win32-x64-msvc": {
"version": "14.2.3", "version": "15.2.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.3.tgz",
"integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", "integrity": "sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -419,6 +783,14 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/@panva/hkdf": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz",
"integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==",
"funding": {
"url": "https://github.com/sponsors/panva"
}
},
"node_modules/@pkgjs/parseargs": { "node_modules/@pkgjs/parseargs": {
"version": "0.11.0", "version": "0.11.0",
"dev": true, "dev": true,
@ -435,14 +807,15 @@
}, },
"node_modules/@swc/counter": { "node_modules/@swc/counter": {
"version": "0.1.3", "version": "0.1.3",
"license": "Apache-2.0" "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
"integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
}, },
"node_modules/@swc/helpers": { "node_modules/@swc/helpers": {
"version": "0.5.5", "version": "0.5.15",
"license": "Apache-2.0", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
"integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
"dependencies": { "dependencies": {
"@swc/counter": "^0.1.3", "tslib": "^2.8.0"
"tslib": "^2.4.0"
} }
}, },
"node_modules/@types/json5": { "node_modules/@types/json5": {
@ -971,11 +1344,25 @@
}, },
"node_modules/client-only": { "node_modules/client-only": {
"version": "0.0.1", "version": "0.0.1",
"license": "MIT" "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
"optional": true,
"dependencies": {
"color-convert": "^2.0.1",
"color-string": "^1.9.0"
},
"engines": {
"node": ">=12.5.0"
}
}, },
"node_modules/color-convert": { "node_modules/color-convert": {
"version": "2.0.1", "version": "2.0.1",
"dev": true, "devOptional": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"color-name": "~1.1.4" "color-name": "~1.1.4"
@ -986,9 +1373,19 @@
}, },
"node_modules/color-name": { "node_modules/color-name": {
"version": "1.1.4", "version": "1.1.4",
"dev": true, "devOptional": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"optional": true,
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/concat-map": { "node_modules/concat-map": {
"version": "0.0.1", "version": "0.0.1",
"dev": true, "dev": true,
@ -1120,12 +1517,20 @@
}, },
"node_modules/dequal": { "node_modules/dequal": {
"version": "2.0.3", "version": "2.0.3",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/detect-libc": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"optional": true,
"engines": {
"node": ">=8"
}
},
"node_modules/dir-glob": { "node_modules/dir-glob": {
"version": "3.0.1", "version": "3.0.1",
"dev": true, "dev": true,
@ -2020,6 +2425,7 @@
}, },
"node_modules/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.11", "version": "4.2.11",
"dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/graphemer": { "node_modules/graphemer": {
@ -2174,6 +2580,12 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
"optional": true
},
"node_modules/is-async-function": { "node_modules/is-async-function": {
"version": "2.0.0", "version": "2.0.0",
"dev": true, "dev": true,
@ -2526,8 +2938,17 @@
"@pkgjs/parseargs": "^0.11.0" "@pkgjs/parseargs": "^0.11.0"
} }
}, },
"node_modules/jose": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
"integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
"funding": {
"url": "https://github.com/sponsors/panva"
}
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/js-yaml": { "node_modules/js-yaml": {
@ -2638,6 +3059,7 @@
}, },
"node_modules/loose-envify": { "node_modules/loose-envify": {
"version": "1.4.0", "version": "1.4.0",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0" "js-tokens": "^3.0.0 || ^4.0.0"
@ -2728,39 +3150,41 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/next": { "node_modules/next": {
"version": "14.2.3", "version": "15.2.3",
"license": "MIT", "resolved": "https://registry.npmjs.org/next/-/next-15.2.3.tgz",
"integrity": "sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==",
"dependencies": { "dependencies": {
"@next/env": "14.2.3", "@next/env": "15.2.3",
"@swc/helpers": "0.5.5", "@swc/counter": "0.1.3",
"@swc/helpers": "0.5.15",
"busboy": "1.6.0", "busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579", "caniuse-lite": "^1.0.30001579",
"graceful-fs": "^4.2.11",
"postcss": "8.4.31", "postcss": "8.4.31",
"styled-jsx": "5.1.1" "styled-jsx": "5.1.6"
}, },
"bin": { "bin": {
"next": "dist/bin/next" "next": "dist/bin/next"
}, },
"engines": { "engines": {
"node": ">=18.17.0" "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@next/swc-darwin-arm64": "14.2.3", "@next/swc-darwin-arm64": "15.2.3",
"@next/swc-darwin-x64": "14.2.3", "@next/swc-darwin-x64": "15.2.3",
"@next/swc-linux-arm64-gnu": "14.2.3", "@next/swc-linux-arm64-gnu": "15.2.3",
"@next/swc-linux-arm64-musl": "14.2.3", "@next/swc-linux-arm64-musl": "15.2.3",
"@next/swc-linux-x64-gnu": "14.2.3", "@next/swc-linux-x64-gnu": "15.2.3",
"@next/swc-linux-x64-musl": "14.2.3", "@next/swc-linux-x64-musl": "15.2.3",
"@next/swc-win32-arm64-msvc": "14.2.3", "@next/swc-win32-arm64-msvc": "15.2.3",
"@next/swc-win32-ia32-msvc": "14.2.3", "@next/swc-win32-x64-msvc": "15.2.3",
"@next/swc-win32-x64-msvc": "14.2.3" "sharp": "^0.33.5"
}, },
"peerDependencies": { "peerDependencies": {
"@opentelemetry/api": "^1.1.0", "@opentelemetry/api": "^1.1.0",
"@playwright/test": "^1.41.2", "@playwright/test": "^1.41.2",
"react": "^18.2.0", "babel-plugin-react-compiler": "*",
"react-dom": "^18.2.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
"react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
"sass": "^1.3.0" "sass": "^1.3.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
@ -2770,11 +3194,22 @@
"@playwright/test": { "@playwright/test": {
"optional": true "optional": true
}, },
"babel-plugin-react-compiler": {
"optional": true
},
"sass": { "sass": {
"optional": true "optional": true
} }
} }
}, },
"node_modules/oauth4webapi": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.5.1.tgz",
"integrity": "sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==",
"funding": {
"url": "https://github.com/sponsors/panva"
}
},
"node_modules/object-assign": { "node_modules/object-assign": {
"version": "4.1.1", "version": "4.1.1",
"dev": true, "dev": true,
@ -3119,24 +3554,22 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/react": { "node_modules/react": {
"version": "18.3.1", "version": "19.1.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
"dependencies": { "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
"loose-envify": "^1.1.0"
},
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "18.3.1", "version": "19.1.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
"integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0", "scheduler": "^0.26.0"
"scheduler": "^0.23.2"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^18.3.1" "react": "^19.1.0"
} }
}, },
"node_modules/react-is": { "node_modules/react-is": {
@ -3297,16 +3730,15 @@
} }
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.23.2", "version": "0.26.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
"dependencies": { "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="
"loose-envify": "^1.1.0"
}
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.6.2", "version": "7.7.2",
"dev": true, "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"license": "ISC", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"devOptional": true,
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
}, },
@ -3344,6 +3776,45 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/sharp": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
"integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
"color": "^4.2.3",
"detect-libc": "^2.0.3",
"semver": "^7.6.3"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-darwin-arm64": "0.33.5",
"@img/sharp-darwin-x64": "0.33.5",
"@img/sharp-libvips-darwin-arm64": "1.0.4",
"@img/sharp-libvips-darwin-x64": "1.0.4",
"@img/sharp-libvips-linux-arm": "1.0.5",
"@img/sharp-libvips-linux-arm64": "1.0.4",
"@img/sharp-libvips-linux-s390x": "1.0.4",
"@img/sharp-libvips-linux-x64": "1.0.4",
"@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
"@img/sharp-libvips-linuxmusl-x64": "1.0.4",
"@img/sharp-linux-arm": "0.33.5",
"@img/sharp-linux-arm64": "0.33.5",
"@img/sharp-linux-s390x": "0.33.5",
"@img/sharp-linux-x64": "0.33.5",
"@img/sharp-linuxmusl-arm64": "0.33.5",
"@img/sharp-linuxmusl-x64": "0.33.5",
"@img/sharp-wasm32": "0.33.5",
"@img/sharp-win32-ia32": "0.33.5",
"@img/sharp-win32-x64": "0.33.5"
}
},
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"dev": true, "dev": true,
@ -3391,6 +3862,15 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"optional": true,
"dependencies": {
"is-arrayish": "^0.3.1"
}
},
"node_modules/slash": { "node_modules/slash": {
"version": "3.0.0", "version": "3.0.0",
"dev": true, "dev": true,
@ -3586,8 +4066,9 @@
} }
}, },
"node_modules/styled-jsx": { "node_modules/styled-jsx": {
"version": "5.1.1", "version": "5.1.6",
"license": "MIT", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
"integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
"dependencies": { "dependencies": {
"client-only": "0.0.1" "client-only": "0.0.1"
}, },
@ -3595,7 +4076,7 @@
"node": ">= 12.0.0" "node": ">= 12.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@babel/core": { "@babel/core": {
@ -3628,6 +4109,18 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/swr": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz",
"integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==",
"dependencies": {
"dequal": "^2.0.3",
"use-sync-external-store": "^1.4.0"
},
"peerDependencies": {
"react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/tapable": { "node_modules/tapable": {
"version": "2.2.1", "version": "2.2.1",
"dev": true, "dev": true,
@ -3675,8 +4168,9 @@
} }
}, },
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.6.2", "version": "2.8.1",
"license": "0BSD" "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}, },
"node_modules/type-check": { "node_modules/type-check": {
"version": "0.4.0", "version": "0.4.0",
@ -3808,6 +4302,14 @@
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
}, },
"node_modules/use-sync-external-store": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
"integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/uuid": { "node_modules/uuid": {
"version": "9.0.1", "version": "9.0.1",
"funding": [ "funding": [

View file

@ -9,11 +9,12 @@
"lint": "next lint" "lint": "next lint"
}, },
"dependencies": { "dependencies": {
"@auth0/nextjs-auth0": "^4.6.0",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"next": "14.2.3", "next": "15.2.3",
"ohmy-ui": "^0.0.6", "ohmy-ui": "^0.0.6",
"react": "^18", "react": "^19",
"react-dom": "^18", "react-dom": "^19",
"uuid": "^9.0.1" "uuid": "^9.0.1"
}, },
"devDependencies": { "devDependencies": {

View file

@ -0,0 +1,16 @@
.main {
display: flex;
flex-direction: row;
flex-direction: column;
padding: 0;
min-height: 100vh;
}
.authContainer {
flex: 1;
display: flex;
padding: 24px 0;
margin: 0 auto;
max-width: 440px;
width: 100%;
}

View file

@ -0,0 +1,29 @@
import { Spacer, Stack, Text } from 'ohmy-ui';
import { TextLogo } from '@/ui/App';
import { Divider } from '@/ui/Layout';
import Footer from '@/ui/Partials/Footer/Footer';
import SignInForm from '@/ui/Partials/SignInForm/SignInForm';
import styles from './AuthPage.module.css';
export default function AuthPage() {
return (
<main className={styles.main}>
<Spacer inset vertical="2" horizontal="2">
<Stack orientation="horizontal" gap="between" align="center">
<TextLogo width={158} height={44} color="white" />
</Stack>
</Spacer>
<Divider />
<div className={styles.authContainer}>
<Stack gap="4" style={{ width: '100%' }}>
<h1><Text size="large">Sign in</Text></h1>
<SignInForm />
</Stack>
</div>
<Spacer inset horizontal="3" wrap>
<Footer />
</Spacer>
</main>
)
}

View file

@ -0,0 +1 @@
export { default } from './AuthPage';

View file

@ -1,12 +1,17 @@
import { Spacer, Stack, Text } from 'ohmy-ui'; import Link from 'next/link';
import { CTAButton, Spacer, Stack, Text } from 'ohmy-ui';
import { auth0 } from '@/modules/auth/auth0';
import { TextLogo } from '@/ui/App'; import { TextLogo } from '@/ui/App';
import { Divider } from '@/ui/Layout';
import Footer from '@/ui/Partials/Footer/Footer'; import Footer from '@/ui/Partials/Footer/Footer';
import AuthToken from './token/AuthToken';
import styles from './AuthPage.module.css'; import styles from './AuthPage.module.css';
import { Divider } from '@/ui/Layout';
import SignInForm from '@/ui/Partials/SignInForm/SignInForm';
export default function AuthPage() { export default async function AuthPage() {
const session = await auth0.getSession();
return ( return (
<main className={styles.main}> <main className={styles.main}>
<Spacer inset vertical="2" horizontal="2"> <Spacer inset vertical="2" horizontal="2">
@ -17,8 +22,32 @@ export default function AuthPage() {
<Divider /> <Divider />
<div className={styles.authContainer}> <div className={styles.authContainer}>
<Stack gap="4" style={{ width: '100%' }}> <Stack gap="4" style={{ width: '100%' }}>
<h1><Text size="large">Sign in</Text></h1> <h1><Text size="large">Welcome to cognee</Text></h1>
<SignInForm /> {session ? (
<Stack gap="4">
<Text>Hello, {session.user.name}!</Text>
<AuthToken />
<Link href="/auth/logout">
<CTAButton>
Log out
</CTAButton>
</Link>
</Stack>
) : (
<>
<Link href="/auth/login?screen_hint=signup">
<CTAButton>
Sign up
</CTAButton>
</Link>
<Link href="/auth/login">
<CTAButton>
Log in
</CTAButton>
</Link>
</>
)}
</Stack> </Stack>
</div> </div>
<Spacer inset horizontal="3" wrap> <Spacer inset horizontal="3" wrap>

View file

@ -1 +1,12 @@
export { default } from './AuthPage'; import Auth0AuthPage from "./AuthPage";
import DefaultAuthPage from "../(auth_default)/AuthPage";
let AuthPage = null;
if (process.env.USE_AUTH0_AUTHORIZATION === "true") {
AuthPage = Auth0AuthPage;
} else {
AuthPage = DefaultAuthPage;
}
export default AuthPage;

View file

@ -0,0 +1,14 @@
"use client";
import { useEffect } from "react";
export default function AuthToken() {
useEffect(() => {
async function get_token() {
await fetch("http://localhost:3000/auth/token");
}
get_token();
}, []);
return null;
}

View file

@ -0,0 +1,11 @@
import { auth0 } from "@/modules/auth/auth0";
export async function GET(request: Request) {
const accessToken = await auth0.getAccessToken();
const response = new Response();
response.headers.set("Set-Cookie", `${process.env.AUTH_TOKEN_COOKIE_NAME}=${accessToken.token}; Expires=${new Date(accessToken.expiresAt * 1000).toUTCString()}; Path=/; SameSite=Lax; Domain=localhost; HttpOnly`);
return response;
}

View file

@ -13,6 +13,7 @@ import getDatasetData from '@/modules/datasets/getDatasetData';
import { Footer, SettingsModal } from '@/ui/Partials'; import { Footer, SettingsModal } from '@/ui/Partials';
import { TextLogo } from '@/ui/App'; import { TextLogo } from '@/ui/App';
import { SettingsIcon } from '@/ui/Icons'; import { SettingsIcon } from '@/ui/Icons';
import AuthToken from './auth/token/AuthToken';
export default function Home() { export default function Home() {
const { const {
@ -76,6 +77,7 @@ export default function Home() {
return ( return (
<main className={styles.main}> <main className={styles.main}>
<AuthToken />
<Spacer inset vertical="2" horizontal="2"> <Spacer inset vertical="2" horizontal="2">
<Stack orientation="horizontal" gap="between" align="center"> <Stack orientation="horizontal" gap="between" align="center">
<TextLogo width={158} height={44} color="white" /> <TextLogo width={158} height={44} color="white" />

View file

@ -0,0 +1,28 @@
import { NextResponse, type NextRequest } from "next/server";
import { auth0 } from "./modules/auth/auth0";
export async function middleware(request: NextRequest) {
if (process.env.USE_AUTH0_AUTHORIZATION === "true") {
if (request.nextUrl.pathname === "/auth/token") {
return NextResponse.next();
}
const response: NextResponse = await auth0.middleware(request);
return response;
}
return NextResponse.next();
}
export const config = {
matcher: [
/*
* Match all request paths except for the ones starting with:
* - _next/static (static files)
* - _next/image (image optimization files)
* - favicon.ico, sitemap.xml, robots.txt (metadata files)
*/
"/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)",
],
};

View file

@ -0,0 +1,8 @@
import { Auth0Client } from "@auth0/nextjs-auth0/server";
export const auth0 = new Auth0Client({
authorizationParameters: {
scope: "openid profile email",
audience: "cognee:api",
},
});

View file

@ -17,11 +17,6 @@ function useDatasets() {
const fetchDatasetStatuses = useCallback((datasets: Dataset[]) => { const fetchDatasetStatuses = useCallback((datasets: Dataset[]) => {
fetch( fetch(
`/v1/datasets/status?dataset=${datasets.map(d => d.id).join('&dataset=')}`, `/v1/datasets/status?dataset=${datasets.map(d => d.id).join('&dataset=')}`,
{
headers: {
Authorization: `Bearer ${localStorage.getItem('access_token')}`,
},
},
) )
.then((response) => response.json()) .then((response) => response.json())
.then((statuses) => setDatasets( .then((statuses) => setDatasets(
@ -73,11 +68,7 @@ function useDatasets() {
}, []); }, []);
const fetchDatasets = useCallback(() => { const fetchDatasets = useCallback(() => {
fetch('/v1/datasets', { fetch('/v1/datasets')
headers: {
Authorization: `Bearer ${localStorage.getItem('access_token')}`,
},
})
.then((response) => response.json()) .then((response) => response.json())
.then((datasets) => { .then((datasets) => {
setDatasets(datasets); setDatasets(datasets);

View file

@ -12,7 +12,7 @@ import {
useBoolean, useBoolean,
} from 'ohmy-ui'; } from 'ohmy-ui';
import { LoadingIndicator } from '@/ui/App'; import { LoadingIndicator } from '@/ui/App';
import { fetch, handleServerErrors } from '@/utils'; import { fetch } from '@/utils';
import { useState } from 'react'; import { useState } from 'react';
interface SignInFormPayload extends HTMLFormElement { interface SignInFormPayload extends HTMLFormElement {
@ -50,10 +50,7 @@ export default function SignInForm({ onSignInSuccess = () => window.location.hre
method: 'POST', method: 'POST',
body: authCredentials, body: authCredentials,
}) })
.then(handleServerErrors) .then(() => {
.then(response => response.json())
.then((bearer) => {
window.localStorage.setItem('access_token', bearer.access_token);
onSignInSuccess(); onSignInSuccess();
}) })
.catch(error => setSignInError(errorsMap[error.detail as keyof typeof errorsMap])) .catch(error => setSignInError(errorsMap[error.detail as keyof typeof errorsMap]))

View file

@ -1,12 +1,9 @@
import handleServerErrors from './handleServerErrors'; import handleServerErrors from "./handleServerErrors";
export default function fetch(url: string, options: RequestInit = {}): Promise<Response> { export default async function fetch(url: string, options: RequestInit = {}): Promise<Response> {
return global.fetch('http://localhost:8000/api' + url, { return global.fetch("http://localhost:8000/api" + url, {
...options, ...options,
headers: { credentials: "include",
...options.headers,
'Authorization': `Bearer ${localStorage.getItem('access_token')}`,
},
}) })
.then(handleServerErrors); .then(handleServerErrors);
} }

View file

@ -1,8 +1,9 @@
import { redirect } from "next/navigation";
export default function handleServerErrors(response: Response): Promise<Response> { export default function handleServerErrors(response: Response): Promise<Response> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (response.status === 401) { if (response.status === 401) {
window.location.href = '/auth'; return redirect("/auth");
return;
} }
if (!response.ok) { if (!response.ok) {
return response.json().then(error => reject(error)); return response.json().then(error => reject(error));

View file

@ -1,6 +1,10 @@
{ {
"compilerOptions": { "compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"], "lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true,
@ -18,9 +22,19 @@
} }
], ],
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": [
} "./src/*"
]
},
"target": "ES2017"
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "include": [
"exclude": ["node_modules"] "next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules"
]
} }

View file

@ -3,11 +3,16 @@
import os import os
import uvicorn import uvicorn
from cognee.shared.logging_utils import get_logger
import sentry_sdk import sentry_sdk
from traceback import format_exc
from fastapi import Request
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi import FastAPI, status from fastapi import FastAPI, status
from fastapi.responses import JSONResponse, Response from fastapi.responses import JSONResponse, Response
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from cognee.shared.logging_utils import get_logger
from cognee.api.v1.permissions.routers import get_permissions_router from cognee.api.v1.permissions.routers import get_permissions_router
from cognee.api.v1.settings.routers import get_settings_router from cognee.api.v1.settings.routers import get_settings_router
from cognee.api.v1.datasets.routers import get_datasets_router from cognee.api.v1.datasets.routers import get_datasets_router
@ -16,11 +21,7 @@ from cognee.api.v1.search.routers import get_search_router
from cognee.api.v1.add.routers import get_add_router from cognee.api.v1.add.routers import get_add_router
from cognee.api.v1.delete.routers import get_delete_router from cognee.api.v1.delete.routers import get_delete_router
from cognee.api.v1.responses.routers import get_responses_router from cognee.api.v1.responses.routers import get_responses_router
from fastapi import Request
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from cognee.exceptions import CogneeApiError from cognee.exceptions import CogneeApiError
from traceback import format_exc
from cognee.api.v1.users.routers import ( from cognee.api.v1.users.routers import (
get_auth_router, get_auth_router,
get_register_router, get_register_router,
@ -67,7 +68,7 @@ app = FastAPI(debug=app_environment != "prod", lifespan=lifespan)
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["*"], allow_origins=["http://localhost:3000", "http://localhost:8000", "https://cognee.eu.auth0.com"],
allow_credentials=True, allow_credentials=True,
allow_methods=["OPTIONS", "GET", "POST", "DELETE"], allow_methods=["OPTIONS", "GET", "POST", "DELETE"],
allow_headers=["*"], allow_headers=["*"],

View file

@ -21,7 +21,7 @@ def get_add_router() -> APIRouter:
@router.post("/", response_model=None) @router.post("/", response_model=None)
async def add( async def add(
data: List[UploadFile], data: List[UploadFile],
datasetName: str, datasetName: str = Form(),
datasetId: Optional[UUID] = Form(default=None), datasetId: Optional[UUID] = Form(default=None),
user: User = Depends(get_authenticated_user), user: User = Depends(get_authenticated_user),
): ):

View file

@ -11,7 +11,7 @@ from cognee.shared.data_models import KnowledgeGraph
class CognifyPayloadDTO(BaseModel): class CognifyPayloadDTO(BaseModel):
datasets: List[str] datasets: List[str]
dataset_ids: Optional[List[UUID]] dataset_ids: Optional[List[UUID]] = None
graph_model: Optional[BaseModel] = KnowledgeGraph graph_model: Optional[BaseModel] = KnowledgeGraph

View file

@ -0,0 +1,3 @@
from .auth0_config import get_auth0_config
from .auth0_jwt_strategy import Auth0JWTStrategy
from .auth0_transport import auth0_transport

View file

@ -0,0 +1,15 @@
import os
from starlette.config import Config
from authlib.integrations.starlette_client import OAuth
config = Config(".env")
oauth = OAuth(config)
oauth.register(
"auth0",
client_id=os.getenv("AUTH0_CLIENT_ID"),
client_secret=os.getenv("AUTH0_CLIENT_SECRET"),
server_metadata_url=f"https://{os.getenv('AUTH0_DOMAIN')}/.well-known/openid-configuration",
client_kwargs={"scope": "openid profile email"},
)

View file

@ -0,0 +1,22 @@
from functools import lru_cache
from pydantic_settings import BaseSettings
class Auth0Config(BaseSettings):
auth0_domain: str
auth0_api_audience: str
auth0_algorithms: str
auth0_state_secret: str
auth0_client_secret: str
auth0_client_id: str
auth0_issuer: str
auth_token_cookie_name: str
class Config:
env_file = ".env"
extra = "allow"
@lru_cache()
def get_auth0_config():
return Auth0Config()

View file

@ -0,0 +1,36 @@
from fastapi import HTTPException
from fastapi_users.schemas import BaseUserCreate
from fastapi_users.exceptions import UserNotExists
from fastapi_users.authentication import JWTStrategy
from cognee.modules.users.get_user_manager import UserManager
from cognee.modules.users.tenants.methods import create_tenant
from cognee.modules.users.authentication.auth0.verify_auth0_token import VerifyAuth0Token
token_verification = VerifyAuth0Token()
class Auth0JWTStrategy(JWTStrategy):
async def read_token(self, token: str, user_manager: UserManager):
email = token_verification.verify(token)
if not email:
raise HTTPException(status_code=400, detail="Missing email in token")
try:
user = await user_manager.get_by_email(user_email=email)
return user
except UserNotExists:
# Auto-provision user
new_user = BaseUserCreate(
email=email,
password="NOT IMPORTANT FOR AUTH0"
)
user = await user_manager.create(new_user)
await create_tenant(tenant_name="My organization", user_id=user.id)
return user

View file

@ -0,0 +1,12 @@
from fastapi_users.authentication import CookieTransport
from .auth0_config import get_auth0_config
auth0_transport = CookieTransport(
cookie_name=get_auth0_config().auth_token_cookie_name,
cookie_httponly=True,
cookie_samesite="Lax",
)
auth0_transport.name = "cookie"

View file

@ -0,0 +1,52 @@
import json
from jose import jwt
from jose.exceptions import JWTError
from urllib.request import urlopen
from cognee.modules.users.exceptions.exceptions import (
UnauthenticatedException,
UnauthorizedException,
)
from .auth0_client import oauth
from .auth0_config import get_auth0_config
auth0_config = get_auth0_config()
class VerifyAuth0Token:
def __init__(self):
# This gets the JWKS from a given URL and does processing so you can
# use any of the keys available.
jwks_url = urlopen(f"https://{auth0_config.auth0_domain}/.well-known/jwks.json")
self.jwks = json.loads(jwks_url.read())
def verify(self, token: str):
try:
unverified_header = jwt.get_unverified_header(token)
except JWTError:
raise UnauthenticatedException(detail="Invalid header")
rsa_key = None
for key in self.jwks["keys"]:
if key["kid"] == unverified_header["kid"]:
rsa_key = key
break
if not rsa_key:
raise UnauthorizedException(status_code=401, detail="Invalid token")
try:
payload = jwt.decode(
token,
rsa_key,
algorithms=auth0_config.auth0_algorithms,
audience=auth0_config.auth0_api_audience,
issuer=f"https://{auth0_config.auth0_domain}/"
)
email = payload["email"]
return email
except JWTError as e:
raise UnauthorizedException(detail=f"Token decode error: {str(e)}")

View file

@ -0,0 +1,2 @@
from .default_transport import default_transport
from .default_jwt_strategy import DefaultJWTStrategy

View file

@ -0,0 +1,26 @@
import os
import jwt
from uuid import UUID
from fastapi_users.jwt import generate_jwt
from fastapi_users.authentication import JWTStrategy
from cognee.modules.users.models import User
from cognee.modules.users.get_user_manager import UserManager
class DefaultJWTStrategy(JWTStrategy):
async def read_token(self, token: str, user_manager: UserManager):
payload = jwt.decode(
token, os.getenv("FASTAPI_USERS_JWT_SECRET", "super_secret"), algorithms=["HS256"]
)
user_id = UUID(payload["user_id"])
return await user_manager.get(user_id)
async def write_token(self, user: User) -> str:
# JoinLoad tenant and role information to user object
data = {"user_id": str(user.id)}
return generate_jwt(data, self.encode_key, self.lifetime_seconds, algorithm=self.algorithm)

View file

@ -0,0 +1,10 @@
import os
from fastapi_users.authentication import CookieTransport
default_transport = CookieTransport(
cookie_name=os.getenv("AUTH_TOKEN_COOKIE_NAME"),
cookie_httponly=True,
cookie_samesite="Lax",
)
default_transport.name = "cookie"

View file

@ -1,40 +1,35 @@
import os import os
from functools import lru_cache from functools import lru_cache
from fastapi_users import models from fastapi_users import models
from fastapi_users.jwt import generate_jwt from fastapi_users.authentication import AuthenticationBackend, JWTStrategy
from fastapi_users.authentication import (
AuthenticationBackend,
BearerTransport,
JWTStrategy,
)
from typing import Optional from .default import default_transport
from cognee.modules.users.models import User
from cognee.modules.users.methods import get_user
class CustomJWTStrategy(JWTStrategy):
async def write_token(self, user: User, lifetime_seconds: Optional[int] = None) -> str:
# JoinLoad tenant and role information to user object
user = await get_user(user.id)
data = {"user_id": str(user.id)}
return generate_jwt(data, self.encode_key, self.lifetime_seconds, algorithm=self.algorithm)
@lru_cache @lru_cache
def get_auth_backend(): def get_auth_backend():
bearer_transport = BearerTransport(tokenUrl="api/v1/auth/login") transport = default_transport
if os.getenv("USE_AUTH0_AUTHORIZATION") == "True":
from .auth0 import auth0_transport
transport = auth0_transport
def get_jwt_strategy() -> JWTStrategy[models.UP, models.ID]: def get_jwt_strategy() -> JWTStrategy[models.UP, models.ID]:
secret = os.getenv("FASTAPI_USERS_JWT_SECRET", "super_secret") if os.getenv("USE_AUTH0_AUTHORIZATION") == "True":
return CustomJWTStrategy(secret, lifetime_seconds=3600) from .auth0 import Auth0JWTStrategy
return Auth0JWTStrategy(secret="NOT IMPORTANT FOR AUTH0", lifetime_seconds=36000) # 10 hours is default token lifetime
else:
from .default.default_jwt_strategy import DefaultJWTStrategy
secret = os.getenv("FASTAPI_USERS_JWT_SECRET", "super_secret")
return DefaultJWTStrategy(secret, lifetime_seconds=3600)
auth_backend = AuthenticationBackend( auth_backend = AuthenticationBackend(
name="jwt", name=transport.name,
transport=bearer_transport, transport=transport,
get_strategy=get_jwt_strategy, get_strategy=get_jwt_strategy,
) )

View file

@ -1,5 +1,16 @@
from fastapi import HTTPException, status
from cognee.exceptions import CogneeApiError from cognee.exceptions import CogneeApiError
from fastapi import status
class UnauthorizedException(HTTPException):
def __init__(self, detail: str, **kwargs):
"""Returns HTTP 403"""
super().__init__(status.HTTP_403_FORBIDDEN, detail=detail)
class UnauthenticatedException(HTTPException):
def __init__(self):
super().__init__(status_code=status.HTTP_401_UNAUTHORIZED, detail="Requires authentication")
class RoleNotFoundError(CogneeApiError): class RoleNotFoundError(CogneeApiError):

View file

@ -1,37 +1,15 @@
import os
import uuid import uuid
from typing import Optional from typing import Optional
from fastapi import Depends, Request
from fastapi_users import BaseUserManager, UUIDIDMixin, models
from fastapi_users.db import SQLAlchemyUserDatabase
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from .get_user_db import get_user_db from fastapi import Depends, Request
from fastapi_users import BaseUserManager, UUIDIDMixin
from fastapi_users.db import SQLAlchemyUserDatabase
from .models import User from .models import User
from .methods import get_user from .get_user_db import get_user_db
from fastapi_users.exceptions import UserNotExists
class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]): class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]):
reset_password_token_secret = os.getenv(
"FASTAPI_USERS_RESET_PASSWORD_TOKEN_SECRET", "super_secret"
)
verification_token_secret = os.getenv("FASTAPI_USERS_VERIFICATION_TOKEN_SECRET", "super_secret")
async def get(self, id: models.ID) -> models.UP:
"""
Get a user by id.
:param id: Id. of the user to retrieve.
:raises UserNotExists: The user does not exist.
:return: A user.
"""
user = await get_user(id)
if user is None:
raise UserNotExists()
return user
async def on_after_register(self, user: User, request: Optional[Request] = None): async def on_after_register(self, user: User, request: Optional[Request] = None):
print(f"User {user.id} has registered.") print(f"User {user.id} has registered.")

View file

@ -1,41 +1,36 @@
from types import SimpleNamespace
from ..get_fastapi_users import get_fastapi_users from ..get_fastapi_users import get_fastapi_users
from fastapi import HTTPException, Security
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
import os
import jwt
from uuid import UUID
fastapi_users = get_fastapi_users() fastapi_users = get_fastapi_users()
# Allows Swagger to understand authorization type and allow single sign on for the Swagger docs to test backend get_authenticated_user = fastapi_users.current_user(active=True)
bearer_scheme = HTTPBearer(scheme_name="BearerAuth", description="Paste **Bearer &lt;JWT&gt;**")
# # Allows Swagger to understand authorization type and allow single sign on for the Swagger docs to test backend
# bearer_scheme = HTTPBearer(scheme_name="BearerAuth", description="Paste **Bearer &lt;JWT&gt;**")
async def get_authenticated_user( # async def get_authenticated_user(
creds: HTTPAuthorizationCredentials = Security(bearer_scheme), # creds: HTTPAuthorizationCredentials = Security(bearer_scheme),
) -> SimpleNamespace: # ) -> SimpleNamespace:
""" # """
Extract and validate the JWT presented in the Authorization header. # Extract and validate the JWT presented in the Authorization header.
""" # """
if creds is None: # header missing # if creds is None: # header missing
raise HTTPException(status_code=401, detail="Not authenticated") # raise HTTPException(status_code=401, detail="Not authenticated")
if creds.scheme.lower() != "bearer": # shouldn't happen extra guard # if creds.scheme.lower() != "bearer": # shouldn't happen extra guard
raise HTTPException(status_code=401, detail="Invalid authentication scheme") # raise HTTPException(status_code=401, detail="Invalid authentication scheme")
token = creds.credentials # token = creds.credentials
try: # try:
payload = jwt.decode( # payload = jwt.decode(
token, os.getenv("FASTAPI_USERS_JWT_SECRET", "super_secret"), algorithms=["HS256"] # token, os.getenv("FASTAPI_USERS_JWT_SECRET", "super_secret"), algorithms=["HS256"]
) # )
auth_data = SimpleNamespace(id=UUID(payload["user_id"])) # auth_data = SimpleNamespace(id=UUID(payload["user_id"]))
return auth_data # return auth_data
except jwt.ExpiredSignatureError: # except jwt.ExpiredSignatureError:
raise HTTPException(status_code=401, detail="Token has expired") # raise HTTPException(status_code=401, detail="Token has expired")
except jwt.InvalidTokenError: # except jwt.InvalidTokenError:
raise HTTPException(status_code=401, detail="Invalid token") # raise HTTPException(status_code=401, detail="Invalid token")

51
poetry.lock generated
View file

@ -2028,6 +2028,25 @@ files = [
{file = "duckdb-1.2.2.tar.gz", hash = "sha256:1e53555dece49201df08645dbfa4510c86440339889667702f936b7d28d39e43"}, {file = "duckdb-1.2.2.tar.gz", hash = "sha256:1e53555dece49201df08645dbfa4510c86440339889667702f936b7d28d39e43"},
] ]
[[package]]
name = "ecdsa"
version = "0.19.1"
description = "ECDSA cryptographic signature library (pure python)"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.6"
groups = ["main"]
files = [
{file = "ecdsa-0.19.1-py2.py3-none-any.whl", hash = "sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3"},
{file = "ecdsa-0.19.1.tar.gz", hash = "sha256:478cba7b62555866fcb3bb3fe985e06decbdb68ef55713c4e5ab98c57d508e61"},
]
[package.dependencies]
six = ">=1.9.0"
[package.extras]
gmpy = ["gmpy"]
gmpy2 = ["gmpy2"]
[[package]] [[package]]
name = "email-validator" name = "email-validator"
version = "2.2.0" version = "2.2.0"
@ -7850,10 +7869,9 @@ test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"]
name = "pyasn1" name = "pyasn1"
version = "0.6.1" version = "0.6.1"
description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
optional = true optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["main"] groups = ["main"]
markers = "extra == \"gemini\""
files = [ files = [
{file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
{file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"},
@ -8521,6 +8539,30 @@ files = [
[package.extras] [package.extras]
dev = ["black (==25.1.0)", "build (==1.2.2)", "flake8 (==7.1.1)", "mypy (==1.15.0)", "pytest (==8.3.4)", "requests (==2.32.3)", "twine (==6.1.0)"] dev = ["black (==25.1.0)", "build (==1.2.2)", "flake8 (==7.1.1)", "mypy (==1.15.0)", "pytest (==8.3.4)", "requests (==2.32.3)", "twine (==6.1.0)"]
[[package]]
name = "python-jose"
version = "3.5.0"
description = "JOSE implementation in Python"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
{file = "python_jose-3.5.0-py2.py3-none-any.whl", hash = "sha256:abd1202f23d34dfad2c3d28cb8617b90acf34132c7afd60abd0b0b7d3cb55771"},
{file = "python_jose-3.5.0.tar.gz", hash = "sha256:fb4eaa44dbeb1c26dcc69e4bd7ec54a1cb8dd64d3b4d81ef08d90ff453f2b01b"},
]
[package.dependencies]
cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryptography\""}
ecdsa = "!=0.15"
pyasn1 = ">=0.5.0"
rsa = ">=4.0,<4.1.1 || >4.1.1,<4.4 || >4.4,<5.0"
[package.extras]
cryptography = ["cryptography (>=3.4.0)"]
pycrypto = ["pycrypto (>=2.6.0,<2.7.0)"]
pycryptodome = ["pycryptodome (>=3.3.1,<4.0.0)"]
test = ["pytest", "pytest-cov"]
[[package]] [[package]]
name = "python-json-logger" name = "python-json-logger"
version = "3.3.0" version = "3.3.0"
@ -9476,10 +9518,9 @@ files = [
name = "rsa" name = "rsa"
version = "4.9.1" version = "4.9.1"
description = "Pure-Python RSA implementation" description = "Pure-Python RSA implementation"
optional = true optional = false
python-versions = "<4,>=3.6" python-versions = "<4,>=3.6"
groups = ["main"] groups = ["main"]
markers = "extra == \"gemini\""
files = [ files = [
{file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"},
{file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"},
@ -11988,4 +12029,4 @@ weaviate = ["weaviate-client"]
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = ">=3.10,<=3.13" python-versions = ">=3.10,<=3.13"
content-hash = "b120d1a362e9495ca2f6c7e448ba7fa122644763c16dee0ee5c8dcbab6dc3c42" content-hash = "b1a1a1525baa6b0e780a6938b714c9d7005b157736ed910eeb13211dd9b61de0"

View file

@ -58,6 +58,7 @@ dependencies = [
"structlog>=25.2.0,<26", "structlog>=25.2.0,<26",
"onnxruntime<=1.21.1", "onnxruntime<=1.21.1",
"pylance==0.22.0", "pylance==0.22.0",
"python-jose[cryptography]>=3.5.0",
] ]
[project.optional-dependencies] [project.optional-dependencies]

7457
uv.lock generated

File diff suppressed because it is too large Load diff