pappitti commited on
Commit
4207527
·
1 Parent(s): 3d175a5

docker working

Browse files
.dockerignore ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Git files
2
+ .git
3
+ .gitignore
4
+
5
+ # Local dependencies
6
+ node_modules
7
+
8
+ # Build artifacts (these will be generated *inside* the container)
9
+ dist
10
+ .DS_Store
11
+
12
+ # IDE and temporary files
13
+ .vscode
14
+ .idea
15
+ .tmp
16
+
17
+ # Log files
18
+ *.log
19
+
20
+ # database files
21
+ *.duckdb
22
+
23
+ # data files
24
+ data/*
25
+
26
+ # environment files
27
+ .env
.gitignore CHANGED
@@ -28,7 +28,7 @@ lerna-debug.log*
28
  # database files
29
  *.duckdb
30
 
31
- # data filesd
32
  data/*
33
 
34
  # environment files
 
28
  # database files
29
  *.duckdb
30
 
31
+ # data files
32
  data/*
33
 
34
  # environment files
Dockerfile ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:22-slim
2
+
3
+ # The base image already has a 'node' user with UID 1000.
4
+ USER node
5
+
6
+ # Set environment variables for the 'node' user's home directory
7
+ ENV HOME=/home/node \
8
+ PATH=/home/node/.local/bin:$PATH
9
+
10
+ WORKDIR $HOME/app
11
+
12
+ COPY --chown=node package*.json ./
13
+
14
+ # Run npm install as the non-root 'node' user.
15
+ RUN npm install
16
+
17
+ # Copy the rest of the application code, again setting ownership.
18
+ COPY --chown=node: . .
19
+
20
+ # Run the build scripts as the 'node' user
21
+ RUN npm run build
22
+ RUN npm run db:rebuild
23
+
24
+ # Expose the port
25
+ EXPOSE 7860
26
+
27
+ # Run the final command as the 'node' user
28
+ CMD ["npm", "run", "start"]
README.md CHANGED
@@ -45,12 +45,13 @@ You need to have [Node.js](https://nodejs.org/) (which includes npm) installed o
45
  cd speechmap-judges
46
  ```
47
 
48
- 2. **Install dependencies:**
 
49
  ```sh
50
  npm install
51
  ```
52
 
53
- 3. **Fetch Data and Build the Database:**
54
  This command downloads the Parquet datasets from Hugging Face and creates a local `database.duckdb` file at the root of the project.
55
 
56
  ```sh
@@ -59,7 +60,7 @@ You need to have [Node.js](https://nodejs.org/) (which includes npm) installed o
59
  This project includes a branch running on duckdb-wasm. That branch does not require this step 3 : you can run `npm run dev` directly after `npm install` (or `npm run build` and then `npm run preview` for production). However, that branch was never merged with the main branch because database persistence is tricky with duckdb-wasm so, right now, the database must be built again each time the app is started, which is really bad UX. IndexedDB is not an option ; more work is required on that branch.
60
  _Also, duckdb-wasm in not as fast as expected for a database of this size_
61
 
62
- 4. **Run the application:**
63
  This command starts the React frontend development server.
64
 
65
  ```sh
@@ -67,6 +68,18 @@ You need to have [Node.js](https://nodejs.org/) (which includes npm) installed o
67
  ```
68
  Open [http://localhost:5173](http://localhost:5173) (or the URL provided in your terminal) to view it in your browser.
69
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  ## Acknowledgments
71
 
72
  Whether you want to promote free speech or moderation, understanding biases in LLMs—and in the case of this project, biases in LLM-judges—is critical. Against this backdrop, the Speechmap project by xlr8harder is a very important initiative.
 
45
  cd speechmap-judges
46
  ```
47
 
48
+ 2. **Vite Dev Mode**
49
+ **Install Dependencies:**
50
  ```sh
51
  npm install
52
  ```
53
 
54
+ **Fetch Data and Build the Database:**
55
  This command downloads the Parquet datasets from Hugging Face and creates a local `database.duckdb` file at the root of the project.
56
 
57
  ```sh
 
60
  This project includes a branch running on duckdb-wasm. That branch does not require this step 3 : you can run `npm run dev` directly after `npm install` (or `npm run build` and then `npm run preview` for production). However, that branch was never merged with the main branch because database persistence is tricky with duckdb-wasm so, right now, the database must be built again each time the app is started, which is really bad UX. IndexedDB is not an option ; more work is required on that branch.
61
  _Also, duckdb-wasm in not as fast as expected for a database of this size_
62
 
63
+ **Run the application:**
64
  This command starts the React frontend development server.
65
 
66
  ```sh
 
68
  ```
69
  Open [http://localhost:5173](http://localhost:5173) (or the URL provided in your terminal) to view it in your browser.
70
 
71
+ 3. **Production Build (Docker)**
72
+ ```sh
73
+ docker build -t speechmap-judges-prod .
74
+ ```
75
+
76
+ **Run the application:**
77
+ ```sh
78
+ docker run -p 7860:7860 --rm --name speechmap-judges-container speechmap-judges-prod
79
+ ```
80
+ Open [http://localhost:7860](http://localhost:7860) to view it in your browser.
81
+
82
+
83
  ## Acknowledgments
84
 
85
  Whether you want to promote free speech or moderation, understanding biases in LLMs—and in the case of this project, biases in LLM-judges—is critical. Against this backdrop, the Speechmap project by xlr8harder is a very important initiative.
package-lock.json CHANGED
@@ -9,12 +9,14 @@
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "duckdb": "^1.3.1",
 
12
  "react": "^19.1.0",
13
  "react-dom": "^19.1.0",
14
  "react-markdown": "8.0.6"
15
  },
16
  "devDependencies": {
17
  "@eslint/js": "^9.29.0",
 
18
  "@types/node": "^24.0.7",
19
  "@types/react": "^19.1.8",
20
  "@types/react-dom": "^19.1.6",
@@ -1556,6 +1558,27 @@
1556
  "@babel/types": "^7.28.2"
1557
  }
1558
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1559
  "node_modules/@types/debug": {
1560
  "version": "4.1.12",
1561
  "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -1572,6 +1595,31 @@
1572
  "dev": true,
1573
  "license": "MIT"
1574
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1575
  "node_modules/@types/hast": {
1576
  "version": "2.3.10",
1577
  "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
@@ -1581,6 +1629,13 @@
1581
  "@types/unist": "^2"
1582
  }
1583
  },
 
 
 
 
 
 
 
1584
  "node_modules/@types/json-schema": {
1585
  "version": "7.0.15",
1586
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -1597,6 +1652,13 @@
1597
  "@types/unist": "^2"
1598
  }
1599
  },
 
 
 
 
 
 
 
1600
  "node_modules/@types/ms": {
1601
  "version": "2.1.0",
1602
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
@@ -1619,6 +1681,20 @@
1619
  "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1620
  "license": "MIT"
1621
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1622
  "node_modules/@types/react": {
1623
  "version": "19.1.9",
1624
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz",
@@ -1638,6 +1714,29 @@
1638
  "@types/react": "^19.0.0"
1639
  }
1640
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1641
  "node_modules/@types/unist": {
1642
  "version": "2.0.11",
1643
  "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
@@ -1945,6 +2044,28 @@
1945
  "node": "^18.17.0 || >=20.5.0"
1946
  }
1947
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1948
  "node_modules/acorn": {
1949
  "version": "8.15.0",
1950
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
@@ -2107,6 +2228,26 @@
2107
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2108
  "license": "MIT"
2109
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2110
  "node_modules/brace-expansion": {
2111
  "version": "1.1.12",
2112
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -2163,6 +2304,15 @@
2163
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2164
  }
2165
  },
 
 
 
 
 
 
 
 
 
2166
  "node_modules/cacache": {
2167
  "version": "16.1.3",
2168
  "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
@@ -2274,6 +2424,35 @@
2274
  "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
2275
  "license": "ISC"
2276
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2277
  "node_modules/callsites": {
2278
  "version": "3.1.0",
2279
  "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2410,6 +2589,27 @@
2410
  "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
2411
  "license": "ISC"
2412
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2413
  "node_modules/convert-source-map": {
2414
  "version": "2.0.0",
2415
  "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -2417,6 +2617,24 @@
2417
  "dev": true,
2418
  "license": "MIT"
2419
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2420
  "node_modules/create-require": {
2421
  "version": "1.1.1",
2422
  "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -2488,6 +2706,15 @@
2488
  "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
2489
  "license": "MIT"
2490
  },
 
 
 
 
 
 
 
 
 
2491
  "node_modules/dequal": {
2492
  "version": "2.0.3",
2493
  "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -2528,6 +2755,26 @@
2528
  "node-gyp": "^9.3.0"
2529
  }
2530
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2531
  "node_modules/electron-to-chromium": {
2532
  "version": "1.5.199",
2533
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.199.tgz",
@@ -2541,6 +2788,15 @@
2541
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2542
  "license": "MIT"
2543
  },
 
 
 
 
 
 
 
 
 
2544
  "node_modules/encoding": {
2545
  "version": "0.1.13",
2546
  "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
@@ -2566,6 +2822,36 @@
2566
  "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
2567
  "license": "MIT"
2568
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2569
  "node_modules/esbuild": {
2570
  "version": "0.25.8",
2571
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz",
@@ -2618,6 +2904,12 @@
2618
  "node": ">=6"
2619
  }
2620
  },
 
 
 
 
 
 
2621
  "node_modules/escape-string-regexp": {
2622
  "version": "4.0.0",
2623
  "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -2809,12 +3101,63 @@
2809
  "node": ">=0.10.0"
2810
  }
2811
  },
 
 
 
 
 
 
 
 
 
2812
  "node_modules/exponential-backoff": {
2813
  "version": "3.1.2",
2814
  "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
2815
  "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==",
2816
  "license": "Apache-2.0"
2817
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2818
  "node_modules/extend": {
2819
  "version": "3.0.2",
2820
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -2908,6 +3251,23 @@
2908
  "node": ">=8"
2909
  }
2910
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2911
  "node_modules/find-up": {
2912
  "version": "5.0.0",
2913
  "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -2946,6 +3306,24 @@
2946
  "dev": true,
2947
  "license": "ISC"
2948
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2949
  "node_modules/fs-minipass": {
2950
  "version": "2.1.0",
2951
  "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
@@ -2979,6 +3357,15 @@
2979
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2980
  }
2981
  },
 
 
 
 
 
 
 
 
 
2982
  "node_modules/gauge": {
2983
  "version": "4.0.4",
2984
  "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
@@ -3009,6 +3396,43 @@
3009
  "node": ">=6.9.0"
3010
  }
3011
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3012
  "node_modules/glob": {
3013
  "version": "7.2.3",
3014
  "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -3056,6 +3480,18 @@
3056
  "url": "https://github.com/sponsors/sindresorhus"
3057
  }
3058
  },
 
 
 
 
 
 
 
 
 
 
 
 
3059
  "node_modules/graceful-fs": {
3060
  "version": "4.2.11",
3061
  "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -3079,12 +3515,36 @@
3079
  "node": ">=8"
3080
  }
3081
  },
 
 
 
 
 
 
 
 
 
 
 
 
3082
  "node_modules/has-unicode": {
3083
  "version": "2.0.1",
3084
  "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
3085
  "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
3086
  "license": "ISC"
3087
  },
 
 
 
 
 
 
 
 
 
 
 
 
3088
  "node_modules/hast-util-whitespace": {
3089
  "version": "2.0.1",
3090
  "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz",
@@ -3101,6 +3561,31 @@
3101
  "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
3102
  "license": "BSD-2-Clause"
3103
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3104
  "node_modules/http-proxy-agent": {
3105
  "version": "5.0.0",
3106
  "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
@@ -3154,7 +3639,6 @@
3154
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
3155
  "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
3156
  "license": "MIT",
3157
- "optional": true,
3158
  "dependencies": {
3159
  "safer-buffer": ">= 2.1.2 < 3.0.0"
3160
  },
@@ -3249,6 +3733,15 @@
3249
  "node": ">= 12"
3250
  }
3251
  },
 
 
 
 
 
 
 
 
 
3252
  "node_modules/is-buffer": {
3253
  "version": "2.0.5",
3254
  "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
@@ -3332,6 +3825,12 @@
3332
  "url": "https://github.com/sponsors/sindresorhus"
3333
  }
3334
  },
 
 
 
 
 
 
3335
  "node_modules/isexe": {
3336
  "version": "2.0.0",
3337
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3556,6 +4055,15 @@
3556
  "node": ">=12"
3557
  }
3558
  },
 
 
 
 
 
 
 
 
 
3559
  "node_modules/mdast-util-definitions": {
3560
  "version": "5.1.2",
3561
  "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz",
@@ -3628,6 +4136,27 @@
3628
  "url": "https://opencollective.com/unified"
3629
  }
3630
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3631
  "node_modules/merge2": {
3632
  "version": "1.4.1",
3633
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4094,6 +4623,27 @@
4094
  "node": ">=8.6"
4095
  }
4096
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4097
  "node_modules/minimatch": {
4098
  "version": "3.1.2",
4099
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -4433,6 +4983,30 @@
4433
  "node": ">=0.10.0"
4434
  }
4435
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4436
  "node_modules/once": {
4437
  "version": "1.4.0",
4438
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -4520,6 +5094,15 @@
4520
  "node": ">=6"
4521
  }
4522
  },
 
 
 
 
 
 
 
 
 
4523
  "node_modules/path-exists": {
4524
  "version": "4.0.0",
4525
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -4549,6 +5132,16 @@
4549
  "node": ">=8"
4550
  }
4551
  },
 
 
 
 
 
 
 
 
 
 
4552
  "node_modules/picocolors": {
4553
  "version": "1.1.1",
4554
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -4654,6 +5247,19 @@
4654
  "url": "https://github.com/sponsors/wooorm"
4655
  }
4656
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
4657
  "node_modules/punycode": {
4658
  "version": "2.3.1",
4659
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -4664,6 +5270,21 @@
4664
  "node": ">=6"
4665
  }
4666
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4667
  "node_modules/queue-microtask": {
4668
  "version": "1.2.3",
4669
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -4685,6 +5306,46 @@
4685
  ],
4686
  "license": "MIT"
4687
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4688
  "node_modules/react": {
4689
  "version": "19.1.1",
4690
  "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz",
@@ -4884,6 +5545,22 @@
4884
  "fsevents": "~2.3.2"
4885
  }
4886
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4887
  "node_modules/run-parallel": {
4888
  "version": "1.2.0",
4889
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -4944,8 +5621,7 @@
4944
  "version": "2.1.2",
4945
  "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
4946
  "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
4947
- "license": "MIT",
4948
- "optional": true
4949
  },
4950
  "node_modules/scheduler": {
4951
  "version": "0.26.0",
@@ -4963,12 +5639,55 @@
4963
  "semver": "bin/semver.js"
4964
  }
4965
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4966
  "node_modules/set-blocking": {
4967
  "version": "2.0.0",
4968
  "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
4969
  "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
4970
  "license": "ISC"
4971
  },
 
 
 
 
 
 
4972
  "node_modules/shebang-command": {
4973
  "version": "2.0.0",
4974
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -4992,6 +5711,78 @@
4992
  "node": ">=8"
4993
  }
4994
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4995
  "node_modules/signal-exit": {
4996
  "version": "3.0.7",
4997
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -5086,6 +5877,15 @@
5086
  "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
5087
  }
5088
  },
 
 
 
 
 
 
 
 
 
5089
  "node_modules/string_decoder": {
5090
  "version": "1.3.0",
5091
  "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -5285,6 +6085,15 @@
5285
  "node": ">=8.0"
5286
  }
5287
  },
 
 
 
 
 
 
 
 
 
5288
  "node_modules/tr46": {
5289
  "version": "0.0.3",
5290
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -5381,6 +6190,20 @@
5381
  "node": ">= 0.8.0"
5382
  }
5383
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5384
  "node_modules/typescript": {
5385
  "version": "5.8.3",
5386
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
@@ -5547,6 +6370,15 @@
5547
  "url": "https://opencollective.com/unified"
5548
  }
5549
  },
 
 
 
 
 
 
 
 
 
5550
  "node_modules/update-browserslist-db": {
5551
  "version": "1.1.3",
5552
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
@@ -5628,6 +6460,15 @@
5628
  "dev": true,
5629
  "license": "MIT"
5630
  },
 
 
 
 
 
 
 
 
 
5631
  "node_modules/vfile": {
5632
  "version": "5.3.7",
5633
  "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
 
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "duckdb": "^1.3.1",
12
+ "express": "^5.1.0",
13
  "react": "^19.1.0",
14
  "react-dom": "^19.1.0",
15
  "react-markdown": "8.0.6"
16
  },
17
  "devDependencies": {
18
  "@eslint/js": "^9.29.0",
19
+ "@types/express": "^5.0.3",
20
  "@types/node": "^24.0.7",
21
  "@types/react": "^19.1.8",
22
  "@types/react-dom": "^19.1.6",
 
1558
  "@babel/types": "^7.28.2"
1559
  }
1560
  },
1561
+ "node_modules/@types/body-parser": {
1562
+ "version": "1.19.6",
1563
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
1564
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
1565
+ "dev": true,
1566
+ "license": "MIT",
1567
+ "dependencies": {
1568
+ "@types/connect": "*",
1569
+ "@types/node": "*"
1570
+ }
1571
+ },
1572
+ "node_modules/@types/connect": {
1573
+ "version": "3.4.38",
1574
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
1575
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
1576
+ "dev": true,
1577
+ "license": "MIT",
1578
+ "dependencies": {
1579
+ "@types/node": "*"
1580
+ }
1581
+ },
1582
  "node_modules/@types/debug": {
1583
  "version": "4.1.12",
1584
  "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
 
1595
  "dev": true,
1596
  "license": "MIT"
1597
  },
1598
+ "node_modules/@types/express": {
1599
+ "version": "5.0.3",
1600
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz",
1601
+ "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==",
1602
+ "dev": true,
1603
+ "license": "MIT",
1604
+ "dependencies": {
1605
+ "@types/body-parser": "*",
1606
+ "@types/express-serve-static-core": "^5.0.0",
1607
+ "@types/serve-static": "*"
1608
+ }
1609
+ },
1610
+ "node_modules/@types/express-serve-static-core": {
1611
+ "version": "5.0.7",
1612
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz",
1613
+ "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==",
1614
+ "dev": true,
1615
+ "license": "MIT",
1616
+ "dependencies": {
1617
+ "@types/node": "*",
1618
+ "@types/qs": "*",
1619
+ "@types/range-parser": "*",
1620
+ "@types/send": "*"
1621
+ }
1622
+ },
1623
  "node_modules/@types/hast": {
1624
  "version": "2.3.10",
1625
  "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
 
1629
  "@types/unist": "^2"
1630
  }
1631
  },
1632
+ "node_modules/@types/http-errors": {
1633
+ "version": "2.0.5",
1634
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
1635
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
1636
+ "dev": true,
1637
+ "license": "MIT"
1638
+ },
1639
  "node_modules/@types/json-schema": {
1640
  "version": "7.0.15",
1641
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
 
1652
  "@types/unist": "^2"
1653
  }
1654
  },
1655
+ "node_modules/@types/mime": {
1656
+ "version": "1.3.5",
1657
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
1658
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
1659
+ "dev": true,
1660
+ "license": "MIT"
1661
+ },
1662
  "node_modules/@types/ms": {
1663
  "version": "2.1.0",
1664
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
 
1681
  "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1682
  "license": "MIT"
1683
  },
1684
+ "node_modules/@types/qs": {
1685
+ "version": "6.14.0",
1686
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
1687
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
1688
+ "dev": true,
1689
+ "license": "MIT"
1690
+ },
1691
+ "node_modules/@types/range-parser": {
1692
+ "version": "1.2.7",
1693
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
1694
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
1695
+ "dev": true,
1696
+ "license": "MIT"
1697
+ },
1698
  "node_modules/@types/react": {
1699
  "version": "19.1.9",
1700
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz",
 
1714
  "@types/react": "^19.0.0"
1715
  }
1716
  },
1717
+ "node_modules/@types/send": {
1718
+ "version": "0.17.5",
1719
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
1720
+ "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
1721
+ "dev": true,
1722
+ "license": "MIT",
1723
+ "dependencies": {
1724
+ "@types/mime": "^1",
1725
+ "@types/node": "*"
1726
+ }
1727
+ },
1728
+ "node_modules/@types/serve-static": {
1729
+ "version": "1.15.8",
1730
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
1731
+ "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
1732
+ "dev": true,
1733
+ "license": "MIT",
1734
+ "dependencies": {
1735
+ "@types/http-errors": "*",
1736
+ "@types/node": "*",
1737
+ "@types/send": "*"
1738
+ }
1739
+ },
1740
  "node_modules/@types/unist": {
1741
  "version": "2.0.11",
1742
  "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
 
2044
  "node": "^18.17.0 || >=20.5.0"
2045
  }
2046
  },
2047
+ "node_modules/accepts": {
2048
+ "version": "2.0.0",
2049
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
2050
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
2051
+ "license": "MIT",
2052
+ "dependencies": {
2053
+ "mime-types": "^3.0.0",
2054
+ "negotiator": "^1.0.0"
2055
+ },
2056
+ "engines": {
2057
+ "node": ">= 0.6"
2058
+ }
2059
+ },
2060
+ "node_modules/accepts/node_modules/negotiator": {
2061
+ "version": "1.0.0",
2062
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
2063
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
2064
+ "license": "MIT",
2065
+ "engines": {
2066
+ "node": ">= 0.6"
2067
+ }
2068
+ },
2069
  "node_modules/acorn": {
2070
  "version": "8.15.0",
2071
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
 
2228
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2229
  "license": "MIT"
2230
  },
2231
+ "node_modules/body-parser": {
2232
+ "version": "2.2.0",
2233
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
2234
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
2235
+ "license": "MIT",
2236
+ "dependencies": {
2237
+ "bytes": "^3.1.2",
2238
+ "content-type": "^1.0.5",
2239
+ "debug": "^4.4.0",
2240
+ "http-errors": "^2.0.0",
2241
+ "iconv-lite": "^0.6.3",
2242
+ "on-finished": "^2.4.1",
2243
+ "qs": "^6.14.0",
2244
+ "raw-body": "^3.0.0",
2245
+ "type-is": "^2.0.0"
2246
+ },
2247
+ "engines": {
2248
+ "node": ">=18"
2249
+ }
2250
+ },
2251
  "node_modules/brace-expansion": {
2252
  "version": "1.1.12",
2253
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
 
2304
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2305
  }
2306
  },
2307
+ "node_modules/bytes": {
2308
+ "version": "3.1.2",
2309
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
2310
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
2311
+ "license": "MIT",
2312
+ "engines": {
2313
+ "node": ">= 0.8"
2314
+ }
2315
+ },
2316
  "node_modules/cacache": {
2317
  "version": "16.1.3",
2318
  "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
 
2424
  "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
2425
  "license": "ISC"
2426
  },
2427
+ "node_modules/call-bind-apply-helpers": {
2428
+ "version": "1.0.2",
2429
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
2430
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
2431
+ "license": "MIT",
2432
+ "dependencies": {
2433
+ "es-errors": "^1.3.0",
2434
+ "function-bind": "^1.1.2"
2435
+ },
2436
+ "engines": {
2437
+ "node": ">= 0.4"
2438
+ }
2439
+ },
2440
+ "node_modules/call-bound": {
2441
+ "version": "1.0.4",
2442
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
2443
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
2444
+ "license": "MIT",
2445
+ "dependencies": {
2446
+ "call-bind-apply-helpers": "^1.0.2",
2447
+ "get-intrinsic": "^1.3.0"
2448
+ },
2449
+ "engines": {
2450
+ "node": ">= 0.4"
2451
+ },
2452
+ "funding": {
2453
+ "url": "https://github.com/sponsors/ljharb"
2454
+ }
2455
+ },
2456
  "node_modules/callsites": {
2457
  "version": "3.1.0",
2458
  "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 
2589
  "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
2590
  "license": "ISC"
2591
  },
2592
+ "node_modules/content-disposition": {
2593
+ "version": "1.0.0",
2594
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
2595
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
2596
+ "license": "MIT",
2597
+ "dependencies": {
2598
+ "safe-buffer": "5.2.1"
2599
+ },
2600
+ "engines": {
2601
+ "node": ">= 0.6"
2602
+ }
2603
+ },
2604
+ "node_modules/content-type": {
2605
+ "version": "1.0.5",
2606
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
2607
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
2608
+ "license": "MIT",
2609
+ "engines": {
2610
+ "node": ">= 0.6"
2611
+ }
2612
+ },
2613
  "node_modules/convert-source-map": {
2614
  "version": "2.0.0",
2615
  "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
 
2617
  "dev": true,
2618
  "license": "MIT"
2619
  },
2620
+ "node_modules/cookie": {
2621
+ "version": "0.7.2",
2622
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
2623
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
2624
+ "license": "MIT",
2625
+ "engines": {
2626
+ "node": ">= 0.6"
2627
+ }
2628
+ },
2629
+ "node_modules/cookie-signature": {
2630
+ "version": "1.2.2",
2631
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
2632
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
2633
+ "license": "MIT",
2634
+ "engines": {
2635
+ "node": ">=6.6.0"
2636
+ }
2637
+ },
2638
  "node_modules/create-require": {
2639
  "version": "1.1.1",
2640
  "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
 
2706
  "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
2707
  "license": "MIT"
2708
  },
2709
+ "node_modules/depd": {
2710
+ "version": "2.0.0",
2711
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
2712
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
2713
+ "license": "MIT",
2714
+ "engines": {
2715
+ "node": ">= 0.8"
2716
+ }
2717
+ },
2718
  "node_modules/dequal": {
2719
  "version": "2.0.3",
2720
  "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
 
2755
  "node-gyp": "^9.3.0"
2756
  }
2757
  },
2758
+ "node_modules/dunder-proto": {
2759
+ "version": "1.0.1",
2760
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
2761
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
2762
+ "license": "MIT",
2763
+ "dependencies": {
2764
+ "call-bind-apply-helpers": "^1.0.1",
2765
+ "es-errors": "^1.3.0",
2766
+ "gopd": "^1.2.0"
2767
+ },
2768
+ "engines": {
2769
+ "node": ">= 0.4"
2770
+ }
2771
+ },
2772
+ "node_modules/ee-first": {
2773
+ "version": "1.1.1",
2774
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
2775
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
2776
+ "license": "MIT"
2777
+ },
2778
  "node_modules/electron-to-chromium": {
2779
  "version": "1.5.199",
2780
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.199.tgz",
 
2788
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2789
  "license": "MIT"
2790
  },
2791
+ "node_modules/encodeurl": {
2792
+ "version": "2.0.0",
2793
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
2794
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
2795
+ "license": "MIT",
2796
+ "engines": {
2797
+ "node": ">= 0.8"
2798
+ }
2799
+ },
2800
  "node_modules/encoding": {
2801
  "version": "0.1.13",
2802
  "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
 
2822
  "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
2823
  "license": "MIT"
2824
  },
2825
+ "node_modules/es-define-property": {
2826
+ "version": "1.0.1",
2827
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
2828
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
2829
+ "license": "MIT",
2830
+ "engines": {
2831
+ "node": ">= 0.4"
2832
+ }
2833
+ },
2834
+ "node_modules/es-errors": {
2835
+ "version": "1.3.0",
2836
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
2837
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
2838
+ "license": "MIT",
2839
+ "engines": {
2840
+ "node": ">= 0.4"
2841
+ }
2842
+ },
2843
+ "node_modules/es-object-atoms": {
2844
+ "version": "1.1.1",
2845
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
2846
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
2847
+ "license": "MIT",
2848
+ "dependencies": {
2849
+ "es-errors": "^1.3.0"
2850
+ },
2851
+ "engines": {
2852
+ "node": ">= 0.4"
2853
+ }
2854
+ },
2855
  "node_modules/esbuild": {
2856
  "version": "0.25.8",
2857
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz",
 
2904
  "node": ">=6"
2905
  }
2906
  },
2907
+ "node_modules/escape-html": {
2908
+ "version": "1.0.3",
2909
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
2910
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
2911
+ "license": "MIT"
2912
+ },
2913
  "node_modules/escape-string-regexp": {
2914
  "version": "4.0.0",
2915
  "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
 
3101
  "node": ">=0.10.0"
3102
  }
3103
  },
3104
+ "node_modules/etag": {
3105
+ "version": "1.8.1",
3106
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
3107
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
3108
+ "license": "MIT",
3109
+ "engines": {
3110
+ "node": ">= 0.6"
3111
+ }
3112
+ },
3113
  "node_modules/exponential-backoff": {
3114
  "version": "3.1.2",
3115
  "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
3116
  "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==",
3117
  "license": "Apache-2.0"
3118
  },
3119
+ "node_modules/express": {
3120
+ "version": "5.1.0",
3121
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
3122
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
3123
+ "license": "MIT",
3124
+ "dependencies": {
3125
+ "accepts": "^2.0.0",
3126
+ "body-parser": "^2.2.0",
3127
+ "content-disposition": "^1.0.0",
3128
+ "content-type": "^1.0.5",
3129
+ "cookie": "^0.7.1",
3130
+ "cookie-signature": "^1.2.1",
3131
+ "debug": "^4.4.0",
3132
+ "encodeurl": "^2.0.0",
3133
+ "escape-html": "^1.0.3",
3134
+ "etag": "^1.8.1",
3135
+ "finalhandler": "^2.1.0",
3136
+ "fresh": "^2.0.0",
3137
+ "http-errors": "^2.0.0",
3138
+ "merge-descriptors": "^2.0.0",
3139
+ "mime-types": "^3.0.0",
3140
+ "on-finished": "^2.4.1",
3141
+ "once": "^1.4.0",
3142
+ "parseurl": "^1.3.3",
3143
+ "proxy-addr": "^2.0.7",
3144
+ "qs": "^6.14.0",
3145
+ "range-parser": "^1.2.1",
3146
+ "router": "^2.2.0",
3147
+ "send": "^1.1.0",
3148
+ "serve-static": "^2.2.0",
3149
+ "statuses": "^2.0.1",
3150
+ "type-is": "^2.0.1",
3151
+ "vary": "^1.1.2"
3152
+ },
3153
+ "engines": {
3154
+ "node": ">= 18"
3155
+ },
3156
+ "funding": {
3157
+ "type": "opencollective",
3158
+ "url": "https://opencollective.com/express"
3159
+ }
3160
+ },
3161
  "node_modules/extend": {
3162
  "version": "3.0.2",
3163
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
 
3251
  "node": ">=8"
3252
  }
3253
  },
3254
+ "node_modules/finalhandler": {
3255
+ "version": "2.1.0",
3256
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
3257
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
3258
+ "license": "MIT",
3259
+ "dependencies": {
3260
+ "debug": "^4.4.0",
3261
+ "encodeurl": "^2.0.0",
3262
+ "escape-html": "^1.0.3",
3263
+ "on-finished": "^2.4.1",
3264
+ "parseurl": "^1.3.3",
3265
+ "statuses": "^2.0.1"
3266
+ },
3267
+ "engines": {
3268
+ "node": ">= 0.8"
3269
+ }
3270
+ },
3271
  "node_modules/find-up": {
3272
  "version": "5.0.0",
3273
  "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
 
3306
  "dev": true,
3307
  "license": "ISC"
3308
  },
3309
+ "node_modules/forwarded": {
3310
+ "version": "0.2.0",
3311
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
3312
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
3313
+ "license": "MIT",
3314
+ "engines": {
3315
+ "node": ">= 0.6"
3316
+ }
3317
+ },
3318
+ "node_modules/fresh": {
3319
+ "version": "2.0.0",
3320
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
3321
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
3322
+ "license": "MIT",
3323
+ "engines": {
3324
+ "node": ">= 0.8"
3325
+ }
3326
+ },
3327
  "node_modules/fs-minipass": {
3328
  "version": "2.1.0",
3329
  "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
 
3357
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
3358
  }
3359
  },
3360
+ "node_modules/function-bind": {
3361
+ "version": "1.1.2",
3362
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
3363
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
3364
+ "license": "MIT",
3365
+ "funding": {
3366
+ "url": "https://github.com/sponsors/ljharb"
3367
+ }
3368
+ },
3369
  "node_modules/gauge": {
3370
  "version": "4.0.4",
3371
  "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
 
3396
  "node": ">=6.9.0"
3397
  }
3398
  },
3399
+ "node_modules/get-intrinsic": {
3400
+ "version": "1.3.0",
3401
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
3402
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
3403
+ "license": "MIT",
3404
+ "dependencies": {
3405
+ "call-bind-apply-helpers": "^1.0.2",
3406
+ "es-define-property": "^1.0.1",
3407
+ "es-errors": "^1.3.0",
3408
+ "es-object-atoms": "^1.1.1",
3409
+ "function-bind": "^1.1.2",
3410
+ "get-proto": "^1.0.1",
3411
+ "gopd": "^1.2.0",
3412
+ "has-symbols": "^1.1.0",
3413
+ "hasown": "^2.0.2",
3414
+ "math-intrinsics": "^1.1.0"
3415
+ },
3416
+ "engines": {
3417
+ "node": ">= 0.4"
3418
+ },
3419
+ "funding": {
3420
+ "url": "https://github.com/sponsors/ljharb"
3421
+ }
3422
+ },
3423
+ "node_modules/get-proto": {
3424
+ "version": "1.0.1",
3425
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
3426
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
3427
+ "license": "MIT",
3428
+ "dependencies": {
3429
+ "dunder-proto": "^1.0.1",
3430
+ "es-object-atoms": "^1.0.0"
3431
+ },
3432
+ "engines": {
3433
+ "node": ">= 0.4"
3434
+ }
3435
+ },
3436
  "node_modules/glob": {
3437
  "version": "7.2.3",
3438
  "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
 
3480
  "url": "https://github.com/sponsors/sindresorhus"
3481
  }
3482
  },
3483
+ "node_modules/gopd": {
3484
+ "version": "1.2.0",
3485
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
3486
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
3487
+ "license": "MIT",
3488
+ "engines": {
3489
+ "node": ">= 0.4"
3490
+ },
3491
+ "funding": {
3492
+ "url": "https://github.com/sponsors/ljharb"
3493
+ }
3494
+ },
3495
  "node_modules/graceful-fs": {
3496
  "version": "4.2.11",
3497
  "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
 
3515
  "node": ">=8"
3516
  }
3517
  },
3518
+ "node_modules/has-symbols": {
3519
+ "version": "1.1.0",
3520
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
3521
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
3522
+ "license": "MIT",
3523
+ "engines": {
3524
+ "node": ">= 0.4"
3525
+ },
3526
+ "funding": {
3527
+ "url": "https://github.com/sponsors/ljharb"
3528
+ }
3529
+ },
3530
  "node_modules/has-unicode": {
3531
  "version": "2.0.1",
3532
  "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
3533
  "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
3534
  "license": "ISC"
3535
  },
3536
+ "node_modules/hasown": {
3537
+ "version": "2.0.2",
3538
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
3539
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
3540
+ "license": "MIT",
3541
+ "dependencies": {
3542
+ "function-bind": "^1.1.2"
3543
+ },
3544
+ "engines": {
3545
+ "node": ">= 0.4"
3546
+ }
3547
+ },
3548
  "node_modules/hast-util-whitespace": {
3549
  "version": "2.0.1",
3550
  "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz",
 
3561
  "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
3562
  "license": "BSD-2-Clause"
3563
  },
3564
+ "node_modules/http-errors": {
3565
+ "version": "2.0.0",
3566
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
3567
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
3568
+ "license": "MIT",
3569
+ "dependencies": {
3570
+ "depd": "2.0.0",
3571
+ "inherits": "2.0.4",
3572
+ "setprototypeof": "1.2.0",
3573
+ "statuses": "2.0.1",
3574
+ "toidentifier": "1.0.1"
3575
+ },
3576
+ "engines": {
3577
+ "node": ">= 0.8"
3578
+ }
3579
+ },
3580
+ "node_modules/http-errors/node_modules/statuses": {
3581
+ "version": "2.0.1",
3582
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
3583
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
3584
+ "license": "MIT",
3585
+ "engines": {
3586
+ "node": ">= 0.8"
3587
+ }
3588
+ },
3589
  "node_modules/http-proxy-agent": {
3590
  "version": "5.0.0",
3591
  "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
 
3639
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
3640
  "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
3641
  "license": "MIT",
 
3642
  "dependencies": {
3643
  "safer-buffer": ">= 2.1.2 < 3.0.0"
3644
  },
 
3733
  "node": ">= 12"
3734
  }
3735
  },
3736
+ "node_modules/ipaddr.js": {
3737
+ "version": "1.9.1",
3738
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
3739
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
3740
+ "license": "MIT",
3741
+ "engines": {
3742
+ "node": ">= 0.10"
3743
+ }
3744
+ },
3745
  "node_modules/is-buffer": {
3746
  "version": "2.0.5",
3747
  "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
 
3825
  "url": "https://github.com/sponsors/sindresorhus"
3826
  }
3827
  },
3828
+ "node_modules/is-promise": {
3829
+ "version": "4.0.0",
3830
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
3831
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
3832
+ "license": "MIT"
3833
+ },
3834
  "node_modules/isexe": {
3835
  "version": "2.0.0",
3836
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
 
4055
  "node": ">=12"
4056
  }
4057
  },
4058
+ "node_modules/math-intrinsics": {
4059
+ "version": "1.1.0",
4060
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
4061
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
4062
+ "license": "MIT",
4063
+ "engines": {
4064
+ "node": ">= 0.4"
4065
+ }
4066
+ },
4067
  "node_modules/mdast-util-definitions": {
4068
  "version": "5.1.2",
4069
  "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz",
 
4136
  "url": "https://opencollective.com/unified"
4137
  }
4138
  },
4139
+ "node_modules/media-typer": {
4140
+ "version": "1.1.0",
4141
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
4142
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
4143
+ "license": "MIT",
4144
+ "engines": {
4145
+ "node": ">= 0.8"
4146
+ }
4147
+ },
4148
+ "node_modules/merge-descriptors": {
4149
+ "version": "2.0.0",
4150
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
4151
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
4152
+ "license": "MIT",
4153
+ "engines": {
4154
+ "node": ">=18"
4155
+ },
4156
+ "funding": {
4157
+ "url": "https://github.com/sponsors/sindresorhus"
4158
+ }
4159
+ },
4160
  "node_modules/merge2": {
4161
  "version": "1.4.1",
4162
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 
4623
  "node": ">=8.6"
4624
  }
4625
  },
4626
+ "node_modules/mime-db": {
4627
+ "version": "1.54.0",
4628
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
4629
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
4630
+ "license": "MIT",
4631
+ "engines": {
4632
+ "node": ">= 0.6"
4633
+ }
4634
+ },
4635
+ "node_modules/mime-types": {
4636
+ "version": "3.0.1",
4637
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
4638
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
4639
+ "license": "MIT",
4640
+ "dependencies": {
4641
+ "mime-db": "^1.54.0"
4642
+ },
4643
+ "engines": {
4644
+ "node": ">= 0.6"
4645
+ }
4646
+ },
4647
  "node_modules/minimatch": {
4648
  "version": "3.1.2",
4649
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
 
4983
  "node": ">=0.10.0"
4984
  }
4985
  },
4986
+ "node_modules/object-inspect": {
4987
+ "version": "1.13.4",
4988
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
4989
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
4990
+ "license": "MIT",
4991
+ "engines": {
4992
+ "node": ">= 0.4"
4993
+ },
4994
+ "funding": {
4995
+ "url": "https://github.com/sponsors/ljharb"
4996
+ }
4997
+ },
4998
+ "node_modules/on-finished": {
4999
+ "version": "2.4.1",
5000
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
5001
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
5002
+ "license": "MIT",
5003
+ "dependencies": {
5004
+ "ee-first": "1.1.1"
5005
+ },
5006
+ "engines": {
5007
+ "node": ">= 0.8"
5008
+ }
5009
+ },
5010
  "node_modules/once": {
5011
  "version": "1.4.0",
5012
  "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 
5094
  "node": ">=6"
5095
  }
5096
  },
5097
+ "node_modules/parseurl": {
5098
+ "version": "1.3.3",
5099
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
5100
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
5101
+ "license": "MIT",
5102
+ "engines": {
5103
+ "node": ">= 0.8"
5104
+ }
5105
+ },
5106
  "node_modules/path-exists": {
5107
  "version": "4.0.0",
5108
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 
5132
  "node": ">=8"
5133
  }
5134
  },
5135
+ "node_modules/path-to-regexp": {
5136
+ "version": "8.3.0",
5137
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
5138
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
5139
+ "license": "MIT",
5140
+ "funding": {
5141
+ "type": "opencollective",
5142
+ "url": "https://opencollective.com/express"
5143
+ }
5144
+ },
5145
  "node_modules/picocolors": {
5146
  "version": "1.1.1",
5147
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 
5247
  "url": "https://github.com/sponsors/wooorm"
5248
  }
5249
  },
5250
+ "node_modules/proxy-addr": {
5251
+ "version": "2.0.7",
5252
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
5253
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
5254
+ "license": "MIT",
5255
+ "dependencies": {
5256
+ "forwarded": "0.2.0",
5257
+ "ipaddr.js": "1.9.1"
5258
+ },
5259
+ "engines": {
5260
+ "node": ">= 0.10"
5261
+ }
5262
+ },
5263
  "node_modules/punycode": {
5264
  "version": "2.3.1",
5265
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
 
5270
  "node": ">=6"
5271
  }
5272
  },
5273
+ "node_modules/qs": {
5274
+ "version": "6.14.0",
5275
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
5276
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
5277
+ "license": "BSD-3-Clause",
5278
+ "dependencies": {
5279
+ "side-channel": "^1.1.0"
5280
+ },
5281
+ "engines": {
5282
+ "node": ">=0.6"
5283
+ },
5284
+ "funding": {
5285
+ "url": "https://github.com/sponsors/ljharb"
5286
+ }
5287
+ },
5288
  "node_modules/queue-microtask": {
5289
  "version": "1.2.3",
5290
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
 
5306
  ],
5307
  "license": "MIT"
5308
  },
5309
+ "node_modules/range-parser": {
5310
+ "version": "1.2.1",
5311
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
5312
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
5313
+ "license": "MIT",
5314
+ "engines": {
5315
+ "node": ">= 0.6"
5316
+ }
5317
+ },
5318
+ "node_modules/raw-body": {
5319
+ "version": "3.0.1",
5320
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",
5321
+ "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",
5322
+ "license": "MIT",
5323
+ "dependencies": {
5324
+ "bytes": "3.1.2",
5325
+ "http-errors": "2.0.0",
5326
+ "iconv-lite": "0.7.0",
5327
+ "unpipe": "1.0.0"
5328
+ },
5329
+ "engines": {
5330
+ "node": ">= 0.10"
5331
+ }
5332
+ },
5333
+ "node_modules/raw-body/node_modules/iconv-lite": {
5334
+ "version": "0.7.0",
5335
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
5336
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
5337
+ "license": "MIT",
5338
+ "dependencies": {
5339
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
5340
+ },
5341
+ "engines": {
5342
+ "node": ">=0.10.0"
5343
+ },
5344
+ "funding": {
5345
+ "type": "opencollective",
5346
+ "url": "https://opencollective.com/express"
5347
+ }
5348
+ },
5349
  "node_modules/react": {
5350
  "version": "19.1.1",
5351
  "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz",
 
5545
  "fsevents": "~2.3.2"
5546
  }
5547
  },
5548
+ "node_modules/router": {
5549
+ "version": "2.2.0",
5550
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
5551
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
5552
+ "license": "MIT",
5553
+ "dependencies": {
5554
+ "debug": "^4.4.0",
5555
+ "depd": "^2.0.0",
5556
+ "is-promise": "^4.0.0",
5557
+ "parseurl": "^1.3.3",
5558
+ "path-to-regexp": "^8.0.0"
5559
+ },
5560
+ "engines": {
5561
+ "node": ">= 18"
5562
+ }
5563
+ },
5564
  "node_modules/run-parallel": {
5565
  "version": "1.2.0",
5566
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 
5621
  "version": "2.1.2",
5622
  "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
5623
  "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
5624
+ "license": "MIT"
 
5625
  },
5626
  "node_modules/scheduler": {
5627
  "version": "0.26.0",
 
5639
  "semver": "bin/semver.js"
5640
  }
5641
  },
5642
+ "node_modules/send": {
5643
+ "version": "1.2.0",
5644
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
5645
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
5646
+ "license": "MIT",
5647
+ "dependencies": {
5648
+ "debug": "^4.3.5",
5649
+ "encodeurl": "^2.0.0",
5650
+ "escape-html": "^1.0.3",
5651
+ "etag": "^1.8.1",
5652
+ "fresh": "^2.0.0",
5653
+ "http-errors": "^2.0.0",
5654
+ "mime-types": "^3.0.1",
5655
+ "ms": "^2.1.3",
5656
+ "on-finished": "^2.4.1",
5657
+ "range-parser": "^1.2.1",
5658
+ "statuses": "^2.0.1"
5659
+ },
5660
+ "engines": {
5661
+ "node": ">= 18"
5662
+ }
5663
+ },
5664
+ "node_modules/serve-static": {
5665
+ "version": "2.2.0",
5666
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
5667
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
5668
+ "license": "MIT",
5669
+ "dependencies": {
5670
+ "encodeurl": "^2.0.0",
5671
+ "escape-html": "^1.0.3",
5672
+ "parseurl": "^1.3.3",
5673
+ "send": "^1.2.0"
5674
+ },
5675
+ "engines": {
5676
+ "node": ">= 18"
5677
+ }
5678
+ },
5679
  "node_modules/set-blocking": {
5680
  "version": "2.0.0",
5681
  "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
5682
  "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
5683
  "license": "ISC"
5684
  },
5685
+ "node_modules/setprototypeof": {
5686
+ "version": "1.2.0",
5687
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
5688
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
5689
+ "license": "ISC"
5690
+ },
5691
  "node_modules/shebang-command": {
5692
  "version": "2.0.0",
5693
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
 
5711
  "node": ">=8"
5712
  }
5713
  },
5714
+ "node_modules/side-channel": {
5715
+ "version": "1.1.0",
5716
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
5717
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
5718
+ "license": "MIT",
5719
+ "dependencies": {
5720
+ "es-errors": "^1.3.0",
5721
+ "object-inspect": "^1.13.3",
5722
+ "side-channel-list": "^1.0.0",
5723
+ "side-channel-map": "^1.0.1",
5724
+ "side-channel-weakmap": "^1.0.2"
5725
+ },
5726
+ "engines": {
5727
+ "node": ">= 0.4"
5728
+ },
5729
+ "funding": {
5730
+ "url": "https://github.com/sponsors/ljharb"
5731
+ }
5732
+ },
5733
+ "node_modules/side-channel-list": {
5734
+ "version": "1.0.0",
5735
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
5736
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
5737
+ "license": "MIT",
5738
+ "dependencies": {
5739
+ "es-errors": "^1.3.0",
5740
+ "object-inspect": "^1.13.3"
5741
+ },
5742
+ "engines": {
5743
+ "node": ">= 0.4"
5744
+ },
5745
+ "funding": {
5746
+ "url": "https://github.com/sponsors/ljharb"
5747
+ }
5748
+ },
5749
+ "node_modules/side-channel-map": {
5750
+ "version": "1.0.1",
5751
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
5752
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
5753
+ "license": "MIT",
5754
+ "dependencies": {
5755
+ "call-bound": "^1.0.2",
5756
+ "es-errors": "^1.3.0",
5757
+ "get-intrinsic": "^1.2.5",
5758
+ "object-inspect": "^1.13.3"
5759
+ },
5760
+ "engines": {
5761
+ "node": ">= 0.4"
5762
+ },
5763
+ "funding": {
5764
+ "url": "https://github.com/sponsors/ljharb"
5765
+ }
5766
+ },
5767
+ "node_modules/side-channel-weakmap": {
5768
+ "version": "1.0.2",
5769
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
5770
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
5771
+ "license": "MIT",
5772
+ "dependencies": {
5773
+ "call-bound": "^1.0.2",
5774
+ "es-errors": "^1.3.0",
5775
+ "get-intrinsic": "^1.2.5",
5776
+ "object-inspect": "^1.13.3",
5777
+ "side-channel-map": "^1.0.1"
5778
+ },
5779
+ "engines": {
5780
+ "node": ">= 0.4"
5781
+ },
5782
+ "funding": {
5783
+ "url": "https://github.com/sponsors/ljharb"
5784
+ }
5785
+ },
5786
  "node_modules/signal-exit": {
5787
  "version": "3.0.7",
5788
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
 
5877
  "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
5878
  }
5879
  },
5880
+ "node_modules/statuses": {
5881
+ "version": "2.0.2",
5882
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
5883
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
5884
+ "license": "MIT",
5885
+ "engines": {
5886
+ "node": ">= 0.8"
5887
+ }
5888
+ },
5889
  "node_modules/string_decoder": {
5890
  "version": "1.3.0",
5891
  "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
 
6085
  "node": ">=8.0"
6086
  }
6087
  },
6088
+ "node_modules/toidentifier": {
6089
+ "version": "1.0.1",
6090
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
6091
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
6092
+ "license": "MIT",
6093
+ "engines": {
6094
+ "node": ">=0.6"
6095
+ }
6096
+ },
6097
  "node_modules/tr46": {
6098
  "version": "0.0.3",
6099
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
 
6190
  "node": ">= 0.8.0"
6191
  }
6192
  },
6193
+ "node_modules/type-is": {
6194
+ "version": "2.0.1",
6195
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
6196
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
6197
+ "license": "MIT",
6198
+ "dependencies": {
6199
+ "content-type": "^1.0.5",
6200
+ "media-typer": "^1.1.0",
6201
+ "mime-types": "^3.0.0"
6202
+ },
6203
+ "engines": {
6204
+ "node": ">= 0.6"
6205
+ }
6206
+ },
6207
  "node_modules/typescript": {
6208
  "version": "5.8.3",
6209
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
 
6370
  "url": "https://opencollective.com/unified"
6371
  }
6372
  },
6373
+ "node_modules/unpipe": {
6374
+ "version": "1.0.0",
6375
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
6376
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
6377
+ "license": "MIT",
6378
+ "engines": {
6379
+ "node": ">= 0.8"
6380
+ }
6381
+ },
6382
  "node_modules/update-browserslist-db": {
6383
  "version": "1.1.3",
6384
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
 
6460
  "dev": true,
6461
  "license": "MIT"
6462
  },
6463
+ "node_modules/vary": {
6464
+ "version": "1.1.2",
6465
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
6466
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
6467
+ "license": "MIT",
6468
+ "engines": {
6469
+ "node": ">= 0.8"
6470
+ }
6471
+ },
6472
  "node_modules/vfile": {
6473
  "version": "5.3.7",
6474
  "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
package.json CHANGED
@@ -6,18 +6,21 @@
6
  "recompile": "tsc --project tsconfig.node.json",
7
  "db:rebuild": "tsc --project tsconfig.node.json && node dist/src/lib/ingest.js",
8
  "dev": "vite",
9
- "build": "vite build",
 
10
  "lint": "eslint .",
11
  "preview": "vite preview"
12
  },
13
  "dependencies": {
14
  "duckdb": "^1.3.1",
 
15
  "react": "^19.1.0",
16
  "react-dom": "^19.1.0",
17
  "react-markdown": "8.0.6"
18
  },
19
  "devDependencies": {
20
  "@eslint/js": "^9.29.0",
 
21
  "@types/node": "^24.0.7",
22
  "@types/react": "^19.1.8",
23
  "@types/react-dom": "^19.1.6",
 
6
  "recompile": "tsc --project tsconfig.node.json",
7
  "db:rebuild": "tsc --project tsconfig.node.json && node dist/src/lib/ingest.js",
8
  "dev": "vite",
9
+ "build": "vite build && tsc --project tsconfig.node.json",
10
+ "start": "node dist/server.js",
11
  "lint": "eslint .",
12
  "preview": "vite preview"
13
  },
14
  "dependencies": {
15
  "duckdb": "^1.3.1",
16
+ "express": "^5.1.0",
17
  "react": "^19.1.0",
18
  "react-dom": "^19.1.0",
19
  "react-markdown": "8.0.6"
20
  },
21
  "devDependencies": {
22
  "@eslint/js": "^9.29.0",
23
+ "@types/express": "^5.0.3",
24
  "@types/node": "^24.0.7",
25
  "@types/react": "^19.1.8",
26
  "@types/react-dom": "^19.1.6",
server.ts ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express, { type Request, type Response } from 'express';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+
8
+ const app = express();
9
+ const port = process.env.PORT || 7860; // Hugging Face Spaces use port 7860
10
+
11
+
12
+ // 1. Handle API calls
13
+ app.use('/api', async (req: Request, res: Response) => {
14
+ const urlWithoutQuery = req.originalUrl.split('?')[0];
15
+ const modulePath = path.resolve(__dirname, `.${urlWithoutQuery}.js`);
16
+
17
+ try {
18
+ const module = await import(modulePath);
19
+ type ApiHandler = (req: Request, res: Response) => Promise<void> | void;
20
+
21
+ const handler: ApiHandler = module.default;
22
+
23
+ if (typeof handler === 'function') {
24
+ await handler(req, res);
25
+ } else {
26
+ console.error(`API module ${modulePath} does not have a valid default export.`);
27
+ res.status(404).send('Not Found');
28
+ }
29
+ } catch (error) {
30
+ const isModuleNotFoundError = (e: unknown): e is { code: string } => {
31
+ return typeof e === 'object' && e !== null && 'code' in e;
32
+ };
33
+
34
+ if (isModuleNotFoundError(error) && error.code === 'ERR_MODULE_NOT_FOUND') {
35
+ res.status(404).send('Not Found');
36
+ } else {
37
+ console.error(`Error processing API request for ${req.originalUrl}:`, error);
38
+ res.status(500).send('Internal Server Error');
39
+ }
40
+ }
41
+ });
42
+
43
+ // 2. Serve the built React app (frontend)
44
+ app.use(express.static(path.join(__dirname)));
45
+
46
+ // 3. Fallback for client-side routing
47
+ app.get(/.*/, (_: Request, res: Response) => {
48
+ res.sendFile(path.join(__dirname, 'index.html'));
49
+ });
50
+
51
+ app.listen(port, () => {
52
+ console.log(`Server listening on port ${port}`);
53
+ });
src/components/Heatmap.tsx CHANGED
@@ -55,9 +55,9 @@ const Heatmap: React.FC<HeatmapProps> = ({ matrix, judge1, judge2, onCellClick }
55
  <div
56
  key={`${fromCat}-${toCat}`}
57
  className="heatmap-cell"
58
- onClick={() => value < 10000
59
  ? onCellClick(fromCat, toCat)
60
- : alert("Details only available for values < 10000. Please refine your selection.")
61
  }
62
  title={`${fromCat} → ${toCat}: ${value}`}
63
  >
 
55
  <div
56
  key={`${fromCat}-${toCat}`}
57
  className="heatmap-cell"
58
+ onClick={() => value < 100000
59
  ? onCellClick(fromCat, toCat)
60
+ : alert("Details only available for values < 100000. Please refine your selection.")
61
  }
62
  title={`${fromCat} → ${toCat}: ${value}`}
63
  >
src/components/Sankey.tsx CHANGED
@@ -218,9 +218,9 @@ const SankeyDiagram: React.FC<SankeyDiagramProps> = ({ matrix, judge1, judge2, o
218
  strokeWidth={link.strokeWidth}
219
  fill="none"
220
  className="sankey-link"
221
- onClick={() => link.value < 10000
222
  ? onCellClick(link.from, link.to)
223
- : alert("Details only available for values < 10000. Please refine your selection.")
224
  }
225
  >
226
  <title>{`${link.from} → ${link.to}: ${link.value}`}</title>
 
218
  strokeWidth={link.strokeWidth}
219
  fill="none"
220
  className="sankey-link"
221
+ onClick={() => link.value < 100000
222
  ? onCellClick(link.from, link.to)
223
+ : alert("Details only available for values < 100000. Please refine your selection.")
224
  }
225
  >
226
  <title>{`${link.from} → ${link.to}: ${link.value}`}</title>
src/components/itemList.tsx CHANGED
@@ -236,7 +236,7 @@ const AssessmentItem: React.FC<AssessmentItemProps> = memo(({
236
  )}
237
  </div>
238
 
239
- <div className="third-assessment">
240
  <div>
241
  <h4>Provide Human Assessment</h4>
242
  <p className="assessment-hint">Click to copy assessment tuple for response ID: <code>{item.r_uuid}</code></p>
@@ -272,7 +272,7 @@ const AssessmentItem: React.FC<AssessmentItemProps> = memo(({
272
  {copied ? '✓ Copied!' : 'Copy'}
273
  </button>
274
  </div>
275
- )}
276
  </div>
277
  );
278
  });
 
236
  )}
237
  </div>
238
 
239
+ {/* <div className="third-assessment">
240
  <div>
241
  <h4>Provide Human Assessment</h4>
242
  <p className="assessment-hint">Click to copy assessment tuple for response ID: <code>{item.r_uuid}</code></p>
 
272
  {copied ? '✓ Copied!' : 'Copy'}
273
  </button>
274
  </div>
275
+ )} */}
276
  </div>
277
  );
278
  });
src/index.css CHANGED
@@ -560,6 +560,11 @@ button {
560
  display: flex;
561
  justify-content: space-between;
562
  align-items: center;
 
 
 
 
 
563
  }
564
 
565
  .metadata {
 
560
  display: flex;
561
  justify-content: space-between;
562
  align-items: center;
563
+ margin-bottom: 0.75rem;
564
+ }
565
+
566
+ .item-question-header h4 {
567
+ margin: 0;
568
  }
569
 
570
  .metadata {
tsconfig.node.json CHANGED
@@ -28,6 +28,7 @@
28
  "vite.config.ts",
29
  "src/types.ts",
30
  "api/**/*.ts",
31
- "src/lib/**/*.ts"
 
32
  ]
33
  }
 
28
  "vite.config.ts",
29
  "src/types.ts",
30
  "api/**/*.ts",
31
+ "src/lib/**/*.ts",
32
+ "server.ts"
33
  ]
34
  }
vite.config.ts CHANGED
@@ -4,10 +4,11 @@ import path from 'path';
4
 
5
 
6
  // https://vite.dev/config/
7
- export default defineConfig({
8
  plugins: [
9
  react(),
10
- {
 
11
  name: 'custom-api-server',
12
  configureServer(server) {
13
  server.middlewares.use(async (req, res, next) => {
@@ -43,4 +44,4 @@ export default defineConfig({
43
  },
44
  ],
45
 
46
- })
 
4
 
5
 
6
  // https://vite.dev/config/
7
+ export default defineConfig(({ command }) => ({
8
  plugins: [
9
  react(),
10
+ // This plugin will only be used in development ('npm run dev')
11
+ command === 'serve' && {
12
  name: 'custom-api-server',
13
  configureServer(server) {
14
  server.middlewares.use(async (req, res, next) => {
 
44
  },
45
  ],
46
 
47
+ }));