feat(dashboard) - Resizable and repositionable widgets.

This commit is contained in:
Willie Zutz 2025-07-26 13:16:12 -06:00
parent 7253cbc89c
commit 7b372e75da
11 changed files with 744 additions and 391 deletions

View file

@ -217,10 +217,6 @@ This fork adds several enhancements to the original Perplexica project:
- ✅ OpenSearch support with dynamic XML generation - ✅ OpenSearch support with dynamic XML generation
- Added BASE_URL config to support reverse proxy deployments - Added BASE_URL config to support reverse proxy deployments
- Added autocomplete functionality proxied to SearxNG - 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 - ✅ 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 - 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 - 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 - Configurable via settings UI with collapsible provider interface for better organization
- API support with `include_hidden` parameter for administrative access - 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 ### Bug Fixes
- ✅ Improved history rewriting - ✅ Improved history rewriting

404
package-lock.json generated
View file

@ -46,6 +46,7 @@
"playwright": "^1.52.0", "playwright": "^1.52.0",
"react": "^19", "react": "^19",
"react-dom": "^19", "react-dom": "^19",
"react-grid-layout": "^1.5.2",
"react-syntax-highlighter": "^15.6.1", "react-syntax-highlighter": "^15.6.1",
"react-text-to-speech": "^2.1.2", "react-text-to-speech": "^2.1.2",
"react-textarea-autosize": "^8.5.3", "react-textarea-autosize": "^8.5.3",
@ -65,6 +66,7 @@
"@types/pdf-parse": "^1.1.4", "@types/pdf-parse": "^1.1.4",
"@types/react": "^19", "@types/react": "^19",
"@types/react-dom": "^19", "@types/react-dom": "^19",
"@types/react-grid-layout": "^1.3.5",
"autoprefixer": "^10.0.1", "autoprefixer": "^10.0.1",
"drizzle-kit": "^0.30.5", "drizzle-kit": "^0.30.5",
"eslint": "^8", "eslint": "^8",
@ -104,9 +106,9 @@
} }
}, },
"node_modules/@anthropic-ai/sdk/node_modules/@types/node": { "node_modules/@anthropic-ai/sdk/node_modules/@types/node": {
"version": "18.19.119", "version": "18.19.120",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz",
"integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -159,9 +161,9 @@
} }
}, },
"node_modules/@browserbasehq/sdk/node_modules/@types/node": { "node_modules/@browserbasehq/sdk/node_modules/@types/node": {
"version": "18.19.119", "version": "18.19.120",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz",
"integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -339,21 +341,21 @@
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/@emnapi/core": { "node_modules/@emnapi/core": {
"version": "1.4.4", "version": "1.4.5",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.4.tgz", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz",
"integrity": "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==", "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@emnapi/wasi-threads": "1.0.3", "@emnapi/wasi-threads": "1.0.4",
"tslib": "^2.4.0" "tslib": "^2.4.0"
} }
}, },
"node_modules/@emnapi/runtime": { "node_modules/@emnapi/runtime": {
"version": "1.4.4", "version": "1.4.5",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz",
"integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@ -361,9 +363,9 @@
} }
}, },
"node_modules/@emnapi/wasi-threads": { "node_modules/@emnapi/wasi-threads": {
"version": "1.0.3", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz",
"integrity": "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==", "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
@ -1394,9 +1396,9 @@
} }
}, },
"node_modules/@headlessui/react": { "node_modules/@headlessui/react": {
"version": "2.2.4", "version": "2.2.5",
"resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.4.tgz", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.5.tgz",
"integrity": "sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==", "integrity": "sha512-h1+2Vu1yR5pp/fBcTnwVEW8Kb94Hbxp7MXZLORfDzvSrbmGgiTyaTZ4LI/tPNZnK8eDrYD9s9cMbjm5HS5otIQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@floating-ui/react": "^0.26.16", "@floating-ui/react": "^0.26.16",
@ -1467,9 +1469,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/@ibm-cloud/watsonx-ai": { "node_modules/@ibm-cloud/watsonx-ai": {
"version": "1.6.8", "version": "1.6.9",
"resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.6.8.tgz", "resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.6.9.tgz",
"integrity": "sha512-Ip5bLDM40rQRYauRmmIIpxLO57wI3+F59Njmp0hexnVr+uKroV+O9+eAGQkdE2c9d17R16Q77ueAGheZrzqgWA==", "integrity": "sha512-aW4jUVgxjdDa8IDSM+KPeR42pxeR5AUvSXxvj+iid1DdrmRd/SRR9o/FdWEjpZLgcs5RXQFIT56goWkJv7s8oQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -1482,9 +1484,9 @@
} }
}, },
"node_modules/@ibm-cloud/watsonx-ai/node_modules/@types/node": { "node_modules/@ibm-cloud/watsonx-ai/node_modules/@types/node": {
"version": "18.19.119", "version": "18.19.120",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz",
"integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -2565,9 +2567,9 @@
} }
}, },
"node_modules/@langchain/core": { "node_modules/@langchain/core": {
"version": "0.3.64", "version": "0.3.66",
"resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.64.tgz", "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.66.tgz",
"integrity": "sha512-KOHTnmycOPfuffLAm3wwv1rThQ47iG5a3HuWMt2qYhwwImFi6HLeYqKgmxVS5qcJjc6t0IPwR7jOvv9IKxfrAw==", "integrity": "sha512-d3SgSDOlgOjdIbReIXVQl9HaQzKqO/5+E+o3kJwoKXLGP9dxi7+lMyaII7yv7G8/aUxMWLwFES9zc1jFoeJEZw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@cfworker/json-schema": "^4.0.2", "@cfworker/json-schema": "^4.0.2",
@ -2633,13 +2635,13 @@
} }
}, },
"node_modules/@langchain/langgraph": { "node_modules/@langchain/langgraph": {
"version": "0.3.9", "version": "0.3.11",
"resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.9.tgz", "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.11.tgz",
"integrity": "sha512-eV0Qfpj45pn3A43v3JJygE1pGI8QAd+esb4iifIFWPlkjwFdVbZjqNz556Ojf2IjMLCSBpSEfZqQsRlju8fM0A==", "integrity": "sha512-Lh8oga4ismQyw1NGZKoHPdeGke1g5HMF7V0nBlc5R7GnV8tfC6pdsXjiEH6sYsHsRDInfy8uQeob/BwEmMSSbQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@langchain/langgraph-checkpoint": "~0.0.18", "@langchain/langgraph-checkpoint": "~0.0.18",
"@langchain/langgraph-sdk": "~0.0.96", "@langchain/langgraph-sdk": "~0.0.100",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"zod": "^3.25.32" "zod": "^3.25.32"
}, },
@ -2672,9 +2674,9 @@
} }
}, },
"node_modules/@langchain/langgraph-sdk": { "node_modules/@langchain/langgraph-sdk": {
"version": "0.0.97", "version": "0.0.100",
"resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.97.tgz", "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.100.tgz",
"integrity": "sha512-MrkCFKA/Ei/haJ1bN/lQyAjEJ1ezV9Djv2BYH2L3oqxOf3COT1LoRn3P6TD0M+j1RD5VjkowUwQ3T8Uidzq9mA==", "integrity": "sha512-mQuj0KgjD31Me+/W658OtdlOACOjgipWp/hF80OY4w4LqWCNIQWJBWMZ3f1/E8jpog/XBCROR37auFc7Fj+4Dw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.15", "@types/json-schema": "^7.0.15",
@ -2746,9 +2748,9 @@
} }
}, },
"node_modules/@langchain/openai/node_modules/openai": { "node_modules/@langchain/openai/node_modules/openai": {
"version": "5.10.1", "version": "5.10.2",
"resolved": "https://registry.npmjs.org/openai/-/openai-5.10.1.tgz", "resolved": "https://registry.npmjs.org/openai/-/openai-5.10.2.tgz",
"integrity": "sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA==", "integrity": "sha512-n+vi74LzHtvlKcDPn9aApgELGiu5CwhaLG40zxLTlFQdoSJCLACORIPC2uVQ3JEYAbqapM+XyRKFy2Thej7bIw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"bin": { "bin": {
"openai": "bin/cli" "openai": "bin/cli"
@ -2820,9 +2822,9 @@
} }
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.3.tgz",
"integrity": "sha512-DXQwFGAE2VH+f2TJsKepRXpODPU+scf5fDbKOME8MMyeyswe4XwgRdiiIYmBfkXU+2ssliLYznajTrOQdnLR5A==", "integrity": "sha512-lKJ9KJAvaWzqurIsz6NWdQOLj96mdhuDMusLSYHw9HBe2On7BjUwU1WeRvq19x7NrEK3iOgMeSBV5qEhVH1cMw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@next/eslint-plugin-next": { "node_modules/@next/eslint-plugin-next": {
@ -2836,9 +2838,9 @@
} }
}, },
"node_modules/@next/swc-darwin-arm64": { "node_modules/@next/swc-darwin-arm64": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.3.tgz",
"integrity": "sha512-L+81yMsiHq82VRXS2RVq6OgDwjvA4kDksGU8hfiDHEXP+ncKIUhUsadAVB+MRIp2FErs/5hpXR0u2eluWPAhig==", "integrity": "sha512-YAhZWKeEYY7LHQJiQ8fe3Y6ymfcDcTn7rDC8PDu/pdeIl1Z2LHD4uyPNuQUGCEQT//MSNv6oZCeQzZfTCKZv+A==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2852,9 +2854,9 @@
} }
}, },
"node_modules/@next/swc-darwin-x64": { "node_modules/@next/swc-darwin-x64": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.3.tgz",
"integrity": "sha512-jfz1RXu6SzL14lFl05/MNkcN35lTLMJWPbqt7Xaj35+ZWAX342aePIJrN6xBdGeKl6jPXJm0Yqo3Xvh3Gpo3Uw==", "integrity": "sha512-ZPHRdd51xaxCMpT4viQ6h8TgYM1zPW1JIeksPY9wKlyvBVUQqrWqw8kEh1sa7/x0Ied+U7pYHkAkutrUwxbMcg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2868,9 +2870,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-gnu": { "node_modules/@next/swc-linux-arm64-gnu": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.3.tgz",
"integrity": "sha512-k0tOFn3dsnkaGfs6iQz8Ms6f1CyQe4GacXF979sL8PNQxjYS1swx9VsOyUQYaPoGV8nAZ7OX8cYaeiXGq9ahPQ==", "integrity": "sha512-QUdqftCXC5vw5cowucqi9FeOPQ0vdMxoOHLY0J5jPdercwSJFjdi9CkEO4Xkq1eG4t1TB/BG81n6rmTsWoILnw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2884,9 +2886,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-musl": { "node_modules/@next/swc-linux-arm64-musl": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.3.tgz",
"integrity": "sha512-4ogGQ/3qDzbbK3IwV88ltihHFbQVq6Qr+uEapzXHXBH1KsVBZOB50sn6BWHPcFjwSoMX2Tj9eH/fZvQnSIgc3g==", "integrity": "sha512-HTL31NsmoafX+r5g91Yj3+q34nrn1xKmCWVuNA+fUWO4X0pr+n83uGzLyEOn0kUqbMZ40KmWx+4wsbMoUChkiQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2900,9 +2902,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-gnu": { "node_modules/@next/swc-linux-x64-gnu": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.3.tgz",
"integrity": "sha512-Jj0Rfw3wIgp+eahMz/tOGwlcYYEFjlBPKU7NqoOkTX0LY45i5W0WcDpgiDWSLrN8KFQq/LW7fZq46gxGCiOYlQ==", "integrity": "sha512-HRQLWoeFkKXd2YCEEy9GhfwOijRm37x4w5r0MMVHxBKSA6ms3JoPUXvGhfHT6srnGRcEUWNrQ2vzkHir5ZWTSw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2916,9 +2918,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-musl": { "node_modules/@next/swc-linux-x64-musl": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.3.tgz",
"integrity": "sha512-9WlEZfnw1vFqkWsTMzZDgNL7AUI1aiBHi0S2m8jvycPyCq/fbZjtE/nDkhJRYbSjXbtRHYLDBlmP95kpjEmJbw==", "integrity": "sha512-NyXUx6G7AayaRGUsVPenuwhyAoyxjQuQPaK50AXoaAHPwRuif4WmSrXUs8/Y0HJIZh8E/YXRm9H7uuGfiacpuQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2932,9 +2934,9 @@
} }
}, },
"node_modules/@next/swc-win32-arm64-msvc": { "node_modules/@next/swc-win32-arm64-msvc": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.3.tgz",
"integrity": "sha512-WodRbZ9g6CQLRZsG3gtrA9w7Qfa9BwDzhFVdlI6sV0OCPq9JrOrJSp9/ioLsezbV8w9RCJ8v55uzJuJ5RgWLZg==", "integrity": "sha512-2CUTmpzN/7cL1a7GjdLkDFlfH3nwMwW8a6JiaAUsL9MtKmNNO3fnXqnY0Zk30fii3hVEl4dr7ztrpYt0t2CcGQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2948,9 +2950,9 @@
} }
}, },
"node_modules/@next/swc-win32-x64-msvc": { "node_modules/@next/swc-win32-x64-msvc": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.1.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.3.tgz",
"integrity": "sha512-y+wTBxelk2xiNofmDOVU7O5WxTHcvOoL3srOM0kxTzKDjQ57kPU0tpnPJ/BWrRnsOwXEv0+3QSbGR7hY4n9LkQ==", "integrity": "sha512-i54YgUhvrUQxQD84SjAbkfWhYkOdm/DNRAVekCHLWxVg3aUbyC6NFQn9TwgCkX5QAS2pXCJo3kFboSFvrsd7dA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3106,14 +3108,14 @@
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
"node_modules/@react-aria/focus": { "node_modules/@react-aria/focus": {
"version": "3.20.5", "version": "3.21.0",
"resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.5.tgz", "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.0.tgz",
"integrity": "sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==", "integrity": "sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@react-aria/interactions": "^3.25.3", "@react-aria/interactions": "^3.25.4",
"@react-aria/utils": "^3.29.1", "@react-aria/utils": "^3.30.0",
"@react-types/shared": "^3.30.0", "@react-types/shared": "^3.31.0",
"@swc/helpers": "^0.5.0", "@swc/helpers": "^0.5.0",
"clsx": "^2.0.0" "clsx": "^2.0.0"
}, },
@ -3123,15 +3125,15 @@
} }
}, },
"node_modules/@react-aria/interactions": { "node_modules/@react-aria/interactions": {
"version": "3.25.3", "version": "3.25.4",
"resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.3.tgz", "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.4.tgz",
"integrity": "sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==", "integrity": "sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@react-aria/ssr": "^3.9.9", "@react-aria/ssr": "^3.9.10",
"@react-aria/utils": "^3.29.1", "@react-aria/utils": "^3.30.0",
"@react-stately/flags": "^3.1.2", "@react-stately/flags": "^3.1.2",
"@react-types/shared": "^3.30.0", "@react-types/shared": "^3.31.0",
"@swc/helpers": "^0.5.0" "@swc/helpers": "^0.5.0"
}, },
"peerDependencies": { "peerDependencies": {
@ -3140,9 +3142,9 @@
} }
}, },
"node_modules/@react-aria/ssr": { "node_modules/@react-aria/ssr": {
"version": "3.9.9", "version": "3.9.10",
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.9.tgz", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz",
"integrity": "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==", "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@swc/helpers": "^0.5.0" "@swc/helpers": "^0.5.0"
@ -3155,15 +3157,15 @@
} }
}, },
"node_modules/@react-aria/utils": { "node_modules/@react-aria/utils": {
"version": "3.29.1", "version": "3.30.0",
"resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.1.tgz", "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.30.0.tgz",
"integrity": "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==", "integrity": "sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@react-aria/ssr": "^3.9.9", "@react-aria/ssr": "^3.9.10",
"@react-stately/flags": "^3.1.2", "@react-stately/flags": "^3.1.2",
"@react-stately/utils": "^3.10.7", "@react-stately/utils": "^3.10.8",
"@react-types/shared": "^3.30.0", "@react-types/shared": "^3.31.0",
"@swc/helpers": "^0.5.0", "@swc/helpers": "^0.5.0",
"clsx": "^2.0.0" "clsx": "^2.0.0"
}, },
@ -3182,9 +3184,9 @@
} }
}, },
"node_modules/@react-stately/utils": { "node_modules/@react-stately/utils": {
"version": "3.10.7", "version": "3.10.8",
"resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.7.tgz", "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz",
"integrity": "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==", "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@swc/helpers": "^0.5.0" "@swc/helpers": "^0.5.0"
@ -3194,9 +3196,9 @@
} }
}, },
"node_modules/@react-types/shared": { "node_modules/@react-types/shared": {
"version": "3.30.0", "version": "3.31.0",
"resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.30.0.tgz", "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.31.0.tgz",
"integrity": "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==", "integrity": "sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peerDependencies": { "peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
@ -3391,9 +3393,9 @@
"peer": true "peer": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.19.8", "version": "20.19.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.8.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz",
"integrity": "sha512-HzbgCY53T6bfu4tT7Aq3TvViJyHjLjPNaAS3HOuMc9pw97KHsUtXNX4L+wu59g1WnjsZSko35MbEqnO58rihhw==", "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~6.21.0"
@ -3445,6 +3447,16 @@
"@types/react": "^19.0.0" "@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": { "node_modules/@types/react-syntax-highlighter": {
"version": "15.5.13", "version": "15.5.13",
"resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz",
@ -4341,13 +4353,13 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.10.0", "version": "1.11.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
"form-data": "^4.0.0", "form-data": "^4.0.4",
"proxy-from-env": "^1.1.0" "proxy-from-env": "^1.1.0"
} }
}, },
@ -4832,25 +4844,25 @@
} }
}, },
"node_modules/cheerio": { "node_modules/cheerio": {
"version": "1.1.0", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz",
"integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cheerio-select": "^2.1.0", "cheerio-select": "^2.1.0",
"dom-serializer": "^2.0.0", "dom-serializer": "^2.0.0",
"domhandler": "^5.0.3", "domhandler": "^5.0.3",
"domutils": "^3.2.2", "domutils": "^3.2.2",
"encoding-sniffer": "^0.2.0", "encoding-sniffer": "^0.2.1",
"htmlparser2": "^10.0.0", "htmlparser2": "^10.0.0",
"parse5": "^7.3.0", "parse5": "^7.3.0",
"parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-htmlparser2-tree-adapter": "^7.1.0",
"parse5-parser-stream": "^7.1.2", "parse5-parser-stream": "^7.1.2",
"undici": "^7.10.0", "undici": "^7.12.0",
"whatwg-mimetype": "^4.0.0" "whatwg-mimetype": "^4.0.0"
}, },
"engines": { "engines": {
"node": ">=18.17" "node": ">=20.18.1"
}, },
"funding": { "funding": {
"url": "https://github.com/cheeriojs/cheerio?sponsor=1" "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
@ -5758,9 +5770,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.186", "version": "1.5.190",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.186.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz",
"integrity": "sha512-lur7L4BFklgepaJxj4DqPk7vKbTEl0pajNlg2QjE5shefmlmBLm2HvQ7PMf1R/GvlevT/581cop33/quQcfX3A==", "integrity": "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
@ -6571,6 +6583,12 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/fast-fifo": {
"version": "1.3.2", "version": "1.3.2",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
@ -6833,9 +6851,9 @@
} }
}, },
"node_modules/form-data": { "node_modules/form-data": {
"version": "4.0.3", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
@ -7255,9 +7273,9 @@
} }
}, },
"node_modules/groq-sdk/node_modules/@types/node": { "node_modules/groq-sdk/node_modules/@types/node": {
"version": "18.19.119", "version": "18.19.120",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz",
"integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
@ -7535,9 +7553,9 @@
} }
}, },
"node_modules/ibm-cloud-sdk-core": { "node_modules/ibm-cloud-sdk-core": {
"version": "5.4.0", "version": "5.4.1",
"resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.4.0.tgz", "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.4.1.tgz",
"integrity": "sha512-c4cwOuUDbMiFROYM/Ti1aC+Umi1v3TdvC2DO5zR7w44FYY/3xrs79+3DVPXt/nRhJeaMHN2L9XwlXsPSoVDHJA==", "integrity": "sha512-kGh1KlkFHFsJANWiGTJZ5PNoL4bZHAGprAa/uSFvLpJdKUEOH+xUAUYcLMTH71jtgy9Wl2ePDjaLWiWe80uGiA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -7550,7 +7568,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"extend": "3.0.2", "extend": "3.0.2",
"file-type": "16.5.4", "file-type": "16.5.4",
"form-data": "4.0.0", "form-data": "^4.0.4",
"isstream": "0.1.2", "isstream": "0.1.2",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"mime-types": "2.1.35", "mime-types": "2.1.35",
@ -7562,30 +7580,15 @@
} }
}, },
"node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": {
"version": "18.19.119", "version": "18.19.120",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz",
"integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "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": { "node_modules/ibm-cloud-sdk-core/node_modules/undici-types": {
"version": "5.26.5", "version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
@ -8280,7 +8283,6 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/js-yaml": { "node_modules/js-yaml": {
@ -8593,9 +8595,9 @@
} }
}, },
"node_modules/langsmith": { "node_modules/langsmith": {
"version": "0.3.46", "version": "0.3.48",
"resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.46.tgz", "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.48.tgz",
"integrity": "sha512-Hhi4/cMjhWIGpu0DW5eQrXBbeeKQWPYYQyJCYzhFjod+xinMry4i8QR0gxrrgjGOgfMuU6nyK79YqjGTEPVbDA==", "integrity": "sha512-oEsj0Z8S2Chgb3vJzRX2vplLu4RWR1cpraIaVwv2PsNZ57VbHgZEdXdeh5kh16iP8PAv04JkBncP+KLRoKBFEw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
@ -8806,7 +8808,6 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0" "js-tokens": "^3.0.0 || ^4.0.0"
@ -8898,9 +8899,9 @@
} }
}, },
"node_modules/markdown-to-jsx": { "node_modules/markdown-to-jsx": {
"version": "7.7.10", "version": "7.7.12",
"resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.10.tgz", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.12.tgz",
"integrity": "sha512-au62yyLyJukhC2P1TYi3uBi/RScGYai69uT72D8a048QH8rRj+yhND3C21GdZHE+6emtsf6Yqemcf//K+EIWDg==", "integrity": "sha512-Y5xNBqoaTooSLkmlg2P0fdbh53gp4MqW7zhvcweGCPUWvWI5BecWRYI8vPlzT8D7OULxsQg2qoRW9EsJlBWasQ==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 10" "node": ">= 10"
@ -9061,9 +9062,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/napi-postinstall": { "node_modules/napi-postinstall": {
"version": "0.3.0", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.0.tgz", "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz",
"integrity": "sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==", "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {
@ -9084,12 +9085,12 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/next": { "node_modules/next": {
"version": "15.4.1", "version": "15.4.3",
"resolved": "https://registry.npmjs.org/next/-/next-15.4.1.tgz", "resolved": "https://registry.npmjs.org/next/-/next-15.4.3.tgz",
"integrity": "sha512-eNKB1q8C7o9zXF8+jgJs2CzSLIU3T6bQtX6DcTnCq1sIR1CJ0GlSyRs1BubQi3/JgCnr9Vr+rS5mOMI38FFyQw==", "integrity": "sha512-uW7Qe6poVasNIE1X382nI29oxSdFJzjQzTgJFLD43MxyPfGKKxCMySllhBpvqr48f58Om+tLMivzRwBpXEytvA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@next/env": "15.4.1", "@next/env": "15.4.3",
"@swc/helpers": "0.5.15", "@swc/helpers": "0.5.15",
"caniuse-lite": "^1.0.30001579", "caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31", "postcss": "8.4.31",
@ -9102,14 +9103,14 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0" "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@next/swc-darwin-arm64": "15.4.1", "@next/swc-darwin-arm64": "15.4.3",
"@next/swc-darwin-x64": "15.4.1", "@next/swc-darwin-x64": "15.4.3",
"@next/swc-linux-arm64-gnu": "15.4.1", "@next/swc-linux-arm64-gnu": "15.4.3",
"@next/swc-linux-arm64-musl": "15.4.1", "@next/swc-linux-arm64-musl": "15.4.3",
"@next/swc-linux-x64-gnu": "15.4.1", "@next/swc-linux-x64-gnu": "15.4.3",
"@next/swc-linux-x64-musl": "15.4.1", "@next/swc-linux-x64-musl": "15.4.3",
"@next/swc-win32-arm64-msvc": "15.4.1", "@next/swc-win32-arm64-msvc": "15.4.3",
"@next/swc-win32-x64-msvc": "15.4.1", "@next/swc-win32-x64-msvc": "15.4.3",
"sharp": "^0.34.3" "sharp": "^0.34.3"
}, },
"peerDependencies": { "peerDependencies": {
@ -9619,9 +9620,9 @@
} }
}, },
"node_modules/openai/node_modules/@types/node": { "node_modules/openai/node_modules/@types/node": {
"version": "18.19.119", "version": "18.19.120",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz",
"integrity": "sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg==", "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -10295,7 +10296,6 @@
"version": "15.8.1", "version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.4.0", "loose-envify": "^1.4.0",
@ -10462,13 +10462,57 @@
"react": "^19.1.0" "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": { "node_modules/react-is": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true,
"license": "MIT" "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": { "node_modules/react-syntax-highlighter": {
"version": "15.6.1", "version": "15.6.1",
"resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
@ -10715,6 +10759,12 @@
"license": "MIT", "license": "MIT",
"peer": true "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": { "node_modules/resolve": {
"version": "1.22.10", "version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@ -12262,9 +12312,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "7.11.0", "version": "7.12.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz",
"integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", "integrity": "sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=20.18.1" "node": ">=20.18.1"
@ -12480,17 +12530,17 @@
} }
}, },
"node_modules/weaviate-client": { "node_modules/weaviate-client": {
"version": "3.6.2", "version": "3.8.0",
"resolved": "https://registry.npmjs.org/weaviate-client/-/weaviate-client-3.6.2.tgz", "resolved": "https://registry.npmjs.org/weaviate-client/-/weaviate-client-3.8.0.tgz",
"integrity": "sha512-6z+Du0Sp+nVp4Mhsn25sd+Qw6fr60vbyUS1e3gTZqtMrxLuNC1xgA0J/MHu5oHcm6moCBqT/2AQCt4ZV4fYSaw==", "integrity": "sha512-8yWNY3OIAh1H/W+414o17em/3CSDc5f4/sMjCrFksVppczHC1mB1f0fCFosg9fpQGegLT+Ll6un82sTGYxFhqw==",
"license": "BSD 3-Clause", "license": "BSD 3-Clause",
"dependencies": { "dependencies": {
"abort-controller-x": "^0.4.3", "abort-controller-x": "^0.4.3",
"graphql": "^16.10.0", "graphql": "^16.11.0",
"graphql-request": "^6.1.0", "graphql-request": "^6.1.0",
"long": "^5.2.4", "long": "^5.3.2",
"nice-grpc": "^2.1.11", "nice-grpc": "^2.1.12",
"nice-grpc-client-middleware-retry": "^3.1.10", "nice-grpc-client-middleware-retry": "^3.1.11",
"nice-grpc-common": "^2.0.2", "nice-grpc-common": "^2.0.2",
"uuid": "^9.0.1" "uuid": "^9.0.1"
}, },
@ -12998,9 +13048,9 @@
} }
}, },
"node_modules/yet-another-react-lightbox": { "node_modules/yet-another-react-lightbox": {
"version": "3.24.0", "version": "3.25.0",
"resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.24.0.tgz", "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.25.0.tgz",
"integrity": "sha512-j3YtwDT+fdBBhxbaxfthHMehXkUj388rpn7knc934H86bJJDBEL/m9WFGdKq2ivT3GaUPF+41GplKFbAv8bOmg==", "integrity": "sha512-NaCeEXCpdwoTvoOpxNK9gdW8+oHs79yVH+D2YeVQWRjH5i32e5CoXndAAFP2p8awzVYfSonherrE9JMTpfD3EA==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=14" "node": ">=14"

View file

@ -50,6 +50,7 @@
"playwright": "^1.52.0", "playwright": "^1.52.0",
"react": "^19", "react": "^19",
"react-dom": "^19", "react-dom": "^19",
"react-grid-layout": "^1.5.2",
"react-syntax-highlighter": "^15.6.1", "react-syntax-highlighter": "^15.6.1",
"react-text-to-speech": "^2.1.2", "react-text-to-speech": "^2.1.2",
"react-textarea-autosize": "^8.5.3", "react-textarea-autosize": "^8.5.3",
@ -69,6 +70,7 @@
"@types/pdf-parse": "^1.1.4", "@types/pdf-parse": "^1.1.4",
"@types/react": "^19", "@types/react": "^19",
"@types/react-dom": "^19", "@types/react-dom": "^19",
"@types/react-grid-layout": "^1.3.5",
"autoprefixer": "^10.0.1", "autoprefixer": "^10.0.1",
"drizzle-kit": "^0.30.5", "drizzle-kit": "^0.30.5",
"eslint": "^8", "eslint": "^8",

View file

@ -9,7 +9,8 @@ import {
Layers, Layers,
List, List,
} from 'lucide-react'; } from 'lucide-react';
import { useState, useEffect, useRef } from 'react'; import { useState, useEffect, useRef, useMemo } from 'react';
import { Responsive, WidthProvider } from 'react-grid-layout';
import { import {
Card, Card,
CardContent, CardContent,
@ -22,8 +23,11 @@ import WidgetConfigModal from '@/components/dashboard/WidgetConfigModal';
import WidgetDisplay from '@/components/dashboard/WidgetDisplay'; import WidgetDisplay from '@/components/dashboard/WidgetDisplay';
import { useDashboard } from '@/lib/hooks/useDashboard'; import { useDashboard } from '@/lib/hooks/useDashboard';
import { Widget, WidgetConfig } from '@/lib/types/widget'; import { Widget, WidgetConfig } from '@/lib/types/widget';
import { DASHBOARD_CONSTRAINTS } from '@/lib/constants/dashboard';
import { toast } from 'sonner'; import { toast } from 'sonner';
const ResponsiveGridLayout = WidthProvider(Responsive);
const DashboardPage = () => { const DashboardPage = () => {
const { const {
widgets, widgets,
@ -37,17 +41,21 @@ const DashboardPage = () => {
importDashboard, importDashboard,
settings, settings,
updateSettings, updateSettings,
getLayouts,
updateLayouts,
} = useDashboard(); } = useDashboard();
const [showAddModal, setShowAddModal] = useState(false); const [showAddModal, setShowAddModal] = useState(false);
const [editingWidget, setEditingWidget] = useState<Widget | null>(null); const [editingWidget, setEditingWidget] = useState<Widget | null>(null);
const hasAutoRefreshed = useRef(false); const hasAutoRefreshed = useRef(false);
// Memoize the ResponsiveGridLayout to prevent re-renders
const ResponsiveGrid = useMemo(() => ResponsiveGridLayout, []);
// Auto-refresh stale widgets when dashboard loads (only once) // Auto-refresh stale widgets when dashboard loads (only once)
useEffect(() => { useEffect(() => {
if (!isLoading && widgets.length > 0 && !hasAutoRefreshed.current) { if (!isLoading && widgets.length > 0 && !hasAutoRefreshed.current) {
hasAutoRefreshed.current = true; hasAutoRefreshed.current = true;
refreshAllWidgets(); refreshAllWidgets();
} }
}, [isLoading, widgets, refreshAllWidgets]); }, [isLoading, widgets, refreshAllWidgets]);
@ -119,6 +127,25 @@ const DashboardPage = () => {
updateSettings({ parallelLoading: !settings.parallelLoading }); 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) => (
<div key={widget.id}>
<WidgetDisplay
widget={widget}
onEdit={handleEditWidget}
onDelete={handleDeleteWidget}
onRefresh={handleRefreshWidget}
/>
</div>
));
}, [widgets]);
// Empty state component // Empty state component
const EmptyDashboard = () => ( const EmptyDashboard = () => (
<div className="col-span-2 flex justify-center items-center min-h-[400px]"> <div className="col-span-2 flex justify-center items-center min-h-[400px]">
@ -224,22 +251,23 @@ const DashboardPage = () => {
) : widgets.length === 0 ? ( ) : widgets.length === 0 ? (
<EmptyDashboard /> <EmptyDashboard />
) : ( ) : (
<div <ResponsiveGrid
className="grid gap-6 auto-rows-min" className="layout"
style={{ layouts={getLayouts()}
gridTemplateColumns: 'repeat(auto-fit, minmax(400px, 1fr))', breakpoints={DASHBOARD_CONSTRAINTS.GRID_BREAKPOINTS}
}} cols={DASHBOARD_CONSTRAINTS.GRID_COLUMNS}
rowHeight={DASHBOARD_CONSTRAINTS.GRID_ROW_HEIGHT}
margin={DASHBOARD_CONSTRAINTS.GRID_MARGIN}
containerPadding={DASHBOARD_CONSTRAINTS.GRID_CONTAINER_PADDING}
onLayoutChange={handleLayoutChange}
isDraggable={true}
isResizable={true}
compactType="vertical"
preventCollision={false}
draggableHandle=".widget-drag-handle"
> >
{widgets.map((widget) => ( {gridChildren}
<WidgetDisplay </ResponsiveGrid>
key={widget.id}
widget={widget}
onEdit={handleEditWidget}
onDelete={handleDeleteWidget}
onRefresh={handleRefreshWidget}
/>
))}
</div>
)} )}
</div> </div>

View file

@ -1,7 +1,12 @@
/* React Grid Layout styles */
@import "react-grid-layout/css/styles.css";
@import "react-resizable/css/styles.css";
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
@layer base { @layer base {
.overflow-hidden-scrollable { .overflow-hidden-scrollable {
-ms-overflow-style: none; -ms-overflow-style: none;

View file

@ -8,6 +8,7 @@ import {
AlertCircle, AlertCircle,
ChevronDown, ChevronDown,
ChevronUp, ChevronUp,
GripVertical,
} from 'lucide-react'; } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import MarkdownRenderer from '@/components/MarkdownRenderer'; import MarkdownRenderer from '@/components/MarkdownRenderer';
@ -49,14 +50,24 @@ const WidgetDisplay = ({
}; };
return ( return (
<Card className="flex flex-col h-fit"> <Card className="flex flex-col h-full w-full">
<CardHeader className="pb-3"> <CardHeader className="pb-3 flex-shrink-0">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div className="flex items-center space-x-2 flex-1 min-w-0">
{/* Drag Handle */}
<div
className="widget-drag-handle flex-shrink-0 p-1 rounded hover:bg-light-secondary dark:hover:bg-dark-secondary cursor-move transition-colors"
title="Drag to move widget"
>
<GripVertical size={16} className="text-gray-400 dark:text-gray-500" />
</div>
<CardTitle className="text-lg font-medium truncate"> <CardTitle className="text-lg font-medium truncate">
{widget.title} {widget.title}
</CardTitle> </CardTitle>
</div>
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2 flex-shrink-0">
{/* Last updated date with refresh frequency tooltip */} {/* Last updated date with refresh frequency tooltip */}
<span <span
className="text-xs text-gray-500 dark:text-gray-400" className="text-xs text-gray-500 dark:text-gray-400"
@ -81,7 +92,8 @@ const WidgetDisplay = ({
</div> </div>
</CardHeader> </CardHeader>
<CardContent className="flex-1 max-h-[50vh] overflow-y-auto"> <CardContent className="flex-1 overflow-hidden">
<div className="h-full overflow-y-auto">
{widget.isLoading ? ( {widget.isLoading ? (
<div className="flex items-center justify-center py-8 text-gray-500 dark:text-gray-400"> <div className="flex items-center justify-center py-8 text-gray-500 dark:text-gray-400">
<RefreshCw size={20} className="animate-spin mr-2" /> <RefreshCw size={20} className="animate-spin mr-2" />
@ -103,7 +115,7 @@ const WidgetDisplay = ({
</div> </div>
</div> </div>
) : widget.content ? ( ) : widget.content ? (
<div className="prose prose-sm dark:prose-invert"> <div className="prose prose-sm dark:prose-invert max-w-none">
<MarkdownRenderer content={widget.content} thinkOverlay={true} /> <MarkdownRenderer content={widget.content} thinkOverlay={true} />
</div> </div>
) : ( ) : (
@ -114,10 +126,11 @@ const WidgetDisplay = ({
</div> </div>
</div> </div>
)} )}
</div>
</CardContent> </CardContent>
{/* Collapsible footer with sources and actions */} {/* Collapsible footer with sources and actions */}
<div className="bg-light-secondary/30 dark:bg-dark-secondary/30"> <div className="bg-light-secondary/30 dark:bg-dark-secondary/30 flex-shrink-0">
<button <button
onClick={() => setIsFooterExpanded(!isFooterExpanded)} onClick={() => setIsFooterExpanded(!isFooterExpanded)}
className="w-full px-4 py-2 flex items-center space-x-2 text-xs text-gray-500 dark:text-gray-400 hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors" className="w-full px-4 py-2 flex items-center space-x-2 text-xs text-gray-500 dark:text-gray-400 hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors"

View file

@ -0,0 +1,44 @@
// Dashboard-wide constants and constraints
export const DASHBOARD_CONSTRAINTS = {
// Grid layout constraints
WIDGET_MIN_WIDTH: 2, // Minimum columns
WIDGET_MAX_WIDTH: 12, // Maximum columns (full width)
WIDGET_MIN_HEIGHT: 2, // Minimum rows
WIDGET_MAX_HEIGHT: 20, // Maximum rows
// Default widget sizing
DEFAULT_WIDGET_WIDTH: 6, // Half width by default
DEFAULT_WIDGET_HEIGHT: 4, // Standard height
// Grid configuration
GRID_COLUMNS: {
lg: 12,
md: 10,
sm: 6,
xs: 4,
xxs: 2,
},
GRID_BREAKPOINTS: {
lg: 1200,
md: 996,
sm: 768,
xs: 480,
xxs: 0,
},
GRID_ROW_HEIGHT: 60,
GRID_MARGIN: [16, 16] as [number, number],
GRID_CONTAINER_PADDING: [0, 0] as [number, number],
} as const;
// Responsive constraints - adjust max width based on breakpoint
export const getResponsiveConstraints = (breakpoint: keyof typeof DASHBOARD_CONSTRAINTS.GRID_COLUMNS) => {
const maxCols = DASHBOARD_CONSTRAINTS.GRID_COLUMNS[breakpoint];
return {
minW: DASHBOARD_CONSTRAINTS.WIDGET_MIN_WIDTH,
maxW: Math.min(DASHBOARD_CONSTRAINTS.WIDGET_MAX_WIDTH, maxCols),
minH: DASHBOARD_CONSTRAINTS.WIDGET_MIN_HEIGHT,
maxH: DASHBOARD_CONSTRAINTS.WIDGET_MAX_HEIGHT,
};
};

View file

@ -1,11 +1,15 @@
import { useState, useEffect, useCallback } from 'react'; import { useState, useEffect, useCallback } from 'react';
import { Widget, WidgetConfig } from '@/lib/types/widget'; import { Layout } from 'react-grid-layout';
import { Widget, WidgetConfig, WidgetLayout } from '@/lib/types/widget';
import { import {
DashboardState, DashboardState,
DashboardConfig, DashboardConfig,
DashboardLayouts,
GridLayoutItem,
DASHBOARD_STORAGE_KEYS, DASHBOARD_STORAGE_KEYS,
} from '@/lib/types/dashboard'; } from '@/lib/types/dashboard';
import { WidgetCache } from '@/lib/types/cache'; import { WidgetCache } from '@/lib/types/cache';
import { DASHBOARD_CONSTRAINTS, getResponsiveConstraints } from '@/lib/constants/dashboard';
// Helper function to request location permission and get user's location // Helper function to request location permission and get user's location
const requestLocationPermission = async (): Promise<string | undefined> => { const requestLocationPermission = async (): Promise<string | undefined> => {
@ -81,6 +85,10 @@ interface UseDashboardReturn {
refreshWidget: (id: string, forceRefresh?: boolean) => Promise<void>; refreshWidget: (id: string, forceRefresh?: boolean) => Promise<void>;
refreshAllWidgets: (forceRefresh?: boolean) => Promise<void>; refreshAllWidgets: (forceRefresh?: boolean) => Promise<void>;
// Layout management
updateLayouts: (layouts: DashboardLayouts) => void;
getLayouts: () => DashboardLayouts;
// Storage management // Storage management
exportDashboard: () => Promise<string>; exportDashboard: () => Promise<string>;
importDashboard: (configJson: string) => Promise<void>; importDashboard: (configJson: string) => Promise<void>;
@ -108,11 +116,24 @@ export const useDashboard = (): UseDashboardReturn => {
const savedWidgets = localStorage.getItem(DASHBOARD_STORAGE_KEYS.WIDGETS); const savedWidgets = localStorage.getItem(DASHBOARD_STORAGE_KEYS.WIDGETS);
const widgets: Widget[] = savedWidgets ? JSON.parse(savedWidgets) : []; const widgets: Widget[] = savedWidgets ? JSON.parse(savedWidgets) : [];
// Convert date strings back to Date objects // Convert date strings back to Date objects and ensure layout exists
widgets.forEach((widget) => { widgets.forEach((widget, index) => {
if (widget.lastUpdated) { if (widget.lastUpdated) {
widget.lastUpdated = new Date(widget.lastUpdated); widget.lastUpdated = new Date(widget.lastUpdated);
} }
// Migration: Add default layout if missing
if (!widget.layout) {
const defaultLayout: WidgetLayout = {
x: (index % 2) * 6, // Alternate between columns
y: Math.floor(index / 2) * 4, // Stack rows
w: DASHBOARD_CONSTRAINTS.DEFAULT_WIDGET_WIDTH,
h: DASHBOARD_CONSTRAINTS.DEFAULT_WIDGET_HEIGHT,
isDraggable: true,
isResizable: true,
};
widget.layout = defaultLayout;
}
}); });
// Load settings // Load settings
@ -167,6 +188,44 @@ export const useDashboard = (): UseDashboardReturn => {
}, [state.settings]); }, [state.settings]);
const addWidget = useCallback((config: WidgetConfig) => { const addWidget = useCallback((config: WidgetConfig) => {
// Find the next available position in the grid
const getNextPosition = () => {
const existingWidgets = state.widgets;
let x = 0;
let y = 0;
// Simple algorithm: try to place in first available spot
for (let row = 0; row < 20; row++) {
for (let col = 0; col < 12; col += 6) { // Start with half-width widgets
const position = { x: col, y: row };
const hasCollision = existingWidgets.some(widget =>
widget.layout.x < position.x + 6 &&
widget.layout.x + widget.layout.w > position.x &&
widget.layout.y < position.y + 3 &&
widget.layout.y + widget.layout.h > position.y
);
if (!hasCollision) {
return { x: position.x, y: position.y };
}
}
}
// Fallback: place at bottom
const maxY = Math.max(0, ...existingWidgets.map(w => w.layout.y + w.layout.h));
return { x: 0, y: maxY };
};
const position = getNextPosition();
const defaultLayout: WidgetLayout = {
x: position.x,
y: position.y,
w: DASHBOARD_CONSTRAINTS.DEFAULT_WIDGET_WIDTH,
h: DASHBOARD_CONSTRAINTS.DEFAULT_WIDGET_HEIGHT,
isDraggable: true,
isResizable: true,
};
const newWidget: Widget = { const newWidget: Widget = {
...config, ...config,
id: Date.now().toString() + Math.random().toString(36).substr(2, 9), id: Date.now().toString() + Math.random().toString(36).substr(2, 9),
@ -174,20 +233,26 @@ export const useDashboard = (): UseDashboardReturn => {
isLoading: false, isLoading: false,
content: null, content: null,
error: null, error: null,
layout: config.layout || defaultLayout,
}; };
setState((prev) => ({ setState((prev) => ({
...prev, ...prev,
widgets: [...prev.widgets, newWidget], widgets: [...prev.widgets, newWidget],
})); }));
}, []); }, [state.widgets]);
const updateWidget = useCallback((id: string, config: WidgetConfig) => { const updateWidget = useCallback((id: string, config: WidgetConfig) => {
setState((prev) => ({ setState((prev) => ({
...prev, ...prev,
widgets: prev.widgets.map((widget) => widgets: prev.widgets.map((widget) =>
widget.id === id widget.id === id
? { ...widget, ...config, id } // Preserve the ID ? {
...widget,
...config,
id, // Preserve the ID
layout: config.layout || widget.layout, // Preserve existing layout if not provided
}
: widget, : widget,
), ),
})); }));
@ -436,6 +501,63 @@ export const useDashboard = (): UseDashboardReturn => {
[], [],
); );
const getLayouts = useCallback((): DashboardLayouts => {
const createBreakpointLayout = (breakpoint: keyof typeof DASHBOARD_CONSTRAINTS.GRID_COLUMNS) => {
const constraints = getResponsiveConstraints(breakpoint);
const maxCols = DASHBOARD_CONSTRAINTS.GRID_COLUMNS[breakpoint];
return state.widgets.map(widget => ({
i: widget.id,
x: widget.layout.x,
y: widget.layout.y,
w: Math.min(widget.layout.w, maxCols), // Constrain width to available columns
h: widget.layout.h,
minW: constraints.minW,
maxW: constraints.maxW,
minH: constraints.minH,
maxH: constraints.maxH,
static: widget.layout.static,
isDraggable: widget.layout.isDraggable,
isResizable: widget.layout.isResizable,
}));
};
return {
lg: createBreakpointLayout('lg'),
md: createBreakpointLayout('md'),
sm: createBreakpointLayout('sm'),
xs: createBreakpointLayout('xs'),
xxs: createBreakpointLayout('xxs'),
};
}, [state.widgets]);
const updateLayouts = useCallback((layouts: DashboardLayouts) => {
const updatedWidgets = state.widgets.map(widget => {
// Use lg layout as the primary layout for position and size updates
const newLayout = layouts.lg.find((layout: Layout) => layout.i === widget.id);
if (newLayout) {
return {
...widget,
layout: {
x: newLayout.x,
y: newLayout.y,
w: newLayout.w,
h: newLayout.h,
static: newLayout.static || widget.layout.static,
isDraggable: newLayout.isDraggable ?? widget.layout.isDraggable,
isResizable: newLayout.isResizable ?? widget.layout.isResizable,
},
};
}
return widget;
});
setState(prev => ({
...prev,
widgets: updatedWidgets,
}));
}, [state.widgets]);
return { return {
// State // State
widgets: state.widgets, widgets: state.widgets,
@ -450,6 +572,10 @@ export const useDashboard = (): UseDashboardReturn => {
refreshWidget, refreshWidget,
refreshAllWidgets, refreshAllWidgets,
// Layout management
updateLayouts,
getLayouts,
// Storage management // Storage management
exportDashboard, exportDashboard,
importDashboard, importDashboard,

View file

@ -1,5 +1,6 @@
// Dashboard configuration and state types // Dashboard configuration and state types
import { Widget } from './widget'; import { Widget, WidgetLayout } from './widget';
import { Layout } from 'react-grid-layout';
export interface DashboardConfig { export interface DashboardConfig {
widgets: Widget[]; widgets: Widget[];
@ -19,9 +20,25 @@ export interface DashboardState {
settings: DashboardConfig['settings']; settings: DashboardConfig['settings'];
} }
// Layout item for react-grid-layout (extends WidgetLayout with required 'i' property)
export interface GridLayoutItem extends WidgetLayout {
i: string; // Widget ID
}
// Layout configuration for responsive grid (compatible with react-grid-layout)
export interface DashboardLayouts {
lg: Layout[];
md: Layout[];
sm: Layout[];
xs: Layout[];
xxs: Layout[];
[key: string]: Layout[]; // Index signature for react-grid-layout compatibility
}
// Local storage keys // Local storage keys
export const DASHBOARD_STORAGE_KEYS = { export const DASHBOARD_STORAGE_KEYS = {
WIDGETS: 'perplexica_dashboard_widgets', WIDGETS: 'perplexica_dashboard_widgets',
SETTINGS: 'perplexica_dashboard_settings', SETTINGS: 'perplexica_dashboard_settings',
CACHE: 'perplexica_dashboard_cache', CACHE: 'perplexica_dashboard_cache',
LAYOUTS: 'perplexica_dashboard_layouts',
} as const; } as const;

View file

@ -4,6 +4,17 @@ export interface Source {
type: 'Web Page' | 'HTTP Data'; type: 'Web Page' | 'HTTP Data';
} }
// Grid layout properties for widgets (only position and size data that should be persisted)
export interface WidgetLayout {
x: number;
y: number;
w: number;
h: number;
static?: boolean;
isDraggable?: boolean;
isResizable?: boolean;
}
export interface WidgetConfig { export interface WidgetConfig {
id?: string; id?: string;
title: string; title: string;
@ -14,6 +25,7 @@ export interface WidgetConfig {
refreshFrequency: number; refreshFrequency: number;
refreshUnit: 'minutes' | 'hours'; refreshUnit: 'minutes' | 'hours';
tool_names?: string[]; tool_names?: string[];
layout?: WidgetLayout;
} }
export interface Widget extends WidgetConfig { export interface Widget extends WidgetConfig {
@ -22,4 +34,5 @@ export interface Widget extends WidgetConfig {
isLoading: boolean; isLoading: boolean;
content: string | null; content: string | null;
error: string | null; error: string | null;
layout: WidgetLayout;
} }

343
yarn.lock
View file

@ -440,9 +440,9 @@
yargs "^17.7.2" yargs "^17.7.2"
"@headlessui/react@^2.2.0": "@headlessui/react@^2.2.0":
version "2.2.4" version "2.2.5"
resolved "https://registry.npmjs.org/@headlessui/react/-/react-2.2.4.tgz" resolved "https://registry.npmjs.org/@headlessui/react/-/react-2.2.5.tgz"
integrity sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA== integrity sha512-h1+2Vu1yR5pp/fBcTnwVEW8Kb94Hbxp7MXZLORfDzvSrbmGgiTyaTZ4LI/tPNZnK8eDrYD9s9cMbjm5HS5otIQ==
dependencies: dependencies:
"@floating-ui/react" "^0.26.16" "@floating-ui/react" "^0.26.16"
"@react-aria/focus" "^3.20.2" "@react-aria/focus" "^3.20.2"
@ -682,9 +682,9 @@
zod "^3.25.32" zod "^3.25.32"
"@langchain/core@^0.3.57": "@langchain/core@^0.3.57":
version "0.3.64" version "0.3.66"
resolved "https://registry.npmjs.org/@langchain/core/-/core-0.3.64.tgz" resolved "https://registry.npmjs.org/@langchain/core/-/core-0.3.66.tgz"
integrity sha512-KOHTnmycOPfuffLAm3wwv1rThQ47iG5a3HuWMt2qYhwwImFi6HLeYqKgmxVS5qcJjc6t0IPwR7jOvv9IKxfrAw== integrity sha512-d3SgSDOlgOjdIbReIXVQl9HaQzKqO/5+E+o3kJwoKXLGP9dxi7+lMyaII7yv7G8/aUxMWLwFES9zc1jFoeJEZw==
dependencies: dependencies:
"@cfworker/json-schema" "^4.0.2" "@cfworker/json-schema" "^4.0.2"
ansi-styles "^5.0.0" ansi-styles "^5.0.0"
@ -722,10 +722,10 @@
dependencies: dependencies:
uuid "^10.0.0" uuid "^10.0.0"
"@langchain/langgraph-sdk@~0.0.96": "@langchain/langgraph-sdk@~0.0.100":
version "0.0.97" version "0.0.100"
resolved "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.97.tgz" resolved "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.100.tgz"
integrity sha512-MrkCFKA/Ei/haJ1bN/lQyAjEJ1ezV9Djv2BYH2L3oqxOf3COT1LoRn3P6TD0M+j1RD5VjkowUwQ3T8Uidzq9mA== integrity sha512-mQuj0KgjD31Me+/W658OtdlOACOjgipWp/hF80OY4w4LqWCNIQWJBWMZ3f1/E8jpog/XBCROR37auFc7Fj+4Dw==
dependencies: dependencies:
"@types/json-schema" "^7.0.15" "@types/json-schema" "^7.0.15"
p-queue "^6.6.2" p-queue "^6.6.2"
@ -733,12 +733,12 @@
uuid "^9.0.0" uuid "^9.0.0"
"@langchain/langgraph@^0.3.1": "@langchain/langgraph@^0.3.1":
version "0.3.9" version "0.3.11"
resolved "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.9.tgz" resolved "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.11.tgz"
integrity sha512-eV0Qfpj45pn3A43v3JJygE1pGI8QAd+esb4iifIFWPlkjwFdVbZjqNz556Ojf2IjMLCSBpSEfZqQsRlju8fM0A== integrity sha512-Lh8oga4ismQyw1NGZKoHPdeGke1g5HMF7V0nBlc5R7GnV8tfC6pdsXjiEH6sYsHsRDInfy8uQeob/BwEmMSSbQ==
dependencies: dependencies:
"@langchain/langgraph-checkpoint" "~0.0.18" "@langchain/langgraph-checkpoint" "~0.0.18"
"@langchain/langgraph-sdk" "~0.0.96" "@langchain/langgraph-sdk" "~0.0.100"
uuid "^10.0.0" uuid "^10.0.0"
zod "^3.25.32" zod "^3.25.32"
@ -788,10 +788,10 @@
"@emnapi/runtime" "^1.4.3" "@emnapi/runtime" "^1.4.3"
"@tybys/wasm-util" "^0.10.0" "@tybys/wasm-util" "^0.10.0"
"@next/env@15.4.1": "@next/env@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.npmjs.org/@next/env/-/env-15.4.1.tgz" resolved "https://registry.npmjs.org/@next/env/-/env-15.4.3.tgz"
integrity sha512-DXQwFGAE2VH+f2TJsKepRXpODPU+scf5fDbKOME8MMyeyswe4XwgRdiiIYmBfkXU+2ssliLYznajTrOQdnLR5A== integrity sha512-lKJ9KJAvaWzqurIsz6NWdQOLj96mdhuDMusLSYHw9HBe2On7BjUwU1WeRvq19x7NrEK3iOgMeSBV5qEhVH1cMw==
"@next/eslint-plugin-next@14.1.4": "@next/eslint-plugin-next@14.1.4":
version "14.1.4" version "14.1.4"
@ -800,45 +800,45 @@
dependencies: dependencies:
glob "10.3.10" glob "10.3.10"
"@next/swc-darwin-arm64@15.4.1": "@next/swc-darwin-arm64@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.1.tgz" resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.3.tgz"
integrity sha512-L+81yMsiHq82VRXS2RVq6OgDwjvA4kDksGU8hfiDHEXP+ncKIUhUsadAVB+MRIp2FErs/5hpXR0u2eluWPAhig== integrity sha512-YAhZWKeEYY7LHQJiQ8fe3Y6ymfcDcTn7rDC8PDu/pdeIl1Z2LHD4uyPNuQUGCEQT//MSNv6oZCeQzZfTCKZv+A==
"@next/swc-darwin-x64@15.4.1": "@next/swc-darwin-x64@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.1.tgz#8eac522eca30f20dedc93c8dccfb7efd91226d16" resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.3.tgz#8d557976013aa45b8484bdaddd625aa156ccf28a"
integrity sha512-jfz1RXu6SzL14lFl05/MNkcN35lTLMJWPbqt7Xaj35+ZWAX342aePIJrN6xBdGeKl6jPXJm0Yqo3Xvh3Gpo3Uw== integrity sha512-ZPHRdd51xaxCMpT4viQ6h8TgYM1zPW1JIeksPY9wKlyvBVUQqrWqw8kEh1sa7/x0Ied+U7pYHkAkutrUwxbMcg==
"@next/swc-linux-arm64-gnu@15.4.1": "@next/swc-linux-arm64-gnu@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.1.tgz#7e62ddf0e09d4d5198562242e0def3a43b9ee333" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.3.tgz#48884ad1cde87f8918d12fe2c6646528485fea93"
integrity sha512-k0tOFn3dsnkaGfs6iQz8Ms6f1CyQe4GacXF979sL8PNQxjYS1swx9VsOyUQYaPoGV8nAZ7OX8cYaeiXGq9ahPQ== integrity sha512-QUdqftCXC5vw5cowucqi9FeOPQ0vdMxoOHLY0J5jPdercwSJFjdi9CkEO4Xkq1eG4t1TB/BG81n6rmTsWoILnw==
"@next/swc-linux-arm64-musl@15.4.1": "@next/swc-linux-arm64-musl@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.1.tgz#6ea7cf91e898e3bae079e4ccc56fc8ef69130489" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.3.tgz#d00092a1f73771295740086f1885f05253fc4d2b"
integrity sha512-4ogGQ/3qDzbbK3IwV88ltihHFbQVq6Qr+uEapzXHXBH1KsVBZOB50sn6BWHPcFjwSoMX2Tj9eH/fZvQnSIgc3g== integrity sha512-HTL31NsmoafX+r5g91Yj3+q34nrn1xKmCWVuNA+fUWO4X0pr+n83uGzLyEOn0kUqbMZ40KmWx+4wsbMoUChkiQ==
"@next/swc-linux-x64-gnu@15.4.1": "@next/swc-linux-x64-gnu@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.1.tgz#a879a19ccbb5a12f218a543adf0d9312f5ce70f9" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.3.tgz#9456bc05c8048714dcf2bea5383816599606098a"
integrity sha512-Jj0Rfw3wIgp+eahMz/tOGwlcYYEFjlBPKU7NqoOkTX0LY45i5W0WcDpgiDWSLrN8KFQq/LW7fZq46gxGCiOYlQ== integrity sha512-HRQLWoeFkKXd2YCEEy9GhfwOijRm37x4w5r0MMVHxBKSA6ms3JoPUXvGhfHT6srnGRcEUWNrQ2vzkHir5ZWTSw==
"@next/swc-linux-x64-musl@15.4.1": "@next/swc-linux-x64-musl@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.1.tgz#025a2798d0beb242d878afedfc4968f0f1a02cf1" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.3.tgz#13aed5961ce94543fe21f1c2dfefb6f0ce3a8cf9"
integrity sha512-9WlEZfnw1vFqkWsTMzZDgNL7AUI1aiBHi0S2m8jvycPyCq/fbZjtE/nDkhJRYbSjXbtRHYLDBlmP95kpjEmJbw== integrity sha512-NyXUx6G7AayaRGUsVPenuwhyAoyxjQuQPaK50AXoaAHPwRuif4WmSrXUs8/Y0HJIZh8E/YXRm9H7uuGfiacpuQ==
"@next/swc-win32-arm64-msvc@15.4.1": "@next/swc-win32-arm64-msvc@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.1.tgz#27928627e2c2d04075846c1e5a47d23760ce444e" resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.3.tgz#bc69ec012de3c2cf66fa14e234f9ae523b9a8349"
integrity sha512-WodRbZ9g6CQLRZsG3gtrA9w7Qfa9BwDzhFVdlI6sV0OCPq9JrOrJSp9/ioLsezbV8w9RCJ8v55uzJuJ5RgWLZg== integrity sha512-2CUTmpzN/7cL1a7GjdLkDFlfH3nwMwW8a6JiaAUsL9MtKmNNO3fnXqnY0Zk30fii3hVEl4dr7ztrpYt0t2CcGQ==
"@next/swc-win32-x64-msvc@15.4.1": "@next/swc-win32-x64-msvc@15.4.3":
version "15.4.1" version "15.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.1.tgz#7eb5ac6ffd8c945863f14a5d32ded6859d4ebe17" resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.3.tgz#3f3e3d1fd2a22e3efae263f9699499dc52e70612"
integrity sha512-y+wTBxelk2xiNofmDOVU7O5WxTHcvOoL3srOM0kxTzKDjQ57kPU0tpnPJ/BWrRnsOwXEv0+3QSbGR7hY4n9LkQ== integrity sha512-i54YgUhvrUQxQD84SjAbkfWhYkOdm/DNRAVekCHLWxVg3aUbyC6NFQn9TwgCkX5QAS2pXCJo3kFboSFvrsd7dA==
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
@ -930,43 +930,43 @@
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
"@react-aria/focus@^3.20.2": "@react-aria/focus@^3.20.2":
version "3.20.5" version "3.21.0"
resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.5.tgz" resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.0.tgz"
integrity sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A== integrity sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==
dependencies: dependencies:
"@react-aria/interactions" "^3.25.3" "@react-aria/interactions" "^3.25.4"
"@react-aria/utils" "^3.29.1" "@react-aria/utils" "^3.30.0"
"@react-types/shared" "^3.30.0" "@react-types/shared" "^3.31.0"
"@swc/helpers" "^0.5.0" "@swc/helpers" "^0.5.0"
clsx "^2.0.0" clsx "^2.0.0"
"@react-aria/interactions@^3.25.0", "@react-aria/interactions@^3.25.3": "@react-aria/interactions@^3.25.0", "@react-aria/interactions@^3.25.4":
version "3.25.3" version "3.25.4"
resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.3.tgz" resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.4.tgz"
integrity sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A== integrity sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==
dependencies: dependencies:
"@react-aria/ssr" "^3.9.9" "@react-aria/ssr" "^3.9.10"
"@react-aria/utils" "^3.29.1" "@react-aria/utils" "^3.30.0"
"@react-stately/flags" "^3.1.2" "@react-stately/flags" "^3.1.2"
"@react-types/shared" "^3.30.0" "@react-types/shared" "^3.31.0"
"@swc/helpers" "^0.5.0" "@swc/helpers" "^0.5.0"
"@react-aria/ssr@^3.9.9": "@react-aria/ssr@^3.9.10":
version "3.9.9" version "3.9.10"
resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.9.tgz" resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz"
integrity sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g== integrity sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==
dependencies: dependencies:
"@swc/helpers" "^0.5.0" "@swc/helpers" "^0.5.0"
"@react-aria/utils@^3.29.1": "@react-aria/utils@^3.30.0":
version "3.29.1" version "3.30.0"
resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.1.tgz" resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.30.0.tgz"
integrity sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g== integrity sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==
dependencies: dependencies:
"@react-aria/ssr" "^3.9.9" "@react-aria/ssr" "^3.9.10"
"@react-stately/flags" "^3.1.2" "@react-stately/flags" "^3.1.2"
"@react-stately/utils" "^3.10.7" "@react-stately/utils" "^3.10.8"
"@react-types/shared" "^3.30.0" "@react-types/shared" "^3.31.0"
"@swc/helpers" "^0.5.0" "@swc/helpers" "^0.5.0"
clsx "^2.0.0" clsx "^2.0.0"
@ -977,17 +977,17 @@
dependencies: dependencies:
"@swc/helpers" "^0.5.0" "@swc/helpers" "^0.5.0"
"@react-stately/utils@^3.10.7": "@react-stately/utils@^3.10.8":
version "3.10.7" version "3.10.8"
resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.7.tgz" resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz"
integrity sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ== integrity sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==
dependencies: dependencies:
"@swc/helpers" "^0.5.0" "@swc/helpers" "^0.5.0"
"@react-types/shared@^3.30.0": "@react-types/shared@^3.31.0":
version "3.30.0" version "3.31.0"
resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.30.0.tgz" resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.31.0.tgz"
integrity sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog== integrity sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==
"@rtsao/scc@^1.1.0": "@rtsao/scc@^1.1.0":
version "1.1.0" version "1.1.0"
@ -1114,16 +1114,16 @@
form-data "^4.0.0" form-data "^4.0.0"
"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20": "@types/node@*", "@types/node@>=13.7.0", "@types/node@^20":
version "20.19.8" version "20.19.9"
resolved "https://registry.npmjs.org/@types/node/-/node-20.19.8.tgz" resolved "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz"
integrity sha512-HzbgCY53T6bfu4tT7Aq3TvViJyHjLjPNaAS3HOuMc9pw97KHsUtXNX4L+wu59g1WnjsZSko35MbEqnO58rihhw== integrity sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==
dependencies: dependencies:
undici-types "~6.21.0" undici-types "~6.21.0"
"@types/node@^18.11.18": "@types/node@^18.11.18":
version "18.19.119" version "18.19.120"
resolved "https://registry.npmjs.org/@types/node/-/node-18.19.119.tgz" resolved "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz"
integrity sha512-d0F6m9itIPaKnrvEMlzE48UjwZaAnFW7Jwibacw9MNdqadjKNpUm9tfJYDwmShJmgqcoqYUX3EMKO1+RWiuuNg== integrity sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==
dependencies: dependencies:
undici-types "~5.26.4" undici-types "~5.26.4"
@ -1144,6 +1144,13 @@
resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz"
integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==
"@types/react-grid-layout@^1.3.5":
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==
dependencies:
"@types/react" "*"
"@types/react-syntax-highlighter@^15.5.13": "@types/react-syntax-highlighter@^15.5.13":
version "15.5.13" version "15.5.13"
resolved "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz" resolved "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz"
@ -1604,12 +1611,12 @@ axe-core@^4.10.0:
integrity sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg== integrity sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==
axios@^1.8.3: axios@^1.8.3:
version "1.10.0" version "1.11.0"
resolved "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz" resolved "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz"
integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==
dependencies: dependencies:
follow-redirects "^1.15.6" follow-redirects "^1.15.6"
form-data "^4.0.0" form-data "^4.0.4"
proxy-from-env "^1.1.0" proxy-from-env "^1.1.0"
axobject-query@^4.1.0: axobject-query@^4.1.0:
@ -1855,20 +1862,20 @@ cheerio-select@^2.1.0:
domutils "^3.0.1" domutils "^3.0.1"
cheerio@^1.1.0: cheerio@^1.1.0:
version "1.1.0" version "1.1.2"
resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz" resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz"
integrity sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ== integrity sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==
dependencies: dependencies:
cheerio-select "^2.1.0" cheerio-select "^2.1.0"
dom-serializer "^2.0.0" dom-serializer "^2.0.0"
domhandler "^5.0.3" domhandler "^5.0.3"
domutils "^3.2.2" domutils "^3.2.2"
encoding-sniffer "^0.2.0" encoding-sniffer "^0.2.1"
htmlparser2 "^10.0.0" htmlparser2 "^10.0.0"
parse5 "^7.3.0" parse5 "^7.3.0"
parse5-htmlparser2-tree-adapter "^7.1.0" parse5-htmlparser2-tree-adapter "^7.1.0"
parse5-parser-stream "^7.1.2" parse5-parser-stream "^7.1.2"
undici "^7.10.0" undici "^7.12.0"
whatwg-mimetype "^4.0.0" whatwg-mimetype "^4.0.0"
chokidar@^3.6.0: chokidar@^3.6.0:
@ -1905,7 +1912,7 @@ cliui@^8.0.1:
strip-ansi "^6.0.1" strip-ansi "^6.0.1"
wrap-ansi "^7.0.0" wrap-ansi "^7.0.0"
clsx@^2.0.0, clsx@^2.1.0: clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
@ -2313,9 +2320,9 @@ eastasianwidth@^0.2.0:
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
electron-to-chromium@^1.5.173: electron-to-chromium@^1.5.173:
version "1.5.186" version "1.5.190"
resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.186.tgz" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz"
integrity sha512-lur7L4BFklgepaJxj4DqPk7vKbTEl0pajNlg2QjE5shefmlmBLm2HvQ7PMf1R/GvlevT/581cop33/quQcfX3A== integrity sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==
emoji-regex@^8.0.0: emoji-regex@^8.0.0:
version "8.0.0" version "8.0.0"
@ -2332,7 +2339,7 @@ enabled@2.0.x:
resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz"
integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
encoding-sniffer@^0.2.0: encoding-sniffer@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz" resolved "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz"
integrity sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw== integrity sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==
@ -2795,6 +2802,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-equals@^4.0.3:
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==
fast-fifo@^1.2.0, fast-fifo@^1.3.2: fast-fifo@^1.2.0, fast-fifo@^1.3.2:
version "1.3.2" version "1.3.2"
resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz"
@ -2938,10 +2950,10 @@ form-data-encoder@1.7.2:
resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz" resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz"
integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
form-data@^4.0.0: form-data@^4.0.0, form-data@^4.0.4:
version "4.0.3" version "4.0.4"
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz"
integrity sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA== integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
dependencies: dependencies:
asynckit "^0.4.0" asynckit "^0.4.0"
combined-stream "^1.0.8" combined-stream "^1.0.8"
@ -3148,7 +3160,7 @@ graphql-request@^6.1.0:
"@graphql-typed-document-node/core" "^3.2.0" "@graphql-typed-document-node/core" "^3.2.0"
cross-fetch "^3.1.5" cross-fetch "^3.1.5"
graphql@^16.10.0: graphql@^16.11.0:
version "16.11.0" version "16.11.0"
resolved "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz" resolved "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz"
integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==
@ -3798,9 +3810,9 @@ kuler@^2.0.0:
zod "^3.25.32" zod "^3.25.32"
langsmith@^0.3.33, langsmith@^0.3.46: langsmith@^0.3.33, langsmith@^0.3.46:
version "0.3.46" version "0.3.48"
resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.3.46.tgz" resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.3.48.tgz"
integrity sha512-Hhi4/cMjhWIGpu0DW5eQrXBbeeKQWPYYQyJCYzhFjod+xinMry4i8QR0gxrrgjGOgfMuU6nyK79YqjGTEPVbDA== integrity sha512-oEsj0Z8S2Chgb3vJzRX2vplLu4RWR1cpraIaVwv2PsNZ57VbHgZEdXdeh5kh16iP8PAv04JkBncP+KLRoKBFEw==
dependencies: dependencies:
"@types/uuid" "^10.0.0" "@types/uuid" "^10.0.0"
chalk "^4.1.2" chalk "^4.1.2"
@ -3896,7 +3908,7 @@ long@^4.0.0:
resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
long@^5.0.0, long@^5.2.4: long@^5.0.0, long@^5.3.2:
version "5.3.2" version "5.3.2"
resolved "https://registry.npmjs.org/long/-/long-5.3.2.tgz" resolved "https://registry.npmjs.org/long/-/long-5.3.2.tgz"
integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==
@ -3957,9 +3969,9 @@ mammoth@^1.9.1:
xmlbuilder "^10.0.0" xmlbuilder "^10.0.0"
markdown-to-jsx@^7.7.2: markdown-to-jsx@^7.7.2:
version "7.7.10" version "7.7.12"
resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.10.tgz" resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.12.tgz"
integrity sha512-au62yyLyJukhC2P1TYi3uBi/RScGYai69uT72D8a048QH8rRj+yhND3C21GdZHE+6emtsf6Yqemcf//K+EIWDg== integrity sha512-Y5xNBqoaTooSLkmlg2P0fdbh53gp4MqW7zhvcweGCPUWvWI5BecWRYI8vPlzT8D7OULxsQg2qoRW9EsJlBWasQ==
math-intrinsics@^1.1.0: math-intrinsics@^1.1.0:
version "1.1.0" version "1.1.0"
@ -4062,9 +4074,9 @@ napi-build-utils@^2.0.0:
integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==
napi-postinstall@^0.3.0: napi-postinstall@^0.3.0:
version "0.3.0" version "0.3.2"
resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.0.tgz" resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz"
integrity sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA== integrity sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==
natural-compare@^1.4.0: natural-compare@^1.4.0:
version "1.4.0" version "1.4.0"
@ -4077,27 +4089,27 @@ next-themes@^0.4.6:
integrity sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA== integrity sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==
next@^15.2.2: next@^15.2.2:
version "15.4.1" version "15.4.3"
resolved "https://registry.npmjs.org/next/-/next-15.4.1.tgz" resolved "https://registry.npmjs.org/next/-/next-15.4.3.tgz"
integrity sha512-eNKB1q8C7o9zXF8+jgJs2CzSLIU3T6bQtX6DcTnCq1sIR1CJ0GlSyRs1BubQi3/JgCnr9Vr+rS5mOMI38FFyQw== integrity sha512-uW7Qe6poVasNIE1X382nI29oxSdFJzjQzTgJFLD43MxyPfGKKxCMySllhBpvqr48f58Om+tLMivzRwBpXEytvA==
dependencies: dependencies:
"@next/env" "15.4.1" "@next/env" "15.4.3"
"@swc/helpers" "0.5.15" "@swc/helpers" "0.5.15"
caniuse-lite "^1.0.30001579" caniuse-lite "^1.0.30001579"
postcss "8.4.31" postcss "8.4.31"
styled-jsx "5.1.6" styled-jsx "5.1.6"
optionalDependencies: optionalDependencies:
"@next/swc-darwin-arm64" "15.4.1" "@next/swc-darwin-arm64" "15.4.3"
"@next/swc-darwin-x64" "15.4.1" "@next/swc-darwin-x64" "15.4.3"
"@next/swc-linux-arm64-gnu" "15.4.1" "@next/swc-linux-arm64-gnu" "15.4.3"
"@next/swc-linux-arm64-musl" "15.4.1" "@next/swc-linux-arm64-musl" "15.4.3"
"@next/swc-linux-x64-gnu" "15.4.1" "@next/swc-linux-x64-gnu" "15.4.3"
"@next/swc-linux-x64-musl" "15.4.1" "@next/swc-linux-x64-musl" "15.4.3"
"@next/swc-win32-arm64-msvc" "15.4.1" "@next/swc-win32-arm64-msvc" "15.4.3"
"@next/swc-win32-x64-msvc" "15.4.1" "@next/swc-win32-x64-msvc" "15.4.3"
sharp "^0.34.3" sharp "^0.34.3"
nice-grpc-client-middleware-retry@^3.1.10: nice-grpc-client-middleware-retry@^3.1.11:
version "3.1.11" version "3.1.11"
resolved "https://registry.npmjs.org/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.11.tgz" resolved "https://registry.npmjs.org/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.11.tgz"
integrity sha512-xW/imz/kNG2g0DwTfH2eYEGrg1chSLrXtvGp9fg2qkhTgGFfAS/Pq3+t+9G8KThcC4hK/xlEyKvZWKk++33S6A== integrity sha512-xW/imz/kNG2g0DwTfH2eYEGrg1chSLrXtvGp9fg2qkhTgGFfAS/Pq3+t+9G8KThcC4hK/xlEyKvZWKk++33S6A==
@ -4112,7 +4124,7 @@ nice-grpc-common@^2.0.2:
dependencies: dependencies:
ts-error "^1.0.6" ts-error "^1.0.6"
nice-grpc@^2.1.11: nice-grpc@^2.1.12:
version "2.1.12" version "2.1.12"
resolved "https://registry.npmjs.org/nice-grpc/-/nice-grpc-2.1.12.tgz" resolved "https://registry.npmjs.org/nice-grpc/-/nice-grpc-2.1.12.tgz"
integrity sha512-J1n4Wg+D3IhRhGQb+iqh2OpiM0GzTve/kf2lnlW4S+xczmIEd0aHUDV1OsJ5a3q8GSTqJf+s4Rgg1M8uJltarw== integrity sha512-J1n4Wg+D3IhRhGQb+iqh2OpiM0GzTve/kf2lnlW4S+xczmIEd0aHUDV1OsJ5a3q8GSTqJf+s4Rgg1M8uJltarw==
@ -4301,9 +4313,9 @@ onnxruntime-web@1.14.0:
platform "^1.3.6" platform "^1.3.6"
openai@^5.3.0: openai@^5.3.0:
version "5.10.1" version "5.10.2"
resolved "https://registry.npmjs.org/openai/-/openai-5.10.1.tgz" resolved "https://registry.npmjs.org/openai/-/openai-5.10.2.tgz"
integrity sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA== integrity sha512-n+vi74LzHtvlKcDPn9aApgELGiu5CwhaLG40zxLTlFQdoSJCLACORIPC2uVQ3JEYAbqapM+XyRKFy2Thej7bIw==
openapi-types@^12.1.3: openapi-types@^12.1.3:
version "12.1.3" version "12.1.3"
@ -4645,7 +4657,7 @@ process-nextick-args@~2.0.0:
resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
prop-types@^15.8.1: prop-types@15.x, prop-types@^15.8.1:
version "15.8.1" version "15.8.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@ -4745,11 +4757,39 @@ react-dom@^19:
dependencies: dependencies:
scheduler "^0.26.0" scheduler "^0.26.0"
react-draggable@^4.0.3, react-draggable@^4.4.6:
version "4.5.0"
resolved "https://registry.npmjs.org/react-draggable/-/react-draggable-4.5.0.tgz"
integrity sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==
dependencies:
clsx "^2.1.1"
prop-types "^15.8.1"
react-grid-layout@^1.5.2:
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==
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"
react-is@^16.13.1: react-is@^16.13.1:
version "16.13.1" version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-resizable@^3.0.5:
version "3.0.5"
resolved "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz"
integrity sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==
dependencies:
prop-types "15.x"
react-draggable "^4.0.3"
react-syntax-highlighter@^15.6.1: react-syntax-highlighter@^15.6.1:
version "15.6.1" version "15.6.1"
resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz" resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz"
@ -4862,6 +4902,11 @@ require-directory@^2.1.1:
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
resolve-from@^4.0.0: resolve-from@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
@ -5719,10 +5764,10 @@ undici-types@~6.21.0:
resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz"
integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
undici@^7.10.0: undici@^7.12.0:
version "7.11.0" version "7.12.0"
resolved "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz" resolved "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz"
integrity sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg== integrity sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==
unrs-resolver@^1.6.2: unrs-resolver@^1.6.2:
version "1.11.1" version "1.11.1"
@ -5833,16 +5878,16 @@ w3c-xmlserializer@^5.0.0:
xml-name-validator "^5.0.0" xml-name-validator "^5.0.0"
weaviate-client@^3.5.2: weaviate-client@^3.5.2:
version "3.6.2" version "3.8.0"
resolved "https://registry.npmjs.org/weaviate-client/-/weaviate-client-3.6.2.tgz" resolved "https://registry.npmjs.org/weaviate-client/-/weaviate-client-3.8.0.tgz"
integrity sha512-6z+Du0Sp+nVp4Mhsn25sd+Qw6fr60vbyUS1e3gTZqtMrxLuNC1xgA0J/MHu5oHcm6moCBqT/2AQCt4ZV4fYSaw== integrity sha512-8yWNY3OIAh1H/W+414o17em/3CSDc5f4/sMjCrFksVppczHC1mB1f0fCFosg9fpQGegLT+Ll6un82sTGYxFhqw==
dependencies: dependencies:
abort-controller-x "^0.4.3" abort-controller-x "^0.4.3"
graphql "^16.10.0" graphql "^16.11.0"
graphql-request "^6.1.0" graphql-request "^6.1.0"
long "^5.2.4" long "^5.3.2"
nice-grpc "^2.1.11" nice-grpc "^2.1.12"
nice-grpc-client-middleware-retry "^3.1.10" nice-grpc-client-middleware-retry "^3.1.11"
nice-grpc-common "^2.0.2" nice-grpc-common "^2.0.2"
uuid "^9.0.1" uuid "^9.0.1"
@ -6078,9 +6123,9 @@ yargs@^17.7.2:
yargs-parser "^21.1.1" yargs-parser "^21.1.1"
yet-another-react-lightbox@^3.17.2: yet-another-react-lightbox@^3.17.2:
version "3.24.0" version "3.25.0"
resolved "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.24.0.tgz" resolved "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.25.0.tgz"
integrity sha512-j3YtwDT+fdBBhxbaxfthHMehXkUj388rpn7knc934H86bJJDBEL/m9WFGdKq2ivT3GaUPF+41GplKFbAv8bOmg== integrity sha512-NaCeEXCpdwoTvoOpxNK9gdW8+oHs79yVH+D2YeVQWRjH5i32e5CoXndAAFP2p8awzVYfSonherrE9JMTpfD3EA==
yocto-queue@^0.1.0: yocto-queue@^0.1.0:
version "0.1.0" version "0.1.0"