diff --git a/README.md b/README.md index 106a57e..89474d3 100644 --- a/README.md +++ b/README.md @@ -217,10 +217,6 @@ This fork adds several enhancements to the original Perplexica project: - ✅ OpenSearch support with dynamic XML generation - Added BASE_URL config to support reverse proxy deployments - Added autocomplete functionality proxied to SearxNG -- ✅ Enhanced Reddit focus mode to work around SearxNG limitations -- ✅ Enhanced Balance mode that uses a headless web browser to retrieve web content and use relevant excerpts to enhance responses -- ✅ Adds Agent mode that uses the full content of web pages to answer queries and an agentic flow to intelligently answer complex queries with accuracy - - See the [README.md](docs/architecture/README.md) in the docs architecture directory for more info - ✅ Query-based settings override for browser search engine integration - Automatically applies user's saved optimization mode and AI model preferences when accessing via URL with `q` parameter - Enables seamless browser search bar integration with personalized settings @@ -240,6 +236,20 @@ This fork adds several enhancements to the original Perplexica project: - Configurable via settings UI with collapsible provider interface for better organization - API support with `include_hidden` parameter for administrative access +### Unique Features + +- ✅ **Agent Mode**: A new mode that uses a headless web browser to retrieve web content and use relevant excerpts to enhance responses. + - Automatically extracts relevant information from web pages + - Provides more accurate and contextually rich answers + - Ideal for complex queries requiring detailed information + +- ✅ **Dashboard Widgets**: Create customizable AI-powered widgets for personalized information displays. + - Build widgets that combine web content with AI processing using custom prompts + - Support for multiple data sources (web pages, HTTP endpoints) with automatic content extraction + - Configurable refresh intervals (minutes/hours) for keeping information current + - Real-time preview system to test widget output before saving + - Automatic refresh of stale widgets when navigating to dashboard + ### Bug Fixes - ✅ Improved history rewriting diff --git a/package-lock.json b/package-lock.json index 7c8a138..afbd63a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,6 +46,7 @@ "playwright": "^1.52.0", "react": "^19", "react-dom": "^19", + "react-grid-layout": "^1.5.2", "react-syntax-highlighter": "^15.6.1", "react-text-to-speech": "^2.1.2", "react-textarea-autosize": "^8.5.3", @@ -65,6 +66,7 @@ "@types/pdf-parse": "^1.1.4", "@types/react": "^19", "@types/react-dom": "^19", + "@types/react-grid-layout": "^1.3.5", "autoprefixer": "^10.0.1", "drizzle-kit": "^0.30.5", "eslint": "^8", @@ -104,9 +106,9 @@ } }, "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", - "integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", "license": "MIT", "peer": true, "dependencies": { @@ -159,9 +161,9 @@ } }, "node_modules/@browserbasehq/sdk/node_modules/@types/node": { - "version": "18.19.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", - "integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", "license": "MIT", "peer": true, "dependencies": { @@ -339,21 +341,21 @@ "license": "Apache-2.0" }, "node_modules/@emnapi/core": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.4.tgz", - "integrity": "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.3", + "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz", - "integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", "license": "MIT", "optional": true, "dependencies": { @@ -361,9 +363,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.3.tgz", - "integrity": "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", "dev": true, "license": "MIT", "optional": true, @@ -1394,9 +1396,9 @@ } }, "node_modules/@headlessui/react": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.4.tgz", - "integrity": "sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.5.tgz", + "integrity": "sha512-h1+2Vu1yR5pp/fBcTnwVEW8Kb94Hbxp7MXZLORfDzvSrbmGgiTyaTZ4LI/tPNZnK8eDrYD9s9cMbjm5HS5otIQ==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.16", @@ -1467,9 +1469,9 @@ "license": "ISC" }, "node_modules/@ibm-cloud/watsonx-ai": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.6.8.tgz", - "integrity": "sha512-Ip5bLDM40rQRYauRmmIIpxLO57wI3+F59Njmp0hexnVr+uKroV+O9+eAGQkdE2c9d17R16Q77ueAGheZrzqgWA==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.6.9.tgz", + "integrity": "sha512-aW4jUVgxjdDa8IDSM+KPeR42pxeR5AUvSXxvj+iid1DdrmRd/SRR9o/FdWEjpZLgcs5RXQFIT56goWkJv7s8oQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -1482,9 +1484,9 @@ } }, "node_modules/@ibm-cloud/watsonx-ai/node_modules/@types/node": { - "version": "18.19.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", - "integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", "license": "MIT", "peer": true, "dependencies": { @@ -2565,9 +2567,9 @@ } }, "node_modules/@langchain/core": { - "version": "0.3.64", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.64.tgz", - "integrity": "sha512-KOHTnmycOPfuffLAm3wwv1rThQ47iG5a3HuWMt2qYhwwImFi6HLeYqKgmxVS5qcJjc6t0IPwR7jOvv9IKxfrAw==", + "version": "0.3.66", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.66.tgz", + "integrity": "sha512-d3SgSDOlgOjdIbReIXVQl9HaQzKqO/5+E+o3kJwoKXLGP9dxi7+lMyaII7yv7G8/aUxMWLwFES9zc1jFoeJEZw==", "license": "MIT", "dependencies": { "@cfworker/json-schema": "^4.0.2", @@ -2633,13 +2635,13 @@ } }, "node_modules/@langchain/langgraph": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.9.tgz", - "integrity": "sha512-eV0Qfpj45pn3A43v3JJygE1pGI8QAd+esb4iifIFWPlkjwFdVbZjqNz556Ojf2IjMLCSBpSEfZqQsRlju8fM0A==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.11.tgz", + "integrity": "sha512-Lh8oga4ismQyw1NGZKoHPdeGke1g5HMF7V0nBlc5R7GnV8tfC6pdsXjiEH6sYsHsRDInfy8uQeob/BwEmMSSbQ==", "license": "MIT", "dependencies": { "@langchain/langgraph-checkpoint": "~0.0.18", - "@langchain/langgraph-sdk": "~0.0.96", + "@langchain/langgraph-sdk": "~0.0.100", "uuid": "^10.0.0", "zod": "^3.25.32" }, @@ -2672,9 +2674,9 @@ } }, "node_modules/@langchain/langgraph-sdk": { - "version": "0.0.97", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.97.tgz", - "integrity": "sha512-MrkCFKA/Ei/haJ1bN/lQyAjEJ1ezV9Djv2BYH2L3oqxOf3COT1LoRn3P6TD0M+j1RD5VjkowUwQ3T8Uidzq9mA==", + "version": "0.0.100", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.100.tgz", + "integrity": "sha512-mQuj0KgjD31Me+/W658OtdlOACOjgipWp/hF80OY4w4LqWCNIQWJBWMZ3f1/E8jpog/XBCROR37auFc7Fj+4Dw==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.15", @@ -2746,9 +2748,9 @@ } }, "node_modules/@langchain/openai/node_modules/openai": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/openai/-/openai-5.10.1.tgz", - "integrity": "sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.10.2.tgz", + "integrity": "sha512-n+vi74LzHtvlKcDPn9aApgELGiu5CwhaLG40zxLTlFQdoSJCLACORIPC2uVQ3JEYAbqapM+XyRKFy2Thej7bIw==", "license": "Apache-2.0", "bin": { "openai": "bin/cli" @@ -2820,9 +2822,9 @@ } }, "node_modules/@next/env": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.1.tgz", - "integrity": "sha512-DXQwFGAE2VH+f2TJsKepRXpODPU+scf5fDbKOME8MMyeyswe4XwgRdiiIYmBfkXU+2ssliLYznajTrOQdnLR5A==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.3.tgz", + "integrity": "sha512-lKJ9KJAvaWzqurIsz6NWdQOLj96mdhuDMusLSYHw9HBe2On7BjUwU1WeRvq19x7NrEK3iOgMeSBV5qEhVH1cMw==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -2836,9 +2838,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.1.tgz", - "integrity": "sha512-L+81yMsiHq82VRXS2RVq6OgDwjvA4kDksGU8hfiDHEXP+ncKIUhUsadAVB+MRIp2FErs/5hpXR0u2eluWPAhig==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.3.tgz", + "integrity": "sha512-YAhZWKeEYY7LHQJiQ8fe3Y6ymfcDcTn7rDC8PDu/pdeIl1Z2LHD4uyPNuQUGCEQT//MSNv6oZCeQzZfTCKZv+A==", "cpu": [ "arm64" ], @@ -2852,9 +2854,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.1.tgz", - "integrity": "sha512-jfz1RXu6SzL14lFl05/MNkcN35lTLMJWPbqt7Xaj35+ZWAX342aePIJrN6xBdGeKl6jPXJm0Yqo3Xvh3Gpo3Uw==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.3.tgz", + "integrity": "sha512-ZPHRdd51xaxCMpT4viQ6h8TgYM1zPW1JIeksPY9wKlyvBVUQqrWqw8kEh1sa7/x0Ied+U7pYHkAkutrUwxbMcg==", "cpu": [ "x64" ], @@ -2868,9 +2870,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.1.tgz", - "integrity": "sha512-k0tOFn3dsnkaGfs6iQz8Ms6f1CyQe4GacXF979sL8PNQxjYS1swx9VsOyUQYaPoGV8nAZ7OX8cYaeiXGq9ahPQ==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.3.tgz", + "integrity": "sha512-QUdqftCXC5vw5cowucqi9FeOPQ0vdMxoOHLY0J5jPdercwSJFjdi9CkEO4Xkq1eG4t1TB/BG81n6rmTsWoILnw==", "cpu": [ "arm64" ], @@ -2884,9 +2886,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.1.tgz", - "integrity": "sha512-4ogGQ/3qDzbbK3IwV88ltihHFbQVq6Qr+uEapzXHXBH1KsVBZOB50sn6BWHPcFjwSoMX2Tj9eH/fZvQnSIgc3g==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.3.tgz", + "integrity": "sha512-HTL31NsmoafX+r5g91Yj3+q34nrn1xKmCWVuNA+fUWO4X0pr+n83uGzLyEOn0kUqbMZ40KmWx+4wsbMoUChkiQ==", "cpu": [ "arm64" ], @@ -2900,9 +2902,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.1.tgz", - "integrity": "sha512-Jj0Rfw3wIgp+eahMz/tOGwlcYYEFjlBPKU7NqoOkTX0LY45i5W0WcDpgiDWSLrN8KFQq/LW7fZq46gxGCiOYlQ==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.3.tgz", + "integrity": "sha512-HRQLWoeFkKXd2YCEEy9GhfwOijRm37x4w5r0MMVHxBKSA6ms3JoPUXvGhfHT6srnGRcEUWNrQ2vzkHir5ZWTSw==", "cpu": [ "x64" ], @@ -2916,9 +2918,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.1.tgz", - "integrity": "sha512-9WlEZfnw1vFqkWsTMzZDgNL7AUI1aiBHi0S2m8jvycPyCq/fbZjtE/nDkhJRYbSjXbtRHYLDBlmP95kpjEmJbw==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.3.tgz", + "integrity": "sha512-NyXUx6G7AayaRGUsVPenuwhyAoyxjQuQPaK50AXoaAHPwRuif4WmSrXUs8/Y0HJIZh8E/YXRm9H7uuGfiacpuQ==", "cpu": [ "x64" ], @@ -2932,9 +2934,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.1.tgz", - "integrity": "sha512-WodRbZ9g6CQLRZsG3gtrA9w7Qfa9BwDzhFVdlI6sV0OCPq9JrOrJSp9/ioLsezbV8w9RCJ8v55uzJuJ5RgWLZg==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.3.tgz", + "integrity": "sha512-2CUTmpzN/7cL1a7GjdLkDFlfH3nwMwW8a6JiaAUsL9MtKmNNO3fnXqnY0Zk30fii3hVEl4dr7ztrpYt0t2CcGQ==", "cpu": [ "arm64" ], @@ -2948,9 +2950,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.1.tgz", - "integrity": "sha512-y+wTBxelk2xiNofmDOVU7O5WxTHcvOoL3srOM0kxTzKDjQ57kPU0tpnPJ/BWrRnsOwXEv0+3QSbGR7hY4n9LkQ==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.3.tgz", + "integrity": "sha512-i54YgUhvrUQxQD84SjAbkfWhYkOdm/DNRAVekCHLWxVg3aUbyC6NFQn9TwgCkX5QAS2pXCJo3kFboSFvrsd7dA==", "cpu": [ "x64" ], @@ -3106,14 +3108,14 @@ "license": "BSD-3-Clause" }, "node_modules/@react-aria/focus": { - "version": "3.20.5", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.5.tgz", - "integrity": "sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.0.tgz", + "integrity": "sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.3", - "@react-aria/utils": "^3.29.1", - "@react-types/shared": "^3.30.0", + "@react-aria/interactions": "^3.25.4", + "@react-aria/utils": "^3.30.0", + "@react-types/shared": "^3.31.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, @@ -3123,15 +3125,15 @@ } }, "node_modules/@react-aria/interactions": { - "version": "3.25.3", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.3.tgz", - "integrity": "sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==", + "version": "3.25.4", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.4.tgz", + "integrity": "sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==", "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.9", - "@react-aria/utils": "^3.29.1", + "@react-aria/ssr": "^3.9.10", + "@react-aria/utils": "^3.30.0", "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.30.0", + "@react-types/shared": "^3.31.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -3140,9 +3142,9 @@ } }, "node_modules/@react-aria/ssr": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.9.tgz", - "integrity": "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", + "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -3155,15 +3157,15 @@ } }, "node_modules/@react-aria/utils": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.1.tgz", - "integrity": "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.30.0.tgz", + "integrity": "sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==", "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.9", + "@react-aria/ssr": "^3.9.10", "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.10.7", - "@react-types/shared": "^3.30.0", + "@react-stately/utils": "^3.10.8", + "@react-types/shared": "^3.31.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, @@ -3182,9 +3184,9 @@ } }, "node_modules/@react-stately/utils": { - "version": "3.10.7", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.7.tgz", - "integrity": "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==", + "version": "3.10.8", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz", + "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -3194,9 +3196,9 @@ } }, "node_modules/@react-types/shared": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.30.0.tgz", - "integrity": "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.31.0.tgz", + "integrity": "sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==", "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" @@ -3391,9 +3393,9 @@ "peer": true }, "node_modules/@types/node": { - "version": "20.19.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.8.tgz", - "integrity": "sha512-HzbgCY53T6bfu4tT7Aq3TvViJyHjLjPNaAS3HOuMc9pw97KHsUtXNX4L+wu59g1WnjsZSko35MbEqnO58rihhw==", + "version": "20.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -3445,6 +3447,16 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-grid-layout": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/react-grid-layout/-/react-grid-layout-1.3.5.tgz", + "integrity": "sha512-WH/po1gcEcoR6y857yAnPGug+ZhkF4PaTUxgAbwfeSH/QOgVSakKHBXoPGad/sEznmkiaK3pqHk+etdWisoeBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-syntax-highlighter": { "version": "15.5.13", "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", @@ -4341,13 +4353,13 @@ } }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -4832,25 +4844,25 @@ } }, "node_modules/cheerio": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", - "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.0", + "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.0.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^7.10.0", + "undici": "^7.12.0", "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=18.17" + "node": ">=20.18.1" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -5758,9 +5770,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.186", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.186.tgz", - "integrity": "sha512-lur7L4BFklgepaJxj4DqPk7vKbTEl0pajNlg2QjE5shefmlmBLm2HvQ7PMf1R/GvlevT/581cop33/quQcfX3A==", + "version": "1.5.190", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz", + "integrity": "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==", "dev": true, "license": "ISC" }, @@ -6571,6 +6583,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "license": "MIT" + }, "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", @@ -6833,9 +6851,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -7255,9 +7273,9 @@ } }, "node_modules/groq-sdk/node_modules/@types/node": { - "version": "18.19.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", - "integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -7535,9 +7553,9 @@ } }, "node_modules/ibm-cloud-sdk-core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.4.0.tgz", - "integrity": "sha512-c4cwOuUDbMiFROYM/Ti1aC+Umi1v3TdvC2DO5zR7w44FYY/3xrs79+3DVPXt/nRhJeaMHN2L9XwlXsPSoVDHJA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.4.1.tgz", + "integrity": "sha512-kGh1KlkFHFsJANWiGTJZ5PNoL4bZHAGprAa/uSFvLpJdKUEOH+xUAUYcLMTH71jtgy9Wl2ePDjaLWiWe80uGiA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -7550,7 +7568,7 @@ "dotenv": "^16.4.5", "extend": "3.0.2", "file-type": "16.5.4", - "form-data": "4.0.0", + "form-data": "^4.0.4", "isstream": "0.1.2", "jsonwebtoken": "^9.0.2", "mime-types": "2.1.35", @@ -7562,30 +7580,15 @@ } }, "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { - "version": "18.19.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", - "integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", "license": "MIT", "peer": true, "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/ibm-cloud-sdk-core/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ibm-cloud-sdk-core/node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -8280,7 +8283,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -8593,9 +8595,9 @@ } }, "node_modules/langsmith": { - "version": "0.3.46", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.46.tgz", - "integrity": "sha512-Hhi4/cMjhWIGpu0DW5eQrXBbeeKQWPYYQyJCYzhFjod+xinMry4i8QR0gxrrgjGOgfMuU6nyK79YqjGTEPVbDA==", + "version": "0.3.48", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.48.tgz", + "integrity": "sha512-oEsj0Z8S2Chgb3vJzRX2vplLu4RWR1cpraIaVwv2PsNZ57VbHgZEdXdeh5kh16iP8PAv04JkBncP+KLRoKBFEw==", "license": "MIT", "dependencies": { "@types/uuid": "^10.0.0", @@ -8806,7 +8808,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -8898,9 +8899,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.7.10", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.10.tgz", - "integrity": "sha512-au62yyLyJukhC2P1TYi3uBi/RScGYai69uT72D8a048QH8rRj+yhND3C21GdZHE+6emtsf6Yqemcf//K+EIWDg==", + "version": "7.7.12", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.12.tgz", + "integrity": "sha512-Y5xNBqoaTooSLkmlg2P0fdbh53gp4MqW7zhvcweGCPUWvWI5BecWRYI8vPlzT8D7OULxsQg2qoRW9EsJlBWasQ==", "license": "MIT", "engines": { "node": ">= 10" @@ -9061,9 +9062,9 @@ "license": "MIT" }, "node_modules/napi-postinstall": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.0.tgz", - "integrity": "sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", + "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", "dev": true, "license": "MIT", "bin": { @@ -9084,12 +9085,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/next/-/next-15.4.1.tgz", - "integrity": "sha512-eNKB1q8C7o9zXF8+jgJs2CzSLIU3T6bQtX6DcTnCq1sIR1CJ0GlSyRs1BubQi3/JgCnr9Vr+rS5mOMI38FFyQw==", + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.4.3.tgz", + "integrity": "sha512-uW7Qe6poVasNIE1X382nI29oxSdFJzjQzTgJFLD43MxyPfGKKxCMySllhBpvqr48f58Om+tLMivzRwBpXEytvA==", "license": "MIT", "dependencies": { - "@next/env": "15.4.1", + "@next/env": "15.4.3", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -9102,14 +9103,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.4.1", - "@next/swc-darwin-x64": "15.4.1", - "@next/swc-linux-arm64-gnu": "15.4.1", - "@next/swc-linux-arm64-musl": "15.4.1", - "@next/swc-linux-x64-gnu": "15.4.1", - "@next/swc-linux-x64-musl": "15.4.1", - "@next/swc-win32-arm64-msvc": "15.4.1", - "@next/swc-win32-x64-msvc": "15.4.1", + "@next/swc-darwin-arm64": "15.4.3", + "@next/swc-darwin-x64": "15.4.3", + "@next/swc-linux-arm64-gnu": "15.4.3", + "@next/swc-linux-arm64-musl": "15.4.3", + "@next/swc-linux-x64-gnu": "15.4.3", + "@next/swc-linux-x64-musl": "15.4.3", + "@next/swc-win32-arm64-msvc": "15.4.3", + "@next/swc-win32-x64-msvc": "15.4.3", "sharp": "^0.34.3" }, "peerDependencies": { @@ -9619,9 +9620,9 @@ } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.119", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", - "integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", "license": "MIT", "peer": true, "dependencies": { @@ -10295,7 +10296,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -10462,13 +10462,57 @@ "react": "^19.1.0" } }, + "node_modules/react-draggable": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.5.0.tgz", + "integrity": "sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-grid-layout": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.5.2.tgz", + "integrity": "sha512-vT7xmQqszTT+sQw/LfisrEO4le1EPNnSEMVHy6sBZyzS3yGkMywdOd+5iEFFwQwt0NSaGkxuRmYwa1JsP6OJdw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.6", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, + "node_modules/react-resizable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", + "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", + "license": "MIT", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.0.3" + }, + "peerDependencies": { + "react": ">= 16.3" + } + }, "node_modules/react-syntax-highlighter": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", @@ -10715,6 +10759,12 @@ "license": "MIT", "peer": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -12262,9 +12312,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", - "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz", + "integrity": "sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -12480,17 +12530,17 @@ } }, "node_modules/weaviate-client": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/weaviate-client/-/weaviate-client-3.6.2.tgz", - "integrity": "sha512-6z+Du0Sp+nVp4Mhsn25sd+Qw6fr60vbyUS1e3gTZqtMrxLuNC1xgA0J/MHu5oHcm6moCBqT/2AQCt4ZV4fYSaw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/weaviate-client/-/weaviate-client-3.8.0.tgz", + "integrity": "sha512-8yWNY3OIAh1H/W+414o17em/3CSDc5f4/sMjCrFksVppczHC1mB1f0fCFosg9fpQGegLT+Ll6un82sTGYxFhqw==", "license": "BSD 3-Clause", "dependencies": { "abort-controller-x": "^0.4.3", - "graphql": "^16.10.0", + "graphql": "^16.11.0", "graphql-request": "^6.1.0", - "long": "^5.2.4", - "nice-grpc": "^2.1.11", - "nice-grpc-client-middleware-retry": "^3.1.10", + "long": "^5.3.2", + "nice-grpc": "^2.1.12", + "nice-grpc-client-middleware-retry": "^3.1.11", "nice-grpc-common": "^2.0.2", "uuid": "^9.0.1" }, @@ -12998,9 +13048,9 @@ } }, "node_modules/yet-another-react-lightbox": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.24.0.tgz", - "integrity": "sha512-j3YtwDT+fdBBhxbaxfthHMehXkUj388rpn7knc934H86bJJDBEL/m9WFGdKq2ivT3GaUPF+41GplKFbAv8bOmg==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.25.0.tgz", + "integrity": "sha512-NaCeEXCpdwoTvoOpxNK9gdW8+oHs79yVH+D2YeVQWRjH5i32e5CoXndAAFP2p8awzVYfSonherrE9JMTpfD3EA==", "license": "MIT", "engines": { "node": ">=14" diff --git a/package.json b/package.json index b6aa084..501d8d1 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "playwright": "^1.52.0", "react": "^19", "react-dom": "^19", + "react-grid-layout": "^1.5.2", "react-syntax-highlighter": "^15.6.1", "react-text-to-speech": "^2.1.2", "react-textarea-autosize": "^8.5.3", @@ -69,6 +70,7 @@ "@types/pdf-parse": "^1.1.4", "@types/react": "^19", "@types/react-dom": "^19", + "@types/react-grid-layout": "^1.3.5", "autoprefixer": "^10.0.1", "drizzle-kit": "^0.30.5", "eslint": "^8", diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 8537418..bcbe8db 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -9,7 +9,8 @@ import { Layers, List, } from 'lucide-react'; -import { useState, useEffect, useRef } from 'react'; +import { useState, useEffect, useRef, useMemo } from 'react'; +import { Responsive, WidthProvider } from 'react-grid-layout'; import { Card, CardContent, @@ -22,8 +23,11 @@ import WidgetConfigModal from '@/components/dashboard/WidgetConfigModal'; import WidgetDisplay from '@/components/dashboard/WidgetDisplay'; import { useDashboard } from '@/lib/hooks/useDashboard'; import { Widget, WidgetConfig } from '@/lib/types/widget'; +import { DASHBOARD_CONSTRAINTS } from '@/lib/constants/dashboard'; import { toast } from 'sonner'; +const ResponsiveGridLayout = WidthProvider(Responsive); + const DashboardPage = () => { const { widgets, @@ -37,17 +41,21 @@ const DashboardPage = () => { importDashboard, settings, updateSettings, + getLayouts, + updateLayouts, } = useDashboard(); const [showAddModal, setShowAddModal] = useState(false); const [editingWidget, setEditingWidget] = useState(null); const hasAutoRefreshed = useRef(false); + // Memoize the ResponsiveGridLayout to prevent re-renders + const ResponsiveGrid = useMemo(() => ResponsiveGridLayout, []); + // Auto-refresh stale widgets when dashboard loads (only once) useEffect(() => { if (!isLoading && widgets.length > 0 && !hasAutoRefreshed.current) { hasAutoRefreshed.current = true; - refreshAllWidgets(); } }, [isLoading, widgets, refreshAllWidgets]); @@ -119,6 +127,25 @@ const DashboardPage = () => { updateSettings({ parallelLoading: !settings.parallelLoading }); }; + // Handle layout changes from react-grid-layout + const handleLayoutChange = (layout: any, layouts: any) => { + updateLayouts(layouts); + }; + + // Memoize grid children to prevent unnecessary re-renders + const gridChildren = useMemo(() => { + return widgets.map((widget) => ( +
+ +
+ )); + }, [widgets]); + // Empty state component const EmptyDashboard = () => (
@@ -224,22 +251,23 @@ const DashboardPage = () => { ) : widgets.length === 0 ? ( ) : ( -
- {widgets.map((widget) => ( - - ))} -
+ {gridChildren} + )}
diff --git a/src/app/globals.css b/src/app/globals.css index 770cc36..64516f4 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,7 +1,12 @@ +/* React Grid Layout styles */ +@import "react-grid-layout/css/styles.css"; +@import "react-resizable/css/styles.css"; + @tailwind base; @tailwind components; @tailwind utilities; + @layer base { .overflow-hidden-scrollable { -ms-overflow-style: none; diff --git a/src/components/dashboard/WidgetDisplay.tsx b/src/components/dashboard/WidgetDisplay.tsx index c4a916d..5a8255d 100644 --- a/src/components/dashboard/WidgetDisplay.tsx +++ b/src/components/dashboard/WidgetDisplay.tsx @@ -8,6 +8,7 @@ import { AlertCircle, ChevronDown, ChevronUp, + GripVertical, } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import MarkdownRenderer from '@/components/MarkdownRenderer'; @@ -49,14 +50,24 @@ const WidgetDisplay = ({ }; return ( - - + +
- - {widget.title} - +
+ {/* Drag Handle */} +
+ +
+ + + {widget.title} + +
-
+
{/* Last updated date with refresh frequency tooltip */} - - {widget.isLoading ? ( -
- - Loading content... -
- ) : widget.error ? ( -
- -
-

- Error Loading Content -

-

- {widget.error} -

+ +
+ {widget.isLoading ? ( +
+ + Loading content...
-
- ) : widget.content ? ( -
- -
- ) : ( -
-
-

No content yet

-

Click refresh to load content

+ ) : widget.error ? ( +
+ +
+

+ Error Loading Content +

+

+ {widget.error} +

+
-
- )} + ) : widget.content ? ( +
+ +
+ ) : ( +
+
+

No content yet

+

Click refresh to load content

+
+
+ )} +
{/* Collapsible footer with sources and actions */} -
+