From c1da2de7c33dceef8287ba18c11c7132d0662d60 Mon Sep 17 00:00:00 2001 From: Gowri-Arun <208835626+Gowri-Arun@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:29:42 +0530 Subject: [PATCH 1/4] feat: integrate KG+RAG backend with frontend chat threads and CI --- .github/workflows/frontend-ci.yml | 30 + package-lock.json | 690 ++++++++++++++++ package.json | 1 + src/chat.jsx | 1210 ++++++++++++++--------------- vite.config.js | 8 + 5 files changed, 1322 insertions(+), 617 deletions(-) create mode 100644 .github/workflows/frontend-ci.yml diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml new file mode 100644 index 0000000..eb9bfa9 --- /dev/null +++ b/.github/workflows/frontend-ci.yml @@ -0,0 +1,30 @@ +name: Frontend CI + +on: + pull_request: + branches: [ main ] + push: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Use Node.js 22 + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + - name: Build + run: npm run build diff --git a/package-lock.json b/package-lock.json index 6446cf2..e52ab4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@mui/icons-material": "^7.2.0", "@mui/material": "^7.2.0", "bootstrap": "^5.3.7", + "package.json": "^2.0.1", "react": "^19.1.0", "react-dom": "^19.1.0" }, @@ -1830,6 +1831,15 @@ "vite": "^4 || ^5 || ^6 || ^7.0.0-beta.0" } }, + "node_modules/abs": { + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.15.tgz", + "integrity": "sha512-bpFChpVyZ2F2ppgx7qjZ5TTEO6VVwBauUZDZibpclRGhfcXTHyj11nlqwrg5dN1knxCchssROehm76uCcCayRA==", + "license": "MIT", + "dependencies": { + "ul": "^5.0.0" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -1954,6 +1964,18 @@ "node": ">=6" } }, + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2013,6 +2035,12 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -2038,6 +2066,18 @@ "node": ">= 6" } }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "license": "MIT", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2076,6 +2116,15 @@ } } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2083,6 +2132,15 @@ "dev": true, "license": "MIT" }, + "node_modules/deffy": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.5.tgz", + "integrity": "sha512-6TX2cfIo97eKqWmqgMDAUulCwnveAe3K+4VGsTGPJsL3NtSEnSBFZ3sUXdS4EBhZ8GbdaZBzXQ04ton18dJrug==", + "license": "MIT", + "dependencies": { + "typpy": "^2.0.0" + } + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -2093,6 +2151,24 @@ "csstype": "^3.0.2" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/err": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", + "integrity": "sha512-N97Ybd2jJHVQ+Ft3Q5+C2gM3kgygkdeQmEqbN2z15UTVyyEsIwLA1VK39O1DHEJhXbwIFcJLqm6iARNhFANcQA==", + "license": "MIT", + "dependencies": { + "typpy": "^2.2.0" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2333,6 +2409,16 @@ "node": ">=0.10.0" } }, + "node_modules/exec-limiter": { + "version": "3.2.14", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.14.tgz", + "integrity": "sha512-ZQjJmAnXD+1kQ6ejMZAS5Vxdt7LLMz0Eq7mEu6+7NhlauykuyLihhUkpp4S784QKsmJQIpuuERhQ8Tav8bF3zQ==", + "license": "MIT", + "dependencies": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2450,6 +2536,60 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.name": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.14.tgz", + "integrity": "sha512-s99L814NRuLxwF2sJMIcLhkQhueGXb3oKyvorzrUKKwlVB0SBbWrgZt4+EwKAo3ujCXnT7vshmCvXgZA09kCMw==", + "license": "MIT", + "dependencies": { + "noop6": "^1.0.1" + } + }, + "node_modules/git-package-json": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.11.tgz", + "integrity": "sha512-A/P5K2qqQ52+BwBf+qyrjtdauMlb7n1WVa++/VPDxTcgKZ2X5/Eh/EQwbxNvRKBsKAkMAeyV/UIdnb/saVFnnQ==", + "license": "MIT", + "dependencies": { + "deffy": "^2.2.1", + "err": "^1.1.1", + "gry": "^5.0.0", + "normalize-package-data": "^2.3.5", + "oargv": "^3.4.1", + "one-by-one": "^3.1.0", + "r-json": "^1.2.1", + "r-package-json": "^1.0.0", + "tmp": "0.0.28" + } + }, + "node_modules/git-source": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.11.tgz", + "integrity": "sha512-oubUf/uply9xvR5olZxxPpip19wMEpESN3bFfPcFMvl/0fwrVrcAppwOJ7Dghcguze68WAIjs/A1YrdMDIW8XA==", + "license": "MIT", + "dependencies": { + "git-url-parse": "^5.0.1" + } + }, + "node_modules/git-up": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha512-SRVN3rOLACva8imc7BFrB6ts5iISWKH1/h/1Z+JZYoUI7UVQM7gQqk4M2yxUENbq2jUUT09NEND5xwP1i7Ktlw==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "node_modules/git-url-parse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", + "integrity": "sha512-4uSiOgrryNEMBX+gTWogenYRUh2j1D+95STTSEF2RCTgLkfJikl8c7BGr0Bn274hwuxTsbS2/FQ5pVS9FoXegQ==", + "license": "MIT", + "dependencies": { + "git-up": "^1.0.0" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2476,6 +2616,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/got": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", + "integrity": "sha512-MnypzkaW8dldA8AbJFjMs7y14+ykd2V8JCLKSvX1Gmzx1alH3Y+3LArywHDoAF2wS3pnZp4gacoYtvqBeF6drQ==", + "license": "MIT", + "dependencies": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-plain-obj": "^1.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^2.0.0", + "unzip-response": "^1.0.0", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/got/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gry": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", + "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", + "license": "MIT", + "dependencies": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2513,6 +2704,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2549,6 +2746,18 @@ "node": ">=0.8.19" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2593,6 +2802,57 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2600,6 +2860,12 @@ "dev": true, "license": "ISC" }, + "node_modules/iterate-object": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.5.tgz", + "integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2682,6 +2948,15 @@ "node": ">= 0.8.0" } }, + "node_modules/limit-it": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.11.tgz", + "integrity": "sha512-VdLa1lZYZnzT98oLMeCDl6Lwd9cEYIMQlPg34qL6CYuA+yQKoG7K12tfgI5K6bRC51kRM8v1UX67IhpNsnvo3A==", + "license": "MIT", + "dependencies": { + "typpy": "^2.0.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -2723,6 +2998,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2736,6 +3020,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2768,6 +3061,52 @@ "dev": true, "license": "MIT" }, + "node_modules/node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/noop6": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.10.tgz", + "integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA==", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/oargv": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.11.tgz", + "integrity": "sha512-FGTon9C71936EnOjx/NTsMxlLeWmw8zQQld4KDmgRxRtZ8fH1XpbLLRHmOioeZs/WoURz2OGR4KmDoTaL4ErJQ==", + "license": "MIT", + "dependencies": { + "iterate-object": "^1.1.0", + "ul": "^5.0.0" + } + }, + "node_modules/obj-def": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.10.tgz", + "integrity": "sha512-RJpNUkO+1r/rXTBs82iU4scoC9Q1yp9HZbSk0ldpFe8362S6eTjUjSgTmECa1TtOBIe5pn4pwSzxIiWc8+jmWg==", + "license": "MIT", + "dependencies": { + "deffy": "^2.2.2" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2777,6 +3116,16 @@ "node": ">=0.10.0" } }, + "node_modules/one-by-one": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.9.tgz", + "integrity": "sha512-H10TAq02LKrkSRTQz1mgvcKb64rRajZ+B5HWHBvkGigYNCPqL0Q/tLIN3vfha/DqZxXeKNfyCmgfEYo2hgFQgA==", + "license": "MIT", + "dependencies": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2795,6 +3144,15 @@ "node": ">= 0.8.0" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2827,6 +3185,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha512-PRg65iXMTt/uK8Rfh5zvzkUbfAPitF17YaCY+IbHsYgksiLvtzWWTUildHth3mVaZ7871OJ7gtP4LBRBlmAdXg==", + "license": "MIT", + "dependencies": { + "got": "^5.0.0", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json-path": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.10.tgz", + "integrity": "sha512-DOlmVIfx+qDHHWaaxg573brZ8mH0Nxo4ecYA4SKkrpCOhCP64NXk7VxJtWVKZQ9urfU2Ivl74HeYUO42PLCpLw==", + "license": "MIT", + "dependencies": { + "abs": "^1.2.1" + } + }, + "node_modules/package.json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", + "integrity": "sha512-pSxZ6XR5yEawRN2ekxx9IKgPN5uNAYco7MCPxtBEWMKO3UKWa1X2CtQMzMgloeGj2g2o6cue3Sb5iPkByIJqlw==", + "deprecated": "Use pkg.json instead.", + "license": "MIT", + "dependencies": { + "git-package-json": "^1.4.0", + "git-source": "^1.1.0", + "package-json": "^2.3.1" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2857,6 +3251,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha512-1wj9nkgH/5EboDxLwaTMGJh3oH3f+Gue+aGdh631oCqoSBpokzmMmOldvOeBPtB8GJBYJbaF93KPzlkU+Y1ksg==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "node_modules/parse-url/node_modules/protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2911,6 +3321,27 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -2950,6 +3381,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -2967,6 +3413,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2977,6 +3429,49 @@ "node": ">=6" } }, + "node_modules/r-json": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.3.1.tgz", + "integrity": "sha512-5nhRFfjVMQdrwKUfUlRpDUCocdKtjSnYZ1R/86mpZDV3MfsZ3dYYNjSGuMX+mPBvFvQBhdzxSqxkuLPLv4uFGg==", + "license": "MIT", + "dependencies": { + "w-json": "1.3.10" + } + }, + "node_modules/r-package-json": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.10.tgz", + "integrity": "sha512-g+KLu+aq3tkhW6gzjsfdWAyd+ZkueLTzkX2zpB2GIW7M/lOXal3nB8U36XOrIBGogJsz2H//xWA4mj9uGlcigw==", + "license": "MIT", + "dependencies": { + "package-json-path": "^1.0.0", + "r-json": "^1.2.1" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -3020,6 +3515,56 @@ "react-dom": ">=16.6.0" } }, + "node_modules/read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "license": "MIT", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -3089,12 +3634,27 @@ "fsevents": "~2.3.2" } }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT" }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3118,6 +3678,12 @@ "node": ">=8" } }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "license": "MIT" + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3137,6 +3703,47 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "license": "CC0-1.0" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3181,6 +3788,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -3198,6 +3814,18 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3211,6 +3839,34 @@ "node": ">= 0.8.0" } }, + "node_modules/typpy": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.4.0.tgz", + "integrity": "sha512-a16Uv5doNtvHzaG4wZCHmXN+l9xxmTMpyODtPz7B3DSTsDVNXilTSJGuNw68sUh0Un4bf+ghRMbEcJCI6r06mQ==", + "license": "MIT", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/ul": { + "version": "5.2.16", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.16.tgz", + "integrity": "sha512-v1YrSEsJZpJsywzF/MKgsQwMdOwBlwwmNiUOJh/yX6FHrq7dYjeua1YOhLV0q0KioqEFZC4P7MsKmpEsGdZz3w==", + "license": "MIT", + "dependencies": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "node_modules/unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3221,6 +3877,34 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "license": "MIT", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vite": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz", @@ -3296,6 +3980,12 @@ } } }, + "node_modules/w-json": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", + "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==", + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 7d1b1f8..a715a7e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@mui/icons-material": "^7.2.0", "@mui/material": "^7.2.0", "bootstrap": "^5.3.7", + "package.json": "^2.0.1", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/src/chat.jsx b/src/chat.jsx index daf15d9..cb7ca7c 100644 --- a/src/chat.jsx +++ b/src/chat.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect, useRef } from "react"; import SpaceBackground from './components/SpaceBackground'; import './chat.css'; import AttachmentIcon from '@mui/icons-material/Attachment'; @@ -16,35 +16,39 @@ import FeedbackIcon from '@mui/icons-material/Feedback'; import SatelliteIcon from '@mui/icons-material/Satellite'; import AccountTreeIcon from '@mui/icons-material/AccountTree'; +const API_BASE = '/api'; + function PopupModal({ isOpen, onClose, title, children }) { if (!isOpen) return null; return ( -
+
- +

{title}

-
- {children} -
+
{children}
); } - function Chat({ onLogout }) { const [collapsed, setCollapsed] = useState(false); const [inputValue, setInputValue] = useState(""); @@ -52,20 +56,52 @@ function Chat({ onLogout }) { const [isFavorite, setIsFavorite] = useState(false); const [zoomLevel, setZoomLevel] = useState(1); const [selectedTime, setSelectedTime] = useState(0); + const [loading, setLoading] = useState(false); + + // user + thread state + const [userId] = useState("user_123"); + const [currentThreadId, setCurrentThreadId] = useState("default_thread"); + + // Auto-scroll ref + const chatContainerRef = useRef(null); + const [history, setHistory] = useState([ - { type: 'user', text: 'Tell me about Chandrayaan-3', timestamp: '2025-07-05T10:00:00Z' }, - { type: 'bot', text: 'Chandrayaan-3 is ISRO’s third lunar mission...', timestamp: '2025-07-05T10:01:00Z' }, - { type: 'user', text: 'What satellites are in GEO?', timestamp: '2025-07-04T15:30:00Z' } + { + type: 'user', + text: 'Tell me about Chandrayaan-3', + timestamp: '2025-07-05T10:00:00Z', + }, + { + type: 'bot', + text: "Chandrayaan-3 is ISRO's third lunar mission...", + timestamp: '2025-07-05T10:01:00Z', + }, + { + type: 'user', + text: 'What satellites are in GEO?', + timestamp: '2025-07-04T15:30:00Z', + }, ]); + const [favorites, setFavorites] = useState([ - { + { + // dummy example; real favorites will have threadId messages: [ - { type: 'user', text: 'Details on INSAT-3DR', timestamp: '2025-07-03T12:00:00Z' }, - { type: 'bot', text: 'INSAT-3DR is a weather satellite...', timestamp: '2025-07-03T12:01:00Z' } - ], - timestamp: '2025-07-03T12:02:00Z' - } + { + type: 'user', + text: 'Details on INSAT-3DR', + timestamp: '2025-07-03T12:00:00Z', + }, + { + type: 'bot', + text: 'INSAT-3DR is a weather satellite...', + timestamp: '2025-07-03T12:01:00Z', + }, + ], + timestamp: '2025-07-03T12:02:00Z', + }, ]); + const [modals, setModals] = useState({ history: false, favorites: false, @@ -74,32 +110,98 @@ function Chat({ onLogout }) { feedback: false, search: false, visualizer: false, - knowledgeGraph: false + knowledgeGraph: false, }); const satelliteImages = [ - { timestamp: '2025-07-01T08:00:00Z', url: 'https://www.isro.gov.in/media/isro/image/SatImages/IndiaFromSpace.jpg' }, - { timestamp: '2025-07-02T08:00:00Z', url: 'https://www.isro.gov.in/media/isro/image/SatImages/IndiaFromSpace2.jpg' }, - { timestamp: '2025-07-03T08:00:00Z', url: 'https://www.isro.gov.in/media/isro/image/SatImages/IndiaFromSpace3.jpg' } + { + timestamp: '2025-07-01T08:00:00Z', + url: 'https://www.isro.gov.in/media/isro/image/SatImages/IndiaFromSpace.jpg', + }, + { + timestamp: '2025-07-02T08:00:00Z', + url: 'https://www.isro.gov.in/media/isro/image/SatImages/IndiaFromSpace2.jpg', + }, + { + timestamp: '2025-07-03T08:00:00Z', + url: 'https://www.isro.gov.in/media/isro/image/SatImages/IndiaFromSpace3.jpg', + }, ]; + // Auto-scroll to bottom effect + useEffect(() => { + if (chatContainerRef.current) { + chatContainerRef.current.scrollTop = + chatContainerRef.current.scrollHeight; + } + }, [messages, loading]); + const toggleSidebar = () => setCollapsed(!collapsed); - const handleSend = () => { - if (inputValue.trim() === "") return; - const newMessage = { - type: 'user', + const handleSend = async () => { + if (inputValue.trim() === "" || loading) return; + + const userMsg = { + type: 'user', text: inputValue, - timestamp: new Date().toISOString() + timestamp: new Date().toISOString(), }; - setMessages([...messages, newMessage]); - setHistory([...history, newMessage]); + + const newMessages = [...messages, userMsg]; + setMessages(newMessages); + setHistory([...history, userMsg]); setInputValue(""); + setLoading(true); + + try { + const res = await fetch(`${API_BASE}/chat`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + user_id: userId, + thread_id: currentThreadId, + message: userMsg.text, + history: [], // backend keeps history per thread + }), + }); + + if (!res.ok) { + throw new Error("Backend error"); + } + + const data = await res.json(); // {answer, sources, mode} + + const botMsg = { + type: 'bot', + text: data.answer || "No answer returned.", + timestamp: new Date().toISOString(), + sources: data.sources || [], + mode: data.mode || 'unknown', + }; + + setMessages([...newMessages, botMsg]); + } catch (err) { + const errMsg = { + type: 'bot', + text: "Backend error. Please try again.", + timestamp: new Date().toISOString(), + }; + setMessages([...newMessages, errMsg]); + } finally { + setLoading(false); + } }; const toggleFavorite = () => { if (!isFavorite && messages.length > 0) { - setFavorites([...favorites, { messages: [...messages], timestamp: new Date().toISOString() }]); + setFavorites([ + ...favorites, + { + threadId: currentThreadId, + messages: [...messages], + timestamp: new Date().toISOString(), + }, + ]); } setIsFavorite(!isFavorite); }; @@ -111,18 +213,50 @@ function Chat({ onLogout }) { }; const toggleModal = (modalName) => { - setModals(prev => ({ ...prev, [modalName]: !prev[modalName] })); + setModals((prev) => ({ ...prev, [modalName]: !prev[modalName] })); }; const formatTimestamp = (timestamp) => { const now = new Date(); const messageDate = new Date(timestamp); - const diffDays = Math.floor((now - messageDate) / (1000 * 60 * 60 * 24)); - return diffDays === 0 ? 'Today' : `${diffDays} day${diffDays === 1 ? '' : 's'} ago`; + const diffDays = Math.floor( + (now - messageDate) / (1000 * 60 * 60 * 24) + ); + return diffDays === 0 + ? 'Today' + : `${diffDays} day${diffDays === 1 ? '' : 's'} ago`; }; const handleZoom = (direction) => { - setZoomLevel(prev => direction === 'in' ? Math.min(prev + 0.2, 3) : Math.max(prev - 0.2, 0.5)); + setZoomLevel((prev) => + direction === 'in' + ? Math.min(prev + 0.2, 3) + : Math.max(prev - 0.2, 0.5) + ); + }; + + const openThread = async (threadId) => { + setCurrentThreadId(threadId); + + try { + const res = await fetch( + `${API_BASE}/thread/${threadId}?user_id=${userId}` + ); + if (!res.ok) throw new Error("Failed to load thread"); + + const data = await res.json(); // [{role, content, timestamp}, ...] + + const restoredMessages = data.map((m) => ({ + type: m.role === "user" ? "user" : "bot", + text: m.content, + timestamp: m.timestamp, + })); + + setMessages(restoredMessages); + } catch (e) { + console.error(e); + setMessages([]); + } }; return ( @@ -135,49 +269,132 @@ function Chat({ onLogout }) {
{collapsed && ( <> - - + + )}
{!collapsed && (
- + -
Menu
- - - - - - - -
)} @@ -190,11 +407,17 @@ function Chat({ onLogout }) { className={`avatar ${collapsed ? 'no-margin' : ''}`} style={{ width: '32px', height: '32px' }} /> - {!collapsed && John Doe} + {!collapsed && ( + + John Doe + + )} {!collapsed && ( )}
@@ -204,580 +427,333 @@ function Chat({ onLogout }) {

Astra-Q πŸš€

- + -
- {messages.length === 0 ? ( -
-

Welcome to Astra-Q

-

Astra-Q : Space-Query

-

Your intelligent space mission assistant.

-

Ask me anything about satellites, missions, or ISRO data!

-
- ) : ( -
- {messages.map((msg, index) => ( -
- {msg.text} -
- {formatTimestamp(msg.timestamp)} +
+ {messages.length === 0 ? ( +
+

Welcome to Astra-Q

+

Astra-Q : Space-Query

+

Your intelligent space mission assistant.

+

+ Ask me anything about satellites, missions, or ISRO data! +

+
+ ) : ( +
+ {messages.map((msg, index) => ( +
+
{msg.text}
+ + {msg.type === 'bot' && + msg.sources && + msg.sources.length > 0 && ( +
+
+ Sources: +
+
    + {msg.sources.map((s, i) => ( +
  • + + {s.source} + + {s.page && ` (p. ${s.page})`} + {s.content_preview && ( + + {" β€” "} + {s.content_preview.slice(0, 80)} + ... + + )} +
  • + ))} +
+
+ )} + +
+ {formatTimestamp(msg.timestamp)} +
-
- ))} -
- )} -
+ ))} +
+ )} +
-
- - - setInputValue(e.target.value)} - onKeyDown={(e) => e.key === 'Enter' && handleSend()} - placeholder="Type your message..." - className="input-field" - style={{ fontSize: '14px' }} - /> - +
+ + + setInputValue(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && handleSend()} + placeholder="Type your message..." + className="input-field" + style={{ fontSize: '14px' }} + /> + +
-
- {/* Popup Modals */} - toggleModal('history')} title="Chat History"> -
- {history.length === 0 ? ( -

No chat history available.

- ) : ( - history.map((msg, index) => ( -
-
{msg.text}
-
{formatTimestamp(msg.timestamp)}
-
- )) - )} -
-
- - toggleModal('favorites')} title="Favorites"> -
- {favorites.length === 0 ? ( -

No favorite chats saved.

- ) : ( - favorites.map((chat, index) => ( -
- {chat.messages.map((msg, msgIndex) => ( -
{msg.type === 'user' ? 'You: ' : 'Bot: '}{msg.text}
- ))} -
{formatTimestamp(chat.timestamp)}
-
- )) - )} -
-
- - toggleModal('settings')} title="Settings"> -
- -
-
Account Settings
- - - - -
- -
-
Interface Preferences
- - - - -
- -
-
Notifications
- - - -
- -
-
Privacy Options
- - -
- - -
-
- - - toggleModal('help')} title="Help & Support"> -
-
-

πŸ€– How to Use AstroBot

-

- AstroBot is your guide to space exploration data. Ask specific questions like: -

    -
  • "What are the instruments on Aditya-L1?"
  • -
  • "Provide details on Mangalyaan’s orbit."
  • -
  • "List ISRO’s active Earth observation satellites."
  • -
- Follow up with related questions to explore topics in depth. Use clear, concise language for best results. -

-
-
-

πŸ“„ Supported Content

-

- AstroBot is trained on a comprehensive dataset, including: -

    -
  • ISRO mission reports (Chandrayaan, Mangalyaan, Aditya-L1)
  • -
  • Satellite specifications (INSAT, IRS, Cartosat series)
  • -
  • Publicly available space research papers and ISRO archives
  • -
  • General astronomy and astrophysics knowledge
  • -
- Note: Real-time or classified data is not supported. -

-
-
-

πŸ”§ Troubleshooting

-

- If AstroBot doesn’t respond as expected: -

    -
  • Reword queries (e.g., "What is Cartosat-3?" instead of "Tell me about that satellite.")
  • -
  • Split complex questions into simpler parts.
  • -
  • Correct typos or ambiguous terms.
  • -
  • Use the Feedback section to report issues or inaccuracies.
  • -
-

+ {/* Popup Modals */} + toggleModal('history')} + title="Chat History" + > +
+ {history.length === 0 ? ( +

No chat history available.

+ ) : ( + history.map((msg, index) => ( +
+
{msg.text}
+
+ {formatTimestamp(msg.timestamp)} +
+
+ )) + )}
-
-

πŸ“Œ Use Cases

-

- AstroBot supports various applications: -

    -
  • Research: Access mission data for scientific studies.
  • -
  • Academic: Aid students in aerospace and astronomy coursework.
  • -
  • Policy Analysis: Understand ISRO’s role in national space programs.
  • -
  • Space Enthusiasts: Explore satellite tech and mission details.
  • -
-

+ + + toggleModal('favorites')} + title="Favorites" + > +
+ {favorites.length === 0 ? ( +

No favorite chats saved.

+ ) : ( + favorites.map((chat, index) => ( +
{ + if (chat.threadId) { + openThread(chat.threadId); + toggleModal('favorites'); + } + }} + style={{ + cursor: chat.threadId ? 'pointer' : 'default', + }} + > + {chat.messages.map((msg, msgIndex) => ( +
+ {msg.type === 'user' ? 'You: ' : 'Bot: '} + {msg.text} +
+ ))} +
+ {formatTimestamp(chat.timestamp)} +
+
+ )) + )}
-
-
- - toggleModal('feedback')} title="Feedback / Report Error"> -
-
- -
- {[1, 2, 3, 4, 5].map(star => ( - - ))} + + + toggleModal('settings')} + title="Settings" + > +
+
+
+ Account Settings +
+ + + +
-
-
- - -
-
- -