From d38667adecba5a67e1fcdb7fd8439f1627e22ca7 Mon Sep 17 00:00:00 2001 From: She-ge Date: Sun, 29 Mar 2026 21:41:20 +0100 Subject: [PATCH 1/3] Prompt A/B Testing Metrics Chart --- final_tsc_output.txt | Bin 0 -> 16876 bytes package-lock.json | 752 +++++++----------- package.json | 1 + src/app/dashboard/page.tsx | 117 ++- src/components/Analytics/ABTestChart.tsx | 201 +++++ .../examples/TokenRefreshExample.tsx | 44 +- src/pages/Experiments/ExperimentDetail.tsx | 161 ++++ src/services/analytics.service.ts | 46 ++ src/services/api.ts | 2 +- src/types/index.ts | 37 + tsc_final_check.txt | Bin 0 -> 25814 bytes tsc_output.txt | Bin 14602 -> 2268 bytes tsc_output_new.txt | Bin 0 -> 26916 bytes 13 files changed, 820 insertions(+), 541 deletions(-) create mode 100644 final_tsc_output.txt create mode 100644 src/components/Analytics/ABTestChart.tsx create mode 100644 src/pages/Experiments/ExperimentDetail.tsx create mode 100644 src/services/analytics.service.ts create mode 100644 tsc_final_check.txt create mode 100644 tsc_output_new.txt diff --git a/final_tsc_output.txt b/final_tsc_output.txt new file mode 100644 index 0000000000000000000000000000000000000000..6c3393bea7d6adf3c6c49a6688af776c7889ad86 GIT binary patch literal 16876 zcmeI4c~2Wh7>DQYO8pL2R23p22uBDsG!+S{616#$kfth%Dli6|fT6Z&KyAKy+u!rP z9(HZ-+A&!lP-GeJ?(7`zea-OiKaEfivODcDQt$i58v0ZP+4>&a&7$wSSY ze&ez3pQwFGP<Ulg}v2PSRp4U?#*B&Q~8l5N4}h3^?j?0k--V#5|C5!knv zX5Fx2b+bgsUQ^OoG1DD&b7?H}qafZOChsQF?D)^nR`9+xjB+?b3@K zMhnopqOaRxx5V7dg>|#aT*pyPHDlUJBNg+KjeI-3B%K9}>w;}RoEk)o$g1}`R-HYc zTj9U-F7Uq4O3_=anQ?bC&av5YwAOt+`BN=*y;(KLcn2)itA|MfjE7Ryi0H_3d$)5e_hNXbBKr?6S(*3au8}zd98|Y)%ewM+fRIrdS`Dj; z5GSk1gBZL#QO|9y9KP|Dc4H>O^~kuR96n@1^vQ4p&%htm@W;h!W<~p1YxQ@|Y`x&x zSH_Av-vRT-Ex007o$u@#hvJjrqvem~vwqSn_+?P-P@lm(J$%hhtJuwnueFMV>nj(W z07chwla4fhQy(~JE&O7uIn`a%Xw3LrPl?##GuHL3zSH{n`so1-+5N$2jQBdoVtise zB5p?5)T)pYH13Jw^KDTAiP;waJ{FFU*>mCAHT16fIoGAJM=Q}r(zD;l3BF%xM2{?= zYgWeh=whoCU%gYrowhg;CushNjjKk@G(1?e2vgd6cE)bBO|_`+b`uSgJcA?r`JnbR z&dylf{N&U)6(>NOJ=3EVT{9P2H_6j{Zq*^pIh~luvhTy5JJu`UU}`gHpvU5J_gy@9 zf*j;M-%uYiPgTiHT1Sz?CTDafHy_zAGv-zcZCN*b51JeEY#W&`^r+{+;4A2c7T(aR zS$U*F#6+i`MnwzEfQ5G3;qa2LU$LBb?<`=JM!sBbqbXezYhh{qoX@T88Nnl&$yX)(o{x`H^*_kO1eH2+-}xC~1IF-Jk`W?fSV>!wk+- zcdho;tHy9uD6(u?VjR+e?rILC@$%%uYw@Fp0nhu5>20k3mvhzXwUKl8rA963)X+SN zuC(fxc)?hfBB+DML@aw9q<&uYYmduEX%)+sAt3VueLM>JXttCn<;&$~-h91LbKSlm zz}mxS>!#BV3W8?o8u6Q3%+cy-EI;`|Jmv$-pM21Dtsv^Gnh!9je?5s_*`mC%7y(~h zAGtpaOY(J=%+L3%fqU^pb%~Gf6%C@5lEqgwagfJWb zw?!&8vKfXqo$y~iB;%&tFyUV4<5Lt%L61#~^S&eXdOJ1BKU>~ib~6C-hdPf2@#$V^~m$!7V^Ip5V$Rtxo0&!2+F7hS#QZA{L# zPzwdWaYqijQG7QW8UimHDfhE?TcSebLVBfTDt*tHQ@@WVPW>*PH+^TV?Aq{C4vp}G zWnt2_W~UGP_^8qO$=bZPz6rl+mF#+oZ$8u5C#ogKmZyS=Gb@$wRL~@}Np{VwS>^nL zTG?}0Q>~f3Tb$wO-o?UR!S=lXc`M8A8&8LHx4Qj{(D;6vHBpie)o<{)FWBIQ-n%6e ztR;Nlys#7At2d{AI7Q?;%AmucK}9v*Pir~N*^R*4Rpq^CNidYXBa;=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -3067,6 +3247,12 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/decode-named-character-reference": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", @@ -3433,6 +3619,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-toolkit": { + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", + "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3463,7 +3659,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3646,7 +3841,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3857,95 +4051,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -4094,7 +4199,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, "license": "MIT" }, "node_modules/execa": { @@ -4854,6 +4958,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -5777,7 +5890,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14" }, @@ -5790,7 +5902,6 @@ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", @@ -5818,7 +5929,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -5831,7 +5941,6 @@ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, - "license": "MIT", "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", @@ -5849,7 +5958,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5862,7 +5970,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5874,15 +5981,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -5900,7 +6005,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -5916,7 +6020,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -5936,13 +6039,26 @@ "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/locate-path/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/lodash.merge": { @@ -5957,7 +6073,6 @@ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", @@ -5977,7 +6092,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5990,7 +6104,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -6002,289 +6115,7 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lint-staged": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", - "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", - "dev": true, - "dependencies": { - "chalk": "^5.4.1", - "commander": "^13.1.0", - "debug": "^4.4.0", - "execa": "^8.0.1", - "lilconfig": "^3.1.3", - "listr2": "^8.2.5", - "micromatch": "^4.0.8", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.7.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true + "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.1.0", @@ -7747,38 +7578,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -8033,7 +7832,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -8043,7 +7841,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -8056,7 +7853,6 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -8124,7 +7920,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -8143,12 +7938,51 @@ } } }, + "node_modules/recharts": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz", + "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts/node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -9130,6 +8964,12 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -9171,7 +9011,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9367,7 +9206,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9601,6 +9439,28 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9888,25 +9748,11 @@ "node": ">=8" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index e4d57dd..10c3b77 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "react-hot-toast": "^2.6.0", "react-markdown": "^10.1.0", "react-redux": "^9.2.0", + "recharts": "^3.8.1", "remark-gfm": "^4.0.1", "socket.io-client": "^4.8.3", "tailwind-merge": "^3.3.1", diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 06548de..2149058 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -376,8 +376,30 @@ export default function DashboardPage() {

Recent Chat Messages - {/* Stellar Network */} -
+

+
+ + ) : ( +
+

+ No recent activity +

+

+ Your recent interactions will appear here. +

+ +
+ )} + + + + {/* Stellar Network */} +
+

Stellar Network

@@ -473,71 +495,38 @@ export default function DashboardPage() {
- {/* Quick Actions */} -
-

- Quick Actions -

-
- {quickActions.map((action, index) => ( - -
-
-

- {action.title} -

- -
-
- {messages.slice(-5).reverse().map((message, index) => ( -
-
-
-
- - {message.type === 'user' ? 'You' : 'AI Agent'} - -
-

- {(() => { - const content = typeof message.content === 'string' - ? message.content - : (message.content as any)?.message || 'Structured data message'; - return content.length > 100 - ? content.substring(0, 100) + '...' - : content; - })()} -

-
-
- ))} + {/* Quick Actions */} +
+

+ Quick Actions +

+
+ {quickActions.map((action, index) => ( + +
+
+

+ {action.title} +

+

+ {action.description} +

+ +
-
- ) : ( -
-

- No recent activity -

-

- Your recent transactions and interactions will appear here. -

- -
- )} - + + ))} +
+ {/* Transaction History */}

diff --git a/src/components/Analytics/ABTestChart.tsx b/src/components/Analytics/ABTestChart.tsx new file mode 100644 index 0000000..8497010 --- /dev/null +++ b/src/components/Analytics/ABTestChart.tsx @@ -0,0 +1,201 @@ +'use client'; + +import React, { useState } from 'react'; +import { + BarChart, + Bar, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + Cell, + Legend +} from 'recharts'; +import { PromptComparisonData } from '@/types'; +import { Card } from '@/components/ui/Card'; +import { Button } from '@/components/ui/Button'; +import { Activity, CircleDollarSign, Target, BarChart3 } from 'lucide-react'; + +interface ABTestChartProps { + prompt1: PromptComparisonData; + prompt2: PromptComparisonData; + isLoading?: boolean; +} + +type MetricType = 'latency' | 'cost' | 'accuracy'; + +const ABTestChart: React.FC = ({ prompt1, prompt2, isLoading }) => { + const [selectedMetric, setSelectedMetric] = useState('latency'); + + if (isLoading) { + return ( + +
+

Fetching Comparison Data...

+
+ ); + } + + const metricsInfo = { + latency: { + label: 'Latency (ms)', + icon: , + description: 'Response time in milliseconds. Lower is better.', + format: (val: number) => `${val.toLocaleString()} ms`, + color1: '#3B82F6', // Blue-500 + color2: '#06B6D4', // Cyan-500 + }, + cost: { + label: 'Cost (USD)', + icon: , + description: 'Estimated cost per execution. Lower is better.', + format: (val: number) => `$${val.toFixed(4)}`, + color1: '#F59E0B', // Amber-500 + color2: '#F97316', // Orange-500 + }, + accuracy: { + label: 'Accuracy (%)', + icon: , + description: 'Success rate or quality score. Higher is better.', + format: (val: number) => `${(val * 100).toFixed(1)}%`, + color1: '#10B981', // Emerald-500 + color2: '#84CC16', // Lime-500 + } + }; + + const chartData = [ + { + name: prompt1.name, + value: prompt1.metrics[selectedMetric], + fill: metricsInfo[selectedMetric].color1, + }, + { + name: prompt2.name, + value: prompt2.metrics[selectedMetric], + fill: metricsInfo[selectedMetric].color2, + } + ]; + + const currentInfo = metricsInfo[selectedMetric]; + + return ( + +
+
+
+ +

Performance Comparison

+
+

{currentInfo.description}

+
+ +
+ {(Object.keys(metricsInfo) as MetricType[]).map((metric) => ( + + ))} +
+
+ +
+ {/* Metric Summary Cards */} +
+
+
+ {prompt1.name} +
+
+

+ {currentInfo.format(prompt1.metrics[selectedMetric])} +

+
+ +
+
+ {prompt2.name} +
+
+

+ {currentInfo.format(prompt2.metrics[selectedMetric])} +

+
+
+ + {/* Chart Visualization */} +
+
+ + Interactive Data +
+ + + + + + selectedMetric === 'cost' ? `$${val}` : val} + /> + [currentInfo.format(val), currentInfo.label]} + /> + + {chartData.map((entry, index) => ( + + ))} + + + +
+
+ + ); +}; + +export default ABTestChart; diff --git a/src/components/examples/TokenRefreshExample.tsx b/src/components/examples/TokenRefreshExample.tsx index de6cdca..2b78cc5 100644 --- a/src/components/examples/TokenRefreshExample.tsx +++ b/src/components/examples/TokenRefreshExample.tsx @@ -3,9 +3,8 @@ import React, { useState, useEffect } from 'react'; import { useTokenRefresh } from '@/hooks/useTokenRefresh'; import { useAppSelector } from '@/store'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; -import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/Button'; +import { Card } from '@/components/ui/Card'; import { RefreshCw, AlertCircle, CheckCircle } from 'lucide-react'; export function TokenRefreshExample() { @@ -39,39 +38,38 @@ export function TokenRefreshExample() { }; const getTokenStatus = () => { - if (!token) return { status: 'No Token', color: 'destructive' }; - if (isTokenExpired()) return { status: 'Expired', color: 'destructive' }; - return { status: 'Valid', color: 'default' }; + if (!token) return { status: 'No Token', color: 'text-red-500' }; + if (isTokenExpired()) return { status: 'Expired', color: 'text-red-500' }; + return { status: 'Valid', color: 'text-green-500' }; }; const tokenStatus = getTokenStatus(); return ( - - - + +
+
- JWT Token Auto-Refresh - - +

JWT Token Auto-Refresh

+
+

Demonstrates automatic JWT token refresh functionality - - - +

+ {/* Authentication Status */}
Authentication: - + {isAuthenticated ? 'Authenticated' : 'Not Authenticated'} - +
{/* Token Status */}
Token Status: - + {tokenStatus.status} - +
{/* Refresh Status */} @@ -103,7 +101,7 @@ export function TokenRefreshExample() {
Token Preview: -
+
{token.substring(0, 50)}...
@@ -124,7 +122,7 @@ export function TokenRefreshExample() {
{/* Instructions */} -
+

Manual Refresh: Forces a token refresh

Auto Refresh: Only refreshes if token is expired

• The API service automatically refreshes tokens on 401 errors

- +
); } diff --git a/src/pages/Experiments/ExperimentDetail.tsx b/src/pages/Experiments/ExperimentDetail.tsx new file mode 100644 index 0000000..2775a88 --- /dev/null +++ b/src/pages/Experiments/ExperimentDetail.tsx @@ -0,0 +1,161 @@ +import React, { useEffect, useState } from 'react'; +import { useRouter } from 'next/router'; +import { analyticsService } from '@/services/analytics.service'; +import ABTestChart from '@/components/Analytics/ABTestChart'; +import { ABTestComparisonResponse } from '@/types'; +import { Card } from '@/components/ui/Card'; +import { Button } from '@/components/ui/Button'; +import { ChevronLeft, Info, AlertCircle, RefreshCw, BarChart2 } from 'lucide-react'; +import toast from 'react-hot-toast'; + +const ExperimentDetail: React.FC = () => { + const router = useRouter(); + const { id1, id2 } = router.query; + + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const fetchData = async () => { + if (!id1 || !id2) return; + + setLoading(true); + setError(null); + try { + const response = await analyticsService.getComparisonData(id1 as string, id2 as string); + setData(response.data); + } catch (err: any) { + const errorMsg = err.message || 'Error loading comparison data'; + setError(errorMsg); + toast.error(errorMsg); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + if (router.isReady && id1 && id2) { + fetchData(); + } + }, [router.isReady, id1, id2]); + + if (!id1 || !id2) { + return ( +
+ + +

Comparison Required

+

Please provide two prompt IDs via URL parameters to compare their performance.

+ +
+
+ ); + } + + return ( +
+
+ {/* Header Navigation */} +
+
+ +
+

+ + A/B Testing Details +

+

Comparing performance trends and reliability

+
+
+ + +
+ + {error ? ( + + +

Failed to load analysis

+

{error}

+ +
+ ) : data ? ( +
+ {/* Main Chart Component */} + + + {/* Insights Section */} + {data.comparisonResult && ( + +

+ + Comparative Insights +

+ +
+
+

Overall Performance

+
+ + {data.comparisonResult.winner === 'prompt1' ? data.prompt1.name : data.comparisonResult.winner === 'prompt2' ? data.prompt2.name : 'Neutral'} + + + + Winner + +
+

Based on aggregate of all key metrics.

+
+ +
+

Confidence Level

+

{(data.comparisonResult.confidence * 100).toFixed(1)}%

+
+
+
+
+ +
+

Reliability Diff

+

= 0 ? 'text-green-400' : 'text-red-400'}`}> + {data.comparisonResult.improvements.accuracy >= 0 ? '+' : ''}{(data.comparisonResult.improvements.accuracy * 100).toFixed(1)}% +

+

Accuracy improvement shift between versions.

+
+
+ + )} +
+ ) : ( +
+
+
+
+
+
+
+ )} +
+
+ ); +}; + +export default ExperimentDetail; diff --git a/src/services/analytics.service.ts b/src/services/analytics.service.ts new file mode 100644 index 0000000..c901241 --- /dev/null +++ b/src/services/analytics.service.ts @@ -0,0 +1,46 @@ +import { apiService } from './api'; +import { ABTestComparisonResponse } from '@/types'; + +class AnalyticsService { + /** + * Fetches comparison metrics for two specific prompt IDs. + * Endpoint: GET /compare/:id1/:id2 + */ + async getComparisonData(id1: string, id2: string): Promise { + try { + const response = await apiService.request({ + method: 'GET', + url: `/compare/${id1}/${id2}`, + }); + + if (!response.success) { + throw new Error(response.message || 'Failed to fetch comparison data'); + } + + return response; + } catch (error) { + console.error('[AnalyticsService] Error fetching comparison data:', error); + throw error; + } + } + + /** + * Fetches historical performance data for a prompt. + * (Optional addition for future use) + */ + async getPromptHistory(id: string) { + try { + const response = await apiService.request({ + method: 'GET', + url: `/analytics/prompt/${id}/history`, + }); + return response.data; + } catch (error) { + console.error(`[AnalyticsService] Error fetching history for prompt ${id}:`, error); + return []; + } + } +} + +export const analyticsService = new AnalyticsService(); +export default analyticsService; diff --git a/src/services/api.ts b/src/services/api.ts index be9d2c4..d13b7d0 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -16,7 +16,7 @@ import { Conversation, LiquidityPool, LiquidityStats, - LiquidityRequest + LiquidityRequest, StellarTransaction } from '@/types'; import agentService from './agentService'; diff --git a/src/types/index.ts b/src/types/index.ts index dc895cc..d5819a2 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -431,3 +431,40 @@ export interface LiquidityRequest { sortBy?: 'liquidity' | 'volume' | 'apr'; sortOrder?: 'asc' | 'desc'; } + +// A/B Testing Types +export interface ABTestMetrics { + latency: number; + cost: number; + accuracy: number; + score?: number; +} + +export interface PromptComparisonData { + id: string; + name: string; + metrics: ABTestMetrics; + history?: { + timestamp: string; + metrics: ABTestMetrics; + }[]; +} + +export interface ABTestComparisonResponse { + success: boolean; + message?: string; + data: { + prompt1: PromptComparisonData; + prompt2: PromptComparisonData; + comparisonResult: { + winner: string | null; + confidence: number; + improvements: { + latency: number; + cost: number; + accuracy: number; + }; + }; + }; +} + diff --git a/tsc_final_check.txt b/tsc_final_check.txt new file mode 100644 index 0000000000000000000000000000000000000000..71fcbff7a6353570c6d7d193d64228dfa965af10 GIT binary patch literal 25814 zcmeHQYflqV5S`B^{)Y{Tf(cOjZqXP7Nz_PU1QWj*XbV)K)V3(Z_}A5QW_B%&Ta@M& zmmSmevCq3_X71d%ch10%??V|#OA2_O%8B&x*^>_5BN<}vQ~cVKW4XX~7w6c%4cWyx zL+sm>BOD*#*Q#D|E=y9DWogI*S(6B74e&a}JHj6xO)dj7i9r= zTSJ>~ac5q~wnq9?U3?bgnYQ^+_w}*eLfd@OKA!9tXN+V8`;M_?&tJeXw$PFHKsIiR z_g%-?7r2rr3TUeX6fNv4;Od@UbB^a(#B;T9q=#?Hg>r~wA7@8;&H;|``Pp(emL6r% z!O;juhI+R{{2uAE5+z%_jQj=e%PT0QzP5OPJMPJ$+?6{xH?($&kpD7tG)+S#9D68r z)zGG5rxZuPa1hHTnvfOb;ee>W}uchbyV| z9UXM`8Ee_L#+tX{7^ zMM_2Vr-yh|QhF7=1pUcNc*l46K2tx#p2D6p_8TkkF(0t+e8NXWuqvL{hgF@*XKc~m zwddAn%D}J;|DE1r@`RIKGXFR$YPUsv=3S#z#2(9ddqCQBg0!L5Tg|=gHq`6pe{^YR zY?^h|qHWA7Cu->MQFZuUJP4&ATVxyw2ZP0r2A2o1% z;aXh&;|3!2F<&E6FR=r$dWjy0)#3*qe#vI29C zmIC=SyD@8ptc$PM{-POQW{G)p0e4}Z`5t~f!Z!IaT`)@>6S{7kqSi}G4C&V9{3-^Z~xIPU;_A!hCeXmww+_{?KJmgjixZFvO- zPZv4rExqRn&L{Kb37)|i9ue-6+?9M7wnm)f`HG#}1MJ=8id(dm$kzSKr zZdS8IeT?FV7&pmt-2!`zoL7#|$@n{MKiRe;T+5Mn%RzuAA zkfk?0mYjv%Ym9923tO=*krh433||F$+E#Mbe7T!prN#)H%=EBQOJ@TAJ*WOQNs#%s z%9V4NS?n&EaWIyiC#yWHHRY989#%?uW|oJQl&uhCHIE+}YnC(lp|NH=UltmzW%IMT zrWYEm<@3Fu&34WqtZu71m!B3b{_853&{)}PeT+SX_omZq0w5-+sF7*k2AqO`fZXW@G$~eZCiG0EW-BNW<1{d z&}|dzo>}JjhSn`}41O%x*f~C;i>z0Ig|=i*Yc$3U^V4&Q*ZQuHc#3$rcFy&u^gL$1 zR;Gy8*3Z3gFNoNae#!qOUO)O}9Lb6?AN|+rlRe=zo{5iGGO1}Lf8B>Ylcn#e|B^A~ z$v<0ts~>-5HLjlUaz5w@FY}##{Bzmae4(s0>VE9mYJC0RwTe(rczvzcC3SCJ;^(Z_ zzJ*$&iHR{-AkI@`TsP==&q{xn^ntW J3!jf(e*z`!`-=bo literal 0 HcmV?d00001 diff --git a/tsc_output.txt b/tsc_output.txt index 8e379788eee194cf9cbb37fd59263b5d1803cb51..11626dead26c47f7673f56069da3c2085a28aeab 100644 GIT binary patch literal 2268 zcmds(Pfx-?5XIlw#P6^ts|gWWgaVp)KrhCdns}uA5sXMli$-Jo>gsQ|Xoy-4HU=e| z-R{n8xASIZ-}Ln*Rid8CiZrE_)n}G!q^@FS3F|WQNJ9;@s~NfnZOd0ffl8`tM=cq2 z2`#1@o$CyJs0yv&v?oX|-L5e^Z|M_GGV;{sOA+%^#z)@2WA34`(v;@}nZZ7La>9El zw!}#Lx@H_Y-55#wv7R|wceSYvq(8-01zV#aHf!VkA3)P24kaQ|SqnT>a<1v{1Z#pP zl+89@dj;{d$$WcXSABn~-2D(l0j(H2jPT5=(bTZPqVbn-T@|kI9n)RFN&^^j%GiU; z2E@bgjCI3&0)rYI!3$QJ@ttve7@;%j=n1^fu6I~xeA>|#aqZG0&Kzi;eTN13%_7Qf zke?eL%iT4H$YYOLQq96@y4}Lr@ZjGUw_IV5Ccy{YHFFu~eWybHz)lcsC%gcWd%1`lm zbD`YbFvfCTC-?N>MvcR&{JK1=&rVJ5VK|m}nlGE*qnp$b=Jipvh=yt!| zsE1{E{3iUnD|KPt`XZ)kZ`Iwfu0E;7dF36FUIj^ zJZxNseTcJP!^f`~ZHm^u3E+PkEyFU8h{-UH{#fIE`qxz+(iYPEuZJA*e7#q6g}gT$ zqes%$7c3of`TY^2U#}90z7Tn5B))vZ9hh;I7wD>x_d@Z_6PDrGAF;eU5Ao-hAFuKl zX^OgfXFQHLFQI(!`(=n%G2ZKHar$tVv&9S${hH5uRSTuI8Y& z-TygHZu%+*dnx+-Mogh~ek+z?MOV70v-_eeAtYZ{mXLj2HJrrs3}>{aIHRS|CO^z{ zO)(>!pa~~v0y!f{fI!dk7XU3S$D5AhO;0gnIJ_~O+!#)7404md+0YgpWd3eLTU`i2 zp{*1`5F2Yb-ZY%tV3uO!2ICSTH#Lw(CEE3azhAOV<<>#Kuy1?4O@2+2ilWex_WcA1V4p@%0nt!s zLT)rg1w?aHKvN2V2nT7{brQ;&2)fSv4V2&l#-OKg#Kv$SfDIJk-X+*T5pD#6)eyxD zr$}2)k+z&7Z8^NDIn^_5pa`1QK%ogOM@u<+N!r;Ef`%;z#SG|4Xw_R>JP56N3wjdT z!4C8!nCVg02tnfv?7|t?rH7^w#3tKC&R> zCViGbFq1Cq`8CZLbe;LDr%9)8f|)dUa9xP=SuJ z?lzper|Bp=8-r<$0RjA#0)w7C=t)q49`wx58;h^|2`XSKN?Eh%QkY)_Y`PTY@1ZR| Q@TZsopc&qvNMFg!-@Y!i+5i9m diff --git a/tsc_output_new.txt b/tsc_output_new.txt new file mode 100644 index 0000000000000000000000000000000000000000..9e88e739abcb498035fa4c19d4e945a2d6c144a9 GIT binary patch literal 26916 zcmeI5`%hcR702i2O8p-YstSqH5FUATY1+J2iMrX161Q75iYfwz(tx4ZG(m0t^|s&7 z9G}cw`(7J|%eCVm%W$7FbKZ|RGydOyyWu2khn27uj`dm5@loi6p3b-Rx2r41I^GNI za5J8N49j67+zL0s?QkvpHZ17Qi9SdAE`(Ni9oE9SzH9MbE1c>5w(cy2Mcr$KSK*I3 zTGEw$wZ5Rfj@0gg`snJjubw(OeishnTRq)f(EYrXzl0yc3$?Kj{-f_=_>%CaKv57 z&8=`JO2$iZ`H8-V;`3gVA!MZ8myAP6&4Hw0Ti>3J&cx||k1~R!bab{9|DVO@T|T~? zm)A6^`*G}5+&s%;zZ>p;rDHcu3D10ecwZN{V+Uq!?A<6)JxNYS)}-8mtqR{aB(bX% zl8OymmqcLSUPkMN6+4NR2-)jN8rxBJv1B{4Qf>8=tXVsJRR3K)x1f8-tIH^Fw?4o9 zTGzMqMed8ziycM_@OE2Yv&CkKIa>)2qgCeETRByaxs^sLRwWzNc6viP3m6{?w!Lr~ zA)-Y_y*n`K^8U;U|69)j?@t;jdW$jB?mM+}6m2pNZfm+qYC$^8f!&w!_Tjs^^Ok4IJTrx6ykF#!R4{*>) zY`&{R1R?(MHR&0<(b~x(#YW(8|g4+9InTaJGR67Qiwi99Kkd2$A0+d z=h560?Qh1r_RPmPUT|$AW5k2cfcc|7Tn^RXGdqz(@yYPfs@t+&KdBe|GN^W-&t#q+ zzUH7+9OlH=8b#vz_GeCjqMH?RQ5@BS&+@jQv9>b*(&>7|$-^Al6erWqbmVGUGBcT! zxOqp852IkBb=jfr#;~d??C&?5eAB6ly0XEJCN6)q5`0{+9OE;cn ziozc13~&A{%KWx^B^o2g2xWSTG|1HuEv9IUIPA{Yc&sdMx-3mWZ@`zwLf3TuyYN7N z-^5-$h618I4thJG51xA$-$zb5RR2AF;GoU$=Qx^Eow-J%#~*c-h|RAtu3ziBtdEVK zH-Mr1eK6_~-(Xv`PmD*zO$#lJ3MoP39xFcI5+#tBE%EPD;Ru;M6Ru4|@8~__x*U7l zCE7@Dj%zvL`;}U>$nr<^O8XXFyy?eRZxwOp7RPad=67s-ZPd)+!J;`#x%C{3-MF{Z zr@q-uG)%e%N7(gA?Wy-pTf_Wh)HoFB$rahK zQ@u$)ozHp~itp&|u0Ck5qTNKRf(i5n8FusM4%7~O1E<0}vjN?s3h02=<_8%4g75}U zbG#=kV9QKe-MesjOb+ZF_dU$d*b`3R9=rl_Wn0n8qr1H|T6`Y)3qJ$B46ew-ZR!7F z_=Bi1ic&c&i+Uq@G6~;J^U!kiQLsSQG^uxD@5v&Oq!T*LQz{}t@_o*kv z&eBAB70WjZdbKDo78&(a!I7kB-tdqrX@~+%OBhEW6=&iI;*Pwc=DgNq);SCEy?^CtP_m?4k16Xo6J@PE)b z88oii%=Jrg4fzbu%B5NSd6N_TYGO2tPs(aD<^|$%UYI;{SRX#}_;^;lgNtS=ir9G} z&C-*m!7C>seOD6ITh`CBnN~@6JzST*zMlE3mJ7IyOa?jt-sr^K0x|kObcORGEYUr=As;-k2!e<~uQM3%Bvp*N*q2*XTxT@@Yb)D3$ex1|{QEErJ z+j2tGG>^-5kUzm6u$pJD;iT%B%4x8Z=TOK$9LBs0)zsub?Cr;qLx?HBpl2YPz{{HQ ze6x!e%Oq|K!^{L=S4@)5Q%hG5-)zh@-#in?kliE}ZIWwlSJpsNSvhTKYKc#%sy=Vk zWj&m7w{peAZ06Hlb0u9oFS&HrsySrnjoHehkGJyQxzzgL|)fiUFBJ%bs2=zD(3auHzVIAJS13IL%aUPR3)EFmA~QiOXymx zD<7uotJs5S8z3E~FBOsKB&ynwU0c%%owuW;AuZ6_?>X#i;%W5jsQhmkm2(;au~izn z<~?u4?az^S;aHn1rqa5j3Ow{HwIfgB|6PrIGyJS8teIf`;88qACje(!=jpj}MpuOo zt86O61Up<%^IDw=N4}})F4`IJp6h!m#nIu#tUvYfNUFn1=0873)pY0xITJU3I{5J6hpUYxBPrirk4>Vj9w6{zx6vusv*=hXG&GtK{o| zXH|qp#OA*X;=cDyi{c9`@_2>w$*Z>3QKdvzX25Xe@tPE!7g0Y!y{K)VUvh zfJy!9S@g=*<&}8^{Pp_C<6+p4ud@;T{HK{0Pqbc^)3J;Ym0lKGS(b=MpA{5kkw8^D zwm(7rQGr7|+9K5(*<6MRCKqKg_`1EamEs zIh=ZD ztLL4@V}-r9za)!O=T7;KliA(FKi`#z8MM0dB#wbPxq|sR);lrpZo6c$DwO=Qtz_}J z*bU_+$x2pRF6@BqSItZ*l_|E{xTje&>12Ed$$gL6c~ccAMH% zrnaMeAT!$^^!GvBi;caHhwD$+W3N~XP&NMYcYRmo;k#!492(oFYEzWt!|XSB+!JhY z!{}WG6V?(R7%#lj8b#X=huycyUhynEV_e1FNr~p&SgpY?7wpFMmkC4VI~g)Ua{BP- zlG<(eS4VTS6aE(aGHQ;mpYZ*RQpL!;@`Gof%cXTKQlu!Ywsw#@1DDrVI?CmBGwu$C zJz~Y;rX+xhU#nn)N>4>4_J~h10MB#hN;0P*nN-7!+qFNZ;hQk&UXY2d)Yc&NzE^Hu zl~oTP@5U2X1!TnZ;HAViOVaoL2{{d3O B{}=!O literal 0 HcmV?d00001 From 8b932596082fee087c2d92ac8ee60e5b350cdf2d Mon Sep 17 00:00:00 2001 From: She-ge Date: Sun, 29 Mar 2026 22:16:01 +0100 Subject: [PATCH 2/3] Updated Code --- pnpm-lock.yaml | 296 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 288 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93139ba..38b6d6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,9 +53,15 @@ importers: react-redux: specifier: ^9.2.0 version: 9.2.0(@types/react@19.1.15)(react@19.1.0)(redux@5.0.1) + recharts: + specifier: ^3.8.1 + version: 3.8.1(@types/react@19.1.15)(react-dom@19.1.0(react@19.1.0))(react-is@16.13.1)(react@19.1.0)(redux@5.0.1) remark-gfm: specifier: ^4.0.1 version: 4.0.1 + socket.io-client: + specifier: ^4.8.3 + version: 4.8.3 tailwind-merge: specifier: ^3.3.1 version: 3.3.1 @@ -481,6 +487,9 @@ packages: '@rushstack/eslint-patch@1.12.0': resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -581,6 +590,33 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1009,6 +1045,50 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -1045,6 +1125,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -1101,6 +1184,13 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} @@ -1141,6 +1231,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es-toolkit@1.45.1: + resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1528,6 +1621,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2267,6 +2364,14 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + recharts@3.8.1: + resolution: {integrity: sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: @@ -2424,6 +2529,14 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.6: + resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} + engines: {node: '>=10.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2540,6 +2653,9 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -2643,6 +2759,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + victory-vendor@37.3.6: + resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -2682,6 +2801,22 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -3083,6 +3218,8 @@ snapshots: '@rushstack/eslint-patch@1.12.0': {} + '@socket.io/component-emitter@3.1.2': {} + '@standard-schema/spec@1.0.0': {} '@standard-schema/utils@0.3.0': {} @@ -3168,6 +3305,30 @@ snapshots: tslib: 2.8.1 optional: true + '@types/d3-array@3.2.2': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -3602,6 +3763,44 @@ snapshots: csstype@3.1.3: {} + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + damerau-levenshtein@1.0.8: {} data-view-buffer@1.0.2: @@ -3632,6 +3831,8 @@ snapshots: decamelize@1.2.0: {} + decimal.js-light@2.5.1: {} + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -3684,6 +3885,20 @@ snapshots: emoji-regex@9.2.2: {} + engine.io-client@6.6.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.18.3 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 @@ -3792,6 +4007,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es-toolkit@1.45.1: {} + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -3806,8 +4023,8 @@ snapshots: '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) @@ -3826,7 +4043,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -3837,22 +4054,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3863,7 +4080,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4270,6 +4487,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + internmap@2.0.3: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -5200,6 +5419,26 @@ snapshots: react@19.1.0: {} + recharts@3.8.1(@types/react@19.1.15)(react-dom@19.1.0(react@19.1.0))(react-is@16.13.1)(react@19.1.0)(redux@5.0.1): + dependencies: + '@reduxjs/toolkit': 2.9.0(react-redux@9.2.0(@types/react@19.1.15)(react@19.1.0)(redux@5.0.1))(react@19.1.0) + clsx: 2.1.1 + decimal.js-light: 2.5.1 + es-toolkit: 1.45.1 + eventemitter3: 5.0.4 + immer: 10.1.3 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-is: 16.13.1 + react-redux: 9.2.0(@types/react@19.1.15)(react@19.1.0)(redux@5.0.1) + reselect: 5.1.1 + tiny-invariant: 1.3.3 + use-sync-external-store: 1.5.0(react@19.1.0) + victory-vendor: 37.3.6 + transitivePeerDependencies: + - '@types/react' + - redux + redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 @@ -5426,6 +5665,24 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + socket.io-client@4.8.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.4 + socket.io-parser: 4.2.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.6: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + source-map-js@1.2.1: {} space-separated-tokens@2.0.2: {} @@ -5557,6 +5814,8 @@ snapshots: text-table@0.2.0: {} + tiny-invariant@1.3.3: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -5714,6 +5973,23 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + victory-vendor@37.3.6: + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -5777,6 +6053,10 @@ snapshots: wrappy@1.0.2: {} + ws@8.18.3: {} + + xmlhttprequest-ssl@2.1.2: {} + y18n@4.0.3: {} yallist@3.1.1: {} From 1d3b95c0036c3a53a7a98bf102bfb323d0d6b251 Mon Sep 17 00:00:00 2001 From: She-ge Date: Sun, 29 Mar 2026 22:35:17 +0100 Subject: [PATCH 3/3] Updated Code --- src/app/settings/page.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 6cdbd55..a0bb3f0 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -3,14 +3,11 @@ import React, { useEffect } from 'react'; import { useAppDispatch, useAppSelector } from '@/store'; import { fetchProfile } from '@/store/slices/authSlice'; -import React, { useState } from 'react'; -import axios from 'axios'; -import { useAppSelector } from '@/store'; import { ChatLayout } from '@/components/layout/ChatLayout'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; import { Input } from '@/components/ui/Input'; -import apiService from '@/services/api'; + export default function SettingsPage() { const dispatch = useAppDispatch();