From 8cd29ee1b09e7e193fa4cb11a6a91aadf5d9107d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 14:15:09 +0000 Subject: [PATCH 01/15] Update dependency aiohttp to v3.13.4 [SECURITY] (#484) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/uv.lock b/uv.lock index f47d56b3..035fe046 100644 --- a/uv.lock +++ b/uv.lock @@ -22,7 +22,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.3" +version = "3.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs", marker = "sys_platform != 'win32'" }, @@ -33,23 +33,23 @@ dependencies = [ { name = "propcache", marker = "sys_platform != 'win32'" }, { name = "yarl", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, - { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, - { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, - { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, - { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/e9/d76bf503005709e390122d34e15256b88f7008e246c4bdbe915cd4f1adce/aiohttp-3.13.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61", size = 742930, upload-time = "2026-03-31T21:58:13.155Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/4b7b70223deaebd9bb85984d01a764b0d7bd6526fcdc73cca83bcbe7243e/aiohttp-3.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4bb6bf5811620003614076bdc807ef3b5e38244f9d25ca5fe888eaccea2a9832", size = 496927, upload-time = "2026-03-31T21:58:15.073Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f5/0fb20fb49f8efdcdce6cd8127604ad2c503e754a8f139f5e02b01626523f/aiohttp-3.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9", size = 497141, upload-time = "2026-03-31T21:58:17.009Z" }, + { url = "https://files.pythonhosted.org/packages/3b/86/b7c870053e36a94e8951b803cb5b909bfbc9b90ca941527f5fcafbf6b0fa/aiohttp-3.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090", size = 1732476, upload-time = "2026-03-31T21:58:18.925Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e5/4e161f84f98d80c03a238671b4136e6530453d65262867d989bbe78244d0/aiohttp-3.13.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5e5f7debc7a57af53fdf5c5009f9391d9f4c12867049d509bf7bb164a6e295b", size = 1706507, upload-time = "2026-03-31T21:58:21.094Z" }, + { url = "https://files.pythonhosted.org/packages/d4/56/ea11a9f01518bd5a2a2fcee869d248c4b8a0cfa0bb13401574fa31adf4d4/aiohttp-3.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c719f65bebcdf6716f10e9eff80d27567f7892d8988c06de12bbbd39307c6e3a", size = 1773465, upload-time = "2026-03-31T21:58:23.159Z" }, + { url = "https://files.pythonhosted.org/packages/eb/40/333ca27fb74b0383f17c90570c748f7582501507307350a79d9f9f3c6eb1/aiohttp-3.13.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d97f93fdae594d886c5a866636397e2bcab146fd7a132fd6bb9ce182224452f8", size = 1873523, upload-time = "2026-03-31T21:58:25.59Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d2/e2f77eef1acb7111405433c707dc735e63f67a56e176e72e9e7a2cd3f493/aiohttp-3.13.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665", size = 1754113, upload-time = "2026-03-31T21:58:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/fb/56/3f653d7f53c89669301ec9e42c95233e2a0c0a6dd051269e6e678db4fdb0/aiohttp-3.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe6970addfea9e5e081401bcbadf865d2b6da045472f58af08427e108d618540", size = 1562351, upload-time = "2026-03-31T21:58:29.918Z" }, + { url = "https://files.pythonhosted.org/packages/ec/a6/9b3e91eb8ae791cce4ee736da02211c85c6f835f1bdfac0594a8a3b7018c/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb", size = 1693205, upload-time = "2026-03-31T21:58:32.214Z" }, + { url = "https://files.pythonhosted.org/packages/98/fc/bfb437a99a2fcebd6b6eaec609571954de2ed424f01c352f4b5504371dd3/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:676e5651705ad5d8a70aeb8eb6936c436d8ebbd56e63436cb7dd9bb36d2a9a46", size = 1730618, upload-time = "2026-03-31T21:58:34.728Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b6/c8534862126191a034f68153194c389addc285a0f1347d85096d349bbc15/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9b16c653d38eb1a611cc898c41e76859ca27f119d25b53c12875fd0474ae31a8", size = 1745185, upload-time = "2026-03-31T21:58:36.909Z" }, + { url = "https://files.pythonhosted.org/packages/0b/93/4ca8ee2ef5236e2707e0fd5fecb10ce214aee1ff4ab307af9c558bda3b37/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:999802d5fa0389f58decd24b537c54aa63c01c3219ce17d1214cbda3c2b22d2d", size = 1557311, upload-time = "2026-03-31T21:58:39.38Z" }, + { url = "https://files.pythonhosted.org/packages/57/ae/76177b15f18c5f5d094f19901d284025db28eccc5ae374d1d254181d33f4/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ec707059ee75732b1ba130ed5f9580fe10ff75180c812bc267ded039db5128c6", size = 1773147, upload-time = "2026-03-31T21:58:41.476Z" }, + { url = "https://files.pythonhosted.org/packages/01/a4/62f05a0a98d88af59d93b7fcac564e5f18f513cb7471696ac286db970d6a/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c", size = 1730356, upload-time = "2026-03-31T21:58:44.049Z" }, ] [[package]] From 24796db40884a95aa8b16cf63eaa9abd8babf360 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 20:20:12 +0000 Subject: [PATCH 02/15] Update dependency Django to v5.2.13 [SECURITY] (#485) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 035fe046..e50b58aa 100644 --- a/uv.lock +++ b/uv.lock @@ -836,15 +836,15 @@ sdist = { url = "https://files.pythonhosted.org/packages/2b/8f/77a4b8ec50c821193 [[package]] name = "django" -version = "5.2.12" +version = "5.2.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform != 'win32'" }, { name = "sqlparse", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b9445fc0695b03746f355c05b2eecc54c34e05198c686f4fc4406b722b52/django-5.2.12.tar.gz", hash = "sha256:6b809af7165c73eff5ce1c87fdae75d4da6520d6667f86401ecf55b681eb1eeb", size = 10860574, upload-time = "2026-03-03T13:56:05.509Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/c5/c69e338eb2959f641045802e5ea87ca4bf5ac90c5fd08953ca10742fad51/django-5.2.13.tar.gz", hash = "sha256:a31589db5188d074c63f0945c3888fad104627dfcc236fb2b97f71f89da33bc4", size = 10890368, upload-time = "2026-04-07T14:02:15.072Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/32/4b144e125678efccf5d5b61581de1c4088d6b0286e46096e3b8de0d556c8/django-5.2.12-py3-none-any.whl", hash = "sha256:4853482f395c3a151937f6991272540fcbf531464f254a347bf7c89f53c8cff7", size = 8310245, upload-time = "2026-03-03T13:56:01.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/b1/51ab36b2eefcf8cdb9338c7188668a157e29e30306bfc98a379704c9e10d/django-5.2.13-py3-none-any.whl", hash = "sha256:5788fce61da23788a8ce6f02583765ab060d396720924789f97fa42119d37f7a", size = 8310982, upload-time = "2026-04-07T14:02:08.883Z" }, ] [[package]] From 4266366541bf80ec5c0410773974f8a029e55ca8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 00:54:21 +0000 Subject: [PATCH 03/15] Update dependency langchain-core to v1.2.28 [SECURITY] (#486) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index e50b58aa..44884f18 100644 --- a/uv.lock +++ b/uv.lock @@ -2245,7 +2245,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "1.2.23" +version = "1.2.31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch", marker = "sys_platform != 'win32'" }, @@ -2257,9 +2257,9 @@ dependencies = [ { name = "typing-extensions", marker = "sys_platform != 'win32'" }, { name = "uuid-utils", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/47/a5f21b651e9cbd7a26c3e5809336d10a0be94ef7bdf6bea47f2ad9fff1a8/langchain_core-1.2.23.tar.gz", hash = "sha256:fdec64f90cfea25317e88d9803c44684af1f4e30dec4e58320dd7393bb0f0785", size = 841684, upload-time = "2026-03-27T23:28:14.6Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/5a/7523ff55668a233beef7e909e8e2074a1cc3b620e0bbf0a4ec5f38549b3b/langchain_core-1.2.31.tar.gz", hash = "sha256:aad3ecc9e4dce2dd2bb79526c81b92e5322fd81db7834a031cb80359f2e3ebaa", size = 850756, upload-time = "2026-04-16T13:26:29.241Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/5a/6ff2d76618e4cac531ea51d4ef44c6add36575a84c3f0f8877aee68c951a/langchain_core-1.2.23-py3-none-any.whl", hash = "sha256:70866dfc5275b7840ce272ff70f0ff216c8666ab25dc1b41964a4ef58c02a3ff", size = 506709, upload-time = "2026-03-27T23:28:13.372Z" }, + { url = "https://files.pythonhosted.org/packages/52/02/668ddf4f1cf963ad691bdbea672a85244e6271eb0a4acfaf662bbd94a3b1/langchain_core-1.2.31-py3-none-any.whl", hash = "sha256:c407193edb99311cc36ec3e4d3667a065bbc4d7d72fbb6e368538b9b134d4033", size = 513264, upload-time = "2026-04-16T13:26:27.566Z" }, ] [[package]] From 9afab3028b107314f91724a40fc88cab71b157b7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 11:53:39 -0400 Subject: [PATCH 04/15] Update dependency langchain-openai to v1.1.14 [SECURITY] (#493) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 44884f18..cf70ba7d 100644 --- a/uv.lock +++ b/uv.lock @@ -2292,16 +2292,16 @@ wheels = [ [[package]] name = "langchain-openai" -version = "1.1.11" +version = "1.1.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "sys_platform != 'win32'" }, { name = "openai", marker = "sys_platform != 'win32'" }, { name = "tiktoken", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/cd/439be2b8deb8bd0d4c470c7c7f66698a84d823e583c3d36a322483cb7cab/langchain_openai-1.1.11.tar.gz", hash = "sha256:44b003a2960d1f6699f23721196b3b97d0c420d2e04444950869213214b7a06a", size = 1088560, upload-time = "2026-03-09T23:02:36.894Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/f5/b1a56f703fb90952b07ff9fb5507123a39df1267d62a7f2bb821c5dbb628/langchain_openai-1.1.14.tar.gz", hash = "sha256:71b4262932fabe506ce79c175dbc956cc48f24d81e20b27662df493147750643", size = 1115195, upload-time = "2026-04-16T14:55:24.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/0f/e4cb42848c25f65969adfb500a06dea1a541831604250fd0d8aa6e54fef5/langchain_openai-1.1.11-py3-none-any.whl", hash = "sha256:a03596221405d38d6852fb865467cb0d9ff9e79f335905eb6a576e8c4874ac71", size = 87694, upload-time = "2026-03-09T23:02:35.651Z" }, + { url = "https://files.pythonhosted.org/packages/0b/fa/8c33befbc0cf81b21371cc1dab4e7bf94a80b8116194f263a5021ec02529/langchain_openai-1.1.14-py3-none-any.whl", hash = "sha256:cb525d2011f9813fc15a7dcfd4bca5b87badcbcb2c113a7fbe45d1b8a1bbb69c", size = 88705, upload-time = "2026-04-16T14:55:23.159Z" }, ] [[package]] From b6b7faa8303b4e1e61887eeb438c932072f0fbbc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 12:18:03 -0400 Subject: [PATCH 05/15] Update dependency litellm to v1.83.0 [SECURITY] (#491) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 71 +++++++++++++++++++-------------------------------------- 1 file changed, 24 insertions(+), 47 deletions(-) diff --git a/uv.lock b/uv.lock index cf70ba7d..7b28f7ba 100644 --- a/uv.lock +++ b/uv.lock @@ -582,11 +582,11 @@ wheels = [ [[package]] name = "click" -version = "8.3.1" +version = "8.1.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, ] [[package]] @@ -1652,14 +1652,14 @@ wheels = [ [[package]] name = "importlib-metadata" -version = "8.7.1" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304, upload-time = "2024-09-11T14:56:08.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514, upload-time = "2024-09-11T14:56:07.019Z" }, ] [[package]] @@ -1890,7 +1890,7 @@ wheels = [ [[package]] name = "jsonschema" -version = "4.26.0" +version = "4.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "sys_platform != 'win32'" }, @@ -1898,9 +1898,9 @@ dependencies = [ { name = "referencing", marker = "sys_platform != 'win32'" }, { name = "rpds-py", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778, upload-time = "2024-07-08T18:40:05.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462, upload-time = "2024-07-08T18:40:00.165Z" }, ] [package.optional-dependencies] @@ -1911,7 +1911,6 @@ format-nongpl = [ { name = "jsonpointer", marker = "sys_platform != 'win32'" }, { name = "rfc3339-validator", marker = "sys_platform != 'win32'" }, { name = "rfc3986-validator", marker = "sys_platform != 'win32'" }, - { name = "rfc3987-syntax", marker = "sys_platform != 'win32'" }, { name = "uri-template", marker = "sys_platform != 'win32'" }, { name = "webcolors", marker = "sys_platform != 'win32'" }, ] @@ -2411,15 +2410,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e8/46/9294d4f49de6a8f08e8b83907713ca545459d87d474c6add15d31a36f5dc/langsmith-0.7.20-py3-none-any.whl", hash = "sha256:0162faf791ea48d69009a12a3da917468556b99cf5d5fcacbb8cda064262e118", size = 359314, upload-time = "2026-03-18T00:03:37.59Z" }, ] -[[package]] -name = "lark" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, -] - [[package]] name = "learn-ai" version = "0.71.0" @@ -2648,7 +2638,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.82.4" +version = "1.83.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "sys_platform != 'win32'" }, @@ -2664,9 +2654,9 @@ dependencies = [ { name = "tiktoken", marker = "sys_platform != 'win32'" }, { name = "tokenizers", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/79/b492be13542aebd62aafc0490e4d5d6e8e00ce54240bcabf5c3e46b1a49b/litellm-1.82.4.tar.gz", hash = "sha256:9c52b1c0762cb0593cdc97b26a8e05004e19b03f394ccd0f42fac82eff0d4980", size = 17378196, upload-time = "2026-03-18T01:18:05.378Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/2b/b58bf6bbcbc3d0e55d0a84fdf9128e5b1436517f46fce89b1cd8948ebb81/litellm-1.83.7.tar.gz", hash = "sha256:e2f2cb99df2e2b2eab63f1354faa45c88dd7c8d40c18eb648afb1b349c689633", size = 17791694, upload-time = "2026-04-13T17:35:01.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/ad/7eaa1121c6b191f2f5f2e8c7379823ece6ec83741a4b3c81b82fe2832401/litellm-1.82.4-py3-none-any.whl", hash = "sha256:d37c34a847e7952a146ed0e2888a24d3edec7787955c6826337395e755ad5c4b", size = 15559801, upload-time = "2026-03-18T01:18:02.026Z" }, + { url = "https://files.pythonhosted.org/packages/75/80/caeb4cdcad96451ba83ad3ba2a9da08b1e1a915fa845c489f56ea044488b/litellm-1.83.7-py3-none-any.whl", hash = "sha256:5784a1d9a9a4a8acd6ca1e347003a5e2e1b3c749b4d41e7da4904577adade111", size = 16069807, upload-time = "2026-04-13T17:34:58.36Z" }, ] [[package]] @@ -3141,7 +3131,7 @@ wheels = [ [[package]] name = "openai" -version = "2.29.0" +version = "2.30.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform != 'win32'" }, @@ -3153,9 +3143,9 @@ dependencies = [ { name = "tqdm", marker = "sys_platform != 'win32'" }, { name = "typing-extensions", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/15/203d537e58986b5673e7f232453a2a2f110f22757b15921cbdeea392e520/openai-2.29.0.tar.gz", hash = "sha256:32d09eb2f661b38d3edd7d7e1a2943d1633f572596febe64c0cd370c86d52bec", size = 671128, upload-time = "2026-03-17T17:53:49.599Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/15/52580c8fbc16d0675d516e8749806eda679b16de1e4434ea06fb6feaa610/openai-2.30.0.tar.gz", hash = "sha256:92f7661c990bda4b22a941806c83eabe4896c3094465030dd882a71abe80c885", size = 676084, upload-time = "2026-03-25T22:08:59.96Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/b1/35b6f9c8cf9318e3dbb7146cc82dab4cf61182a8d5406fc9b50864362895/openai-2.29.0-py3-none-any.whl", hash = "sha256:b7c5de513c3286d17c5e29b92c4c98ceaf0d775244ac8159aeb1bddf840eb42a", size = 1141533, upload-time = "2026-03-17T17:53:47.348Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9e/5bfa2270f902d5b92ab7d41ce0475b8630572e71e349b2a4996d14bdda93/openai-2.30.0-py3-none-any.whl", hash = "sha256:9a5ae616888eb2748ec5e0c5b955a51592e0b201a11f4262db920f2a78c5231d", size = 1146656, upload-time = "2026-03-25T22:08:58.2Z" }, ] [[package]] @@ -3949,15 +3939,14 @@ wheels = [ [[package]] name = "pytest-env" -version = "1.6.0" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest", marker = "sys_platform != 'win32'" }, - { name = "python-dotenv", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/69/4db1c30625af0621df8dbe73797b38b6d1b04e15d021dd5d26a6d297f78c/pytest_env-1.6.0.tar.gz", hash = "sha256:ac02d6fba16af54d61e311dd70a3c61024a4e966881ea844affc3c8f0bf207d3", size = 16163, upload-time = "2026-03-12T22:39:43.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/12/9c87d0ca45d5992473208bcef2828169fa7d39b8d7fc6e3401f5c08b8bf7/pytest_env-1.2.0.tar.gz", hash = "sha256:475e2ebe8626cee01f491f304a74b12137742397d6c784ea4bc258f069232b80", size = 8973, upload-time = "2025-10-09T19:15:47.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/16/ad52f56b96d851a2bcfdc1e754c3531341885bd7177a128c13ff2ca72ab4/pytest_env-1.6.0-py3-none-any.whl", hash = "sha256:1e7f8a62215e5885835daaed694de8657c908505b964ec8097a7ce77b403d9a3", size = 10400, upload-time = "2026-03-12T22:39:41.887Z" }, + { url = "https://files.pythonhosted.org/packages/27/98/822b924a4a3eb58aacba84444c7439fce32680592f394de26af9c76e2569/pytest_env-1.2.0-py3-none-any.whl", hash = "sha256:d7e5b7198f9b83c795377c09feefa45d56083834e60d04767efd64819fc9da00", size = 6251, upload-time = "2025-10-09T19:15:46.077Z" }, ] [[package]] @@ -4017,11 +4006,11 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.2.2" +version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload-time = "2024-01-23T06:33:00.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload-time = "2024-01-23T06:32:58.246Z" }, ] [[package]] @@ -4307,18 +4296,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, ] -[[package]] -name = "rfc3987-syntax" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lark", marker = "sys_platform != 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, -] - [[package]] name = "rich" version = "14.3.3" @@ -4821,7 +4798,7 @@ wheels = [ [[package]] name = "typer" -version = "0.24.1" +version = "0.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc", marker = "sys_platform != 'win32'" }, @@ -4829,9 +4806,9 @@ dependencies = [ { name = "rich", marker = "sys_platform != 'win32'" }, { name = "shellingham", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" }, ] [[package]] From a51abe9e8b027a6c1444444e1d877890f09915bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 12:18:38 -0400 Subject: [PATCH 06/15] Update dependency axios to v1.15.0 [SECURITY] (#490) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend-demo/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend-demo/yarn.lock b/frontend-demo/yarn.lock index abfbeee8..87f7820b 100644 --- a/frontend-demo/yarn.lock +++ b/frontend-demo/yarn.lock @@ -3612,13 +3612,13 @@ __metadata: linkType: hard "axios@npm:^1.6.5, axios@npm:^1.7.7": - version: 1.13.5 - resolution: "axios@npm:1.13.5" + version: 1.15.0 + resolution: "axios@npm:1.15.0" dependencies: follow-redirects: "npm:^1.15.11" form-data: "npm:^4.0.5" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/abf468c34f2d145f3dc7dbc0f1be67e520630624307bda69a41bbe8d386bd672d87b4405c4ee77f9ff54b235ab02f96a9968fb00e75b13ce64706e352a3068fd + proxy-from-env: "npm:^2.1.0" + checksum: 10c0/47e0f860e98d4d7aa145e89ce0cae00e1fb0f1d2485f065c21fce955ddb1dba4103a46bd0e47acd18a27208a7f62c96249e620db575521b92a968619ab133409 languageName: node linkType: hard @@ -9301,10 +9301,10 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b +"proxy-from-env@npm:^2.1.0": + version: 2.1.0 + resolution: "proxy-from-env@npm:2.1.0" + checksum: 10c0/ed01729fd4d094eab619cd7e17ce3698b3413b31eb102c4904f9875e677cd207392795d5b4adee9cec359dfd31c44d5ad7595a3a3ad51c40250e141512281c58 languageName: node linkType: hard From b8bf2bdac2fab2106fd6cb242ebe3e83dd19458a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 12:26:24 -0400 Subject: [PATCH 07/15] Update dependency pytest to v9.0.3 [SECURITY] (#489) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 7b28f7ba..668035ae 100644 --- a/uv.lock +++ b/uv.lock @@ -3886,7 +3886,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.0.2" +version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "iniconfig", marker = "sys_platform != 'win32'" }, @@ -3894,9 +3894,9 @@ dependencies = [ { name = "pluggy", marker = "sys_platform != 'win32'" }, { name = "pygments", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] From c2bd57b7c03ea702e54f605f1e0825fbfb040b17 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 12:31:53 -0400 Subject: [PATCH 08/15] Update dependency next to v15.5.15 [SECURITY] (#488) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend-demo/package.json | 2 +- frontend-demo/yarn.lock | 82 +++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/frontend-demo/package.json b/frontend-demo/package.json index 2fef30e4..2bfbdb0e 100644 --- a/frontend-demo/package.json +++ b/frontend-demo/package.json @@ -29,7 +29,7 @@ "axios": "^1.7.7", "better-react-mathjax": "^2.3.0", "formik": "^2.4.6", - "next": "15.5.14", + "next": "15.5.15", "react": "19.2.3", "react-dom": "19.2.3", "tiny-invariant": "^1.3.3", diff --git a/frontend-demo/yarn.lock b/frontend-demo/yarn.lock index 87f7820b..9ad118c1 100644 --- a/frontend-demo/yarn.lock +++ b/frontend-demo/yarn.lock @@ -1921,10 +1921,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.5.14": - version: 15.5.14 - resolution: "@next/env@npm:15.5.14" - checksum: 10c0/b5978e18d8ca31c8bf2d43966cddf7067faa11e660ca230ec28e4ca1faa363e71baffa32009c02675535f62b81de34e81f8752402a61ab6fd8f9da6022b50b4f +"@next/env@npm:15.5.15": + version: 15.5.15 + resolution: "@next/env@npm:15.5.15" + checksum: 10c0/f22ceea51866896ba0b981c74283b4637b109100efa3a3b5ed2cd0943fb7e0434fb686185a33c6dee2ede4801a4e071b6e50526bbff54cdbdc0973dfd149883f languageName: node linkType: hard @@ -1937,58 +1937,58 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-darwin-arm64@npm:15.5.14" +"@next/swc-darwin-arm64@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-darwin-arm64@npm:15.5.15" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-darwin-x64@npm:15.5.14" +"@next/swc-darwin-x64@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-darwin-x64@npm:15.5.15" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-linux-arm64-gnu@npm:15.5.14" +"@next/swc-linux-arm64-gnu@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-arm64-gnu@npm:15.5.15" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-linux-arm64-musl@npm:15.5.14" +"@next/swc-linux-arm64-musl@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-arm64-musl@npm:15.5.15" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-linux-x64-gnu@npm:15.5.14" +"@next/swc-linux-x64-gnu@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-x64-gnu@npm:15.5.15" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-linux-x64-musl@npm:15.5.14" +"@next/swc-linux-x64-musl@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-linux-x64-musl@npm:15.5.15" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-win32-arm64-msvc@npm:15.5.14" +"@next/swc-win32-arm64-msvc@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-win32-arm64-msvc@npm:15.5.15" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.5.14": - version: 15.5.14 - resolution: "@next/swc-win32-x64-msvc@npm:15.5.14" +"@next/swc-win32-x64-msvc@npm:15.5.15": + version: 15.5.15 + resolution: "@next/swc-win32-x64-msvc@npm:15.5.15" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -8630,18 +8630,18 @@ __metadata: linkType: hard "next@npm:^15.0.2": - version: 15.5.14 - resolution: "next@npm:15.5.14" - dependencies: - "@next/env": "npm:15.5.14" - "@next/swc-darwin-arm64": "npm:15.5.14" - "@next/swc-darwin-x64": "npm:15.5.14" - "@next/swc-linux-arm64-gnu": "npm:15.5.14" - "@next/swc-linux-arm64-musl": "npm:15.5.14" - "@next/swc-linux-x64-gnu": "npm:15.5.14" - "@next/swc-linux-x64-musl": "npm:15.5.14" - "@next/swc-win32-arm64-msvc": "npm:15.5.14" - "@next/swc-win32-x64-msvc": "npm:15.5.14" + version: 15.5.15 + resolution: "next@npm:15.5.15" + dependencies: + "@next/env": "npm:15.5.15" + "@next/swc-darwin-arm64": "npm:15.5.15" + "@next/swc-darwin-x64": "npm:15.5.15" + "@next/swc-linux-arm64-gnu": "npm:15.5.15" + "@next/swc-linux-arm64-musl": "npm:15.5.15" + "@next/swc-linux-x64-gnu": "npm:15.5.15" + "@next/swc-linux-x64-musl": "npm:15.5.15" + "@next/swc-win32-arm64-msvc": "npm:15.5.15" + "@next/swc-win32-x64-msvc": "npm:15.5.15" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -8684,7 +8684,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/ea42e93e3f3218b6eace754c29deb72cdf10545186a5c2c688291276777c86c3097eadf774e60bbca02e7e9260f5255c1f5053879a19adfd796bada3d7dcf68b + checksum: 10c0/580750feebdf3035478816dcd819d216193ea0873b1f2844790b271235790129b5e8364499256a825d9b493baeddf94a39d05691f1b17ae418f39571a2381bbc languageName: node linkType: hard From 8115fdcc0b05e522c2d612e87b14c79845061cc0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 13:35:14 -0400 Subject: [PATCH 09/15] Update dependency langsmith to v0.7.31 [SECURITY] (#487) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 668035ae..8961f22c 100644 --- a/uv.lock +++ b/uv.lock @@ -2392,7 +2392,7 @@ wheels = [ [[package]] name = "langsmith" -version = "0.7.20" +version = "0.7.32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "sys_platform != 'win32'" }, @@ -2405,9 +2405,9 @@ dependencies = [ { name = "xxhash", marker = "sys_platform != 'win32'" }, { name = "zstandard", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/c6/cbdc6638207f68a3c61ec0b64fa593f6b11de3170d03c852238c31b54960/langsmith-0.7.20.tar.gz", hash = "sha256:fa983a74f75648ee0e80d3f9751162b6f9a438896d5f9bdb6cba9abda451e234", size = 1134732, upload-time = "2026-03-18T00:03:39.129Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/b4/a0b4a501bee6b8a741ce29f8c48155b132118483cddc6f9247735ddb38fa/langsmith-0.7.32.tar.gz", hash = "sha256:b59b8e106d0e4c4842e158229296086e2aa7c561e3f602acda73d3ad0062e915", size = 1184518, upload-time = "2026-04-15T23:42:41.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/46/9294d4f49de6a8f08e8b83907713ca545459d87d474c6add15d31a36f5dc/langsmith-0.7.20-py3-none-any.whl", hash = "sha256:0162faf791ea48d69009a12a3da917468556b99cf5d5fcacbb8cda064262e118", size = 359314, upload-time = "2026-03-18T00:03:37.59Z" }, + { url = "https://files.pythonhosted.org/packages/62/bc/148f98ac7dad73ac5e1b1c985290079cfeeb9ba13d760a24f25002beb2c9/langsmith-0.7.32-py3-none-any.whl", hash = "sha256:e1fde928990c4c52f47dc5132708cec674355d9101723d564183e965f383bf5f", size = 378272, upload-time = "2026-04-15T23:42:39.905Z" }, ] [[package]] From e16b4645d7e8a49a01359abbec906f0eda871288 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 13:50:33 -0400 Subject: [PATCH 10/15] Update dependency setuptools to v78 [SECURITY] (#472) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 8961f22c..87a0868b 100644 --- a/uv.lock +++ b/uv.lock @@ -4481,11 +4481,11 @@ langgraph = [ [[package]] name = "setuptools" -version = "77.0.3" +version = "81.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/ed/7101d53811fd359333583330ff976e5177c5e871ca8b909d1d6c30553aa3/setuptools-77.0.3.tar.gz", hash = "sha256:583b361c8da8de57403743e756609670de6fb2345920e36dc5c2d914c319c945", size = 1367236, upload-time = "2025-03-20T14:38:08.777Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/07/99f2cefae815c66eb23148f15d79ec055429c38fa8986edcc712ab5f3223/setuptools-77.0.3-py3-none-any.whl", hash = "sha256:67122e78221da5cf550ddd04cf8742c8fe12094483749a792d56cd669d6cf58c", size = 1255678, upload-time = "2025-03-20T14:38:06.621Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, ] [[package]] From 89c01597d8d84e1aa01d71b06f5c3c288fa1aacc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 14:56:25 -0400 Subject: [PATCH 11/15] Update dependency langgraph to v1.0.10 [SECURITY] (#452) --- ai_chatbots/consumers_test.py | 21 +++++++++++---------- pyproject.toml | 2 +- uv.lock | 14 +++++++------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ai_chatbots/consumers_test.py b/ai_chatbots/consumers_test.py index be00a5e3..baf9ea9e 100644 --- a/ai_chatbots/consumers_test.py +++ b/ai_chatbots/consumers_test.py @@ -10,6 +10,7 @@ from django.contrib.auth.models import AnonymousUser from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_encode +from langgraph.checkpoint.memory import InMemorySaver from rest_framework.exceptions import ValidationError from ai_chatbots import consumers, prompts @@ -341,7 +342,7 @@ async def test_disconnect(mocker, recommendation_consumer, has_layer): async def test_syllabus_create_chatbot( - mocker, mock_http_consumer_send, syllabus_consumer, async_user + mock_http_consumer_send, syllabus_consumer, async_user ): """SyllabusBotHttpConsumer create_chatbot function should return syllabus bot.""" serializer = consumers.SyllabusChatRequestSerializer( @@ -356,7 +357,7 @@ async def test_syllabus_create_chatbot( serializer.is_valid(raise_exception=True) await syllabus_consumer.prepare_response(serializer) chatbot = await sync_to_async(syllabus_consumer.create_chatbot)( - serializer, mocker.Mock() + serializer, InMemorySaver() ) assert isinstance(chatbot, SyllabusBot) assert chatbot.user_id == async_user.global_id @@ -365,7 +366,7 @@ async def test_syllabus_create_chatbot( async def test_syllabus_create_chatbot_with_related_courses( - mocker, mock_http_consumer_send, syllabus_consumer, async_user + mock_http_consumer_send, syllabus_consumer, async_user ): """SyllabusBotHttpConsumer should enable related courses when related_courses provided.""" serializer = consumers.SyllabusChatRequestSerializer( @@ -378,7 +379,7 @@ async def test_syllabus_create_chatbot_with_related_courses( serializer.is_valid(raise_exception=True) await syllabus_consumer.prepare_response(serializer) chatbot = await sync_to_async(syllabus_consumer.create_chatbot)( - serializer, mocker.Mock() + serializer, InMemorySaver() ) assert isinstance(chatbot, SyllabusBot) assert chatbot.enable_related_courses is True @@ -386,7 +387,7 @@ async def test_syllabus_create_chatbot_with_related_courses( async def test_syllabus_create_chatbot_without_related_courses( - mocker, mock_http_consumer_send, syllabus_consumer, async_user + mock_http_consumer_send, syllabus_consumer, async_user ): """SyllabusBotHttpConsumer should not enable related courses when related_courses absent.""" serializer = consumers.SyllabusChatRequestSerializer( @@ -398,7 +399,7 @@ async def test_syllabus_create_chatbot_without_related_courses( serializer.is_valid(raise_exception=True) await syllabus_consumer.prepare_response(serializer) chatbot = await sync_to_async(syllabus_consumer.create_chatbot)( - serializer, mocker.Mock() + serializer, InMemorySaver() ) assert isinstance(chatbot, SyllabusBot) assert chatbot.enable_related_courses is False @@ -450,7 +451,7 @@ def test_canvas_syllabus_process_extra_state(canvas_syllabus_consumer): } -async def test_canvas_syllabus_create_chatbot(mocker, canvas_syllabus_consumer): +async def test_canvas_syllabus_create_chatbot(canvas_syllabus_consumer): """The correct chatbot class should be assigned to self.chatbot""" serializer = consumers.SyllabusChatRequestSerializer( data={ @@ -462,7 +463,7 @@ async def test_canvas_syllabus_create_chatbot(mocker, canvas_syllabus_consumer): serializer.is_valid() await canvas_syllabus_consumer.prepare_response(serializer) bot = await sync_to_async(canvas_syllabus_consumer.create_chatbot)( - serializer, mocker.Mock() + serializer, InMemorySaver() ) assert bot.__class__ == consumers.CanvasSyllabusBot @@ -883,7 +884,7 @@ async def canvas_test_tutor_agent_handle( async def test_video_gpt_create_chatbot( - mocker, mock_http_consumer_send, video_gpt_consumer, async_user + mock_http_consumer_send, video_gpt_consumer, async_user ): """VideoGPTBotHttpConsumer create_chatbot function should return VideoGPTBot.""" serializer = consumers.VideoGPTRequestSerializer( @@ -897,7 +898,7 @@ async def test_video_gpt_create_chatbot( serializer.is_valid(raise_exception=True) await video_gpt_consumer.prepare_response(serializer) chatbot = await sync_to_async(video_gpt_consumer.create_chatbot)( - serializer, mocker.Mock() + serializer, InMemorySaver() ) assert isinstance(chatbot, VideoGPTBot) assert chatbot.user_id == async_user.global_id diff --git a/pyproject.toml b/pyproject.toml index 23da078a..c1b1678c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ dependencies = [ "langchain-core>=1.1.0,<2", "langchain-litellm>=0.6.1,<0.7", "langchain-openai>=1.1.0,<2", - "langgraph==1.0.4", + "langgraph==1.0.10", "langmem>=0.0.30,<0.0.31", "langsmith>=0.7.0,<0.8", "litellm>=1.53.5,<2", diff --git a/uv.lock b/uv.lock index 87a0868b..62228f2c 100644 --- a/uv.lock +++ b/uv.lock @@ -2317,7 +2317,7 @@ wheels = [ [[package]] name = "langgraph" -version = "1.0.4" +version = "1.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "sys_platform != 'win32'" }, @@ -2327,9 +2327,9 @@ dependencies = [ { name = "pydantic", marker = "sys_platform != 'win32'" }, { name = "xxhash", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/3c/af87902d300c1f467165558c8966d8b1e1f896dace271d3f35a410a5c26a/langgraph-1.0.4.tar.gz", hash = "sha256:86d08e25d7244340f59c5200fa69fdd11066aa999b3164b531e2a20036fac156", size = 484397, upload-time = "2025-11-25T20:31:48.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/92/14df6fefba28c10caf1cb05aa5b8c7bf005838fe32a86d903b6c7cc4018d/langgraph-1.0.10.tar.gz", hash = "sha256:73bd10ee14a8020f31ef07e9cd4c1a70c35cc07b9c2b9cd637509a10d9d51e29", size = 511644, upload-time = "2026-02-27T21:04:38.743Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/52/4eb25a3f60399da34ba34adff1b3e324cf0d87eb7a08cebf1882a9b5e0d5/langgraph-1.0.4-py3-none-any.whl", hash = "sha256:b1a835ceb0a8d69b9db48075e1939e28b1ad70ee23fa3fa8f90149904778bacf", size = 157271, upload-time = "2025-11-25T20:31:47.518Z" }, + { url = "https://files.pythonhosted.org/packages/5d/60/260e0c04620a37ba8916b712766c341cc5fc685dabc6948c899494bbc2ae/langgraph-1.0.10-py3-none-any.whl", hash = "sha256:7c298bef4f6ea292fcf9824d6088fe41a6727e2904ad6066f240c4095af12247", size = 160920, upload-time = "2026-02-27T21:04:35.932Z" }, ] [[package]] @@ -2360,15 +2360,15 @@ wheels = [ [[package]] name = "langgraph-sdk" -version = "0.2.15" +version = "0.3.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "sys_platform != 'win32'" }, { name = "orjson", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/46/a0bc5914e4a418ad5e8558b19bccd6f0baf56d0c674d6d65a0acf4f22590/langgraph_sdk-0.2.15.tar.gz", hash = "sha256:8faaafe2c1193b89f782dd66c591060cd67862aa6aaf283749b7846f331d5334", size = 130343, upload-time = "2025-12-09T19:26:40.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/db/77a45127dddcfea5e4256ba916182903e4c31dc4cfca305b8c386f0a9e53/langgraph_sdk-0.3.13.tar.gz", hash = "sha256:419ca5663eec3cec192ad194ac0647c0c826866b446073eb40f384f950986cd5", size = 196360, upload-time = "2026-04-07T20:34:18.766Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/c9/bf2bff18f85bb7973fa5280838580049574bd7649c36e3dd346c49304997/langgraph_sdk-0.2.15-py3-none-any.whl", hash = "sha256:746566a5d89aa47160eccc17d71682a78771c754126f6c235a68353d61ed7462", size = 66483, upload-time = "2025-12-09T19:26:39.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ef/64d64e9f8eea47ce7b939aa6da6863b674c8d418647813c20111645fcc62/langgraph_sdk-0.3.13-py3-none-any.whl", hash = "sha256:aee09e345c90775f6de9d6f4c7b847cfc652e49055c27a2aed0d981af2af3bd0", size = 96668, upload-time = "2026-04-07T20:34:17.866Z" }, ] [[package]] @@ -2550,7 +2550,7 @@ requires-dist = [ { name = "langchain-core", specifier = ">=1.1.0,<2" }, { name = "langchain-litellm", specifier = ">=0.6.1,<0.7" }, { name = "langchain-openai", specifier = ">=1.1.0,<2" }, - { name = "langgraph", specifier = "==1.0.4" }, + { name = "langgraph", specifier = "==1.0.10" }, { name = "langmem", specifier = ">=0.0.30,<0.0.31" }, { name = "langsmith", specifier = ">=0.7.0,<0.8" }, { name = "litellm", specifier = ">=1.53.5,<2" }, From 578c3afb6122c48f2ba3727a76c96e558f9d9d89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:41:49 -0400 Subject: [PATCH 12/15] Update all non-major dev-dependencies (#467) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend-demo/package.json | 34 +-- frontend-demo/yarn.lock | 602 +++++++++++++++++++++++++------------ 2 files changed, 419 insertions(+), 217 deletions(-) diff --git a/frontend-demo/package.json b/frontend-demo/package.json index 2bfbdb0e..790ca0a3 100644 --- a/frontend-demo/package.json +++ b/frontend-demo/package.json @@ -36,46 +36,46 @@ "yup": "^1.6.1" }, "devDependencies": { - "@faker-js/faker": "^10.0.0", - "@swc/core": "^1.9.3", + "@faker-js/faker": "^10.1.0", + "@swc/core": "^1.14.0", "@swc/jest": "^0.2.37", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.0.1", + "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.5.2", "@types/http-proxy": "^1", "@types/jest": "^29.5.14", "@types/jest-when": "^3", - "@types/lodash": "^4.17.13", - "@types/node": "^22.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "@typescript-eslint/eslint-plugin": "^8.13.0", - "@typescript-eslint/typescript-estree": "^8.13.0", + "@types/lodash": "^4.17.20", + "@types/node": "^22.18.13", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/typescript-estree": "^8.46.2", "eslint": "^8", "eslint-config-mitodl": "^2.1.0", - "eslint-config-next": "15.5.12", + "eslint-config-next": "15.5.15", "eslint-config-prettier": "^10.0.0", "eslint-import-resolver-typescript": "^4.0.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^29.0.0", - "eslint-plugin-mdx": "^3.0.0", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-mdx": "^3.7.0", "eslint-plugin-react": "^7.34.3", "eslint-plugin-react-hooks": "^7.0.0", "eslint-plugin-styled-components-a11y": "^2.1.35", - "eslint-plugin-testing-library": "^7.0.0", + "eslint-plugin-testing-library": "^7.16.2", "http-proxy": "^1.18.1", "jest": "^29.7.0", "jest-environment-jsdom": "^29.5.0", "jest-extended": "^7.0.0", - "jest-fail-on-console": "^3.2.0", + "jest-fail-on-console": "^3.3.1", "jest-watch-typeahead": "^2.2.2", "jest-when": "^3.6.0", "next": "^15.0.2", - "prettier": "^3.3.3", - "serve": "^14.2.4", + "prettier": "^3.6.2", + "serve": "^14.2.5", "ts-node": "^10.9.2", - "type-fest": "^5.0.0", + "type-fest": "^5.5.0", "typescript": "^5.6.3" } } diff --git a/frontend-demo/yarn.lock b/frontend-demo/yarn.lock index 9ad118c1..d3a8b716 100644 --- a/frontend-demo/yarn.lock +++ b/frontend-demo/yarn.lock @@ -845,7 +845,18 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/eslint-utils@npm:^4.9.1": + version: 4.9.1 + resolution: "@eslint-community/eslint-utils@npm:4.9.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/dc4ab5e3e364ef27e33666b11f4b86e1a6c1d7cbf16f0c6ff87b1619b3562335e9201a3d6ce806221887ff780ec9d828962a290bb910759fd40a674686503f02 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.2, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.2 resolution: "@eslint-community/regexpp@npm:4.12.2" checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d @@ -876,10 +887,10 @@ __metadata: languageName: node linkType: hard -"@faker-js/faker@npm:^10.0.0": - version: 10.1.0 - resolution: "@faker-js/faker@npm:10.1.0" - checksum: 10c0/3dc277245ec1bef8b839a9dc45b4ccb1688d21b8bde6531a849c1773193de30047e40e085b7e900c42c940911ecf1645b582ad3c85093df5bfdbddeb44a2b554 +"@faker-js/faker@npm:^10.1.0": + version: 10.4.0 + resolution: "@faker-js/faker@npm:10.4.0" + checksum: 10c0/29f15e46f91757d654f6f42ac8313ac4aebb6591e2ebae7fdd8d36d5017490327ea67be37cff06d18303db54abf468524bcc7e4b1de53be4eb884c1f71d571c1 languageName: node linkType: hard @@ -1928,12 +1939,12 @@ __metadata: languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.5.12": - version: 15.5.12 - resolution: "@next/eslint-plugin-next@npm:15.5.12" +"@next/eslint-plugin-next@npm:15.5.15": + version: 15.5.15 + resolution: "@next/eslint-plugin-next@npm:15.5.15" dependencies: fast-glob: "npm:3.3.1" - checksum: 10c0/c9a88aa628ad77c8ab12112835227ef093db72846223ce559881b0fc99ce7b61324f1bcd987309b4682c397293f633f4ad4f38a3d8527a84c7b51521b89a7dd9 + checksum: 10c0/7fdca273f3737dfd0d3abd0d1cc21003ecb6f30dad7801433c3d725649f6f784fdc9f84c529b58a3245cfc33e43f3056e37f7b7de55de6a5dd2365bea775ff80 languageName: node linkType: hard @@ -2224,92 +2235,108 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-darwin-arm64@npm:1.14.0" +"@swc/core-darwin-arm64@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-darwin-arm64@npm:1.15.30" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-darwin-x64@npm:1.14.0" +"@swc/core-darwin-x64@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-darwin-x64@npm:1.15.30" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.14.0" +"@swc/core-linux-arm-gnueabihf@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.30" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-linux-arm64-gnu@npm:1.14.0" +"@swc/core-linux-arm64-gnu@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-arm64-gnu@npm:1.15.30" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-linux-arm64-musl@npm:1.14.0" +"@swc/core-linux-arm64-musl@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-arm64-musl@npm:1.15.30" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-linux-x64-gnu@npm:1.14.0" +"@swc/core-linux-ppc64-gnu@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-ppc64-gnu@npm:1.15.30" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-s390x-gnu@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-s390x-gnu@npm:1.15.30" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-x64-gnu@npm:1.15.30" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-linux-x64-musl@npm:1.14.0" +"@swc/core-linux-x64-musl@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-linux-x64-musl@npm:1.15.30" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-win32-arm64-msvc@npm:1.14.0" +"@swc/core-win32-arm64-msvc@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-win32-arm64-msvc@npm:1.15.30" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-win32-ia32-msvc@npm:1.14.0" +"@swc/core-win32-ia32-msvc@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-win32-ia32-msvc@npm:1.15.30" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.14.0": - version: 1.14.0 - resolution: "@swc/core-win32-x64-msvc@npm:1.14.0" +"@swc/core-win32-x64-msvc@npm:1.15.30": + version: 1.15.30 + resolution: "@swc/core-win32-x64-msvc@npm:1.15.30" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.9.3": - version: 1.14.0 - resolution: "@swc/core@npm:1.14.0" +"@swc/core@npm:^1.14.0": + version: 1.15.30 + resolution: "@swc/core@npm:1.15.30" dependencies: - "@swc/core-darwin-arm64": "npm:1.14.0" - "@swc/core-darwin-x64": "npm:1.14.0" - "@swc/core-linux-arm-gnueabihf": "npm:1.14.0" - "@swc/core-linux-arm64-gnu": "npm:1.14.0" - "@swc/core-linux-arm64-musl": "npm:1.14.0" - "@swc/core-linux-x64-gnu": "npm:1.14.0" - "@swc/core-linux-x64-musl": "npm:1.14.0" - "@swc/core-win32-arm64-msvc": "npm:1.14.0" - "@swc/core-win32-ia32-msvc": "npm:1.14.0" - "@swc/core-win32-x64-msvc": "npm:1.14.0" + "@swc/core-darwin-arm64": "npm:1.15.30" + "@swc/core-darwin-x64": "npm:1.15.30" + "@swc/core-linux-arm-gnueabihf": "npm:1.15.30" + "@swc/core-linux-arm64-gnu": "npm:1.15.30" + "@swc/core-linux-arm64-musl": "npm:1.15.30" + "@swc/core-linux-ppc64-gnu": "npm:1.15.30" + "@swc/core-linux-s390x-gnu": "npm:1.15.30" + "@swc/core-linux-x64-gnu": "npm:1.15.30" + "@swc/core-linux-x64-musl": "npm:1.15.30" + "@swc/core-win32-arm64-msvc": "npm:1.15.30" + "@swc/core-win32-ia32-msvc": "npm:1.15.30" + "@swc/core-win32-x64-msvc": "npm:1.15.30" "@swc/counter": "npm:^0.1.3" - "@swc/types": "npm:^0.1.25" + "@swc/types": "npm:^0.1.26" peerDependencies: "@swc/helpers": ">=0.5.17" dependenciesMeta: @@ -2323,6 +2350,10 @@ __metadata: optional: true "@swc/core-linux-arm64-musl": optional: true + "@swc/core-linux-ppc64-gnu": + optional: true + "@swc/core-linux-s390x-gnu": + optional: true "@swc/core-linux-x64-gnu": optional: true "@swc/core-linux-x64-musl": @@ -2336,7 +2367,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10c0/40823d5cf408f305ef91debc555109054dfd234117114dddc6078e498b7dfc97a8cb3ef756a4ff09708372457c40cc0804088c9e07ebc8c0e0030fdc4b8bdfba + checksum: 10c0/32193741b047ee1ed68e5539579f55fc4fbc093a3494babf5c87b69bc5c896e0efe9c5c945b52a5f46ebcb7bf289a693becb7e4558db293aafed9a84b3111a13 languageName: node linkType: hard @@ -2369,12 +2400,12 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.25": - version: 0.1.25 - resolution: "@swc/types@npm:0.1.25" +"@swc/types@npm:^0.1.26": + version: 0.1.26 + resolution: "@swc/types@npm:0.1.26" dependencies: "@swc/counter": "npm:^0.1.3" - checksum: 10c0/847a5b20b131281f89d640a7ed4887fb65724807d53d334b230e84b98c21097aa10cd28a074f9ed287a6ce109e443dd4bafbe7dcfb62333d7806c4ea3e7f8aca + checksum: 10c0/8449341e8bbff81c14e9918c25421143cf605dff20f70f048847e1f7cede396f8dd73903cbef331a809b4a8e15d0db374a5f6809003e7b440f93df1dd4934d28 languageName: node linkType: hard @@ -2426,9 +2457,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^16.0.1": - version: 16.3.0 - resolution: "@testing-library/react@npm:16.3.0" +"@testing-library/react@npm:^16.3.0": + version: 16.3.2 + resolution: "@testing-library/react@npm:16.3.2" dependencies: "@babel/runtime": "npm:^7.12.5" peerDependencies: @@ -2442,7 +2473,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/3a2cb1f87c9a67e1ebbbcfd99b94b01e496fc35147be8bc5d8bf07a699c7d523a09d57ef2f7b1d91afccd1a28e21eda3b00d80187fbb51b1de01e422592d845e + checksum: 10c0/f9c7f0915e1b5f7b750e6c7d8b51f091b8ae7ea99bacb761d7b8505ba25de9cfcb749a0f779f1650fb268b499dd79165dc7e1ee0b8b4cb63430d3ddc81ffe044 languageName: node linkType: hard @@ -2705,10 +2736,10 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.17.13": - version: 4.17.20 - resolution: "@types/lodash@npm:4.17.20" - checksum: 10c0/98cdd0faae22cbb8079a01a3bb65aa8f8c41143367486c1cbf5adc83f16c9272a2a5d2c1f541f61d0d73da543c16ee1d21cf2ef86cb93cd0cc0ac3bced6dd88f +"@types/lodash@npm:^4.17.20": + version: 4.17.24 + resolution: "@types/lodash@npm:4.17.24" + checksum: 10c0/b72f60d4daacdad1fa643edb3faba204c02a01eb1ac00a83ff73496a6d236fc55e459c06106e8ced42277dba932d087d8fc090f8de4ef590d3f91e6d6f7ce85a languageName: node linkType: hard @@ -2753,6 +2784,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.18.13": + version: 22.19.17 + resolution: "@types/node@npm:22.19.17" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/b66c484c0a9f6d88b1ef360b0f487717234ee1a482cb2551ff73d9f3c43a42a777daf4c8a5eee970960728f8fe1f3877d3d8c6ffabcbca74cb401a59db700fa4 + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -2767,12 +2807,12 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^19.0.0": - version: 19.2.2 - resolution: "@types/react-dom@npm:19.2.2" +"@types/react-dom@npm:^19.2.2": + version: 19.2.3 + resolution: "@types/react-dom@npm:19.2.3" peerDependencies: "@types/react": ^19.2.0 - checksum: 10c0/6154dfb8e7a638313d7fa15b2b16494f2235afda4c43be37d10f34e5c7a730f6b95117facb5e6eebc73b15cceea7f6da23be46cda5d2262fd00fd7e6069547e3 + checksum: 10c0/b486ebe0f4e2fb35e2e108df1d8fc0927ca5d6002d5771e8a739de11239fe62d0e207c50886185253c99eb9dedfeeb956ea7429e5ba17f6693c7acb4c02f8cd1 languageName: node linkType: hard @@ -2785,12 +2825,12 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^19.0.0": - version: 19.2.2 - resolution: "@types/react@npm:19.2.2" +"@types/react@npm:^19.2.2": + version: 19.2.14 + resolution: "@types/react@npm:19.2.14" dependencies: - csstype: "npm:^3.0.2" - checksum: 10c0/f830b1204aca4634ce3c6cb3477b5d3d066b80a4dd832a4ee0069acb504b6debd2416548a43a11c1407c12bc60e2dc6cf362934a18fe75fe06a69c0a98cba8ab + csstype: "npm:^3.2.2" + checksum: 10c0/7d25bf41b57719452d86d2ac0570b659210402707313a36ee612666bf11275a1c69824f8c3ee1fdca077ccfe15452f6da8f1224529b917050eb2d861e52b59b7 languageName: node linkType: hard @@ -2845,7 +2885,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/eslint-plugin@npm:^8.13.0": +"@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": version: 8.46.2 resolution: "@typescript-eslint/eslint-plugin@npm:8.46.2" dependencies: @@ -2866,6 +2906,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:^8.46.2": + version: 8.59.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.59.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.59.0" + "@typescript-eslint/type-utils": "npm:8.59.0" + "@typescript-eslint/utils": "npm:8.59.0" + "@typescript-eslint/visitor-keys": "npm:8.59.0" + ignore: "npm:^7.0.5" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + "@typescript-eslint/parser": ^8.59.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/f98171ecad6a5106fe978df155f4b65a72dfdadfcd663651b633b61480b543e74796baa224a1393e323f9514901604fe6302323c4b80b79f7a98512a01bc6461 + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": version: 8.46.2 resolution: "@typescript-eslint/parser@npm:8.46.2" @@ -2913,6 +2973,19 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/project-service@npm:8.59.0": + version: 8.59.0 + resolution: "@typescript-eslint/project-service@npm:8.59.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.59.0" + "@typescript-eslint/types": "npm:^8.59.0" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/ffba9595a427235bbeb0e5c7db3486f8d01dd8f8686964b4f82084e82008c49b897d01c4d331f33a9ce29edae70a9286f6fdedec4bf9037d732d9c9e86ebc7ea + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/scope-manager@npm:7.18.0" @@ -2923,7 +2996,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.46.2, @typescript-eslint/scope-manager@npm:^8.15.0": +"@typescript-eslint/scope-manager@npm:8.46.2": version: 8.46.2 resolution: "@typescript-eslint/scope-manager@npm:8.46.2" dependencies: @@ -2933,6 +3006,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.59.0, @typescript-eslint/scope-manager@npm:^8.56.0": + version: 8.59.0 + resolution: "@typescript-eslint/scope-manager@npm:8.59.0" + dependencies: + "@typescript-eslint/types": "npm:8.59.0" + "@typescript-eslint/visitor-keys": "npm:8.59.0" + checksum: 10c0/d372f08be190d01e6d237932dc0d77808a9dc0a34fe8f690a3eac496d6e2f93c030c6ccb5000b35e825a6cfc4d9ca69a00f2ccda334115a9865a9d02cd603e52 + languageName: node + linkType: hard + "@typescript-eslint/tsconfig-utils@npm:8.46.2, @typescript-eslint/tsconfig-utils@npm:^8.46.2": version: 8.46.2 resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.2" @@ -2942,6 +3025,15 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/tsconfig-utils@npm:8.59.0, @typescript-eslint/tsconfig-utils@npm:^8.59.0": + version: 8.59.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.59.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/ab482c22f23774d24b3048c9fcdc5e0b94137064b3af901f4b0327da2270c2b2961c19165ccf8bdeaedfa83138be98c5cd8edcdc89deb6187baf6438cd8584b0 + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:8.46.2": version: 8.46.2 resolution: "@typescript-eslint/type-utils@npm:8.46.2" @@ -2958,6 +3050,22 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:8.59.0": + version: 8.59.0 + resolution: "@typescript-eslint/type-utils@npm:8.59.0" + dependencies: + "@typescript-eslint/types": "npm:8.59.0" + "@typescript-eslint/typescript-estree": "npm:8.59.0" + "@typescript-eslint/utils": "npm:8.59.0" + debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/e2f2176a9bce81c19b53accf4e9189c60b1b84717cf129a6d003a2271019e30d410d2ccdc0fc6a37cbb8274a1b297d7d30a116189110f9d24a86391ee24a9fef + languageName: node + linkType: hard + "@typescript-eslint/types@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/types@npm:7.18.0" @@ -2972,6 +3080,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.59.0, @typescript-eslint/types@npm:^8.59.0": + version: 8.59.0 + resolution: "@typescript-eslint/types@npm:8.59.0" + checksum: 10c0/2750b1e21290dffe90a424fe05c2bab701f60a7b51b5e0921ed14bb1a5fc29ff3fe8f286817d2287e93ff78e33e6626f6ce26d0bc79a729bd608deda77a9bdde + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" @@ -2991,7 +3106,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.46.2, @typescript-eslint/typescript-estree@npm:^8.13.0": +"@typescript-eslint/typescript-estree@npm:8.46.2": version: 8.46.2 resolution: "@typescript-eslint/typescript-estree@npm:8.46.2" dependencies: @@ -3011,7 +3126,26 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.46.2, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.15.0": +"@typescript-eslint/typescript-estree@npm:8.59.0, @typescript-eslint/typescript-estree@npm:^8.46.2": + version: 8.59.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.59.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.59.0" + "@typescript-eslint/tsconfig-utils": "npm:8.59.0" + "@typescript-eslint/types": "npm:8.59.0" + "@typescript-eslint/visitor-keys": "npm:8.59.0" + debug: "npm:^4.4.3" + minimatch: "npm:^10.2.2" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/82d3dfb4de591d9a39d2c4dafc13f14b4940f5b116fb3db311935137aa7e34c9dce3209aaeace118070847b2355df7c185ff1e0f2a36232c3aea9b5fa2652f98 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.46.2, @typescript-eslint/utils@npm:^8.0.0": version: 8.46.2 resolution: "@typescript-eslint/utils@npm:8.46.2" dependencies: @@ -3026,6 +3160,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:8.59.0, @typescript-eslint/utils@npm:^8.56.0": + version: 8.59.0 + resolution: "@typescript-eslint/utils@npm:8.59.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.59.0" + "@typescript-eslint/types": "npm:8.59.0" + "@typescript-eslint/typescript-estree": "npm:8.59.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10c0/eca4e5a18ae8e8c4360b05758fa142465daef3a9dffe4d78b15607b4680698eece96f899bce1e8d83427da74ddfbca80a95456727b8b9239816528978180b047 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" @@ -3046,6 +3195,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.59.0": + version: 8.59.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.59.0" + dependencies: + "@typescript-eslint/types": "npm:8.59.0" + eslint-visitor-keys: "npm:^5.0.0" + checksum: 10c0/09ec24c9c9d0a3ccb57bb2ab3dfd8deca124339aba6621503285c22765a4dfc89bf3d31e337dd647b1cdf89bac384e3a62e0f5b8c1d5a93d16d1f417144e3226 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -3297,15 +3456,15 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.12.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" +"ajv@npm:8.18.0": + version: 8.18.0 + resolution: "ajv@npm:8.18.0" dependencies: - fast-deep-equal: "npm:^3.1.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: 10c0/e7517c426173513a07391be951879932bdf3348feaebd2199f5b901c20f99d60db8cd1591502d4d551dc82f594e82a05c4fe1c70139b15b8937f7afeaed9532f languageName: node linkType: hard @@ -3733,6 +3892,13 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b + languageName: node + linkType: hard + "baseline-browser-mapping@npm:^2.8.19": version: 2.8.21 resolution: "baseline-browser-mapping@npm:2.8.21" @@ -3788,6 +3954,15 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^5.0.5": + version: 5.0.5 + resolution: "brace-expansion@npm:5.0.5" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10c0/4d238e14ed4f5cc9c07285550a41cef23121ca08ba99fa9eb5b55b580dcb6bf868b8210aa10526bdc9f8dc97f33ca2a7259039c4cc131a93042beddb424c48e3 + languageName: node + linkType: hard + "braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" @@ -4317,7 +4492,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.2.3": +"csstype@npm:^3.2.2, csstype@npm:^3.2.3": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce @@ -4384,7 +4559,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -4534,13 +4709,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.0.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 - languageName: node - linkType: hard - "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -4912,11 +5080,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.5.12": - version: 15.5.12 - resolution: "eslint-config-next@npm:15.5.12" +"eslint-config-next@npm:15.5.15": + version: 15.5.15 + resolution: "eslint-config-next@npm:15.5.15" dependencies: - "@next/eslint-plugin-next": "npm:15.5.12" + "@next/eslint-plugin-next": "npm:15.5.15" "@rushstack/eslint-patch": "npm:^1.10.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -4932,7 +5100,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/8aa69f8b9b767fda914ac6902775c13363cbe65c04e3f3c1b2bb6a95705ed0ae8044e625c33cab125cc95799358710acca721da5007649ca780dfdf2b9d1c8be + checksum: 10c0/b7527a42050a605a4e99f8cf5caabce46c90fa33b39a3e2b0bddbe5c3a830ca58cfde2f980eda62b405137317d261eb7b1b0e393e97c723cc5cb072ff50dff2d languageName: node linkType: hard @@ -5021,9 +5189,9 @@ __metadata: languageName: node linkType: hard -"eslint-mdx@npm:^3.6.2": - version: 3.6.2 - resolution: "eslint-mdx@npm:3.6.2" +"eslint-mdx@npm:^3.7.0": + version: 3.7.0 + resolution: "eslint-mdx@npm:3.7.0" dependencies: acorn: "npm:^8.15.0" acorn-jsx: "npm:^5.3.2" @@ -5036,7 +5204,6 @@ __metadata: unified: "npm:^11.0.5" unified-engine: "npm:^11.2.2" unist-util-visit: "npm:^5.0.0" - uvu: "npm:^0.5.6" vfile: "npm:^6.0.3" peerDependencies: eslint: ">=8.0.0" @@ -5044,7 +5211,7 @@ __metadata: peerDependenciesMeta: remark-lint-file-extension: optional: true - checksum: 10c0/07238395e932f5caf47a0301fc61f350a24c57e4bf923601f3e767f02d5f7ac18d708dd59819bcc1af54f16e5e6cc6aabb37a08614faade2a5e3fc317e802424 + checksum: 10c0/e8c4a4616f58ee73d59eb6bf30cbc334530548795855d770abe5377751a44c0cd86cbf534197c36c9f0b5e10cd62f9641e1ad9b9f38cbf8b43ac75fc3057e0bb languageName: node linkType: hard @@ -5089,21 +5256,24 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^29.0.0": - version: 29.0.1 - resolution: "eslint-plugin-jest@npm:29.0.1" +"eslint-plugin-jest@npm:^29.0.1": + version: 29.15.2 + resolution: "eslint-plugin-jest@npm:29.15.2" dependencies: "@typescript-eslint/utils": "npm:^8.0.0" peerDependencies: "@typescript-eslint/eslint-plugin": ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 jest: "*" + typescript: ">=4.8.4 <7.0.0" peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true jest: optional: true - checksum: 10c0/20edc166503a50c10b45f733797d530a5107c91efa25410ef405780d12222a796b5b41ed8f6d2b939632a1af273af6cc5732233463d1f36dbe7680bbb86c4eec + typescript: + optional: true + checksum: 10c0/be8d59b0d4c1ff1afd5294b227cdd190a3a7741fb28f8092d359eda1010cb87ef61c3db6c0a794e9612f745ae008c4d53ee78754d8faf87a22a823b71c9b14e4 languageName: node linkType: hard @@ -5132,11 +5302,11 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-mdx@npm:^3.0.0": - version: 3.6.2 - resolution: "eslint-plugin-mdx@npm:3.6.2" +"eslint-plugin-mdx@npm:^3.7.0": + version: 3.7.0 + resolution: "eslint-plugin-mdx@npm:3.7.0" dependencies: - eslint-mdx: "npm:^3.6.2" + eslint-mdx: "npm:^3.7.0" mdast-util-from-markdown: "npm:^2.0.2" mdast-util-mdx: "npm:^3.0.0" micromark-extension-mdxjs: "npm:^3.0.0" @@ -5148,7 +5318,7 @@ __metadata: vfile: "npm:^6.0.3" peerDependencies: eslint: ">=8.0.0" - checksum: 10c0/16be144348fc6fe66d8a2d7d0f739084991aea5f79c3c4b4b20232ead0e826a5e26806b0fcdbfcda4cef325369a6ad1630bdb1d66a3b3dce9d5c0f765e110ee5 + checksum: 10c0/a79a7900725e022fce2366c52359689e43b0ce4a94a172717068d50f3f51e2e4b53020c8de6582759370fb32934fd163f3768afe4c1f9e630621f27ca0b4bd6c languageName: node linkType: hard @@ -5216,15 +5386,15 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^7.0.0": - version: 7.13.3 - resolution: "eslint-plugin-testing-library@npm:7.13.3" +"eslint-plugin-testing-library@npm:^7.16.2": + version: 7.16.2 + resolution: "eslint-plugin-testing-library@npm:7.16.2" dependencies: - "@typescript-eslint/scope-manager": "npm:^8.15.0" - "@typescript-eslint/utils": "npm:^8.15.0" + "@typescript-eslint/scope-manager": "npm:^8.56.0" + "@typescript-eslint/utils": "npm:^8.56.0" peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/c36847adb1f4d11c9c608eb305c949721714a6a2e838b90958e84747ebe36e62e53e09766fe10fb28e3244d99ce170ee63230b1d44dafc89b9f4494485920301 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + checksum: 10c0/ea99f41eee929e0b139d927f8a89bef7ffe3bd33c51fc3c2c93d8e9d146e146395e1f7bb8a34d4b5bd9a1ffe7a1879959fc171e952c731e1e8310b079d9d5c97 languageName: node linkType: hard @@ -5269,6 +5439,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^5.0.0": + version: 5.0.1 + resolution: "eslint-visitor-keys@npm:5.0.1" + checksum: 10c0/16190bdf2cbae40a1109384c94450c526a79b0b9c3cb21e544256ed85ac48a4b84db66b74a6561d20fe6ab77447f150d711c2ad5ad74df4fcc133736bce99678 + languageName: node + linkType: hard + "eslint@npm:^8": version: 8.57.1 resolution: "eslint@npm:8.57.1" @@ -5538,6 +5715,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.19.1 resolution: "fastq@npm:1.19.1" @@ -6292,7 +6476,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0": +"ignore@npm:^7.0.0, ignore@npm:^7.0.5": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d @@ -7073,10 +7257,12 @@ __metadata: languageName: node linkType: hard -"jest-fail-on-console@npm:^3.2.0": - version: 3.3.1 - resolution: "jest-fail-on-console@npm:3.3.1" - checksum: 10c0/eac050ef24dc97021bf461bc950feed2c891bb0a6531f2c348dd698fd4563d6ccb3afa2feb6e0c6388c4c80b5e13f5574fba4ea974914d859bad4c69af107e27 +"jest-fail-on-console@npm:^3.3.1": + version: 3.3.4 + resolution: "jest-fail-on-console@npm:3.3.4" + peerDependencies: + "@jest/globals": ">=27.5.1" + checksum: 10c0/7df9c322c4e3ab70a6d5a6c4f0c6ccd1e9753ff3b84607b0a3d99930956013ccb0866d486fb76fe86b3577938b9f10b2a4409f809e245813ca4eae47ab10b3f2 languageName: node linkType: hard @@ -7648,13 +7834,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^4.0.3": - version: 4.1.5 - resolution: "kleur@npm:4.1.5" - checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a - languageName: node - linkType: hard - "language-subtag-registry@npm:^0.3.20": version: 0.3.23 resolution: "language-subtag-registry@npm:0.3.23" @@ -8461,7 +8640,25 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:3.1.5": + version: 3.1.5 + resolution: "minimatch@npm:3.1.5" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/2ecbdc0d33f07bddb0315a8b5afbcb761307a8778b48f0b312418ccbced99f104a2d17d8aca7573433c70e8ccd1c56823a441897a45e384ea76ef401a26ace70 + languageName: node + linkType: hard + +"minimatch@npm:^10.2.2": + version: 10.2.5 + resolution: "minimatch@npm:10.2.5" + dependencies: + brace-expansion: "npm:^5.0.5" + checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -8569,13 +8766,6 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.1.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -9145,6 +9335,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 + languageName: node + linkType: hard + "pirates@npm:^4.0.4": version: 4.0.7 resolution: "pirates@npm:4.0.7" @@ -9186,12 +9383,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.3.3": - version: 3.6.2 - resolution: "prettier@npm:3.6.2" +"prettier@npm:^3.6.2": + version: 3.8.3 + resolution: "prettier@npm:3.8.3" bin: prettier: bin/prettier.cjs - checksum: 10c0/488cb2f2b99ec13da1e50074912870217c11edaddedeadc649b1244c749d15ba94e846423d062e2c4c9ae683e2d65f754de28889ba06e697ac4f988d44f45812 + checksum: 10c0/754816fd7593eb80f6376d7476d463e832c38a12f32775a82683adb6e35b772b1f484d65f19401507b983a8c8a7cd5a4a9f12006bd56491e8f35503473f77473 languageName: node linkType: hard @@ -9781,15 +9978,6 @@ __metadata: languageName: node linkType: hard -"sade@npm:^1.7.3": - version: 1.8.1 - resolution: "sade@npm:1.8.1" - dependencies: - mri: "npm:^1.1.0" - checksum: 10c0/da8a3a5d667ad5ce3bf6d4f054bbb9f711103e5df21003c5a5c1a8a77ce12b640ed4017dd423b13c2307ea7e645adee7c2ae3afe8051b9db16a6f6d3da3f90b1 - languageName: node - linkType: hard - "safe-array-concat@npm:^1.1.3": version: 1.1.3 resolution: "safe-array-concat@npm:1.1.3" @@ -9879,27 +10067,36 @@ __metadata: languageName: node linkType: hard -"serve-handler@npm:6.1.6": - version: 6.1.6 - resolution: "serve-handler@npm:6.1.6" +"semver@npm:^7.7.3": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + +"serve-handler@npm:6.1.7": + version: 6.1.7 + resolution: "serve-handler@npm:6.1.7" dependencies: bytes: "npm:3.0.0" content-disposition: "npm:0.5.2" mime-types: "npm:2.1.18" - minimatch: "npm:3.1.2" + minimatch: "npm:3.1.5" path-is-inside: "npm:1.0.2" path-to-regexp: "npm:3.3.0" range-parser: "npm:1.2.0" - checksum: 10c0/1e1cb6bbc51ee32bc1505f2e0605bdc2e96605c522277c977b67f83be9d66bd1eec8604388714a4d728e036d86b629bc9aec02120ea030d3d2c3899d44696503 + checksum: 10c0/35afb68d81afd3c38d15792a5bc2451915b739bef2898a47ebd190db6a4e29846530ac00292b8008fe7297a819257c3948be2deaf4ffd32c96689e8947cf0ae9 languageName: node linkType: hard -"serve@npm:^14.2.4": - version: 14.2.5 - resolution: "serve@npm:14.2.5" +"serve@npm:^14.2.5": + version: 14.2.6 + resolution: "serve@npm:14.2.6" dependencies: "@zeit/schemas": "npm:2.36.0" - ajv: "npm:8.12.0" + ajv: "npm:8.18.0" arg: "npm:5.0.2" boxen: "npm:7.0.0" chalk: "npm:5.0.1" @@ -9907,11 +10104,11 @@ __metadata: clipboardy: "npm:3.0.0" compression: "npm:1.8.1" is-port-reachable: "npm:4.0.0" - serve-handler: "npm:6.1.6" + serve-handler: "npm:6.1.7" update-check: "npm:1.5.4" bin: serve: build/main.js - checksum: 10c0/7324a037beea0ee0211f2384e7af28ddf57c8297649e5dd0145ed5a48861cab6d680cbdce332ee9b517f745a31881e5c70074f0908d12c0a4b052cd65f4e9b7e + checksum: 10c0/7e1668e0d187719dbe4f3de967012ce2263c967f6135d9c630f803b0f173334e1442ab326fcc4c8e6cd4e293d8bd8c773aebab2746ecaa0fb1ab29a36079763b languageName: node linkType: hard @@ -10682,6 +10879,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.15": + version: 0.2.16 + resolution: "tinyglobby@npm:0.2.16" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10c0/f2e09fd93dd95c41e522113b686ff6f7c13020962f8698a864a257f3d7737599afc47722b7ab726e12f8a813f779906187911ff8ee6701ede65072671a7e934b + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -10758,6 +10965,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^2.5.0": + version: 2.5.0 + resolution: "ts-api-utils@npm:2.5.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10c0/767849383c114e7f1971fa976b20e73ac28fd0c70d8d65c0004790bf4d8f89888c7e4cf6d5949f9c1beae9bc3c64835bef77bbe27fddf45a3c7b60cebcf85c8c + languageName: node + linkType: hard + "ts-node@npm:^10.9.2": version: 10.9.2 resolution: "ts-node@npm:10.9.2" @@ -10859,12 +11075,12 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^5.0.0": - version: 5.4.1 - resolution: "type-fest@npm:5.4.1" +"type-fest@npm:^5.5.0": + version: 5.6.0 + resolution: "type-fest@npm:5.6.0" dependencies: tagged-tag: "npm:^1.0.0" - checksum: 10c0/500386d690e634499e6fb765a1e33909a75fea0258acdd56a2d1c9565d6810e222f6d95bd80daa5498377c7ea976af46f518185b5dbd67ff8454562544808aa1 + checksum: 10c0/5468a8ffda7f3904e6f7bbd8069eb8b6dd4bd9156e206df7a01d09a73e28cd1afedf74ead9d0fc12841c8c90074194859feca240511c50800962fde1bd9ddcbc languageName: node linkType: hard @@ -10981,60 +11197,60 @@ __metadata: "@emotion/cache": "npm:^11.13.5" "@emotion/react": "npm:^11.11.1" "@emotion/styled": "npm:^11.11.0" - "@faker-js/faker": "npm:^10.0.0" + "@faker-js/faker": "npm:^10.1.0" "@mitodl/mit-learn-api-axios": "npm:^2025.6.3" "@mitodl/smoot-design": "npm:^6.17.0" "@mui/lab": "npm:^6.0.1-beta.34" "@mui/material": "npm:^7.0.0" "@mui/material-nextjs": "npm:^7.0.0" "@remixicon/react": "npm:^4.2.0" - "@swc/core": "npm:^1.9.3" + "@swc/core": "npm:^1.14.0" "@swc/jest": "npm:^0.2.37" "@tanstack/react-query": "npm:^5.74.3" "@testing-library/dom": "npm:^10.4.0" "@testing-library/jest-dom": "npm:^6.6.3" - "@testing-library/react": "npm:^16.0.1" + "@testing-library/react": "npm:^16.3.0" "@testing-library/user-event": "npm:^14.5.2" "@types/http-proxy": "npm:^1" "@types/jest": "npm:^29.5.14" "@types/jest-when": "npm:^3" - "@types/lodash": "npm:^4.17.13" - "@types/node": "npm:^22.0.0" - "@types/react": "npm:^19.0.0" - "@types/react-dom": "npm:^19.0.0" - "@typescript-eslint/eslint-plugin": "npm:^8.13.0" - "@typescript-eslint/typescript-estree": "npm:^8.13.0" + "@types/lodash": "npm:^4.17.20" + "@types/node": "npm:^22.18.13" + "@types/react": "npm:^19.2.2" + "@types/react-dom": "npm:^19.2.2" + "@typescript-eslint/eslint-plugin": "npm:^8.46.2" + "@typescript-eslint/typescript-estree": "npm:^8.46.2" ai: "npm:^5.0.0" axios: "npm:^1.7.7" better-react-mathjax: "npm:^2.3.0" eslint: "npm:^8" eslint-config-mitodl: "npm:^2.1.0" - eslint-config-next: "npm:15.5.12" + eslint-config-next: "npm:15.5.15" eslint-config-prettier: "npm:^10.0.0" eslint-import-resolver-typescript: "npm:^4.0.0" eslint-plugin-import: "npm:^2.29.1" - eslint-plugin-jest: "npm:^29.0.0" - eslint-plugin-mdx: "npm:^3.0.0" + eslint-plugin-jest: "npm:^29.0.1" + eslint-plugin-mdx: "npm:^3.7.0" eslint-plugin-react: "npm:^7.34.3" eslint-plugin-react-hooks: "npm:^7.0.0" eslint-plugin-styled-components-a11y: "npm:^2.1.35" - eslint-plugin-testing-library: "npm:^7.0.0" + eslint-plugin-testing-library: "npm:^7.16.2" formik: "npm:^2.4.6" http-proxy: "npm:^1.18.1" jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.5.0" jest-extended: "npm:^7.0.0" - jest-fail-on-console: "npm:^3.2.0" + jest-fail-on-console: "npm:^3.3.1" jest-watch-typeahead: "npm:^2.2.2" jest-when: "npm:^3.6.0" next: "npm:^15.0.2" - prettier: "npm:^3.3.3" + prettier: "npm:^3.6.2" react: "npm:19.2.3" react-dom: "npm:19.2.3" - serve: "npm:^14.2.4" + serve: "npm:^14.2.5" tiny-invariant: "npm:^1.3.3" ts-node: "npm:^10.9.2" - type-fest: "npm:^5.0.0" + type-fest: "npm:^5.5.0" typescript: "npm:^5.6.3" yup: "npm:^1.6.1" languageName: unknown @@ -11351,20 +11567,6 @@ __metadata: languageName: node linkType: hard -"uvu@npm:^0.5.6": - version: 0.5.6 - resolution: "uvu@npm:0.5.6" - dependencies: - dequal: "npm:^2.0.0" - diff: "npm:^5.0.0" - kleur: "npm:^4.0.3" - sade: "npm:^1.7.3" - bin: - uvu: bin.js - checksum: 10c0/ad32eb5f7d94bdeb71f80d073003f0138e24f61ed68cecc8e15d2f30838f44c9670577bb1775c8fac894bf93d1bc1583d470a9195e49bfa6efa14cc6f4942bff - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" From d00223c918c231e34d1930dc2928a6966fae2053 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:04:41 -0400 Subject: [PATCH 13/15] Update Node.js to v24 (#450) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci-deploy.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/production-deploy.yml | 2 +- .github/workflows/rc-deploy.yml | 2 +- docker-compose.apps.yml | 2 +- frontend-demo/.nvmrc | 2 +- frontend-demo/package.json | 2 +- frontend-demo/yarn.lock | 12 ++++++------ 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci-deploy.yml b/.github/workflows/ci-deploy.yml index 25c26495..bcbb62a6 100644 --- a/.github/workflows/ci-deploy.yml +++ b/.github/workflows/ci-deploy.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: - node-version: "^22" + node-version: "^24.0.0" cache: yarn cache-dependency-path: frontend-demo/yarn.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bffc79b6..3ba6561a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,7 +83,7 @@ jobs: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: - node-version: "^22" + node-version: "^24.0.0" cache: yarn cache-dependency-path: frontend-demo/yarn.lock diff --git a/.github/workflows/production-deploy.yml b/.github/workflows/production-deploy.yml index b80da0d9..714bd9bf 100644 --- a/.github/workflows/production-deploy.yml +++ b/.github/workflows/production-deploy.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: - node-version: "^22" + node-version: "^24.0.0" cache: yarn cache-dependency-path: frontend-demo/yarn.lock diff --git a/.github/workflows/rc-deploy.yml b/.github/workflows/rc-deploy.yml index ccc84872..92a31867 100644 --- a/.github/workflows/rc-deploy.yml +++ b/.github/workflows/rc-deploy.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: - node-version: "^22" + node-version: "^24.0.0" cache: yarn cache-dependency-path: frontend-demo/yarn.lock diff --git a/docker-compose.apps.yml b/docker-compose.apps.yml index 7c992eb3..49621b17 100644 --- a/docker-compose.apps.yml +++ b/docker-compose.apps.yml @@ -39,7 +39,7 @@ services: watch: working_dir: /src - image: node:22.22 + image: node:24.14@sha256:80fc934952c8f1b2b4d39907af7211f8a9fff1a4c2cf673fb49099292c251cec entrypoint: ["/bin/sh", "-c"] command: - | diff --git a/frontend-demo/.nvmrc b/frontend-demo/.nvmrc index 32a2d7bd..8e350348 100644 --- a/frontend-demo/.nvmrc +++ b/frontend-demo/.nvmrc @@ -1 +1 @@ -22.22.1 +24.14.1 diff --git a/frontend-demo/package.json b/frontend-demo/package.json index 790ca0a3..4fd234bc 100644 --- a/frontend-demo/package.json +++ b/frontend-demo/package.json @@ -47,7 +47,7 @@ "@types/jest": "^29.5.14", "@types/jest-when": "^3", "@types/lodash": "^4.17.20", - "@types/node": "^22.18.13", + "@types/node": "^24.0.0", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@typescript-eslint/eslint-plugin": "^8.46.2", diff --git a/frontend-demo/yarn.lock b/frontend-demo/yarn.lock index d3a8b716..25b9e927 100644 --- a/frontend-demo/yarn.lock +++ b/frontend-demo/yarn.lock @@ -2784,12 +2784,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^22.18.13": - version: 22.19.17 - resolution: "@types/node@npm:22.19.17" +"@types/node@npm:^24.0.0": + version: 24.12.2 + resolution: "@types/node@npm:24.12.2" dependencies: - undici-types: "npm:~6.21.0" - checksum: 10c0/b66c484c0a9f6d88b1ef360b0f487717234ee1a482cb2551ff73d9f3c43a42a777daf4c8a5eee970960728f8fe1f3877d3d8c6ffabcbca74cb401a59db700fa4 + undici-types: "npm:~7.16.0" + checksum: 10c0/710050c42f89075c4479e4e1e4c2532486b0c41b1e2a8a13ad88641c88b88cdaea87414e19224f30028719737bd70e327edcaa184d50e86b9418941edd7eb02b languageName: node linkType: hard @@ -11215,7 +11215,7 @@ __metadata: "@types/jest": "npm:^29.5.14" "@types/jest-when": "npm:^3" "@types/lodash": "npm:^4.17.20" - "@types/node": "npm:^22.18.13" + "@types/node": "npm:^24.0.0" "@types/react": "npm:^19.2.2" "@types/react-dom": "npm:^19.2.2" "@typescript-eslint/eslint-plugin": "npm:^8.46.2" From 90b5c848d977219537fecd8be6e4829958ef13aa Mon Sep 17 00:00:00 2001 From: Matt Bertrand Date: Thu, 23 Apr 2026 17:31:07 -0400 Subject: [PATCH 14/15] pre-commit-ci update (#494) --- .pre-commit-config.yaml | 10 +-- .prettierignore | 1 + ai_chatbots/api.py | 10 +-- ai_chatbots/api_test.py | 5 +- ai_chatbots/chatbots.py | 64 +++++++++---------- ai_chatbots/chatbots_test.py | 8 ++- ai_chatbots/checkpointers.py | 23 ++++--- ai_chatbots/constants.py | 3 +- ai_chatbots/consumers.py | 30 ++++----- ai_chatbots/consumers_test.py | 2 +- ai_chatbots/evaluation/base.py | 28 ++++---- ai_chatbots/evaluation/base_test.py | 5 +- ai_chatbots/evaluation/evaluators.py | 10 +-- ai_chatbots/evaluation/orchestrator.py | 35 +++++----- ai_chatbots/evaluation/reporting.py | 9 ++- .../backpopulate_tutor_checkpoints.py | 2 +- .../management/commands/rag_evaluation.py | 3 +- .../management/commands/update_prompt.py | 2 +- .../0007_convert_tutorbot_to_checkpoints.py | 2 +- ai_chatbots/posthog.py | 8 +-- ai_chatbots/posthog_test.py | 4 +- ai_chatbots/tasks_test.py | 5 +- ai_chatbots/tools.py | 24 ++++--- conftest.py | 2 +- fixtures/common.py | 6 +- frontend-demo/.eslintrc.js | 2 +- main/features.py | 12 ++-- main/test_utils.py | 2 +- main/utils_test.py | 4 +- pyproject.toml | 1 + scripts/install_yarn.js | 20 +++--- 31 files changed, 169 insertions(+), 173 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index efe5e83d..ff3c456c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ ci: - eslint repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -28,11 +28,11 @@ repos: types_or: [javascript, jsx, ts, tsx, json, scss, sass, css, yaml, markdown] - repo: https://github.com/scop/pre-commit-shfmt - rev: v3.10.0-1 + rev: v3.13.1-1 hooks: - id: shfmt - repo: https://github.com/adrienverge/yamllint.git - rev: v1.35.1 + rev: v1.38.0 hooks: - id: yamllint args: [--format, parsable, -d, relaxed] @@ -65,7 +65,7 @@ repos: - "config/keycloak/realms/ol-local-realm.json" additional_dependencies: ["gibberish-detector"] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.2" + rev: "v0.15.11" hooks: - id: ruff-format - id: ruff @@ -84,7 +84,7 @@ repos: additional_dependencies: - eslint@8 - repo: https://github.com/shellcheck-py/shellcheck-py - rev: v0.10.0.1 + rev: v0.11.0.1 hooks: - id: shellcheck args: ["--severity=warning"] diff --git a/.prettierignore b/.prettierignore index f9168aa5..176c2527 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,3 @@ frontend-demo/.yarn/ .yarn/ +openapi/specs/ diff --git a/ai_chatbots/api.py b/ai_chatbots/api.py index 83bccbc8..378d1d0d 100644 --- a/ai_chatbots/api.py +++ b/ai_chatbots/api.py @@ -2,7 +2,7 @@ import json import logging -from typing import Any, Optional, Union +from typing import Any, Union from uuid import uuid4 from channels.db import database_sync_to_async @@ -96,14 +96,14 @@ def serialize_tool_calls(tool_calls: list[dict]) -> list[dict]: @database_sync_to_async -def query_tutorbot_output(thread_id: str) -> Optional[TutorBotOutput]: +def query_tutorbot_output(thread_id: str) -> TutorBotOutput | None: """Return the latest TutorBotOutput for a given thread_id""" return TutorBotOutput.objects.filter(thread_id=thread_id).last() @database_sync_to_async def create_tutorbot_output_and_checkpoints( - thread_id: str, chat_json: Union[str, dict], edx_module_id: Optional[str] + thread_id: str, chat_json: Union[str, dict], edx_module_id: str | None ) -> tuple[TutorBotOutput, list[DjangoCheckpoint]]: """Atomically create both TutorBotOutput and DjangoCheckpoint objects""" with transaction.atomic(): @@ -133,7 +133,7 @@ def _should_create_checkpoint(msg: dict) -> bool: def _identify_new_messages( - filtered_messages: list[dict], previous_chat_json: Optional[Union[str, dict]] + filtered_messages: list[dict], previous_chat_json: Union[str, dict] | None ) -> list[dict]: """Identify which messages are new by comparing with previous chat data.""" if not previous_chat_json: @@ -222,7 +222,7 @@ def _create_checkpoint_metadata( def create_tutor_checkpoints( thread_id: str, chat_json: Union[str, dict], - previous_chat_json: Optional[Union[str, dict]] = None, + previous_chat_json: Union[str, dict] | None = None, ) -> list[DjangoCheckpoint]: """Create DjangoCheckpoint records from tutor chat data (synchronous)""" # Get the associated session diff --git a/ai_chatbots/api_test.py b/ai_chatbots/api_test.py index b0f9ac98..bfe45ebf 100644 --- a/ai_chatbots/api_test.py +++ b/ai_chatbots/api_test.py @@ -532,8 +532,9 @@ def test_truncation_with_multiple_ai_responses(): def test_find_nth_human_message_from_end(sample_messages): """Test the helper method for finding human message indices.""" node = MessageTruncationNode(max_human_messages=3) - messages = [AIMessage(content="Hello", id=str(uuid4()))] + sample_messages[ - 1:7 + messages = [ + AIMessage(content="Hello", id=str(uuid4())), + *sample_messages[1:7], ] # Question 1-3, Answer 1-3 # Should find the 3rd-from-last human message (Question 1 at index 0) diff --git a/ai_chatbots/chatbots.py b/ai_chatbots/chatbots.py index b4a75816..7e3b167c 100644 --- a/ai_chatbots/chatbots.py +++ b/ai_chatbots/chatbots.py @@ -6,7 +6,7 @@ from abc import ABC, abstractmethod from collections.abc import AsyncGenerator from operator import add -from typing import Annotated, Any, Optional +from typing import Annotated, Any from uuid import uuid4 import posthog @@ -73,10 +73,10 @@ def __init__( # noqa: PLR0913 checkpointer: BaseCheckpointSaver, *, name: str = "MIT Open Learning Chatbot", - model: Optional[str] = None, - temperature: Optional[float] = None, - instructions: Optional[str] = None, - thread_id: Optional[str] = None, + model: str | None = None, + temperature: float | None = None, + instructions: str | None = None, + thread_id: str | None = None, ): """Initialize the AI chat agent service""" self.bot_name = name @@ -224,7 +224,7 @@ async def validate_and_clean_checkpoint(self) -> None: except Exception: log.exception("Error while cleaning checkpoint") - async def _get_latest_checkpoint_id(self) -> Optional[str]: + async def _get_latest_checkpoint_id(self) -> str | None: """Get the most recent assistant response checkpoint""" checkpoint = ( await DjangoCheckpoint.objects.prefetch_related("session", "session__user") @@ -237,7 +237,7 @@ async def _get_latest_checkpoint_id(self) -> Optional[str]: return checkpoint.id if checkpoint else None async def set_callbacks( - self, properties: Optional[dict] = None + self, properties: dict | None = None ) -> list[CallbackHandler]: """Set callbacks for the agent LLM""" if settings.POSTHOG_PROJECT_API_KEY and settings.POSTHOG_API_HOST: @@ -282,7 +282,7 @@ async def get_completion( self, message: str, *, - extra_state: Optional[dict[str, Any]] = None, + extra_state: dict[str, Any] | None = None, debug: bool = settings.AI_DEBUG, ) -> AsyncGenerator[str, None]: """ @@ -424,13 +424,13 @@ class ResourceRecommendationBot(TruncatingChatbot): def __init__( # noqa: PLR0913 self, user_id: str, - checkpointer: Optional[BaseCheckpointSaver] = None, + checkpointer: BaseCheckpointSaver | None = None, *, name: str = "MIT Open Learning Chatbot", - model: Optional[str] = None, - temperature: Optional[float] = None, - instructions: Optional[str] = None, - thread_id: Optional[str] = None, + model: str | None = None, + temperature: float | None = None, + instructions: str | None = None, + thread_id: str | None = None, ): """Initialize the AI search agent service""" super().__init__( @@ -466,7 +466,7 @@ class SyllabusAgentState(SummaryState): related_courses: Annotated[list[str], add] # str representation of a boolean value, because the # langgraph JsonPlusSerializer can't handle booleans - exclude_canvas: Annotated[Optional[list[str]], add] + exclude_canvas: Annotated[list[str] | None, add] class SyllabusBot(TruncatingChatbot): @@ -483,11 +483,11 @@ def __init__( # noqa: PLR0913 checkpointer: BaseCheckpointSaver, *, name: str = "MIT Open Learning Syllabus Chatbot", - model: Optional[str] = None, - temperature: Optional[float] = None, - instructions: Optional[str] = None, - thread_id: Optional[str] = None, - enable_related_courses: Optional[bool] = False, + model: str | None = None, + temperature: float | None = None, + instructions: str | None = None, + thread_id: str | None = None, + enable_related_courses: bool | None = False, ): self.enable_related_courses = enable_related_courses super().__init__( @@ -546,16 +546,16 @@ class TutorBot(BaseChatbot): def __init__( # noqa: PLR0913 self, user_id: str, - checkpointer: Optional[BaseCheckpointSaver] = BaseCheckpointSaver, + checkpointer: BaseCheckpointSaver | None = BaseCheckpointSaver, *, name: str = "MIT Open Learning Tutor Chatbot", - model: Optional[str] = None, - temperature: Optional[float] = None, - thread_id: Optional[str] = None, - block_siblings: Optional[list[str]] = None, - edx_module_id: Optional[str] = None, - run_readable_id: Optional[str] = None, - problem_set_title: Optional[str] = None, + model: str | None = None, + temperature: float | None = None, + thread_id: str | None = None, + block_siblings: list[str] | None = None, + edx_module_id: str | None = None, + run_readable_id: str | None = None, + problem_set_title: str | None = None, ): super().__init__( user_id, @@ -600,7 +600,7 @@ async def get_completion( self, message: str, *, - extra_state: Optional[dict[str, Any]] = None, # noqa: ARG002 + extra_state: dict[str, Any] | None = None, # noqa: ARG002 debug: bool = settings.AI_DEBUG, ) -> AsyncGenerator[str, None]: """Call message_tutor with the user query and return the response""" @@ -810,10 +810,10 @@ def __init__( # noqa: PLR0913 checkpointer: BaseCheckpointSaver, *, name: str = "MIT Open Learning VideoGPT Chatbot", - model: Optional[str] = None, - temperature: Optional[float] = None, - instructions: Optional[str] = None, - thread_id: Optional[str] = None, + model: str | None = None, + temperature: float | None = None, + instructions: str | None = None, + thread_id: str | None = None, ): super().__init__( user_id, diff --git a/ai_chatbots/chatbots_test.py b/ai_chatbots/chatbots_test.py index e1abab84..3b65f5f8 100644 --- a/ai_chatbots/chatbots_test.py +++ b/ai_chatbots/chatbots_test.py @@ -975,9 +975,11 @@ async def test_tutor_get_completion(posthog_settings, mocker, variant): assert "Let's start by thinking about the problem. " in results checkpoint = await database_sync_to_async( - lambda: DjangoCheckpoint.objects.select_related("session") - .filter(thread_id=thread_id) - .last() + lambda: ( + DjangoCheckpoint.objects.select_related("session") + .filter(thread_id=thread_id) + .last() + ) )() history = await database_sync_to_async( lambda: TutorBotOutput.objects.filter(thread_id=thread_id).last() diff --git a/ai_chatbots/checkpointers.py b/ai_chatbots/checkpointers.py index c080df88..4592bdef 100644 --- a/ai_chatbots/checkpointers.py +++ b/ai_chatbots/checkpointers.py @@ -4,7 +4,6 @@ from collections.abc import AsyncGenerator from typing import ( Any, - Optional, ) from django.conf import settings @@ -106,8 +105,8 @@ def _load_writes( def _parse_checkpoint_data( serde: JsonPlusSerializer, data: DjangoCheckpoint, - pending_writes: Optional[list[PendingWrite]] = None, -) -> Optional[CheckpointTuple]: + pending_writes: list[PendingWrite] | None = None, +) -> CheckpointTuple | None: """ Parse checkpoint data retrieved from the database. """ @@ -163,9 +162,9 @@ async def create_with_session( # noqa: PLR0913 thread_id: str, message: str, agent: str, - user: Optional[USER_MODEL] = None, - dj_session_key: Optional[str] = "", - object_id: Optional[str] = "", + user: "USER_MODEL | None" = None, + dj_session_key: str | None = "", + object_id: str | None = "", ): """ Initialize the DjangoSaver and create a UserChatSession if applicable. @@ -174,7 +173,7 @@ async def create_with_session( # noqa: PLR0913 if not (thread_id and message and agent): msg = "thread_id, message, and agent are required" raise ValueError(msg) - chat_session, created = await UserChatSession.objects.select_related( + chat_session, _created = await UserChatSession.objects.select_related( "user" ).aget_or_create( thread_id=thread_id, @@ -317,7 +316,7 @@ async def aput_writes( }, ) - async def aget_tuple(self, config: RunnableConfig) -> Optional[CheckpointTuple]: + async def aget_tuple(self, config: RunnableConfig) -> CheckpointTuple | None: """Get a checkpoint tuple from the database asynchronously. This method retrieves a checkpoint tuple from the database based on the @@ -362,11 +361,11 @@ async def aget_tuple(self, config: RunnableConfig) -> Optional[CheckpointTuple]: async def alist( self, - config: Optional[RunnableConfig], + config: RunnableConfig | None, *, - filter: Optional[dict[str, Any]] = None, # noqa: ARG002, A002 - before: Optional[RunnableConfig] = None, - limit: Optional[int] = None, + filter: dict[str, Any] | None = None, # noqa: ARG002, A002 + before: RunnableConfig | None = None, + limit: int | None = None, ) -> AsyncGenerator[CheckpointTuple, None]: """List checkpoints from the database asynchronously. diff --git a/ai_chatbots/constants.py b/ai_chatbots/constants.py index 404564e2..9a3f796d 100644 --- a/ai_chatbots/constants.py +++ b/ai_chatbots/constants.py @@ -2,7 +2,6 @@ import dataclasses import datetime -from typing import Optional from named_enum import ExtendedEnum @@ -57,7 +56,7 @@ class ChatbotCookie: name: str value: str path: str = "/" - max_age: Optional[datetime.datetime] = None + max_age: datetime.datetime | None = None def __str__(self) -> str: """ diff --git a/ai_chatbots/consumers.py b/ai_chatbots/consumers.py index a1b696c7..ec6fcdbd 100644 --- a/ai_chatbots/consumers.py +++ b/ai_chatbots/consumers.py @@ -2,7 +2,6 @@ import logging from abc import ABC, abstractmethod from http.cookies import SimpleCookie -from typing import Optional from uuid import uuid4 import litellm @@ -104,9 +103,9 @@ async def assign_thread_cookies( self, user: User, *, - clear_history: Optional[bool] = False, - thread_id: Optional[str] = None, - object_id: Optional[str] = None, + clear_history: bool | None = False, + thread_id: str | None = None, + object_id: str | None = None, ) -> tuple[str, list[str]]: """ Extract and update separate cookie values for logged in vs anonymous users. @@ -220,7 +219,7 @@ async def assign_thread_cookies( return current_thread_id, cookies async def prepare_response( - self, serializer: ChatRequestSerializer, object_id_field: Optional[str] = None + self, serializer: ChatRequestSerializer, object_id_field: str | None = None ) -> tuple[str, list[str]]: """Prepare consumer for the API response""" if object_id_field: @@ -249,9 +248,9 @@ def process_extra_state(self, data: dict) -> dict: # noqa: ARG002 async def start_response( self, - thread_id: Optional[str] = None, - status: Optional[int] = HTTP_200_OK, - cookies: Optional[list[str]] = None, + thread_id: str | None = None, + status: int | None = HTTP_200_OK, + cookies: list[str] | None = None, ): headers = ( [ @@ -370,10 +369,9 @@ async def handle(self, message: str): log.exception("Bad request") await self.send_error_response(400, err, cookies) except AsyncThrottled as err: - log_msg = "User %s throttled on %s for %d seconds" % ( - self.get_ident(), - self.__class__.__name__, - err.wait, + log_msg = ( + f"User {self.get_ident()} throttled on " + f"{self.__class__.__name__} for {err.wait} seconds" ) log.info(log_msg) await self.start_response(thread_id=None, status=200, cookies=cookies) @@ -507,7 +505,7 @@ def process_extra_state(self, data: dict) -> dict: def prepare_response( self, serializer: SyllabusChatRequestSerializer, - object_id_field: Optional[str] = None, + object_id_field: str | None = None, ) -> tuple[str, list[str]]: """Set the course id as the default object id field""" object_id_field = object_id_field or "course_id" @@ -620,7 +618,7 @@ def create_chatbot( def prepare_response( self, serializer: TutorChatRequestSerializer, - object_id_field: Optional[str] = None, + object_id_field: str | None = None, ) -> tuple[str, list[str]]: """Set the edx_module_id as the default object id field""" object_id_field = object_id_field or "edx_module_id" @@ -673,7 +671,7 @@ def create_chatbot( def prepare_response( self, serializer: TutorChatRequestSerializer, - object_id_field: Optional[str] = None, + object_id_field: str | None = None, ) -> tuple[str, list[str]]: """Set the edx_module_id as the default object id field""" object_id_field = "object_id" @@ -752,7 +750,7 @@ def process_extra_state(self, data: dict) -> dict: def prepare_response( self, serializer: VideoGPTRequestSerializer, - object_id_field: Optional[str] = None, + object_id_field: str | None = None, ) -> tuple[str, list[str]]: """Set the problem code as the default object id field""" object_id_field = object_id_field or "transcript_asset_id" diff --git a/ai_chatbots/consumers_test.py b/ai_chatbots/consumers_test.py index baf9ea9e..57845ba9 100644 --- a/ai_chatbots/consumers_test.py +++ b/ai_chatbots/consumers_test.py @@ -1018,7 +1018,7 @@ async def test_anonymous_user_login_session_association( # noqa: PLR0913 for i in range(3): anon_consumer = anonymous_consumer_setup(test_session_key) payload = { - "message": f"Anonymous question {i+1}", + "message": f"Anonymous question {i + 1}", "course_id": "MITx+6.00.1x", } await anon_consumer.handle(json.dumps(payload)) diff --git a/ai_chatbots/evaluation/base.py b/ai_chatbots/evaluation/base.py index 5cce8b79..42979085 100644 --- a/ai_chatbots/evaluation/base.py +++ b/ai_chatbots/evaluation/base.py @@ -8,7 +8,7 @@ from dataclasses import dataclass from datetime import UTC, datetime from pathlib import Path -from typing import Any, Optional +from typing import Any from asgiref.sync import sync_to_async from deepeval.test_case import LLMTestCase, ToolCall @@ -21,9 +21,9 @@ class TestCaseSpec: """Specification for a test case.""" question: str - expected_output: Optional[str] = None - expected_tools: Optional[list[str]] = None - metadata: Optional[dict[str, Any]] = None + expected_output: str | None = None + expected_tools: list[str] | None = None + metadata: dict[str, Any] | None = None def to_dict(self) -> dict[str, Any]: """Convert to dictionary representation.""" @@ -43,7 +43,7 @@ class EvaluationConfig: evaluation_model: str metrics: list[Any] metric_thresholds: dict[str, float] - confident_api_key: Optional[str] = None + confident_api_key: str | None = None class BaseBotEvaluator(ABC): @@ -54,9 +54,9 @@ def __init__( bot_class, bot_name: str, *, - data_file: Optional[str] = None, + data_file: str | None = None, stdout=None, - error_log_file: Optional[str] = None, + error_log_file: str | None = None, ): self.bot_class = bot_class self.bot_name = bot_name @@ -67,13 +67,13 @@ def __init__( def _log_error( self, error_msg: str, - test_case: Optional[TestCaseSpec] = None, - exception: Optional[Exception] = None, + test_case: TestCaseSpec | None = None, + exception: Exception | None = None, ): """Log error to file with timestamp and details.""" try: timestamp = datetime.now(tz=UTC).isoformat() - log_entry = f"\n{'='*80}\n" + log_entry = f"\n{'=' * 80}\n" log_entry += f"[{timestamp}] Error in {self.bot_name}\n" if test_case: @@ -86,7 +86,7 @@ def _log_error( if exception: log_entry += f"\nFull traceback:\n{traceback.format_exc()}\n" - log_entry += f"{'='*80}\n" + log_entry += f"{'=' * 80}\n" # Append to log file log_path = Path(self.error_log_file) @@ -107,7 +107,7 @@ def validate_test_case(self, test_case: TestCaseSpec) -> bool: @abstractmethod def create_bot_instance( - self, model: str, test_case: TestCaseSpec, instructions: Optional[str] = None + self, model: str, test_case: TestCaseSpec, instructions: str | None = None ): """Create a bot instance configured for the given test case.""" @@ -232,7 +232,7 @@ async def evaluate_model( self, model: str, test_cases: list[TestCaseSpec], - instructions: Optional[str] = None, + instructions: str | None = None, prompt_label: str = "default", max_concurrent: int = 10, ) -> list[LLMTestCase]: @@ -254,7 +254,7 @@ async def evaluate_model( # Create a semaphore to limit concurrency semaphore = asyncio.Semaphore(max_concurrent) - async def process_test_case(test_case: TestCaseSpec) -> Optional[LLMTestCase]: + async def process_test_case(test_case: TestCaseSpec) -> LLMTestCase | None: """Process a single test case with semaphore limiting.""" async with semaphore: try: diff --git a/ai_chatbots/evaluation/base_test.py b/ai_chatbots/evaluation/base_test.py index 7793d5e9..1500e43f 100644 --- a/ai_chatbots/evaluation/base_test.py +++ b/ai_chatbots/evaluation/base_test.py @@ -1,6 +1,5 @@ """Tests for evaluation.base module.""" -from typing import Optional from unittest.mock import Mock import pytest @@ -94,7 +93,7 @@ class ConcreteBotEvaluator(BaseBotEvaluator): """Concrete implementation for testing abstract methods.""" def __init__( - self, bot_class, bot_name: str, *, data_file: Optional[str] = None, mocker=None + self, bot_class, bot_name: str, *, data_file: str | None = None, mocker=None ): """Initialize with optional mocker for testing.""" super().__init__(bot_class, bot_name, data_file=data_file) @@ -114,7 +113,7 @@ def validate_test_case(self, test_case): return test_case.question is not None def create_bot_instance( - self, model: str, test_case: TestCaseSpec, instructions: Optional[str] = None + self, model: str, test_case: TestCaseSpec, instructions: str | None = None ): """Create mock bot instance.""" _ = model, test_case, instructions # Unused parameters for testing diff --git a/ai_chatbots/evaluation/evaluators.py b/ai_chatbots/evaluation/evaluators.py index e9e1eba3..3119be29 100644 --- a/ai_chatbots/evaluation/evaluators.py +++ b/ai_chatbots/evaluation/evaluators.py @@ -1,6 +1,6 @@ """Bot-specific evaluators for RAG evaluation.""" -from typing import Any, Optional +from typing import Any from langchain_core.messages import AIMessage @@ -37,7 +37,7 @@ def validate_test_case(self, test_case: TestCaseSpec) -> bool: return "search_url" in extra_state def create_bot_instance( - self, model: str, test_case: TestCaseSpec, instructions: Optional[str] = None + self, model: str, test_case: TestCaseSpec, instructions: str | None = None ): """Create recommendation bot instance.""" metadata = test_case.metadata or {} @@ -95,7 +95,7 @@ def validate_test_case(self, test_case: TestCaseSpec) -> bool: return "course_id" in extra_state def create_bot_instance( - self, model: str, test_case: TestCaseSpec, instructions: Optional[str] = None + self, model: str, test_case: TestCaseSpec, instructions: str | None = None ): """Create syllabus bot instance.""" metadata = test_case.metadata or {} @@ -153,7 +153,7 @@ def validate_test_case(self, test_case: TestCaseSpec) -> bool: return "transcript_asset_id" in extra_state def create_bot_instance( - self, model: str, test_case: TestCaseSpec, instructions: Optional[str] = None + self, model: str, test_case: TestCaseSpec, instructions: str | None = None ): """Create video GPT bot instance.""" metadata = test_case.metadata or {} @@ -214,7 +214,7 @@ def create_bot_instance( self, model: str, test_case: TestCaseSpec, - instructions: Optional[str] = None, # noqa: ARG002 + instructions: str | None = None, # noqa: ARG002 ): """Create tutor bot instance.""" metadata = test_case.metadata or {} diff --git a/ai_chatbots/evaluation/orchestrator.py b/ai_chatbots/evaluation/orchestrator.py index 43537b14..31930d40 100644 --- a/ai_chatbots/evaluation/orchestrator.py +++ b/ai_chatbots/evaluation/orchestrator.py @@ -4,7 +4,6 @@ from datetime import UTC, datetime from json import JSONDecodeError from pathlib import Path -from typing import Optional import deepeval from deepeval.evaluate import AsyncConfig, ErrorConfig @@ -46,7 +45,7 @@ def create_evaluation_config( # noqa: PLR0913 self, models: list[str], evaluation_model: str, - metric_thresholds: Optional[dict[str, float]] = None, + metric_thresholds: dict[str, float] | None = None, timeout_seconds: int = 360, max_retries: int = 3, retry_delay: float = 5.0, @@ -183,9 +182,9 @@ async def _collect_and_evaluate_bot( # noqa: C901, PLR0912, PLR0913, PLR0915 bot_name: str, config: EvaluationConfig, *, - data_file: Optional[str], - use_prompts: Optional[bool], - prompts_data: Optional[dict], + data_file: str | None, + use_prompts: bool | None, + prompts_data: dict | None, max_concurrent: int, batch_size: int, error_log_file: str, @@ -396,10 +395,10 @@ def _initialize_error_log(self, error_log_file: str): log_path = Path(error_log_file) header = f""" -{'#'*80} +{"#" * 80} RAG EVALUATION ERROR LOG Started: {timestamp} -{'#'*80} +{"#" * 80} """ with log_path.open("w", encoding="utf-8") as f: @@ -413,13 +412,13 @@ async def run_evaluation( # noqa: PLR0913 self, config: EvaluationConfig, *, - bot_names: Optional[list[str]] = None, - data_file: Optional[str] = None, - use_prompts: Optional[bool] = True, - prompts_file: Optional[str] = None, - max_concurrent: Optional[int] = 10, - batch_size: Optional[int] = 0, - error_log_file: Optional[str] = None, + bot_names: list[str] | None = None, + data_file: str | None = None, + use_prompts: bool | None = True, + prompts_file: str | None = None, + max_concurrent: int | None = 10, + batch_size: int | None = 0, + error_log_file: str | None = None, ) -> EvaluationResult: """Run evaluation across specified bots and models. @@ -454,9 +453,9 @@ async def run_evaluation( # noqa: PLR0913 # Process each bot one at a time, accumulating results all_bot_results = [] for bot_name in bot_names: - self.stdout.write(f"\n{'='*60}") + self.stdout.write(f"\n{'=' * 60}") self.stdout.write(f"Processing bot: {bot_name}") - self.stdout.write(f"{'='*60}") + self.stdout.write(f"{'=' * 60}") bot_result = await self._collect_and_evaluate_bot( bot_name, @@ -474,9 +473,9 @@ async def run_evaluation( # noqa: PLR0913 results = self._merge_evaluation_results(all_bot_results) # Log final summary - self.stdout.write(f"\n{'='*60}") + self.stdout.write(f"\n{'=' * 60}") self.stdout.write("EVALUATION COMPLETE - FINAL SUMMARY") - self.stdout.write(f"{'='*60}") + self.stdout.write(f"{'=' * 60}") self.stdout.write( f"\nTotal test results across all bots: {len(results.test_results)}" ) diff --git a/ai_chatbots/evaluation/reporting.py b/ai_chatbots/evaluation/reporting.py index 7ae00696..addc3643 100644 --- a/ai_chatbots/evaluation/reporting.py +++ b/ai_chatbots/evaluation/reporting.py @@ -2,7 +2,7 @@ from datetime import UTC, datetime from pathlib import Path -from typing import Optional, TextIO +from typing import TextIO import pandas as pd from deepeval.evaluate.types import EvaluationResult @@ -16,10 +16,10 @@ class DualOutputWrapper: """Wrapper that writes to both stdout and a file simultaneously.""" - def __init__(self, stdout: OutputWrapper, file_path: Optional[str] = None): + def __init__(self, stdout: OutputWrapper, file_path: str | None = None): self.stdout = stdout self.file_path = file_path - self.file: Optional[TextIO] = None + self.file: TextIO | None = None if file_path: file_path_obj = Path(file_path) @@ -454,8 +454,7 @@ def composite_leaderboard( self.stdout.write("\nRanking by Model + Bot:") for rank, (_, row) in enumerate(composite.iterrows(), 1): self.stdout.write( - f" {rank}. {row['model']} / {row['bot']}: " - f"{row['composite_score']:.3f}" + f" {rank}. {row['model']} / {row['bot']}: {row['composite_score']:.3f}" ) # Per-model aggregate diff --git a/ai_chatbots/management/commands/backpopulate_tutor_checkpoints.py b/ai_chatbots/management/commands/backpopulate_tutor_checkpoints.py index 4cbbf087..d1384373 100644 --- a/ai_chatbots/management/commands/backpopulate_tutor_checkpoints.py +++ b/ai_chatbots/management/commands/backpopulate_tutor_checkpoints.py @@ -25,7 +25,7 @@ def add_message_ids(thread_id: str, output_id: int, messages: list[dict]) -> lis # Handle both dict and LangChain message objects message_id = str( uuid5( - UUID(thread_id), f'{output_id}_{message["type"]}_{message["content"]}' + UUID(thread_id), f"{output_id}_{message['type']}_{message['content']}" ) ) if isinstance(message, dict): diff --git a/ai_chatbots/management/commands/rag_evaluation.py b/ai_chatbots/management/commands/rag_evaluation.py index e4101769..a201e18c 100644 --- a/ai_chatbots/management/commands/rag_evaluation.py +++ b/ai_chatbots/management/commands/rag_evaluation.py @@ -94,8 +94,7 @@ def add_arguments(self, parser): dest="error_log_file", required=False, help=( - "Specify a file to save error logs " - "(default: rag_evaluation_errors.log)" + "Specify a file to save error logs (default: rag_evaluation_errors.log)" ), default="rag_evaluation_errors.log", ) diff --git a/ai_chatbots/management/commands/update_prompt.py b/ai_chatbots/management/commands/update_prompt.py index b0fe0be7..830b20fa 100644 --- a/ai_chatbots/management/commands/update_prompt.py +++ b/ai_chatbots/management/commands/update_prompt.py @@ -114,7 +114,7 @@ def handle(self, *args, **options): # noqa: ARG002 cache.set( prompt_key, prompt_value, - os.environ.get("AI_PROMPT_CACHE_DURATION", 60 * 60 * 24 * 28), + int(os.environ.get("AI_PROMPT_CACHE_DURATION", str(60 * 60 * 24 * 28))), ) self.stdout.write( self.style.SUCCESS( diff --git a/ai_chatbots/migrations/0007_convert_tutorbot_to_checkpoints.py b/ai_chatbots/migrations/0007_convert_tutorbot_to_checkpoints.py index 18675bf3..f5ef8df8 100644 --- a/ai_chatbots/migrations/0007_convert_tutorbot_to_checkpoints.py +++ b/ai_chatbots/migrations/0007_convert_tutorbot_to_checkpoints.py @@ -22,7 +22,7 @@ def add_message_ids(thread_id: str, output_id: int, messages: list[dict]) -> lis # Handle both dict and LangChain message objects message_id = str( uuid5( - UUID(thread_id), f'{output_id}_{message["type"]}_{message["content"]}' + UUID(thread_id), f"{output_id}_{message['type']}_{message['content']}" ) ) if isinstance(message, dict): diff --git a/ai_chatbots/posthog.py b/ai_chatbots/posthog.py index e693e226..cc65d9fe 100644 --- a/ai_chatbots/posthog.py +++ b/ai_chatbots/posthog.py @@ -1,7 +1,7 @@ """PostHog serialization and callback handler for AI chatbots.""" import logging -from typing import Any, Optional +from typing import Any from uuid import UUID import litellm @@ -95,7 +95,7 @@ def on_chat_model_start( messages: list[list[BaseMessage]], *, run_id: UUID, - parent_run_id: Optional[UUID] = None, + parent_run_id: UUID | None = None, **kwargs: Any, ): """Format messages and estimate input tokens""" @@ -142,7 +142,7 @@ def on_llm_end( response: LLMResult, *, run_id: UUID, - parent_run_id: Optional[UUID] = None, + parent_run_id: UUID | None = None, **kwargs: Any, ): # Calculate output tokens using LiteLLM's token_counter @@ -193,7 +193,7 @@ def on_llm_end( ) def _pop_run_and_capture_trace_or_span( - self, run_id: UUID, parent_run_id: Optional[UUID], outputs: Any + self, run_id: UUID, parent_run_id: UUID | None, outputs: Any ): """Override to serialize outputs before passing to parent.""" serialized_outputs = serialize_for_posthog(outputs) diff --git a/ai_chatbots/posthog_test.py b/ai_chatbots/posthog_test.py index f0b38927..4daa4e55 100644 --- a/ai_chatbots/posthog_test.py +++ b/ai_chatbots/posthog_test.py @@ -41,8 +41,8 @@ def test_initialization( properties=properties, ) - for prop in properties: - assert handler._properties[prop] == properties[prop] # noqa: SLF001 + for prop, value in properties.items(): + assert handler._properties[prop] == value # noqa: SLF001 assert handler.input_tokens == 0 assert handler.bot == mock_bot mock_posthog_client.capture.assert_called_once_with( diff --git a/ai_chatbots/tasks_test.py b/ai_chatbots/tasks_test.py index e1b91d5f..f4c2a410 100644 --- a/ai_chatbots/tasks_test.py +++ b/ai_chatbots/tasks_test.py @@ -21,8 +21,9 @@ def test_delete_stale_sessions(): """Test delete_stale_sessions""" with freeze_time( - lambda: now_in_utc() - - timedelta(days=settings.AI_CHATBOTS_SESSION_EXPIRY_DAYS + 1) + lambda: ( + now_in_utc() - timedelta(days=settings.AI_CHATBOTS_SESSION_EXPIRY_DAYS + 1) + ) ): expired_chats = UserChatSessionFactory.create_batch( 4, user=None, dj_session_key=uuid4().hex diff --git a/ai_chatbots/tools.py b/ai_chatbots/tools.py index 409e00e5..e1fb2768 100644 --- a/ai_chatbots/tools.py +++ b/ai_chatbots/tools.py @@ -2,7 +2,7 @@ import json import logging -from typing import Annotated, Optional +from typing import Annotated import pydantic from asgiref.sync import sync_to_async @@ -68,11 +68,10 @@ class SearchToolSchema(pydantic.BaseModel): description="The agent state, including the search url to use" ) - resource_type: Optional[list[enum_zip("resource_type", LearningResourceType)]] = ( - Field( - default=None, - description=( - """ + resource_type: list[enum_zip("resource_type", LearningResourceType)] | None = Field( + default=None, + description=( + """ Type of resource to search for: course, program, video, etc. If the user mentions courses, programs, videos, documents, or podcasts in particular, filter the search by this parameter. DO NOT USE THE @@ -82,10 +81,9 @@ class SearchToolSchema(pydantic.BaseModel): If the user asks for podcasts, filter by both "podcast" and "podcast_episode". """ - ), - ) + ), ) - free: Optional[bool] = Field( + free: bool | None = Field( default=None, description=( """ @@ -96,7 +94,7 @@ class SearchToolSchema(pydantic.BaseModel): """ ), ) - certification: Optional[bool] = Field( + certification: bool | None = Field( default=None, description=( """ @@ -107,7 +105,7 @@ class SearchToolSchema(pydantic.BaseModel): """ ), ) - offered_by: Optional[list[enum_zip("resource_type", OfferedBy)]] = Field( + offered_by: list[enum_zip("resource_type", OfferedBy)] | None = Field( default=None, description=""" If a user asks for resources "offered by" or "from" an institution, @@ -129,7 +127,7 @@ class SearchToolSchema(pydantic.BaseModel): @tool(args_schema=SearchToolSchema) async def search_courses( - q: str, state: Optional[Annotated[dict, InjectedState]], **kwargs + q: str, state: Annotated[dict, InjectedState] | None, **kwargs ) -> str: """ Query the MIT API for learning resources, and @@ -203,7 +201,7 @@ class SearchContentFilesToolSchema(pydantic.BaseModel): description=("Query to find requested information about a learning resource.") ) - readable_id: Optional[str] = Field( + readable_id: str | None = Field( description=("The readable_id of the learning resource."), default=None, ) diff --git a/conftest.py b/conftest.py index 64a74173..a0a2d4b2 100644 --- a/conftest.py +++ b/conftest.py @@ -11,7 +11,7 @@ @pytest.fixture(autouse=True) -def prevent_requests(mocker, request): # noqa: PT004 +def prevent_requests(mocker, request): """Patch requests to error on request by default""" if "mocked_responses" in request.fixturenames: return diff --git a/fixtures/common.py b/fixtures/common.py index 8a581ea2..f81822ac 100644 --- a/fixtures/common.py +++ b/fixtures/common.py @@ -14,13 +14,13 @@ @pytest.fixture(autouse=True) -def silence_factory_logging(): # noqa: PT004 +def silence_factory_logging(): """Only show factory errors""" logging.getLogger("factory").setLevel(logging.ERROR) @pytest.fixture(autouse=True) -def warnings_as_errors(): # noqa: PT004 +def warnings_as_errors(): """ Convert warnings to errors. This should only affect unit tests, letting pylint and other plugins raise DeprecationWarnings without erroring. @@ -54,7 +54,7 @@ def warnings_as_errors(): # noqa: PT004 @pytest.fixture -def randomness(): # noqa: PT004 +def randomness(): """Ensure a fixed seed for factoryboy""" factory.fuzzy.reseed_random("happy little clouds") diff --git a/frontend-demo/.eslintrc.js b/frontend-demo/.eslintrc.js index 1d91f427..57e04207 100644 --- a/frontend-demo/.eslintrc.js +++ b/frontend-demo/.eslintrc.js @@ -18,7 +18,7 @@ module.exports = { ActionButton: "button", ActionButtonLink: "a", }, - } + }, }, rules: { "@typescript-eslint/no-restricted-imports": [ diff --git a/main/features.py b/main/features.py index 94ad14ff..441bf7e9 100644 --- a/main/features.py +++ b/main/features.py @@ -5,7 +5,6 @@ import logging from enum import StrEnum from functools import wraps -from typing import Optional import posthog from django.conf import settings @@ -76,7 +75,7 @@ def generate_cache_key(key: str, unique_id: str, person_properties: dict) -> str ) -def get_all_feature_flags(opt_unique_id: Optional[str] = None): +def get_all_feature_flags(opt_unique_id: str | None = None): """ Get the set of all feature flags """ @@ -98,8 +97,9 @@ def get_all_feature_flags(opt_unique_id: Optional[str] = None): def is_enabled( name: str, - default: Optional[bool] = None, - opt_unique_id: Optional[str] = None, + *, + default: bool | None = None, + opt_unique_id: str | None = None, ) -> bool: """ Return True if the feature flag is enabled @@ -149,7 +149,7 @@ def is_enabled( ) -def if_feature_enabled(name: str, default: Optional[bool] = None): +def if_feature_enabled(name: str, *, default: bool | None = None): """ Wrapper that results in a no-op if the given feature isn't enabled, and otherwise runs the wrapped function as normal. @@ -162,7 +162,7 @@ def if_feature_enabled(name: str, default: Optional[bool] = None): def if_feature_enabled_inner(func): @wraps(func) def wrapped_func(*args, **kwargs): - if not is_enabled(name, default): + if not is_enabled(name, default=default): # If the given feature name is not enabled, do nothing (no-op). return None else: diff --git a/main/test_utils.py b/main/test_utils.py index b1728fca..f44aa254 100644 --- a/main/test_utils.py +++ b/main/test_utils.py @@ -25,7 +25,7 @@ def any_instance_of(*classes): AnyInstanceOf: dynamic class type with the desired equality """ # noqa: D401 - class AnyInstanceOf(abc.ABC): # noqa: B024 + class AnyInstanceOf(abc.ABC): # noqa: B024, PLW1641 """Dynamic class type for __eq__ in terms of isinstance""" def __init__(self, classes): diff --git a/main/utils_test.py b/main/utils_test.py index 5d80cc9c..0b81e4c3 100644 --- a/main/utils_test.py +++ b/main/utils_test.py @@ -35,7 +35,7 @@ def test_is_near_now(): def test_chunks(): """ - test for chunks + Test for chunks """ input_list = list(range(113)) output_list = [] @@ -56,7 +56,7 @@ def test_chunks(): def test_chunks_iterable(): """ - test that chunks works on non-list iterables too + Test that chunks works on non-list iterables too """ count = 113 input_range = range(count) diff --git a/pyproject.toml b/pyproject.toml index c1b1678c..6aeb5054 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -193,6 +193,7 @@ lint.ignore = [ "N806", "N999", "PIE804", + "PLC0415", "RET505", "RET506", "RET507", diff --git a/scripts/install_yarn.js b/scripts/install_yarn.js index ce25f2fa..dc2f90e5 100644 --- a/scripts/install_yarn.js +++ b/scripts/install_yarn.js @@ -1,23 +1,23 @@ // Install version of yarn specified in package.json -const fs = require("fs") -const { spawn } = require("child_process") +const fs = require("fs"); +const { spawn } = require("child_process"); const { engines: { yarn: yarnVersion }, -} = JSON.parse(fs.readFileSync(`${__dirname}/../package.json`)) +} = JSON.parse(fs.readFileSync(`${__dirname}/../package.json`)); -const install = spawn("npm", ["install", "-g", `yarn@${yarnVersion}`]) +const install = spawn("npm", ["install", "-g", `yarn@${yarnVersion}`]); -install.stdout.on("data", (data) => console.log(`${data}`)) +install.stdout.on("data", (data) => console.log(`${data}`)); -install.stderr.on("data", (err) => console.log(`${err}`)) +install.stderr.on("data", (err) => console.log(`${err}`)); install.on("close", (code) => { if (code === 0) { - console.log("yarn installed successfully!") + console.log("yarn installed successfully!"); } else { - console.error(`error: code ${code}`) - console.error("\ndid you run as root?") + console.error(`error: code ${code}`); + console.error("\ndid you run as root?"); } -}) +}); From 8769443fb3e2b8c12a77646d501e5172c3cb5d09 Mon Sep 17 00:00:00 2001 From: Doof Date: Mon, 27 Apr 2026 16:14:09 +0000 Subject: [PATCH 15/15] Release 0.30.0 --- RELEASE.rst | 18 ++++++++++++++++++ main/settings.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/RELEASE.rst b/RELEASE.rst index 5b8f16f7..95666dc1 100644 --- a/RELEASE.rst +++ b/RELEASE.rst @@ -1,6 +1,24 @@ Release Notes ============= +Version 0.30.0 +-------------- + +- pre-commit-ci update (#494) +- Update Node.js to v24 (#450) +- Update all non-major dev-dependencies (#467) +- Update dependency langgraph to v1.0.10 [SECURITY] (#452) +- Update dependency setuptools to v78 [SECURITY] (#472) +- Update dependency langsmith to v0.7.31 [SECURITY] (#487) +- Update dependency next to v15.5.15 [SECURITY] (#488) +- Update dependency pytest to v9.0.3 [SECURITY] (#489) +- Update dependency axios to v1.15.0 [SECURITY] (#490) +- Update dependency litellm to v1.83.0 [SECURITY] (#491) +- Update dependency langchain-openai to v1.1.14 [SECURITY] (#493) +- Update dependency langchain-core to v1.2.28 [SECURITY] (#486) +- Update dependency Django to v5.2.13 [SECURITY] (#485) +- Update dependency aiohttp to v3.13.4 [SECURITY] (#484) + Version 0.29.1 (Released April 13, 2026) -------------- diff --git a/main/settings.py b/main/settings.py index 29007917..92241ba9 100644 --- a/main/settings.py +++ b/main/settings.py @@ -31,7 +31,7 @@ from main.sentry import init_sentry from openapi.settings_spectacular import open_spectacular_settings -VERSION = "0.29.1" +VERSION = "0.30.0" log = logging.getLogger()